@ixo/openhands-sdk 0.3.0 → 0.4.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 (487) hide show
  1. package/dist/cjs/campaign/campaign.js +3 -2
  2. package/dist/cjs/campaign/campaign.js.map +1 -1
  3. package/dist/cjs/campaign/funding.d.ts.map +1 -1
  4. package/dist/cjs/campaign/funding.js +4 -1
  5. package/dist/cjs/campaign/funding.js.map +1 -1
  6. package/dist/cjs/campaign/pool.d.ts.map +1 -1
  7. package/dist/cjs/campaign/pool.js +4 -3
  8. package/dist/cjs/campaign/pool.js.map +1 -1
  9. package/dist/cjs/campaign/record.d.ts.map +1 -1
  10. package/dist/cjs/campaign/record.js +1 -1
  11. package/dist/cjs/campaign/record.js.map +1 -1
  12. package/dist/cjs/campaign/spots.d.ts.map +1 -1
  13. package/dist/cjs/campaign/spots.js +10 -8
  14. package/dist/cjs/campaign/spots.js.map +1 -1
  15. package/dist/cjs/campaign/treasurySends.d.ts.map +1 -1
  16. package/dist/cjs/campaign/treasurySends.js +3 -3
  17. package/dist/cjs/campaign/treasurySends.js.map +1 -1
  18. package/dist/cjs/chain/ask.d.ts +104 -14
  19. package/dist/cjs/chain/ask.d.ts.map +1 -1
  20. package/dist/cjs/chain/ask.js +151 -78
  21. package/dist/cjs/chain/ask.js.map +1 -1
  22. package/dist/cjs/chain/askImage.d.ts +19 -0
  23. package/dist/cjs/chain/askImage.d.ts.map +1 -0
  24. package/dist/cjs/chain/askImage.js +56 -0
  25. package/dist/cjs/chain/askImage.js.map +1 -0
  26. package/dist/cjs/chain/bridge.d.ts +7 -33
  27. package/dist/cjs/chain/bridge.d.ts.map +1 -1
  28. package/dist/cjs/chain/bridge.js +10 -25
  29. package/dist/cjs/chain/bridge.js.map +1 -1
  30. package/dist/cjs/chain/claimSubmit.d.ts +15 -0
  31. package/dist/cjs/chain/claimSubmit.d.ts.map +1 -0
  32. package/dist/cjs/chain/claimSubmit.js +14 -0
  33. package/dist/cjs/chain/claimSubmit.js.map +1 -0
  34. package/dist/cjs/chain/delegate.d.ts +52 -7
  35. package/dist/cjs/chain/delegate.d.ts.map +1 -1
  36. package/dist/cjs/chain/delegate.js +66 -14
  37. package/dist/cjs/chain/delegate.js.map +1 -1
  38. package/dist/cjs/chain/domainIndexer.d.ts +26 -0
  39. package/dist/cjs/chain/domainIndexer.d.ts.map +1 -0
  40. package/dist/cjs/chain/domainIndexer.js +51 -0
  41. package/dist/cjs/chain/domainIndexer.js.map +1 -0
  42. package/dist/cjs/chain/entityShape.d.ts +31 -2
  43. package/dist/cjs/chain/entityShape.d.ts.map +1 -1
  44. package/dist/cjs/chain/entityShape.js +71 -8
  45. package/dist/cjs/chain/entityShape.js.map +1 -1
  46. package/dist/cjs/chain/env.d.ts +33 -3
  47. package/dist/cjs/chain/env.d.ts.map +1 -1
  48. package/dist/cjs/chain/env.js +38 -6
  49. package/dist/cjs/chain/env.js.map +1 -1
  50. package/dist/cjs/chain/guest.d.ts +14 -0
  51. package/dist/cjs/chain/guest.d.ts.map +1 -1
  52. package/dist/cjs/chain/guest.js +9 -9
  53. package/dist/cjs/chain/guest.js.map +1 -1
  54. package/dist/cjs/chain/money.d.ts +53 -2
  55. package/dist/cjs/chain/money.d.ts.map +1 -1
  56. package/dist/cjs/chain/money.js +73 -6
  57. package/dist/cjs/chain/money.js.map +1 -1
  58. package/dist/cjs/chain/orgReviewBilling.d.ts +124 -0
  59. package/dist/cjs/chain/orgReviewBilling.d.ts.map +1 -0
  60. package/dist/cjs/chain/orgReviewBilling.js +290 -0
  61. package/dist/cjs/chain/orgReviewBilling.js.map +1 -0
  62. package/dist/cjs/chain/orgReviewBillingSign.d.ts +63 -0
  63. package/dist/cjs/chain/orgReviewBillingSign.d.ts.map +1 -0
  64. package/dist/cjs/chain/orgReviewBillingSign.js +166 -0
  65. package/dist/cjs/chain/orgReviewBillingSign.js.map +1 -0
  66. package/dist/cjs/chain/payoutSettings.d.ts +97 -0
  67. package/dist/cjs/chain/payoutSettings.d.ts.map +1 -0
  68. package/dist/cjs/chain/payoutSettings.js +123 -0
  69. package/dist/cjs/chain/payoutSettings.js.map +1 -0
  70. package/dist/cjs/chain/payoutTerms.d.ts +72 -0
  71. package/dist/cjs/chain/payoutTerms.d.ts.map +1 -0
  72. package/dist/cjs/chain/payoutTerms.js +141 -0
  73. package/dist/cjs/chain/payoutTerms.js.map +1 -0
  74. package/dist/cjs/chain/query.d.ts +14 -0
  75. package/dist/cjs/chain/query.d.ts.map +1 -1
  76. package/dist/cjs/chain/query.js +27 -0
  77. package/dist/cjs/chain/query.js.map +1 -1
  78. package/dist/cjs/chain/reviewBilling.d.ts +86 -0
  79. package/dist/cjs/chain/reviewBilling.d.ts.map +1 -0
  80. package/dist/cjs/chain/reviewBilling.js +265 -0
  81. package/dist/cjs/chain/reviewBilling.js.map +1 -0
  82. package/dist/cjs/chain/store.d.ts +7 -6
  83. package/dist/cjs/chain/store.d.ts.map +1 -1
  84. package/dist/cjs/chain/store.js +7 -6
  85. package/dist/cjs/chain/store.js.map +1 -1
  86. package/dist/cjs/chain/subscription.d.ts +0 -7
  87. package/dist/cjs/chain/subscription.d.ts.map +1 -1
  88. package/dist/cjs/chain/subscription.js +4 -47
  89. package/dist/cjs/chain/subscription.js.map +1 -1
  90. package/dist/cjs/chain/takeBack.d.ts +12 -0
  91. package/dist/cjs/chain/takeBack.d.ts.map +1 -1
  92. package/dist/cjs/chain/takeBack.js +24 -10
  93. package/dist/cjs/chain/takeBack.js.map +1 -1
  94. package/dist/cjs/chain/why.d.ts +44 -0
  95. package/dist/cjs/chain/why.d.ts.map +1 -0
  96. package/dist/cjs/chain/why.js +153 -0
  97. package/dist/cjs/chain/why.js.map +1 -0
  98. package/dist/cjs/chain/whyMint.d.ts +8 -0
  99. package/dist/cjs/chain/whyMint.d.ts.map +1 -0
  100. package/dist/cjs/chain/whyMint.js +53 -0
  101. package/dist/cjs/chain/whyMint.js.map +1 -0
  102. package/dist/cjs/chain.d.ts +8 -4
  103. package/dist/cjs/chain.d.ts.map +1 -1
  104. package/dist/cjs/chain.js +21 -9
  105. package/dist/cjs/chain.js.map +1 -1
  106. package/dist/cjs/config.d.ts +11 -5
  107. package/dist/cjs/config.d.ts.map +1 -1
  108. package/dist/cjs/config.js +2 -0
  109. package/dist/cjs/config.js.map +1 -1
  110. package/dist/cjs/data/askEntity.d.ts +40 -0
  111. package/dist/cjs/data/askEntity.d.ts.map +1 -0
  112. package/dist/cjs/data/askEntity.js +48 -0
  113. package/dist/cjs/data/askEntity.js.map +1 -0
  114. package/dist/cjs/data/askLinks.d.ts +6 -0
  115. package/dist/cjs/data/askLinks.d.ts.map +1 -0
  116. package/dist/cjs/data/askLinks.js +21 -0
  117. package/dist/cjs/data/askLinks.js.map +1 -0
  118. package/dist/cjs/data/board/assemble.d.ts.map +1 -1
  119. package/dist/cjs/data/board/assemble.js +15 -2
  120. package/dist/cjs/data/board/assemble.js.map +1 -1
  121. package/dist/cjs/data/board/facts.d.ts +11 -0
  122. package/dist/cjs/data/board/facts.d.ts.map +1 -1
  123. package/dist/cjs/data/board/facts.js +16 -0
  124. package/dist/cjs/data/board/facts.js.map +1 -1
  125. package/dist/cjs/data/board/read.d.ts.map +1 -1
  126. package/dist/cjs/data/board/read.js +2 -1
  127. package/dist/cjs/data/board/read.js.map +1 -1
  128. package/dist/cjs/data/board/types.d.ts +9 -0
  129. package/dist/cjs/data/board/types.d.ts.map +1 -1
  130. package/dist/cjs/data/board/types.js.map +1 -1
  131. package/dist/cjs/data/docs.d.ts +10 -2
  132. package/dist/cjs/data/docs.d.ts.map +1 -1
  133. package/dist/cjs/data/docs.js +43 -3
  134. package/dist/cjs/data/docs.js.map +1 -1
  135. package/dist/cjs/data/format.js +1 -1
  136. package/dist/cjs/data/format.js.map +1 -1
  137. package/dist/cjs/data/install.d.ts +43 -2
  138. package/dist/cjs/data/install.d.ts.map +1 -1
  139. package/dist/cjs/data/install.js +60 -10
  140. package/dist/cjs/data/install.js.map +1 -1
  141. package/dist/cjs/data/oracleInfo.d.ts +6 -1
  142. package/dist/cjs/data/oracleInfo.d.ts.map +1 -1
  143. package/dist/cjs/data/oracleInfo.js +22 -3
  144. package/dist/cjs/data/oracleInfo.js.map +1 -1
  145. package/dist/cjs/data/oracles.d.ts +62 -5
  146. package/dist/cjs/data/oracles.d.ts.map +1 -1
  147. package/dist/cjs/data/oracles.js +90 -11
  148. package/dist/cjs/data/oracles.js.map +1 -1
  149. package/dist/cjs/data/orgPayouts.d.ts +87 -0
  150. package/dist/cjs/data/orgPayouts.d.ts.map +1 -0
  151. package/dist/cjs/data/orgPayouts.js +183 -0
  152. package/dist/cjs/data/orgPayouts.js.map +1 -0
  153. package/dist/cjs/data/plans.d.ts +8 -0
  154. package/dist/cjs/data/plans.d.ts.map +1 -0
  155. package/dist/cjs/data/plans.js +12 -0
  156. package/dist/cjs/data/plans.js.map +1 -0
  157. package/dist/cjs/data/profiles.d.ts +20 -0
  158. package/dist/cjs/data/profiles.d.ts.map +1 -1
  159. package/dist/cjs/data/profiles.js +63 -4
  160. package/dist/cjs/data/profiles.js.map +1 -1
  161. package/dist/cjs/data/receipt.d.ts +7 -0
  162. package/dist/cjs/data/receipt.d.ts.map +1 -1
  163. package/dist/cjs/data/receipt.js +19 -4
  164. package/dist/cjs/data/receipt.js.map +1 -1
  165. package/dist/cjs/data/resources.d.ts +3 -0
  166. package/dist/cjs/data/resources.d.ts.map +1 -1
  167. package/dist/cjs/data/resources.js +4 -1
  168. package/dist/cjs/data/resources.js.map +1 -1
  169. package/dist/cjs/data/threads.d.ts +14 -0
  170. package/dist/cjs/data/threads.d.ts.map +1 -1
  171. package/dist/cjs/data/threads.js +32 -20
  172. package/dist/cjs/data/threads.js.map +1 -1
  173. package/dist/cjs/data/trace.d.ts +8 -0
  174. package/dist/cjs/data/trace.d.ts.map +1 -1
  175. package/dist/cjs/data/trace.js +1 -1
  176. package/dist/cjs/data/trace.js.map +1 -1
  177. package/dist/cjs/data/traceWords.d.ts +4 -1
  178. package/dist/cjs/data/traceWords.d.ts.map +1 -1
  179. package/dist/cjs/data/traceWords.js +8 -2
  180. package/dist/cjs/data/traceWords.js.map +1 -1
  181. package/dist/cjs/data/why.d.ts +38 -0
  182. package/dist/cjs/data/why.d.ts.map +1 -0
  183. package/dist/cjs/data/why.js +86 -0
  184. package/dist/cjs/data/why.js.map +1 -0
  185. package/dist/cjs/data/whyReceipt.d.ts +33 -0
  186. package/dist/cjs/data/whyReceipt.d.ts.map +1 -0
  187. package/dist/cjs/data/whyReceipt.js +291 -0
  188. package/dist/cjs/data/whyReceipt.js.map +1 -0
  189. package/dist/cjs/geo/exifcarry.d.ts +9 -0
  190. package/dist/cjs/geo/exifcarry.d.ts.map +1 -1
  191. package/dist/cjs/geo/exifcarry.js +35 -0
  192. package/dist/cjs/geo/exifcarry.js.map +1 -1
  193. package/dist/cjs/geo/geohash.d.ts +11 -0
  194. package/dist/cjs/geo/geohash.d.ts.map +1 -1
  195. package/dist/cjs/geo/geohash.js +53 -3
  196. package/dist/cjs/geo/geohash.js.map +1 -1
  197. package/dist/cjs/geo/provenance.d.ts +41 -0
  198. package/dist/cjs/geo/provenance.d.ts.map +1 -0
  199. package/dist/cjs/geo/provenance.js +134 -0
  200. package/dist/cjs/geo/provenance.js.map +1 -0
  201. package/dist/cjs/rubric/bridge.d.ts +98 -2
  202. package/dist/cjs/rubric/bridge.d.ts.map +1 -1
  203. package/dist/cjs/rubric/bridge.js +132 -15
  204. package/dist/cjs/rubric/bridge.js.map +1 -1
  205. package/dist/cjs/rubric/card.d.ts +28 -14
  206. package/dist/cjs/rubric/card.d.ts.map +1 -1
  207. package/dist/cjs/rubric/card.js +28 -7
  208. package/dist/cjs/rubric/card.js.map +1 -1
  209. package/dist/cjs/rubric/claimForm.d.ts +116 -0
  210. package/dist/cjs/rubric/claimForm.d.ts.map +1 -1
  211. package/dist/cjs/rubric/claimForm.js +12 -1
  212. package/dist/cjs/rubric/claimForm.js.map +1 -1
  213. package/dist/cjs/rubric/compose.d.ts +5 -0
  214. package/dist/cjs/rubric/compose.d.ts.map +1 -1
  215. package/dist/cjs/rubric/compose.js +9 -3
  216. package/dist/cjs/rubric/compose.js.map +1 -1
  217. package/dist/cjs/rubric/gateMet.d.ts.map +1 -1
  218. package/dist/cjs/rubric/gateMet.js +4 -2
  219. package/dist/cjs/rubric/gateMet.js.map +1 -1
  220. package/dist/cjs/rubric/leg.d.ts +2 -2
  221. package/dist/cjs/rubric/leg.d.ts.map +1 -1
  222. package/dist/cjs/rubric/leg.js +7 -5
  223. package/dist/cjs/rubric/leg.js.map +1 -1
  224. package/dist/cjs/rubric/marketPlan.d.ts +41 -3
  225. package/dist/cjs/rubric/marketPlan.d.ts.map +1 -1
  226. package/dist/cjs/rubric/marketPlan.js +110 -10
  227. package/dist/cjs/rubric/marketPlan.js.map +1 -1
  228. package/dist/cjs/rubric/observation.d.ts +56 -14
  229. package/dist/cjs/rubric/observation.d.ts.map +1 -1
  230. package/dist/cjs/rubric/observation.js +61 -11
  231. package/dist/cjs/rubric/observation.js.map +1 -1
  232. package/dist/cjs/rubric/survey.d.ts +65 -0
  233. package/dist/cjs/rubric/survey.d.ts.map +1 -0
  234. package/dist/cjs/rubric/survey.js +101 -0
  235. package/dist/cjs/rubric/survey.js.map +1 -0
  236. package/dist/cjs/rubric/terms.d.ts +7 -0
  237. package/dist/cjs/rubric/terms.d.ts.map +1 -1
  238. package/dist/cjs/rubric/terms.js +12 -1
  239. package/dist/cjs/rubric/terms.js.map +1 -1
  240. package/dist/cjs/rubric.d.ts +1 -1
  241. package/dist/cjs/rubric.d.ts.map +1 -1
  242. package/dist/cjs/rubric.js +4 -2
  243. package/dist/cjs/rubric.js.map +1 -1
  244. package/dist/esm/campaign/campaign.js +4 -3
  245. package/dist/esm/campaign/campaign.js.map +1 -1
  246. package/dist/esm/campaign/funding.d.ts.map +1 -1
  247. package/dist/esm/campaign/funding.js +5 -2
  248. package/dist/esm/campaign/funding.js.map +1 -1
  249. package/dist/esm/campaign/pool.d.ts.map +1 -1
  250. package/dist/esm/campaign/pool.js +4 -3
  251. package/dist/esm/campaign/pool.js.map +1 -1
  252. package/dist/esm/campaign/record.d.ts.map +1 -1
  253. package/dist/esm/campaign/record.js +2 -2
  254. package/dist/esm/campaign/record.js.map +1 -1
  255. package/dist/esm/campaign/spots.d.ts.map +1 -1
  256. package/dist/esm/campaign/spots.js +10 -8
  257. package/dist/esm/campaign/spots.js.map +1 -1
  258. package/dist/esm/campaign/treasurySends.d.ts.map +1 -1
  259. package/dist/esm/campaign/treasurySends.js +4 -4
  260. package/dist/esm/campaign/treasurySends.js.map +1 -1
  261. package/dist/esm/chain/ask.d.ts +104 -14
  262. package/dist/esm/chain/ask.d.ts.map +1 -1
  263. package/dist/esm/chain/ask.js +152 -80
  264. package/dist/esm/chain/ask.js.map +1 -1
  265. package/dist/esm/chain/askImage.d.ts +19 -0
  266. package/dist/esm/chain/askImage.d.ts.map +1 -0
  267. package/dist/esm/chain/askImage.js +50 -0
  268. package/dist/esm/chain/askImage.js.map +1 -0
  269. package/dist/esm/chain/bridge.d.ts +7 -33
  270. package/dist/esm/chain/bridge.d.ts.map +1 -1
  271. package/dist/esm/chain/bridge.js +10 -24
  272. package/dist/esm/chain/bridge.js.map +1 -1
  273. package/dist/esm/chain/claimSubmit.d.ts +15 -0
  274. package/dist/esm/chain/claimSubmit.d.ts.map +1 -0
  275. package/dist/esm/chain/claimSubmit.js +10 -0
  276. package/dist/esm/chain/claimSubmit.js.map +1 -0
  277. package/dist/esm/chain/delegate.d.ts +52 -7
  278. package/dist/esm/chain/delegate.d.ts.map +1 -1
  279. package/dist/esm/chain/delegate.js +64 -13
  280. package/dist/esm/chain/delegate.js.map +1 -1
  281. package/dist/esm/chain/domainIndexer.d.ts +26 -0
  282. package/dist/esm/chain/domainIndexer.d.ts.map +1 -0
  283. package/dist/esm/chain/domainIndexer.js +48 -0
  284. package/dist/esm/chain/domainIndexer.js.map +1 -0
  285. package/dist/esm/chain/entityShape.d.ts +31 -2
  286. package/dist/esm/chain/entityShape.d.ts.map +1 -1
  287. package/dist/esm/chain/entityShape.js +65 -7
  288. package/dist/esm/chain/entityShape.js.map +1 -1
  289. package/dist/esm/chain/env.d.ts +33 -3
  290. package/dist/esm/chain/env.d.ts.map +1 -1
  291. package/dist/esm/chain/env.js +33 -5
  292. package/dist/esm/chain/env.js.map +1 -1
  293. package/dist/esm/chain/guest.d.ts +14 -0
  294. package/dist/esm/chain/guest.d.ts.map +1 -1
  295. package/dist/esm/chain/guest.js +7 -8
  296. package/dist/esm/chain/guest.js.map +1 -1
  297. package/dist/esm/chain/money.d.ts +53 -2
  298. package/dist/esm/chain/money.d.ts.map +1 -1
  299. package/dist/esm/chain/money.js +63 -4
  300. package/dist/esm/chain/money.js.map +1 -1
  301. package/dist/esm/chain/orgReviewBilling.d.ts +124 -0
  302. package/dist/esm/chain/orgReviewBilling.d.ts.map +1 -0
  303. package/dist/esm/chain/orgReviewBilling.js +241 -0
  304. package/dist/esm/chain/orgReviewBilling.js.map +1 -0
  305. package/dist/esm/chain/orgReviewBillingSign.d.ts +63 -0
  306. package/dist/esm/chain/orgReviewBillingSign.d.ts.map +1 -0
  307. package/dist/esm/chain/orgReviewBillingSign.js +124 -0
  308. package/dist/esm/chain/orgReviewBillingSign.js.map +1 -0
  309. package/dist/esm/chain/payoutSettings.d.ts +97 -0
  310. package/dist/esm/chain/payoutSettings.d.ts.map +1 -0
  311. package/dist/esm/chain/payoutSettings.js +111 -0
  312. package/dist/esm/chain/payoutSettings.js.map +1 -0
  313. package/dist/esm/chain/payoutTerms.d.ts +72 -0
  314. package/dist/esm/chain/payoutTerms.d.ts.map +1 -0
  315. package/dist/esm/chain/payoutTerms.js +127 -0
  316. package/dist/esm/chain/payoutTerms.js.map +1 -0
  317. package/dist/esm/chain/query.d.ts +14 -0
  318. package/dist/esm/chain/query.d.ts.map +1 -1
  319. package/dist/esm/chain/query.js +25 -0
  320. package/dist/esm/chain/query.js.map +1 -1
  321. package/dist/esm/chain/reviewBilling.d.ts +86 -0
  322. package/dist/esm/chain/reviewBilling.d.ts.map +1 -0
  323. package/dist/esm/chain/reviewBilling.js +215 -0
  324. package/dist/esm/chain/reviewBilling.js.map +1 -0
  325. package/dist/esm/chain/store.d.ts +7 -6
  326. package/dist/esm/chain/store.d.ts.map +1 -1
  327. package/dist/esm/chain/store.js +7 -6
  328. package/dist/esm/chain/store.js.map +1 -1
  329. package/dist/esm/chain/subscription.d.ts +0 -7
  330. package/dist/esm/chain/subscription.d.ts.map +1 -1
  331. package/dist/esm/chain/subscription.js +4 -13
  332. package/dist/esm/chain/subscription.js.map +1 -1
  333. package/dist/esm/chain/takeBack.d.ts +12 -0
  334. package/dist/esm/chain/takeBack.d.ts.map +1 -1
  335. package/dist/esm/chain/takeBack.js +22 -9
  336. package/dist/esm/chain/takeBack.js.map +1 -1
  337. package/dist/esm/chain/why.d.ts +44 -0
  338. package/dist/esm/chain/why.d.ts.map +1 -0
  339. package/dist/esm/chain/why.js +111 -0
  340. package/dist/esm/chain/why.js.map +1 -0
  341. package/dist/esm/chain/whyMint.d.ts +8 -0
  342. package/dist/esm/chain/whyMint.d.ts.map +1 -0
  343. package/dist/esm/chain/whyMint.js +17 -0
  344. package/dist/esm/chain/whyMint.js.map +1 -0
  345. package/dist/esm/chain.d.ts +8 -4
  346. package/dist/esm/chain.d.ts.map +1 -1
  347. package/dist/esm/chain.js +9 -4
  348. package/dist/esm/chain.js.map +1 -1
  349. package/dist/esm/config.d.ts +11 -5
  350. package/dist/esm/config.d.ts.map +1 -1
  351. package/dist/esm/config.js +3 -1
  352. package/dist/esm/config.js.map +1 -1
  353. package/dist/esm/data/askEntity.d.ts +40 -0
  354. package/dist/esm/data/askEntity.d.ts.map +1 -0
  355. package/dist/esm/data/askEntity.js +41 -0
  356. package/dist/esm/data/askEntity.js.map +1 -0
  357. package/dist/esm/data/askLinks.d.ts +6 -0
  358. package/dist/esm/data/askLinks.d.ts.map +1 -0
  359. package/dist/esm/data/askLinks.js +16 -0
  360. package/dist/esm/data/askLinks.js.map +1 -0
  361. package/dist/esm/data/board/assemble.d.ts.map +1 -1
  362. package/dist/esm/data/board/assemble.js +15 -2
  363. package/dist/esm/data/board/assemble.js.map +1 -1
  364. package/dist/esm/data/board/facts.d.ts +11 -0
  365. package/dist/esm/data/board/facts.d.ts.map +1 -1
  366. package/dist/esm/data/board/facts.js +15 -0
  367. package/dist/esm/data/board/facts.js.map +1 -1
  368. package/dist/esm/data/board/read.d.ts.map +1 -1
  369. package/dist/esm/data/board/read.js +2 -1
  370. package/dist/esm/data/board/read.js.map +1 -1
  371. package/dist/esm/data/board/types.d.ts +9 -0
  372. package/dist/esm/data/board/types.d.ts.map +1 -1
  373. package/dist/esm/data/board/types.js.map +1 -1
  374. package/dist/esm/data/docs.d.ts +10 -2
  375. package/dist/esm/data/docs.d.ts.map +1 -1
  376. package/dist/esm/data/docs.js +43 -4
  377. package/dist/esm/data/docs.js.map +1 -1
  378. package/dist/esm/data/format.js +1 -1
  379. package/dist/esm/data/format.js.map +1 -1
  380. package/dist/esm/data/install.d.ts +43 -2
  381. package/dist/esm/data/install.d.ts.map +1 -1
  382. package/dist/esm/data/install.js +56 -9
  383. package/dist/esm/data/install.js.map +1 -1
  384. package/dist/esm/data/oracleInfo.d.ts +6 -1
  385. package/dist/esm/data/oracleInfo.d.ts.map +1 -1
  386. package/dist/esm/data/oracleInfo.js +22 -3
  387. package/dist/esm/data/oracleInfo.js.map +1 -1
  388. package/dist/esm/data/oracles.d.ts +62 -5
  389. package/dist/esm/data/oracles.d.ts.map +1 -1
  390. package/dist/esm/data/oracles.js +87 -12
  391. package/dist/esm/data/oracles.js.map +1 -1
  392. package/dist/esm/data/orgPayouts.d.ts +87 -0
  393. package/dist/esm/data/orgPayouts.d.ts.map +1 -0
  394. package/dist/esm/data/orgPayouts.js +170 -0
  395. package/dist/esm/data/orgPayouts.js.map +1 -0
  396. package/dist/esm/data/plans.d.ts +8 -0
  397. package/dist/esm/data/plans.d.ts.map +1 -0
  398. package/dist/esm/data/plans.js +8 -0
  399. package/dist/esm/data/plans.js.map +1 -0
  400. package/dist/esm/data/profiles.d.ts +20 -0
  401. package/dist/esm/data/profiles.d.ts.map +1 -1
  402. package/dist/esm/data/profiles.js +60 -4
  403. package/dist/esm/data/profiles.js.map +1 -1
  404. package/dist/esm/data/receipt.d.ts +7 -0
  405. package/dist/esm/data/receipt.d.ts.map +1 -1
  406. package/dist/esm/data/receipt.js +20 -5
  407. package/dist/esm/data/receipt.js.map +1 -1
  408. package/dist/esm/data/resources.d.ts +3 -0
  409. package/dist/esm/data/resources.d.ts.map +1 -1
  410. package/dist/esm/data/resources.js +2 -0
  411. package/dist/esm/data/resources.js.map +1 -1
  412. package/dist/esm/data/threads.d.ts +14 -0
  413. package/dist/esm/data/threads.d.ts.map +1 -1
  414. package/dist/esm/data/threads.js +32 -21
  415. package/dist/esm/data/threads.js.map +1 -1
  416. package/dist/esm/data/trace.d.ts +8 -0
  417. package/dist/esm/data/trace.d.ts.map +1 -1
  418. package/dist/esm/data/trace.js +1 -1
  419. package/dist/esm/data/trace.js.map +1 -1
  420. package/dist/esm/data/traceWords.d.ts +4 -1
  421. package/dist/esm/data/traceWords.d.ts.map +1 -1
  422. package/dist/esm/data/traceWords.js +8 -2
  423. package/dist/esm/data/traceWords.js.map +1 -1
  424. package/dist/esm/data/why.d.ts +38 -0
  425. package/dist/esm/data/why.d.ts.map +1 -0
  426. package/dist/esm/data/why.js +78 -0
  427. package/dist/esm/data/why.js.map +1 -0
  428. package/dist/esm/data/whyReceipt.d.ts +33 -0
  429. package/dist/esm/data/whyReceipt.d.ts.map +1 -0
  430. package/dist/esm/data/whyReceipt.js +284 -0
  431. package/dist/esm/data/whyReceipt.js.map +1 -0
  432. package/dist/esm/geo/exifcarry.d.ts +9 -0
  433. package/dist/esm/geo/exifcarry.d.ts.map +1 -1
  434. package/dist/esm/geo/exifcarry.js +34 -0
  435. package/dist/esm/geo/exifcarry.js.map +1 -1
  436. package/dist/esm/geo/geohash.d.ts +11 -0
  437. package/dist/esm/geo/geohash.d.ts.map +1 -1
  438. package/dist/esm/geo/geohash.js +52 -3
  439. package/dist/esm/geo/geohash.js.map +1 -1
  440. package/dist/esm/geo/provenance.d.ts +41 -0
  441. package/dist/esm/geo/provenance.d.ts.map +1 -0
  442. package/dist/esm/geo/provenance.js +129 -0
  443. package/dist/esm/geo/provenance.js.map +1 -0
  444. package/dist/esm/rubric/bridge.d.ts +98 -2
  445. package/dist/esm/rubric/bridge.d.ts.map +1 -1
  446. package/dist/esm/rubric/bridge.js +130 -14
  447. package/dist/esm/rubric/bridge.js.map +1 -1
  448. package/dist/esm/rubric/card.d.ts +28 -14
  449. package/dist/esm/rubric/card.d.ts.map +1 -1
  450. package/dist/esm/rubric/card.js +24 -5
  451. package/dist/esm/rubric/card.js.map +1 -1
  452. package/dist/esm/rubric/claimForm.d.ts +116 -0
  453. package/dist/esm/rubric/claimForm.d.ts.map +1 -1
  454. package/dist/esm/rubric/claimForm.js +11 -0
  455. package/dist/esm/rubric/claimForm.js.map +1 -1
  456. package/dist/esm/rubric/compose.d.ts +5 -0
  457. package/dist/esm/rubric/compose.d.ts.map +1 -1
  458. package/dist/esm/rubric/compose.js +7 -2
  459. package/dist/esm/rubric/compose.js.map +1 -1
  460. package/dist/esm/rubric/gateMet.d.ts.map +1 -1
  461. package/dist/esm/rubric/gateMet.js +4 -2
  462. package/dist/esm/rubric/gateMet.js.map +1 -1
  463. package/dist/esm/rubric/leg.d.ts +2 -2
  464. package/dist/esm/rubric/leg.d.ts.map +1 -1
  465. package/dist/esm/rubric/leg.js +7 -5
  466. package/dist/esm/rubric/leg.js.map +1 -1
  467. package/dist/esm/rubric/marketPlan.d.ts +41 -3
  468. package/dist/esm/rubric/marketPlan.d.ts.map +1 -1
  469. package/dist/esm/rubric/marketPlan.js +107 -9
  470. package/dist/esm/rubric/marketPlan.js.map +1 -1
  471. package/dist/esm/rubric/observation.d.ts +56 -14
  472. package/dist/esm/rubric/observation.d.ts.map +1 -1
  473. package/dist/esm/rubric/observation.js +61 -12
  474. package/dist/esm/rubric/observation.js.map +1 -1
  475. package/dist/esm/rubric/survey.d.ts +65 -0
  476. package/dist/esm/rubric/survey.d.ts.map +1 -0
  477. package/dist/esm/rubric/survey.js +94 -0
  478. package/dist/esm/rubric/survey.js.map +1 -0
  479. package/dist/esm/rubric/terms.d.ts +7 -0
  480. package/dist/esm/rubric/terms.d.ts.map +1 -1
  481. package/dist/esm/rubric/terms.js +12 -2
  482. package/dist/esm/rubric/terms.js.map +1 -1
  483. package/dist/esm/rubric.d.ts +1 -1
  484. package/dist/esm/rubric.d.ts.map +1 -1
  485. package/dist/esm/rubric.js +1 -1
  486. package/dist/esm/rubric.js.map +1 -1
  487. package/package.json +8 -2
@@ -0,0 +1,129 @@
1
+ /**
2
+ * What a picture says about where it came from (an AI label: IPTC DigitalSourceType in its XMP; C2PA content
3
+ * credentials), and whether it is a photo the reviewer can read at all (JPEG or PNG, within its pixel cap).
4
+ *
5
+ * The answer page used to shrink a photograph by redrawing it on a canvas, and a generator's PNG, labelled
6
+ * `trainedAlgorithmicMedia` in its XMP and signed in a C2PA manifest, lost both: the reviewer's not-generated
7
+ * screen then passed it (Red Harbor demo, 2026-10-16). Evidence photos are now sent as they are (camera.ts). This
8
+ * reads what the original declares, for the page's early warning on a photo marked AI-generated (`markedAi`) and
9
+ * the provenance the evidence records. The oracle still decides.
10
+ *
11
+ * Pure byte reading, no decoder. PNG (iTXt XMP, caBX), JPEG (APP1 XMP, APP11 JUMBF) and WebP (`XMP `, `C2PA`).
12
+ * shortcut: a compressed PNG iTXt XMP is not inflated (generators write it plain); upgrade with DecompressionStream if one turns up.
13
+ */
14
+ /** The IPTC digital source types that say a model made or composited the picture. */
15
+ const AI_SOURCE = /\b(trainedAlgorithmicMedia|compositeWithTrainedAlgorithmicMedia|compositeSynthetic|algorithmicMedia)\b/;
16
+ /** The ones the answer page refuses on sight (owner, 2026-10-16). */
17
+ const MARKED_AI = /\b(trainedAlgorithmicMedia|compositeSynthetic|algorithmicMedia)\b/;
18
+ const XMP_JPEG_HEADER = "http://ns.adobe.com/xap/1.0/\0";
19
+ const XMP_PNG_KEYWORD = "XML:com.adobe.xmp";
20
+ const latin1 = (bytes) => {
21
+ let out = "";
22
+ for (let at = 0; at < bytes.length; at += 8192)
23
+ out += String.fromCharCode(...bytes.subarray(at, at + 8192));
24
+ return out;
25
+ };
26
+ const startsWith = (bytes, at, text) => {
27
+ if (at + text.length > bytes.length)
28
+ return false;
29
+ for (let index = 0; index < text.length; index += 1)
30
+ if (bytes[at + index] !== text.charCodeAt(index))
31
+ return false;
32
+ return true;
33
+ };
34
+ const u32 = (bytes, at) => ((bytes[at] << 24) >>> 0) + (bytes[at + 1] << 16) + (bytes[at + 2] << 8) + bytes[at + 3];
35
+ const u32le = (bytes, at) => (bytes[at] | (bytes[at + 1] << 8) | (bytes[at + 2] << 16)) + bytes[at + 3] * 0x1000000;
36
+ const isPng = (bytes) => bytes.length > 8 && bytes[0] === 0x89 && startsWith(bytes, 1, "PNG");
37
+ const isJpeg = (bytes) => bytes.length > 4 && bytes[0] === 0xff && bytes[1] === 0xd8;
38
+ /** The oracle's limits on an evidence photo (S3, 2026-10-16): its AI judge skips anything over 10 MB, and it reads at most 40 MP of a PNG. */
39
+ export const EVIDENCE_MAX_BYTES = 10_000_000;
40
+ export const PNG_MAX_PIXELS = 40_000_000;
41
+ /**
42
+ * Why the reviewer could not read this photo, in plain words, or null. By its bytes, never its name: JPEG or PNG
43
+ * only, at most `maxBytes` (never above EVIDENCE_MAX_BYTES), and a PNG at most 40 MP (read from its IHDR).
44
+ */
45
+ export function photoRefusal(bytes, maxBytes = EVIDENCE_MAX_BYTES) {
46
+ if (!isJpeg(bytes) && !isPng(bytes))
47
+ return "Please send a JPEG or PNG photo.";
48
+ const limit = Math.min(maxBytes, EVIDENCE_MAX_BYTES);
49
+ const mb = (count) => (count / 1_000_000).toFixed(1).replace(/\.0$/, "");
50
+ if (bytes.length > limit)
51
+ return `This photo is too big to send (${mb(bytes.length)} MB; the limit is ${mb(limit)} MB). Take it again at a lower resolution, or pick a smaller photo.`;
52
+ if (isPng(bytes) && startsWith(bytes, 12, "IHDR")) {
53
+ const pixels = u32(bytes, 16) * u32(bytes, 20);
54
+ if (pixels > PNG_MAX_PIXELS)
55
+ return `This photo has too many pixels to send (${Math.round(pixels / 1_000_000)} megapixels; the limit is 40). Take it again at a lower resolution, or pick a smaller photo.`;
56
+ }
57
+ return null;
58
+ }
59
+ /** What a picture's own bytes say about its source. Never throws: a file it cannot read says nothing. */
60
+ export function scanProvenance(bytes) {
61
+ let xmp = null;
62
+ const c2pa = [];
63
+ try {
64
+ if (isPng(bytes)) {
65
+ for (let at = 8; at + 12 <= bytes.length;) {
66
+ const length = u32(bytes, at);
67
+ const data = bytes.subarray(at + 8, at + 8 + length);
68
+ if (startsWith(bytes, at + 4, "iTXt") && startsWith(data, 0, `${XMP_PNG_KEYWORD}\0`)) {
69
+ let cursor = XMP_PNG_KEYWORD.length + 1;
70
+ const compressed = data[cursor] === 1;
71
+ cursor += 2;
72
+ /* The language tag, then the translated keyword: both NUL-terminated. */
73
+ for (let nul = 0; nul < 2; nul += 1)
74
+ cursor = data.indexOf(0, cursor) + 1;
75
+ if (!compressed && cursor > 0)
76
+ xmp = data.subarray(cursor);
77
+ }
78
+ else if (startsWith(bytes, at + 4, "caBX"))
79
+ c2pa.push(data);
80
+ else if (startsWith(bytes, at + 4, "IEND"))
81
+ break;
82
+ at += 12 + length;
83
+ }
84
+ }
85
+ else if (isJpeg(bytes)) {
86
+ for (let at = 2; at + 4 <= bytes.length && bytes[at] === 0xff;) {
87
+ const marker = bytes[at + 1];
88
+ /* Start of scan: the pixels begin and the metadata is behind us. */
89
+ if (marker === 0xda)
90
+ break;
91
+ const length = (bytes[at + 2] << 8) | bytes[at + 3];
92
+ if (length < 2)
93
+ break;
94
+ if (marker === 0xe1 && startsWith(bytes, at + 4, XMP_JPEG_HEADER))
95
+ xmp = bytes.subarray(at + 4 + XMP_JPEG_HEADER.length, at + 2 + length);
96
+ /* APP11, JPEG XT "JP": a JUMBF box, which C2PA uses. */
97
+ if (marker === 0xeb && startsWith(bytes, at + 4, "JP"))
98
+ c2pa.push(bytes.subarray(at, at + 2 + length));
99
+ at += 2 + length;
100
+ }
101
+ }
102
+ else if (startsWith(bytes, 0, "RIFF") && startsWith(bytes, 8, "WEBP")) {
103
+ for (let at = 12; at + 8 <= bytes.length;) {
104
+ const size = u32le(bytes, at + 4);
105
+ const data = bytes.subarray(at + 8, at + 8 + size);
106
+ if (startsWith(bytes, at, "XMP "))
107
+ xmp = data;
108
+ if (startsWith(bytes, at, "C2PA"))
109
+ c2pa.push(data);
110
+ at += 8 + size + (size % 2);
111
+ }
112
+ }
113
+ }
114
+ catch {
115
+ /* A truncated or odd file: whatever was read so far stands. */
116
+ }
117
+ const xmpText = xmp ? latin1(xmp) : "";
118
+ const labelledXmp = /DigitalSourceType/.test(xmpText);
119
+ const credentials = c2pa.map(latin1).filter((text) => text.includes("c2pa"));
120
+ const labelled = labelledXmp ? AI_SOURCE.exec(xmpText) : null;
121
+ const signed = credentials.map((text) => AI_SOURCE.exec(text)).find(Boolean) ?? null;
122
+ const sources = [...(labelledXmp ? ["xmp"] : []), ...(credentials.length ? ["c2pa"] : [])];
123
+ const type = (labelled ?? signed)?.[1];
124
+ return {
125
+ provenance: sources.length ? { aiLabel: Boolean(labelled || signed), sources, ...(type ? { digitalSourceType: type } : {}) } : null,
126
+ markedAi: (labelledXmp && MARKED_AI.test(xmpText)) || credentials.some((text) => MARKED_AI.test(text))
127
+ };
128
+ }
129
+ //# sourceMappingURL=provenance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provenance.js","sourceRoot":"","sources":["../../../src/geo/provenance.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAqBH,qFAAqF;AACrF,MAAM,SAAS,GAAG,wGAAwG,CAAC;AAC3H,qEAAqE;AACrE,MAAM,SAAS,GAAG,mEAAmE,CAAC;AACtF,MAAM,eAAe,GAAG,gCAAgC,CAAC;AACzD,MAAM,eAAe,GAAG,mBAAmB,CAAC;AAE5C,MAAM,MAAM,GAAG,CAAC,KAAiB,EAAU,EAAE;IAC3C,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,EAAE,IAAI,IAAI;QAAE,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;IAC7G,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AACF,MAAM,UAAU,GAAG,CAAC,KAAiB,EAAE,EAAU,EAAE,IAAY,EAAW,EAAE;IAC1E,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAClD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC;QAAE,IAAI,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;IACpH,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AACF,MAAM,GAAG,GAAG,CAAC,KAAiB,EAAE,EAAU,EAAU,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAE,IAAI,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAE,CAAC;AACpJ,MAAM,KAAK,GAAG,CAAC,KAAiB,EAAE,EAAU,EAAU,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,CAAE,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAE,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAE,IAAI,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAE,GAAG,SAAS,CAAC;AACpJ,MAAM,KAAK,GAAG,CAAC,KAAiB,EAAW,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AACnH,MAAM,MAAM,GAAG,CAAC,KAAiB,EAAW,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;AAE1G,8IAA8I;AAC9I,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC;AAC7C,MAAM,CAAC,MAAM,cAAc,GAAG,UAAU,CAAC;AAEzC;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,KAAiB,EAAE,WAAmB,kBAAkB;IACnF,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,kCAAkC,CAAC;IAC/E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;IACrD,MAAM,EAAE,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACzF,IAAI,KAAK,CAAC,MAAM,GAAG,KAAK;QAAE,OAAO,kCAAkC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,qBAAqB,EAAE,CAAC,KAAK,CAAC,qEAAqE,CAAC;IACvL,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC/C,IAAI,MAAM,GAAG,cAAc;YAAE,OAAO,2CAA2C,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,8FAA8F,CAAC;IAC9M,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yGAAyG;AACzG,MAAM,UAAU,cAAc,CAAC,KAAiB;IAC9C,IAAI,GAAG,GAAsB,IAAI,CAAC;IAClC,MAAM,IAAI,GAAiB,EAAE,CAAC;IAC9B,IAAI,CAAC;QACH,IAAI,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACjB,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,KAAK,CAAC,MAAM,GAAI,CAAC;gBAC3C,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;gBACrD,IAAI,UAAU,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,eAAe,IAAI,CAAC,EAAE,CAAC;oBACrF,IAAI,MAAM,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;oBACxC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACtC,MAAM,IAAI,CAAC,CAAC;oBACZ,yEAAyE;oBACzE,KAAK,IAAI,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC;wBAAE,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;oBAC1E,IAAI,CAAC,UAAU,IAAI,MAAM,GAAG,CAAC;wBAAE,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC7D,CAAC;qBAAM,IAAI,UAAU,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC;oBAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;qBACzD,IAAI,UAAU,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC;oBAAE,MAAM;gBAClD,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;YACpB,CAAC;QACH,CAAC;aAAM,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,IAAI,GAAI,CAAC;gBAChE,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAE,CAAC;gBAC9B,oEAAoE;gBACpE,IAAI,MAAM,KAAK,IAAI;oBAAE,MAAM;gBAC3B,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAE,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,EAAE,GAAG,CAAC,CAAE,CAAC;gBACtD,IAAI,MAAM,GAAG,CAAC;oBAAE,MAAM;gBACtB,IAAI,MAAM,KAAK,IAAI,IAAI,UAAU,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,EAAE,eAAe,CAAC;oBAAE,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,GAAG,eAAe,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;gBAC1I,wDAAwD;gBACxD,IAAI,MAAM,KAAK,IAAI,IAAI,UAAU,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC;oBAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;gBACvG,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC;YACnB,CAAC;QACH,CAAC;aAAM,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC;YACxE,KAAK,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAI,CAAC;gBAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;gBAClC,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;gBACnD,IAAI,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC;oBAAE,GAAG,GAAG,IAAI,CAAC;gBAC9C,IAAI,UAAU,CAAC,KAAK,EAAE,EAAE,EAAE,MAAM,CAAC;oBAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACnD,EAAE,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,+DAA+D;IACjE,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9D,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;IACrF,MAAM,OAAO,GAA0B,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAe,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACpI,MAAM,IAAI,GAAG,CAAC,QAAQ,IAAI,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;QACnI,QAAQ,EAAE,CAAC,WAAW,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KACvG,CAAC;AACJ,CAAC"}
@@ -53,6 +53,23 @@ export interface BridgeOptions {
53
53
  meters: number;
54
54
  days: number;
55
55
  } | null;
56
+ /**
57
+ * W7a: a CAMPAIGN rubric — one document for every ask in a campaign, so it
58
+ * carries no per-ask literal. The `within-radius` gate is emitted as the
59
+ * `withinAskRadius` source with only the claim's fields; the oracle resolves
60
+ * the pin itself from the claim's collection → its deed → `#done`. The judge
61
+ * is shown `task` below (the campaign's wording) instead of the ask's.
62
+ */
63
+ pinFromAsk?: boolean;
64
+ /** The task the judges are shown, in place of the ask's own; the campaign's wording under `pinFromAsk`. */
65
+ task?: string;
66
+ /**
67
+ * A person stands behind the ask's reviews (an organisation's ask, its reviewers in the Console): then a photo
68
+ * with no camera data and no live capture is held for that person (the `cameraPhoto`/`liveCapture` gate) rather
69
+ * than ruled on by the screens alone. Never on a campaign rubric or an ask from a key with nobody behind it: a
70
+ * `review` there is held for ever (`ON_ERROR`).
71
+ */
72
+ personReviews?: boolean;
56
73
  }
57
74
  /**
58
75
  * What every source and AI check says when it could not answer at all.
@@ -177,8 +194,31 @@ export interface EngineRubric {
177
194
  aiChecks?: EngineAiCheck[];
178
195
  unique?: EngineUnique;
179
196
  gates: EngineGate[];
197
+ review?: EngineReview;
180
198
  };
181
199
  }
200
+ /** A person's look, for a gate that fails to `review`: without a claim-level task the engine turns review into reject (S3). */
201
+ export interface EngineReview {
202
+ "@type": "HumanReview";
203
+ assignTo: {
204
+ role: "reviewer";
205
+ };
206
+ slaHours: number;
207
+ onTimeout: "reject";
208
+ tasks: {
209
+ "@type": "ReviewTask";
210
+ id: string;
211
+ prompt: string;
212
+ show: string[];
213
+ answer: {
214
+ type: "boolean";
215
+ };
216
+ map: {
217
+ true: "approve";
218
+ false: "reject";
219
+ };
220
+ }[];
221
+ }
182
222
  /**
183
223
  * The names the oracle answers to, per gate. Exact: the oracle registers a
184
224
  * handler per name (and per suffix, 2..5, for a rule that repeats within one
@@ -198,6 +238,8 @@ export declare const SOURCE_NAMES: {
198
238
  };
199
239
  /** The cool-off source, emitted from the options rather than from a gate. */
200
240
  export declare const COOLDOWN_SOURCE = "cooldown";
241
+ /** The pin-free radius source of a campaign rubric (W7a): the oracle reads the ask's point and radius from its deed's `#done`. */
242
+ export declare const WITHIN_ASK_RADIUS_SOURCE = "withinAskRadius";
201
243
  /** The marker source on a site ask, so the claim's `kind` is frozen on the receipt for the oracle's act policy. */
202
244
  export declare const SITE_SOURCE = "openhandsSite";
203
245
  /** The AI check, per judge criterion: `judge`, then `judge2..`. */
@@ -251,6 +293,13 @@ export declare const PHOTO_CHECKS: {
251
293
  readonly notMarkedGenerated: "notMarkedGenerated";
252
294
  readonly notElsewhere: "notElsewhere";
253
295
  };
296
+ /** The two facts of the camera-or-live gate, asked only where a person reviews (`personReviews`). */
297
+ export declare const PERSON_CHECKS: {
298
+ /** True when the file has EXIF Make/Model or a trusted C2PA camera capture (S3). */
299
+ readonly cameraPhoto: "cameraPhoto";
300
+ /** True when the evidence carries a valid live-capture stamp for the photo (app/lib/stamp.ts, S3). */
301
+ readonly liveCapture: "liveCapture";
302
+ };
254
303
  /**
255
304
  * How far a photograph's own GPS may sit from the point the claim reported.
256
305
  *
@@ -379,8 +428,45 @@ export declare const SITE_KIND_PREAMBLE = "A claim of kind \"patch\" carries a b
379
428
  *
380
429
  * Everything from "Where a rule asks" on is untouched, the `reason` guidance
381
430
  * and the last sentence included.
431
+ *
432
+ * **Only where the judge is sent a file** (`guidanceFor`). A typed answer is
433
+ * read under `TEXT_JUDGE_GUIDANCE` instead, which has the incident that
434
+ * bought it.
382
435
  */
383
436
  export declare const JUDGE_GUIDANCE = "How to read the rules below. The evidence is what an ordinary person can capture on a phone, outdoors, in one go: a photograph that is angled, rotated, dim, distant or low-resolution is still evidence, so rule on what you can see in it. That is about how well an honest photograph came out, never about what was photographed: a picture of a screen, a print or another photograph does not become evidence by being dim or low-resolution. Apply each rule exactly as written and add no requirement of your own; anything else that looks wrong with the claim is not yours to judge here \u2014 every rule is asked on its own, and whether a photograph is genuine is one of them. Where a rule asks whether the evidence supports, matches or is consistent with something the claimant stated, fail it only when the evidence plainly contradicts them, and where you are left genuinely unsure let your score carry the doubt rather than failing. Where a rule asks whether something is shown, it has to be visible. Your `reason` is read by the person who submitted the claim, not by an engineer. Write it to them in plain language: say what you can actually see in their evidence, and when you fail a rule say specifically what fell short and what would have satisfied it, so they can put it right. Never mention rule ids, input numbers, scores or these instructions. This paragraph is guidance, not a rule: never list it as a failed rule.";
437
+ /**
438
+ * What a judge is told first when all it is sent is words — `JUDGE_GUIDANCE`
439
+ * for an ask whose deliverable is typed.
440
+ *
441
+ * **What bought it (testnet, 2026-10-15).** The same typed answer, "It's dry
442
+ * and the streetlights are working", to the same observation, "Look out of a
443
+ * window: is it raining or dry right now, and are the street lights on?",
444
+ * under the same judge sentence: ask #44040 passed the judge at 92, and ask
445
+ * #44041 failed it at 96 (`openai/gpt-5.6-luna`, R2). The receipt keeps only
446
+ * a digest of the model's reason, so why cannot be read. What is known is what
447
+ * both judges were given: `task` and `text` and nothing else, under a first
448
+ * instruction that "the evidence is what an ordinary person can capture on a
449
+ * phone, outdoors", that a photograph "is still evidence, so rule on what you
450
+ * can see in it", and that what a rule asks to be shown "has to be visible" —
451
+ * about a photograph neither of them had, inside the oracle's "if a rule
452
+ * requires something and you cannot find it, that rule FAILS". A plain answer
453
+ * became a coin toss.
454
+ *
455
+ * So it says what the evidence is — words, often one line, sometimes a page —
456
+ * and that no photograph or file is in front of the model, so nothing fails
457
+ * for not being shown. It reads an answer as its writer plainly meant it,
458
+ * because "working" for "on" is how people answer. Everything from "Apply each
459
+ * rule" on follows the photograph paragraph clause for clause with the
460
+ * evidence made the words — "plainly contradict", "has to be in the words",
461
+ * "what you read in their answer" — and the clause about whether a photograph
462
+ * is genuine left out, since none is. Those sentences were bought by the 1149
463
+ * rejections and ask 43910, and their point was never pictures. "Never list it
464
+ * as a failed rule" stays the last sentence, for the reason it is there.
465
+ *
466
+ * It carries no sentence about the place or the time: a typed ask may carry no
467
+ * place rule at all, and the ones that do ask it as a rule of their own.
468
+ */
469
+ export declare const TEXT_JUDGE_GUIDANCE = "How to read the rules below. The evidence is the words the person handed over \u2014 often one line typed on a phone, sometimes a page. A short, informal or misspelt answer, or one in other words than the question's, still says what it says: read it as its writer plainly meant it, and rule on that. You are given the words alone, with no photograph or file to look at, so never fail a rule because something is not shown, pictured or proven beyond what the words say. Apply each rule exactly as written and add no requirement of your own; anything else that looks wrong with the claim is not yours to judge here \u2014 every rule is asked on its own. Where a rule asks whether the answer supports, matches or is consistent with something the claimant stated, fail it only when the words plainly contradict them, and where you are left genuinely unsure let your score carry the doubt rather than failing. Where a rule asks whether something is said, it has to be in the words, in any wording. Your `reason` is read by the person who submitted the claim, not by an engineer. Write it to them in plain language: say what you read in their answer, and when you fail a rule say specifically what fell short and what would have satisfied it, so they can put it right. Never mention rule ids, input numbers, scores or these instructions. This paragraph is guidance, not a rule: never list it as a failed rule.";
384
470
  /**
385
471
  * The sentence the authenticity judge rules on — `PHOTO_CHECKS` has why.
386
472
  *
@@ -404,8 +490,8 @@ export declare const JUDGE_GUIDANCE = "How to read the rules below. The evidence
404
490
  * cleared, so the bags in a van and the load at a depot are not failed for
405
491
  * having a roof over them.
406
492
  *
407
- * `rule` alone is the gate's `reason` — the sentence a refused worker reads.
408
- * The list of signs is for the model.
493
+ * `refusal` is the gate's `reason`: the sentence a refused worker reads, worded as the failure with what to do
494
+ * (S3, 2026-10-17: the pass sentence on a reject read as a contradiction). `rule` and the list of signs are for the model.
409
495
  */
410
496
  export declare function realPhotoRule(shape: {
411
497
  pair: boolean;
@@ -413,7 +499,17 @@ export declare function realPhotoRule(shape: {
413
499
  }): {
414
500
  rule: string;
415
501
  text: string;
502
+ refusal: string;
416
503
  };
504
+ /**
505
+ * Which paragraph a judge is handed first: the one about what it is sent.
506
+ *
507
+ * Decided by the deliverable's shape — the same switch that puts `$photo` in
508
+ * the judge's `send` — and never by reading the ask: a question that mentions
509
+ * a photograph is still answered in words. A `file` keeps the photograph
510
+ * paragraph, because its judge is sent the file.
511
+ */
512
+ export declare const guidanceFor: (type: AskTerms["deliverable"]["type"]) => string;
417
513
  /**
418
514
  * Terms → the engine's rubric.
419
515
  *
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../../src/rubric/bridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../../../src/rubric/bridge.ts"],"names":[],"mappings":"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"}
@@ -63,6 +63,8 @@ export const SOURCE_NAMES = {
63
63
  };
64
64
  /** The cool-off source, emitted from the options rather than from a gate. */
65
65
  export const COOLDOWN_SOURCE = "cooldown";
66
+ /** The pin-free radius source of a campaign rubric (W7a): the oracle reads the ask's point and radius from its deed's `#done`. */
67
+ export const WITHIN_ASK_RADIUS_SOURCE = "withinAskRadius";
66
68
  /** The marker source on a site ask, so the claim's `kind` is frozen on the receipt for the oracle's act policy. */
67
69
  export const SITE_SOURCE = "openhandsSite";
68
70
  /** The AI check, per judge criterion: `judge`, then `judge2..`. */
@@ -116,6 +118,13 @@ export const PHOTO_CHECKS = {
116
118
  notMarkedGenerated: "notMarkedGenerated",
117
119
  notElsewhere: "notElsewhere"
118
120
  };
121
+ /** The two facts of the camera-or-live gate, asked only where a person reviews (`personReviews`). */
122
+ export const PERSON_CHECKS = {
123
+ /** True when the file has EXIF Make/Model or a trusted C2PA camera capture (S3). */
124
+ cameraPhoto: "cameraPhoto",
125
+ /** True when the evidence carries a valid live-capture stamp for the photo (app/lib/stamp.ts, S3). */
126
+ liveCapture: "liveCapture"
127
+ };
119
128
  /**
120
129
  * How far a photograph's own GPS may sit from the point the claim reported.
121
130
  *
@@ -156,6 +165,7 @@ export const UNIQUE_RULE_ID = "OH-DUP-1";
156
165
  */
157
166
  export const SEND_KEYS = {
158
167
  withinRadius: ["lat", "lon", "photo", "centerLat", "centerLon", "meters"],
168
+ withinAskRadius: ["lat", "lon", "photo"],
159
169
  located: ["lat", "lon", "photo"],
160
170
  beforeAfter: ["before", "after", "meters"],
161
171
  daylight: ["text", "at", "fallbackAt", "lat", "lon"],
@@ -168,6 +178,8 @@ export const SEND_KEYS = {
168
178
  openhandsSite: ["kind", "lat", "lon"],
169
179
  notElsewhere: ["lat", "lon", "photo", "meters"],
170
180
  notMarkedGenerated: ["photo"],
181
+ cameraPhoto: ["photo"],
182
+ liveCapture: ["photo"],
171
183
  judge: ["task", "text", "photo"]
172
184
  };
173
185
  /**
@@ -265,8 +277,45 @@ export const SITE_KIND_PREAMBLE = 'A claim of kind "patch" carries a before phot
265
277
  *
266
278
  * Everything from "Where a rule asks" on is untouched, the `reason` guidance
267
279
  * and the last sentence included.
280
+ *
281
+ * **Only where the judge is sent a file** (`guidanceFor`). A typed answer is
282
+ * read under `TEXT_JUDGE_GUIDANCE` instead, which has the incident that
283
+ * bought it.
268
284
  */
269
285
  export const JUDGE_GUIDANCE = "How to read the rules below. The evidence is what an ordinary person can capture on a phone, outdoors, in one go: a photograph that is angled, rotated, dim, distant or low-resolution is still evidence, so rule on what you can see in it. That is about how well an honest photograph came out, never about what was photographed: a picture of a screen, a print or another photograph does not become evidence by being dim or low-resolution. Apply each rule exactly as written and add no requirement of your own; anything else that looks wrong with the claim is not yours to judge here — every rule is asked on its own, and whether a photograph is genuine is one of them. Where a rule asks whether the evidence supports, matches or is consistent with something the claimant stated, fail it only when the evidence plainly contradicts them, and where you are left genuinely unsure let your score carry the doubt rather than failing. Where a rule asks whether something is shown, it has to be visible. Your `reason` is read by the person who submitted the claim, not by an engineer. Write it to them in plain language: say what you can actually see in their evidence, and when you fail a rule say specifically what fell short and what would have satisfied it, so they can put it right. Never mention rule ids, input numbers, scores or these instructions. This paragraph is guidance, not a rule: never list it as a failed rule.";
286
+ /**
287
+ * What a judge is told first when all it is sent is words — `JUDGE_GUIDANCE`
288
+ * for an ask whose deliverable is typed.
289
+ *
290
+ * **What bought it (testnet, 2026-10-15).** The same typed answer, "It's dry
291
+ * and the streetlights are working", to the same observation, "Look out of a
292
+ * window: is it raining or dry right now, and are the street lights on?",
293
+ * under the same judge sentence: ask #44040 passed the judge at 92, and ask
294
+ * #44041 failed it at 96 (`openai/gpt-5.6-luna`, R2). The receipt keeps only
295
+ * a digest of the model's reason, so why cannot be read. What is known is what
296
+ * both judges were given: `task` and `text` and nothing else, under a first
297
+ * instruction that "the evidence is what an ordinary person can capture on a
298
+ * phone, outdoors", that a photograph "is still evidence, so rule on what you
299
+ * can see in it", and that what a rule asks to be shown "has to be visible" —
300
+ * about a photograph neither of them had, inside the oracle's "if a rule
301
+ * requires something and you cannot find it, that rule FAILS". A plain answer
302
+ * became a coin toss.
303
+ *
304
+ * So it says what the evidence is — words, often one line, sometimes a page —
305
+ * and that no photograph or file is in front of the model, so nothing fails
306
+ * for not being shown. It reads an answer as its writer plainly meant it,
307
+ * because "working" for "on" is how people answer. Everything from "Apply each
308
+ * rule" on follows the photograph paragraph clause for clause with the
309
+ * evidence made the words — "plainly contradict", "has to be in the words",
310
+ * "what you read in their answer" — and the clause about whether a photograph
311
+ * is genuine left out, since none is. Those sentences were bought by the 1149
312
+ * rejections and ask 43910, and their point was never pictures. "Never list it
313
+ * as a failed rule" stays the last sentence, for the reason it is there.
314
+ *
315
+ * It carries no sentence about the place or the time: a typed ask may carry no
316
+ * place rule at all, and the ones that do ask it as a rule of their own.
317
+ */
318
+ export const TEXT_JUDGE_GUIDANCE = "How to read the rules below. The evidence is the words the person handed over — often one line typed on a phone, sometimes a page. A short, informal or misspelt answer, or one in other words than the question's, still says what it says: read it as its writer plainly meant it, and rule on that. You are given the words alone, with no photograph or file to look at, so never fail a rule because something is not shown, pictured or proven beyond what the words say. Apply each rule exactly as written and add no requirement of your own; anything else that looks wrong with the claim is not yours to judge here — every rule is asked on its own. Where a rule asks whether the answer supports, matches or is consistent with something the claimant stated, fail it only when the words plainly contradict them, and where you are left genuinely unsure let your score carry the doubt rather than failing. Where a rule asks whether something is said, it has to be in the words, in any wording. Your `reason` is read by the person who submitted the claim, not by an engineer. Write it to them in plain language: say what you read in their answer, and when you fail a rule say specifically what fell short and what would have satisfied it, so they can put it right. Never mention rule ids, input numbers, scores or these instructions. This paragraph is guidance, not a rule: never list it as a failed rule.";
270
319
  /**
271
320
  * The sentence the authenticity judge rules on — `PHOTO_CHECKS` has why.
272
321
  *
@@ -290,8 +339,8 @@ export const JUDGE_GUIDANCE = "How to read the rules below. The evidence is what
290
339
  * cleared, so the bags in a van and the load at a depot are not failed for
291
340
  * having a roof over them.
292
341
  *
293
- * `rule` alone is the gate's `reason` — the sentence a refused worker reads.
294
- * The list of signs is for the model.
342
+ * `refusal` is the gate's `reason`: the sentence a refused worker reads, worded as the failure with what to do
343
+ * (S3, 2026-10-17: the pass sentence on a reject read as a contradiction). `rule` and the list of signs are for the model.
295
344
  */
296
345
  export function realPhotoRule(shape) {
297
346
  const one = shape.pair ? "Every photograph" : "The photograph";
@@ -306,7 +355,8 @@ export function realPhotoRule(shape) {
306
355
  const generated = `${shape.pair ? "any" : "it"} shows signs of being computer-generated (garbled or nonsensical lettering, signs, dates or timestamps; an artificial vignette or frame; impossible geometry)`;
307
356
  const indoors = `${scene} is indoors or part of somebody's home — a household floor, table, balcony or room`;
308
357
  const fails = shape.outdoors ? `Fail this if ${screen}, if ${generated}, or if ${indoors}.` : `Fail this if ${screen}, or if ${generated}.`;
309
- return { rule, text: `${rule} ${fails}` };
358
+ const refusal = `${shape.pair ? "A photo is" : "This is"} not a direct photograph of the real ${shape.outdoors ? "outdoor place" : "scene"} asked for (a screen, a print, a generated picture${shape.outdoors ? " or an indoor shot" : ""}). Take the photo yourself, there.`;
359
+ return { rule, text: `${rule} ${fails}`, refusal };
310
360
  }
311
361
  /** Per attempt. Their ceiling is 30 s; the oracle answers in-process, so this is generous. */
312
362
  const SOURCE_TIMEOUT_MS = 15_000;
@@ -344,6 +394,15 @@ const WITH_PHOTO = new Set(["photo", "photo-pair", "mess-report", "field-report"
344
394
  * photograph screens are not asked of it.
345
395
  */
346
396
  const PHOTOGRAPH = new Set(["photo", "photo-pair", "mess-report", "field-report"]);
397
+ /**
398
+ * Which paragraph a judge is handed first: the one about what it is sent.
399
+ *
400
+ * Decided by the deliverable's shape — the same switch that puts `$photo` in
401
+ * the judge's `send` — and never by reading the ask: a question that mentions
402
+ * a photograph is still answered in words. A `file` keeps the photograph
403
+ * paragraph, because its judge is sent the file.
404
+ */
405
+ export const guidanceFor = (type) => (WITH_PHOTO.has(type) ? JUDGE_GUIDANCE : TEXT_JUDGE_GUIDANCE);
347
406
  /** The rules that make a claim report where it was — what `notElsewhere` compares the photograph against. */
348
407
  const PLACE_GATES = new Set(["located", "within-radius", "not-already-mapped", "at-registered-point"]);
349
408
  /** Long enough that no honest deliverable hits it; `lengthBetween` is inclusive. */
@@ -501,6 +560,16 @@ function sourcedGate(gate, index, context) {
501
560
  const reject = (label, reason, kind = "refuted") => ({ "@type": "Gate", code: codeFor(index, label), reason, onFail: "reject", class: kind });
502
561
  switch (gate.id) {
503
562
  case "within-radius":
563
+ /* A campaign rubric sends only the claim's fields: the oracle resolves the
564
+ ask's point and radius from the deed's #done (W7a). The reason names no
565
+ place either — one document serves every ask in the campaign. */
566
+ if (context.pinFromAsk) {
567
+ return {
568
+ name: WITHIN_ASK_RADIUS_SOURCE,
569
+ send: { lat: LAT, lon: LON, photo: PHOTO },
570
+ gate: reject("within-radius", "Not within the ask's radius of its point")
571
+ };
572
+ }
504
573
  return {
505
574
  name,
506
575
  send: { lat: LAT, lon: LON, photo: PHOTO, centerLat: gate.lat, centerLon: gate.lon, meters: gate.meters },
@@ -595,7 +664,7 @@ export function toEngineRubric(terms, binding, options = {}) {
595
664
  return null;
596
665
  };
597
666
  const radius = measure("within-radius");
598
- const context = { radiusMeters: radius && radius.id === "within-radius" ? radius.meters : null };
667
+ const context = { radiusMeters: radius && radius.id === "within-radius" ? radius.meters : null, pinFromAsk: options.pinFromAsk === true };
599
668
  /*
600
669
  * What the judges are shown, decided once from the shape of the whole ask.
601
670
  *
@@ -609,14 +678,17 @@ export function toEngineRubric(terms, binding, options = {}) {
609
678
  /* A site, a second file, or a disposal photograph: the bags ride beside the pair. */
610
679
  const expectsExtra = normalized.site === true || measure("with-file") !== null || measure("at-registered-point") !== null;
611
680
  const judgeSend = {
612
- task: literal(normalized.task),
681
+ task: literal(options.task?.trim() || normalized.task),
613
682
  text: TEXT,
614
683
  ...(withPhoto ? { photo: PHOTO } : {}),
615
684
  ...(pair ? { before: BEFORE_PHOTO, after: AFTER_PHOTO } : {}),
616
685
  ...(pair && expectsExtra ? { bags: EXTRA_FILE } : {}),
617
686
  ...(normalized.site ? { kind: KIND } : {})
618
687
  };
688
+ /* Read off the same shape as the send map, so the paragraph describes what the judge is actually given. */
689
+ const guidance = guidanceFor(normalized.deliverable.type);
619
690
  const gates = [];
691
+ let review = null;
620
692
  const aiChecks = [];
621
693
  /* Sources by bare name first; the suffix is decided once the count is known. */
622
694
  const pending = [];
@@ -625,6 +697,10 @@ export function toEngineRubric(terms, binding, options = {}) {
625
697
  every other rule reads the deliverable. It is also the one rule every ask
626
698
  has. */
627
699
  gates.push(nativeGate({ id: "non-empty" }, 0));
700
+ /* On a photo ask the photo IS the hand-over, and words are optional unless a Words block asks (`wantsWords`): reading
701
+ the text there refused every photo sent without a note (testnet 44066/44068, 2026-10-17). */
702
+ if (PHOTOGRAPH.has(normalized.deliverable.type))
703
+ gates[0] = { ...gates[0], reason: "No photo was handed over", when: field(PHOTO, "present") };
628
704
  /*
629
705
  * Which kind of claim this is — asked before anything that depends on it,
630
706
  * and never itself conditional.
@@ -698,10 +774,12 @@ export function toEngineRubric(terms, binding, options = {}) {
698
774
  name,
699
775
  send: { ...judgeSend },
700
776
  /* The guidance first, always — see `JUDGE_GUIDANCE` for the six
701
- rejections that bought it. Then, on a site only, what each kind of
702
- claim carries (`SITE_KIND_PREAMBLE`). The criterion itself is last
703
- and is the only one of the three that is a rule. */
704
- instructions: normalized.site ? [JUDGE_GUIDANCE, SITE_KIND_PREAMBLE, criterion.text] : [JUDGE_GUIDANCE, criterion.text],
777
+ rejections that bought it, and `TEXT_JUDGE_GUIDANCE` for the typed
778
+ answer failed as if a photograph were missing. Then, on a site only,
779
+ what each kind of claim carries (`SITE_KIND_PREAMBLE`). The
780
+ criterion itself is last and is the only one of the three that is a
781
+ rule. */
782
+ instructions: normalized.site ? [guidance, SITE_KIND_PREAMBLE, criterion.text] : [guidance, criterion.text],
705
783
  expect: "boolean",
706
784
  onError: ON_ERROR
707
785
  });
@@ -824,11 +902,11 @@ export function toEngineRubric(terms, binding, options = {}) {
824
902
  "@type": "AiCheck",
825
903
  name,
826
904
  send: { ...judgeSend },
827
- instructions: normalized.site ? [JUDGE_GUIDANCE, SITE_KIND_PREAMBLE, sentence.text] : [JUDGE_GUIDANCE, sentence.text],
905
+ instructions: normalized.site ? [guidance, SITE_KIND_PREAMBLE, sentence.text] : [guidance, sentence.text],
828
906
  expect: "boolean",
829
907
  onError: ON_ERROR
830
908
  });
831
- screens.push({ "@type": "Gate", code: codeFor(extra, "real-photo"), reason: sentence.rule, when: field(`ai.${name}.valid`, "isTrue"), onFail: "reject", class: "invalid_evidence" });
909
+ screens.push({ "@type": "Gate", code: codeFor(extra, "real-photo"), reason: sentence.refusal, when: field(`ai.${name}.valid`, "isTrue"), onFail: "reject", class: "invalid_evidence" });
832
910
  }
833
911
  /* Only where a rule makes the claim say where it was: an ask that never
834
912
  asks has no reported point, the contract answers that with an error,
@@ -851,6 +929,43 @@ export function toEngineRubric(terms, binding, options = {}) {
851
929
  });
852
930
  }
853
931
  gates.splice(authenticityAt, 0, ...screens);
932
+ /*
933
+ * Camera data or a live capture, else a person looks (S3, 2026-10-16). Only where a person is there to look
934
+ * (`personReviews`), never on a campaign rubric. Last, so every refusal above still refuses; and `review`, never
935
+ * `reject`: no camera data and no stamp is not a fake photograph, it is one nobody can vouch for. A pair asks it
936
+ * of each photograph (`cameraPhoto2`/`liveCapture2` for the after).
937
+ */
938
+ if (options.personReviews && !options.pinFromAsk) {
939
+ const shots = pair && !normalized.site ? [BEFORE_PHOTO, AFTER_PHOTO] : [PHOTO];
940
+ review = {
941
+ "@type": "HumanReview",
942
+ assignTo: { role: "reviewer" },
943
+ slaHours: 48,
944
+ onTimeout: "reject",
945
+ tasks: [
946
+ {
947
+ "@type": "ReviewTask",
948
+ id: "OH-RT-PHOTO",
949
+ prompt: "Nothing vouches for how this photo was taken (no camera data, no live capture). Does it genuinely show the place and the thing this ask asked for? Yes to approve, no to reject.",
950
+ show: [...shots, TEXT, LAT, LON],
951
+ answer: { type: "boolean" },
952
+ map: { true: "approve", false: "reject" }
953
+ }
954
+ ]
955
+ };
956
+ for (const [index, photo] of shots.entries()) {
957
+ pending.push({ name: PERSON_CHECKS.cameraPhoto, send: { photo }, onError: "review" }, { name: PERSON_CHECKS.liveCapture, send: { photo }, onError: "review" });
958
+ extra += 1;
959
+ gates.push({
960
+ "@type": "Gate",
961
+ code: codeFor(extra, "camera-or-live"),
962
+ reason: "No camera data and no live capture: a person checks this photo",
963
+ when: { "@type": "Condition", any: [extRef(suffixed(PERSON_CHECKS.cameraPhoto, index + 1)), extRef(suffixed(PERSON_CHECKS.liveCapture, index + 1))] },
964
+ onFail: "review",
965
+ class: "insufficient_evidence"
966
+ });
967
+ }
968
+ }
854
969
  }
855
970
  /*
856
971
  * Names, finally. A vocabulary word is used bare the first time and with a
@@ -863,7 +978,7 @@ export function toEngineRubric(terms, binding, options = {}) {
863
978
  const ordinal = (seen.get(one.name) ?? 0) + 1;
864
979
  seen.set(one.name, ordinal);
865
980
  const name = suffixed(one.name, ordinal);
866
- const gate = gates.find((candidate) => candidate.code === one.gate.code);
981
+ const gate = one.gate ? gates.find((candidate) => candidate.code === one.gate.code) : undefined;
867
982
  if (gate)
868
983
  gate.when = extRef(name);
869
984
  return {
@@ -873,7 +988,7 @@ export function toEngineRubric(terms, binding, options = {}) {
873
988
  audience: `did:web:${ORACLE_HOST}`,
874
989
  send: one.send,
875
990
  expect: "boolean",
876
- onError: ON_ERROR,
991
+ onError: one.onError ?? ON_ERROR,
877
992
  timeoutMs: SOURCE_TIMEOUT_MS
878
993
  };
879
994
  });
@@ -903,7 +1018,8 @@ export function toEngineRubric(terms, binding, options = {}) {
903
1018
  ...(sources.length > 0 ? { sources } : {}),
904
1019
  ...(aiChecks.length > 0 ? { aiChecks } : {}),
905
1020
  ...(unique ? { unique } : {}),
906
- gates
1021
+ gates,
1022
+ ...(review ? { review } : {})
907
1023
  }
908
1024
  }
909
1025
  };