@riddledc/riddle-proof 0.5.7 → 0.5.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -78,6 +78,19 @@ way to a ready PR after proof and CI; `leave_draft: true` is only an explicit
78
78
  debug or user-request escape hatch. The notification adapter is where a host
79
79
  updates Discord, OpenClaw, GitHub, or another integration.
80
80
 
81
+ ## Runtime Scratch Space
82
+
83
+ The packaged proof-run setup uses isolated git worktrees for before and after
84
+ states. By default those worktrees now live under
85
+ `/tmp/.riddle-proof-worktrees`, with dependency caches under the matching local
86
+ temp root. This keeps repeated `node_modules` cache materialization on local
87
+ scratch storage instead of walking large dependency trees on EFS or other shared
88
+ workspace filesystems.
89
+
90
+ Set `RIDDLE_PROOF_WORKTREE_ROOT` to choose an explicit location. Set
91
+ `RIDDLE_PROOF_USE_WORKSPACE_WORKTREE_ROOT=1` to keep the previous behavior of
92
+ placing proof worktrees next to the active repository.
93
+
81
94
  ## Capture Diagnostics
82
95
 
83
96
  `@riddledc/riddle-proof/diagnostics` standardizes the evidence contract around
@@ -27,6 +27,17 @@ import {
27
27
  } from "fs";
28
28
  import path from "path";
29
29
  import crypto from "crypto";
30
+ var DEFAULT_MAX_ITERATIONS = 12;
31
+ var DEFAULT_STAGE_ITERATION_LIMITS = {
32
+ setup: 2,
33
+ recon: 4,
34
+ author: 3,
35
+ implement: 3,
36
+ prove: 3,
37
+ verify: 4,
38
+ ship: 2,
39
+ notify: 2
40
+ };
30
41
  function timestamp() {
31
42
  return (/* @__PURE__ */ new Date()).toISOString();
32
43
  }
@@ -633,7 +644,7 @@ async function runRiddleProofEngineHarness(input) {
633
644
  const agent = input.agent || createDisabledRiddleProofAgentAdapter();
634
645
  const maxIterations = Math.max(
635
646
  1,
636
- Math.trunc(input.max_iterations ?? request.max_iterations ?? input.config?.defaultMaxIterations ?? 8)
647
+ Math.trunc(input.max_iterations ?? request.max_iterations ?? input.config?.defaultMaxIterations ?? DEFAULT_MAX_ITERATIONS)
637
648
  );
638
649
  state.status = "running";
639
650
  state.ok = void 0;
@@ -666,6 +677,7 @@ async function runRiddleProofEngineHarness(input) {
666
677
  }
667
678
  let nextParams = input.resume_params || initialRunParams(request, input, state);
668
679
  let lastResult = null;
680
+ const stageIterations = {};
669
681
  for (let index = 0; index < maxIterations; index += 1) {
670
682
  if (request.leave_draft && nextParams.leave_draft === void 0) {
671
683
  nextParams = { ...nextParams, leave_draft: true };
@@ -724,6 +736,7 @@ async function runRiddleProofEngineHarness(input) {
724
736
  if (engineState) state.request.engine_state_path = engineState;
725
737
  state.last_checkpoint = result.checkpoint || state.last_checkpoint || null;
726
738
  const resultStage = stageFromCheckpoint(result);
739
+ stageIterations[resultStage] = (stageIterations[resultStage] || 0) + 1;
727
740
  heartbeat(state, {
728
741
  stage: resultStage,
729
742
  summary: `${resultStage} stage is active.`,
@@ -749,6 +762,22 @@ async function runRiddleProofEngineHarness(input) {
749
762
  finished_at: timestamp()
750
763
  }
751
764
  });
765
+ const stageLimit = DEFAULT_STAGE_ITERATION_LIMITS[resultStage];
766
+ if (stageLimit && stageIterations[resultStage] > stageLimit) {
767
+ return blockerResult(state, result, {
768
+ code: "stage_iteration_limit_reached",
769
+ checkpoint: result.checkpoint || null,
770
+ message: `The harness exceeded the ${resultStage} stage iteration limit before the proof was ready or shipped.`,
771
+ details: {
772
+ stage: resultStage,
773
+ stage_iterations: stageIterations[resultStage],
774
+ stage_iteration_limit: stageLimit,
775
+ max_iterations: maxIterations,
776
+ lastCheckpoint: result.checkpoint || null,
777
+ lastSummary: result.summary || null
778
+ }
779
+ });
780
+ }
752
781
  const routed = await routeCheckpoint(request, state, result, agent, input);
753
782
  if (routed.terminal) return routed.terminal;
754
783
  if (routed.blocker) return blockerResult(state, result, routed.blocker);
@@ -2997,6 +2997,17 @@ function setRunStatus(state, status, at = timestamp()) {
2997
2997
  }
2998
2998
 
2999
2999
  // src/engine-harness.ts
3000
+ var DEFAULT_MAX_ITERATIONS = 12;
3001
+ var DEFAULT_STAGE_ITERATION_LIMITS = {
3002
+ setup: 2,
3003
+ recon: 4,
3004
+ author: 3,
3005
+ implement: 3,
3006
+ prove: 3,
3007
+ verify: 4,
3008
+ ship: 2,
3009
+ notify: 2
3010
+ };
3000
3011
  function timestamp2() {
3001
3012
  return (/* @__PURE__ */ new Date()).toISOString();
3002
3013
  }
@@ -3603,7 +3614,7 @@ async function runRiddleProofEngineHarness(input) {
3603
3614
  const agent = input.agent || createDisabledRiddleProofAgentAdapter();
3604
3615
  const maxIterations = Math.max(
3605
3616
  1,
3606
- Math.trunc(input.max_iterations ?? request.max_iterations ?? input.config?.defaultMaxIterations ?? 8)
3617
+ Math.trunc(input.max_iterations ?? request.max_iterations ?? input.config?.defaultMaxIterations ?? DEFAULT_MAX_ITERATIONS)
3607
3618
  );
3608
3619
  state.status = "running";
3609
3620
  state.ok = void 0;
@@ -3636,6 +3647,7 @@ async function runRiddleProofEngineHarness(input) {
3636
3647
  }
3637
3648
  let nextParams = input.resume_params || initialRunParams(request, input, state);
3638
3649
  let lastResult = null;
3650
+ const stageIterations = {};
3639
3651
  for (let index = 0; index < maxIterations; index += 1) {
3640
3652
  if (request.leave_draft && nextParams.leave_draft === void 0) {
3641
3653
  nextParams = { ...nextParams, leave_draft: true };
@@ -3694,6 +3706,7 @@ async function runRiddleProofEngineHarness(input) {
3694
3706
  if (engineState) state.request.engine_state_path = engineState;
3695
3707
  state.last_checkpoint = result.checkpoint || state.last_checkpoint || null;
3696
3708
  const resultStage = stageFromCheckpoint(result);
3709
+ stageIterations[resultStage] = (stageIterations[resultStage] || 0) + 1;
3697
3710
  heartbeat(state, {
3698
3711
  stage: resultStage,
3699
3712
  summary: `${resultStage} stage is active.`,
@@ -3719,6 +3732,22 @@ async function runRiddleProofEngineHarness(input) {
3719
3732
  finished_at: timestamp2()
3720
3733
  }
3721
3734
  });
3735
+ const stageLimit = DEFAULT_STAGE_ITERATION_LIMITS[resultStage];
3736
+ if (stageLimit && stageIterations[resultStage] > stageLimit) {
3737
+ return blockerResult(state, result, {
3738
+ code: "stage_iteration_limit_reached",
3739
+ checkpoint: result.checkpoint || null,
3740
+ message: `The harness exceeded the ${resultStage} stage iteration limit before the proof was ready or shipped.`,
3741
+ details: {
3742
+ stage: resultStage,
3743
+ stage_iterations: stageIterations[resultStage],
3744
+ stage_iteration_limit: stageLimit,
3745
+ max_iterations: maxIterations,
3746
+ lastCheckpoint: result.checkpoint || null,
3747
+ lastSummary: result.summary || null
3748
+ }
3749
+ });
3750
+ }
3722
3751
  const routed = await routeCheckpoint(request, state, result, agent, input);
3723
3752
  if (routed.terminal) return routed.terminal;
3724
3753
  if (routed.blocker) return blockerResult(state, result, routed.blocker);
@@ -2,7 +2,7 @@ import {
2
2
  createDisabledRiddleProofAgentAdapter,
3
3
  readRiddleProofRunStatus,
4
4
  runRiddleProofEngineHarness
5
- } from "./chunk-GC7C2NRA.js";
5
+ } from "./chunk-CNKNPJAF.js";
6
6
  import "./chunk-GVPCSXN7.js";
7
7
  import "./chunk-TMMKRKY5.js";
8
8
  export {
package/dist/index.cjs CHANGED
@@ -3556,6 +3556,17 @@ var import_node_child_process2 = require("child_process");
3556
3556
  var import_node_fs3 = require("fs");
3557
3557
  var import_node_path3 = __toESM(require("path"), 1);
3558
3558
  var import_node_crypto2 = __toESM(require("crypto"), 1);
3559
+ var DEFAULT_MAX_ITERATIONS = 12;
3560
+ var DEFAULT_STAGE_ITERATION_LIMITS = {
3561
+ setup: 2,
3562
+ recon: 4,
3563
+ author: 3,
3564
+ implement: 3,
3565
+ prove: 3,
3566
+ verify: 4,
3567
+ ship: 2,
3568
+ notify: 2
3569
+ };
3559
3570
  function timestamp2() {
3560
3571
  return (/* @__PURE__ */ new Date()).toISOString();
3561
3572
  }
@@ -4162,7 +4173,7 @@ async function runRiddleProofEngineHarness(input) {
4162
4173
  const agent = input.agent || createDisabledRiddleProofAgentAdapter();
4163
4174
  const maxIterations = Math.max(
4164
4175
  1,
4165
- Math.trunc(input.max_iterations ?? request.max_iterations ?? input.config?.defaultMaxIterations ?? 8)
4176
+ Math.trunc(input.max_iterations ?? request.max_iterations ?? input.config?.defaultMaxIterations ?? DEFAULT_MAX_ITERATIONS)
4166
4177
  );
4167
4178
  state.status = "running";
4168
4179
  state.ok = void 0;
@@ -4195,6 +4206,7 @@ async function runRiddleProofEngineHarness(input) {
4195
4206
  }
4196
4207
  let nextParams = input.resume_params || initialRunParams(request, input, state);
4197
4208
  let lastResult = null;
4209
+ const stageIterations = {};
4198
4210
  for (let index = 0; index < maxIterations; index += 1) {
4199
4211
  if (request.leave_draft && nextParams.leave_draft === void 0) {
4200
4212
  nextParams = { ...nextParams, leave_draft: true };
@@ -4253,6 +4265,7 @@ async function runRiddleProofEngineHarness(input) {
4253
4265
  if (engineState) state.request.engine_state_path = engineState;
4254
4266
  state.last_checkpoint = result.checkpoint || state.last_checkpoint || null;
4255
4267
  const resultStage = stageFromCheckpoint(result);
4268
+ stageIterations[resultStage] = (stageIterations[resultStage] || 0) + 1;
4256
4269
  heartbeat(state, {
4257
4270
  stage: resultStage,
4258
4271
  summary: `${resultStage} stage is active.`,
@@ -4278,6 +4291,22 @@ async function runRiddleProofEngineHarness(input) {
4278
4291
  finished_at: timestamp2()
4279
4292
  }
4280
4293
  });
4294
+ const stageLimit = DEFAULT_STAGE_ITERATION_LIMITS[resultStage];
4295
+ if (stageLimit && stageIterations[resultStage] > stageLimit) {
4296
+ return blockerResult(state, result, {
4297
+ code: "stage_iteration_limit_reached",
4298
+ checkpoint: result.checkpoint || null,
4299
+ message: `The harness exceeded the ${resultStage} stage iteration limit before the proof was ready or shipped.`,
4300
+ details: {
4301
+ stage: resultStage,
4302
+ stage_iterations: stageIterations[resultStage],
4303
+ stage_iteration_limit: stageLimit,
4304
+ max_iterations: maxIterations,
4305
+ lastCheckpoint: result.checkpoint || null,
4306
+ lastSummary: result.summary || null
4307
+ }
4308
+ });
4309
+ }
4281
4310
  const routed = await routeCheckpoint(request, state, result, agent, input);
4282
4311
  if (routed.terminal) return routed.terminal;
4283
4312
  if (routed.blocker) return blockerResult(state, result, routed.blocker);
package/dist/index.js CHANGED
@@ -13,7 +13,7 @@ import {
13
13
  createDisabledRiddleProofAgentAdapter,
14
14
  readRiddleProofRunStatus,
15
15
  runRiddleProofEngineHarness
16
- } from "./chunk-GC7C2NRA.js";
16
+ } from "./chunk-CNKNPJAF.js";
17
17
  import {
18
18
  runRiddleProof
19
19
  } from "./chunk-VSEKLCNU.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riddledc/riddle-proof",
3
- "version": "0.5.7",
3
+ "version": "0.5.9",
4
4
  "description": "Reusable Riddle Proof contracts and helpers for evidence-backed agent changes.",
5
5
  "license": "MIT",
6
6
  "author": "RiddleDC",
@@ -1,12 +1,12 @@
1
1
  """Setup: create worktrees, install deps, validate args, write state.
2
2
 
3
3
  Idempotent — safe to re-run. Creates per-run worktrees under the active
4
- workspace root by default:
5
- <workspace>/.riddle-proof-worktrees/riddle-proof-<run_id>-before
6
- <workspace>/.riddle-proof-worktrees/riddle-proof-<run_id>-after
4
+ local temp storage by default:
5
+ /tmp/.riddle-proof-worktrees/riddle-proof-<run_id>-before
6
+ /tmp/.riddle-proof-worktrees/riddle-proof-<run_id>-after
7
7
  """
8
8
 
9
- import json, subprocess as sp, os, sys, shutil, time
9
+ import json, subprocess as sp, os, sys, shutil, time, tempfile
10
10
  sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
11
11
  from util import load_state, save_state, git, shell_quote
12
12
 
@@ -160,8 +160,14 @@ def resolve_worktree_root(repo_dir):
160
160
  configured = (s.get('worktree_root') or os.environ.get('RIDDLE_PROOF_WORKTREE_ROOT') or '').strip()
161
161
  if configured:
162
162
  return os.path.abspath(os.path.expanduser(configured))
163
- repo_parent = os.path.dirname(os.path.abspath(repo_dir))
164
- return os.path.join(repo_parent, '.riddle-proof-worktrees')
163
+ if os.environ.get('RIDDLE_PROOF_USE_WORKSPACE_WORKTREE_ROOT', '').strip().lower() in ('1', 'true', 'yes'):
164
+ repo_parent = os.path.dirname(os.path.abspath(repo_dir))
165
+ return os.path.join(repo_parent, '.riddle-proof-worktrees')
166
+
167
+ # Proof worktrees are scratch data. Keep them on local temp storage by
168
+ # default so dependency cache materialization does not crawl across EFS or
169
+ # other shared workspace filesystems.
170
+ return os.path.join(tempfile.gettempdir(), '.riddle-proof-worktrees')
165
171
 
166
172
 
167
173
  def cleanup_legacy_branch_worktrees(repo_dir, branch_name):