@openprose/reactor-cradle 0.1.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +270 -0
  3. package/dist/assert/index.d.ts +35 -0
  4. package/dist/assert/index.d.ts.map +1 -0
  5. package/dist/assert/index.js +398 -0
  6. package/dist/baselines/cost-thesis/index.d.ts +103 -0
  7. package/dist/baselines/cost-thesis/index.d.ts.map +1 -0
  8. package/dist/baselines/cost-thesis/index.js +337 -0
  9. package/dist/baselines/naive-loop/index.d.ts +46 -0
  10. package/dist/baselines/naive-loop/index.d.ts.map +1 -0
  11. package/dist/baselines/naive-loop/index.js +188 -0
  12. package/dist/baselines/no-memo/index.d.ts +84 -0
  13. package/dist/baselines/no-memo/index.d.ts.map +1 -0
  14. package/dist/baselines/no-memo/index.js +226 -0
  15. package/dist/doubles/clock.d.ts +9 -0
  16. package/dist/doubles/clock.d.ts.map +1 -0
  17. package/dist/doubles/clock.js +42 -0
  18. package/dist/doubles/storage.d.ts +24 -0
  19. package/dist/doubles/storage.d.ts.map +1 -0
  20. package/dist/doubles/storage.js +191 -0
  21. package/dist/eval/index.d.ts +204 -0
  22. package/dist/eval/index.d.ts.map +1 -0
  23. package/dist/eval/index.js +596 -0
  24. package/dist/index.d.ts +24 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +39 -0
  27. package/dist/policy-author/index.d.ts +103 -0
  28. package/dist/policy-author/index.d.ts.map +1 -0
  29. package/dist/policy-author/index.js +358 -0
  30. package/dist/policy-drift/index.d.ts +64 -0
  31. package/dist/policy-drift/index.d.ts.map +1 -0
  32. package/dist/policy-drift/index.js +495 -0
  33. package/dist/policy-replay/index.d.ts +106 -0
  34. package/dist/policy-replay/index.d.ts.map +1 -0
  35. package/dist/policy-replay/index.js +361 -0
  36. package/dist/provider-parity/index.d.ts +91 -0
  37. package/dist/provider-parity/index.d.ts.map +1 -0
  38. package/dist/provider-parity/index.js +439 -0
  39. package/dist/recompile/index.d.ts +161 -0
  40. package/dist/recompile/index.d.ts.map +1 -0
  41. package/dist/recompile/index.js +690 -0
  42. package/dist/release-candidate/index.d.ts +139 -0
  43. package/dist/release-candidate/index.d.ts.map +1 -0
  44. package/dist/release-candidate/index.js +553 -0
  45. package/dist/release-parity/index.d.ts +80 -0
  46. package/dist/release-parity/index.d.ts.map +1 -0
  47. package/dist/release-parity/index.js +1035 -0
  48. package/dist/replay/model-gateway.d.ts +25 -0
  49. package/dist/replay/model-gateway.d.ts.map +1 -0
  50. package/dist/replay/model-gateway.js +166 -0
  51. package/dist/replay/parity.d.ts +110 -0
  52. package/dist/replay/parity.d.ts.map +1 -0
  53. package/dist/replay/parity.js +232 -0
  54. package/dist/rollback/index.d.ts +106 -0
  55. package/dist/rollback/index.d.ts.map +1 -0
  56. package/dist/rollback/index.js +694 -0
  57. package/dist/scenario/parser.d.ts +11 -0
  58. package/dist/scenario/parser.d.ts.map +1 -0
  59. package/dist/scenario/parser.js +490 -0
  60. package/dist/scenario/runner.d.ts +12 -0
  61. package/dist/scenario/runner.d.ts.map +1 -0
  62. package/dist/scenario/runner.js +345 -0
  63. package/dist/scenario/synthetic-world-adapter.d.ts +4 -0
  64. package/dist/scenario/synthetic-world-adapter.d.ts.map +1 -0
  65. package/dist/scenario/synthetic-world-adapter.js +82 -0
  66. package/dist/scenario/time.d.ts +4 -0
  67. package/dist/scenario/time.d.ts.map +1 -0
  68. package/dist/scenario/time.js +45 -0
  69. package/dist/scenario/types.d.ts +149 -0
  70. package/dist/scenario/types.d.ts.map +1 -0
  71. package/dist/scenario/types.js +5 -0
  72. package/dist/spikes/index.d.ts +10 -0
  73. package/dist/spikes/index.d.ts.map +1 -0
  74. package/dist/spikes/index.js +29 -0
  75. package/dist/spikes/k1-ensemble-spread.d.ts +88 -0
  76. package/dist/spikes/k1-ensemble-spread.d.ts.map +1 -0
  77. package/dist/spikes/k1-ensemble-spread.js +396 -0
  78. package/dist/spikes/k2-policy-author.d.ts +25 -0
  79. package/dist/spikes/k2-policy-author.d.ts.map +1 -0
  80. package/dist/spikes/k2-policy-author.js +503 -0
  81. package/dist/spikes/live-refresh.d.ts +150 -0
  82. package/dist/spikes/live-refresh.d.ts.map +1 -0
  83. package/dist/spikes/live-refresh.js +511 -0
  84. package/dist/world/index.d.ts +2 -0
  85. package/dist/world/index.d.ts.map +1 -0
  86. package/dist/world/index.js +17 -0
  87. package/dist/world/synthetic-world.d.ts +104 -0
  88. package/dist/world/synthetic-world.d.ts.map +1 -0
  89. package/dist/world/synthetic-world.js +449 -0
  90. package/package.json +139 -0
@@ -0,0 +1,337 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.COST_THESIS_GENERATED_AT_V0 = exports.COST_THESIS_SUMMARY_VERSION_V0 = exports.COST_THESIS_SUMMARY_SCHEMA_V0 = void 0;
4
+ exports.createC5StaticCostThesisSummaryV0 = createC5StaticCostThesisSummaryV0;
5
+ exports.measureReactorStaticCostRowV0 = measureReactorStaticCostRowV0;
6
+ exports.measureReactorRuntimeCostRowV0 = measureReactorRuntimeCostRowV0;
7
+ exports.createC5EventChangingCostThesisScenarioV0 = createC5EventChangingCostThesisScenarioV0;
8
+ exports.normalizeNoMemoCostRowV0 = normalizeNoMemoCostRowV0;
9
+ exports.normalizeNaiveLoopCostRowV0 = normalizeNaiveLoopCostRowV0;
10
+ exports.missingEventChangingScenarioV0 = missingEventChangingScenarioV0;
11
+ const node_crypto_1 = require("node:crypto");
12
+ exports.COST_THESIS_SUMMARY_SCHEMA_V0 = "openprose.reactor-cradle.baseline.cost-thesis.summary";
13
+ exports.COST_THESIS_SUMMARY_VERSION_V0 = 0;
14
+ exports.COST_THESIS_GENERATED_AT_V0 = "2026-05-20T00:00:00.000Z";
15
+ function createC5StaticCostThesisSummaryV0(input) {
16
+ const reactorRow = measureReactorStaticCostRowV0(input.reactor_run);
17
+ const noMemoRow = normalizeNoMemoCostRowV0(input.no_memo, reactorRow.scenario);
18
+ const naiveLoopRow = normalizeNaiveLoopCostRowV0(input.naive_loop, reactorRow.scenario);
19
+ const payload = {
20
+ schema: exports.COST_THESIS_SUMMARY_SCHEMA_V0,
21
+ v: exports.COST_THESIS_SUMMARY_VERSION_V0,
22
+ generated_at: exports.COST_THESIS_GENERATED_AT_V0,
23
+ static_scenario: {
24
+ scenario: reactorRow.scenario,
25
+ status: "measured",
26
+ rows: Object.freeze([reactorRow, noMemoRow, naiveLoopRow]),
27
+ notes: Object.freeze([
28
+ "Static rows share the same incident-briefing-static-zero schedule.",
29
+ "Only the Reactor row is runtime-produced; no-memo is a simulated replay and naive-loop is a non-Reactor control.",
30
+ ]),
31
+ },
32
+ ...(input.event_changing_scenario === undefined
33
+ ? {
34
+ event_changing_scenario: missingEventChangingScenarioV0(),
35
+ }
36
+ : { event_changing_scenario: input.event_changing_scenario }),
37
+ notes: Object.freeze([
38
+ "C5a emits the reusable measurement summary; report Markdown may render this object but must not invent rows absent here.",
39
+ "Fresh:reused ratios are exact token-count labels, not reduced fractions.",
40
+ ]),
41
+ };
42
+ return Object.freeze({
43
+ ...payload,
44
+ content_hash: contentHash(payload),
45
+ });
46
+ }
47
+ function measureReactorStaticCostRowV0(run) {
48
+ if (run.world_profile !== "static") {
49
+ throw new Error(`Reactor static cost row requires world_profile=static; received ${run.world_profile}`);
50
+ }
51
+ return measureReactorRuntimeCostRowV0(run);
52
+ }
53
+ function measureReactorRuntimeCostRowV0(run) {
54
+ const scenario = scenarioRefFromRun(run);
55
+ const turns = run.receipt_log.entries.map((receipt, index) => reactorTurnFromReceipt(receipt, index));
56
+ const tokens = sumTurnTokens(turns);
57
+ const modelInvocationCount = sumModelInvocations(turns);
58
+ return Object.freeze({
59
+ variant: "reactor",
60
+ label: "Reactor",
61
+ scenario,
62
+ provenance: "runtime-produced",
63
+ receipt_count: run.receipt_log.entries.length,
64
+ turn_count: turns.length,
65
+ model_invocation_count: modelInvocationCount,
66
+ tokens,
67
+ ratio: tokenRatio(tokens),
68
+ notes: Object.freeze([
69
+ "Computed from runtime-produced Reactor receipts in scenario.receipt_log.entries.",
70
+ "Memo-hit receipts are runtime-produced receipts but do not count as model invocations.",
71
+ "The static-world row permits the plan-age audit-floor fresh check.",
72
+ ]),
73
+ turns: Object.freeze([...turns]),
74
+ });
75
+ }
76
+ function createC5EventChangingCostThesisScenarioV0(input) {
77
+ const profile = eventChangingProfile(input.reactor_run.world_profile);
78
+ const reactorRow = measureReactorRuntimeCostRowV0(input.reactor_run);
79
+ const noMemoRow = simulateNoMemoEventChangingRowV0(reactorRow);
80
+ const naiveLoopRow = simulateNaiveLoopEventChangingRowV0(reactorRow);
81
+ return Object.freeze({
82
+ status: "measured",
83
+ scenario_id: input.reactor_run.scenario_id,
84
+ profile,
85
+ rows: Object.freeze([reactorRow, noMemoRow, naiveLoopRow]),
86
+ notes: Object.freeze([
87
+ "Event-changing rows share the same runtime-produced receipt schedule.",
88
+ "Only the Reactor row is runtime-produced; no-memo and naive-loop rows are deterministic controls derived from the same per-turn token charges.",
89
+ "The event-changing control rows intentionally charge memo-hit reusable work as fresh work because those variants have no reusable receipt/memo proof.",
90
+ ]),
91
+ });
92
+ }
93
+ function normalizeNoMemoCostRowV0(summary, expectedScenario) {
94
+ const scenario = {
95
+ id: summary.scenario.id,
96
+ profile: summary.scenario.profile,
97
+ initial_instant: summary.scenario.initial_instant,
98
+ final_instant: summary.scenario.final_instant,
99
+ };
100
+ assertSameScenario(scenario, expectedScenario, "no-memo");
101
+ const turns = summary.turns.map((turn) => noMemoTurnDetail(turn));
102
+ const tokens = tokensFromFreshReused(summary.tokens.fresh, summary.tokens.reused);
103
+ return Object.freeze({
104
+ variant: "reactor-no-memo",
105
+ label: "Reactor no memo",
106
+ scenario,
107
+ provenance: "simulated",
108
+ receipt_count: summary.receipt_count,
109
+ turn_count: summary.turn_count,
110
+ model_invocation_count: summary.model_invocation_count,
111
+ tokens,
112
+ ratio: tokenRatio(tokens),
113
+ notes: Object.freeze([...summary.notes]),
114
+ turns: Object.freeze([...turns]),
115
+ source_summary_hash: summary.content_hash,
116
+ });
117
+ }
118
+ function normalizeNaiveLoopCostRowV0(summary, expectedScenario) {
119
+ const scenario = {
120
+ id: summary.scenario_id,
121
+ profile: summary.world_profile,
122
+ initial_instant: expectedScenario?.initial_instant ?? "",
123
+ final_instant: expectedScenario?.final_instant ?? "",
124
+ };
125
+ assertSameScenario(scenario, expectedScenario, "naive-loop");
126
+ const turns = summary.review_turns.map((turn) => naiveLoopTurnDetail(turn, summary));
127
+ const tokens = tokensFromFreshReused(summary.tokens.fresh, summary.tokens.reused);
128
+ return Object.freeze({
129
+ variant: "naive-loop",
130
+ label: "Naive loop",
131
+ scenario,
132
+ provenance: "control",
133
+ receipt_count: 0,
134
+ turn_count: summary.turn_count,
135
+ model_invocation_count: summary.model_invocation_count,
136
+ tokens,
137
+ ratio: tokenRatio(tokens),
138
+ notes: Object.freeze([...summary.notes]),
139
+ turns: Object.freeze([...turns]),
140
+ });
141
+ }
142
+ function missingEventChangingScenarioV0() {
143
+ return Object.freeze({
144
+ status: "absent",
145
+ reason: "C5a did not receive runtime-produced event-changing scenario receipts; no event-changing rows are emitted.",
146
+ notes: Object.freeze([
147
+ "This is an honest absence marker for C5b/C5c coordination, not a simulated measurement.",
148
+ ]),
149
+ });
150
+ }
151
+ function reactorTurnFromReceipt(receipt, index) {
152
+ const tokens = tokensFromFreshReused(receipt.cost.tokens.fresh, receipt.cost.tokens.reused);
153
+ const modelInvocationCount = receipt.cost.provider === "memo" || tokens.total === 0 ? 0 : 1;
154
+ const outcome = receipt.cost.provider === "memo"
155
+ ? "memo-hit"
156
+ : modelInvocationCount === 1
157
+ ? "model-invocation"
158
+ : "runtime-receipt";
159
+ return Object.freeze({
160
+ index,
161
+ as_of: receipt.core.as_of,
162
+ source: "receipt.cost",
163
+ outcome,
164
+ tokens,
165
+ model_invocation_count: modelInvocationCount,
166
+ event_cause: receipt.core.event_cause,
167
+ ...(receipt.core.recheck_kind === undefined
168
+ ? {}
169
+ : { recheck_kind: receipt.core.recheck_kind }),
170
+ receipt_hash: receipt.content_hash,
171
+ provider: receipt.cost.provider,
172
+ model: receipt.cost.model,
173
+ role: receipt.core.role,
174
+ note: outcome === "memo-hit"
175
+ ? "Runtime memo-hit receipt reused a prior verdict and made no model call."
176
+ : outcome === "runtime-receipt"
177
+ ? "Runtime receipt carried no token-bearing model call."
178
+ : reactorInvocationNote(receipt),
179
+ });
180
+ }
181
+ function noMemoTurnDetail(turn) {
182
+ const tokens = tokensFromFreshReused(turn.tokens.fresh, turn.tokens.reused);
183
+ return Object.freeze({
184
+ index: turn.index,
185
+ as_of: turn.as_of,
186
+ source: "no-memo-simulation",
187
+ outcome: "fresh-judge",
188
+ tokens,
189
+ model_invocation_count: turn.model_invocation_count,
190
+ event_cause: turn.event_cause,
191
+ ...(turn.recheck_kind === undefined ? {} : { recheck_kind: turn.recheck_kind }),
192
+ note: turn.note,
193
+ });
194
+ }
195
+ function naiveLoopTurnDetail(turn, summary) {
196
+ const charged = summary.per_invocation_tokens.charged;
197
+ return Object.freeze({
198
+ index: turn.index,
199
+ as_of: turn.as_of,
200
+ source: "naive-loop-control",
201
+ outcome: "control-review",
202
+ tokens: tokensFromFreshReused(charged.fresh, charged.reused),
203
+ model_invocation_count: 1,
204
+ ...(turn.recheck_kind === undefined ? {} : { recheck_kind: turn.recheck_kind }),
205
+ review_kind: turn.review_kind,
206
+ source_ids: Object.freeze([...turn.source_ids]),
207
+ note: `${turn.review_kind} over ${turn.source_ids.join(", ")} with no receipt or memo reuse.`,
208
+ });
209
+ }
210
+ function simulateNoMemoEventChangingRowV0(reactorRow) {
211
+ const turns = reactorRow.turns.map((turn) => simulateNoMemoEventTurnV0(turn));
212
+ const tokens = sumTurnTokens(turns);
213
+ return Object.freeze({
214
+ variant: "reactor-no-memo",
215
+ label: "Reactor no memo",
216
+ scenario: reactorRow.scenario,
217
+ provenance: "simulated",
218
+ receipt_count: reactorRow.receipt_count,
219
+ turn_count: turns.length,
220
+ model_invocation_count: sumModelInvocations(turns),
221
+ tokens,
222
+ ratio: tokenRatio(tokens),
223
+ notes: Object.freeze([
224
+ "Event-changing no-memo control derived from the runtime-produced event-changing receipt schedule.",
225
+ "Each token-bearing turn is charged as fresh work; memo-hit reusable tokens are not credited as reuse.",
226
+ "This is a deterministic control row, not a runtime flag or alternate Reactor execution mode.",
227
+ ]),
228
+ turns: Object.freeze([...turns]),
229
+ });
230
+ }
231
+ function simulateNaiveLoopEventChangingRowV0(reactorRow) {
232
+ const turns = reactorRow.turns.map((turn) => simulateNaiveLoopEventTurnV0(turn));
233
+ const tokens = sumTurnTokens(turns);
234
+ return Object.freeze({
235
+ variant: "naive-loop",
236
+ label: "Naive loop",
237
+ scenario: reactorRow.scenario,
238
+ provenance: "control",
239
+ receipt_count: 0,
240
+ turn_count: turns.length,
241
+ model_invocation_count: sumModelInvocations(turns),
242
+ tokens,
243
+ ratio: tokenRatio(tokens),
244
+ notes: Object.freeze([
245
+ "Event-changing naive-loop control over the same receipt-bearing schedule.",
246
+ "Every review turn rereads the current evidence and spends the runtime row's per-turn total as fresh work.",
247
+ "The control has no receipts, memo keys, forecast policy, stable content identity, or reusable verdict architecture.",
248
+ ]),
249
+ turns: Object.freeze([...turns]),
250
+ });
251
+ }
252
+ function simulateNoMemoEventTurnV0(turn) {
253
+ const tokens = tokensFromFreshReused(turn.tokens.total, 0);
254
+ return Object.freeze({
255
+ index: turn.index,
256
+ as_of: turn.as_of,
257
+ source: "no-memo-simulation",
258
+ outcome: "fresh-judge",
259
+ tokens,
260
+ model_invocation_count: tokens.total === 0 ? 0 : 1,
261
+ ...(turn.event_cause === undefined ? {} : { event_cause: turn.event_cause }),
262
+ ...(turn.recheck_kind === undefined ? {} : { recheck_kind: turn.recheck_kind }),
263
+ note: "No-memo event-changing control charges this turn's runtime token total as fresh judge work.",
264
+ });
265
+ }
266
+ function simulateNaiveLoopEventTurnV0(turn) {
267
+ const tokens = tokensFromFreshReused(turn.tokens.total, 0);
268
+ return Object.freeze({
269
+ index: turn.index,
270
+ as_of: turn.as_of,
271
+ source: "naive-loop-control",
272
+ outcome: "control-review",
273
+ tokens,
274
+ model_invocation_count: tokens.total === 0 ? 0 : 1,
275
+ ...(turn.recheck_kind === undefined ? {} : { recheck_kind: turn.recheck_kind }),
276
+ review_kind: turn.event_cause === "forecast-recheck" ? "scheduled-review" : "real-input-review",
277
+ note: "Naive-loop event-changing control reviews the same turn without receipt or memo reuse.",
278
+ });
279
+ }
280
+ function reactorInvocationNote(receipt) {
281
+ if (receipt.core.event_cause === "forecast-recheck" &&
282
+ receipt.core.recheck_kind === "plan-age") {
283
+ return "Runtime judge invocation for the plan-age audit floor.";
284
+ }
285
+ return "Runtime judge invocation charged from adapter-owned model usage.";
286
+ }
287
+ function scenarioRefFromRun(run) {
288
+ return Object.freeze({
289
+ id: run.scenario_id,
290
+ profile: run.world_profile,
291
+ initial_instant: run.initial_instant,
292
+ final_instant: run.final_instant,
293
+ });
294
+ }
295
+ function eventChangingProfile(profile) {
296
+ if (profile === "static") {
297
+ throw new Error("event-changing cost thesis scenario requires a non-static world profile");
298
+ }
299
+ return profile;
300
+ }
301
+ function assertSameScenario(observed, expected, label) {
302
+ if (expected === undefined) {
303
+ return;
304
+ }
305
+ if (observed.id !== expected.id || observed.profile !== expected.profile) {
306
+ throw new Error(`${label} scenario mismatch: expected ${expected.id}/${expected.profile}, received ${observed.id}/${observed.profile}`);
307
+ }
308
+ }
309
+ function sumTurnTokens(turns) {
310
+ const fresh = turns.reduce((sum, turn) => sum + turn.tokens.fresh, 0);
311
+ const reused = turns.reduce((sum, turn) => sum + turn.tokens.reused, 0);
312
+ return tokensFromFreshReused(fresh, reused);
313
+ }
314
+ function sumModelInvocations(turns) {
315
+ return turns.reduce((sum, turn) => sum + turn.model_invocation_count, 0);
316
+ }
317
+ function tokensFromFreshReused(fresh, reused) {
318
+ return Object.freeze({
319
+ fresh,
320
+ reused,
321
+ total: fresh + reused,
322
+ });
323
+ }
324
+ function tokenRatio(tokens) {
325
+ return Object.freeze({
326
+ fresh: tokens.fresh,
327
+ reused: tokens.reused,
328
+ label: `${tokens.fresh}:${tokens.reused}`,
329
+ reused_is_zero: tokens.reused === 0,
330
+ });
331
+ }
332
+ function contentHash(payload) {
333
+ const digest = (0, node_crypto_1.createHash)("sha256")
334
+ .update(JSON.stringify(payload))
335
+ .digest("hex");
336
+ return `sha256:${digest}`;
337
+ }
@@ -0,0 +1,46 @@
1
+ import type { ModelGatewayCassetteV0 } from "../../replay/model-gateway";
2
+ import type { ReactorScenarioV0 } from "../../scenario/types";
3
+ export declare const NAIVE_LOOP_BASELINE_SCHEMA_V0: "openprose.reactor-cradle.baseline.naive-loop.summary";
4
+ export declare const NAIVE_LOOP_BASELINE_VERSION_V0: 0;
5
+ export declare const NAIVE_LOOP_VARIANT_NAME_V0: "naive-loop";
6
+ export type NaiveLoopReviewKindV0 = "scripted-model-review" | "real-input-review" | "scheduled-review";
7
+ export type NaiveLoopReviewStepKindV0 = "model" | "ingest" | "tick";
8
+ export interface NaiveLoopTokenSummaryV0 {
9
+ readonly fresh: number;
10
+ readonly reused: number;
11
+ }
12
+ export interface NaiveLoopPerInvocationTokenChargeV0 {
13
+ readonly recorded: NaiveLoopTokenSummaryV0;
14
+ readonly charged: NaiveLoopTokenSummaryV0;
15
+ }
16
+ export interface NaiveLoopReviewTurnV0 {
17
+ readonly index: number;
18
+ readonly step_kind: NaiveLoopReviewStepKindV0;
19
+ readonly review_kind: NaiveLoopReviewKindV0;
20
+ readonly as_of: string;
21
+ readonly prompt: string;
22
+ readonly source_ids: readonly string[];
23
+ readonly recheck_kind?: "evidence-age" | "plan-age";
24
+ }
25
+ export interface NaiveLoopBaselineSummaryV0 {
26
+ readonly schema: typeof NAIVE_LOOP_BASELINE_SCHEMA_V0;
27
+ readonly v: typeof NAIVE_LOOP_BASELINE_VERSION_V0;
28
+ readonly scenario_id: string;
29
+ readonly world_profile: ReactorScenarioV0["world"]["profile"];
30
+ readonly variant: typeof NAIVE_LOOP_VARIANT_NAME_V0;
31
+ readonly turn_count: number;
32
+ readonly model_invocation_count: number;
33
+ readonly tokens: NaiveLoopTokenSummaryV0;
34
+ readonly ratio: string;
35
+ readonly per_invocation_tokens: NaiveLoopPerInvocationTokenChargeV0;
36
+ readonly review_turns: readonly NaiveLoopReviewTurnV0[];
37
+ readonly notes: readonly string[];
38
+ }
39
+ export interface MeasureNaiveLoopBaselineInputV0 {
40
+ readonly scenario: ReactorScenarioV0;
41
+ readonly cassette: ModelGatewayCassetteV0;
42
+ readonly prompt?: string;
43
+ readonly include_scripted_model_steps?: boolean;
44
+ }
45
+ export declare function measureNaiveLoopBaselineV0(input: MeasureNaiveLoopBaselineInputV0): NaiveLoopBaselineSummaryV0;
46
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/baselines/naive-loop/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAMzE,OAAO,KAAK,EACV,iBAAiB,EAElB,MAAM,sBAAsB,CAAC;AAE9B,eAAO,MAAM,6BAA6B,EACxC,sDAA+D,CAAC;AAClE,eAAO,MAAM,8BAA8B,EAAG,CAAU,CAAC;AACzD,eAAO,MAAM,0BAA0B,EAAG,YAAqB,CAAC;AAEhE,MAAM,MAAM,qBAAqB,GAC7B,uBAAuB,GACvB,mBAAmB,GACnB,kBAAkB,CAAC;AAEvB,MAAM,MAAM,yBAAyB,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEpE,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mCAAmC;IAClD,QAAQ,CAAC,QAAQ,EAAE,uBAAuB,CAAC;IAC3C,QAAQ,CAAC,OAAO,EAAE,uBAAuB,CAAC;CAC3C;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,yBAAyB,CAAC;IAC9C,QAAQ,CAAC,WAAW,EAAE,qBAAqB,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,YAAY,CAAC,EAAE,cAAc,GAAG,UAAU,CAAC;CACrD;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,MAAM,EAAE,OAAO,6BAA6B,CAAC;IACtD,QAAQ,CAAC,CAAC,EAAE,OAAO,8BAA8B,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC;IAC9D,QAAQ,CAAC,OAAO,EAAE,OAAO,0BAA0B,CAAC;IACpD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,sBAAsB,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,qBAAqB,EAAE,mCAAmC,CAAC;IACpE,QAAQ,CAAC,YAAY,EAAE,SAAS,qBAAqB,EAAE,CAAC;IACxD,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CAAC;IAC1C,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACjD;AAED,wBAAgB,0BAA0B,CACxC,KAAK,EAAE,+BAA+B,GACrC,0BAA0B,CAkD5B"}
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NAIVE_LOOP_VARIANT_NAME_V0 = exports.NAIVE_LOOP_BASELINE_VERSION_V0 = exports.NAIVE_LOOP_BASELINE_SCHEMA_V0 = void 0;
4
+ exports.measureNaiveLoopBaselineV0 = measureNaiveLoopBaselineV0;
5
+ const time_1 = require("../../scenario/time");
6
+ exports.NAIVE_LOOP_BASELINE_SCHEMA_V0 = "openprose.reactor-cradle.baseline.naive-loop.summary";
7
+ exports.NAIVE_LOOP_BASELINE_VERSION_V0 = 0;
8
+ exports.NAIVE_LOOP_VARIANT_NAME_V0 = "naive-loop";
9
+ function measureNaiveLoopBaselineV0(input) {
10
+ const recorded = readRecordedJudgeTokenSummary(input.cassette);
11
+ const charged = Object.freeze({
12
+ fresh: recorded.fresh + recorded.reused,
13
+ reused: 0,
14
+ });
15
+ if (charged.fresh <= 0) {
16
+ throw new Error("naive-loop baseline requires a positive cassette token charge");
17
+ }
18
+ const prompt = input.prompt ?? firstScenarioJudgePrompt(input.scenario) ?? "review-static-world";
19
+ const reviewTurns = collectNaiveLoopReviewTurns({
20
+ scenario: input.scenario,
21
+ prompt,
22
+ includeScriptedModelSteps: input.include_scripted_model_steps ?? false,
23
+ });
24
+ if (reviewTurns.length === 0) {
25
+ throw new Error("naive-loop baseline requires at least one review turn");
26
+ }
27
+ const tokens = Object.freeze({
28
+ fresh: multiplySafe(charged.fresh, reviewTurns.length, "naive-loop fresh tokens"),
29
+ reused: 0,
30
+ });
31
+ return Object.freeze({
32
+ schema: exports.NAIVE_LOOP_BASELINE_SCHEMA_V0,
33
+ v: exports.NAIVE_LOOP_BASELINE_VERSION_V0,
34
+ scenario_id: input.scenario.id,
35
+ world_profile: input.scenario.world.profile,
36
+ variant: exports.NAIVE_LOOP_VARIANT_NAME_V0,
37
+ turn_count: reviewTurns.length,
38
+ model_invocation_count: reviewTurns.length,
39
+ tokens,
40
+ ratio: formatFreshReusedRatio(tokens),
41
+ per_invocation_tokens: Object.freeze({
42
+ recorded,
43
+ charged,
44
+ }),
45
+ review_turns: Object.freeze([...reviewTurns]),
46
+ notes: Object.freeze([
47
+ "Non-Reactor control: no receipts, memo keys, forecast policy, stable content identity, or reusable verdict architecture.",
48
+ "Every counted review turn rereads the scenario sources for that turn and sends a fresh prompt.",
49
+ `Per-review charge is the recorded judge cassette total (fresh + reused = ${charged.fresh}) converted to fresh tokens, so the baseline uses the same cassette usage shape without claiming reuse.`,
50
+ "Scripted model steps are Cradle replay setup unless include_scripted_model_steps is true; ingest and tick review steps are the counted model invocations.",
51
+ "Scripted read steps are evidence reads only and do not add a model invocation unless paired with a counted review turn.",
52
+ "Static evidence is intentionally unchanged; this baseline still re-prompts because a cron/prompt loop has no receipt/memo proof that the prior judgment is reusable.",
53
+ ]),
54
+ });
55
+ }
56
+ function collectNaiveLoopReviewTurns(input) {
57
+ const initialInstant = (0, time_1.canonicalScenarioInstant)(input.scenario.initial_instant, "scenario.initial_instant");
58
+ const initialEpochMs = (0, time_1.parseScenarioInstantMs)(initialInstant, "scenario.initial_instant");
59
+ let currentEpochMs = initialEpochMs;
60
+ const turns = [];
61
+ for (const [index, step] of input.scenario.script.entries()) {
62
+ currentEpochMs = stepEpochMs(step, initialEpochMs, currentEpochMs);
63
+ const turn = reviewTurnForStep({
64
+ scenario: input.scenario,
65
+ step,
66
+ index,
67
+ asOf: new Date(currentEpochMs).toISOString(),
68
+ prompt: input.prompt,
69
+ includeScriptedModelSteps: input.includeScriptedModelSteps,
70
+ });
71
+ if (turn !== undefined) {
72
+ turns.push(turn);
73
+ }
74
+ }
75
+ return Object.freeze(turns);
76
+ }
77
+ function stepEpochMs(step, initialEpochMs, currentEpochMs) {
78
+ if ("at" in step.time) {
79
+ const nextEpochMs = initialEpochMs + (0, time_1.parseScenarioDurationMs)(step.time.at, "script at");
80
+ if (nextEpochMs < currentEpochMs) {
81
+ throw new Error(`scenario step cannot move time backward to ${step.time.at}`);
82
+ }
83
+ return nextEpochMs;
84
+ }
85
+ return currentEpochMs + (0, time_1.parseScenarioDurationMs)(step.time.after, "script after");
86
+ }
87
+ function reviewTurnForStep(input) {
88
+ switch (input.step.kind) {
89
+ case "model":
90
+ if (!input.includeScriptedModelSteps ||
91
+ input.step.request_kind !== "judge") {
92
+ return undefined;
93
+ }
94
+ return Object.freeze({
95
+ index: input.index,
96
+ step_kind: "model",
97
+ review_kind: "scripted-model-review",
98
+ as_of: input.asOf,
99
+ prompt: input.step.prompt,
100
+ source_ids: scenarioSourceIds(input.scenario),
101
+ });
102
+ case "ingest":
103
+ return Object.freeze({
104
+ index: input.index,
105
+ step_kind: "ingest",
106
+ review_kind: "real-input-review",
107
+ as_of: input.asOf,
108
+ prompt: input.prompt,
109
+ source_ids: input.step.source_id === undefined
110
+ ? scenarioSourceIds(input.scenario)
111
+ : Object.freeze([input.step.source_id]),
112
+ });
113
+ case "tick":
114
+ return Object.freeze({
115
+ index: input.index,
116
+ step_kind: "tick",
117
+ review_kind: "scheduled-review",
118
+ as_of: input.asOf,
119
+ prompt: input.prompt,
120
+ source_ids: scenarioSourceIds(input.scenario),
121
+ ...(input.step.recheck_kind === undefined
122
+ ? {}
123
+ : { recheck_kind: input.step.recheck_kind }),
124
+ });
125
+ case "read":
126
+ return undefined;
127
+ }
128
+ }
129
+ function scenarioSourceIds(scenario) {
130
+ return Object.freeze(scenario.sources.map((source) => source.id));
131
+ }
132
+ function firstScenarioJudgePrompt(scenario) {
133
+ for (const step of scenario.script) {
134
+ if (step.kind === "model" && step.request_kind === "judge") {
135
+ return step.prompt;
136
+ }
137
+ }
138
+ return undefined;
139
+ }
140
+ function readRecordedJudgeTokenSummary(cassette) {
141
+ const exchange = cassette.exchanges.find((item) => item.request.kind === "judge") ??
142
+ cassette.exchanges[0];
143
+ if (exchange === undefined) {
144
+ throw new Error("naive-loop baseline requires a cassette exchange");
145
+ }
146
+ return readResponseTokenSummary(exchange.response);
147
+ }
148
+ function readResponseTokenSummary(response) {
149
+ if (response.usage !== undefined) {
150
+ return Object.freeze({
151
+ fresh: readTokenCount(response.usage.tokens.fresh, "response.usage.tokens.fresh"),
152
+ reused: readTokenCount(response.usage.tokens.reused, "response.usage.tokens.reused"),
153
+ });
154
+ }
155
+ const payloadTokens = readPayloadTokens(response.payload);
156
+ if (payloadTokens !== undefined) {
157
+ return payloadTokens;
158
+ }
159
+ throw new Error("model gateway response must include usage tokens or payload tokens");
160
+ }
161
+ function readPayloadTokens(payload) {
162
+ if (!isRecord(payload) || !isRecord(payload["tokens"])) {
163
+ return undefined;
164
+ }
165
+ return Object.freeze({
166
+ fresh: readTokenCount(payload["tokens"]["fresh"], "response.payload.tokens.fresh"),
167
+ reused: readTokenCount(payload["tokens"]["reused"], "response.payload.tokens.reused"),
168
+ });
169
+ }
170
+ function readTokenCount(value, label) {
171
+ if (typeof value !== "number" || !Number.isSafeInteger(value) || value < 0) {
172
+ throw new Error(`${label} must be a non-negative safe integer`);
173
+ }
174
+ return value;
175
+ }
176
+ function multiplySafe(left, right, label) {
177
+ const product = left * right;
178
+ if (!Number.isSafeInteger(product)) {
179
+ throw new Error(`${label} exceeded the safe integer range`);
180
+ }
181
+ return product;
182
+ }
183
+ function formatFreshReusedRatio(tokens) {
184
+ return `${tokens.fresh}:${tokens.reused}`;
185
+ }
186
+ function isRecord(value) {
187
+ return typeof value === "object" && value !== null && !Array.isArray(value);
188
+ }
@@ -0,0 +1,84 @@
1
+ import type { ContentHashV0, ReceiptEventCauseV0, ReceiptRecheckKindV0 } from "@openprose/reactor/receipt";
2
+ import type { ScenarioRunReceiptV0 } from "../../scenario/types";
3
+ export declare const NO_MEMO_BASELINE_SUMMARY_SCHEMA_V0: "openprose.reactor-cradle.baseline.no-memo-summary";
4
+ export declare const NO_MEMO_BASELINE_SUMMARY_VERSION_V0: 0;
5
+ export declare const NO_MEMO_BASELINE_VARIANT_V0: "reactor-no-memo";
6
+ export declare const NO_MEMO_BASELINE_SCENARIO_ID_V0: "incident-briefing-static-zero";
7
+ export declare const NO_MEMO_BASELINE_WORLD_PROFILE_V0: "static";
8
+ export declare const NO_MEMO_BASELINE_CASSETTE_PATH_V0: "./c2-static-zero.model-cassette.json";
9
+ export declare const NO_MEMO_BASELINE_SOURCE_FIXTURE_V0: "src/__tests__/fixtures/c2-static-zero.scenario";
10
+ export declare const NO_MEMO_BASELINE_GENERATED_AT_V0: "2026-05-20T00:00:00.000Z";
11
+ export type NoMemoBaselineSummaryTypeV0 = "runtime-derived-static-no-memo-replay";
12
+ export type NoMemoBaselineRuntimeEquivalentV0 = "model-invocation-equivalent" | "memo-hit-equivalent";
13
+ export type NoMemoBaselineOutcomeV0 = "fresh-judge";
14
+ export interface NoMemoBaselineTokensV0 {
15
+ readonly fresh: number;
16
+ readonly reused: number;
17
+ readonly total: number;
18
+ }
19
+ export interface NoMemoBaselineRatioV0 {
20
+ readonly fresh: number;
21
+ readonly reused: number;
22
+ readonly label: string;
23
+ readonly reused_is_zero: boolean;
24
+ }
25
+ export interface NoMemoBaselineScenarioV0 {
26
+ readonly id: typeof NO_MEMO_BASELINE_SCENARIO_ID_V0;
27
+ readonly profile: typeof NO_MEMO_BASELINE_WORLD_PROFILE_V0;
28
+ readonly initial_instant: string;
29
+ readonly final_instant: string;
30
+ readonly source_fixture: string;
31
+ readonly cassette_path: typeof NO_MEMO_BASELINE_CASSETTE_PATH_V0;
32
+ readonly scenario_script_turn_count: number;
33
+ }
34
+ export interface NoMemoBaselineTurnV0 {
35
+ readonly index: number;
36
+ readonly as_of: string;
37
+ readonly event_cause: ReceiptEventCauseV0;
38
+ readonly recheck_kind?: ReceiptRecheckKindV0;
39
+ readonly runtime_equivalent: NoMemoBaselineRuntimeEquivalentV0;
40
+ readonly no_memo_outcome: NoMemoBaselineOutcomeV0;
41
+ readonly model_invocation_count: number;
42
+ readonly tokens: NoMemoBaselineTokensV0;
43
+ readonly source_tokens: NoMemoBaselineTokensV0;
44
+ readonly source_provider: string;
45
+ readonly source_model: string;
46
+ readonly source_receipt_hash?: ContentHashV0;
47
+ readonly deterministic_profile: string;
48
+ readonly note: string;
49
+ }
50
+ export interface NoMemoBaselineAssumptionsV0 {
51
+ readonly replay_mode: "same-runtime-receipt-log-with-memo-disabled-equivalent";
52
+ readonly memo_hit_handling: "token-bearing-receipts-charge-total-as-fresh";
53
+ readonly runtime_behavior_changed: false;
54
+ readonly excluded_invocations: readonly string[];
55
+ }
56
+ export interface NoMemoBaselineSummaryV0 {
57
+ readonly schema: typeof NO_MEMO_BASELINE_SUMMARY_SCHEMA_V0;
58
+ readonly v: typeof NO_MEMO_BASELINE_SUMMARY_VERSION_V0;
59
+ readonly summary_type: NoMemoBaselineSummaryTypeV0;
60
+ readonly generated_at: typeof NO_MEMO_BASELINE_GENERATED_AT_V0;
61
+ readonly variant: typeof NO_MEMO_BASELINE_VARIANT_V0;
62
+ readonly scenario: NoMemoBaselineScenarioV0;
63
+ readonly receipt_count: number;
64
+ readonly turn_count: number;
65
+ readonly memo_hit_equivalent_count: number;
66
+ readonly model_invocation_count: number;
67
+ readonly tokens: NoMemoBaselineTokensV0;
68
+ readonly ratio: NoMemoBaselineRatioV0;
69
+ readonly assumptions: NoMemoBaselineAssumptionsV0;
70
+ readonly turns: readonly NoMemoBaselineTurnV0[];
71
+ readonly notes: readonly string[];
72
+ readonly content_hash: ContentHashV0;
73
+ }
74
+ export interface RunNoMemoW7StaticBaselineInputV0 {
75
+ readonly reactor_run?: ScenarioRunReceiptV0;
76
+ readonly source_fixture?: string;
77
+ }
78
+ export interface CreateNoMemoStaticBaselineFromReactorRunInputV0 {
79
+ readonly reactor_run: ScenarioRunReceiptV0;
80
+ readonly source_fixture?: string;
81
+ }
82
+ export declare function createNoMemoStaticBaselineFromReactorRunV0(input: CreateNoMemoStaticBaselineFromReactorRunInputV0): NoMemoBaselineSummaryV0;
83
+ export declare function runNoMemoW7StaticBaselineV0(input?: RunNoMemoW7StaticBaselineInputV0): NoMemoBaselineSummaryV0;
84
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/baselines/no-memo/index.ts"],"names":[],"mappings":"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"}