@jinn-network/client 0.1.6 → 0.1.7-canary.0a586ca9

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 (434) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +67 -1
  3. package/deployments/deployment-jinn-mvi-l1-sepolia-fast.json +23 -4
  4. package/deployments/deployment-jinn-mvi-l1-sepolia.json +23 -4
  5. package/deployments/deployment-jinn-mvi-l2-baseSepolia.json +5 -4
  6. package/dist/adapters/mech/adapter.d.ts +57 -2
  7. package/dist/adapters/mech/adapter.js +366 -63
  8. package/dist/adapters/mech/adapter.js.map +1 -1
  9. package/dist/adapters/mech/contracts.d.ts +17 -4
  10. package/dist/adapters/mech/contracts.js +19 -4
  11. package/dist/adapters/mech/contracts.js.map +1 -1
  12. package/dist/adapters/mech/safe-revert.d.ts +20 -0
  13. package/dist/adapters/mech/safe-revert.js +12 -4
  14. package/dist/adapters/mech/safe-revert.js.map +1 -1
  15. package/dist/adapters/mech/safe.d.ts +6 -2
  16. package/dist/adapters/mech/safe.js +32 -11
  17. package/dist/adapters/mech/safe.js.map +1 -1
  18. package/dist/adapters/mech/types.d.ts +6 -1
  19. package/dist/adapters/mech/types.js.map +1 -1
  20. package/dist/adapters/mech/verdict-code.d.ts +1 -0
  21. package/dist/adapters/mech/verdict-code.js +18 -0
  22. package/dist/adapters/mech/verdict-code.js.map +1 -1
  23. package/dist/agent/operator-claude.js +8 -0
  24. package/dist/agent/operator-claude.js.map +1 -1
  25. package/dist/api/activity-events-endpoint.d.ts +14 -0
  26. package/dist/api/activity-events-endpoint.js +59 -0
  27. package/dist/api/activity-events-endpoint.js.map +1 -0
  28. package/dist/api/admin-endpoint.d.ts +15 -3
  29. package/dist/api/admin-endpoint.js +24 -2
  30. package/dist/api/admin-endpoint.js.map +1 -1
  31. package/dist/api/bootstrap-endpoint.d.ts +1 -2
  32. package/dist/api/bootstrap-endpoint.js +85 -18
  33. package/dist/api/bootstrap-endpoint.js.map +1 -1
  34. package/dist/api/codex-doctor-endpoint.d.ts +90 -0
  35. package/dist/api/codex-doctor-endpoint.js +296 -0
  36. package/dist/api/codex-doctor-endpoint.js.map +1 -0
  37. package/dist/api/discovery-endpoint.d.ts +1 -0
  38. package/dist/api/discovery-endpoint.js +26 -0
  39. package/dist/api/discovery-endpoint.js.map +1 -1
  40. package/dist/api/fleet-build.d.ts +1 -0
  41. package/dist/api/fleet-build.js +2 -1
  42. package/dist/api/fleet-build.js.map +1 -1
  43. package/dist/api/gather-status.d.ts +37 -0
  44. package/dist/api/gather-status.js +572 -19
  45. package/dist/api/gather-status.js.map +1 -1
  46. package/dist/api/hermes-doctor-endpoint.d.ts +128 -3
  47. package/dist/api/hermes-doctor-endpoint.js +265 -22
  48. package/dist/api/hermes-doctor-endpoint.js.map +1 -1
  49. package/dist/api/launcher-status.d.ts +24 -17
  50. package/dist/api/launcher-status.js +13 -11
  51. package/dist/api/launcher-status.js.map +1 -1
  52. package/dist/api/launcher-tasks.d.ts +1 -1
  53. package/dist/api/launcher-tasks.js +12 -8
  54. package/dist/api/launcher-tasks.js.map +1 -1
  55. package/dist/api/operator-artifacts-endpoint.js +73 -6
  56. package/dist/api/operator-artifacts-endpoint.js.map +1 -1
  57. package/dist/api/portfolio-v0-build.d.ts +10 -0
  58. package/dist/api/portfolio-v0-build.js +24 -5
  59. package/dist/api/portfolio-v0-build.js.map +1 -1
  60. package/dist/api/prediction-v1-build.d.ts +10 -0
  61. package/dist/api/prediction-v1-build.js +7 -1
  62. package/dist/api/prediction-v1-build.js.map +1 -1
  63. package/dist/api/server.d.ts +31 -1
  64. package/dist/api/server.js +95 -2
  65. package/dist/api/server.js.map +1 -1
  66. package/dist/api/setup-endpoints.d.ts +7 -0
  67. package/dist/api/setup-endpoints.js +67 -135
  68. package/dist/api/setup-endpoints.js.map +1 -1
  69. package/dist/api/setup-retry-endpoint.d.ts +19 -0
  70. package/dist/api/setup-retry-endpoint.js +32 -0
  71. package/dist/api/setup-retry-endpoint.js.map +1 -0
  72. package/dist/api/solvernets-endpoints.d.ts +8 -0
  73. package/dist/api/solvernets-endpoints.js +100 -105
  74. package/dist/api/solvernets-endpoints.js.map +1 -1
  75. package/dist/api/status-build.d.ts +167 -2
  76. package/dist/api/status-build.js +118 -27
  77. package/dist/api/status-build.js.map +1 -1
  78. package/dist/api/status-harness-rollup.d.ts +35 -0
  79. package/dist/api/status-harness-rollup.js +45 -0
  80. package/dist/api/status-harness-rollup.js.map +1 -0
  81. package/dist/api/task-run-routing.d.ts +7 -0
  82. package/dist/api/task-run-routing.js +12 -0
  83. package/dist/api/task-run-routing.js.map +1 -0
  84. package/dist/api/task-runs-build.d.ts +21 -0
  85. package/dist/api/task-runs-build.js +14 -1
  86. package/dist/api/task-runs-build.js.map +1 -1
  87. package/dist/build-info.json +4 -4
  88. package/dist/build-meta.json +1 -1
  89. package/dist/captures/live-publisher.js +24 -4
  90. package/dist/captures/live-publisher.js.map +1 -1
  91. package/dist/captures/publish.d.ts +1 -1
  92. package/dist/chain-read-errors.d.ts +22 -0
  93. package/dist/chain-read-errors.js +41 -1
  94. package/dist/chain-read-errors.js.map +1 -1
  95. package/dist/cli/commands/auth.js +1 -1
  96. package/dist/cli/commands/auth.js.map +1 -1
  97. package/dist/cli/commands/codedigest-revert-check.d.ts +33 -0
  98. package/dist/cli/commands/codedigest-revert-check.js +249 -0
  99. package/dist/cli/commands/codedigest-revert-check.js.map +1 -0
  100. package/dist/cli/commands/create.js +3 -2
  101. package/dist/cli/commands/create.js.map +1 -1
  102. package/dist/cli/commands/doctor.d.ts +2 -0
  103. package/dist/cli/commands/doctor.js +2 -0
  104. package/dist/cli/commands/doctor.js.map +1 -1
  105. package/dist/cli/commands/rewards.js +11 -7
  106. package/dist/cli/commands/rewards.js.map +1 -1
  107. package/dist/cli/commands/solver-nets.d.ts +1 -0
  108. package/dist/cli/commands/solver-nets.js +179 -16
  109. package/dist/cli/commands/solver-nets.js.map +1 -1
  110. package/dist/cli/commands/solver-plugins-block.d.ts +33 -0
  111. package/dist/cli/commands/solver-plugins-block.js +118 -0
  112. package/dist/cli/commands/solver-plugins-block.js.map +1 -0
  113. package/dist/cli/commands/solver-plugins-feedback.d.ts +72 -0
  114. package/dist/cli/commands/solver-plugins-feedback.js +262 -0
  115. package/dist/cli/commands/solver-plugins-feedback.js.map +1 -0
  116. package/dist/cli/commands/solver-plugins-read.d.ts +54 -0
  117. package/dist/cli/commands/solver-plugins-read.js +259 -0
  118. package/dist/cli/commands/solver-plugins-read.js.map +1 -0
  119. package/dist/cli/commands/solver-plugins.d.ts +35 -0
  120. package/dist/cli/commands/solver-plugins.js +399 -2
  121. package/dist/cli/commands/solver-plugins.js.map +1 -1
  122. package/dist/cli/commands/status.js +1 -1
  123. package/dist/cli/commands/status.js.map +1 -1
  124. package/dist/cli/commands/tasks.js +101 -11
  125. package/dist/cli/commands/tasks.js.map +1 -1
  126. package/dist/cli/commands/update.d.ts +10 -0
  127. package/dist/cli/commands/update.js +36 -0
  128. package/dist/cli/commands/update.js.map +1 -1
  129. package/dist/cli/index.js +2 -0
  130. package/dist/cli/index.js.map +1 -1
  131. package/dist/cli/introspection-context.js +5 -0
  132. package/dist/cli/introspection-context.js.map +1 -1
  133. package/dist/cli/task-native-readiness.d.ts +10 -1
  134. package/dist/cli/task-native-readiness.js +30 -6
  135. package/dist/cli/task-native-readiness.js.map +1 -1
  136. package/dist/config.d.ts +287 -235
  137. package/dist/config.js +318 -114
  138. package/dist/config.js.map +1 -1
  139. package/dist/daemon/checkpoint-loop.d.ts +48 -0
  140. package/dist/daemon/checkpoint-loop.js +76 -0
  141. package/dist/daemon/checkpoint-loop.js.map +1 -0
  142. package/dist/daemon/creator.d.ts +1 -1
  143. package/dist/daemon/creator.js +20 -3
  144. package/dist/daemon/creator.js.map +1 -1
  145. package/dist/daemon/daemon.d.ts +22 -0
  146. package/dist/daemon/daemon.js +174 -31
  147. package/dist/daemon/daemon.js.map +1 -1
  148. package/dist/daemon/eviction-loop.d.ts +40 -0
  149. package/dist/daemon/eviction-loop.js +67 -0
  150. package/dist/daemon/eviction-loop.js.map +1 -0
  151. package/dist/daemon/gate-logger.d.ts +9 -0
  152. package/dist/daemon/gate-logger.js +2 -0
  153. package/dist/daemon/gate-logger.js.map +1 -0
  154. package/dist/daemon/jinn-claim-loop-wiring.d.ts +33 -0
  155. package/dist/daemon/jinn-claim-loop-wiring.js +40 -0
  156. package/dist/daemon/jinn-claim-loop-wiring.js.map +1 -0
  157. package/dist/daemon/jinn-claim-loop.d.ts +24 -17
  158. package/dist/daemon/jinn-claim-loop.js +77 -23
  159. package/dist/daemon/jinn-claim-loop.js.map +1 -1
  160. package/dist/daemon/readiness-gate.d.ts +1 -4
  161. package/dist/daemon/readiness-gate.js.map +1 -1
  162. package/dist/daemon/skip-log-dedup.d.ts +69 -0
  163. package/dist/daemon/skip-log-dedup.js +106 -0
  164. package/dist/daemon/skip-log-dedup.js.map +1 -0
  165. package/dist/daemon/spend-cap-gate.d.ts +40 -0
  166. package/dist/daemon/spend-cap-gate.js +46 -0
  167. package/dist/daemon/spend-cap-gate.js.map +1 -0
  168. package/dist/dashboard/assets/index-BNs_ewI6.js +345 -0
  169. package/dist/dashboard/assets/index-C4huIsUW.css +32 -0
  170. package/dist/dashboard/index.html +2 -2
  171. package/dist/discovery/factory.d.ts +17 -5
  172. package/dist/discovery/factory.js +46 -18
  173. package/dist/discovery/factory.js.map +1 -1
  174. package/dist/discovery/http.js +469 -3
  175. package/dist/discovery/http.js.map +1 -1
  176. package/dist/discovery/onchain.d.ts +5 -0
  177. package/dist/discovery/onchain.js +448 -18
  178. package/dist/discovery/onchain.js.map +1 -1
  179. package/dist/discovery/types.d.ts +174 -1
  180. package/dist/discovery/types.js +8 -10
  181. package/dist/discovery/types.js.map +1 -1
  182. package/dist/discovery/with-fallback.d.ts +7 -0
  183. package/dist/discovery/with-fallback.js +37 -0
  184. package/dist/discovery/with-fallback.js.map +1 -1
  185. package/dist/earning/bootstrap.d.ts +100 -4
  186. package/dist/earning/bootstrap.js +239 -76
  187. package/dist/earning/bootstrap.js.map +1 -1
  188. package/dist/earning/contracts.d.ts +14 -0
  189. package/dist/earning/contracts.js +17 -5
  190. package/dist/earning/contracts.js.map +1 -1
  191. package/dist/earning/funding-plan.js +27 -18
  192. package/dist/earning/funding-plan.js.map +1 -1
  193. package/dist/earning/jinn-rewards.d.ts +46 -0
  194. package/dist/earning/jinn-rewards.js +32 -0
  195. package/dist/earning/jinn-rewards.js.map +1 -1
  196. package/dist/earning/safe-adapter.d.ts +2 -0
  197. package/dist/earning/safe-adapter.js +37 -11
  198. package/dist/earning/safe-adapter.js.map +1 -1
  199. package/dist/earning/store.d.ts +8 -0
  200. package/dist/earning/store.js.map +1 -1
  201. package/dist/earning/testnet-setup-migration.d.ts +12 -0
  202. package/dist/earning/testnet-setup-migration.js +27 -1
  203. package/dist/earning/testnet-setup-migration.js.map +1 -1
  204. package/dist/earning/types.d.ts +21 -6
  205. package/dist/earning/viem-clients.d.ts +11 -4
  206. package/dist/earning/viem-clients.js +14 -5
  207. package/dist/earning/viem-clients.js.map +1 -1
  208. package/dist/erc8004/identity.d.ts +19 -3
  209. package/dist/erc8004/identity.js +21 -6
  210. package/dist/erc8004/identity.js.map +1 -1
  211. package/dist/erc8004/index.d.ts +1 -1
  212. package/dist/erc8004/index.js.map +1 -1
  213. package/dist/erc8004/reputation.d.ts +8 -0
  214. package/dist/erc8004/reputation.js +22 -3
  215. package/dist/erc8004/reputation.js.map +1 -1
  216. package/dist/events/types.d.ts +2 -2
  217. package/dist/harnesses/cost-estimates.d.ts +124 -0
  218. package/dist/harnesses/cost-estimates.js +265 -0
  219. package/dist/harnesses/cost-estimates.js.map +1 -0
  220. package/dist/harnesses/engine/engine.d.ts +78 -0
  221. package/dist/harnesses/engine/engine.js +153 -11
  222. package/dist/harnesses/engine/engine.js.map +1 -1
  223. package/dist/harnesses/engine/persistence.d.ts +51 -1
  224. package/dist/harnesses/engine/persistence.js +118 -5
  225. package/dist/harnesses/engine/persistence.js.map +1 -1
  226. package/dist/harnesses/engine/work-dir-reaper.d.ts +65 -0
  227. package/dist/harnesses/engine/work-dir-reaper.js +100 -0
  228. package/dist/harnesses/engine/work-dir-reaper.js.map +1 -0
  229. package/dist/harnesses/impls/hermes-agent/adapter.js +40 -0
  230. package/dist/harnesses/impls/hermes-agent/adapter.js.map +1 -1
  231. package/dist/harnesses/impls/hermes-agent/bootstrap.d.ts +20 -0
  232. package/dist/harnesses/impls/hermes-agent/bootstrap.js +44 -8
  233. package/dist/harnesses/impls/hermes-agent/bootstrap.js.map +1 -1
  234. package/dist/harnesses/impls/hermes-agent/config-builder.d.ts +1 -1
  235. package/dist/harnesses/impls/hermes-agent/config-builder.js +4 -2
  236. package/dist/harnesses/impls/hermes-agent/config-builder.js.map +1 -1
  237. package/dist/harnesses/impls/hermes-agent/harness.d.ts +59 -1
  238. package/dist/harnesses/impls/hermes-agent/harness.js +104 -0
  239. package/dist/harnesses/impls/hermes-agent/harness.js.map +1 -1
  240. package/dist/harnesses/impls/hermes-agent/prompt.d.ts +6 -6
  241. package/dist/harnesses/impls/hermes-agent/prompt.js +6 -6
  242. package/dist/harnesses/impls/index.d.ts +7 -0
  243. package/dist/harnesses/impls/index.js +16 -1
  244. package/dist/harnesses/impls/index.js.map +1 -1
  245. package/dist/harnesses/impls/learner/adapters/codex-code.d.ts +9 -0
  246. package/dist/harnesses/impls/learner/adapters/codex-code.js +30 -8
  247. package/dist/harnesses/impls/learner/adapters/codex-code.js.map +1 -1
  248. package/dist/harnesses/impls/learner/harness.d.ts +47 -4
  249. package/dist/harnesses/impls/learner/harness.js +105 -2
  250. package/dist/harnesses/impls/learner/harness.js.map +1 -1
  251. package/dist/harnesses/impls/learner/harvest.d.ts +1 -1
  252. package/dist/harnesses/impls/learner/harvest.js +23 -5
  253. package/dist/harnesses/impls/learner/harvest.js.map +1 -1
  254. package/dist/harnesses/impls/learner/plugin-path.d.ts +0 -13
  255. package/dist/harnesses/impls/learner/plugin-path.js +35 -15
  256. package/dist/harnesses/impls/learner/plugin-path.js.map +1 -1
  257. package/dist/harnesses/impls/learner/restoration-patch.d.ts +2 -2
  258. package/dist/harnesses/impls/learner/restoration-patch.js +25 -6
  259. package/dist/harnesses/impls/learner/restoration-patch.js.map +1 -1
  260. package/dist/harnesses/impls/learner/types.d.ts +11 -0
  261. package/dist/harnesses/impls/stub.d.ts +58 -0
  262. package/dist/harnesses/impls/stub.js +89 -0
  263. package/dist/harnesses/impls/stub.js.map +1 -0
  264. package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.d.ts +69 -50
  265. package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js +199 -94
  266. package/dist/harnesses/impls/swe-rebench-v2-evaluator/eval-runner.js.map +1 -1
  267. package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.d.ts +12 -1
  268. package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js +121 -7
  269. package/dist/harnesses/impls/swe-rebench-v2-evaluator/harness.js.map +1 -1
  270. package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.d.ts +88 -4
  271. package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js +143 -22
  272. package/dist/harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js.map +1 -1
  273. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.d.ts +6 -0
  274. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js +1 -1
  275. package/dist/harnesses/impls/swe-rebench-v2-evaluator/index.js.map +1 -1
  276. package/dist/harnesses/readiness-registry.d.ts +7 -0
  277. package/dist/harnesses/readiness-registry.js +18 -1
  278. package/dist/harnesses/readiness-registry.js.map +1 -1
  279. package/dist/learner/revert-decision.d.ts +59 -0
  280. package/dist/learner/revert-decision.js +53 -0
  281. package/dist/learner/revert-decision.js.map +1 -0
  282. package/dist/learner/revert-stats.d.ts +24 -0
  283. package/dist/learner/revert-stats.js +44 -0
  284. package/dist/learner/revert-stats.js.map +1 -0
  285. package/dist/main.js +470 -142
  286. package/dist/main.js.map +1 -1
  287. package/dist/mcp/get-codedigest-reward.d.ts +13 -0
  288. package/dist/mcp/get-codedigest-reward.js +23 -0
  289. package/dist/mcp/get-codedigest-reward.js.map +1 -0
  290. package/dist/mcp/server.js +23 -0
  291. package/dist/mcp/server.js.map +1 -1
  292. package/dist/observability/emit-event.d.ts +3 -2
  293. package/dist/observability/emit-event.js +22 -1
  294. package/dist/observability/emit-event.js.map +1 -1
  295. package/dist/operator-errors.d.ts +7 -0
  296. package/dist/operator-errors.js +13 -1
  297. package/dist/operator-errors.js.map +1 -1
  298. package/dist/plugins/learner/.claude-plugin/plugin.json +9 -0
  299. package/dist/plugins/learner/.codex-plugin/plugin.json +39 -0
  300. package/dist/plugins/learner/AGENTS.md +40 -0
  301. package/dist/plugins/learner/CLAUDE.md +33 -0
  302. package/dist/plugins/learner/README.md +59 -0
  303. package/dist/plugins/learner/hooks/hooks.json +16 -0
  304. package/dist/plugins/learner/hooks/session-start +38 -0
  305. package/dist/plugins/learner/skills/learn/SKILL.md +412 -0
  306. package/dist/plugins/learner/skills/learn/analyst-prompt.md +68 -0
  307. package/dist/plugins/learner/skills/learn/consolidator-prompt.md +111 -0
  308. package/dist/plugins/learner/skills/learn/explorer-prompt.md +53 -0
  309. package/dist/plugins/learner/skills/learn/planner-prompt.md +87 -0
  310. package/dist/plugins/learner/skills/learn/promoter-prompt.md +184 -0
  311. package/dist/plugins/learner/skills/learn/step-worker-prompt.md +47 -0
  312. package/dist/plugins/learner/skills/learn/strategist-prompt.md +85 -0
  313. package/dist/preflight/pidfile-liveness.d.ts +44 -0
  314. package/dist/preflight/pidfile-liveness.js +103 -0
  315. package/dist/preflight/pidfile-liveness.js.map +1 -0
  316. package/dist/preflight/rpc-network.d.ts +40 -0
  317. package/dist/preflight/rpc-network.js +67 -1
  318. package/dist/preflight/rpc-network.js.map +1 -1
  319. package/dist/restart-daemon.d.ts +90 -0
  320. package/dist/restart-daemon.js +95 -0
  321. package/dist/restart-daemon.js.map +1 -0
  322. package/dist/rpc/transport.d.ts +109 -0
  323. package/dist/rpc/transport.js +220 -0
  324. package/dist/rpc/transport.js.map +1 -0
  325. package/dist/scripts/donation-consumption-acceptance.js +7 -28
  326. package/dist/scripts/donation-consumption-acceptance.js.map +1 -1
  327. package/dist/scripts/swe-rebench-v2-pytest-missing.json +16 -0
  328. package/dist/setup/halt-mode.d.ts +14 -0
  329. package/dist/setup/halt-mode.js +17 -0
  330. package/dist/setup/halt-mode.js.map +1 -0
  331. package/dist/solver-nets/prediction-operator-ux.d.ts +1 -2
  332. package/dist/solver-nets/prediction-operator-ux.js +90 -47
  333. package/dist/solver-nets/prediction-operator-ux.js.map +1 -1
  334. package/dist/solver-nets/registry.d.ts +20 -1
  335. package/dist/solver-nets/registry.js +38 -25
  336. package/dist/solver-nets/registry.js.map +1 -1
  337. package/dist/solver-types/_swe-rebench-v2-pool-cache.d.ts +58 -0
  338. package/dist/solver-types/_swe-rebench-v2-pool-cache.js +87 -0
  339. package/dist/solver-types/_swe-rebench-v2-pool-cache.js.map +1 -0
  340. package/dist/solver-types/_swe-rebench-v2-pool.d.ts +9 -2
  341. package/dist/solver-types/_swe-rebench-v2-pool.js +15 -20
  342. package/dist/solver-types/_swe-rebench-v2-pool.js.map +1 -1
  343. package/dist/solver-types/_swe-rebench-v2-state.d.ts +15 -0
  344. package/dist/solver-types/_swe-rebench-v2-state.js +19 -0
  345. package/dist/solver-types/_swe-rebench-v2-state.js.map +1 -1
  346. package/dist/solver-types/_swe-rebench-v2-substrate.d.ts +1 -0
  347. package/dist/solver-types/_swe-rebench-v2-substrate.js +10 -0
  348. package/dist/solver-types/_swe-rebench-v2-substrate.js.map +1 -1
  349. package/dist/solver-types/_swe-rebench-v2-validated-pool.d.ts +145 -2
  350. package/dist/solver-types/_swe-rebench-v2-validated-pool.js +482 -44
  351. package/dist/solver-types/_swe-rebench-v2-validated-pool.js.map +1 -1
  352. package/dist/solver-types/swe-rebench-v2-auto.d.ts +38 -14
  353. package/dist/solver-types/swe-rebench-v2-auto.js +87 -28
  354. package/dist/solver-types/swe-rebench-v2-auto.js.map +1 -1
  355. package/dist/solver-types/swe-rebench-v2.d.ts +19 -2
  356. package/dist/solver-types/swe-rebench-v2.js +351 -96
  357. package/dist/solver-types/swe-rebench-v2.js.map +1 -1
  358. package/dist/solvernets/daemon-init.d.ts +10 -2
  359. package/dist/solvernets/daemon-init.js +22 -2
  360. package/dist/solvernets/daemon-init.js.map +1 -1
  361. package/dist/solvernets/launched-record-dispatcher.d.ts +4 -0
  362. package/dist/solvernets/launched-record-dispatcher.js +41 -7
  363. package/dist/solvernets/launched-record-dispatcher.js.map +1 -1
  364. package/dist/solvernets/registry-client-erc8004.js +11 -0
  365. package/dist/solvernets/registry-client-erc8004.js.map +1 -1
  366. package/dist/solvernets/store.d.ts +7 -2
  367. package/dist/solvernets/store.js +1 -0
  368. package/dist/solvernets/store.js.map +1 -1
  369. package/dist/spend/cost-surface-status.d.ts +10 -0
  370. package/dist/spend/cost-surface-status.js +22 -0
  371. package/dist/spend/cost-surface-status.js.map +1 -0
  372. package/dist/spend/credential.d.ts +8 -0
  373. package/dist/spend/credential.js +30 -0
  374. package/dist/spend/credential.js.map +1 -0
  375. package/dist/spend/daemon-config.d.ts +13 -0
  376. package/dist/spend/daemon-config.js +24 -0
  377. package/dist/spend/daemon-config.js.map +1 -0
  378. package/dist/spend/pricing.d.ts +16 -0
  379. package/dist/spend/pricing.js +26 -0
  380. package/dist/spend/pricing.js.map +1 -0
  381. package/dist/spend/record.d.ts +13 -0
  382. package/dist/spend/record.js +30 -0
  383. package/dist/spend/record.js.map +1 -0
  384. package/dist/spend/usage.d.ts +27 -0
  385. package/dist/spend/usage.js +113 -0
  386. package/dist/spend/usage.js.map +1 -0
  387. package/dist/store/store.d.ts +61 -0
  388. package/dist/store/store.js +302 -7
  389. package/dist/store/store.js.map +1 -1
  390. package/dist/tasks/sources.d.ts +18 -1
  391. package/dist/tasks/sources.js +33 -5
  392. package/dist/tasks/sources.js.map +1 -1
  393. package/dist/trajectory/transcript-parsers/codex-session.d.ts +12 -6
  394. package/dist/trajectory/transcript-parsers/codex-session.js +114 -13
  395. package/dist/trajectory/transcript-parsers/codex-session.js.map +1 -1
  396. package/dist/trajectory/transcript-parsers/types.d.ts +8 -8
  397. package/dist/trajectory/transcript-session-dirs.d.ts +18 -0
  398. package/dist/trajectory/transcript-session-dirs.js +85 -0
  399. package/dist/trajectory/transcript-session-dirs.js.map +1 -0
  400. package/dist/trajectory/transcript-watcher.d.ts +20 -1
  401. package/dist/trajectory/transcript-watcher.js +98 -32
  402. package/dist/trajectory/transcript-watcher.js.map +1 -1
  403. package/dist/tx-retry.d.ts +166 -19
  404. package/dist/tx-retry.js +310 -32
  405. package/dist/tx-retry.js.map +1 -1
  406. package/dist/types/payloads/portfolio-v0.d.ts +3 -3
  407. package/dist/types/payloads/prediction-apy-v0.d.ts +8 -8
  408. package/dist/types/payloads/prediction-v0.d.ts +17 -17
  409. package/dist/types/task-document.d.ts +392 -0
  410. package/dist/types/task-document.js +10 -0
  411. package/dist/types/task-document.js.map +1 -1
  412. package/dist/types/task.d.ts +28 -0
  413. package/dist/util/extract-tx-hash.d.ts +14 -0
  414. package/dist/util/extract-tx-hash.js +19 -0
  415. package/dist/util/extract-tx-hash.js.map +1 -0
  416. package/dist/vendor/@jinn-network/sdk/dist/contracts.js +1 -1
  417. package/dist/vendor/@jinn-network/sdk/dist/solvernets/manifest-schema.d.ts +3 -0
  418. package/dist/vendor/@jinn-network/sdk/dist/solvernets/manifest-schema.js +1 -0
  419. package/package.json +37 -13
  420. package/plugins/learner/skills/learn/consolidator-prompt.md +18 -1
  421. package/plugins/learner/skills/learn/promoter-prompt.md +72 -1
  422. package/plugins/swe-rebench-v2-diffmin/README.md +10 -9
  423. package/plugins/swe-rebench-v2-diffmin/jinn.plugin.json +1 -1
  424. package/plugins/swe-rebench-v2-diffmin/skills/diffmin/SKILL.md +15 -10
  425. package/plugins/swe-rebench-v2-diffmin/skills/test-map/SKILL.md +10 -12
  426. package/plugins/swe-rebench-v2-runtime/.claude-plugin/plugin.json +1 -1
  427. package/plugins/swe-rebench-v2-runtime/.codex-plugin/plugin.json +3 -3
  428. package/plugins/swe-rebench-v2-runtime/README.md +6 -6
  429. package/plugins/swe-rebench-v2-runtime/jinn.plugin.json +2 -3
  430. package/plugins/swe-rebench-v2-runtime/skills/task/SKILL.md +69 -0
  431. package/dist/dashboard/assets/index-DOlzFN8a.css +0 -32
  432. package/dist/dashboard/assets/index-NkZ7CTAT.js +0 -140
  433. package/plugins/swe-rebench-v2-runtime/skills/orient/SKILL.md +0 -29
  434. package/plugins/swe-rebench-v2-runtime/skills/plan/SKILL.md +0 -53
@@ -1,27 +1,32 @@
1
1
  /**
2
2
  * SolverTypeDefinition for swe-rebench-v2.v1.
3
3
  *
4
- * Wires the pool builder, state store, and selectNextPostingCandidate
4
+ * Wires the pool builder, state store, and selectNextPostingCandidates
5
5
  * policy from the supporting modules (_swe-rebench-v2-pool, _swe-rebench-v2-state,
6
6
  * swe-rebench-v2-auto) into the SolverTypeDefinition interface consumed by
7
7
  * collectTestnetAutoTaskGenerators.
8
8
  *
9
9
  * Spec: docs/superpowers/specs/2026-05-06-agent-harness-solvernet-design.md §3.6
10
10
  */
11
+ import { stat } from 'node:fs/promises';
11
12
  import { homedir } from 'node:os';
12
13
  import { join } from 'node:path';
13
14
  import { randomUUID } from 'node:crypto';
14
15
  import { getSolverNetContract } from '../vendor/@jinn-network/sdk/dist/solvernets/index.js';
15
16
  import { SweRebenchV2TaskSchema } from '../vendor/@jinn-network/sdk/dist/solvernets/swe-rebench-v2.js';
16
17
  import { signTaskV1 } from '../tasks/signing.js';
17
- import { selectNextPostingCandidate, DEFAULT_GENERATOR_CONFIG, } from './swe-rebench-v2-auto.js';
18
+ import { uploadToIpfs } from '../adapters/mech/ipfs.js';
19
+ import { selectNextPostingCandidates, summarizePoolState, DEFAULT_GENERATOR_CONFIG, } from './swe-rebench-v2-auto.js';
18
20
  import { GeneratorStateStore } from './_swe-rebench-v2-state.js';
19
- import { ValidatedPoolStore, filterToScorablePool, EVAL_SEMANTICS_VERSION, } from './_swe-rebench-v2-validated-pool.js';
21
+ import { ValidatedPoolStore, filterToScorablePool, EVAL_SEMANTICS_VERSION, VETTED_POOL_REF_ELIGIBILITY_KEY, createVettedPoolArtifactRef, exportScorableVettedPoolArtifact, hashVettedPoolArtifact, loadVettedPoolArtifactScorableEntries, readVettedPoolArtifactPublication, writeVettedPoolArtifactPublication, } from './_swe-rebench-v2-validated-pool.js';
20
22
  import { buildHistoricalPool, fetchHfSplit, listMonthlyPartitions, } from './_swe-rebench-v2-pool.js';
23
+ import { fetchHfWithRetry } from '../harnesses/impls/swe-rebench-v2-evaluator/hf-fetcher.js';
24
+ import { PoolCacheStore, loadPoolWithCacheFallback } from './_swe-rebench-v2-pool-cache.js';
21
25
  export const HF_DATASET = 'nebius/SWE-rebench-leaderboard';
22
26
  const SOLVER_TYPE = 'swe-rebench-v2.v1';
23
27
  const CONTRACT_ID = 'swe-rebench-v2';
24
28
  const CONTRACT_VERSION = 'v1';
29
+ const DEFAULT_IPFS_REGISTRY_URL = 'https://registry.autonolas.tech';
25
30
  /** How long the pool is cached before a full refresh (24 h). */
26
31
  const POOL_REFRESH_MS = 24 * 60 * 60 * 1000;
27
32
  export function defaultStateDir() {
@@ -34,7 +39,9 @@ export function defaultStateDir() {
34
39
  */
35
40
  export async function loadSweRebenchV2Pool() {
36
41
  const splitsUrl = `https://datasets-server.huggingface.co/splits?dataset=${encodeURIComponent(HF_DATASET)}`;
37
- const response = await fetch(splitsUrl);
42
+ // Route through the shared HF retry helper so the /splits endpoint gets the
43
+ // same jittered 429-backoff treatment as /rows (issue #578).
44
+ const response = await fetchHfWithRetry(splitsUrl, {});
38
45
  if (!response.ok)
39
46
  throw new Error(`HF splits fetch failed: ${response.status}`);
40
47
  const json = (await response.json());
@@ -54,22 +61,24 @@ export function getSweRebenchV2ValidatedPoolStore(stateDir) {
54
61
  function positiveInt(value, fallback) {
55
62
  return typeof value === 'number' && Number.isInteger(value) && value > 0 ? value : fallback;
56
63
  }
57
- function nonNegativeInt(value, fallback) {
58
- return typeof value === 'number' && Number.isInteger(value) && value >= 0 ? value : fallback;
59
- }
60
64
  const DEFAULT_ADMISSION_MODE = 'required';
61
65
  function normalizeGeneratorConfig(raw) {
62
66
  const cfg = typeof raw === 'object' && raw !== null
63
67
  ? raw
64
68
  : {};
69
+ const legacyPolicy = typeof cfg['claimPolicy'] === 'object' && cfg['claimPolicy'] !== null
70
+ ? cfg['claimPolicy']
71
+ : {};
65
72
  const N_target_successes = positiveInt(cfg['N_target_successes'], DEFAULT_GENERATOR_CONFIG.N_target_successes);
66
- const N_max_postings_per_task = Math.max(N_target_successes, positiveInt(cfg['N_max_postings_per_task'], DEFAULT_GENERATOR_CONFIG.N_max_postings_per_task));
67
73
  const rawMode = cfg['admissionMode'];
68
74
  const admissionMode = rawMode === 'python-floor' ? 'python-floor' : DEFAULT_ADMISSION_MODE;
75
+ const maxClaimsPerOperator = positiveInt(cfg['maxClaimsPerOperator'] ?? legacyPolicy['maxClaimsPerOperator'], 0);
69
76
  return {
70
77
  N_target_successes,
71
- N_max_postings_per_task,
72
- cooldown_ms: nonNegativeInt(cfg['cooldown_ms'], DEFAULT_GENERATOR_CONFIG.cooldown_ms),
78
+ posting_window_ms: positiveInt(cfg['posting_window_ms'], DEFAULT_GENERATOR_CONFIG.posting_window_ms),
79
+ post_batch_size: positiveInt(cfg['post_batch_size'], DEFAULT_GENERATOR_CONFIG.post_batch_size),
80
+ ...(maxClaimsPerOperator > 0 ? { maxClaimsPerOperator } : {}),
81
+ claimLeaseTtlSeconds: positiveInt(cfg['claimLeaseTtlSeconds'] ?? legacyPolicy['claimLeaseTtlSeconds'], DEFAULT_GENERATOR_CONFIG.claimLeaseTtlSeconds),
73
82
  admissionMode,
74
83
  };
75
84
  }
@@ -119,26 +128,77 @@ function sweRebenchDefaultClaimPolicy() {
119
128
  const defaults = contract?.claimPolicyDefaults;
120
129
  return {
121
130
  mode: defaults?.mode === 'serial' ? 'exclusive' : 'parallel',
122
- maxClaims: defaults?.maxClaims ?? 50,
123
- maxClaimsPerOperator: defaults?.maxClaimsPerOperator ?? 5,
131
+ maxClaims: defaults?.maxClaims ?? DEFAULT_GENERATOR_CONFIG.N_target_successes,
132
+ maxClaimsPerOperator: defaults?.maxClaimsPerOperator ?? DEFAULT_GENERATOR_CONFIG.N_target_successes,
124
133
  claimLeaseTtlSeconds: defaults?.claimLeaseTtlSeconds ?? 60 * 60,
125
134
  };
126
135
  }
127
- function normalizeClaimPolicy(raw) {
136
+ function claimPolicyForPosting(genConfig, remainingTargetSuccesses) {
128
137
  const defaults = sweRebenchDefaultClaimPolicy();
129
- const cfg = typeof raw === 'object' && raw !== null
130
- ? raw
131
- : {};
132
- const policy = typeof cfg.claimPolicy === 'object' && cfg.claimPolicy !== null
133
- ? cfg.claimPolicy
134
- : {};
135
- const maxClaims = positiveInt(policy.maxClaims, defaults.maxClaims);
136
- const maxClaimsPerOperator = Math.min(maxClaims, positiveInt(policy.maxClaimsPerOperator, defaults.maxClaimsPerOperator));
138
+ const maxClaims = Math.max(1, remainingTargetSuccesses);
139
+ const maxClaimsPerOperator = Math.min(maxClaims, genConfig.maxClaimsPerOperator ?? maxClaims);
137
140
  return {
138
141
  ...defaults,
139
142
  maxClaims,
140
143
  maxClaimsPerOperator,
141
- claimLeaseTtlSeconds: positiveInt(policy.claimLeaseTtlSeconds, defaults.claimLeaseTtlSeconds),
144
+ claimLeaseTtlSeconds: genConfig.claimLeaseTtlSeconds,
145
+ };
146
+ }
147
+ async function resolvePublishedVettedPool(args) {
148
+ if (!args.manifestCid) {
149
+ return { scorableIds: null, artifactRef: null, mode: 'no-manifest' };
150
+ }
151
+ const existing = await readVettedPoolArtifactPublication({
152
+ stateDir: args.stateDir,
153
+ manifestCid: args.manifestCid,
154
+ evalSemanticsVersion: EVAL_SEMANTICS_VERSION,
155
+ });
156
+ let priorSize;
157
+ if (existing) {
158
+ const scorable = await args.store.getScorableEntries(EVAL_SEMANTICS_VERSION);
159
+ const validatedNewer = scorable !== null && scorable.updatedAt > existing.updatedAt;
160
+ if (!validatedNewer) {
161
+ return {
162
+ scorableIds: loadVettedPoolArtifactScorableEntries(existing.artifact).ids,
163
+ artifactRef: existing.ref,
164
+ mode: 'published',
165
+ };
166
+ }
167
+ priorSize = existing.artifact.entries.length;
168
+ }
169
+ const artifact = await exportScorableVettedPoolArtifact(args.store, EVAL_SEMANTICS_VERSION, {
170
+ generatedAt: args.nowIso,
171
+ });
172
+ if (!artifact || artifact.entries.length === 0) {
173
+ return { scorableIds: null, artifactRef: null, mode: 'no-publication' };
174
+ }
175
+ const artifactCid = await args.upload(args.ipfsRegistryUrl, artifact);
176
+ const artifactRef = createVettedPoolArtifactRef({
177
+ manifestCid: args.manifestCid,
178
+ artifactCid,
179
+ artifactHash: hashVettedPoolArtifact(artifact),
180
+ evalSemanticsVersion: EVAL_SEMANTICS_VERSION,
181
+ publishedAt: args.nowIso,
182
+ });
183
+ await writeVettedPoolArtifactPublication({
184
+ stateDir: args.stateDir,
185
+ ref: artifactRef,
186
+ artifact,
187
+ updatedAt: args.nowIso,
188
+ });
189
+ return {
190
+ scorableIds: loadVettedPoolArtifactScorableEntries(artifact).ids,
191
+ artifactRef,
192
+ mode: 'published-from-local',
193
+ ...(priorSize !== undefined
194
+ ? {
195
+ republication: {
196
+ priorSize,
197
+ currentSize: artifact.entries.length,
198
+ publishedAt: args.nowIso,
199
+ },
200
+ }
201
+ : {}),
142
202
  };
143
203
  }
144
204
  async function maybeSignTask(task, opts) {
@@ -160,7 +220,7 @@ async function maybeSignTask(task, opts) {
160
220
  window: task.window,
161
221
  spec: task.spec ?? {},
162
222
  eligibility: task.eligibility ?? {},
163
- claimPolicy: task.claimPolicy ?? normalizeClaimPolicy(undefined),
223
+ claimPolicy: task.claimPolicy ?? sweRebenchDefaultClaimPolicy(),
164
224
  creator: {
165
225
  safeAddress: opts.creator.safeAddress,
166
226
  agentEoa: opts.creator.agentEoa,
@@ -179,51 +239,132 @@ async function maybeSignTask(task, opts) {
179
239
  function makeSweRebenchV2Generator(config) {
180
240
  const stateStore = new GeneratorStateStore({ stateDir: config.stateDir });
181
241
  const validatedPoolStore = new ValidatedPoolStore({ stateDir: config.stateDir });
242
+ const poolCache = new PoolCacheStore({ stateDir: config.stateDir });
182
243
  let pool = [];
183
244
  let poolLoadedAt = 0;
245
+ let poolFromCache = false;
184
246
  let floorWarned = false;
247
+ let publicationWarned = false;
185
248
  let lastPostedLanguage;
186
249
  let lastPollAt;
187
250
  let lastPollSummary;
188
251
  let lastError;
189
252
  let totalPosted = 0;
190
253
  let lastPostedInstanceId;
254
+ let publishedPoolCache = null;
255
+ let lastValidatedPoolMtimeMs = -1;
256
+ let lastRepublication;
191
257
  async function refreshPool() {
192
- try {
193
- pool = await loadSweRebenchV2Pool();
258
+ const result = await loadPoolWithCacheFallback({
259
+ loadPool: loadSweRebenchV2Pool,
260
+ cache: poolCache,
261
+ currentPool: pool,
262
+ });
263
+ pool = result.pool;
264
+ poolFromCache = result.fromCache;
265
+ lastError = result.error;
266
+ if (!result.error) {
267
+ // Fresh HF load — hold it for the full POOL_REFRESH_MS window.
194
268
  poolLoadedAt = Date.now();
195
269
  }
196
- catch (err) {
197
- // Non-fatal: keep the existing pool if already loaded
198
- lastError = {
199
- message: err instanceof Error ? err.message : String(err),
200
- at: new Date().toISOString(),
201
- };
202
- console.warn(`[swe-rebench-v2-gen] pool refresh failed (using ${pool.length} cached tasks):`, err instanceof Error ? err.message : String(err));
270
+ if (result.fromCache) {
271
+ console.warn(`[swe-rebench-v2-gen] HF pool refresh failed; serving ${pool.length} tasks from disk cache — ` +
272
+ `generator stays live, will retry HF next poll: ${result.error?.message}`);
273
+ }
274
+ else if (result.error) {
275
+ console.warn(`[swe-rebench-v2-gen] pool refresh failed (pool size ${pool.length}): ${result.error.message}`);
203
276
  }
204
277
  }
205
278
  const tick = async () => {
206
279
  const now = Date.now();
280
+ // #802: re-read counters from disk at the start of every tick. last_task_id
281
+ // (and successful) are written by other loops (CreatorLoop.recordLastTaskId,
282
+ // delivery-watcher.recordSuccess) through separate store instances against
283
+ // the same file; without invalidating the long-lived cache here the
284
+ // generator never observes those writes and reposts every tick.
285
+ stateStore.invalidate();
207
286
  const runtimeConfig = config.getGeneratorConfig
208
287
  ? config.getGeneratorConfig()
209
288
  : config.generatorConfig;
210
289
  const genConfig = normalizeGeneratorConfig(runtimeConfig);
211
- const claimPolicy = normalizeClaimPolicy(runtimeConfig);
212
- // Refresh pool if stale or empty
213
- if (pool.length === 0 || now - poolLoadedAt > POOL_REFRESH_MS) {
290
+ // Refresh pool if stale, empty, or currently served from the disk cache
291
+ // (a cache-served pool retries HF every poll so the generator self-heals
292
+ // as soon as HF recovers #466).
293
+ if (pool.length === 0 || poolFromCache || now - poolLoadedAt > POOL_REFRESH_MS) {
214
294
  await refreshPool();
215
295
  }
216
296
  if (pool.length === 0) {
217
- lastPollSummary = { poolSize: 0, posted: 0, skipped: 0 };
297
+ lastPollSummary = {
298
+ poolSize: 0,
299
+ posted: 0,
300
+ unposted: 0,
301
+ live: 0,
302
+ repostable: 0,
303
+ saturated: 0,
304
+ };
218
305
  return null;
219
306
  }
220
307
  lastPollAt = new Date(now).toISOString();
221
- // Restrict to instances we can actually score (validated gold-patch pool).
222
- // In required mode (default): absent or stale admission data → empty pool,
223
- // emit a startup warning. In python-floor mode (local/dev opt-in): fall
224
- // back to Python-only instances when no validation data exists.
225
- // See jinn-mono-uy6v.9.
226
- const scorableIds = await validatedPoolStore.getScorableIds(EVAL_SEMANTICS_VERSION);
308
+ const validatedPoolMtimeMs = await stat(join(config.stateDir, 'validated-pool.json'))
309
+ .then((s) => s.mtimeMs)
310
+ .catch(() => -1);
311
+ if (validatedPoolMtimeMs > lastValidatedPoolMtimeMs) {
312
+ publishedPoolCache = null;
313
+ lastValidatedPoolMtimeMs = validatedPoolMtimeMs;
314
+ }
315
+ let publishedPool = publishedPoolCache;
316
+ if (!publishedPool) {
317
+ publishedPool = await resolvePublishedVettedPool({
318
+ stateDir: config.stateDir,
319
+ manifestCid: config.solverNetManifestCid,
320
+ store: validatedPoolStore,
321
+ nowIso: lastPollAt,
322
+ ipfsRegistryUrl: config.ipfsRegistryUrl ??
323
+ process.env['JINN_IPFS_REGISTRY_URL'] ??
324
+ DEFAULT_IPFS_REGISTRY_URL,
325
+ upload: uploadToIpfs,
326
+ }).catch((err) => {
327
+ const message = err instanceof Error ? err.message : String(err);
328
+ lastError = {
329
+ message: `vetted pool publication failed: ${message}`,
330
+ at: new Date().toISOString(),
331
+ };
332
+ console.warn(`[swe-rebench-v2-gen] ${lastError.message}`);
333
+ return null;
334
+ });
335
+ if (publishedPool?.artifactRef) {
336
+ publishedPoolCache = publishedPool;
337
+ if (publishedPool.republication) {
338
+ lastRepublication = publishedPool.republication;
339
+ }
340
+ }
341
+ }
342
+ if (publishedPool === null) {
343
+ lastPollSummary = {
344
+ poolSize: 0,
345
+ posted: 0,
346
+ unposted: 0,
347
+ live: 0,
348
+ repostable: 0,
349
+ saturated: 0,
350
+ };
351
+ return null;
352
+ }
353
+ if (genConfig.admissionMode === 'required' &&
354
+ publishedPool.mode === 'no-manifest' &&
355
+ !publicationWarned) {
356
+ publicationWarned = true;
357
+ console.warn(`[swe-rebench-v2-gen] no solverNetManifestCid is available, so the launcher cannot stamp a vetted pool artifact ref; admissionMode='required' is fail-closed.`);
358
+ }
359
+ // Restrict to instances in the launcher's published pool artifact. If the
360
+ // launcher has no publication yet but local scorable data exists, the
361
+ // helper above publishes it once before this filter runs. Python-floor is
362
+ // preserved only for local/dev generators.
363
+ const scorableIds = publishedPool.artifactRef
364
+ ? publishedPool.scorableIds
365
+ : genConfig.admissionMode === 'python-floor'
366
+ ? await validatedPoolStore.getScorableIds(EVAL_SEMANTICS_VERSION)
367
+ : null;
227
368
  const { pool: eligiblePool, mode: poolMode } = filterToScorablePool(pool, scorableIds, genConfig.admissionMode);
228
369
  if (poolMode === 'admission-required-no-data' && !floorWarned) {
229
370
  floorWarned = true;
@@ -237,7 +378,14 @@ function makeSweRebenchV2Generator(config) {
237
378
  console.warn(`[swe-rebench-v2-gen] admissionMode='python-floor' (local/dev): restricting to ${eligiblePool.length} Python instance(s) of ${pool.length}; run \`jinn solver-nets validate-pool swe-rebench-v2 --seed-positive\` to advance to required mode.`);
238
379
  }
239
380
  if (eligiblePool.length === 0) {
240
- lastPollSummary = { poolSize: 0, posted: 0, skipped: 0 };
381
+ lastPollSummary = {
382
+ poolSize: 0,
383
+ posted: 0,
384
+ unposted: 0,
385
+ live: 0,
386
+ repostable: 0,
387
+ saturated: 0,
388
+ };
241
389
  lastError = undefined;
242
390
  return null;
243
391
  }
@@ -246,73 +394,171 @@ function makeSweRebenchV2Generator(config) {
246
394
  for (const task of eligiblePool) {
247
395
  counters.set(task.instance_id, await stateStore.getCounters(task.instance_id));
248
396
  }
249
- const mostRecentPostedAt = Math.max(0, ...Array.from(counters.values(), (c) => c.last_posted_at));
250
- if (mostRecentPostedAt > 0 && now - mostRecentPostedAt < genConfig.cooldown_ms) {
251
- lastPollSummary = { poolSize: eligiblePool.length, posted: 0, skipped: eligiblePool.length };
252
- lastError = undefined;
253
- return null;
397
+ // Reconcile each instance's `successful` against network truth (#669):
398
+ // take max(local, network). On indexer outage the tick aborts silently
399
+ // falling through to local-only counters is exactly the bug being fixed.
400
+ // The discoveryApi/manifestCid pair is optional so test paths can skip.
401
+ if (config.discoveryApi && config.solverNetManifestCid) {
402
+ try {
403
+ const networkSuccesses = await config.discoveryApi.getInstanceSuccessCounts({
404
+ manifestCid: config.solverNetManifestCid,
405
+ });
406
+ for (const task of eligiblePool) {
407
+ const local = counters.get(task.instance_id);
408
+ if (!local)
409
+ continue;
410
+ const networkSuccess = networkSuccesses.get(task.instance_id) ?? 0;
411
+ if (networkSuccess > local.successful) {
412
+ counters.set(task.instance_id, { ...local, successful: networkSuccess });
413
+ }
414
+ }
415
+ }
416
+ catch (err) {
417
+ const message = err instanceof Error ? err.message : String(err);
418
+ lastError = {
419
+ message: `network-truth reconciliation failed: ${message}`,
420
+ at: new Date().toISOString(),
421
+ };
422
+ console.warn(`[swe-rebench-v2-gen] ${lastError.message} — skipping this tick`);
423
+ lastPollSummary = {
424
+ poolSize: eligiblePool.length,
425
+ posted: 0,
426
+ unposted: 0,
427
+ live: 0,
428
+ repostable: 0,
429
+ saturated: 0,
430
+ };
431
+ return null;
432
+ }
254
433
  }
255
- const candidate = selectNextPostingCandidate({
434
+ // Reconcile claim-budget exhaustion against network truth (#802): a posting
435
+ // is exhausted when its on-chain consumed slots reach maxClaims. Keyed by
436
+ // taskId; the classifier joins via each instance's last_task_id. On a
437
+ // genuine indexer outage (throw) the tick aborts — silently continuing with
438
+ // no claim snapshot would mask real exhaustion (exhausted postings classify
439
+ // `live`), suppress legitimate reposts, and under-serve N. A *successful*
440
+ // empty map (e.g. onchain-floor mode) is NOT an outage and is allowed
441
+ // through: it makes every posting inert (post-once), which is the safe
442
+ // degradation, not a storm.
443
+ let claimCounts;
444
+ if (config.discoveryApi && config.solverNetManifestCid) {
445
+ try {
446
+ // getInstanceClaimCounts is keyed by taskId; its values are a structural
447
+ // superset of InstanceClaimSnapshot, so the map is used directly.
448
+ claimCounts = await config.discoveryApi.getInstanceClaimCounts({
449
+ manifestCid: config.solverNetManifestCid,
450
+ });
451
+ }
452
+ catch (err) {
453
+ const message = err instanceof Error ? err.message : String(err);
454
+ lastError = {
455
+ message: `claim-budget reconciliation failed: ${message}`,
456
+ at: new Date().toISOString(),
457
+ };
458
+ console.warn(`[swe-rebench-v2-gen] ${lastError.message} — skipping this tick`);
459
+ lastPollSummary = {
460
+ poolSize: eligiblePool.length,
461
+ posted: 0,
462
+ unposted: 0,
463
+ live: 0,
464
+ repostable: 0,
465
+ saturated: 0,
466
+ };
467
+ return null;
468
+ }
469
+ }
470
+ const candidates = selectNextPostingCandidates({
256
471
  pool: eligiblePool,
257
472
  counters,
258
473
  config: genConfig,
259
474
  now,
475
+ claimCounts,
260
476
  lastPostedLanguage,
261
477
  });
262
- if (!candidate) {
263
- lastPollSummary = { poolSize: eligiblePool.length, posted: 0, skipped: eligiblePool.length };
478
+ if (candidates.length === 0) {
479
+ lastPollSummary = summarizePoolState({
480
+ pool: eligiblePool,
481
+ counters,
482
+ config: genConfig,
483
+ now,
484
+ claimCounts,
485
+ lastPostedLanguage,
486
+ });
264
487
  lastError = undefined;
265
488
  return null;
266
489
  }
267
- // Record the posting
268
- await stateStore.recordPosted(candidate.instance_id, now);
269
- lastPostedLanguage = candidate.language;
270
- totalPosted += 1;
271
- lastPostedInstanceId = candidate.instance_id;
272
- // Build the Task
273
- const deadlineUnix = Math.floor((now + 7 * 24 * 60 * 60 * 1000) / 1000); // 7-day window
274
- const roundMonth = candidate.hf_split.replace('_', '-');
275
- const windowEndTs = deadlineUnix * 1000;
276
- const spec = SweRebenchV2TaskSchema.parse({
277
- schemaVersion: 'swe-rebench-v2.v1',
278
- instance_id: candidate.instance_id,
279
- repo: candidate.repo ?? repoFromInstanceId(candidate.instance_id),
280
- base_commit: candidate.base_commit ?? '0000000000000000000000000000000000000000',
281
- language: normalizeLanguage(candidate),
282
- problem_statement: candidate.problem_statement ?? `SWE-rebench v2 instance: ${candidate.instance_id}`,
283
- interface: candidate.interface ?? '',
284
- hf_dataset: candidate.hf_dataset,
285
- hf_split: candidate.hf_split,
286
- deadline_unix: deadlineUnix,
287
- round_month: roundMonth,
288
- });
289
- const task = {
290
- id: randomUUID(),
291
- description: `SWE-rebench v2: ${candidate.instance_id}`,
292
- solverType: SOLVER_TYPE,
293
- contractId: CONTRACT_ID,
294
- contractVersion: CONTRACT_VERSION,
295
- ...(config.solverNetManifestCid
296
- ? { solverNetManifestCid: config.solverNetManifestCid }
297
- : {}),
298
- role: 'restoration',
299
- window: {
300
- startTs: now,
301
- endTs: windowEndTs,
302
- },
303
- claimPolicy,
304
- spec,
305
- eligibility: {
490
+ const tasks = [];
491
+ for (const candidate of candidates) {
492
+ await stateStore.recordPosted(candidate.instance_id, now);
493
+ const afterRecord = await stateStore.getCounters(candidate.instance_id);
494
+ counters.set(candidate.instance_id, afterRecord);
495
+ lastPostedLanguage = candidate.language;
496
+ totalPosted += 1;
497
+ lastPostedInstanceId = candidate.instance_id;
498
+ const remainingTargetSuccesses = genConfig.N_target_successes - afterRecord.successful;
499
+ const deadlineUnix = Math.floor((now + genConfig.posting_window_ms) / 1000);
500
+ const roundMonth = candidate.hf_split.replace('_', '-');
501
+ const windowEndTs = deadlineUnix * 1000;
502
+ const spec = SweRebenchV2TaskSchema.parse({
503
+ schemaVersion: 'swe-rebench-v2.v1',
504
+ instance_id: candidate.instance_id,
505
+ repo: candidate.repo ?? repoFromInstanceId(candidate.instance_id),
506
+ base_commit: candidate.base_commit ?? '0000000000000000000000000000000000000000',
507
+ language: normalizeLanguage(candidate),
508
+ problem_statement: candidate.problem_statement ?? `SWE-rebench v2 instance: ${candidate.instance_id}`,
509
+ interface: candidate.interface ?? '',
306
510
  hf_dataset: candidate.hf_dataset,
307
511
  hf_split: candidate.hf_split,
308
- instance_id: candidate.instance_id,
309
- generatorConfig: genConfig,
310
- },
512
+ deadline_unix: deadlineUnix,
513
+ round_month: roundMonth,
514
+ });
515
+ tasks.push({
516
+ id: randomUUID(),
517
+ description: `SWE-rebench v2: ${candidate.instance_id}`,
518
+ solverType: SOLVER_TYPE,
519
+ contractId: CONTRACT_ID,
520
+ contractVersion: CONTRACT_VERSION,
521
+ ...(config.solverNetManifestCid
522
+ ? { solverNetManifestCid: config.solverNetManifestCid }
523
+ : {}),
524
+ role: 'restoration',
525
+ window: {
526
+ startTs: now,
527
+ endTs: windowEndTs,
528
+ },
529
+ claimPolicy: claimPolicyForPosting(genConfig, remainingTargetSuccesses),
530
+ spec,
531
+ eligibility: {
532
+ hf_dataset: candidate.hf_dataset,
533
+ hf_split: candidate.hf_split,
534
+ instance_id: candidate.instance_id,
535
+ posted_count_after_record: afterRecord.posted,
536
+ generatorConfig: genConfig,
537
+ ...(publishedPool.artifactRef
538
+ ? { [VETTED_POOL_REF_ELIGIBILITY_KEY]: publishedPool.artifactRef }
539
+ : {}),
540
+ },
541
+ });
542
+ }
543
+ console.log(`[swe-rebench-v2-gen] posting ${candidates.length} instance(s): ` +
544
+ candidates.map((candidate) => candidate.instance_id).join(', '));
545
+ lastPollSummary = {
546
+ ...summarizePoolState({
547
+ pool: eligiblePool,
548
+ counters,
549
+ config: genConfig,
550
+ now,
551
+ claimCounts,
552
+ lastPostedLanguage,
553
+ }),
554
+ posted: tasks.length,
311
555
  };
312
- console.log(`[swe-rebench-v2-gen] posting ${candidate.instance_id}`);
313
- lastPollSummary = { poolSize: eligiblePool.length, posted: 1, skipped: 0 };
314
556
  lastError = undefined;
315
- return maybeSignTask(task, { creator: config.creator, createdAt: now });
557
+ const signed = [];
558
+ for (const task of tasks) {
559
+ signed.push(await maybeSignTask(task, { creator: config.creator, createdAt: now }));
560
+ }
561
+ return signed.length > 0 ? signed : null;
316
562
  };
317
563
  return Object.assign(tick, {
318
564
  getState() {
@@ -325,6 +571,13 @@ function makeSweRebenchV2Generator(config) {
325
571
  totalPosted,
326
572
  lastPostedInstanceId,
327
573
  config: liveConfig,
574
+ ...(lastRepublication
575
+ ? {
576
+ poolPublicationUpdatedAt: lastRepublication.publishedAt,
577
+ poolPublicationPriorSize: lastRepublication.priorSize,
578
+ poolPublicationCurrentSize: lastRepublication.currentSize,
579
+ }
580
+ : {}),
328
581
  };
329
582
  },
330
583
  });
@@ -364,6 +617,8 @@ export function makeSweRebenchV2GeneratorForLaunchedRecord(opts) {
364
617
  stateDir,
365
618
  getGeneratorConfig: () => configRef.current,
366
619
  solverNetManifestCid: recordRef.current.manifestCid,
620
+ ipfsRegistryUrl: staticConfig.ipfsRegistryUrl,
621
+ discoveryApi: staticConfig.discoveryApi,
367
622
  creator: {
368
623
  agentEoa: staticConfig.agentEoa,
369
624
  safeAddress: staticConfig.safeAddress,