polyrob 1.6.0__tar.gz → 1.7.0__tar.gz

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 (2200) hide show
  1. polyrob-1.7.0/CHANGELOG.md +2094 -0
  2. polyrob-1.7.0/PKG-INFO +648 -0
  3. polyrob-1.7.0/README.md +530 -0
  4. polyrob-1.7.0/agents/task/agent/conversation.py +116 -0
  5. polyrob-1.7.0/agents/task/agent/core/construction.py +1385 -0
  6. polyrob-1.7.0/agents/task/agent/core/conversational_exit.py +123 -0
  7. polyrob-1.7.0/agents/task/agent/core/episodic_digest.py +451 -0
  8. polyrob-1.7.0/agents/task/agent/core/llm_provisioning.py +259 -0
  9. polyrob-1.7.0/agents/task/agent/core/next_action_internal.py +1616 -0
  10. polyrob-1.7.0/agents/task/agent/core/result_processing.py +584 -0
  11. polyrob-1.7.0/agents/task/agent/core/run_loop.py +844 -0
  12. polyrob-1.7.0/agents/task/agent/core/step_execution.py +469 -0
  13. polyrob-1.7.0/agents/task/agent/core/user_ingress.py +451 -0
  14. polyrob-1.7.0/agents/task/agent/messages/builders.py +349 -0
  15. polyrob-1.7.0/agents/task/agent/messages/filters.py +537 -0
  16. polyrob-1.7.0/agents/task/agent/messages/persistence.py +524 -0
  17. polyrob-1.7.0/agents/task/agent/messages/retrieval.py +670 -0
  18. polyrob-1.7.0/agents/task/agent/orchestrator.py +924 -0
  19. polyrob-1.7.0/agents/task/agent/prompts.py +1067 -0
  20. polyrob-1.7.0/agents/task/goals/board.py +1234 -0
  21. polyrob-1.7.0/agents/task/goals/board_deps.py +283 -0
  22. polyrob-1.7.0/agents/task/goals/goal_run.py +1010 -0
  23. polyrob-1.7.0/agents/task/goals/rail_answers.py +245 -0
  24. polyrob-1.7.0/agents/task/session/cleanup.py +862 -0
  25. polyrob-1.7.0/agents/task/task_agent_delivery.py +1099 -0
  26. polyrob-1.7.0/agents/task/task_agent_support.py +265 -0
  27. polyrob-1.7.0/agents/task/telemetry/service_detect.py +47 -0
  28. polyrob-1.7.0/agents/task_agent_lite.py +978 -0
  29. polyrob-1.7.0/api/a2a/agent_card.py +347 -0
  30. polyrob-1.7.0/api/admin_endpoints.py +1328 -0
  31. polyrob-1.7.0/api/auth_endpoints.py +478 -0
  32. polyrob-1.7.0/api/mcp_models.py +285 -0
  33. polyrob-1.7.0/api/openai_compat/router.py +315 -0
  34. polyrob-1.7.0/api/payment_endpoints.py +424 -0
  35. polyrob-1.7.0/api/task_http_api.py +1875 -0
  36. polyrob-1.7.0/cli/commands/chat.py +1111 -0
  37. polyrob-1.7.0/cli/commands/config.py +756 -0
  38. polyrob-1.7.0/cli/commands/doctor.py +1481 -0
  39. polyrob-1.7.0/cli/commands/identity.py +126 -0
  40. polyrob-1.7.0/cli/commands/init.py +670 -0
  41. polyrob-1.7.0/cli/commands/keys.py +220 -0
  42. polyrob-1.7.0/cli/commands/model.py +191 -0
  43. polyrob-1.7.0/cli/commands/run.py +547 -0
  44. polyrob-1.7.0/cli/commands/service.py +620 -0
  45. polyrob-1.7.0/cli/commands/wallet.py +1838 -0
  46. polyrob-1.7.0/cli/commands/wallet_lp.py +120 -0
  47. polyrob-1.7.0/cli/config_store.py +316 -0
  48. polyrob-1.7.0/cli/keys.py +103 -0
  49. polyrob-1.7.0/cli/ui/commands/h_config.py +367 -0
  50. polyrob-1.7.0/cli/ui/commands/h_inbox.py +145 -0
  51. polyrob-1.7.0/cli/ui/commands/h_mcp.py +242 -0
  52. polyrob-1.7.0/cli/ui/commands/h_money_verbs.py +164 -0
  53. polyrob-1.7.0/cli/ui/commands/handlers.py +1765 -0
  54. polyrob-1.7.0/cli/ui/model_selector.py +528 -0
  55. polyrob-1.7.0/config/.env.development.template +290 -0
  56. polyrob-1.7.0/core/CHANGELOG.md +2094 -0
  57. polyrob-1.7.0/core/cli_tool_tables.py +104 -0
  58. polyrob-1.7.0/core/config.py +736 -0
  59. polyrob-1.7.0/core/config_policy/profiles.py +191 -0
  60. polyrob-1.7.0/core/config_policy/rigs.py +166 -0
  61. polyrob-1.7.0/core/config_policy/spend_lane.py +403 -0
  62. polyrob-1.7.0/core/config_service.py +913 -0
  63. polyrob-1.7.0/core/constants.py +125 -0
  64. polyrob-1.7.0/core/copy/en.py +87 -0
  65. polyrob-1.7.0/core/cron_lanes.py +323 -0
  66. polyrob-1.7.0/core/db_manifest.py +262 -0
  67. polyrob-1.7.0/core/event_kinds.py +255 -0
  68. polyrob-1.7.0/core/event_log.py +455 -0
  69. polyrob-1.7.0/core/flags_catalog.py +1384 -0
  70. polyrob-1.7.0/core/goal_vocab.py +65 -0
  71. polyrob-1.7.0/core/lazy_closures/docs.docx.txt +187 -0
  72. polyrob-1.7.0/core/lazy_closures/docs.pdf.txt +7 -0
  73. polyrob-1.7.0/core/lazy_closures/media.gif.txt +231 -0
  74. polyrob-1.7.0/core/lazy_closures/media.qr.txt +10 -0
  75. polyrob-1.7.0/core/lazy_closures/memory.vector.txt +232 -0
  76. polyrob-1.7.0/core/lazy_closures/provider.anthropic.txt +296 -0
  77. polyrob-1.7.0/core/lazy_closures/provider.gemini.txt +594 -0
  78. polyrob-1.7.0/core/lazy_closures/server.api.txt +1720 -0
  79. polyrob-1.7.0/core/lazy_closures/surface.telegram.txt +904 -0
  80. polyrob-1.7.0/core/lazy_closures/tool.anysite.txt +340 -0
  81. polyrob-1.7.0/core/lazy_closures/voice.transcribe.txt +402 -0
  82. polyrob-1.7.0/core/lifecycle.py +785 -0
  83. polyrob-1.7.0/core/mcp_admin.py +290 -0
  84. polyrob-1.7.0/core/money/authorize.py +273 -0
  85. polyrob-1.7.0/core/money/hooks.py +194 -0
  86. polyrob-1.7.0/core/money/limits.py +183 -0
  87. polyrob-1.7.0/core/money/mandate_gate.py +290 -0
  88. polyrob-1.7.0/core/money_verbs.py +109 -0
  89. polyrob-1.7.0/core/open_positions.py +982 -0
  90. polyrob-1.7.0/core/packs/loader.py +629 -0
  91. polyrob-1.7.0/core/position_events.py +116 -0
  92. polyrob-1.7.0/core/position_plans.py +262 -0
  93. polyrob-1.7.0/core/position_retire.py +151 -0
  94. polyrob-1.7.0/core/runtime_config.py +336 -0
  95. polyrob-1.7.0/core/self_context_writer.py +672 -0
  96. polyrob-1.7.0/core/self_evolution.py +1001 -0
  97. polyrob-1.7.0/core/setting_proposals.py +307 -0
  98. polyrob-1.7.0/core/signer/protocol.py +266 -0
  99. polyrob-1.7.0/core/signer/remote.py +347 -0
  100. polyrob-1.7.0/core/signer/server.py +928 -0
  101. polyrob-1.7.0/core/signer/shadow.py +326 -0
  102. polyrob-1.7.0/core/signer/sign_ops.py +71 -0
  103. polyrob-1.7.0/core/signer/store.py +217 -0
  104. polyrob-1.7.0/core/status_money.py +548 -0
  105. polyrob-1.7.0/core/status_render.py +373 -0
  106. polyrob-1.7.0/core/status_sections.py +163 -0
  107. polyrob-1.7.0/core/status_snapshot.py +283 -0
  108. polyrob-1.7.0/core/status_types.py +175 -0
  109. polyrob-1.7.0/core/surfaces/cards.py +1365 -0
  110. polyrob-1.7.0/core/surfaces/group_admin.py +378 -0
  111. polyrob-1.7.0/core/surfaces/message_router.py +628 -0
  112. polyrob-1.7.0/core/surfaces/owner_intent.py +69 -0
  113. polyrob-1.7.0/core/surfaces/owner_thread.py +747 -0
  114. polyrob-1.7.0/core/surfaces/room_actions.py +1134 -0
  115. polyrob-1.7.0/core/surfaces/room_label.py +91 -0
  116. polyrob-1.7.0/core/surfaces/turn_reply.py +141 -0
  117. polyrob-1.7.0/core/tool_capabilities.py +547 -0
  118. polyrob-1.7.0/core/tool_catalog.py +229 -0
  119. polyrob-1.7.0/core/tool_gates.py +298 -0
  120. polyrob-1.7.0/core/trading_intake.py +276 -0
  121. polyrob-1.7.0/core/trading_mandate.py +481 -0
  122. polyrob-1.7.0/core/trading_presets.py +312 -0
  123. polyrob-1.7.0/core/trading_report.py +303 -0
  124. polyrob-1.7.0/core/verb_policy_rows.py +649 -0
  125. polyrob-1.7.0/core/verbs.py +566 -0
  126. polyrob-1.7.0/core/wallet/__init__.py +63 -0
  127. polyrob-1.7.0/core/wallet/buy_target.py +322 -0
  128. polyrob-1.7.0/core/wallet/sign_policy.py +580 -0
  129. polyrob-1.7.0/core/wallet/token_pins.py +410 -0
  130. polyrob-1.7.0/core/wallet/token_provenance.py +302 -0
  131. polyrob-1.7.0/core/wallet/token_trust.py +450 -0
  132. polyrob-1.7.0/core/wallet/tx_guard_steps/turn.py +234 -0
  133. polyrob-1.7.0/cron/digest.py +360 -0
  134. polyrob-1.7.0/cron/jobs.py +521 -0
  135. polyrob-1.7.0/cron/read_job.py +577 -0
  136. polyrob-1.7.0/cron/runner.py +873 -0
  137. polyrob-1.7.0/cron/service.py +489 -0
  138. polyrob-1.7.0/data/prompts/skills/dca/SKILL.md +87 -0
  139. polyrob-1.7.0/data/prompts/skills/defi-bridge/SKILL.md +121 -0
  140. polyrob-1.7.0/data/prompts/skills/defi-liquidity/SKILL.md +64 -0
  141. polyrob-1.7.0/data/prompts/skills/exits/SKILL.md +127 -0
  142. polyrob-1.7.0/data/prompts/skills/harness-manual/SKILL.md +29 -0
  143. polyrob-1.7.0/data/prompts/skills/memecoin-scouting/SKILL.md +245 -0
  144. polyrob-1.7.0/data/prompts/skills/polyrob-user-guide/references/configuration.md +687 -0
  145. polyrob-1.7.0/data/prompts/skills/polyrob-user-guide/references/surfaces.md +125 -0
  146. polyrob-1.7.0/data/prompts/skills/polyrob-user-guide/references/verbs.md +167 -0
  147. polyrob-1.7.0/data/prompts/skills/position-journal/SKILL.md +88 -0
  148. polyrob-1.7.0/data/prompts/skills/robinhood-chain/SKILL.md +109 -0
  149. polyrob-1.7.0/data/prompts/skills/self-deploy/SKILL.md +176 -0
  150. polyrob-1.7.0/data/prompts/skills/sizing-and-risk/SKILL.md +96 -0
  151. polyrob-1.7.0/data/prompts/skills/token-identity/SKILL.md +157 -0
  152. polyrob-1.7.0/data/prompts/skills/token-launch/SKILL.md +177 -0
  153. polyrob-1.7.0/data/prompts/skills/trade-execution/SKILL.md +114 -0
  154. polyrob-1.7.0/data/prompts/skills/trading-mandate/SKILL.md +167 -0
  155. polyrob-1.7.0/data/prompts/skills/treasury-trading/SKILL.md +317 -0
  156. polyrob-1.7.0/data/prompts/skills/treasury-trading/references/executing.md +32 -0
  157. polyrob-1.7.0/data/prompts/skills/verified-tooling/SKILL.md +62 -0
  158. polyrob-1.7.0/data/prompts/system/harness.md +3 -0
  159. polyrob-1.7.0/data/prompts/system/mcp_tools.md +52 -0
  160. polyrob-1.7.0/docs/CONFIGURATION.md +1381 -0
  161. polyrob-1.7.0/docs/guide/api.md +673 -0
  162. polyrob-1.7.0/docs/guide/architecture.md +282 -0
  163. polyrob-1.7.0/docs/guide/cli.md +1012 -0
  164. polyrob-1.7.0/docs/guide/configuration.md +859 -0
  165. polyrob-1.7.0/docs/guide/console.md +220 -0
  166. polyrob-1.7.0/docs/guide/conversation.md +69 -0
  167. polyrob-1.7.0/docs/guide/deployment-postures.md +350 -0
  168. polyrob-1.7.0/docs/guide/feishu-dingtalk.md +117 -0
  169. polyrob-1.7.0/docs/guide/getting-started.md +442 -0
  170. polyrob-1.7.0/docs/guide/groups.md +615 -0
  171. polyrob-1.7.0/docs/guide/instances.md +255 -0
  172. polyrob-1.7.0/docs/guide/migration/from-hermes.md +251 -0
  173. polyrob-1.7.0/docs/guide/migration/from-openclaw.md +247 -0
  174. polyrob-1.7.0/docs/guide/operate-the-service.md +108 -0
  175. polyrob-1.7.0/docs/guide/owner-controls.md +441 -0
  176. polyrob-1.7.0/docs/guide/packs.md +191 -0
  177. polyrob-1.7.0/docs/guide/payments.md +1754 -0
  178. polyrob-1.7.0/docs/guide/profiles.md +197 -0
  179. polyrob-1.7.0/docs/guide/security-model.md +653 -0
  180. polyrob-1.7.0/docs/guide/self-hosting.md +499 -0
  181. polyrob-1.7.0/docs/guide/skills.md +382 -0
  182. polyrob-1.7.0/docs/guide/streams.md +265 -0
  183. polyrob-1.7.0/docs/guide/upgrading.md +304 -0
  184. polyrob-1.7.0/docs/guide/x-twitter.md +204 -0
  185. polyrob-1.7.0/migrations/README.md +398 -0
  186. polyrob-1.7.0/migrations/version_manager.py +241 -0
  187. polyrob-1.7.0/migrations/versions/v1_11_0_retire_holder_tier.py +92 -0
  188. polyrob-1.7.0/modules/auth/api_key_manager.py +176 -0
  189. polyrob-1.7.0/modules/auth/identity_mapper.py +143 -0
  190. polyrob-1.7.0/modules/auth/tier_manager.py +91 -0
  191. polyrob-1.7.0/modules/cards/cards.py +396 -0
  192. polyrob-1.7.0/modules/database/user_profiles.py +492 -0
  193. polyrob-1.7.0/modules/llm/__init__.py +96 -0
  194. polyrob-1.7.0/modules/llm/adapters.py +1111 -0
  195. polyrob-1.7.0/modules/llm/available_models.py +89 -0
  196. polyrob-1.7.0/modules/llm/deepseek_client.py +147 -0
  197. polyrob-1.7.0/modules/llm/llm_client_registry.py +290 -0
  198. polyrob-1.7.0/modules/llm/llm_factory.py +287 -0
  199. polyrob-1.7.0/modules/llm/llm_manager.py +854 -0
  200. polyrob-1.7.0/modules/llm/model_catalog.py +1553 -0
  201. polyrob-1.7.0/modules/llm/model_registry.py +414 -0
  202. polyrob-1.7.0/modules/llm/openrouter_reasoning.py +114 -0
  203. polyrob-1.7.0/modules/llm/profiles.py +601 -0
  204. polyrob-1.7.0/modules/llm/provider_spec.py +1315 -0
  205. polyrob-1.7.0/modules/memory/models.py +179 -0
  206. polyrob-1.7.0/modules/memory/recall_rank.py +98 -0
  207. polyrob-1.7.0/modules/x402/invoice_jitter.py +358 -0
  208. polyrob-1.7.0/packs/x/polyrob_x/cron_delivery.py +67 -0
  209. polyrob-1.7.0/packs/x/polyrob_x/metrics.py +39 -0
  210. polyrob-1.7.0/packs/x/polyrob_x/skills/x-engagement/SKILL.md +156 -0
  211. polyrob-1.7.0/packs/x/polyrob_x/twitter_tool.py +2824 -0
  212. polyrob-1.7.0/polyrob/app/autonomy_runtime.py +1298 -0
  213. polyrob-1.7.0/polyrob/app/bootstrap.py +808 -0
  214. polyrob-1.7.0/polyrob/app/initialization.py +1000 -0
  215. polyrob-1.7.0/polyrob/app/trading_jobs.py +326 -0
  216. polyrob-1.7.0/polyrob/app/trading_lifecycle.py +514 -0
  217. polyrob-1.7.0/polyrob.egg-info/PKG-INFO +648 -0
  218. polyrob-1.7.0/polyrob.egg-info/SOURCES.txt +1908 -0
  219. polyrob-1.7.0/polyrob.egg-info/requires.txt +121 -0
  220. polyrob-1.7.0/pyproject.toml +180 -0
  221. polyrob-1.7.0/requirements.lock +5356 -0
  222. polyrob-1.7.0/surfaces/telegram/admin_verbs.py +445 -0
  223. polyrob-1.7.0/surfaces/telegram/harness.py +2912 -0
  224. polyrob-1.7.0/surfaces/telegram/identity_ops.py +177 -0
  225. polyrob-1.7.0/surfaces/telegram/lifecycle_ops.py +211 -0
  226. polyrob-1.7.0/surfaces/telegram/nft_ops.py +264 -0
  227. polyrob-1.7.0/surfaces/telegram/owner_ops.py +924 -0
  228. polyrob-1.7.0/surfaces/telegram/prefs_ops.py +257 -0
  229. polyrob-1.7.0/surfaces/telegram/token_ops.py +321 -0
  230. polyrob-1.7.0/surfaces/telegram/trade_ops.py +249 -0
  231. polyrob-1.7.0/tests/test_board_create_grant_ratchet.py +76 -0
  232. polyrob-1.7.0/tests/test_effect_classification_ratchet.py +329 -0
  233. polyrob-1.7.0/tests/test_file_size_ratchet.py +221 -0
  234. polyrob-1.7.0/tests/test_flag_count_ratchet.py +80 -0
  235. polyrob-1.7.0/tests/test_prompt_surface_golden.py +120 -0
  236. polyrob-1.7.0/tests/test_prose_required_ratchet.py +68 -0
  237. polyrob-1.7.0/tests/test_room_safety_ratchet.py +206 -0
  238. polyrob-1.7.0/tests/test_status_silence_ratchet.py +153 -0
  239. polyrob-1.7.0/tools/README.md +537 -0
  240. polyrob-1.7.0/tools/__init__.py +428 -0
  241. polyrob-1.7.0/tools/agent_nft/tool.py +433 -0
  242. polyrob-1.7.0/tools/agent_nft/view.py +345 -0
  243. polyrob-1.7.0/tools/agent_nft/withdraw.py +211 -0
  244. polyrob-1.7.0/tools/base_tool.py +525 -0
  245. polyrob-1.7.0/tools/code_exec/backend_probe.py +249 -0
  246. polyrob-1.7.0/tools/code_exec/tool.py +387 -0
  247. polyrob-1.7.0/tools/controller/action_registration.py +1832 -0
  248. polyrob-1.7.0/tools/controller/agent_status_action.py +309 -0
  249. polyrob-1.7.0/tools/controller/approval_queue.py +1442 -0
  250. polyrob-1.7.0/tools/controller/delegation.py +210 -0
  251. polyrob-1.7.0/tools/controller/execution.py +1042 -0
  252. polyrob-1.7.0/tools/controller/introspection.py +330 -0
  253. polyrob-1.7.0/tools/controller/mcp_gate.py +69 -0
  254. polyrob-1.7.0/tools/controller/mcp_registrar.py +288 -0
  255. polyrob-1.7.0/tools/controller/send_message_route.py +129 -0
  256. polyrob-1.7.0/tools/controller/service.py +409 -0
  257. polyrob-1.7.0/tools/controller/setting_actions.py +196 -0
  258. polyrob-1.7.0/tools/controller/tool_management.py +487 -0
  259. polyrob-1.7.0/tools/controller/trade_mandate_action.py +91 -0
  260. polyrob-1.7.0/tools/cronjob_tools.py +745 -0
  261. polyrob-1.7.0/tools/dapp_browser/bridge.py +800 -0
  262. polyrob-1.7.0/tools/dapp_browser/tool.py +454 -0
  263. polyrob-1.7.0/tools/defi/book.py +377 -0
  264. polyrob-1.7.0/tools/defi/buy_screen.py +104 -0
  265. polyrob-1.7.0/tools/defi/data_holdings.py +542 -0
  266. polyrob-1.7.0/tools/defi/data_params.py +187 -0
  267. polyrob-1.7.0/tools/defi/data_reconcile.py +278 -0
  268. polyrob-1.7.0/tools/defi/data_render.py +802 -0
  269. polyrob-1.7.0/tools/defi/data_retire.py +51 -0
  270. polyrob-1.7.0/tools/defi/data_tool.py +1355 -0
  271. polyrob-1.7.0/tools/defi/discovery.py +228 -0
  272. polyrob-1.7.0/tools/defi/identity_gate.py +398 -0
  273. polyrob-1.7.0/tools/defi/lp_v4.py +291 -0
  274. polyrob-1.7.0/tools/defi/marks.py +323 -0
  275. polyrob-1.7.0/tools/defi/positions_view.py +282 -0
  276. polyrob-1.7.0/tools/defi/providers/alchemy_index.py +170 -0
  277. polyrob-1.7.0/tools/defi/providers/base.py +183 -0
  278. polyrob-1.7.0/tools/defi/providers/geckoterminal.py +729 -0
  279. polyrob-1.7.0/tools/defi/providers/goplus.py +484 -0
  280. polyrob-1.7.0/tools/defi/providers/token_audits.py +279 -0
  281. polyrob-1.7.0/tools/defi/reconcile.py +390 -0
  282. polyrob-1.7.0/tools/defi/retire.py +178 -0
  283. polyrob-1.7.0/tools/defi/solana_swap_verb.py +859 -0
  284. polyrob-1.7.0/tools/defi/survivability.py +395 -0
  285. polyrob-1.7.0/tools/defi/swap_verb.py +383 -0
  286. polyrob-1.7.0/tools/defi/token_screen.py +977 -0
  287. polyrob-1.7.0/tools/defi/trade_params.py +442 -0
  288. polyrob-1.7.0/tools/defi/trade_tool.py +1396 -0
  289. polyrob-1.7.0/tools/defi/wallet_intel.py +312 -0
  290. polyrob-1.7.0/tools/descriptors.py +370 -0
  291. polyrob-1.7.0/tools/gate_effective.py +104 -0
  292. polyrob-1.7.0/tools/harness_view.py +134 -0
  293. polyrob-1.7.0/tools/http_request/__init__.py +4 -0
  294. polyrob-1.7.0/tools/http_request/tool.py +271 -0
  295. polyrob-1.7.0/tools/intel/cache.py +94 -0
  296. polyrob-1.7.0/tools/mcp/README.md +49 -0
  297. polyrob-1.7.0/tools/mcp/config.py +393 -0
  298. polyrob-1.7.0/tools/mcp/http_reply.py +136 -0
  299. polyrob-1.7.0/tools/mcp/inventory.py +79 -0
  300. polyrob-1.7.0/tools/mcp/mcp_tool.py +1442 -0
  301. polyrob-1.7.0/tools/mcp/operator_home.py +104 -0
  302. polyrob-1.7.0/tools/mcp/probe.py +128 -0
  303. polyrob-1.7.0/tools/mcp/protocol.py +1485 -0
  304. polyrob-1.7.0/tools/mcp/user_mcp_service.py +879 -0
  305. polyrob-1.7.0/tools/mcp/user_servers.py +356 -0
  306. polyrob-1.7.0/tools/shell/process_tool.py +379 -0
  307. polyrob-1.7.0/tools/shell/tool.py +472 -0
  308. polyrob-1.7.0/tools/status_harness.py +99 -0
  309. polyrob-1.7.0/tools/tool_disclosure.py +525 -0
  310. polyrob-1.7.0/tools/wallet_sign/__init__.py +38 -0
  311. polyrob-1.7.0/tools/wallet_sign/store.py +172 -0
  312. polyrob-1.7.0/tools/wallet_sign/tool.py +754 -0
  313. polyrob-1.7.0/tools/web_fetch/fetcher.py +211 -0
  314. polyrob-1.7.0/webview/contributions.py +65 -0
  315. polyrob-1.7.0/webview/copy/en.py +1452 -0
  316. polyrob-1.7.0/webview/goal_board_routes.py +369 -0
  317. polyrob-1.7.0/webview/pages_new.py +1838 -0
  318. polyrob-1.7.0/webview/static/app/app.css +637 -0
  319. polyrob-1.7.0/webview/static/app/verbs.en.json +430 -0
  320. polyrob-1.7.0/webview/static/app/work-create.js +92 -0
  321. polyrob-1.7.0/webview/static/app/work-goals.js +804 -0
  322. polyrob-1.7.0/webview/static/app/work-now.js +663 -0
  323. polyrob-1.7.0/webview/static/css/pages/admin.css +719 -0
  324. polyrob-1.7.0/webview/static/js/admin/user_detail.js +331 -0
  325. polyrob-1.7.0/webview/static/js/admin/users.js +160 -0
  326. polyrob-1.7.0/webview/templates/admin/user_detail.html +207 -0
  327. polyrob-1.7.0/webview/templates/admin/users.html +103 -0
  328. polyrob-1.7.0/webview/templates/work.html +443 -0
  329. polyrob-1.6.0/CHANGELOG.md +0 -2022
  330. polyrob-1.6.0/PKG-INFO +0 -637
  331. polyrob-1.6.0/README.md +0 -519
  332. polyrob-1.6.0/agents/task/agent/conversation.py +0 -106
  333. polyrob-1.6.0/agents/task/agent/core/construction.py +0 -1362
  334. polyrob-1.6.0/agents/task/agent/core/conversational_exit.py +0 -75
  335. polyrob-1.6.0/agents/task/agent/core/episodic_digest.py +0 -445
  336. polyrob-1.6.0/agents/task/agent/core/llm_provisioning.py +0 -261
  337. polyrob-1.6.0/agents/task/agent/core/next_action_internal.py +0 -1625
  338. polyrob-1.6.0/agents/task/agent/core/result_processing.py +0 -583
  339. polyrob-1.6.0/agents/task/agent/core/run_loop.py +0 -814
  340. polyrob-1.6.0/agents/task/agent/core/step_execution.py +0 -467
  341. polyrob-1.6.0/agents/task/agent/core/user_ingress.py +0 -436
  342. polyrob-1.6.0/agents/task/agent/messages/builders.py +0 -344
  343. polyrob-1.6.0/agents/task/agent/messages/filters.py +0 -620
  344. polyrob-1.6.0/agents/task/agent/messages/persistence.py +0 -519
  345. polyrob-1.6.0/agents/task/agent/messages/retrieval.py +0 -713
  346. polyrob-1.6.0/agents/task/agent/orchestrator.py +0 -924
  347. polyrob-1.6.0/agents/task/agent/prompts.py +0 -1062
  348. polyrob-1.6.0/agents/task/goals/board.py +0 -1213
  349. polyrob-1.6.0/agents/task/goals/board_deps.py +0 -261
  350. polyrob-1.6.0/agents/task/goals/goal_run.py +0 -1007
  351. polyrob-1.6.0/agents/task/goals/rail_answers.py +0 -245
  352. polyrob-1.6.0/agents/task/session/cleanup.py +0 -859
  353. polyrob-1.6.0/agents/task/task_agent_delivery.py +0 -1098
  354. polyrob-1.6.0/agents/task/task_agent_support.py +0 -262
  355. polyrob-1.6.0/agents/task/telemetry/service_detect.py +0 -47
  356. polyrob-1.6.0/agents/task_agent_lite.py +0 -978
  357. polyrob-1.6.0/api/a2a/agent_card.py +0 -347
  358. polyrob-1.6.0/api/admin_endpoints.py +0 -1489
  359. polyrob-1.6.0/api/auth_endpoints.py +0 -478
  360. polyrob-1.6.0/api/mcp_models.py +0 -282
  361. polyrob-1.6.0/api/openai_compat/router.py +0 -316
  362. polyrob-1.6.0/api/payment_endpoints.py +0 -430
  363. polyrob-1.6.0/api/task_http_api.py +0 -1876
  364. polyrob-1.6.0/cli/commands/chat.py +0 -1111
  365. polyrob-1.6.0/cli/commands/config.py +0 -749
  366. polyrob-1.6.0/cli/commands/doctor.py +0 -1476
  367. polyrob-1.6.0/cli/commands/identity.py +0 -126
  368. polyrob-1.6.0/cli/commands/init.py +0 -675
  369. polyrob-1.6.0/cli/commands/keys.py +0 -220
  370. polyrob-1.6.0/cli/commands/model.py +0 -193
  371. polyrob-1.6.0/cli/commands/run.py +0 -547
  372. polyrob-1.6.0/cli/commands/service.py +0 -629
  373. polyrob-1.6.0/cli/commands/wallet.py +0 -1838
  374. polyrob-1.6.0/cli/commands/wallet_lp.py +0 -120
  375. polyrob-1.6.0/cli/config_store.py +0 -321
  376. polyrob-1.6.0/cli/keys.py +0 -103
  377. polyrob-1.6.0/cli/ui/commands/h_config.py +0 -366
  378. polyrob-1.6.0/cli/ui/commands/h_inbox.py +0 -136
  379. polyrob-1.6.0/cli/ui/commands/h_mcp.py +0 -242
  380. polyrob-1.6.0/cli/ui/commands/h_money_verbs.py +0 -155
  381. polyrob-1.6.0/cli/ui/commands/handlers.py +0 -1765
  382. polyrob-1.6.0/cli/ui/model_selector.py +0 -532
  383. polyrob-1.6.0/config/.env.development.template +0 -291
  384. polyrob-1.6.0/core/CHANGELOG.md +0 -2022
  385. polyrob-1.6.0/core/cli_tool_tables.py +0 -104
  386. polyrob-1.6.0/core/config.py +0 -745
  387. polyrob-1.6.0/core/config_policy/profiles.py +0 -191
  388. polyrob-1.6.0/core/config_policy/rigs.py +0 -166
  389. polyrob-1.6.0/core/config_policy/spend_lane.py +0 -403
  390. polyrob-1.6.0/core/config_service.py +0 -867
  391. polyrob-1.6.0/core/constants.py +0 -126
  392. polyrob-1.6.0/core/copy/en.py +0 -86
  393. polyrob-1.6.0/core/cron_lanes.py +0 -304
  394. polyrob-1.6.0/core/db_manifest.py +0 -258
  395. polyrob-1.6.0/core/event_kinds.py +0 -250
  396. polyrob-1.6.0/core/event_log.py +0 -432
  397. polyrob-1.6.0/core/flags_catalog.py +0 -1396
  398. polyrob-1.6.0/core/goal_vocab.py +0 -61
  399. polyrob-1.6.0/core/lazy_closures/docs.docx.txt +0 -187
  400. polyrob-1.6.0/core/lazy_closures/docs.pdf.txt +0 -7
  401. polyrob-1.6.0/core/lazy_closures/media.gif.txt +0 -235
  402. polyrob-1.6.0/core/lazy_closures/media.qr.txt +0 -10
  403. polyrob-1.6.0/core/lazy_closures/memory.vector.txt +0 -232
  404. polyrob-1.6.0/core/lazy_closures/provider.anthropic.txt +0 -296
  405. polyrob-1.6.0/core/lazy_closures/provider.gemini.txt +0 -594
  406. polyrob-1.6.0/core/lazy_closures/server.api.txt +0 -1720
  407. polyrob-1.6.0/core/lazy_closures/surface.telegram.txt +0 -904
  408. polyrob-1.6.0/core/lazy_closures/tool.anysite.txt +0 -340
  409. polyrob-1.6.0/core/lazy_closures/voice.transcribe.txt +0 -402
  410. polyrob-1.6.0/core/lifecycle.py +0 -705
  411. polyrob-1.6.0/core/mcp_admin.py +0 -206
  412. polyrob-1.6.0/core/money/authorize.py +0 -239
  413. polyrob-1.6.0/core/money/hooks.py +0 -157
  414. polyrob-1.6.0/core/money/limits.py +0 -183
  415. polyrob-1.6.0/core/money_verbs.py +0 -108
  416. polyrob-1.6.0/core/open_positions.py +0 -837
  417. polyrob-1.6.0/core/packs/loader.py +0 -637
  418. polyrob-1.6.0/core/runtime_config.py +0 -336
  419. polyrob-1.6.0/core/self_context_writer.py +0 -672
  420. polyrob-1.6.0/core/self_evolution.py +0 -1001
  421. polyrob-1.6.0/core/signer/protocol.py +0 -265
  422. polyrob-1.6.0/core/signer/remote.py +0 -297
  423. polyrob-1.6.0/core/signer/server.py +0 -920
  424. polyrob-1.6.0/core/signer/shadow.py +0 -262
  425. polyrob-1.6.0/core/signer/store.py +0 -204
  426. polyrob-1.6.0/core/status_money.py +0 -517
  427. polyrob-1.6.0/core/status_render.py +0 -372
  428. polyrob-1.6.0/core/status_sections.py +0 -146
  429. polyrob-1.6.0/core/status_snapshot.py +0 -281
  430. polyrob-1.6.0/core/status_types.py +0 -175
  431. polyrob-1.6.0/core/surfaces/cards.py +0 -1319
  432. polyrob-1.6.0/core/surfaces/group_admin.py +0 -378
  433. polyrob-1.6.0/core/surfaces/message_router.py +0 -628
  434. polyrob-1.6.0/core/surfaces/owner_intent.py +0 -69
  435. polyrob-1.6.0/core/surfaces/owner_thread.py +0 -747
  436. polyrob-1.6.0/core/surfaces/room_actions.py +0 -1134
  437. polyrob-1.6.0/core/surfaces/room_label.py +0 -91
  438. polyrob-1.6.0/core/surfaces/turn_reply.py +0 -121
  439. polyrob-1.6.0/core/token_check_hook.py +0 -32
  440. polyrob-1.6.0/core/tool_capabilities.py +0 -538
  441. polyrob-1.6.0/core/tool_catalog.py +0 -230
  442. polyrob-1.6.0/core/tool_gates.py +0 -177
  443. polyrob-1.6.0/core/verb_policy_rows.py +0 -614
  444. polyrob-1.6.0/core/verbs.py +0 -564
  445. polyrob-1.6.0/core/wallet/__init__.py +0 -46
  446. polyrob-1.6.0/core/wallet/buy_target.py +0 -321
  447. polyrob-1.6.0/core/wallet/token_pins.py +0 -410
  448. polyrob-1.6.0/core/wallet/token_provenance.py +0 -302
  449. polyrob-1.6.0/core/wallet/token_trust.py +0 -450
  450. polyrob-1.6.0/core/wallet/tx_guard_steps/turn.py +0 -223
  451. polyrob-1.6.0/cron/digest.py +0 -341
  452. polyrob-1.6.0/cron/jobs.py +0 -521
  453. polyrob-1.6.0/cron/read_job.py +0 -490
  454. polyrob-1.6.0/cron/runner.py +0 -857
  455. polyrob-1.6.0/cron/service.py +0 -478
  456. polyrob-1.6.0/data/prompts/skills/dca/SKILL.md +0 -87
  457. polyrob-1.6.0/data/prompts/skills/defi-bridge/SKILL.md +0 -121
  458. polyrob-1.6.0/data/prompts/skills/defi-liquidity/SKILL.md +0 -64
  459. polyrob-1.6.0/data/prompts/skills/exits/SKILL.md +0 -122
  460. polyrob-1.6.0/data/prompts/skills/memecoin-scouting/SKILL.md +0 -244
  461. polyrob-1.6.0/data/prompts/skills/polyrob-user-guide/references/configuration.md +0 -693
  462. polyrob-1.6.0/data/prompts/skills/polyrob-user-guide/references/surfaces.md +0 -125
  463. polyrob-1.6.0/data/prompts/skills/polyrob-user-guide/references/verbs.md +0 -167
  464. polyrob-1.6.0/data/prompts/skills/position-journal/SKILL.md +0 -80
  465. polyrob-1.6.0/data/prompts/skills/robinhood-chain/SKILL.md +0 -109
  466. polyrob-1.6.0/data/prompts/skills/self-deploy/SKILL.md +0 -175
  467. polyrob-1.6.0/data/prompts/skills/sizing-and-risk/SKILL.md +0 -102
  468. polyrob-1.6.0/data/prompts/skills/token-identity/SKILL.md +0 -158
  469. polyrob-1.6.0/data/prompts/skills/token-launch/SKILL.md +0 -177
  470. polyrob-1.6.0/data/prompts/skills/trade-execution/SKILL.md +0 -114
  471. polyrob-1.6.0/data/prompts/skills/treasury-trading/SKILL.md +0 -351
  472. polyrob-1.6.0/data/prompts/skills/treasury-trading/references/executing.md +0 -31
  473. polyrob-1.6.0/data/prompts/skills/verified-tooling/SKILL.md +0 -62
  474. polyrob-1.6.0/data/prompts/system/mcp_tools.md +0 -50
  475. polyrob-1.6.0/docs/CONFIGURATION.md +0 -1387
  476. polyrob-1.6.0/docs/guide/api.md +0 -670
  477. polyrob-1.6.0/docs/guide/architecture.md +0 -248
  478. polyrob-1.6.0/docs/guide/cli.md +0 -911
  479. polyrob-1.6.0/docs/guide/configuration.md +0 -828
  480. polyrob-1.6.0/docs/guide/console.md +0 -206
  481. polyrob-1.6.0/docs/guide/conversation.md +0 -64
  482. polyrob-1.6.0/docs/guide/deployment-postures.md +0 -347
  483. polyrob-1.6.0/docs/guide/feishu-dingtalk.md +0 -109
  484. polyrob-1.6.0/docs/guide/getting-started.md +0 -434
  485. polyrob-1.6.0/docs/guide/groups.md +0 -611
  486. polyrob-1.6.0/docs/guide/instances.md +0 -250
  487. polyrob-1.6.0/docs/guide/migration/from-hermes.md +0 -224
  488. polyrob-1.6.0/docs/guide/migration/from-openclaw.md +0 -228
  489. polyrob-1.6.0/docs/guide/operate-the-service.md +0 -126
  490. polyrob-1.6.0/docs/guide/owner-controls.md +0 -395
  491. polyrob-1.6.0/docs/guide/packs.md +0 -174
  492. polyrob-1.6.0/docs/guide/payments.md +0 -1590
  493. polyrob-1.6.0/docs/guide/profiles.md +0 -182
  494. polyrob-1.6.0/docs/guide/security-model.md +0 -619
  495. polyrob-1.6.0/docs/guide/self-hosting.md +0 -487
  496. polyrob-1.6.0/docs/guide/skills.md +0 -375
  497. polyrob-1.6.0/docs/guide/streams.md +0 -241
  498. polyrob-1.6.0/docs/guide/upgrading.md +0 -261
  499. polyrob-1.6.0/docs/guide/x-twitter.md +0 -173
  500. polyrob-1.6.0/migrations/README.md +0 -397
  501. polyrob-1.6.0/migrations/version_manager.py +0 -241
  502. polyrob-1.6.0/modules/auth/api_key_manager.py +0 -177
  503. polyrob-1.6.0/modules/auth/identity_mapper.py +0 -220
  504. polyrob-1.6.0/modules/auth/tier_manager.py +0 -166
  505. polyrob-1.6.0/modules/cards/cards.py +0 -396
  506. polyrob-1.6.0/modules/database/user_profiles.py +0 -522
  507. polyrob-1.6.0/modules/llm/__init__.py +0 -96
  508. polyrob-1.6.0/modules/llm/adapters.py +0 -1138
  509. polyrob-1.6.0/modules/llm/available_models.py +0 -109
  510. polyrob-1.6.0/modules/llm/deepseek_client.py +0 -561
  511. polyrob-1.6.0/modules/llm/llm_client_registry.py +0 -291
  512. polyrob-1.6.0/modules/llm/llm_factory.py +0 -300
  513. polyrob-1.6.0/modules/llm/llm_manager.py +0 -858
  514. polyrob-1.6.0/modules/llm/model_catalog.py +0 -1591
  515. polyrob-1.6.0/modules/llm/model_registry.py +0 -427
  516. polyrob-1.6.0/modules/llm/openrouter_reasoning.py +0 -110
  517. polyrob-1.6.0/modules/llm/profiles.py +0 -607
  518. polyrob-1.6.0/modules/llm/provider_spec.py +0 -1316
  519. polyrob-1.6.0/modules/memory/models.py +0 -183
  520. polyrob-1.6.0/modules/memory/recall_rank.py +0 -98
  521. polyrob-1.6.0/modules/x402/invoice_jitter.py +0 -358
  522. polyrob-1.6.0/packs/x/polyrob_x/cron_delivery.py +0 -67
  523. polyrob-1.6.0/packs/x/polyrob_x/skills/x-engagement/SKILL.md +0 -154
  524. polyrob-1.6.0/packs/x/polyrob_x/twitter_tool.py +0 -2824
  525. polyrob-1.6.0/polyrob/app/autonomy_runtime.py +0 -1286
  526. polyrob-1.6.0/polyrob/app/bootstrap.py +0 -820
  527. polyrob-1.6.0/polyrob/app/initialization.py +0 -993
  528. polyrob-1.6.0/polyrob.egg-info/PKG-INFO +0 -637
  529. polyrob-1.6.0/polyrob.egg-info/SOURCES.txt +0 -1870
  530. polyrob-1.6.0/polyrob.egg-info/requires.txt +0 -121
  531. polyrob-1.6.0/pyproject.toml +0 -180
  532. polyrob-1.6.0/requirements.lock +0 -5357
  533. polyrob-1.6.0/surfaces/telegram/admin_verbs.py +0 -440
  534. polyrob-1.6.0/surfaces/telegram/harness.py +0 -2911
  535. polyrob-1.6.0/surfaces/telegram/identity_ops.py +0 -175
  536. polyrob-1.6.0/surfaces/telegram/lifecycle_ops.py +0 -182
  537. polyrob-1.6.0/surfaces/telegram/nft_ops.py +0 -262
  538. polyrob-1.6.0/surfaces/telegram/owner_ops.py +0 -1037
  539. polyrob-1.6.0/surfaces/telegram/prefs_ops.py +0 -256
  540. polyrob-1.6.0/surfaces/telegram/token_ops.py +0 -317
  541. polyrob-1.6.0/tests/test_board_create_grant_ratchet.py +0 -75
  542. polyrob-1.6.0/tests/test_effect_classification_ratchet.py +0 -327
  543. polyrob-1.6.0/tests/test_file_size_ratchet.py +0 -222
  544. polyrob-1.6.0/tests/test_flag_count_ratchet.py +0 -80
  545. polyrob-1.6.0/tests/test_prompt_surface_golden.py +0 -116
  546. polyrob-1.6.0/tests/test_room_safety_ratchet.py +0 -205
  547. polyrob-1.6.0/tests/test_status_silence_ratchet.py +0 -151
  548. polyrob-1.6.0/tools/README.md +0 -575
  549. polyrob-1.6.0/tools/__init__.py +0 -406
  550. polyrob-1.6.0/tools/agent_nft/tool.py +0 -433
  551. polyrob-1.6.0/tools/agent_nft/view.py +0 -343
  552. polyrob-1.6.0/tools/agent_nft/withdraw.py +0 -211
  553. polyrob-1.6.0/tools/alchemy/__init__.py +0 -5
  554. polyrob-1.6.0/tools/alchemy/alchemy_tool.py +0 -393
  555. polyrob-1.6.0/tools/base_tool.py +0 -526
  556. polyrob-1.6.0/tools/code_exec/tool.py +0 -380
  557. polyrob-1.6.0/tools/collabland/__init__.py +0 -5
  558. polyrob-1.6.0/tools/collabland/collabland_tool.py +0 -436
  559. polyrob-1.6.0/tools/controller/action_registration.py +0 -1831
  560. polyrob-1.6.0/tools/controller/agent_status_action.py +0 -251
  561. polyrob-1.6.0/tools/controller/approval_queue.py +0 -1442
  562. polyrob-1.6.0/tools/controller/delegation.py +0 -208
  563. polyrob-1.6.0/tools/controller/execution.py +0 -1002
  564. polyrob-1.6.0/tools/controller/introspection.py +0 -322
  565. polyrob-1.6.0/tools/controller/mcp_gate.py +0 -47
  566. polyrob-1.6.0/tools/controller/mcp_registrar.py +0 -256
  567. polyrob-1.6.0/tools/controller/send_message_route.py +0 -129
  568. polyrob-1.6.0/tools/controller/service.py +0 -403
  569. polyrob-1.6.0/tools/controller/tool_management.py +0 -475
  570. polyrob-1.6.0/tools/cronjob_tools.py +0 -731
  571. polyrob-1.6.0/tools/dapp_browser/bridge.py +0 -799
  572. polyrob-1.6.0/tools/dapp_browser/tool.py +0 -452
  573. polyrob-1.6.0/tools/defi/book.py +0 -373
  574. polyrob-1.6.0/tools/defi/buy_screen.py +0 -104
  575. polyrob-1.6.0/tools/defi/data_holdings.py +0 -540
  576. polyrob-1.6.0/tools/defi/data_params.py +0 -171
  577. polyrob-1.6.0/tools/defi/data_reconcile.py +0 -273
  578. polyrob-1.6.0/tools/defi/data_render.py +0 -788
  579. polyrob-1.6.0/tools/defi/data_tool.py +0 -1331
  580. polyrob-1.6.0/tools/defi/identity_gate.py +0 -398
  581. polyrob-1.6.0/tools/defi/lp_v4.py +0 -291
  582. polyrob-1.6.0/tools/defi/positions_view.py +0 -280
  583. polyrob-1.6.0/tools/defi/providers/alchemy_index.py +0 -170
  584. polyrob-1.6.0/tools/defi/providers/base.py +0 -179
  585. polyrob-1.6.0/tools/defi/providers/geckoterminal.py +0 -699
  586. polyrob-1.6.0/tools/defi/providers/goplus.py +0 -474
  587. polyrob-1.6.0/tools/defi/providers/token_audits.py +0 -233
  588. polyrob-1.6.0/tools/defi/reconcile.py +0 -379
  589. polyrob-1.6.0/tools/defi/solana_swap_verb.py +0 -783
  590. polyrob-1.6.0/tools/defi/swap_verb.py +0 -370
  591. polyrob-1.6.0/tools/defi/token_screen.py +0 -974
  592. polyrob-1.6.0/tools/defi/trade_params.py +0 -409
  593. polyrob-1.6.0/tools/defi/trade_tool.py +0 -1376
  594. polyrob-1.6.0/tools/defi/wallet_intel.py +0 -308
  595. polyrob-1.6.0/tools/descriptors.py +0 -384
  596. polyrob-1.6.0/tools/intel/cache.py +0 -90
  597. polyrob-1.6.0/tools/mcp/README.md +0 -48
  598. polyrob-1.6.0/tools/mcp/config.py +0 -357
  599. polyrob-1.6.0/tools/mcp/mcp_tool.py +0 -1456
  600. polyrob-1.6.0/tools/mcp/protocol.py +0 -1693
  601. polyrob-1.6.0/tools/mcp/user_mcp_service.py +0 -954
  602. polyrob-1.6.0/tools/shell/process_tool.py +0 -373
  603. polyrob-1.6.0/tools/shell/tool.py +0 -466
  604. polyrob-1.6.0/tools/tool_disclosure.py +0 -469
  605. polyrob-1.6.0/tools/web_fetch/fetcher.py +0 -159
  606. polyrob-1.6.0/webview/contributions.py +0 -64
  607. polyrob-1.6.0/webview/copy/en.py +0 -1356
  608. polyrob-1.6.0/webview/pages_new.py +0 -1827
  609. polyrob-1.6.0/webview/static/app/app.css +0 -593
  610. polyrob-1.6.0/webview/static/app/verbs.en.json +0 -430
  611. polyrob-1.6.0/webview/static/app/work-create.js +0 -91
  612. polyrob-1.6.0/webview/static/app/work-now.js +0 -661
  613. polyrob-1.6.0/webview/static/css/pages/admin.css +0 -766
  614. polyrob-1.6.0/webview/static/js/admin/user_detail.js +0 -391
  615. polyrob-1.6.0/webview/static/js/admin/users.js +0 -162
  616. polyrob-1.6.0/webview/templates/admin/user_detail.html +0 -224
  617. polyrob-1.6.0/webview/templates/admin/users.html +0 -105
  618. polyrob-1.6.0/webview/templates/work.html +0 -288
  619. {polyrob-1.6.0 → polyrob-1.7.0}/LICENSE +0 -0
  620. {polyrob-1.6.0 → polyrob-1.7.0}/MANIFEST.in +0 -0
  621. {polyrob-1.6.0 → polyrob-1.7.0}/agents/README.md +0 -0
  622. {polyrob-1.6.0 → polyrob-1.7.0}/agents/__init__.py +0 -0
  623. {polyrob-1.6.0 → polyrob-1.7.0}/agents/base_agent.py +0 -0
  624. {polyrob-1.6.0 → polyrob-1.7.0}/agents/personality/character.py +0 -0
  625. {polyrob-1.6.0 → polyrob-1.7.0}/agents/personality/character_manager.py +0 -0
  626. {polyrob-1.6.0 → polyrob-1.7.0}/agents/personality/characters/polyrob.character.json +0 -0
  627. {polyrob-1.6.0 → polyrob-1.7.0}/agents/personality/persona_render.py +0 -0
  628. {polyrob-1.6.0 → polyrob-1.7.0}/agents/personality/persona_resolver.py +0 -0
  629. {polyrob-1.6.0 → polyrob-1.7.0}/agents/prompt/__init__.py +0 -0
  630. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/README_PATH_MANAGEMENT.md +0 -0
  631. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/__init__.py +0 -0
  632. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/__init__.py +0 -0
  633. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/agent_state.py +0 -0
  634. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/async_delegation.py +0 -0
  635. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/autonomy_state.py +0 -0
  636. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/__init__.py +0 -0
  637. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/background_review.py +0 -0
  638. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/budget_notice.py +0 -0
  639. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/call_quality.py +0 -0
  640. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/chat_regime.py +0 -0
  641. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/construction_helpers.py +0 -0
  642. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/correspondent_gate.py +0 -0
  643. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/curator.py +0 -0
  644. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/env_context.py +0 -0
  645. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/error_recovery.py +0 -0
  646. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/exhaustion_summary.py +0 -0
  647. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/history_io.py +0 -0
  648. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/live_health.py +0 -0
  649. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/llm_runner.py +0 -0
  650. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/logging_io.py +0 -0
  651. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/loop_detection.py +0 -0
  652. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/memory_prefetch.py +0 -0
  653. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/memory_writer.py +0 -0
  654. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/metering_failure_log.py +0 -0
  655. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/model_introspection.py +0 -0
  656. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/model_swap.py +0 -0
  657. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/output_truncation.py +0 -0
  658. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/output_validation.py +0 -0
  659. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/owner_thread_inject.py +0 -0
  660. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/project_context.py +0 -0
  661. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/resources.py +0 -0
  662. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/result_budget.py +0 -0
  663. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/result_offload.py +0 -0
  664. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/run_budget.py +0 -0
  665. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/run_state.py +0 -0
  666. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/runtime_catalog.py +0 -0
  667. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/safety_lifecycle.py +0 -0
  668. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/self_wake.py +0 -0
  669. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/session_control.py +0 -0
  670. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/session_metadata.py +0 -0
  671. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/step.py +0 -0
  672. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/step_telemetry.py +0 -0
  673. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/timeout_reroute.py +0 -0
  674. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/token_budget.py +0 -0
  675. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/tool_availability.py +0 -0
  676. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/core/untrusted_render.py +0 -0
  677. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/hitl_manager.py +0 -0
  678. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/log_sanitize.py +0 -0
  679. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/message_manager/config.py +0 -0
  680. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/message_manager/service.py +0 -0
  681. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/message_manager/tool_call_builder.py +0 -0
  682. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/message_manager/tool_message_repair.py +0 -0
  683. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/message_manager/views.py +0 -0
  684. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/messages/__init__.py +0 -0
  685. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/messages/compactor.py +0 -0
  686. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/messages/context_references.py +0 -0
  687. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/messages/foundation_layers.py +0 -0
  688. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/messages/foundation_replay.py +0 -0
  689. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/messages/guidance.py +0 -0
  690. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/messages/sqlite_persistence.py +0 -0
  691. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/messages/token_counter.py +0 -0
  692. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/profile_manager.py +0 -0
  693. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/profile_registry.py +0 -0
  694. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/profile_store.py +0 -0
  695. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/prompt_memory.py +0 -0
  696. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/service.py +0 -0
  697. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/session.py +0 -0
  698. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/skill_allowed_tools.py +0 -0
  699. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/skill_manager.py +0 -0
  700. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/sub_agent_manager.py +0 -0
  701. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/tool_call_tracker.py +0 -0
  702. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/agent/views.py +0 -0
  703. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/billed_request.py +0 -0
  704. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/config.py +0 -0
  705. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/constants.py +0 -0
  706. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/conversation_resume.py +0 -0
  707. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/gif_utils.py +0 -0
  708. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/__init__.py +0 -0
  709. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/board_asks.py +0 -0
  710. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/board_types.py +0 -0
  711. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/claim_liveness.py +0 -0
  712. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/completion_judge.py +0 -0
  713. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/context.py +0 -0
  714. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/deliverables.py +0 -0
  715. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/dispatcher.py +0 -0
  716. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/escalation.py +0 -0
  717. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/goal_tool_gates.py +0 -0
  718. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/group_service.py +0 -0
  719. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/memory_scope.py +0 -0
  720. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/goals/preflight.py +0 -0
  721. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/knowledge_export.py +0 -0
  722. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/logging_config.py +0 -0
  723. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/loop_types/__init__.py +0 -0
  724. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/loop_types/browser_views.py +0 -0
  725. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/loop_types/controller_types.py +0 -0
  726. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/loop_types/dom_history_service.py +0 -0
  727. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/loop_types/dom_history_view.py +0 -0
  728. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/loop_types/dom_views.py +0 -0
  729. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/loop_types/execution_context.py +0 -0
  730. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/loop_types/registry_views.py +0 -0
  731. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/path.py +0 -0
  732. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/robust_parse_config.py +0 -0
  733. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/runtime/__init__.py +0 -0
  734. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/runtime/acceptance_checks.py +0 -0
  735. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/runtime/acceptance_schema.py +0 -0
  736. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/runtime/edit_verify.py +0 -0
  737. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/runtime/evidence.py +0 -0
  738. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/runtime/metering_gate.py +0 -0
  739. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/runtime/run_as_session.py +0 -0
  740. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/runtime/run_outcome.py +0 -0
  741. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/runtime/stop_reason.py +0 -0
  742. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/session/__init__.py +0 -0
  743. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/session/browser_pool.py +0 -0
  744. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/session/execution.py +0 -0
  745. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/session/feed.py +0 -0
  746. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/session/hitl_ingress.py +0 -0
  747. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/session/hooks.py +0 -0
  748. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/session/workspace.py +0 -0
  749. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/session_class.py +0 -0
  750. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/session_registry.py +0 -0
  751. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/session_route.py +0 -0
  752. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/sqlite_session_registry.py +0 -0
  753. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/task_agent_chat.py +0 -0
  754. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/task_agent_control.py +0 -0
  755. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/task_agent_lifecycle.py +0 -0
  756. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/telemetry/__init__.py +0 -0
  757. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/telemetry/agent_graph.py +0 -0
  758. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/telemetry/feed_reads.py +0 -0
  759. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/telemetry/formatters.py +0 -0
  760. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/telemetry/live_progress.py +0 -0
  761. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/telemetry/manager.py +0 -0
  762. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/telemetry/memory_events.py +0 -0
  763. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/telemetry/narrate.py +0 -0
  764. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/telemetry/run_activity.py +0 -0
  765. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/telemetry/sequence.py +0 -0
  766. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/telemetry/service.py +0 -0
  767. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/telemetry/views.py +0 -0
  768. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/templates.py +0 -0
  769. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/tool_defaults.py +0 -0
  770. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/utils.py +0 -0
  771. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/utils_json.py +0 -0
  772. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/utils_webview.py +0 -0
  773. {polyrob-1.6.0 → polyrob-1.7.0}/agents/task/workspace_context.py +0 -0
  774. {polyrob-1.6.0 → polyrob-1.7.0}/api/README.md +0 -0
  775. {polyrob-1.6.0 → polyrob-1.7.0}/api/TASK_API_DOCS.md +0 -0
  776. {polyrob-1.6.0 → polyrob-1.7.0}/api/__init__.py +0 -0
  777. {polyrob-1.6.0 → polyrob-1.7.0}/api/a2a/__init__.py +0 -0
  778. {polyrob-1.6.0 → polyrob-1.7.0}/api/a2a/endpoints.py +0 -0
  779. {polyrob-1.6.0 → polyrob-1.7.0}/api/a2a/models.py +0 -0
  780. {polyrob-1.6.0 → polyrob-1.7.0}/api/a2a/streaming.py +0 -0
  781. {polyrob-1.6.0 → polyrob-1.7.0}/api/a2a/task_handler.py +0 -0
  782. {polyrob-1.6.0 → polyrob-1.7.0}/api/account_access.py +0 -0
  783. {polyrob-1.6.0 → polyrob-1.7.0}/api/api_docs.py +0 -0
  784. {polyrob-1.6.0 → polyrob-1.7.0}/api/api_key_auth.py +0 -0
  785. {polyrob-1.6.0 → polyrob-1.7.0}/api/app.py +0 -0
  786. {polyrob-1.6.0 → polyrob-1.7.0}/api/auth_constants.py +0 -0
  787. {polyrob-1.6.0 → polyrob-1.7.0}/api/auth_state.py +0 -0
  788. {polyrob-1.6.0 → polyrob-1.7.0}/api/base_url.py +0 -0
  789. {polyrob-1.6.0 → polyrob-1.7.0}/api/chat_via_task.py +0 -0
  790. {polyrob-1.6.0 → polyrob-1.7.0}/api/contributions.py +0 -0
  791. {polyrob-1.6.0 → polyrob-1.7.0}/api/dependencies.py +0 -0
  792. {polyrob-1.6.0 → polyrob-1.7.0}/api/eip8004_endpoints.py +0 -0
  793. {polyrob-1.6.0 → polyrob-1.7.0}/api/jwt_middleware.py +0 -0
  794. {polyrob-1.6.0 → polyrob-1.7.0}/api/kb/__init__.py +0 -0
  795. {polyrob-1.6.0 → polyrob-1.7.0}/api/kb/endpoints.py +0 -0
  796. {polyrob-1.6.0 → polyrob-1.7.0}/api/mcp_routes.py +0 -0
  797. {polyrob-1.6.0 → polyrob-1.7.0}/api/mcp_serve/__init__.py +0 -0
  798. {polyrob-1.6.0 → polyrob-1.7.0}/api/mcp_serve/handlers.py +0 -0
  799. {polyrob-1.6.0 → polyrob-1.7.0}/api/mcp_serve/router.py +0 -0
  800. {polyrob-1.6.0 → polyrob-1.7.0}/api/middleware.py +0 -0
  801. {polyrob-1.6.0 → polyrob-1.7.0}/api/models.py +0 -0
  802. {polyrob-1.6.0 → polyrob-1.7.0}/api/money_contributions.py +0 -0
  803. {polyrob-1.6.0 → polyrob-1.7.0}/api/openai_compat/__init__.py +0 -0
  804. {polyrob-1.6.0 → polyrob-1.7.0}/api/openai_compat/errors.py +0 -0
  805. {polyrob-1.6.0 → polyrob-1.7.0}/api/openai_compat/model_map.py +0 -0
  806. {polyrob-1.6.0 → polyrob-1.7.0}/api/openai_compat/models.py +0 -0
  807. {polyrob-1.6.0 → polyrob-1.7.0}/api/pack_routes.py +0 -0
  808. {polyrob-1.6.0 → polyrob-1.7.0}/api/payment_verification.py +0 -0
  809. {polyrob-1.6.0 → polyrob-1.7.0}/api/pricing_endpoints.py +0 -0
  810. {polyrob-1.6.0 → polyrob-1.7.0}/api/request_limits.py +0 -0
  811. {polyrob-1.6.0 → polyrob-1.7.0}/api/server_boot.py +0 -0
  812. {polyrob-1.6.0 → polyrob-1.7.0}/api/session_preflight.py +0 -0
  813. {polyrob-1.6.0 → polyrob-1.7.0}/api/session_routing.py +0 -0
  814. {polyrob-1.6.0 → polyrob-1.7.0}/api/skill_endpoints.py +0 -0
  815. {polyrob-1.6.0 → polyrob-1.7.0}/api/task_workspace.py +0 -0
  816. {polyrob-1.6.0 → polyrob-1.7.0}/api/tenant_tools.py +0 -0
  817. {polyrob-1.6.0 → polyrob-1.7.0}/api/upload_sniff.py +0 -0
  818. {polyrob-1.6.0 → polyrob-1.7.0}/api/upload_store.py +0 -0
  819. {polyrob-1.6.0 → polyrob-1.7.0}/api/webhooks.py +0 -0
  820. {polyrob-1.6.0 → polyrob-1.7.0}/api/x402_advertisement.py +0 -0
  821. {polyrob-1.6.0 → polyrob-1.7.0}/api/x402_endpoints.py +0 -0
  822. {polyrob-1.6.0 → polyrob-1.7.0}/assets/__init__.py +0 -0
  823. {polyrob-1.6.0 → polyrob-1.7.0}/assets/brand/polyrob-avatar-512.png +0 -0
  824. {polyrob-1.6.0 → polyrob-1.7.0}/assets/brand/polyrob-mark-256.png +0 -0
  825. {polyrob-1.6.0 → polyrob-1.7.0}/assets/fonts/dejavu/DejaVuSans-Bold.ttf +0 -0
  826. {polyrob-1.6.0 → polyrob-1.7.0}/assets/fonts/dejavu/DejaVuSans.ttf +0 -0
  827. {polyrob-1.6.0 → polyrob-1.7.0}/assets/fonts/dejavu/LICENSE +0 -0
  828. {polyrob-1.6.0 → polyrob-1.7.0}/cli/README.md +0 -0
  829. {polyrob-1.6.0 → polyrob-1.7.0}/cli/__init__.py +0 -0
  830. {polyrob-1.6.0 → polyrob-1.7.0}/cli/_admin_home.py +0 -0
  831. {polyrob-1.6.0 → polyrob-1.7.0}/cli/_doctor_members.py +0 -0
  832. {polyrob-1.6.0 → polyrob-1.7.0}/cli/_flag_warn.py +0 -0
  833. {polyrob-1.6.0 → polyrob-1.7.0}/cli/agent_child_gate.py +0 -0
  834. {polyrob-1.6.0 → polyrob-1.7.0}/cli/attachments.py +0 -0
  835. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/__init__.py +0 -0
  836. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/_bootstrap.py +0 -0
  837. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/_errors.py +0 -0
  838. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/_grouped.py +0 -0
  839. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/_lifecycle.py +0 -0
  840. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/_lifecycle_boot.py +0 -0
  841. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/_options.py +0 -0
  842. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/_service_ops.py +0 -0
  843. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/_session_control.py +0 -0
  844. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/_surface_runner.py +0 -0
  845. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/approvals.py +0 -0
  846. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/apps.py +0 -0
  847. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/auth.py +0 -0
  848. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/autonomy.py +0 -0
  849. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/avatar.py +0 -0
  850. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/browser.py +0 -0
  851. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/cron.py +0 -0
  852. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/dashboard.py +0 -0
  853. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/datagen.py +0 -0
  854. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/discord.py +0 -0
  855. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/email.py +0 -0
  856. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/finance.py +0 -0
  857. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/gateway.py +0 -0
  858. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/goals.py +0 -0
  859. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/journey.py +0 -0
  860. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/kb.py +0 -0
  861. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/knowledge.py +0 -0
  862. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/owner.py +0 -0
  863. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/owner_memory.py +0 -0
  864. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/pack.py +0 -0
  865. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/persona.py +0 -0
  866. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/profile.py +0 -0
  867. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/profile_dist.py +0 -0
  868. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/profile_transfer.py +0 -0
  869. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/serve.py +0 -0
  870. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/session.py +0 -0
  871. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/signal.py +0 -0
  872. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/skill_hub.py +0 -0
  873. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/skill_install.py +0 -0
  874. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/skills.py +0 -0
  875. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/slack.py +0 -0
  876. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/soul.py +0 -0
  877. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/subagents.py +0 -0
  878. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/surface.py +0 -0
  879. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/surfaces.py +0 -0
  880. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/telegram.py +0 -0
  881. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/todos.py +0 -0
  882. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/tools.py +0 -0
  883. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/uninstall.py +0 -0
  884. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/update.py +0 -0
  885. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/whatsapp.py +0 -0
  886. {polyrob-1.6.0 → polyrob-1.7.0}/cli/commands/workers.py +0 -0
  887. {polyrob-1.6.0 → polyrob-1.7.0}/cli/delegation_receipts.py +0 -0
  888. {polyrob-1.6.0 → polyrob-1.7.0}/cli/git_child_env.py +0 -0
  889. {polyrob-1.6.0 → polyrob-1.7.0}/cli/gitignore.py +0 -0
  890. {polyrob-1.6.0 → polyrob-1.7.0}/cli/inventory.py +0 -0
  891. {polyrob-1.6.0 → polyrob-1.7.0}/cli/persona.py +0 -0
  892. {polyrob-1.6.0 → polyrob-1.7.0}/cli/polyrob.py +0 -0
  893. {polyrob-1.6.0 → polyrob-1.7.0}/cli/profile_review.py +0 -0
  894. {polyrob-1.6.0 → polyrob-1.7.0}/cli/session_paths.py +0 -0
  895. {polyrob-1.6.0 → polyrob-1.7.0}/cli/surfaces_config.py +0 -0
  896. {polyrob-1.6.0 → polyrob-1.7.0}/cli/toolset.py +0 -0
  897. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/__init__.py +0 -0
  898. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/activity.py +0 -0
  899. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/app.py +0 -0
  900. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/approval_prompt.py +0 -0
  901. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/autonomy_live.py +0 -0
  902. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/autonomy_poll.py +0 -0
  903. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/banner.py +0 -0
  904. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/blocks.py +0 -0
  905. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/bootstrap_notice.py +0 -0
  906. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/candy.py +0 -0
  907. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/__init__.py +0 -0
  908. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_a23.py +0 -0
  909. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_approve.py +0 -0
  910. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_attach.py +0 -0
  911. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_autonomy.py +0 -0
  912. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_avatar.py +0 -0
  913. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_cards.py +0 -0
  914. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_check.py +0 -0
  915. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_context.py +0 -0
  916. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_contributed.py +0 -0
  917. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_diag.py +0 -0
  918. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_files.py +0 -0
  919. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_finance.py +0 -0
  920. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_gates.py +0 -0
  921. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_goal_one.py +0 -0
  922. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_goals_view.py +0 -0
  923. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_help.py +0 -0
  924. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_holdings.py +0 -0
  925. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_job.py +0 -0
  926. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_journey.py +0 -0
  927. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_kb.py +0 -0
  928. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_learn.py +0 -0
  929. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_lifecycle.py +0 -0
  930. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_mode.py +0 -0
  931. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_owner.py +0 -0
  932. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_owner_reach.py +0 -0
  933. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_pending.py +0 -0
  934. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_persona.py +0 -0
  935. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_prefs.py +0 -0
  936. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_profile.py +0 -0
  937. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_reject.py +0 -0
  938. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_rooms.py +0 -0
  939. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_run.py +0 -0
  940. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_self.py +0 -0
  941. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_send.py +0 -0
  942. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_skills.py +0 -0
  943. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_skills_hub.py +0 -0
  944. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_steer.py +0 -0
  945. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_swap.py +0 -0
  946. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_token.py +0 -0
  947. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_view_cells.py +0 -0
  948. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/h_workers.py +0 -0
  949. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/registry.py +0 -0
  950. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/commands/window.py +0 -0
  951. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/config_picker.py +0 -0
  952. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/dialog.py +0 -0
  953. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/event_registry.py +0 -0
  954. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/event_specs.py +0 -0
  955. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/events.py +0 -0
  956. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/first_run_notice.py +0 -0
  957. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/hints.py +0 -0
  958. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/history.py +0 -0
  959. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/identity.py +0 -0
  960. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/input_policy.py +0 -0
  961. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/json_renderer.py +0 -0
  962. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/lifecycle.py +0 -0
  963. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/line_layout.py +0 -0
  964. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/literal.py +0 -0
  965. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/live_hooks.py +0 -0
  966. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/log_squelch.py +0 -0
  967. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/persistent_loop.py +0 -0
  968. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/plain_renderer.py +0 -0
  969. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/renderer.py +0 -0
  970. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/rich_renderer.py +0 -0
  971. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/secrets.py +0 -0
  972. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/slash_highlight.py +0 -0
  973. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/state.py +0 -0
  974. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/statusbar.py +0 -0
  975. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/streaming.py +0 -0
  976. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/terminal_title.py +0 -0
  977. {polyrob-1.6.0 → polyrob-1.7.0}/cli/ui/theme.py +0 -0
  978. {polyrob-1.6.0 → polyrob-1.7.0}/cli/update/__init__.py +0 -0
  979. {polyrob-1.6.0 → polyrob-1.7.0}/cli/update/agent_state.py +0 -0
  980. {polyrob-1.6.0 → polyrob-1.7.0}/cli/update/context.py +0 -0
  981. {polyrob-1.6.0 → polyrob-1.7.0}/cli/update/detect.py +0 -0
  982. {polyrob-1.6.0 → polyrob-1.7.0}/cli/update/engine.py +0 -0
  983. {polyrob-1.6.0 → polyrob-1.7.0}/cli/update/extras.py +0 -0
  984. {polyrob-1.6.0 → polyrob-1.7.0}/cli/update/packs.py +0 -0
  985. {polyrob-1.6.0 → polyrob-1.7.0}/cli/update/process_guard.py +0 -0
  986. {polyrob-1.6.0 → polyrob-1.7.0}/cli/update/restore.py +0 -0
  987. {polyrob-1.6.0 → polyrob-1.7.0}/cli/update/runners.py +0 -0
  988. {polyrob-1.6.0 → polyrob-1.7.0}/cli/update/snapshot.py +0 -0
  989. {polyrob-1.6.0 → polyrob-1.7.0}/cli/update/versions.py +0 -0
  990. {polyrob-1.6.0 → polyrob-1.7.0}/core/README.md +0 -0
  991. {polyrob-1.6.0 → polyrob-1.7.0}/core/__init__.py +0 -0
  992. {polyrob-1.6.0 → polyrob-1.7.0}/core/action_names.py +0 -0
  993. {polyrob-1.6.0 → polyrob-1.7.0}/core/action_receipt.py +0 -0
  994. {polyrob-1.6.0 → polyrob-1.7.0}/core/activity_class.py +0 -0
  995. {polyrob-1.6.0 → polyrob-1.7.0}/core/activity_evidence.py +0 -0
  996. {polyrob-1.6.0 → polyrob-1.7.0}/core/admin_data_home.py +0 -0
  997. {polyrob-1.6.0 → polyrob-1.7.0}/core/app_service/__init__.py +0 -0
  998. {polyrob-1.6.0 → polyrob-1.7.0}/core/app_service/approval.py +0 -0
  999. {polyrob-1.6.0 → polyrob-1.7.0}/core/app_service/config.py +0 -0
  1000. {polyrob-1.6.0 → polyrob-1.7.0}/core/app_service/egress.py +0 -0
  1001. {polyrob-1.6.0 → polyrob-1.7.0}/core/app_service/env_scan.py +0 -0
  1002. {polyrob-1.6.0 → polyrob-1.7.0}/core/app_service/fingerprint.py +0 -0
  1003. {polyrob-1.6.0 → polyrob-1.7.0}/core/app_service/nginx.py +0 -0
  1004. {polyrob-1.6.0 → polyrob-1.7.0}/core/app_service/owner_ops.py +0 -0
  1005. {polyrob-1.6.0 → polyrob-1.7.0}/core/app_service/registry.py +0 -0
  1006. {polyrob-1.6.0 → polyrob-1.7.0}/core/app_service/snapshot.py +0 -0
  1007. {polyrob-1.6.0 → polyrob-1.7.0}/core/app_service/supervisor.py +0 -0
  1008. {polyrob-1.6.0 → polyrob-1.7.0}/core/approval_input.py +0 -0
  1009. {polyrob-1.6.0 → polyrob-1.7.0}/core/approved_actions.py +0 -0
  1010. {polyrob-1.6.0 → polyrob-1.7.0}/core/artifacts.py +0 -0
  1011. {polyrob-1.6.0 → polyrob-1.7.0}/core/assets.py +0 -0
  1012. {polyrob-1.6.0 → polyrob-1.7.0}/core/async_bridge.py +0 -0
  1013. {polyrob-1.6.0 → polyrob-1.7.0}/core/autonomy_control.py +0 -0
  1014. {polyrob-1.6.0 → polyrob-1.7.0}/core/autonomy_marker.py +0 -0
  1015. {polyrob-1.6.0 → polyrob-1.7.0}/core/avatar.py +0 -0
  1016. {polyrob-1.6.0 → polyrob-1.7.0}/core/backoff.py +0 -0
  1017. {polyrob-1.6.0 → polyrob-1.7.0}/core/base_component.py +0 -0
  1018. {polyrob-1.6.0 → polyrob-1.7.0}/core/billing_context.py +0 -0
  1019. {polyrob-1.6.0 → polyrob-1.7.0}/core/book.py +0 -0
  1020. {polyrob-1.6.0 → polyrob-1.7.0}/core/boot_reconcilers.py +0 -0
  1021. {polyrob-1.6.0 → polyrob-1.7.0}/core/bootstrap_marker.py +0 -0
  1022. {polyrob-1.6.0 → polyrob-1.7.0}/core/capability_verdict.py +0 -0
  1023. {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/__init__.py +0 -0
  1024. {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/_env.py +0 -0
  1025. {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/autonomy_config.py +0 -0
  1026. {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/autonomy_mode.py +0 -0
  1027. {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/autonomy_posture.py +0 -0
  1028. {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/builder_mode.py +0 -0
  1029. {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/capability_toggles.py +0 -0
  1030. {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/compute_posture.py +0 -0
  1031. {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/flag_defaults.py +0 -0
  1032. {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/flag_enums.py +0 -0
  1033. {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/goal_flags.py +0 -0
  1034. {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/live_apply.py +0 -0
  1035. {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/local_profile.py +0 -0
  1036. {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/members.py +0 -0
  1037. {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/memory_policy.py +0 -0
  1038. {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/money_regime.py +0 -0
  1039. {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/payment_policy.py +0 -0
  1040. {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/payment_tools.py +0 -0
  1041. {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/policy.py +0 -0
  1042. {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/posture_card.py +0 -0
  1043. {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/retired_flags.py +0 -0
  1044. {polyrob-1.6.0 → polyrob-1.7.0}/core/config_policy/runtime_gates.py +0 -0
  1045. {polyrob-1.6.0 → polyrob-1.7.0}/core/container.py +0 -0
  1046. {polyrob-1.6.0 → polyrob-1.7.0}/core/container_hardening.py +0 -0
  1047. {polyrob-1.6.0 → polyrob-1.7.0}/core/context_fences.py +0 -0
  1048. {polyrob-1.6.0 → polyrob-1.7.0}/core/contract_writer.py +0 -0
  1049. {polyrob-1.6.0 → polyrob-1.7.0}/core/copy/__init__.py +0 -0
  1050. {polyrob-1.6.0 → polyrob-1.7.0}/core/copy/_engine.py +0 -0
  1051. {polyrob-1.6.0 → polyrob-1.7.0}/core/copy/glossary.py +0 -0
  1052. {polyrob-1.6.0 → polyrob-1.7.0}/core/credential_verdicts.py +0 -0
  1053. {polyrob-1.6.0 → polyrob-1.7.0}/core/credit_sentinel.py +0 -0
  1054. {polyrob-1.6.0 → polyrob-1.7.0}/core/cron_rearm.py +0 -0
  1055. {polyrob-1.6.0 → polyrob-1.7.0}/core/dapp_session_store.py +0 -0
  1056. {polyrob-1.6.0 → polyrob-1.7.0}/core/data_perms.py +0 -0
  1057. {polyrob-1.6.0 → polyrob-1.7.0}/core/delivery_channels.py +0 -0
  1058. {polyrob-1.6.0 → polyrob-1.7.0}/core/doc_age.py +0 -0
  1059. {polyrob-1.6.0 → polyrob-1.7.0}/core/doc_claims.py +0 -0
  1060. {polyrob-1.6.0 → polyrob-1.7.0}/core/doc_kind.py +0 -0
  1061. {polyrob-1.6.0 → polyrob-1.7.0}/core/effects.py +0 -0
  1062. {polyrob-1.6.0 → polyrob-1.7.0}/core/embedding.py +0 -0
  1063. {polyrob-1.6.0 → polyrob-1.7.0}/core/env.py +0 -0
  1064. {polyrob-1.6.0 → polyrob-1.7.0}/core/env_file.py +0 -0
  1065. {polyrob-1.6.0 → polyrob-1.7.0}/core/error_classifier.py +0 -0
  1066. {polyrob-1.6.0 → polyrob-1.7.0}/core/eval_manifest.py +0 -0
  1067. {polyrob-1.6.0 → polyrob-1.7.0}/core/exceptions.py +0 -0
  1068. {polyrob-1.6.0 → polyrob-1.7.0}/core/exec_identity.py +0 -0
  1069. {polyrob-1.6.0 → polyrob-1.7.0}/core/extras_spec.py +0 -0
  1070. {polyrob-1.6.0 → polyrob-1.7.0}/core/file_lock.py +0 -0
  1071. {polyrob-1.6.0 → polyrob-1.7.0}/core/flags.py +0 -0
  1072. {polyrob-1.6.0 → polyrob-1.7.0}/core/gitignore.py +0 -0
  1073. {polyrob-1.6.0 → polyrob-1.7.0}/core/goal_board_render.py +0 -0
  1074. {polyrob-1.6.0 → polyrob-1.7.0}/core/goal_legibility.py +0 -0
  1075. {polyrob-1.6.0 → polyrob-1.7.0}/core/goal_owner_verbs.py +0 -0
  1076. {polyrob-1.6.0 → polyrob-1.7.0}/core/goal_suppressions.py +0 -0
  1077. {polyrob-1.6.0 → polyrob-1.7.0}/core/home_migration.py +0 -0
  1078. {polyrob-1.6.0 → polyrob-1.7.0}/core/identity.py +0 -0
  1079. {polyrob-1.6.0 → polyrob-1.7.0}/core/inference_context.py +0 -0
  1080. {polyrob-1.6.0 → polyrob-1.7.0}/core/install_facts.py +0 -0
  1081. {polyrob-1.6.0 → polyrob-1.7.0}/core/instance.py +0 -0
  1082. {polyrob-1.6.0 → polyrob-1.7.0}/core/instruction_surfaces.py +0 -0
  1083. {polyrob-1.6.0 → polyrob-1.7.0}/core/interactive_gate.py +0 -0
  1084. {polyrob-1.6.0 → polyrob-1.7.0}/core/kb_grammar.py +0 -0
  1085. {polyrob-1.6.0 → polyrob-1.7.0}/core/key_suggest.py +0 -0
  1086. {polyrob-1.6.0 → polyrob-1.7.0}/core/lazy_closures/__init__.py +0 -0
  1087. {polyrob-1.6.0 → polyrob-1.7.0}/core/lazy_deps.py +0 -0
  1088. {polyrob-1.6.0 → polyrob-1.7.0}/core/lazy_installer.py +0 -0
  1089. {polyrob-1.6.0 → polyrob-1.7.0}/core/lazy_views.py +0 -0
  1090. {polyrob-1.6.0 → polyrob-1.7.0}/core/legacy_data_tree.py +0 -0
  1091. {polyrob-1.6.0 → polyrob-1.7.0}/core/llm_auth/__init__.py +0 -0
  1092. {polyrob-1.6.0 → polyrob-1.7.0}/core/llm_auth/errors.py +0 -0
  1093. {polyrob-1.6.0 → polyrob-1.7.0}/core/llm_auth/flows/__init__.py +0 -0
  1094. {polyrob-1.6.0 → polyrob-1.7.0}/core/llm_auth/flows/base.py +0 -0
  1095. {polyrob-1.6.0 → polyrob-1.7.0}/core/llm_auth/flows/device_code.py +0 -0
  1096. {polyrob-1.6.0 → polyrob-1.7.0}/core/llm_auth/flows/loopback_pkce.py +0 -0
  1097. {polyrob-1.6.0 → polyrob-1.7.0}/core/llm_auth/flows/manual_paste_pkce.py +0 -0
  1098. {polyrob-1.6.0 → polyrob-1.7.0}/core/llm_auth/flows/registry.py +0 -0
  1099. {polyrob-1.6.0 → polyrob-1.7.0}/core/llm_auth/health.py +0 -0
  1100. {polyrob-1.6.0 → polyrob-1.7.0}/core/llm_auth/inference.py +0 -0
  1101. {polyrob-1.6.0 → polyrob-1.7.0}/core/llm_auth/resolve.py +0 -0
  1102. {polyrob-1.6.0 → polyrob-1.7.0}/core/llm_auth/store.py +0 -0
  1103. {polyrob-1.6.0 → polyrob-1.7.0}/core/lock_closure.py +0 -0
  1104. {polyrob-1.6.0 → polyrob-1.7.0}/core/logging.py +0 -0
  1105. {polyrob-1.6.0 → polyrob-1.7.0}/core/maintenance_proposals.py +0 -0
  1106. {polyrob-1.6.0 → polyrob-1.7.0}/core/money/__init__.py +0 -0
  1107. {polyrob-1.6.0 → polyrob-1.7.0}/core/money/authority.py +0 -0
  1108. {polyrob-1.6.0 → polyrob-1.7.0}/core/money/classify.py +0 -0
  1109. {polyrob-1.6.0 → polyrob-1.7.0}/core/money/ledger.py +0 -0
  1110. {polyrob-1.6.0 → polyrob-1.7.0}/core/money/regime.py +0 -0
  1111. {polyrob-1.6.0 → polyrob-1.7.0}/core/money/valuation.py +0 -0
  1112. {polyrob-1.6.0 → polyrob-1.7.0}/core/optional_extras.py +0 -0
  1113. {polyrob-1.6.0 → polyrob-1.7.0}/core/owner_create.py +0 -0
  1114. {polyrob-1.6.0 → polyrob-1.7.0}/core/owner_doc_writer.py +0 -0
  1115. {polyrob-1.6.0 → polyrob-1.7.0}/core/owner_remedy.py +0 -0
  1116. {polyrob-1.6.0 → polyrob-1.7.0}/core/packs/__init__.py +0 -0
  1117. {polyrob-1.6.0 → polyrob-1.7.0}/core/packs/index.json +0 -0
  1118. {polyrob-1.6.0 → polyrob-1.7.0}/core/packs/index.py +0 -0
  1119. {polyrob-1.6.0 → polyrob-1.7.0}/core/packs/manifest.py +0 -0
  1120. {polyrob-1.6.0 → polyrob-1.7.0}/core/packs/removed.json +0 -0
  1121. {polyrob-1.6.0 → polyrob-1.7.0}/core/packs/retire.py +0 -0
  1122. {polyrob-1.6.0 → polyrob-1.7.0}/core/packs/sdk.py +0 -0
  1123. {polyrob-1.6.0 → polyrob-1.7.0}/core/packs/spec.py +0 -0
  1124. {polyrob-1.6.0 → polyrob-1.7.0}/core/packs/state.py +0 -0
  1125. {polyrob-1.6.0 → polyrob-1.7.0}/core/pairing.py +0 -0
  1126. {polyrob-1.6.0 → polyrob-1.7.0}/core/path_safety.py +0 -0
  1127. {polyrob-1.6.0 → polyrob-1.7.0}/core/paths.py +0 -0
  1128. {polyrob-1.6.0 → polyrob-1.7.0}/core/payment_config.py +0 -0
  1129. {polyrob-1.6.0 → polyrob-1.7.0}/core/payments/__init__.py +0 -0
  1130. {polyrob-1.6.0 → polyrob-1.7.0}/core/payments/assets.py +0 -0
  1131. {polyrob-1.6.0 → polyrob-1.7.0}/core/payments/quote.py +0 -0
  1132. {polyrob-1.6.0 → polyrob-1.7.0}/core/prefs.py +0 -0
  1133. {polyrob-1.6.0 → polyrob-1.7.0}/core/profiles.py +0 -0
  1134. {polyrob-1.6.0 → polyrob-1.7.0}/core/prompt_manifest.py +0 -0
  1135. {polyrob-1.6.0 → polyrob-1.7.0}/core/prompt_text.py +0 -0
  1136. {polyrob-1.6.0 → polyrob-1.7.0}/core/publish.py +0 -0
  1137. {polyrob-1.6.0 → polyrob-1.7.0}/core/rate_limit.py +0 -0
  1138. {polyrob-1.6.0 → polyrob-1.7.0}/core/recap.py +0 -0
  1139. {polyrob-1.6.0 → polyrob-1.7.0}/core/remedy.py +0 -0
  1140. {polyrob-1.6.0 → polyrob-1.7.0}/core/rules_sweep.py +0 -0
  1141. {polyrob-1.6.0 → polyrob-1.7.0}/core/run_control.py +0 -0
  1142. {polyrob-1.6.0 → polyrob-1.7.0}/core/runtime_paths.py +0 -0
  1143. {polyrob-1.6.0 → polyrob-1.7.0}/core/schedule.py +0 -0
  1144. {polyrob-1.6.0 → polyrob-1.7.0}/core/seams.py +0 -0
  1145. {polyrob-1.6.0 → polyrob-1.7.0}/core/secret_patterns.py +0 -0
  1146. {polyrob-1.6.0 → polyrob-1.7.0}/core/secret_scan.py +0 -0
  1147. {polyrob-1.6.0 → polyrob-1.7.0}/core/secret_scrub.py +0 -0
  1148. {polyrob-1.6.0 → polyrob-1.7.0}/core/secrets.py +0 -0
  1149. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/__init__.py +0 -0
  1150. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/agent_child.py +0 -0
  1151. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/api_keys.py +0 -0
  1152. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/bip39_english.txt +0 -0
  1153. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/browser_origin.py +0 -0
  1154. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/browser_rail.py +0 -0
  1155. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/command_guard.py +0 -0
  1156. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/confined_read.py +0 -0
  1157. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/confined_write.py +0 -0
  1158. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/custody_env.py +0 -0
  1159. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/document_archive.py +0 -0
  1160. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/encryption.py +0 -0
  1161. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/forged_turns.py +0 -0
  1162. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/host_execution.py +0 -0
  1163. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/http_probe.py +0 -0
  1164. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/internal_events.py +0 -0
  1165. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/owner_turn.py +0 -0
  1166. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/pinned_resolver.py +0 -0
  1167. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/pinned_transport.py +0 -0
  1168. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/policy_order.py +0 -0
  1169. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/process_hardening.py +0 -0
  1170. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/redaction.py +0 -0
  1171. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/refusals.py +0 -0
  1172. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/secret_guard.py +0 -0
  1173. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/secret_material.py +0 -0
  1174. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/session_tokens.py +0 -0
  1175. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/settings.py +0 -0
  1176. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/taints.py +0 -0
  1177. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/threat_report.py +0 -0
  1178. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/turn_facts.py +0 -0
  1179. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/untrusted_wrap.py +0 -0
  1180. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/url_policy.py +0 -0
  1181. {polyrob-1.6.0 → polyrob-1.7.0}/core/security/workspace_io.py +0 -0
  1182. {polyrob-1.6.0 → polyrob-1.7.0}/core/security_digest.py +0 -0
  1183. {polyrob-1.6.0 → polyrob-1.7.0}/core/security_logging_filter.py +0 -0
  1184. {polyrob-1.6.0 → polyrob-1.7.0}/core/security_speakers.py +0 -0
  1185. {polyrob-1.6.0 → polyrob-1.7.0}/core/self_events.py +0 -0
  1186. {polyrob-1.6.0 → polyrob-1.7.0}/core/session_control.py +0 -0
  1187. {polyrob-1.6.0 → polyrob-1.7.0}/core/session_gc.py +0 -0
  1188. {polyrob-1.6.0 → polyrob-1.7.0}/core/session_retention.py +0 -0
  1189. {polyrob-1.6.0 → polyrob-1.7.0}/core/ship_tree.py +0 -0
  1190. {polyrob-1.6.0 → polyrob-1.7.0}/core/sidecar_relocate.py +0 -0
  1191. {polyrob-1.6.0 → polyrob-1.7.0}/core/signer/__init__.py +0 -0
  1192. {polyrob-1.6.0 → polyrob-1.7.0}/core/signer/approvals.py +0 -0
  1193. {polyrob-1.6.0 → polyrob-1.7.0}/core/signer/attest.py +0 -0
  1194. {polyrob-1.6.0 → polyrob-1.7.0}/core/signer/caps.py +0 -0
  1195. {polyrob-1.6.0 → polyrob-1.7.0}/core/signer/client.py +0 -0
  1196. {polyrob-1.6.0 → polyrob-1.7.0}/core/signer/deployed_mode.py +0 -0
  1197. {polyrob-1.6.0 → polyrob-1.7.0}/core/signer/peer.py +0 -0
  1198. {polyrob-1.6.0 → polyrob-1.7.0}/core/signer/provision.py +0 -0
  1199. {polyrob-1.6.0 → polyrob-1.7.0}/core/signer/review.py +0 -0
  1200. {polyrob-1.6.0 → polyrob-1.7.0}/core/signer/runtime.py +0 -0
  1201. {polyrob-1.6.0 → polyrob-1.7.0}/core/skills/__init__.py +0 -0
  1202. {polyrob-1.6.0 → polyrob-1.7.0}/core/skills/catalog.py +0 -0
  1203. {polyrob-1.6.0 → polyrob-1.7.0}/core/skills/frontmatter.py +0 -0
  1204. {polyrob-1.6.0 → polyrob-1.7.0}/core/skills/scopes.py +0 -0
  1205. {polyrob-1.6.0 → polyrob-1.7.0}/core/sqlite_util.py +0 -0
  1206. {polyrob-1.6.0 → polyrob-1.7.0}/core/status_custody.py +0 -0
  1207. {polyrob-1.6.0 → polyrob-1.7.0}/core/status_delivery.py +0 -0
  1208. {polyrob-1.6.0 → polyrob-1.7.0}/core/status_economics.py +0 -0
  1209. {polyrob-1.6.0 → polyrob-1.7.0}/core/status_identity.py +0 -0
  1210. {polyrob-1.6.0 → polyrob-1.7.0}/core/status_knowledge.py +0 -0
  1211. {polyrob-1.6.0 → polyrob-1.7.0}/core/status_liquidity.py +0 -0
  1212. {polyrob-1.6.0 → polyrob-1.7.0}/core/status_live.py +0 -0
  1213. {polyrob-1.6.0 → polyrob-1.7.0}/core/status_loops.py +0 -0
  1214. {polyrob-1.6.0 → polyrob-1.7.0}/core/status_packs.py +0 -0
  1215. {polyrob-1.6.0 → polyrob-1.7.0}/core/status_rails.py +0 -0
  1216. {polyrob-1.6.0 → polyrob-1.7.0}/core/status_room_actions.py +0 -0
  1217. {polyrob-1.6.0 → polyrob-1.7.0}/core/status_rooms.py +0 -0
  1218. {polyrob-1.6.0 → polyrob-1.7.0}/core/status_rules.py +0 -0
  1219. {polyrob-1.6.0 → polyrob-1.7.0}/core/status_session.py +0 -0
  1220. {polyrob-1.6.0 → polyrob-1.7.0}/core/status_tools.py +0 -0
  1221. {polyrob-1.6.0 → polyrob-1.7.0}/core/status_work.py +0 -0
  1222. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/__init__.py +0 -0
  1223. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/access.py +0 -0
  1224. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/access_log.py +0 -0
  1225. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/act.py +0 -0
  1226. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/actions.py +0 -0
  1227. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/address_key.py +0 -0
  1228. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/attachments.py +0 -0
  1229. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/binding.py +0 -0
  1230. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/bootstrap.py +0 -0
  1231. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/bot_pair_guard.py +0 -0
  1232. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/card_groups.py +0 -0
  1233. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/catalog.py +0 -0
  1234. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/chat_policy.py +0 -0
  1235. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/circuit.py +0 -0
  1236. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/command_reply.py +0 -0
  1237. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/config.py +0 -0
  1238. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/continuity.py +0 -0
  1239. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/conversations.py +0 -0
  1240. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/correspondents.py +0 -0
  1241. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/dead_targets.py +0 -0
  1242. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/deep_link.py +0 -0
  1243. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/dispatcher.py +0 -0
  1244. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/envelopes.py +0 -0
  1245. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/error_notices.py +0 -0
  1246. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/gc.py +0 -0
  1247. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/group_allowlist.py +0 -0
  1248. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/group_ledger.py +0 -0
  1249. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/group_roles.py +0 -0
  1250. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/group_turn.py +0 -0
  1251. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/health.py +0 -0
  1252. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/idempotency.py +0 -0
  1253. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/inbound_attachments.py +0 -0
  1254. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/inbound_webhook.py +0 -0
  1255. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/inbox.py +0 -0
  1256. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/inbox_render.py +0 -0
  1257. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/ledger_ingest.py +0 -0
  1258. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/llm_outage_notice.py +0 -0
  1259. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/media.py +0 -0
  1260. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/media_access.py +0 -0
  1261. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/missed.py +0 -0
  1262. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/outbound_allowlist.py +0 -0
  1263. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/outbound_dispatcher.py +0 -0
  1264. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/outbound_mirror.py +0 -0
  1265. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/outbound_policy.py +0 -0
  1266. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/outbound_queue.py +0 -0
  1267. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/outbound_target.py +0 -0
  1268. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/owner_address.py +0 -0
  1269. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/owner_admin.py +0 -0
  1270. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/owner_target.py +0 -0
  1271. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/owner_turn.py +0 -0
  1272. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/path_links.py +0 -0
  1273. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/poll_health.py +0 -0
  1274. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/proactive.py +0 -0
  1275. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/progress.py +0 -0
  1276. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/quiet_hours.py +0 -0
  1277. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/registry.py +0 -0
  1278. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/rendering.py +0 -0
  1279. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/room_action_admin.py +0 -0
  1280. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/room_action_store.py +0 -0
  1281. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/room_caps.py +0 -0
  1282. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/room_focus.py +0 -0
  1283. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/room_keys.py +0 -0
  1284. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/room_policy.py +0 -0
  1285. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/seed.py +0 -0
  1286. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/send_policy.py +0 -0
  1287. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/sent_posts.py +0 -0
  1288. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/serialize.py +0 -0
  1289. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/session_chat_registry.py +0 -0
  1290. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/session_policy.py +0 -0
  1291. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/speech_out.py +0 -0
  1292. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/spill.py +0 -0
  1293. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/surface.py +0 -0
  1294. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/tappable.py +0 -0
  1295. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/transcription.py +0 -0
  1296. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/user_delivery.py +0 -0
  1297. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/voice_echo.py +0 -0
  1298. {polyrob-1.6.0 → polyrob-1.7.0}/core/surfaces/voice_guard.py +0 -0
  1299. {polyrob-1.6.0 → polyrob-1.7.0}/core/tickers.py +0 -0
  1300. {polyrob-1.6.0 → polyrob-1.7.0}/core/token_denylist.py +0 -0
  1301. {polyrob-1.6.0 → polyrob-1.7.0}/core/tool_grants.py +0 -0
  1302. {polyrob-1.6.0 → polyrob-1.7.0}/core/verb_policy.py +0 -0
  1303. {polyrob-1.6.0 → polyrob-1.7.0}/core/version.py +0 -0
  1304. {polyrob-1.6.0 → polyrob-1.7.0}/core/wake_queue.py +0 -0
  1305. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/abi.py +0 -0
  1306. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/account_journal.py +0 -0
  1307. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/activity.py +0 -0
  1308. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/address_kind.py +0 -0
  1309. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/address_lookalike.py +0 -0
  1310. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/addresses.py +0 -0
  1311. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/agent_wallet.py +0 -0
  1312. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/audit_sink.py +0 -0
  1313. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/authority.py +0 -0
  1314. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/balance_cache.py +0 -0
  1315. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/bridge_guard.py +0 -0
  1316. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/bridge_status.py +0 -0
  1317. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/bridge_watcher.py +0 -0
  1318. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/broadcast/__init__.py +0 -0
  1319. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/broadcast/evm.py +0 -0
  1320. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/broadcast/receipt_validation.py +0 -0
  1321. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/chains.py +0 -0
  1322. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/collection_mint.py +0 -0
  1323. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/collection_registry.py +0 -0
  1324. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/collection_reveal.py +0 -0
  1325. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/collection_trust.py +0 -0
  1326. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/config.py +0 -0
  1327. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/contracts/FixedSupplyToken.sol +0 -0
  1328. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/deploy_guard.py +0 -0
  1329. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/derivation.py +0 -0
  1330. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/dex_registry.py +0 -0
  1331. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/erc6551.py +0 -0
  1332. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/erc8004.py +0 -0
  1333. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/evm_facts.py +0 -0
  1334. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/factory.py +0 -0
  1335. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/infra_error.py +0 -0
  1336. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/journal_log.py +0 -0
  1337. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/jupiter_v6_schema.py +0 -0
  1338. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/lifi_calldata.py +0 -0
  1339. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/liquidity_guard.py +0 -0
  1340. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/nft_account.py +0 -0
  1341. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/nft_holdings.py +0 -0
  1342. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/onchain.py +0 -0
  1343. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/own_addresses.py +0 -0
  1344. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/policy.py +0 -0
  1345. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/public_identity.py +0 -0
  1346. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/relay_svm.py +0 -0
  1347. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/rpc_response.py +0 -0
  1348. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/signer.py +0 -0
  1349. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/signer_envelope.py +0 -0
  1350. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/simulation.py +0 -0
  1351. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/solana_onchain.py +0 -0
  1352. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/solana_rail.py +0 -0
  1353. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/solana_signer.py +0 -0
  1354. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/solana_simulation.py +0 -0
  1355. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/solana_strays.py +0 -0
  1356. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/solana_swap_bounds.py +0 -0
  1357. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/solana_tx_inspect.py +0 -0
  1358. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/solana_x402.py +0 -0
  1359. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/spl_facts.py +0 -0
  1360. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/spl_token.py +0 -0
  1361. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/submission_journal.py +0 -0
  1362. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/submission_recovery.py +0 -0
  1363. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/submission_release.py +0 -0
  1364. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/submission_store.py +0 -0
  1365. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/token_origin.py +0 -0
  1366. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/token_template.py +0 -0
  1367. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/tokens.py +0 -0
  1368. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/trade_index.py +0 -0
  1369. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/treasury_balance.py +0 -0
  1370. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/tx_guard.py +0 -0
  1371. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/tx_guard_steps/__init__.py +0 -0
  1372. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/tx_guard_steps/context.py +0 -0
  1373. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/tx_guard_steps/measure.py +0 -0
  1374. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/tx_guard_steps/shape.py +0 -0
  1375. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/tx_guard_steps/value.py +0 -0
  1376. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/tx_notify.py +0 -0
  1377. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/univ3_math.py +0 -0
  1378. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/view.py +0 -0
  1379. {polyrob-1.6.0 → polyrob-1.7.0}/core/wallet/x402_expiry.py +0 -0
  1380. {polyrob-1.6.0 → polyrob-1.7.0}/cron/README.md +0 -0
  1381. {polyrob-1.6.0 → polyrob-1.7.0}/cron/__init__.py +0 -0
  1382. {polyrob-1.6.0 → polyrob-1.7.0}/cron/approval_defer.py +0 -0
  1383. {polyrob-1.6.0 → polyrob-1.7.0}/cron/credential_preflight.py +0 -0
  1384. {polyrob-1.6.0 → polyrob-1.7.0}/cron/delivery.py +0 -0
  1385. {polyrob-1.6.0 → polyrob-1.7.0}/cron/owner_rules_overlay.py +0 -0
  1386. {polyrob-1.6.0 → polyrob-1.7.0}/cron/preflight.py +0 -0
  1387. {polyrob-1.6.0 → polyrob-1.7.0}/cron/remedy_streak.py +0 -0
  1388. {polyrob-1.6.0 → polyrob-1.7.0}/cron/rig_edit.py +0 -0
  1389. {polyrob-1.6.0 → polyrob-1.7.0}/cron/room_service.py +0 -0
  1390. {polyrob-1.6.0 → polyrob-1.7.0}/cron/schedule.py +0 -0
  1391. {polyrob-1.6.0 → polyrob-1.7.0}/cron/scheduler.py +0 -0
  1392. {polyrob-1.6.0 → polyrob-1.7.0}/cron/wake_gate.py +0 -0
  1393. {polyrob-1.6.0 → polyrob-1.7.0}/cron/write_job.py +0 -0
  1394. {polyrob-1.6.0 → polyrob-1.7.0}/data/__init__.py +0 -0
  1395. {polyrob-1.6.0 → polyrob-1.7.0}/data/characters/analyst.character.json +0 -0
  1396. {polyrob-1.6.0 → polyrob-1.7.0}/data/characters/coder.character.json +0 -0
  1397. {polyrob-1.6.0 → polyrob-1.7.0}/data/characters/default.character.json +0 -0
  1398. {polyrob-1.6.0 → polyrob-1.7.0}/data/characters/ops.character.json +0 -0
  1399. {polyrob-1.6.0 → polyrob-1.7.0}/data/characters/researcher.character.json +0 -0
  1400. {polyrob-1.6.0 → polyrob-1.7.0}/data/characters/writer.character.json +0 -0
  1401. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/adversarial-consensus/SKILL.md +0 -0
  1402. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/adversarial-consensus/references/round-briefs.md +0 -0
  1403. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/browser-automation/SKILL.md +0 -0
  1404. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/coding-workflow/SKILL.md +0 -0
  1405. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/coding-workflow/references/build-failure-triage.md +0 -0
  1406. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/coding-workflow/references/cleanup-passes.md +0 -0
  1407. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/coding-workflow/references/debugging-method.md +0 -0
  1408. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/coding-workflow/references/review-lenses.md +0 -0
  1409. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/crypto-trading-safety/SKILL.md +0 -0
  1410. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/document-writing/SKILL.md +0 -0
  1411. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/email-comms/SKILL.md +0 -0
  1412. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/file-data-ops/SKILL.md +0 -0
  1413. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/get-paid-for-work/SKILL.md +0 -0
  1414. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/incident-response/SKILL.md +0 -0
  1415. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/incident-response/references/incident-record.md +0 -0
  1416. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/market-research-brief/SKILL.md +0 -0
  1417. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/pay-for-work/SKILL.md +0 -0
  1418. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/person-analyzer/SKILL.md +0 -0
  1419. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/polyrob-user-guide/SKILL.md +0 -0
  1420. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/polyrob-user-guide/references/autonomy.md +0 -0
  1421. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/polyrob-user-guide/references/money-and-safety.md +0 -0
  1422. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/polyrob-user-guide/references/setup-interview.md +0 -0
  1423. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/polyrob-user-guide/references/skills-and-learning.md +0 -0
  1424. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/polyrob-user-guide/references/wallet-and-identity.md +0 -0
  1425. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/post-trade-verify/SKILL.md +0 -0
  1426. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/pre-trade-check/SKILL.md +0 -0
  1427. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/presentation-creator/SKILL.md +0 -0
  1428. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/project-analyzer/SKILL.md +0 -0
  1429. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/secret-handling/SKILL.md +0 -0
  1430. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/skill-authoring/SKILL.md +0 -0
  1431. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/skill-security-review/SKILL.md +0 -0
  1432. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/stable-cash/SKILL.md +0 -0
  1433. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/task-planning/SKILL.md +0 -0
  1434. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/treasury-trading/references/chains.md +0 -0
  1435. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/treasury-trading/references/learning-the-meta.md +0 -0
  1436. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/treasury-trading/references/nfts.md +0 -0
  1437. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/web-research/SKILL.md +0 -0
  1438. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/skills/x402-pay/SKILL.md +0 -0
  1439. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/actions.md +0 -0
  1440. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/agency.md +0 -0
  1441. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/communication.md +0 -0
  1442. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/communication_contract.md +0 -0
  1443. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/filesystem.md +0 -0
  1444. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/identity.md +0 -0
  1445. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/input_format.md +0 -0
  1446. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/message_shape.md +0 -0
  1447. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/owner_instructions.md +0 -0
  1448. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/response_format.md +0 -0
  1449. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/rules.md +0 -0
  1450. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/security.md +0 -0
  1451. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/source_precedence.md +0 -0
  1452. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/subtask_delegation.md +0 -0
  1453. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/surface.md +0 -0
  1454. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/using_your_tools.md +0 -0
  1455. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/vision.md +0 -0
  1456. {polyrob-1.6.0 → polyrob-1.7.0}/data/prompts/system/web_access.md +0 -0
  1457. {polyrob-1.6.0 → polyrob-1.7.0}/data/subscription_channels.json +0 -0
  1458. {polyrob-1.6.0 → polyrob-1.7.0}/datagen/__init__.py +0 -0
  1459. {polyrob-1.6.0 → polyrob-1.7.0}/datagen/assemble.py +0 -0
  1460. {polyrob-1.6.0 → polyrob-1.7.0}/datagen/batch_runner.py +0 -0
  1461. {polyrob-1.6.0 → polyrob-1.7.0}/datagen/bulk_export.py +0 -0
  1462. {polyrob-1.6.0 → polyrob-1.7.0}/datagen/capture.py +0 -0
  1463. {polyrob-1.6.0 → polyrob-1.7.0}/datagen/formats.py +0 -0
  1464. {polyrob-1.6.0 → polyrob-1.7.0}/datagen/record.py +0 -0
  1465. {polyrob-1.6.0 → polyrob-1.7.0}/datagen/scrub.py +0 -0
  1466. {polyrob-1.6.0 → polyrob-1.7.0}/datagen/toolset_distributions.py +0 -0
  1467. {polyrob-1.6.0 → polyrob-1.7.0}/docs/guide/migration/README.md +0 -0
  1468. {polyrob-1.6.0 → polyrob-1.7.0}/docs/guide/rails-verification.md +0 -0
  1469. {polyrob-1.6.0 → polyrob-1.7.0}/migrations/__init__.py +0 -0
  1470. {polyrob-1.6.0 → polyrob-1.7.0}/migrations/boot.py +0 -0
  1471. {polyrob-1.6.0 → polyrob-1.7.0}/migrations/migrate.py +0 -0
  1472. {polyrob-1.6.0 → polyrob-1.7.0}/migrations/versions/__init__.py +0 -0
  1473. {polyrob-1.6.0 → polyrob-1.7.0}/migrations/versions/v1_0_0_baseline.py +0 -0
  1474. {polyrob-1.6.0 → polyrob-1.7.0}/migrations/versions/v1_10_0_usage_records_cache_creation.py +0 -0
  1475. {polyrob-1.6.0 → polyrob-1.7.0}/migrations/versions/v1_1_0_user_mcp_servers.py +0 -0
  1476. {polyrob-1.6.0 → polyrob-1.7.0}/migrations/versions/v1_2_0_den_token_bonuses.py +0 -0
  1477. {polyrob-1.6.0 → polyrob-1.7.0}/migrations/versions/v1_3_0_billing_failures.py +0 -0
  1478. {polyrob-1.6.0 → polyrob-1.7.0}/migrations/versions/v1_4_0_polymarket_credentials.py +0 -0
  1479. {polyrob-1.6.0 → polyrob-1.7.0}/migrations/versions/v1_5_0_usage_records_request_id.py +0 -0
  1480. {polyrob-1.6.0 → polyrob-1.7.0}/migrations/versions/v1_6_0_x402_tx_hash_unique.py +0 -0
  1481. {polyrob-1.6.0 → polyrob-1.7.0}/migrations/versions/v1_7_0_x402_subscription_pending_unique.py +0 -0
  1482. {polyrob-1.6.0 → polyrob-1.7.0}/migrations/versions/v1_8_0_x402_tx_hash_case_normalize.py +0 -0
  1483. {polyrob-1.6.0 → polyrob-1.7.0}/migrations/versions/v1_9_0_x402_payment_asset_columns.py +0 -0
  1484. {polyrob-1.6.0 → polyrob-1.7.0}/modules/README.md +0 -0
  1485. {polyrob-1.6.0 → polyrob-1.7.0}/modules/__init__.py +0 -0
  1486. {polyrob-1.6.0 → polyrob-1.7.0}/modules/auth/__init__.py +0 -0
  1487. {polyrob-1.6.0 → polyrob-1.7.0}/modules/auth/siwe_auth.py +0 -0
  1488. {polyrob-1.6.0 → polyrob-1.7.0}/modules/avatar/__init__.py +0 -0
  1489. {polyrob-1.6.0 → polyrob-1.7.0}/modules/avatar/push.py +0 -0
  1490. {polyrob-1.6.0 → polyrob-1.7.0}/modules/base_module.py +0 -0
  1491. {polyrob-1.6.0 → polyrob-1.7.0}/modules/cards/__init__.py +0 -0
  1492. {polyrob-1.6.0 → polyrob-1.7.0}/modules/credits/__init__.py +0 -0
  1493. {polyrob-1.6.0 → polyrob-1.7.0}/modules/credits/balance_manager.py +0 -0
  1494. {polyrob-1.6.0 → polyrob-1.7.0}/modules/credits/balances.py +0 -0
  1495. {polyrob-1.6.0 → polyrob-1.7.0}/modules/credits/cost_utils.py +0 -0
  1496. {polyrob-1.6.0 → polyrob-1.7.0}/modules/credits/pricing.py +0 -0
  1497. {polyrob-1.6.0 → polyrob-1.7.0}/modules/credits/reservations.py +0 -0
  1498. {polyrob-1.6.0 → polyrob-1.7.0}/modules/credits/unified_ledger.py +0 -0
  1499. {polyrob-1.6.0 → polyrob-1.7.0}/modules/credits/usage_rollup.py +0 -0
  1500. {polyrob-1.6.0 → polyrob-1.7.0}/modules/credits/usage_tracker.py +0 -0
  1501. {polyrob-1.6.0 → polyrob-1.7.0}/modules/database/__init__.py +0 -0
  1502. {polyrob-1.6.0 → polyrob-1.7.0}/modules/database/audit_log.py +0 -0
  1503. {polyrob-1.6.0 → polyrob-1.7.0}/modules/database/auth_tables.py +0 -0
  1504. {polyrob-1.6.0 → polyrob-1.7.0}/modules/database/connection.py +0 -0
  1505. {polyrob-1.6.0 → polyrob-1.7.0}/modules/database/conversation_contexts.py +0 -0
  1506. {polyrob-1.6.0 → polyrob-1.7.0}/modules/database/database_manager.py +0 -0
  1507. {polyrob-1.6.0 → polyrob-1.7.0}/modules/database/user_mcp_servers.py +0 -0
  1508. {polyrob-1.6.0 → polyrob-1.7.0}/modules/database/x402_tables.py +0 -0
  1509. {polyrob-1.6.0 → polyrob-1.7.0}/modules/eip8004/README.md +0 -0
  1510. {polyrob-1.6.0 → polyrob-1.7.0}/modules/eip8004/__init__.py +0 -0
  1511. {polyrob-1.6.0 → polyrob-1.7.0}/modules/eip8004/contracts.py +0 -0
  1512. {polyrob-1.6.0 → polyrob-1.7.0}/modules/eip8004/feedback_replays.py +0 -0
  1513. {polyrob-1.6.0 → polyrob-1.7.0}/modules/eip8004/models.py +0 -0
  1514. {polyrob-1.6.0 → polyrob-1.7.0}/modules/eip8004/payment_proof.py +0 -0
  1515. {polyrob-1.6.0 → polyrob-1.7.0}/modules/eip8004/registration.py +0 -0
  1516. {polyrob-1.6.0 → polyrob-1.7.0}/modules/eip8004/reputation.py +0 -0
  1517. {polyrob-1.6.0 → polyrob-1.7.0}/modules/eip8004/validation.py +0 -0
  1518. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/anthropic_client.py +0 -0
  1519. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/anthropic_images.py +0 -0
  1520. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/anthropic_sampling.py +0 -0
  1521. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/aux_metering.py +0 -0
  1522. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/billing_guard.py +0 -0
  1523. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/brain_scrubber.py +0 -0
  1524. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/cache_hints.py +0 -0
  1525. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/compat_anthropic.py +0 -0
  1526. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/compat_clients.py +0 -0
  1527. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/credit_errors.py +0 -0
  1528. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/deferred_tools.py +0 -0
  1529. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/gemini_client.py +0 -0
  1530. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/gemini_parts.py +0 -0
  1531. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/llm_client.py +0 -0
  1532. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/manager_inventory.py +0 -0
  1533. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/messages.py +0 -0
  1534. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/model_catalog_recent.py +0 -0
  1535. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/model_pricing.py +0 -0
  1536. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/model_types.py +0 -0
  1537. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/nvidia_client.py +0 -0
  1538. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/openai_client.py +0 -0
  1539. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/openrouter_client.py +0 -0
  1540. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/openrouter_routing.py +0 -0
  1541. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/output_budget.py +0 -0
  1542. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/prefix_stamp.py +0 -0
  1543. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/recovery_boundary.py +0 -0
  1544. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/responses_client.py +0 -0
  1545. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/retry_log.py +0 -0
  1546. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/sdk_caps.py +0 -0
  1547. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/seat_probe.py +0 -0
  1548. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/think_scrubber.py +0 -0
  1549. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/token_counter.py +0 -0
  1550. {polyrob-1.6.0 → polyrob-1.7.0}/modules/llm/usage_extract.py +0 -0
  1551. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/__init__.py +0 -0
  1552. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/backend_factory.py +0 -0
  1553. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/cache_manager.py +0 -0
  1554. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/episodic.py +0 -0
  1555. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/fts_terms.py +0 -0
  1556. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/local_vector_memory_provider.py +0 -0
  1557. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/memory_manager.py +0 -0
  1558. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/provider.py +0 -0
  1559. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/recall_consolidation.py +0 -0
  1560. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/registry.py +0 -0
  1561. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/retention.py +0 -0
  1562. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/scope.py +0 -0
  1563. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/sqlite_curated_store.py +0 -0
  1564. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/sqlite_episodes_store.py +0 -0
  1565. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/sqlite_kb_store.py +0 -0
  1566. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/sqlite_memory_provider.py +0 -0
  1567. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/sqlite_recall.py +0 -0
  1568. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/sqlite_scope_store.py +0 -0
  1569. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/storage_limits.py +0 -0
  1570. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/task/__init__.py +0 -0
  1571. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/task/context_retriever.py +0 -0
  1572. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/task/hierarchical_memory.py +0 -0
  1573. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/task/lexical_retriever.py +0 -0
  1574. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/task/null_context_manager.py +0 -0
  1575. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/task/phase_manager.py +0 -0
  1576. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/task/reflection_service.py +0 -0
  1577. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/task/semantic_retriever.py +0 -0
  1578. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/task/task_context_manager.py +0 -0
  1579. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/task/threat_scan.py +0 -0
  1580. {polyrob-1.6.0 → polyrob-1.7.0}/modules/memory/wikilinks.py +0 -0
  1581. {polyrob-1.6.0 → polyrob-1.7.0}/modules/payments/__init__.py +0 -0
  1582. {polyrob-1.6.0 → polyrob-1.7.0}/modules/payments/deposit_monitor.py +0 -0
  1583. {polyrob-1.6.0 → polyrob-1.7.0}/modules/payments/networks.py +0 -0
  1584. {polyrob-1.6.0 → polyrob-1.7.0}/modules/payments/price_oracle.py +0 -0
  1585. {polyrob-1.6.0 → polyrob-1.7.0}/modules/payments/treasury_sweeper.py +0 -0
  1586. {polyrob-1.6.0 → polyrob-1.7.0}/modules/payments/wallet_generator.py +0 -0
  1587. {polyrob-1.6.0 → polyrob-1.7.0}/modules/skills/__init__.py +0 -0
  1588. {polyrob-1.6.0 → polyrob-1.7.0}/modules/skills/migration.py +0 -0
  1589. {polyrob-1.6.0 → polyrob-1.7.0}/modules/skills/seed.py +0 -0
  1590. {polyrob-1.6.0 → polyrob-1.7.0}/modules/skills/skill_usage.py +0 -0
  1591. {polyrob-1.6.0 → polyrob-1.7.0}/modules/skills/writer.py +0 -0
  1592. {polyrob-1.6.0 → polyrob-1.7.0}/modules/transcription/__init__.py +0 -0
  1593. {polyrob-1.6.0 → polyrob-1.7.0}/modules/transcription/base.py +0 -0
  1594. {polyrob-1.6.0 → polyrob-1.7.0}/modules/transcription/faster_whisper_transcriber.py +0 -0
  1595. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/README.md +0 -0
  1596. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/__init__.py +0 -0
  1597. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/_db.py +0 -0
  1598. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/artifact.py +0 -0
  1599. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/facilitator.py +0 -0
  1600. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/inbound_receipts.py +0 -0
  1601. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/income_chains.py +0 -0
  1602. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/invoice_assets.py +0 -0
  1603. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/invoice_sizing.py +0 -0
  1604. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/invoice_status.py +0 -0
  1605. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/invoicing.py +0 -0
  1606. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/invoicing_note.py +0 -0
  1607. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/middleware.py +0 -0
  1608. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/onchain_probe.py +0 -0
  1609. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/response_outcome.py +0 -0
  1610. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/settlement_attempt.py +0 -0
  1611. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/settlement_holds.py +0 -0
  1612. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/settlement_notify.py +0 -0
  1613. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/settlement_reputation.py +0 -0
  1614. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/settlement_scan.py +0 -0
  1615. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/settlement_subscriptions.py +0 -0
  1616. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/settlement_watcher.py +0 -0
  1617. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/solana_settlement.py +0 -0
  1618. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/subscriptions.py +0 -0
  1619. {polyrob-1.6.0 → polyrob-1.7.0}/modules/x402/x402_integration.py +0 -0
  1620. {polyrob-1.6.0 → polyrob-1.7.0}/packs/daytona/polyrob_daytona/__init__.py +0 -0
  1621. {polyrob-1.6.0 → polyrob-1.7.0}/packs/daytona/polyrob_daytona/backend.py +0 -0
  1622. {polyrob-1.6.0 → polyrob-1.7.0}/packs/daytona/polyrob_daytona/pack.toml +0 -0
  1623. {polyrob-1.6.0 → polyrob-1.7.0}/packs/discovery/polyrob_discovery/__init__.py +0 -0
  1624. {polyrob-1.6.0 → polyrob-1.7.0}/packs/discovery/polyrob_discovery/anysite/__init__.py +0 -0
  1625. {polyrob-1.6.0 → polyrob-1.7.0}/packs/discovery/polyrob_discovery/anysite/client.py +0 -0
  1626. {polyrob-1.6.0 → polyrob-1.7.0}/packs/discovery/polyrob_discovery/anysite/tool.py +0 -0
  1627. {polyrob-1.6.0 → polyrob-1.7.0}/packs/discovery/polyrob_discovery/pack.toml +0 -0
  1628. {polyrob-1.6.0 → polyrob-1.7.0}/packs/discovery/polyrob_discovery/perplexity.py +0 -0
  1629. {polyrob-1.6.0 → polyrob-1.7.0}/packs/discovery/polyrob_discovery/skills/lead-research/SKILL.md +0 -0
  1630. {polyrob-1.6.0 → polyrob-1.7.0}/packs/discovery/polyrob_discovery/skills/web-scraping/SKILL.md +0 -0
  1631. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/__init__.py +0 -0
  1632. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/http_seat.py +0 -0
  1633. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/hyperliquid/__init__.py +0 -0
  1634. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/hyperliquid/api_models.py +0 -0
  1635. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/hyperliquid/models.py +0 -0
  1636. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/hyperliquid/remote_signing.py +0 -0
  1637. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/hyperliquid/routes.py +0 -0
  1638. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/hyperliquid/service.py +0 -0
  1639. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/hyperliquid/store.py +0 -0
  1640. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/hyperliquid/store_models.py +0 -0
  1641. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/order_safety.py +0 -0
  1642. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/order_submission.py +0 -0
  1643. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/pack.toml +0 -0
  1644. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/polymarket/__init__.py +0 -0
  1645. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/polymarket/api_models.py +0 -0
  1646. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/polymarket/clob_adapter.py +0 -0
  1647. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/polymarket/fees.py +0 -0
  1648. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/polymarket/models.py +0 -0
  1649. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/polymarket/routes.py +0 -0
  1650. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/polymarket/service.py +0 -0
  1651. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/polymarket/store.py +0 -0
  1652. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/polymarket/store_models.py +0 -0
  1653. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/registration.py +0 -0
  1654. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/risk_limits.py +0 -0
  1655. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/skills/hyperliquid-account-review/SKILL.md +0 -0
  1656. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/skills/hyperliquid-market-data/SKILL.md +0 -0
  1657. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/skills/hyperliquid-trading/SKILL.md +0 -0
  1658. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/skills/polymarket-market-research/SKILL.md +0 -0
  1659. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/skills/polymarket-portfolio-review/SKILL.md +0 -0
  1660. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/skills/polymarket-trading/SKILL.md +0 -0
  1661. {polyrob-1.6.0 → polyrob-1.7.0}/packs/markets/polyrob_markets/trade_gate.py +0 -0
  1662. {polyrob-1.6.0 → polyrob-1.7.0}/packs/modal/polyrob_modal/__init__.py +0 -0
  1663. {polyrob-1.6.0 → polyrob-1.7.0}/packs/modal/polyrob_modal/backend.py +0 -0
  1664. {polyrob-1.6.0 → polyrob-1.7.0}/packs/modal/polyrob_modal/pack.toml +0 -0
  1665. {polyrob-1.6.0 → polyrob-1.7.0}/packs/singularity/polyrob_singularity/__init__.py +0 -0
  1666. {polyrob-1.6.0 → polyrob-1.7.0}/packs/singularity/polyrob_singularity/backend.py +0 -0
  1667. {polyrob-1.6.0 → polyrob-1.7.0}/packs/singularity/polyrob_singularity/pack.toml +0 -0
  1668. {polyrob-1.6.0 → polyrob-1.7.0}/packs/vercel_sandbox/polyrob_vercel_sandbox/__init__.py +0 -0
  1669. {polyrob-1.6.0 → polyrob-1.7.0}/packs/vercel_sandbox/polyrob_vercel_sandbox/backend.py +0 -0
  1670. {polyrob-1.6.0 → polyrob-1.7.0}/packs/vercel_sandbox/polyrob_vercel_sandbox/pack.toml +0 -0
  1671. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/__init__.py +0 -0
  1672. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/commands/__init__.py +0 -0
  1673. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/commands/x.py +0 -0
  1674. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/commands/x_account.py +0 -0
  1675. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/console_routes.py +0 -0
  1676. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/dm_watermark.py +0 -0
  1677. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/gate_reason.py +0 -0
  1678. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/handle_ids.py +0 -0
  1679. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/owner_verbs.py +0 -0
  1680. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/pack.toml +0 -0
  1681. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/post_spacing.py +0 -0
  1682. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/registration.py +0 -0
  1683. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/skills/social-discovery/SKILL.md +0 -0
  1684. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/status.py +0 -0
  1685. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/surface/__init__.py +0 -0
  1686. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/surface/client.py +0 -0
  1687. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/surface/harness.py +0 -0
  1688. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/surface/launch.py +0 -0
  1689. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/surface/poller.py +0 -0
  1690. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/surface/probe.py +0 -0
  1691. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/surface/surface.py +0 -0
  1692. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/write_budget.py +0 -0
  1693. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/x_browser/__init__.py +0 -0
  1694. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/x_browser/driver.py +0 -0
  1695. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/x_browser/escalation.py +0 -0
  1696. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/x_browser/registration.py +0 -0
  1697. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/x_browser/session_store.py +0 -0
  1698. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/x_browser/signup.py +0 -0
  1699. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/x_browser/tool.py +0 -0
  1700. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/x_chat_client.py +0 -0
  1701. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/x_login_flow.py +0 -0
  1702. {polyrob-1.6.0 → polyrob-1.7.0}/packs/x/polyrob_x/x_oauth2.py +0 -0
  1703. {polyrob-1.6.0 → polyrob-1.7.0}/polyrob/__init__.py +0 -0
  1704. {polyrob-1.6.0 → polyrob-1.7.0}/polyrob/app/__init__.py +0 -0
  1705. {polyrob-1.6.0 → polyrob-1.7.0}/polyrob/app/bot.py +0 -0
  1706. {polyrob-1.6.0 → polyrob-1.7.0}/polyrob/app/card_wake.py +0 -0
  1707. {polyrob-1.6.0 → polyrob-1.7.0}/polyrob/sdk.py +0 -0
  1708. {polyrob-1.6.0 → polyrob-1.7.0}/polyrob.egg-info/dependency_links.txt +0 -0
  1709. {polyrob-1.6.0 → polyrob-1.7.0}/polyrob.egg-info/entry_points.txt +0 -0
  1710. {polyrob-1.6.0 → polyrob-1.7.0}/polyrob.egg-info/top_level.txt +0 -0
  1711. {polyrob-1.6.0 → polyrob-1.7.0}/setup.cfg +0 -0
  1712. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/README.md +0 -0
  1713. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/__init__.py +0 -0
  1714. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/_actor.py +0 -0
  1715. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/_launch.py +0 -0
  1716. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/_probe.py +0 -0
  1717. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/_shared.py +0 -0
  1718. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/card_builder.py +0 -0
  1719. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/dingtalk/__init__.py +0 -0
  1720. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/dingtalk/client.py +0 -0
  1721. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/dingtalk/events.py +0 -0
  1722. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/dingtalk/harness.py +0 -0
  1723. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/dingtalk/launch.py +0 -0
  1724. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/dingtalk/probe.py +0 -0
  1725. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/dingtalk/stream.py +0 -0
  1726. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/dingtalk/surface.py +0 -0
  1727. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/discord/__init__.py +0 -0
  1728. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/discord/client.py +0 -0
  1729. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/discord/gateway.py +0 -0
  1730. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/discord/harness.py +0 -0
  1731. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/discord/launch.py +0 -0
  1732. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/discord/probe.py +0 -0
  1733. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/discord/surface.py +0 -0
  1734. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/email/__init__.py +0 -0
  1735. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/email/dedup.py +0 -0
  1736. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/email/fetchers.py +0 -0
  1737. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/email/harness.py +0 -0
  1738. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/email/inbound.py +0 -0
  1739. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/email/launch.py +0 -0
  1740. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/email/probe.py +0 -0
  1741. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/email/surface.py +0 -0
  1742. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/feishu/__init__.py +0 -0
  1743. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/feishu/cards.py +0 -0
  1744. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/feishu/client.py +0 -0
  1745. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/feishu/events.py +0 -0
  1746. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/feishu/harness.py +0 -0
  1747. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/feishu/launch.py +0 -0
  1748. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/feishu/probe.py +0 -0
  1749. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/feishu/surface.py +0 -0
  1750. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/feishu/webhook.py +0 -0
  1751. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/feishu/ws.py +0 -0
  1752. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/inbox_sources.py +0 -0
  1753. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/signal/__init__.py +0 -0
  1754. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/signal/client.py +0 -0
  1755. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/signal/harness.py +0 -0
  1756. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/signal/launch.py +0 -0
  1757. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/signal/probe.py +0 -0
  1758. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/signal/surface.py +0 -0
  1759. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/slack/__init__.py +0 -0
  1760. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/slack/client.py +0 -0
  1761. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/slack/harness.py +0 -0
  1762. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/slack/launch.py +0 -0
  1763. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/slack/probe.py +0 -0
  1764. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/slack/socket_mode.py +0 -0
  1765. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/slack/surface.py +0 -0
  1766. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/__init__.py +0 -0
  1767. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/actions.py +0 -0
  1768. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/approval_ops.py +0 -0
  1769. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/apps_ops.py +0 -0
  1770. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/card_ops.py +0 -0
  1771. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/check_ops.py +0 -0
  1772. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/claim_ops.py +0 -0
  1773. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/contacts_ops.py +0 -0
  1774. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/dapp_ops.py +0 -0
  1775. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/dedup.py +0 -0
  1776. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/dev_rail.py +0 -0
  1777. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/group_ops.py +0 -0
  1778. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/history_ops.py +0 -0
  1779. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/holdings_ops.py +0 -0
  1780. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/inbound.py +0 -0
  1781. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/interactive_tools.py +0 -0
  1782. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/job_ops.py +0 -0
  1783. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/kb_ops.py +0 -0
  1784. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/launch.py +0 -0
  1785. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/lp_ops.py +0 -0
  1786. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/media.py +0 -0
  1787. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/moderation.py +0 -0
  1788. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/pay_ops.py +0 -0
  1789. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/poll_backoff.py +0 -0
  1790. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/poll_batch.py +0 -0
  1791. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/probe.py +0 -0
  1792. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/rate_limit.py +0 -0
  1793. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/room_moderator.py +0 -0
  1794. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/room_turn.py +0 -0
  1795. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/send_ops.py +0 -0
  1796. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/skills_ops.py +0 -0
  1797. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/status_ops.py +0 -0
  1798. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/surface.py +0 -0
  1799. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/swap_ops.py +0 -0
  1800. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/triggers.py +0 -0
  1801. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/usage_ops.py +0 -0
  1802. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/voice.py +0 -0
  1803. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/telegram/why_ops.py +0 -0
  1804. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/whatsapp/__init__.py +0 -0
  1805. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/whatsapp/client.py +0 -0
  1806. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/whatsapp/harness.py +0 -0
  1807. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/whatsapp/inbound.py +0 -0
  1808. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/whatsapp/launch.py +0 -0
  1809. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/whatsapp/probe.py +0 -0
  1810. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/whatsapp/surface.py +0 -0
  1811. {polyrob-1.6.0 → polyrob-1.7.0}/surfaces/whatsapp/window.py +0 -0
  1812. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_a2a_protocol.py +0 -0
  1813. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_accessibility_snapshot.py +0 -0
  1814. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_autonomy_control_ratchet.py +0 -0
  1815. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_base_deps_ratchet.py +0 -0
  1816. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_bool_env_parse_ratchet.py +0 -0
  1817. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_browser_launch_ratchet.py +0 -0
  1818. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_changelog_release.py +0 -0
  1819. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_collection_roots.py +0 -0
  1820. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_config_doc_work_item_ids.py +0 -0
  1821. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_conftest_operator_env_guard.py +0 -0
  1822. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_constants_shim_ratchet.py +0 -0
  1823. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_core_platform_boundary.py +0 -0
  1824. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_core_server_boundary.py +0 -0
  1825. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_dynamic_pricing.py +0 -0
  1826. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_embedder_needed.py +0 -0
  1827. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_event_kind_contract.py +0 -0
  1828. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_flag_retirement.py +0 -0
  1829. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_foundation_order_ratchet.py +0 -0
  1830. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_gemini_fixes.py +0 -0
  1831. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_harness_actor_claims_ratchet.py +0 -0
  1832. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_history_mutation_ratchet.py +0 -0
  1833. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_home_binding_ratchet.py +0 -0
  1834. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_import_layering.py +0 -0
  1835. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_imports_declared.py +0 -0
  1836. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_instruction_surface_ratchet.py +0 -0
  1837. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_knowledge_section_ratchet.py +0 -0
  1838. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_layering_ratchet.py +0 -0
  1839. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_lazy_embedder.py +0 -0
  1840. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_limit_single_source_ratchet.py +0 -0
  1841. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_llm_timeout_ssot.py +0 -0
  1842. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_mcp_tool_fix.py +0 -0
  1843. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_numeric_env_parse_ratchet.py +0 -0
  1844. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_operator_pin_reader_ratchet.py +0 -0
  1845. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_owner_context_ratchet.py +0 -0
  1846. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_pack_sdk_facade.py +0 -0
  1847. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_paid_room_action_ratchet.py +0 -0
  1848. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_path_ratchet.py +0 -0
  1849. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_private_cleanup_ratchet.py +0 -0
  1850. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_provider_registry_ratchet.py +0 -0
  1851. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_public_docs_links.py +0 -0
  1852. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_public_files_present.py +0 -0
  1853. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_public_release_surface.py +0 -0
  1854. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_rate_limiter_ratchet.py +0 -0
  1855. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_remedy_grammar_ratchet.py +0 -0
  1856. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_rename_tail.py +0 -0
  1857. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_retired_pack_dist_names_ratchet.py +0 -0
  1858. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_rule_render_ratchet.py +0 -0
  1859. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_runtime_text_names_no_private_file.py +0 -0
  1860. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_schema_version.py +0 -0
  1861. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_step_budget_ratchet.py +0 -0
  1862. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_supply_format_ratchet.py +0 -0
  1863. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_verb_kind_drift_ratchet.py +0 -0
  1864. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_verb_policy_literal_ratchet.py +0 -0
  1865. {polyrob-1.6.0 → polyrob-1.7.0}/tests/test_version_consistency.py +0 -0
  1866. {polyrob-1.6.0 → polyrob-1.7.0}/tools/agent_nft/__init__.py +0 -0
  1867. {polyrob-1.6.0 → polyrob-1.7.0}/tools/agent_nft/adopt.py +0 -0
  1868. {polyrob-1.6.0 → polyrob-1.7.0}/tools/agent_nft/core_verbs.py +0 -0
  1869. {polyrob-1.6.0 → polyrob-1.7.0}/tools/agent_nft/guarded.py +0 -0
  1870. {polyrob-1.6.0 → polyrob-1.7.0}/tools/agent_nft/journal_write.py +0 -0
  1871. {polyrob-1.6.0 → polyrob-1.7.0}/tools/agent_nft/registration.py +0 -0
  1872. {polyrob-1.6.0 → polyrob-1.7.0}/tools/agent_nft/reveal.py +0 -0
  1873. {polyrob-1.6.0 → polyrob-1.7.0}/tools/app_service/__init__.py +0 -0
  1874. {polyrob-1.6.0 → polyrob-1.7.0}/tools/app_service/tool.py +0 -0
  1875. {polyrob-1.6.0 → polyrob-1.7.0}/tools/avatar_sources.py +0 -0
  1876. {polyrob-1.6.0 → polyrob-1.7.0}/tools/browser/__init__.py +0 -0
  1877. {polyrob-1.6.0 → polyrob-1.7.0}/tools/browser/_flags.py +0 -0
  1878. {polyrob-1.6.0 → polyrob-1.7.0}/tools/browser/actions.py +0 -0
  1879. {polyrob-1.6.0 → polyrob-1.7.0}/tools/browser/browser.py +0 -0
  1880. {polyrob-1.6.0 → polyrob-1.7.0}/tools/browser/browser_manager.py +0 -0
  1881. {polyrob-1.6.0 → polyrob-1.7.0}/tools/browser/child_env.py +0 -0
  1882. {polyrob-1.6.0 → polyrob-1.7.0}/tools/browser/context.py +0 -0
  1883. {polyrob-1.6.0 → polyrob-1.7.0}/tools/browser/downloads.py +0 -0
  1884. {polyrob-1.6.0 → polyrob-1.7.0}/tools/browser/launch_security.py +0 -0
  1885. {polyrob-1.6.0 → polyrob-1.7.0}/tools/browser/nav_schemes.py +0 -0
  1886. {polyrob-1.6.0 → polyrob-1.7.0}/tools/browser/playwright_utils.py +0 -0
  1887. {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/SANDBOX_SECURITY.md +0 -0
  1888. {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/__init__.py +0 -0
  1889. {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/backend.py +0 -0
  1890. {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/backend_cache.py +0 -0
  1891. {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/backends/__init__.py +0 -0
  1892. {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/backends/_proc.py +0 -0
  1893. {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/backends/bounded_capture.py +0 -0
  1894. {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/backends/docker.py +0 -0
  1895. {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/backends/local_subprocess.py +0 -0
  1896. {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/backends/remote_sandbox.py +0 -0
  1897. {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/backends/ssh.py +0 -0
  1898. {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/egress_proxy.py +0 -0
  1899. {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/env_policy.py +0 -0
  1900. {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/kernel.py +0 -0
  1901. {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/limits.py +0 -0
  1902. {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/pack_backends.py +0 -0
  1903. {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/result.py +0 -0
  1904. {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/sandbox_guard.py +0 -0
  1905. {polyrob-1.6.0 → polyrob-1.7.0}/tools/code_exec/tool_rpc.py +0 -0
  1906. {polyrob-1.6.0 → polyrob-1.7.0}/tools/coding/__init__.py +0 -0
  1907. {polyrob-1.6.0 → polyrob-1.7.0}/tools/coding/edit.py +0 -0
  1908. {polyrob-1.6.0 → polyrob-1.7.0}/tools/coding/lsp.py +0 -0
  1909. {polyrob-1.6.0 → polyrob-1.7.0}/tools/coding/search.py +0 -0
  1910. {polyrob-1.6.0 → polyrob-1.7.0}/tools/coding/snapshot.py +0 -0
  1911. {polyrob-1.6.0 → polyrob-1.7.0}/tools/coding/textio.py +0 -0
  1912. {polyrob-1.6.0 → polyrob-1.7.0}/tools/coding/tool.py +0 -0
  1913. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/__init__.py +0 -0
  1914. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/_helpers.py +0 -0
  1915. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/approval.py +0 -0
  1916. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/approval_interactive.py +0 -0
  1917. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/autonomy_control_action.py +0 -0
  1918. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/avatar_action.py +0 -0
  1919. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/card_actions.py +0 -0
  1920. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/command_guard_hook.py +0 -0
  1921. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/doc_authoring.py +0 -0
  1922. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/effect_hooks.py +0 -0
  1923. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/emit.py +0 -0
  1924. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/grant_card.py +0 -0
  1925. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/hooks.py +0 -0
  1926. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/insights_action.py +0 -0
  1927. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/message_delete.py +0 -0
  1928. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/message_send.py +0 -0
  1929. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/owner_ask_action.py +0 -0
  1930. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/policy_chain.py +0 -0
  1931. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/registry/__init__.py +0 -0
  1932. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/registry/arg_cleanup.py +0 -0
  1933. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/registry/schema_generators.py +0 -0
  1934. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/registry/schema_sanitizer.py +0 -0
  1935. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/registry/service.py +0 -0
  1936. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/room_moderate_action.py +0 -0
  1937. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/room_read_action.py +0 -0
  1938. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/self_transfer.py +0 -0
  1939. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/skill_manage.py +0 -0
  1940. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/tool_call_bridge.py +0 -0
  1941. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/tool_error_class.py +0 -0
  1942. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/tool_load_report.py +0 -0
  1943. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/tool_search_actions.py +0 -0
  1944. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/turn_origin.py +0 -0
  1945. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/views.py +0 -0
  1946. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/wallet_authority.py +0 -0
  1947. {polyrob-1.6.0 → polyrob-1.7.0}/tools/controller/worker_manage_action.py +0 -0
  1948. {polyrob-1.6.0 → polyrob-1.7.0}/tools/credential_cache.py +0 -0
  1949. {polyrob-1.6.0 → polyrob-1.7.0}/tools/dapp_browser/__init__.py +0 -0
  1950. {polyrob-1.6.0 → polyrob-1.7.0}/tools/dapp_browser/js.py +0 -0
  1951. {polyrob-1.6.0 → polyrob-1.7.0}/tools/dapp_browser/registration.py +0 -0
  1952. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/__init__.py +0 -0
  1953. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/account_mode.py +0 -0
  1954. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/agent_registration.py +0 -0
  1955. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/approve_verb.py +0 -0
  1956. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/bridge_evm_leg.py +0 -0
  1957. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/bridge_price.py +0 -0
  1958. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/bridge_token_origin.py +0 -0
  1959. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/bridge_verb.py +0 -0
  1960. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/call_verb.py +0 -0
  1961. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/data_chain_reads.py +0 -0
  1962. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/data_lp.py +0 -0
  1963. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/data_quote.py +0 -0
  1964. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/deploy_verb.py +0 -0
  1965. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/lp_abi.py +0 -0
  1966. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/lp_reads.py +0 -0
  1967. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/lp_receipts.py +0 -0
  1968. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/lp_v4_verbs.py +0 -0
  1969. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/lp_valuation.py +0 -0
  1970. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/lp_verbs.py +0 -0
  1971. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/nft_verbs.py +0 -0
  1972. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/payment_quote.py +0 -0
  1973. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/pool_metrics.py +0 -0
  1974. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/pool_screen.py +0 -0
  1975. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/price_sources.py +0 -0
  1976. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/providers/__init__.py +0 -0
  1977. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/providers/_http.py +0 -0
  1978. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/providers/dexscreener.py +0 -0
  1979. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/providers/jupiter.py +0 -0
  1980. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/providers/jupiter_price.py +0 -0
  1981. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/providers/relay_bridge.py +0 -0
  1982. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/providers/routes/__init__.py +0 -0
  1983. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/providers/routes/lifi.py +0 -0
  1984. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/providers/routes/univ3_route.py +0 -0
  1985. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/providers/univ3.py +0 -0
  1986. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/receipt_wait.py +0 -0
  1987. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/refusal_repeat.py +0 -0
  1988. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/send_order.py +0 -0
  1989. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/signer_entry.py +0 -0
  1990. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/solana_rail_adapters.py +0 -0
  1991. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/solana_send_verb.py +0 -0
  1992. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/spl_deploy_verb.py +0 -0
  1993. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/token_identity_ask.py +0 -0
  1994. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/transfer_verb.py +0 -0
  1995. {polyrob-1.6.0 → polyrob-1.7.0}/tools/defi/wrap_verb.py +0 -0
  1996. {polyrob-1.6.0 → polyrob-1.7.0}/tools/document_parser.py +0 -0
  1997. {polyrob-1.6.0 → polyrob-1.7.0}/tools/document_worker.py +0 -0
  1998. {polyrob-1.6.0 → polyrob-1.7.0}/tools/dom/__init__.py +0 -0
  1999. {polyrob-1.6.0 → polyrob-1.7.0}/tools/dom/buildDomTree.js +0 -0
  2000. {polyrob-1.6.0 → polyrob-1.7.0}/tools/dom/service.py +0 -0
  2001. {polyrob-1.6.0 → polyrob-1.7.0}/tools/email_mailbox.py +0 -0
  2002. {polyrob-1.6.0 → polyrob-1.7.0}/tools/email_providers/__init__.py +0 -0
  2003. {polyrob-1.6.0 → polyrob-1.7.0}/tools/email_providers/agentmail.py +0 -0
  2004. {polyrob-1.6.0 → polyrob-1.7.0}/tools/email_providers/mime.py +0 -0
  2005. {polyrob-1.6.0 → polyrob-1.7.0}/tools/email_tool.py +0 -0
  2006. {polyrob-1.6.0 → polyrob-1.7.0}/tools/exceptions.py +0 -0
  2007. {polyrob-1.6.0 → polyrob-1.7.0}/tools/filesystem.py +0 -0
  2008. {polyrob-1.6.0 → polyrob-1.7.0}/tools/filesystem_doc_kind.py +0 -0
  2009. {polyrob-1.6.0 → polyrob-1.7.0}/tools/filesystem_docproc.py +0 -0
  2010. {polyrob-1.6.0 → polyrob-1.7.0}/tools/filesystem_pdf.py +0 -0
  2011. {polyrob-1.6.0 → polyrob-1.7.0}/tools/git/__init__.py +0 -0
  2012. {polyrob-1.6.0 → polyrob-1.7.0}/tools/git/tool.py +0 -0
  2013. {polyrob-1.6.0 → polyrob-1.7.0}/tools/github/__init__.py +0 -0
  2014. {polyrob-1.6.0 → polyrob-1.7.0}/tools/github/client.py +0 -0
  2015. {polyrob-1.6.0 → polyrob-1.7.0}/tools/github/tool.py +0 -0
  2016. {polyrob-1.6.0 → polyrob-1.7.0}/tools/goal_tools.py +0 -0
  2017. {polyrob-1.6.0 → polyrob-1.7.0}/tools/hf_deploy/__init__.py +0 -0
  2018. {polyrob-1.6.0 → polyrob-1.7.0}/tools/hf_deploy/broker.py +0 -0
  2019. {polyrob-1.6.0 → polyrob-1.7.0}/tools/hf_deploy/digest.py +0 -0
  2020. {polyrob-1.6.0 → polyrob-1.7.0}/tools/hf_deploy/reconcile.py +0 -0
  2021. {polyrob-1.6.0 → polyrob-1.7.0}/tools/hf_deploy/registry.py +0 -0
  2022. {polyrob-1.6.0 → polyrob-1.7.0}/tools/hf_deploy/tool.py +0 -0
  2023. {polyrob-1.6.0 → polyrob-1.7.0}/tools/intel/__init__.py +0 -0
  2024. {polyrob-1.6.0 → polyrob-1.7.0}/tools/intel/model.py +0 -0
  2025. {polyrob-1.6.0 → polyrob-1.7.0}/tools/intel/price.py +0 -0
  2026. {polyrob-1.6.0 → polyrob-1.7.0}/tools/kb_autoingest.py +0 -0
  2027. {polyrob-1.6.0 → polyrob-1.7.0}/tools/knowledge_ingest.py +0 -0
  2028. {polyrob-1.6.0 → polyrob-1.7.0}/tools/knowledge_inventory.py +0 -0
  2029. {polyrob-1.6.0 → polyrob-1.7.0}/tools/late_tool_mode.py +0 -0
  2030. {polyrob-1.6.0 → polyrob-1.7.0}/tools/launchpad/__init__.py +0 -0
  2031. {polyrob-1.6.0 → polyrob-1.7.0}/tools/launchpad/execute.py +0 -0
  2032. {polyrob-1.6.0 → polyrob-1.7.0}/tools/launchpad/pons.py +0 -0
  2033. {polyrob-1.6.0 → polyrob-1.7.0}/tools/launchpad/pons_abi.py +0 -0
  2034. {polyrob-1.6.0 → polyrob-1.7.0}/tools/launchpad/provenance.py +0 -0
  2035. {polyrob-1.6.0 → polyrob-1.7.0}/tools/launchpad/registration.py +0 -0
  2036. {polyrob-1.6.0 → polyrob-1.7.0}/tools/launchpad/tool.py +0 -0
  2037. {polyrob-1.6.0 → polyrob-1.7.0}/tools/mcp/__init__.py +0 -0
  2038. {polyrob-1.6.0 → polyrob-1.7.0}/tools/mcp/catalog.py +0 -0
  2039. {polyrob-1.6.0 → polyrob-1.7.0}/tools/mcp/child_env.py +0 -0
  2040. {polyrob-1.6.0 → polyrob-1.7.0}/tools/mcp/oauth_bridge.py +0 -0
  2041. {polyrob-1.6.0 → polyrob-1.7.0}/tools/mcp/param_coercion.py +0 -0
  2042. {polyrob-1.6.0 → polyrob-1.7.0}/tools/mcp/rate_limit.py +0 -0
  2043. {polyrob-1.6.0 → polyrob-1.7.0}/tools/mcp/security.py +0 -0
  2044. {polyrob-1.6.0 → polyrob-1.7.0}/tools/mcp/self_install.py +0 -0
  2045. {polyrob-1.6.0 → polyrob-1.7.0}/tools/mcp/server_manager.py +0 -0
  2046. {polyrob-1.6.0 → polyrob-1.7.0}/tools/mcp/subscriptions.py +0 -0
  2047. {polyrob-1.6.0 → polyrob-1.7.0}/tools/mcp/validation_tracker.py +0 -0
  2048. {polyrob-1.6.0 → polyrob-1.7.0}/tools/mcp/views.py +0 -0
  2049. {polyrob-1.6.0 → polyrob-1.7.0}/tools/oauth/__init__.py +0 -0
  2050. {polyrob-1.6.0 → polyrob-1.7.0}/tools/oauth/file_store.py +0 -0
  2051. {polyrob-1.6.0 → polyrob-1.7.0}/tools/oauth/manager.py +0 -0
  2052. {polyrob-1.6.0 → polyrob-1.7.0}/tools/oauth/provider.py +0 -0
  2053. {polyrob-1.6.0 → polyrob-1.7.0}/tools/oauth/providers/__init__.py +0 -0
  2054. {polyrob-1.6.0 → polyrob-1.7.0}/tools/oauth/providers/generic_oauth2.py +0 -0
  2055. {polyrob-1.6.0 → polyrob-1.7.0}/tools/publish/__init__.py +0 -0
  2056. {polyrob-1.6.0 → polyrob-1.7.0}/tools/publish/tool.py +0 -0
  2057. {polyrob-1.6.0 → polyrob-1.7.0}/tools/rails/__init__.py +0 -0
  2058. {polyrob-1.6.0 → polyrob-1.7.0}/tools/rails/verification.py +0 -0
  2059. {polyrob-1.6.0 → polyrob-1.7.0}/tools/self_env/__init__.py +0 -0
  2060. {polyrob-1.6.0 → polyrob-1.7.0}/tools/self_env/tool.py +0 -0
  2061. {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/__init__.py +0 -0
  2062. {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/backend_pool.py +0 -0
  2063. {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/discipline.py +0 -0
  2064. {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/executor.py +0 -0
  2065. {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/executor_protocol.py +0 -0
  2066. {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/host_executor.py +0 -0
  2067. {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/jobs.py +0 -0
  2068. {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/loopback_allow.py +0 -0
  2069. {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/output.py +0 -0
  2070. {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/process_registry.py +0 -0
  2071. {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/receipts.py +0 -0
  2072. {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/remote_executor.py +0 -0
  2073. {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/state.py +0 -0
  2074. {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/sudo.py +0 -0
  2075. {polyrob-1.6.0 → polyrob-1.7.0}/tools/shell/watch.py +0 -0
  2076. {polyrob-1.6.0 → polyrob-1.7.0}/tools/ship_common.py +0 -0
  2077. {polyrob-1.6.0 → polyrob-1.7.0}/tools/task_tool.py +0 -0
  2078. {polyrob-1.6.0 → polyrob-1.7.0}/tools/tool_search.py +0 -0
  2079. {polyrob-1.6.0 → polyrob-1.7.0}/tools/user_directory.py +0 -0
  2080. {polyrob-1.6.0 → polyrob-1.7.0}/tools/wallet_holder.py +0 -0
  2081. {polyrob-1.6.0 → polyrob-1.7.0}/tools/web_fetch/__init__.py +0 -0
  2082. {polyrob-1.6.0 → polyrob-1.7.0}/tools/web_fetch/render.py +0 -0
  2083. {polyrob-1.6.0 → polyrob-1.7.0}/tools/web_fetch/tool.py +0 -0
  2084. {polyrob-1.6.0 → polyrob-1.7.0}/tools/x402/__init__.py +0 -0
  2085. {polyrob-1.6.0 → polyrob-1.7.0}/tools/x402/client.py +0 -0
  2086. {polyrob-1.6.0 → polyrob-1.7.0}/tools/x402/discovery.py +0 -0
  2087. {polyrob-1.6.0 → polyrob-1.7.0}/tools/x402/invoice_tool.py +0 -0
  2088. {polyrob-1.6.0 → polyrob-1.7.0}/tools/x402/net_guard.py +0 -0
  2089. {polyrob-1.6.0 → polyrob-1.7.0}/tools/x402/notifications.py +0 -0
  2090. {polyrob-1.6.0 → polyrob-1.7.0}/tools/x402/real_client.py +0 -0
  2091. {polyrob-1.6.0 → polyrob-1.7.0}/tools/x402/service.py +0 -0
  2092. {polyrob-1.6.0 → polyrob-1.7.0}/tools/x402/spend_gate.py +0 -0
  2093. {polyrob-1.6.0 → polyrob-1.7.0}/utils/README.md +0 -0
  2094. {polyrob-1.6.0 → polyrob-1.7.0}/utils/__init__.py +0 -0
  2095. {polyrob-1.6.0 → polyrob-1.7.0}/utils/auth_utils.py +0 -0
  2096. {polyrob-1.6.0 → polyrob-1.7.0}/utils/bounded_collections.py +0 -0
  2097. {polyrob-1.6.0 → polyrob-1.7.0}/utils/circuit_breaker.py +0 -0
  2098. {polyrob-1.6.0 → polyrob-1.7.0}/utils/path_validator.py +0 -0
  2099. {polyrob-1.6.0 → polyrob-1.7.0}/utils/rate_limit_manager.py +0 -0
  2100. {polyrob-1.6.0 → polyrob-1.7.0}/utils/result_size.py +0 -0
  2101. {polyrob-1.6.0 → polyrob-1.7.0}/utils/time_utils.py +0 -0
  2102. {polyrob-1.6.0 → polyrob-1.7.0}/webview/__init__.py +0 -0
  2103. {polyrob-1.6.0 → polyrob-1.7.0}/webview/activity.py +0 -0
  2104. {polyrob-1.6.0 → polyrob-1.7.0}/webview/apps_routes.py +0 -0
  2105. {polyrob-1.6.0 → polyrob-1.7.0}/webview/artifacts_api.py +0 -0
  2106. {polyrob-1.6.0 → polyrob-1.7.0}/webview/audit.py +0 -0
  2107. {polyrob-1.6.0 → polyrob-1.7.0}/webview/cards_routes.py +0 -0
  2108. {polyrob-1.6.0 → polyrob-1.7.0}/webview/chat_open.py +0 -0
  2109. {polyrob-1.6.0 → polyrob-1.7.0}/webview/config_view.py +0 -0
  2110. {polyrob-1.6.0 → polyrob-1.7.0}/webview/console_commands.py +0 -0
  2111. {polyrob-1.6.0 → polyrob-1.7.0}/webview/copy/__init__.py +0 -0
  2112. {polyrob-1.6.0 → polyrob-1.7.0}/webview/cors.py +0 -0
  2113. {polyrob-1.6.0 → polyrob-1.7.0}/webview/emit_api.py +0 -0
  2114. {polyrob-1.6.0 → polyrob-1.7.0}/webview/error_page.py +0 -0
  2115. {polyrob-1.6.0 → polyrob-1.7.0}/webview/feed_routes.py +0 -0
  2116. {polyrob-1.6.0 → polyrob-1.7.0}/webview/host_guard.py +0 -0
  2117. {polyrob-1.6.0 → polyrob-1.7.0}/webview/inbox.py +0 -0
  2118. {polyrob-1.6.0 → polyrob-1.7.0}/webview/job_routes.py +0 -0
  2119. {polyrob-1.6.0 → polyrob-1.7.0}/webview/knowledge.py +0 -0
  2120. {polyrob-1.6.0 → polyrob-1.7.0}/webview/login_limits.py +0 -0
  2121. {polyrob-1.6.0 → polyrob-1.7.0}/webview/owner_auth.py +0 -0
  2122. {polyrob-1.6.0 → polyrob-1.7.0}/webview/owner_login_flow.py +0 -0
  2123. {polyrob-1.6.0 → polyrob-1.7.0}/webview/pack_console.py +0 -0
  2124. {polyrob-1.6.0 → polyrob-1.7.0}/webview/pages.py +0 -0
  2125. {polyrob-1.6.0 → polyrob-1.7.0}/webview/posture_guard.py +0 -0
  2126. {polyrob-1.6.0 → polyrob-1.7.0}/webview/posture_routes.py +0 -0
  2127. {polyrob-1.6.0 → polyrob-1.7.0}/webview/repair_sessions.py +0 -0
  2128. {polyrob-1.6.0 → polyrob-1.7.0}/webview/serve_tokens.py +0 -0
  2129. {polyrob-1.6.0 → polyrob-1.7.0}/webview/server.py +0 -0
  2130. {polyrob-1.6.0 → polyrob-1.7.0}/webview/server_launcher.py +0 -0
  2131. {polyrob-1.6.0 → polyrob-1.7.0}/webview/session_access.py +0 -0
  2132. {polyrob-1.6.0 → polyrob-1.7.0}/webview/session_catalog.py +0 -0
  2133. {polyrob-1.6.0 → polyrob-1.7.0}/webview/session_identity.py +0 -0
  2134. {polyrob-1.6.0 → polyrob-1.7.0}/webview/socket_auth.py +0 -0
  2135. {polyrob-1.6.0 → polyrob-1.7.0}/webview/socket_limits.py +0 -0
  2136. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/agent.js +0 -0
  2137. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/cards.js +0 -0
  2138. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/chat-open.js +0 -0
  2139. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/chats.js +0 -0
  2140. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/file-attach.js +0 -0
  2141. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/format.js +0 -0
  2142. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/http.js +0 -0
  2143. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/inbox.js +0 -0
  2144. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/live.js +0 -0
  2145. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/money-move.js +0 -0
  2146. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/money-tokens.js +0 -0
  2147. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/money.js +0 -0
  2148. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/palette.js +0 -0
  2149. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/pause.js +0 -0
  2150. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/settings-control.js +0 -0
  2151. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/socket-client.js +0 -0
  2152. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/transcript.js +0 -0
  2153. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/work-apps.js +0 -0
  2154. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/worklog.js +0 -0
  2155. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/app/workpane.js +0 -0
  2156. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/css/components.css +0 -0
  2157. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/css/fonts.css +0 -0
  2158. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/css/pages/signin.css +0 -0
  2159. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/css/style.css +0 -0
  2160. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/css/variables.css +0 -0
  2161. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/css/webgate.css +0 -0
  2162. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/fonts/JetBrainsMono-Medium.woff2 +0 -0
  2163. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/fonts/JetBrainsMono-Regular.woff2 +0 -0
  2164. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/fonts/LICENSE-JetBrainsMono +0 -0
  2165. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/fonts/LICENSE-VT323 +0 -0
  2166. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/fonts/VT323-Regular.woff2 +0 -0
  2167. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/img/favicon.ico +0 -0
  2168. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/js/admin/activity.js +0 -0
  2169. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/js/admin/dashboard.js +0 -0
  2170. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/js/admin/utils.js +0 -0
  2171. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/js/constants.js +0 -0
  2172. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/js/error-handler.js +0 -0
  2173. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/js/error-page.js +0 -0
  2174. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/js/ethers.min.js +0 -0
  2175. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/js/signin.js +0 -0
  2176. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/js/socket.io.min.js +0 -0
  2177. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/js/status-uptime.js +0 -0
  2178. {polyrob-1.6.0 → polyrob-1.7.0}/webview/static/js/theme.js +0 -0
  2179. {polyrob-1.6.0 → polyrob-1.7.0}/webview/stats_service.py +0 -0
  2180. {polyrob-1.6.0 → polyrob-1.7.0}/webview/template_globals.py +0 -0
  2181. {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/__init__.py +0 -0
  2182. {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/admin/activity.html +0 -0
  2183. {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/admin/dashboard.html +0 -0
  2184. {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/agent.html +0 -0
  2185. {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/chat.html +0 -0
  2186. {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/error.html +0 -0
  2187. {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/inbox.html +0 -0
  2188. {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/layout.html +0 -0
  2189. {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/money.html +0 -0
  2190. {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/owner_login.html +0 -0
  2191. {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/shell.html +0 -0
  2192. {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/signin.html +0 -0
  2193. {polyrob-1.6.0 → polyrob-1.7.0}/webview/templates/status.html +0 -0
  2194. {polyrob-1.6.0 → polyrob-1.7.0}/webview/theme.py +0 -0
  2195. {polyrob-1.6.0 → polyrob-1.7.0}/webview/tokens_routes.py +0 -0
  2196. {polyrob-1.6.0 → polyrob-1.7.0}/webview/wallet_reader.py +0 -0
  2197. {polyrob-1.6.0 → polyrob-1.7.0}/webview/webgate.py +0 -0
  2198. {polyrob-1.6.0 → polyrob-1.7.0}/webview/worklog_api.py +0 -0
  2199. {polyrob-1.6.0 → polyrob-1.7.0}/webview/workspace_paths.py +0 -0
  2200. {polyrob-1.6.0 → polyrob-1.7.0}/webview/workspace_routes.py +0 -0
@@ -0,0 +1,2094 @@
1
+ # Changelog
2
+
3
+ All notable changes to POLYROB are documented here. The format is based on
4
+ [Keep a Changelog](https://keepachangelog.com/), and this project adheres to
5
+ [Semantic Versioning](https://semver.org/).
6
+
7
+ This is the full technical record. Entries use only the six Keep a Changelog
8
+ headings and describe shipped behavior; the rules are in `RELEASING.md`. The
9
+ short, user-facing notes for each release are on its GitHub Release page.
10
+
11
+ ## [Unreleased]
12
+
13
+ ## [1.7.0] — 2026-10-29
14
+
15
+ ### Added
16
+
17
+ - Operational self-awareness: `agent_status(tool=)` says why a tool is missing, who fixes it and when;
18
+ `propose_setting` gives the owner a one-tap fix card; `http_request` writes JSON over HTTP; `/update now`
19
+ skips the owner-quiet wait.
20
+ - Console Work › Goals: a goal board with one lane per live status, the open decisions, dependencies, sub-goals,
21
+ cost against the run limit and a detail with runs and history; actions use the existing goal verbs and the
22
+ Inbox decider; the goal form takes `depends_on`.
23
+ - `wallet_sign`: the agent signs a site's login or challenge text (EIP-191, SIWE, SIWS) once a classifier, re-run
24
+ in the signer, binds it to the site; permits, orders and blind bytes refuse; site keys are stored encrypted.
25
+ - Trading mandate: one owner card (`/trade start`) starts a hunt, a daily review and an exit job per position;
26
+ code arms and cancels exits, $0 prechecks watch, entry-only breakers latch, `/trade status|pause|stop|release`.
27
+ - Discovery reads say ok / empty / unavailable, and `token_info` carries survivability fields with a tier ceiling
28
+ (missing is unknown, one tier lower); `/book retire` and `defi_data.retire_row` close a measured zero or dust row.
29
+
30
+ ### Changed
31
+
32
+ - Operator MCP servers belong in `~/.polyrob/mcp.json`; `config/mcp_config.json` ships defaults only, and a
33
+ deployed tree copies its servers there once at startup.
34
+ - DeepSeek is a native provider: a `DEEPSEEK_API_KEY` alone runs the agent on DeepSeek's own API (`deepseek-flash`,
35
+ `deepseek-v4-pro`) with tool calls, thinking-mode reasoning replay, cache hits and the peak-hour price; the
36
+ bespoke client, its adapter and the old same-role message merge are removed.
37
+ - No default chain: every `defi_trade`, `defi_data`, `dapp_browser` and `agent_nft` verb requires `chain`, the wallet,
38
+ identity and LP CLI commands require `--chain`, and `/nft`, `/identity` and `/deploy` require `on <chain>`.
39
+ - A trading-mandate entry costs at most its promotion stage's ticket ($1 probe, then half, then full) and needs an
40
+ exit plan before any quote; the status snapshot and the digest gain a $0 Trading block (positions, exit coverage,
41
+ breaker, realized P&L with close reasons, LLM cost).
42
+ - After a chat turn's first reply-only step the agent is told the reply was delivered (finish with `done()` or keep
43
+ working), so it stops repeating a reply in the extra step the conversational-exit allowance grants.
44
+ - Solana swaps write the position book, a major↔stable swap books P&L, one $1 dust line is shared, and the
45
+ `exits`, `treasury-trading`, `sizing-and-risk` and `position-journal` skills lose their job templates and ledger text.
46
+
47
+ ### Fixed
48
+
49
+ - The agent gets the true cause: a tool that cannot run is gated with its remedy, `load_tool` returns the
50
+ recorded reason, the retry wall quotes the last error and resets per owner turn; `/mcp add` works.
51
+ - `wallet_sign`: one call fetches (POST/GET), signs and submits with the challenge's cookie; an unsent signature
52
+ says so and a second one refuses; SIWE without expiry, nonce-only sites, sibling hosts and disclaimers sign.
53
+ - `cronjob_edit` no longer reports a value the job already has as an edit: a call that changes nothing now refuses
54
+ with the way to add task text (old_text and new_text), so an agent cannot loop on a no-op "Edited cron job".
55
+
56
+ - `twitter_get_mentions` returns each mention's `author_id` and `author_username`; without them the model guessed
57
+ an author and tagged the wrong account in a reply.
58
+ - `wallet_holdings`, `wallet_activity` and `token_origin` list `chain` as required in the schema the model sees (a 0x address
59
+ needs it), so a model stops omitting it; in-process calls for base58 addresses are unchanged.
60
+ - The controller's retry key treats an omitted argument, an explicit `None` and stray whitespace as the same call, and the
61
+ retry-wall refusal carries a `retry_wall` flag instead of being recognised by its wording.
62
+ - A step made only of "Maximum retries exceeded" refusals now counts as a failed step, so a run that keeps re-asking for a
63
+ dead operation stops after `max_failures` such steps instead of burning its whole step budget.
64
+ - `defi_data wallet_holdings` on a 0x address with no chain now answers with a ready-to-copy call naming a chain, so a
65
+ model stops repeating the chain-less call that cost a 150-step run.
66
+ - A short `message` caption no longer hides an earlier `send_message` text from the repeat-reply guard: the guard now
67
+ checks every text the turn spoke, so the owner stops receiving the same reply twice.
68
+ - The CLI no longer stops with `PermissionError` when it runs from a directory its user cannot read (the retired
69
+ key-backfill hint stats a relative `config/.env.*`).
70
+ - Every X tweet read carries `reposts_and_quotes` (retweets + quotes, the figure X's app shows as reposts), so a
71
+ repost goal no longer reads the retweet count alone and keeps pushing a target it has already met.
72
+
73
+ ### Removed
74
+
75
+ - `polyrob service status` no longer checks the systemd unit for the pre-1.4.0 `RestartForceExitStatus=75` hint.
76
+ - The NFT `holder` tier and its token gate: the Collab.Land and Alchemy check tools, admin `verify-token`,
77
+ the `den_token_count` and `requires_den_token` API fields, and six flags. A `holder` row migrates to `free_access`.
78
+ - The one-goal `/trade` verb: `/trade` now opens and runs the trading mandate.
79
+
80
+ ### Security
81
+
82
+ - Dependency floors for new advisories: `certifi>=2026.10.19`, `pillow>=13.0.0`, `pypdf>=6.21.2`; the lock also
83
+ takes the fixed `filelock`, `msgpack`, `opentelemetry-api` and `setuptools`.
84
+
85
+ ## [1.6.0] — 2026-10-20
86
+
87
+ ### Added
88
+
89
+ - The agent continues by itself once the owner has decided every card it raised: one wake per card group with each
90
+ card's outcome; a quote, extra-check or recovery card stays in the group; a failed confirm offers its extra check as
91
+ a card, and Refresh works on an expired quote.
92
+
93
+ ### Changed
94
+
95
+ - Goal, cron, delegated and worker runs stop at one operator step cap, `AUTONOMOUS_MAX_STEPS` (150), and at
96
+ `AUTONOMOUS_RUN_BUDGET_USD` ($2.00) of spend, sub-agents included; at the cap they report once, and a run that stops
97
+ before `done()` names why in its record, the CLI and the session status.
98
+
99
+ ### Fixed
100
+
101
+ - The interactive-terminal log formatter interpolates %-style arguments instead of printing a literal `%s`.
102
+ - The money simulation no longer runs a built transaction at its placeholder 120k gas limit: every aggregator swap
103
+ ran out of gas in simulation ("execution reverted", data 0x) and was refused.
104
+ - The owner-thread delta keeps the newest rows and names the rest; the owner's commands, card taps and their results
105
+ no longer read as the agent's own or an autonomous run's; a pinned stablecoin keeps its peg when one source is
106
+ outvoted.
107
+
108
+ ### Removed
109
+
110
+ - The `max_steps` argument of `goal_create`, `delegate_task` and `worker_manage`, the console goal form's step field,
111
+ `polyrob workers new/edit --max-steps`, `polyrob cron edit --max-steps` and the `GOAL_DEFAULT_MAX_STEPS` flag.
112
+
113
+ ### Security
114
+
115
+ - `aiohttp` is raised to 3.14.4 or later (locked 3.14.5) for the keepalive-timeout, unbounded-memory and Secure-cookie
116
+ advisories.
117
+ - A payout-shaped call or endowed deploy needs the owner tap on every lane, a seed in a readable `.env` refuses host
118
+ code runs, owner money jobs need a card, and x402 books the signed amount.
119
+
120
+ ## [1.5.0] — 2026-10-18
121
+
122
+ ### Added
123
+
124
+ - `polyrob job edit --tools a,b,c` sets a job's explicit toolset (`payload.tools`, `none` clears it), validated against the
125
+ core and first-party pack tool ids, so a posting job can be kept off the spending tools.
126
+ - A cron job or goal write that pins an unknown skill id is refused (the lane gate's one validator); a pinned skill missing at
127
+ run time is named in the first line of the run's instructions.
128
+ - A run record's `meta` says how its skills loaded: `skills_auto` (pinned at session start) beside `skills_loaded`, and
129
+ `skills_regime`; the rest were loaded with `load_skill`. Measurement only: nothing retires a skill.
130
+ - Bundled skills are seeded into `<data_home>/skills/bundled/` and served from there: a fix is the agent's pending draft the owner
131
+ accepts, with no deploy; an update replaces only unmodified copies and its report names the kept ones.
132
+ - Every shipped skill has a `metadata.polyrob-when` line (at most 60 chars) that the skill index shows after its id; a skill write
133
+ with a longer one is refused, and a test checks the shipped library.
134
+ - A skill change ledger in `skill_usage.db` (action, actor, before/after sha, archive path, `absorbed_into`); archived bodies are
135
+ content-addressed; `rollback_skill` restores one through the write gate; a background or curator delete names its absorber.
136
+ - `tests/golden/prompt_surface/` holds the system text and `tools[]` the model receives on eight surfaces (owner Telegram DM and
137
+ REPL, cron, goal, room, correspondent, leaf, prod-posture owner DM) with sizes per layer; a prompt change regenerates it: `python devtools/gen_prompt_surfaces.py`.
138
+ - `/job stop <id> --forever` stops the job's lane (pinned skill, else rig): no non-owner job there until `/job allow`; a per-turn
139
+ `<operations>` block shows live jobs, goals, pauses and stops and outranks owner.md and recall; owner.md promote rebases.
140
+ - `/usage [days]` on every seat (spend by model, kind, job and day, cache %, $ per useful run) and a "Top AI cost" digest line; a cron
141
+ `payload.precheck` skips a quiet watch tick with no model call; `model_call_quality` and `prompt_manifest` events; `polyrob doctor` billed-vs-catalog line.
142
+ - `HEAVY_MODEL`: a money-class cron job or goal (`priority=money`, or a money tool in its toolset or rig) that pins no model runs on this
143
+ model on the pinned provider, through a `model_tier` column of `REGIME_POLICY`, so a box keeps a cheap default for chat and routine runs.
144
+ - `/inbox` reads every decision list (open cards, signer approvals, agent-written jobs and goals); `/pending` is its view and the console API
145
+ agrees; `/missed` names the cap only when the cap was the cause.
146
+ - Telegram and the console gain `/model` (the model, each pin and its source; a write goes through the config oracle), `/skills` and
147
+ `/config get|explain`; the REPL-only verbs are rows of `core/verbs.py` (`seats=("repl",)`). The `/approve list|add|remove` alias is removed.
148
+ - `agent_status` (health, next runs, release notes) is on every posture; `AGENT_STATUS_TOOL` gates only wallet/ledger/config. The identity
149
+ names `POLYROB <version>, instance <name>`; episodes keep `meta.skills_loaded`; the guide skill gains a generated `references/verbs.md`.
150
+
151
+ ### Changed
152
+
153
+ - `cronjob_edit` reports the job's next run, and both it and `cronjob_show` name any other live job firing at the SAME
154
+ minute, so a judge meant to run "24h after the announce" cannot silently share the announce's schedule.
155
+ - A `prompt_manifest` row carries `estimate_gap` (provider `prompt_tokens` minus the slot estimates); the deploy log prints
156
+ the bundled-skill seed lines; `knowledge_export` moves from `core/` to `agents/task/` (no upward edge).
157
+ - `skill_manage create` needs a `when` index line (<= 60 chars, written into the frontmatter); the skill writer and the REST
158
+ skill API no longer write keyword triggers into a tenant rule.
159
+ - `skill_manage` `patch`/`edit`/`delete` carry the sha256 `load_skill` returns (a stale one refuses with the current sha); `create`
160
+ never overwrites; new `edit` and `rollback` actions; the scan and lint check only the lines a write adds.
161
+ - `treasury-trading` fits the pin budget: a 19K core with the NO ROUTE rule in its head; the chain table, execution order, NFTs and
162
+ learning-the-meta move to `references/`. A test holds every shipped skill body to 20,000 chars.
163
+ - Skills load on purpose: only pinned skills (a job's or goal's `payload.skills`, persona seeds, their `requires`) load at session
164
+ start; every other session gets a short index and calls `load_skill`. The keyword matcher and per-turn re-match are deleted.
165
+ - One block owns tool status: with `<tool-catalog>` pinned, its lines carry each gate (flag, unmet posture limb) and
166
+ `<tool-availability>` keeps only the goal line; an owner seat pins the catalog without `POLYROB_LOCAL`.
167
+ - A session resumed for a correspondent runs on `filesystem`, `task` and `message` instead of the ambient grant
168
+ (75 to 39 tool schemas): the capability gate refuses every high-impact tool there anyway.
169
+ - Owner chat runs on the cron shape: the `owner` rig and granted money tools eager, `<tool-catalog>` + `load_tool` always,
170
+ the `tool_call` bridge, one catalog / load / not-loaded text on every seat; prod-posture owner DM 58K to 39K tokens.
171
+ - An active user skill's reviewed revision lives in `skill_usage.db`, not the tenant `rules.json`; a legacy hash there
172
+ still verifies until the skill's next write moves it.
173
+ - The system prompt's prose moved out of `prompts.py` (1,467 → 1,062 lines) into `data/prompts/system/<block>.md`, read by `core/prompt_text.py`;
174
+ Python keeps the conditions and the order; each block has a size ceiling, and the owner-facing texts pass the glossary.
175
+ - A skill's SKILL.md frontmatter is its only metadata source: the builtin and pack `rules.json` files are gone,
176
+ the rule index is built from `metadata.polyrob-*` (the `tool_ids` gate, priority, auto-activate, and the new `polyrob-requires`).
177
+ - `<owner-instructions>`, the standing-goals line and the live-state line render only on an owner seat (owner chat, and live state on
178
+ autonomous runs), never in a room, a correspondent chat or a sub-agent; the prompt golden's leaf is built as `delegate_task` builds it.
179
+ - The session's workspace path left `<environment>` for its own foundation row, and it and the task now come after the skill and tool
180
+ catalogs, so two runs of one cron job or goal share the cached prefix through the catalogs.
181
+ - One gate text per tool: `core/tool_gates.py::REMEDIES` holds every remedy, a gate row (core or `pack.toml`) names a key,
182
+ and `<tool-availability>` and `<tool-catalog>` render the same text; the trading venues no longer say "never autonomous".
183
+ - One home for the skill catalog: `core/skills` holds frontmatter, scopes with one `resolve` (two non-builtin skills
184
+ with one name and different bodies are refused) and the gate predicates; the writer and migration move to `modules/skills`.
185
+ - The system prompt no longer lists every action in `<available-actions>` (about 3K tokens): in native tool mode `tools[]` is the one list;
186
+ the JSON fallback keeps it, and the action index lists an aliased action once.
187
+ - The system prompt states each rule once (done vs send_message, the memory field, paths, live state; pause and work only in `<operations>`),
188
+ names `web_fetch_fetch_url` and no `polyrob …` command, and calls a model-written rule a draft; the SOUL template drops its approval lines.
189
+ - Agent steps: OpenRouter sends `tool_choice=required`; an empty completion retries in the call; a tool name is repaired; an autonomous
190
+ run that acted ends on a text reply; owner chat compacts on an 80k history budget and keeps the current request; tool disclosure is on for autonomous runs.
191
+ - One session-regime table (`REGIME_POLICY`) decides pinning, recall rank, owner memory and run records per session kind;
192
+ `OWNER_THREAD_TAIL_HOURS` defaults to 24; memory filter v4 drops step narration (the purge reruns, backup first).
193
+ - Jobs: `/jobs` (next run, last outcome, author) and `/job new|show|edit|pause|resume|run|stop` on every seat, `polyrob job …` (`polyrob cron` an
194
+ alias for one release); a paused job shows no next run; a stop records its seat; one scheduler-off sentence; `/cron` is removed.
195
+ - Goals: `/goal new|show|retry|pause|stop [--forever]` on every seat (`/goal ready|resume|cancel` deleted); `paused` is a status; stop is once unless
196
+ `--forever`, the same on chat, CLI, console and `goal_cancel`; console Work lists stored goals and jobs when off.
197
+ - `CHANGELOG.md` ships in the wheel (`core/CHANGELOG.md`); on a deploy `release_notes('latest')` leads with `[Unreleased]`; the guide and
198
+ its skill explain standing work as job / goal / decision / pause with one which-one table, and retire rail, objective and stream.
199
+ - Status names the next 5 runs or why none runs, and says IDLE (not RUNNING) while autonomy is off; a blocked
200
+ goal names its error; runtime cost names its window; digest, `/recap`, `/journey` name a failed read.
201
+ - The holdings read values the native coin as money: its row shows the USD value and what is spendable above the chain's fee reserve (`ChainRow.fee_reserve`, e.g. 0.002 ETH on an L2), and a `total incl. native` line counts it; an unpriced native is named, never counted.
202
+
203
+ ### Removed
204
+
205
+ - Dead skill code: the `action_names` trigger (no shipped rule could fire on it), `SkillContext`, the second frontmatter parser,
206
+ the unused scope list, `scripts/skills_frontmatter_sync.py` and the `adopt` keyword. The guide states the real skill precedence.
207
+ - The unread prompt constants in `agents/prompt` and every mention of the retired `OWNER_RULES_IMMEDIATE` env in code comments and tests; the docstrings now say a model-written rule is a draft the owner confirms.
208
+ - Text-guessing gates: read taint, refusal taint, the financial-claim gate, `authored_by`/`/adopt`, the memory write filter and cron's
209
+ job-text regexes. Unattended money needs a non-`supervised` money regime at the verb; 4 flags retire.
210
+ - One way to pick the model: `CHAT_PROVIDER`/`CHAT_MODEL` retire to `DEFAULT_PROVIDER`/`DEFAULT_MODEL`, `COMPACTION_AUTO_AUX` to
211
+ `AUX_AUTO`; `POLYROB_<PROVIDER>_MODEL` is no longer read. `polyrob doctor` names each retired line still set.
212
+ - Rails, objectives, streams and the planner: `/rail`, `polyrob rails`, `/goal objective`, the `streams`/`planner`
213
+ pause scopes, `polyrob owner pause-streams`; 11 flags retire. A recurring need is a scheduled job.
214
+
215
+ ### Fixed
216
+
217
+ - A 1.4.0 server data home (`<POLYROB_DATA_DIR>/data`) moves up into the data home at first start, under a lock;
218
+ nothing is merged, overwritten or deleted, and `polyrob doctor` names what stayed. Before, the upgrade opened an empty `bot.db`.
219
+ - `propose_action`'s `replaces` closes only the owner's own proposal cards, never a quote waiting for Confirm, a choice
220
+ card or another user's card.
221
+ - Telegram `/model` checks both halves of the pin before it writes either, so a higher layer that pins only
222
+ `DEFAULT_MODEL` no longer gets a provider of another model family.
223
+ - REPL `/usage` still shows this chat's usage when the data home cannot be read; the spend view says "could not read".
224
+ - Console Inbox Approve/Reject on a signer approval goes to the signer's decider (it answered "unknown pending kind").
225
+ - `/goal stop <id> --forever` typed with a phone dash (`—forever`) switches the goal off; `/goal retry` help says it
226
+ re-queues a blocked or paused goal, and a pause then retry no longer runs two copies of the goal.
227
+ - `python -m migrations.migrate status` reads the same `bot.db` that `upgrade` writes.
228
+ - The "MCP is off" refusal names what the owner sets, not an internal key.
229
+ - Rolling back a bundled skill after an update works; accepting a bundled fix no longer deletes a newer draft, is refused
230
+ when its ledger row cannot be written, and a partial first seed keeps serving the packaged library.
231
+ - Recap and the daily digest say the episode store could not be read, instead of reporting no activity.
232
+ - Console job create answers a named 503 when the job store cannot be read; a job edit no longer loses a pause or an
233
+ outcome written at the same time.
234
+ - REPL `/skills <query>` filters on the whole query, as Telegram does; `polyrob-requires` accepts a JSON string, a YAML
235
+ list or a number/null.
236
+ - Memory: while the store is full, the retry queue keeps only the newest summaries that fit one row and logs each drop.
237
+ - The rate-guard deferral cap counts deferrals in a row, not over the goal's life.
238
+ - Compaction keeps message ages (an old money receipt no longer keeps its full text) and adds no "[HISTORY CUT]"
239
+ note when nothing was cut; a rejected call's correction note no longer stacks up.
240
+ - A reused sub-agent's new run no longer takes its opening plan as the final report.
241
+ - A mistyped tool name is no longer repaired into a different money or outbound action (`launchpad_claim` ran as
242
+ `launchpad_sell`); the call gets the normal refusal instead.
243
+ - A goal run stopped by its spend budget is recorded as a failure; it is no longer deferred and re-run at full cost.
244
+ - When the compaction summariser fails, the owner's newest in-chat instructions stay instructions.
245
+ - `/send` sends any held token: with no spend-grade price it asks one extra step (`anyway`), owner lane only. Pinned
246
+ stables (USDG) price at their peg; an L2 WETH falls back to mainnet ETH; the agent now sees its session's verb replies.
247
+ - `goal_create` refuses a goal whose acceptance is the goal board itself ("a goal row exists", "goal_show
248
+ read-back"); no run can complete such a goal, and each judged failure bred more goals.
249
+ - `send_message` rewrites an `/approve_p_…` / `/reject_p_…` token the owner already decided as "(already
250
+ approved <time> — nothing to tap)" and adds one "(Correction: …)" line; a token still queued is left alone.
251
+ - A cron job's `payload.post_spacing_hours` (`polyrob job edit --post-spacing-hours`) is now enforced by the
252
+ X tool: a post, quote, thread or repost inside the window since that job's own last post is refused, so
253
+ pacing is no longer prose the model checks after posting.
254
+ - A swap Confirm whose fresh quote still clears the confirmed minimum re-requests the route at a tighter
255
+ slippage instead of refusing "the minimum received fell below the confirmed quote"; the floor never drops.
256
+ - Two first writers of a new session no longer raise "user_id cannot be determined": the session's user is recorded
257
+ before its directory exists. The REST skill API writes a tenant `rules.json` atomically, through the skill writer.
258
+ - A token the owner pinned (`/wallet trust`) passes a buy-screen check no provider answered (USDG on robinhood
259
+ never gets `is_honeypot`); hard failures and a high sell tax still refuse. A swap dry run now runs the screen.
260
+ - The unchecked-route refusal and the spend-limits brief now name the owner's pin verb
261
+ (`/wallet trust <chain> <address> <SYMBOL> go`) and say no setting raises the $5 ticket.
262
+ - A tool call that restates its own tool as an `action` arg (`twitter_whoami(action='whoami')`) no longer fails
263
+ validation; the arg is dropped only when the tool declares no `action` field.
264
+ - A scheduled run that found nothing new sends no message (the autonomous contract said "silence is a failure mode" and
265
+ no-op cron runs began to ping the owner every 2 hours); a job text that asks for a silent close binds.
266
+ - The bundled-skill seed runs when the service can write the data home through its group (prod is `root:polyrob-data`);
267
+ an owner-uid check refused it, so nothing was seeded. A root shell on a service-group home skips without an error.
268
+ - A one-shot cron job that ends `failed` is disabled in the same write, as `done` is; an old failed row with `enabled=1` is
269
+ disabled when the store opens.
270
+ - The deploy deletes skills that left the shipped library: stale pre-pack copies on the box were indexed as builtins,
271
+ so every pack skill was renamed `<pack>:<id>` and a pinned plain id served the old body.
272
+ - The `prompt_manifest` row is written after the first call, so it records the tool-schema cost and the first-step blocks (it read
273
+ 0 and missed them), with a size per foundation layer and the provider's own `prompt_tokens`.
274
+ - A cron job that finishes as `done` is disabled in the same write, and the cron store clears old done-but-enabled rows and the dead `authored_by`/`adopted_skills_digest` payload keys when it opens; finished jobs no longer read as live rails.
275
+ - The owner/self doc writer refuses a second `## Superseded` heading and an agent write that would retire more than 3 active rules at once; a misplaced heading demoted 27 live owner rules twice in one morning.
276
+ - A `/send` proposal to an address that already has an open `/send` card is refused unless it names the cards it `replaces` (closed) or says `also_owed`; re-split payouts stacked ~$233 of cards on a $100 pool.
277
+ - A typed owner reply to an open `present_choice` card closes it at once ("replied in text", never parsed into a pick); before, the turn sat until the wait ran out.
278
+ - A service-user write into a setgid shared store (skills, identity) is group-shared 0660, not 0600; before, only root writes were.
279
+ - Self/owner identity docs are written 0660 (group-shared), not mkstemp's 0600 — a promote left `owner.md`/`self.md` unreadable to the `polyrob-data` group.
280
+ - `present_choice` gets at least its declared `wait_seconds` (+30 s) from the controller; the generic 180 s action timeout cut a 300 s owner choice short.
281
+ - A goal run a rate guard refused (`retry_after_sec=N`, e.g. the X post cooldown) is deferred, not failed: back to `ready` with `payload.not_before`, no failure counted, at most 3 deferrals in a row.
282
+ - A `tool_call` the target rejects now lists every parameter (type, required, description) and names empty `arguments`; the X post-cooldown hint names `cronjob_schedule`'s real `schedule` field.
283
+ - An unblocked goal is no longer held by the dispatcher's own "Unblock goal" ask: `GoalBoard.unblock` now releases it, as retry and the outage requeue already did.
284
+ - Recall and live limits survive a tool-free step; aux calls record tokens and billed cost; `AUX_AUTO` works on OpenRouter and reflection
285
+ runs; a live chat follows a moved model pin; the server no longer loads the code root's `AGENTS.md` as project context.
286
+ - Long owner chats: one compaction policy (the 90 % prune is gone); a prune keeps the summary and the latest owner message;
287
+ the first chat message is dated and the newest owner message wins; owner instructions survive compaction as instructions.
288
+ - Jobs and goals keep a run record on every exit (time cap, pause, step budget) and see `<previous-runs>`; a goal reads the
289
+ answers to its own asks; answers are consumed after a completed run; a plain owner reply reaches the job it answers.
290
+ - Memory recall ranks by recency and by the reader's regime (a job's own runs first), dates every hit, keeps `[unverified]`
291
+ through summaries, and says "could not read" on a failed read; a reload no longer re-writes old findings as new.
292
+ - Tool results over the wire cap are saved with a real read path; children report `incomplete` and their full text; a reload
293
+ re-renders changed rules/prompt/skills; `<live-health>` carries the live spend limits; a money denial names the caps.
294
+ - A deployed instance has one `<data home>/.env`, one env ladder and one data dir; a write `polyrob.env` pins is
295
+ refused naming that file; `explain` labels `env:systemd|file|shell`; `/restart` is promised only when it applies.
296
+ - A guard-refused money quote makes no card and no `go` hint; the per-tx refusal names its cap and the
297
+ `/config set` remedy; owner-verb replies and card taps (as the line confirmed) reach the owner thread.
298
+ - Money-verb results under 24 h keep full text through ageing; the step clock reads UTC; the compaction warning reads the 70/85 ladder; `cronjob_edit` says a new schedule runs a job sooner; an owner money QUESTION gets a quote and a card.
299
+ - A blocked goal put back to `ready` (owner retry, provider-outage requeue) closes the dispatcher's own "Unblock goal" ask; before, that open ask held the goal and nothing dispatched. An owner-decision ask still holds it.
300
+ - `defi_data.reconcile` compares only the chain it reads: a ledger row naming another chain (or one the rail store holds elsewhere) is skipped, a chainless row reading zero is "unscoped" (UNVERIFIED) not missing, a row marked CLOSED is closed, and an unbacked rail row names `/writeoff`.
301
+ - OpenRouter's in-flight 402 (`in_flight_budget_exceeded`: a funded account whose concurrent reservations pass the balance) backs off and retries like a rate limit; it no longer latches the credit sentinel, pauses autonomy for 6 h or fails a goal over to another provider.
302
+
303
+ ### Security
304
+
305
+ - A goal or cron `target_token` is identity trust only with an explicit `target_authored_by: owner` stamp (owner seat or
306
+ verbatim owner turn); a row with a target and no stamp, such as one written before the stamp existed, is restrict-only.
307
+ - A multitenant console lists the instance's signer approvals only for the owner tenant.
308
+ - `POLYROB_SUPPORT_URL` and `POLYROB_SUPPORT_HANDLE` have no default (the link is hidden until set); shipped code, tests
309
+ and skills carry no instance identifier; the task-API access refusal is generic.
310
+
311
+ ## [1.4.0] — 2026-10-13
312
+
313
+ **Upgrading from 1.3.x:** move posture-member lines (e.g. `SHELL_TOOLS_ENABLED=false`) into one
314
+ `POLYROB_OVERRIDES=...` line — a direct member line is now ignored; rename `BOT_INSTANCE_ID`,
315
+ `BOT_OWNER_USER_ID`, `MASTER_SEED` and `WEBGATE_MULTITENANT`, which now refuse to start; update imports
316
+ of the moved modules. A `DEFAULT_MODEL`/`CHAT_MODEL` pin now wins over `POLYROB_<PROVIDER>_MODEL` for the pinned
317
+ provider. `polyrob doctor` names each line to change; see [upgrading](docs/guide/upgrading.md).
318
+
319
+ ### Added
320
+
321
+ - `polyrob service start|stop|restart|logs`, `/restart`, `/update`: finish the work, exit 75, restart, report back;
322
+ an update that never starts rolls back. `/status` names settings awaiting a restart.
323
+ - `defi_trade.bridge` bridges INTO Solana (native SOL or USDC). The arrival is proven by the delivering transaction's
324
+ own balance change for our account (a trade during the wait never counts as the bridge); Relay's Solana id is a registered alias.
325
+ - `defi_trade.bridge` takes the origin chain's pinned USDC as the origin (`token_in="usdc"`, `/bridge … from usdc`,
326
+ `--token-in`): on EVM an exact approve to the pinned Relay depository, then the guarded deposit, revoked on refusal.
327
+ - `polyrob.sdk`, the stable host API for packs; packs no longer import private host names.
328
+
329
+ ### Changed
330
+
331
+ - The composition root (`bootstrap`, `initialization`, `autonomy_runtime`, `bot`) moved from `core/` to `polyrob/app/`;
332
+ `core/intel` and `core/rails` moved to `tools/`. Importers of the old paths must use the new ones (no shims).
333
+ - The agent loop's own types moved from `tools/` to `agents/task/loop_types/` (`tools.controller.types`,
334
+ `tools.browser.views`, `tools.dom.views`, `tools.controller.registry.views`, no shims), and
335
+ `agents.task.goals.autonomy_marker` is now `core.autonomy_marker`.
336
+ - The layering ratchet tiers cron, app, migrations, entry points, SDK and packs, counts `"pkg.mod:attr"` strings and
337
+ caps the largest import cycle (588 → 200 modules).
338
+ - The 51 posture-bundle member flags are set only by their bundle or by one `POLYROB_OVERRIDES=FLAG=value,...` line
339
+ (file access); a direct member line is ignored and `doctor` shows its replacement. Flags 722 → 672.
340
+ - Git, MCP stdio, lazy installs, coding snapshots, `self_env`, local `run_code` and third-party packs run beside the
341
+ wallet in every signer mode; the key is protected by isolation. The shell floor is judged per command segment.
342
+ - One owner-turn definition, one view of the three taints, one `TurnFacts` seat-context constructor and one policy
343
+ hook chain; HTTP `/execute` and `/lp` run the denylist, effect and refusal-taint hooks; `tx_guard` asks `authorize_spend`.
344
+ - Verb kinds (outbound, produced output, late send, read job, room-refused, background) are columns of the verb rows;
345
+ every gate and list derives from them.
346
+ - One database registry (`core/db_manifest.DB_REGISTRY`) feeds the backup set and the shell guard; named store-path
347
+ helpers replace open-coded `.db` joins.
348
+ - The money authorizer `tx_guard._authorize` is 25 ordered step functions over one `GuardContext`
349
+ (`core/wallet/tx_guard_steps/`); the step order and the exact decisions are pinned by tests. No behaviour change.
350
+ - The god files are split with no behaviour change: Telegram owner verbs use one seat table, each status section
351
+ has its own module, the defi tools use `*_verb.py` modules, GoalBoard is store mixins, and `Agent.__init__` is builders.
352
+ - `import core` no longer reconfigures the host's root logger; the process entry points set up logging.
353
+ - First-party packs inherit the core version, and the pyproject extras are the one dependency spec; a release
354
+ bump edits `pyproject.toml` only and the lazy-install pins derive from the extras.
355
+ - Console writability and secret masking come from a per-flag `Access` column in `docs/CONFIGURATION.md`, not
356
+ from name patterns; one "Posture bundles" table lists each bundle's members.
357
+ - The deploy reconciles every installed unit that `deployment/units.toml` declares, restores them on rollback and
358
+ ships only `scripts/ops/`; the host env templates are generated from the flags catalog.
359
+ - Private tests and lab harnesses live under `ops/`; shipped tests read no private file, `tests/unit/scripts` is
360
+ collected again, and one classifier (`scripts/public_export.sh`) builds and tests the public export in CI.
361
+ - The test suite runs in parallel (pytest-xdist; CI = a static ratchet job + five shards), the root conftest costs
362
+ ~1 ms per test instead of ~7.6 ms, and the ratchets share one parse cache.
363
+ - Releases before 1.0.0 moved to `CHANGELOG-archive.md`.
364
+
365
+ ### Removed
366
+
367
+ - `utils/user_utils.py`, the payment `__main__` runners, the `core.Bot`/`core.initialize_*` lazy exports and `MANAGER_METADATA`.
368
+ - The individual env rows for the 51 posture members and the `posture_flag`/`safe_local_flag` helpers.
369
+ - The unread `modules/database/schema.sql` and the dead `./.polyrob/.env` project-write code.
370
+ - The 43 flags marked "Retire after 1.4"; their default behaviour is permanent. `BOT_INSTANCE_ID`, `BOT_OWNER_USER_ID`,
371
+ `MASTER_SEED` or `WEBGATE_MULTITENANT=true` set alone refuse to start and name the rename; `doctor` lists retired names.
372
+ - 61 internal tuning env knobs are module constants with unchanged defaults, and four dead flag rows are gone.
373
+ - The Fly kit, `deployment/legacy/`, `CLEAN_DEPLOY.md` and the dead one-off scripts.
374
+
375
+ ### Fixed
376
+
377
+ - `DEFAULT_MODEL`/`CHAT_MODEL` reach every run on the pinned provider (cron, goals, planner, clients, fallback), not only
378
+ chat; `core.runtime_config` is the one reader of the pin, and a blank `CHAT_` value no longer hides `DEFAULT_`.
379
+ - `polyrob update --apply` sees a live owner turn under the `polyrob service` user unit: the turn marker
380
+ follows the data home, not the unit's working directory.
381
+ - Owner rules: a patch edits only the active rules (Superseded history is never rewritten), duplicate Superseded
382
+ entries collapse, the cap is 24,000 chars, and an over-cap doc loads truncated with a warning, not dropped.
383
+ - Memory recall searches the turn's own words: a cron run its job text (not the owner-rules overlay), a goal its title
384
+ and body, a chat turn the newest owner message; FTS drops stopwords; one injection is capped at ~9k chars.
385
+ - Memory no longer stores tool-call echoes, strategic-clue hints or short run-status lines; a one-time curator purge
386
+ backs up memory.db, then cleans stored rows; unprotected cron/goal rows age out after 45 days.
387
+ - The X post gate says why a post needs the owner (the untrusted source read, or the agent-authored job and `/adopt`);
388
+ a write receipt no longer taints a run, and `cronjob_list` names each job's author.
389
+ - The X DM read resolves a handle from the inbox listing's id; a handle X does not know is a dead target, skipped
390
+ 7 days; a token refresh, a late-approved send and a cron post close their X Chat client's session.
391
+ - In a scheduled or goal run, `send_message` refuses a line that starts with `@handle` and names `message()`; a
392
+ delivered send says it went to the owner's private chat, and so does the owner-thread line.
393
+ - Unknown-setting refusals (`preferences`, `polyrob config`, `/config`, the env typo audit) find the close key even
394
+ when its words are in another order; `preferences explain`/`set` name up to three.
395
+ - A provider credit refusal (z.ai 429 code 1113) is a named NO BALANCE error, not retried as a rate limit; failover
396
+ starts at once, and the SDK sends it once instead of three times.
397
+ - Telegram polling backs off 1 s → 30 s with jitter on a getUpdates failure streak instead of retrying every second.
398
+ - A gated tool a session re-requests is warned once per process; the MCP tool is not offered with no MCP server.
399
+ - An owner-approved X post sent after the asking run stopped waiting, and a cron job's X delivery, now initialize the Twitter tool they build; both failed "client is not constructed" and lost the approval.
400
+ - An owner buyback of a trusted token (own launch, owner pin or owner target) on a chain no price source covers is no longer capped at the $5 unchecked-route ticket; a disagreeing route and an untrusted token still are. An EVM swap dry run now reports that refusal instead of passing.
401
+ - The X browser rail was missing from the financial-claim gate and the evidence ledger (lists named `x_post`).
402
+ - The Telegram DM gate admits `POLYROB_OWNER_TELEGRAM_ID`; a shadow signer that never answered uses the local caps
403
+ with a notice, not $0.
404
+ - The HTTP KB, the server session tree and the owner verbs `soul`/`persona`/`knowledge`/`kb` use the deployed data home.
405
+ - Six fire-and-forget tasks, including the approval-queue owner wake, are retained; a failed `polyrob run` bootstrap
406
+ turns logging back on.
407
+ - An Agent built without a `memory_manager` keeps its chat persona; the memory fallback no longer replaces the
408
+ config the MessageManager reads `persona_block` from.
409
+ - `send_message` says it reaches only the session's own person (the owner in a scheduled run) and names
410
+ `message(target=…)` for rooms, so a room reply no longer lands in the owner's private chat.
411
+ - Env reads the flag catalog missed are documented, including `BYPASS_PAYMENT_FOR_ADMINS` (default on); nineteen
412
+ flags that read only the exact string `true` use the shared parser, and a test checks documented defaults.
413
+ - `bs4`, `yarl`, `eth-utils` and `eth-abi` are declared dependencies; a test fails on any undeclared import.
414
+ - Refusals, remedies and the profile unit no longer tell users to run `scripts/` or `deployment/` files.
415
+ - The migrations schema-version fallback names 1.10.0, the newest shipped migration, not 1.4.0.
416
+ - `VOICE_TRANSCRIPTION_ENABLED` is documented as default ON, which is what the code does; the docs and
417
+ `polyrob doctor --flags` said OFF while every voice note was transcribed.
418
+ - The console Activity stream reads telemetry from the one telemetry location (`core.event_log.telemetry_db_path`),
419
+ so it no longer shows an empty system feed after the sidecar move or with `TELEMETRY_EVENT_LOG_PATH` set.
420
+ - A large tool result offloaded during a run whose workspace is the project folder is written there, where
421
+ `filesystem_read_file` looks, instead of the session directory the read could never reach.
422
+
423
+ ### Security
424
+
425
+ - One owner-set security settings table (`SECURITY_SETTINGS`, `core/security/settings.py`): every check that can refuse
426
+ natural work reads its row; the fixed floor rows are listed beside it and shown on the `custody` status line.
427
+
428
+
429
+ ## [1.3.0] — 2026-10-09
430
+
431
+ ### Added
432
+
433
+ - **Terminal parity:** host shell at posture 3 behind one command guard; jobs with stdin, PTY, notify and receipts;
434
+ sudo prompt; ssh, Podman, Modal, Daytona, Vercel and Singularity backends; egress proxy; tool-calling scripts and
435
+ a persistent Python kernel in `run_code`.
436
+ - **Full mailbox for the agent:** list, read, save attachment, threaded reply, forward, folders, mark, move and delete
437
+ to Trash; `email_send` gains cc, bcc, html and attachments, every recipient gated. `email_read_machine_mail` returns
438
+ activation links and codes from auto-generated mail only.
439
+ - **Room moderation:** `room_moderate` mutes, unmutes, bans, unbans and deletes messages in an allowlisted room; owner
440
+ and admins are never targets, and a room turn or tainted session cannot call it. `room_read` lines carry `{uid=… msg=…}`.
441
+ - **Telegram post deletion:** receipts carry a message id; `message(action="posts")` lists the agent's posts and
442
+ `message(action="delete")` removes them by row, id or last N on owner instruction (not past 48 h or others' posts).
443
+ - **`/adopt`:** the owner makes an agent-authored cron job or goal their own from an action card that shows the whole
444
+ task, every payload key and each pinned skill with a content digest, and binds them.
445
+ - **Procedure skills:** `incident-response`, `adversarial-consensus` (blind `delegate_task` panel, judged, never
446
+ averaged) and four `coding-workflow` references (review, triage, debugging, cleanup).
447
+ - **The agent knows the version it runs:** `<environment>`, status and `agent_status` show `get_version()` and the
448
+ deployed sha; `agent_status(release_notes=...)` reads the shipped CHANGELOG.md.
449
+ - `defi_data.wallet_activity` on another address lists our own recorded payments to it from the wallet audit ledger
450
+ (an unreadable ledger reads UNKNOWN).
451
+
452
+ ### Changed
453
+
454
+ - **Wallet caps:** with a signer installed, every agent limit (per-tx, daily, x402 per-payment and window) clamps to
455
+ the signer's; the signer is the one envelope, raised only by root. Each limit flag has one resolver.
456
+ - **Shell defaults:** ceiling 300 → 600 s and a longer timeout becomes a background job; a gated `shell_run` waits for
457
+ the owner only on a dangerous command (`SHELL_APPROVAL_MODE=every` restores the old behavior).
458
+ - **One authorship rule for standing work:** owner authority reads a positive `authored_by=owner` stamp; an owner turn
459
+ that read outside text writes agent work and says so. Owner goals carry owner cron jobs' standing authority.
460
+ - **Fewer owner taps:** trusted Solana and EVM buys, Polymarket and plain Hyperliquid cancels, sends to the owner's or
461
+ own address, `$(…)`, relative `rm -r`, `env | grep`, workspace dev commands and 12 console settings need no approval.
462
+ - **Cron runs follow the owner:** a run opens with every newer owner rule marked as overriding the job text; an
463
+ approved answer to a run's ask re-runs the job now, and every seat says where the answer went.
464
+ - **Rules docs hold twice as much** (owner 16000, contract 8000, self 12000 chars), and a background run's patch of an
465
+ active rules doc lands a pending revision for `owner promote` instead of a refusal.
466
+ - `DEFAULT_TOOL_TIMEOUT_SECONDS` defaults to 180 s instead of 60 s, still below the step timeout.
467
+ - The unconfigured local data home is `~/.polyrob/data`, never `./.polyrob`; the Docker image uses `/app/.polyrob`.
468
+
469
+ ### Removed
470
+ - The deprecated `/api/polymarket/*` and `/api/hyperliquid/*` mounts that 1.2.0 kept for one release; use
471
+ `/api/packs/markets/...` (the old paths now answer 404).
472
+
473
+ ### Fixed
474
+ - A bare `pip install polyrob` could not import `tools` (and refused the `discovery` pack): `openai` 3.x moved to
475
+ `httpx2`, so `httpx` is now a direct base dependency.
476
+
477
+ - The agent's file tools read, copy, grep and edit a world-readable hard-linked file (uv/pnpm cache trees) and
478
+ app snapshots ship it; a link to a private file, every append and every store/ledger read stay refused.
479
+ - `defi_data.wallet_holdings` (an explicit, public address) is a read-job verb again.
480
+ - A measured insufficient balance/allowance (LP builders) and a vetted Solana simulation that reverted are
481
+ tagged preconditions and no longer taint the run; the LP node-rejected broadcast carries its kind.
482
+ - `polyrob autonomy on/off` and `config set` write the home `.env` the CLI reads; `--project` (a never-loaded
483
+ `./.polyrob/.env`) is refused and names that file. `init`/the REPL no longer create `./.polyrob/sessions`;
484
+ `uninstall`, profile and help texts name the real data home.
485
+ - An autonomous X post waits in-run for the owner's tap and ends inside the `twitter` action timeout; a late approval
486
+ sends exactly the approved parameters once. An untainted owner-authored cron job posts without a per-run approval.
487
+ - X DMs work on encrypted X Chat: unsigned sender keys read as `verified: false`, and plaintext is used only for a cold
488
+ open X Chat refuses, when the owner approval names it. An account with no tweets reads as an empty timeline.
489
+ - The agent can click and type in the browser again: the indexed element list reaches the prompt, and page extraction
490
+ uses `aria_snapshot()` since Playwright 1.63 removed `page.accessibility`.
491
+ - `defi_data.wallet_activity` and `token_origin` work again: an explicit param model reaches an unannotated or dotted
492
+ `params` argument as the model instead of splatted kwargs.
493
+ - `defi_data.reconcile` reuses an unchanged dust verdict (6 h), so airdrops no longer time out the money rails' gate;
494
+ a market or precondition error no longer taints a run's public rails.
495
+ - Jupiter swaps decode every v6 route variant and the `route_v2` layouts; Solana swaps resolve lookup tables; a declared
496
+ `max_spend_usd` asserts the value only, with the network fee charged to the caps.
497
+ - Wallet: an expired unsettled x402 payment resolves from chain state, our own bridge's arrival is not an "unmatched
498
+ payment", and the agent-NFT send card shows the holdings.
499
+ - `hf_deploy`/`app_deploy` refuse a file that changed after the last green `run_tests`; a delegated child stopped at
500
+ its step limit reads "stopped before finishing"; `done` turns back once while todos are open.
501
+ - A goal run whose `done()` opens with `BLOCKED:` is blocked, not done; a blocked goal has one open owner ask; goal
502
+ claims fence each run, so a stale run cannot overwrite its replacement.
503
+ - Scheduled jobs respect live edits and cancellations; stepped day fields such as `*/2` keep their days; `cronjob_show`
504
+ names when and via which surface a job was cancelled.
505
+ - A turn never delivers the same reply twice, and the LLM-timeout notice says the step is retrying instead of asking
506
+ the owner to resend (which could pay twice).
507
+ - A tool's deliberate `ServiceError` refusal reaches the agent without a traceback; the log keeps it.
508
+ - A failed lookup is not proof of absence: a not-found read names the path tried and offers same-name files; a finding
509
+ beside a failed tool call is stored `[unverified]`.
510
+ - The workspace note never invents an upload: relative paths, record-backed upload claims and declared `authored_by:`;
511
+ A2A peer messages are labelled as not the owner, and an unreadable self-context doc is named.
512
+ - SQLite opens tolerate a sidecar unlinked by another account, and the shared data root is never sticky, so the outbox
513
+ dispatcher no longer fails with "readonly database".
514
+ - Cancelled, failed and resumed autonomous runs release their sandbox; sandbox reapers skip when the Docker socket is
515
+ unreachable; the cross-session turn store has its own 100k-row bound.
516
+ - Room moderation no longer repeats (room posts join the room ledger, deleted lines are marked), and Telegram polling
517
+ logs one recovery line after an outage streak.
518
+ - `config set/unset` and `tools enable/disable` keep the home scope with `--global`; Microsoft 365
519
+ `Authentication-Results` that open with a result are read; owner CLI API-key creation works under the strict tier.
520
+
521
+ ### Security
522
+
523
+ - Deployment: ops loops run as an unprivileged account; the agent never runs as root and its HOME leaves the data home;
524
+ root steps use pinned no-follow descriptors; rollbacks stay inside configured paths; console vhosts pin TLS and HSTS.
525
+ - Signer: its own venv; serves only a client's main process; keeps full approval details in a bounded queue; needs
526
+ on-box approval for owner-queue verdicts; Hyperliquid RPC signs cancellations only; clients refuse before cap check.
527
+ - The spend ledger is sealed with a seed-derived MAC; browser egress closes the host's own and special-use addresses;
528
+ `CODE_EXEC_SSH_KNOWN_HOSTS` pins the ssh backend's host key.
529
+ - CI and release: least-privilege workflows, SHA-pinned actions, digest-pinned base images, a checksummed gitleaks
530
+ download, a read-only build job and tag-only release; PyJWT and multidict floors rise.
531
+ - Console: owner authentication on local consoles including Socket.IO; session JWT audience, strict cookies and one
532
+ origin check; login budgets persist and group IPv6 by /64; logout is a same-origin POST; scripts are self-only.
533
+ - Console and API isolation: tenants cannot read MCP, health, telemetry or instance flags; trust and money flags are
534
+ file-only; `polyrob dashboard` boots with a one-time password; session feeds cannot join global rooms.
535
+ - API keys carry read/write scopes and bounded expiry (legacy keys are replaced via wallet sign-in); rate limits key on
536
+ an IPv6 /64; SIWE nonces, the A2A list page and live SSE streams per caller are bounded.
537
+ - Billing: credits reserve before inference and settle once; the compute tier gate covers every paid surface; unpriced
538
+ models are refused; billed sessions get standard step and tool bounds; continuations recheck payment admission.
539
+ - Payments: settlement validates hash, chain and replay; test-network invoices and deposits are never income; inbound
540
+ submissions persist before settlement; x402 recipients are bound at approval and signing.
541
+ - Spend accounting counts EVM gas, Solana fees and rent, rounds risk upward and keeps decimal deposit precision; direct
542
+ transfers need owner approval, and payees that look like a recent payee (address poisoning) are refused.
543
+ - Swaps, bridges and LPs verify LI.FI, Jupiter and v3 calldata minimums and recipients before signing; floors compare
544
+ against independent prices; Solana routes refuse unrelated outflows; positions size from simulated balance changes.
545
+ - Venue orders reserve at the network boundary, use live reference prices with a price band and worst-case slippage,
546
+ enforce exposure and leverage limits, and never book a rejected order; worst market fees count against the caps.
547
+ - Untrusted content: repository, filesystem, delegated and paid-server results are framed as data; forged control
548
+ fences are neutralized; room titles, blocked members' history and pool labels stay out of instructions.
549
+ - Provenance: model-created goals and cron jobs keep agent provenance; persistent rules and skills need owner review;
550
+ an `owner_ask` answer must quote the owner's turn; correspondent turns cannot keep private owner documents.
551
+ - Shell guard: newline boundaries, wrappers and brace groups are judged; wildcard grants over shell syntax are refused;
552
+ git takes plain branch names; non-Python `run_code` runs through the guard; owner-only CLI verbs refuse under the agent.
553
+ - Surfaces: non-owner DMs are denied on non-Telegram surfaces; the WhatsApp webhook secret is required; email senders
554
+ need an MX-authenticated From; IMAP verifies certificates; voice media is bounded; pairing codes expire.
555
+ - Filesystem: SQLite stores are created private and linked stores refused; publication, export and attachment reads are
556
+ confined; file tools use `O_NOFOLLOW` descriptors; CLI startup ignores project-local env and MCP files.
557
+ - Secrets: endpoint credentials are redacted in config listings, errors and logs; X cookies import through hidden
558
+ prompts; provider failures omit credential-bearing URLs; legacy unguarded Twitter writes are retired.
559
+ - Packs and updates: a third-party pack builds to a wheel with no outside files; index rows admit only plain names; a
560
+ profile review shows its env keys, MCP, cron and skill content; app deploys bind the approved directory and digest.
561
+ - Memory and identity: planner and recall writes stay scoped and new notes await owner review; correspondent sessions
562
+ write no owner episode; ERC-8004 identity selects only a self-minted token.
563
+
564
+ ## [1.2.1] — 2026-10-03
565
+
566
+ ### Changed
567
+
568
+ - **Agent-NFT snapshot, inspect, journal and bind run in core:** they no longer need the agent-NFT package, which keeps
569
+ only mint, adopt's pfp/positions/Brief and a collection's own view lines.
570
+
571
+ ### Added
572
+
573
+ - **`VALUELESS_CHAIN_MONEY` (off):** the owner's opt-in to a core run on Robinhood Chain testnet 46630 — its native coin
574
+ is priced at $0, so the USD caps do not bind, and every fee stays bounded in wei.
575
+ - **`agent_nft_adopt`:** an owner-approved verb that reads an agent NFT's journal history from the chain, runs the
576
+ package's adopt, then writes a handover entry; a note with no action is now an on-chain journal entry too.
577
+ - **`/nft trust <collection>`:** the owner trusts an agent-NFT collection from chat — a read-only quote card, then `go`
578
+ writes an owner pin (no mint/reveal) beside the token pins; the root file stays for admin pins. `/nft` lists the trusted collections.
579
+ - **The agent-NFT journal goes on chain:** each account action carries its signed entry in the same `executeBatch`
580
+ (`JournalLog.log`); the next entry continues the chain read from the account's events. No site upload.
581
+
582
+ ### Fixed
583
+
584
+ - **Reconcile gate timeout:** `defi_data.reconcile` prices the chain side from the batch prefetch (booked tokens
585
+ first) and values rows on a small pool; a 116-token treasury fell from >90 s (past the 60 s budget) to ~13 s.
586
+ - **Sandbox reapers:** both skip when the process cannot open the Docker socket (the agent identity is outside
587
+ `docker` by design), ending ~100 refused `docker ps` WARNING lines a day.
588
+ - **Identity doc caps:** owner facts rise 4000 → 8000 chars and SELF 2200 → 6000 (both had filled and refused a new
589
+ owner rule); tool descriptions quote the live caps.
590
+ - **X login:** building an X client no longer spends the rotating refresh token, refresh logs name
591
+ their process, and `/x login`/`/x status` say the 2-hour access token renews itself.
592
+ - **Holdings watch:** the scan runs off the event loop; the owner hears once after 6 failed passes in a row
593
+ and once when it works again.
594
+ - **`/journey`, `/recap` and `polyrob journey` default to 24 h** on every seat, and the REPL reads the deployed home.
595
+ - **Outbound delivery:** the auto-opened breaker probes and closes; a repeated message is sent, not swallowed; a
596
+ process drains only its own surfaces, on a lease; quiet holds keep target, files and full text in `digest.timezone`.
597
+ - **Money waits survive a cancel:** Ctrl-C during any receipt wait (send, swap, LP, claim, launch, deploy, call, NFT) records
598
+ the broadcast against the cap and `/book` and says the tx may have gone through; Telegram runs every `go` verb off the poll loop.
599
+ - **Console reads say when they fail:** identity, memory, Work › Log, pickers and the activity tail report "could not read"
600
+ instead of empty; the thread re-syncs after a reconnect or `feed_gap`; own_ops opens every listed chat; money cells format.
601
+ - **Seat parity:** bare `/approve` never decides; one `/kb` grammar; the REPL reads the deployed owner and instance; inline
602
+ approvals need a slash token; console typos get the help answer; quote-card Refresh re-quotes from the typed words.
603
+ - **Chat surfaces:** Discord stops on a fatal close code and no longer blocks its gateway; IMAP runs off the loop with a
604
+ timeout; harness replies split to the platform limit; WhatsApp/Feishu replays refused; email auto-replies ignored.
605
+ - **HTTP API:** `Bearer rob_…` keys and `X-Service-Token` authenticate; the JWT `user_id` claim wins; validation errors are 422;
606
+ `/v1` accepts content-part arrays and streams errors and usage in the OpenAI shape; A2A push-config reads and deletes work.
607
+ - **Agent-NFT journal entries are signed under `WALLET_SIGNER=remote`:** the signer's new `journal.sign`
608
+ op signs the account journal template and nothing else; before, no entry was ever written.
609
+
610
+ ### Security
611
+
612
+ - Owner authority needs an `authored_by=owner` stamp (`python -m cron.stamp_authorship`); `/adopt` shows
613
+ all and binds pinned skills; the shell guard resolves symlinks and state-db writes; taint exemptions
614
+ are tagged at the source; an autonomous X post waits for the owner's tap, not "denied".
615
+ - Entry points run isolated; the data home never comes from the cwd; the shell guard sees through
616
+ wrappers; pack wheels, profile installs, git refs, app deploys and file ops are pinned; scrubbing,
617
+ the X lock, TLS and CI permissions are tightened.
618
+ - Deployment counters replace legacy agent-owned files atomically with private inodes,
619
+ preserving open aliases and refusing link redirection during upgrades.
620
+
621
+ - Require an approved USD ceiling for Hyperliquid orders and show venue USD amounts on every approval card; live price or slippage changes cannot exceed the approved ceiling.
622
+
623
+ - Bound Telegram chat dispatch and voice transcription; a cancelled or timed-out transcription retains its CPU slot until the worker finishes.
624
+
625
+ - Refuse third-party code packs when remote signing is available and refuse their installation as root, preventing pack builds from sharing signer privileges.
626
+
627
+ - Enforce atomic per-tenant memory row and content-size limits, preserving existing knowledge when an oversized replacement is refused.
628
+
629
+ - Publish profile backups atomically with owner-only permissions, refuse existing output links/files and clarify the limits of text redaction.
630
+
631
+ - Detect unlabelled English BIP-39 seed phrases by checksum and Solana key arrays by their public key before persistence or export.
632
+
633
+ - Default new-wallet welcome credits to zero and refresh stale access-token holder entitlement before access; unverifiable ownership fails closed.
634
+
635
+ - Broaden address-poisoning checks, refuse unreadable history and apply the same recipient check to agent-account NFT handovers.
636
+
637
+ - Mark settled x402 payments for refund review when HTTP-200 JSON reports an application failure, including JSON-RPC errors.
638
+
639
+ - Share durable hourly X write limits across API and browser tools, workers and sessions; reserve all thread posts before sending.
640
+
641
+ - Scrub episode content and structured metadata, and use the same scrubbed knowledge text for keyword storage and vector embedding.
642
+
643
+ - Verify the expected X account before persisting an OAuth callback; bind login links and refreshed credentials to that account ID.
644
+
645
+ - Keep Signal identity stable across phone-number privacy changes by requiring the daemon account UUID; legacy phone-based permissions need review on upgrade.
646
+
647
+ - Label human transcript authors without implying owner authority and keep different senders distinct.
648
+
649
+ - Validate local dependency overlays, retain root ownership of fresh browser installations, and run deployment imports and migrations as the agent service account.
650
+
651
+ - Bind profile installs and updates to reviewed content digests and immutable remote commits; reject linked, special and oversized source files.
652
+
653
+ - Disable generated mass mentions and application links across chat transports; keep private command replies out of rooms and bound denial notices.
654
+
655
+ - Require authentication for API docs, schema and model discovery; expose detailed health metrics only on the administrator route.
656
+
657
+ - Reject lossy session identifiers instead of stripping or truncating them; API and console data paths require canonical IDs.
658
+
659
+ - Keep automatically indexed agent documents in a separate unreviewed collection; only explicit ingestion adds them to default knowledge recall.
660
+
661
+ - Enforce the autonomous tool ceiling during progressive loading and show the same restriction in catalog, search and describe results.
662
+
663
+ - Preserve brain and reasoning scrub state across streamed chunks; public rooms receive only complete, scrubbed replies.
664
+
665
+ - Confine browser downloads, frame automation alerts as quoted reports, and require PKCE with expiring, principal-bound OAuth callback state.
666
+
667
+ - Pin portal Markdown dependencies to current releases and verify their CDN bytes with SHA-384 subresource integrity.
668
+
669
+ - Drop Fly startup privileges before loading volume code, refuse root checkout installs, and stop persisting or sourcing process secrets as shell text.
670
+
671
+ - Require hashed release wheels for legacy optional installs, run the API container without root, bind Compose to localhost, and disable the retired TLS-key copying script.
672
+
673
+ - Autonomous coding-agent launchers refuse root; workspace and coding I/O reject hard-link escapes.
674
+ - Room and correspondent findings cannot enter owner memory; explicit job tools obey the current agent ceiling,
675
+ resumed autonomous sessions retain their classification, and persona/toolset edits require owner review.
676
+ - API accounts obey administrator blocks across protected routes; tenant consoles cannot create owner-authored
677
+ work, MCP hints cannot disable effect gates, and shared X credentials are unavailable to delegates.
678
+ - Persisted text redacts quoted credential keys, Basic authentication, URL userinfo, cookies and GitHub tokens;
679
+ file guards cover Docker, Kubernetes, GitHub and Solana credential stores.
680
+
681
+ - **The REPL history keeps no secrets:** `/config set` of a secret key and any line with a 64-hex key are not
682
+ recorded, the file is `0600`, and the display scrubber redacts a labelled private key.
683
+ - **An edited Telegram message never runs again:** edits are dropped before routing, so a corrected old `/send … go` or
684
+ `/pay … go` cannot move money twice; Telegram dedup keeps 24 h and honours `retry_after`.
685
+ - **API keys cannot mint or revoke keys;** key validation is cached 60 s and revoked at once; x402 charges only a new A2A
686
+ `message/send`, and a post-settlement failure is marked refund-due; `/api/chat/message` is payment-gated; uploads refuse symlinks.
687
+ - **Room offer cancel is compare-and-set:** a cancel can no longer overwrite an offer the settlement watcher just marked paid.
688
+ - **Console hardening:** an empty `WEBGATE_HOST` no longer binds all interfaces; own_ops refuses to boot without login
689
+ config; refused socket joins stay rate-limited; `/logout` clears storage without inline script; no server text in `innerHTML`.
690
+ - **ERC-6909 approvals are seen:** the guard refuses an ERC-6909 grant and measures a claim-token move like an
691
+ NFT's; the account approval scan and `agent_nft_revoke_all` cover ERC-6909 allowances and operators.
692
+ - **Agent-NFT account calls are held to the pinned collection:** the account's `token()` must be a pinned
693
+ collection with unchanged code; no asset may go to the account of an unminted token; and nothing may move
694
+ on the treasury side of an account call except the account paying its owner.
695
+
696
+ ## [1.2.0] — 2026-10-02
697
+
698
+ ### Added
699
+
700
+ - **Telegram avatar push.** `polyrob avatar push --telegram [--telegram-chat ID]` now sets the bot photo
701
+ (`setMyProfilePhoto`, JPEG) and each named group's photo (`setChatPhoto`); hash-idempotent, falls back
702
+ to the BotFather steps.
703
+ - **Check any wallet or token.** New read verbs `wallet_holdings`, `wallet_activity` and
704
+ `token_origin` (Solana and EVM), `positions` (the agent's own P&L), the `/check` command, and
705
+ cron price watches with an alert threshold.
706
+ - **One owner word per concept.** A glossary of owner words (chat, goal, scheduled job, decision,
707
+ holdings, limit, network, abilities, permissions and more) is now checked across the console, the
708
+ command help, Telegram and the terminal; the number of strings with an old word can only fall.
709
+ - **`/run` on Telegram and in the terminal:** list what runs in the background now, numbered, and
710
+ pause, resume or stop ONE run (`/run pause 2`). Before, only the `polyrob session` command could
711
+ do this. Refused inside a group.
712
+ - **Agent NFTs:** `/nft` lists the owned NFTs with their accounts, balances and open approvals;
713
+ `/nft send <id> <to> [go]` gives one away; a watch tells the owner when one arrives or leaves.
714
+ Sends, swaps, claims and portfolio reads take `account=` or `nft=`. Needs `AGENT_NFT_ENABLED`.
715
+ - **Agent NFTs:** the `agent_nft` tool (inspect, journal, revoke, mint, reveal, withdraw)
716
+ behind `AGENT_NFT_ENABLED` (default off). The treasury acts through an NFT's ERC-6551
717
+ account only as the NFT's owner; positions take `account=`.
718
+ - **NFT collections:** the owner pins one in `/etc/polyrob/agent_nft_collections.json`
719
+ (empty by default: every mint and reveal refuses). `tx_guard` checks exact mint and reveal
720
+ shapes; `AGENT_NFT_REVEAL_MAX_GAS_USD` (1.00) caps a reveal.
721
+ - **Cron write jobs:** `payload.write_verb` runs one allowlisted write verb (the collection
722
+ reveal) with no model turn, through its own gates and `tx_guard`. Off unless
723
+ `CRON_WRITE_JOBS_ENABLED=true`; only an owner-authored job may carry one.
724
+ - **Cron read jobs and pause windows:** `payload.read_verb` runs one allowlisted read verb
725
+ with no model turn (`deliver_on` `alert`, `always` or `never`); a tick inside
726
+ `payload.pause_windows` is skipped at $0. Read and write jobs may recur every minute.
727
+ - **Uniswap v4 liquidity:** `defi_data.pool_metrics` monitors a Pons v4 pool, `lp_pool_info`
728
+ and `lp_quote` read one, and `defi_trade.lp_add(protocol='v4')` adds a full-range
729
+ position. New caps `LP_ETH_CAP` (default 0), `LP_ETH_DAILY_CAP` and `LP_ETH_FLOOR`.
730
+ - **X login from chat:** `/x login` renews the agent's X API login from any owner seat
731
+ through a one-time authorize link (needs `X_OAUTH2_REDIRECT_URI`); `/x status`, `/status`
732
+ and `polyrob doctor` show the login state.
733
+ - **Packs:** optional extensions (`polyrob.packs` entry points, `pack.toml`) add tools,
734
+ verbs, routes and skills; `polyrob pack list|info|doctor|enable|disable|install|remove`,
735
+ `POLYROB_PACKS_DISABLED`.
736
+ - **Cron:** a job whose rail needs a credential only the owner can fix (an expired X login,
737
+ an X API 402) is skipped at $0 instead of running a model turn; the owner is told once.
738
+ - **Cron:** a job that names the same owner-only remedy on 3 runs in a row raises one owner
739
+ question: I will run it, or retire this job.
740
+ - **Owner money verbs:** `/send`, `/swap`, `/pay <url>`, `/writeoff` and `/unquarantine` on
741
+ Telegram and the REPL. The bare form quotes; `go` acts within the quote (+5%, or `max
742
+ <usd>`). The chain is never guessed; a token is an address. Not in rooms.
743
+ - **Action cards:** a money quote is a card with Confirm / Refresh / Cancel
744
+ (`/card_<id>_ok|re|no`); Confirm runs the quoted line once, with every gate. `/cards`
745
+ lists open cards; bare `/send` or `/swap` and the console's *Make a move* build the order.
746
+ - **Agent tools:** `present_choice(question, options)` shows 2–6 buttons and returns the
747
+ owner's pick; `propose_action(command, why)` puts a money verb to the owner as a card.
748
+ Both are refused in rooms, in sub-agents and in correspondent sessions.
749
+ - **Token trust:** `/wallet tokens`, `/wallet trust|untrust`, `polyrob wallet
750
+ pin-token|unpin-token|pins` and console Money › Book. A buy of an unproven look-alike asks
751
+ the owner once; a token this instance launched is trusted.
752
+ - **Buy targets:** a goal or cron job may declare `target_token: {chain, address}`; the run
753
+ then acquires no other non-canonical token, and the work it creates inherits the target.
754
+ - **Solana sends:** `defi_trade.solana_transfer` sends SOL or an SPL token by mint, creates
755
+ a missing token account, defaults to `dry_run`, and refuses Token-2022 transfer fees,
756
+ hooks and unknown extensions.
757
+ - **Wallet submissions:** `polyrob wallet submissions` lists unresolved submissions (one
758
+ blocks every send); `polyrob wallet release-submission <ref>` releases one only by booking
759
+ its worst-case charge (`--charge-usd`, or `--never-sent --reason`).
760
+ - **Wallet caps:** `polyrob doctor`, `/status` and `polyrob wallet set-cap` say when the
761
+ agent's cap is above the signer's hard cap in `signer.toml`, and name both remedies.
762
+ - **x402:** `x402_pay` joins the autonomous toolset when `DEFI_AGENT_AUTONOMY` is armed: up
763
+ to `X402_AUTONOMOUS_MAX_USD` it pays and reports, above it waits for `/approve`.
764
+ `x402_fetch` takes `request_id`, so a retry never pays twice.
765
+ - **Trading skills:** ten procedure skills (`token-identity`, `pre-trade-check`,
766
+ `trade-execution`, `exits`, `dca` and more); `treasury-trading` is split into five smaller
767
+ skills; `hyperliquid-trading` and `polymarket-trading` teach the basics.
768
+ - **Skills:** a skill's `requires` list pulls in at most two prerequisite skills past
769
+ `max_skills`; a disabled skill is never pulled back in.
770
+ - **Chat:** `/why [n]` lists the last gate refusals (default 5, at most 20) with the tool
771
+ and the gate's reason, on Telegram, the REPL and the console.
772
+ - **Chat:** `/cron list|show|add|edit|cancel` on Telegram and the REPL alike; `add` takes
773
+ `tools=` and `target=<address> chain=<chain>`, and `edit` changes the schedule or the
774
+ task.
775
+ - **Chat:** an owner question with lettered options (`A) … or B) …`) carries one answer
776
+ button per option on Telegram.
777
+ - **Cron:** `cronjob_show` returns a job's full definition; `cronjob_edit` changes a live
778
+ job in place (task, schedule, cap, rig, delivery, skills). An autonomous run may edit only
779
+ its own jobs.
780
+ - **Outward acts:** every outward act is one `external_write` telemetry row by class
781
+ (social, comms, public, money, code, self, network); an autonomous write in a class the
782
+ owner paused is refused. `EXTERNAL_WRITE_TELEMETRY` and `EXTERNAL_WRITE_PAUSE_GATE` (on).
783
+ - **Security ledger:** rate-limit trips are recorded and ranked. `scripts/security_scan.py`
784
+ runs pip-audit, gitleaks and host checks (exit 0 clean, 1 findings, 2 incomplete, 3
785
+ error); the verdict shows on the `security` status line.
786
+ - **Memory scopes:** a goal tree or a cron job can keep its memory in its own scope
787
+ (`AUTONOMY_MEMORY_REGIME` `shared`|`scoped`|`sealed`, default `scoped`); `polyrob owner
788
+ memory scopes`. Behind `MEMORY_SCOPES_ENABLED` (default off).
789
+ - **Rails:** standing work is configuration: a rail is an objective with a recurrence,
790
+ managed with `/rail` and `polyrob rails` (new, edit, on/off, grant, revoke, export,
791
+ import). A money grant stays inert unless money is armed.
792
+ - **Workers:** `delegate_task(profile="<id>")` runs an owner-approved worker with its own
793
+ brief, budget, model and tools; `polyrob workers` and `/workers`. The agent can only
794
+ propose a worker. Behind `WORKERS_ENABLED` (default off).
795
+ - **Wallet signer:** `polyrob-signer` is a separate process that holds the seed, re-runs the
796
+ money guard, signs only known shapes and holds anything above its caps in
797
+ `/etc/polyrob/signer.toml`. `WALLET_SIGNER=local|shadow|remote` (default `local`).
798
+ - **Files:** `filesystem_append_file` takes `after_anchor` and inserts after the one line
799
+ that contains it; no match or more than one match writes nothing.
800
+ - **Feishu / Lark surface:** set `FEISHU_APP_ID` and `FEISHU_APP_SECRET` (long connection,
801
+ extra `[feishu]`) or `FEISHU_TRANSPORT=webhook`; `OWNER_FEISHU_ID` makes it an owner seat.
802
+ In a group it answers only when @-mentioned.
803
+ - **DingTalk surface:** Stream Mode (no public URL, no extra), text in DMs and on an
804
+ @-mention in groups. Credentials `DINGTALK_CLIENT_ID` / `DINGTALK_CLIENT_SECRET`.
805
+ - **Surfaces:** `polyrob surfaces list | add | probe` shows each surface's flag and
806
+ credentials, stores a credential in the env file, and proves it with a read that never
807
+ sends.
808
+ - **Surfaces:** Discord, Slack and Signal read the owner's photos and files like Telegram
809
+ and email; a contact's files are named but never downloaded.
810
+ - **Telegram:** approval notices and `/pending` carry approve/reject buttons (a press counts
811
+ as the presser typing the command); the "/" menu comes from the verb table.
812
+ - **Telegram voice replies:** with `/prefs set voice.replies true` the agent also answers a
813
+ DM with a voice note (OpenAI speech or local espeak-ng). Off by default.
814
+ - **Chains:** Optimism as a read-only chain (token screens, prices, balances); no money
815
+ moves on it.
816
+ - **Pause:** `/pause release` holds the release train.
817
+ - **Money claims:** an outbound message that says money moved ("I paid $5") is refused as
818
+ `financial_claim_unverified` unless the wallet audit log or a settled invoice holds a
819
+ matching record. `FINANCIAL_CLAIM_GATE_ENABLED` (default on).
820
+ - **Custody status:** a `custody` status section says whether the process is non-dumpable
821
+ and its env scrubbed, and shows the lazy-install mode and the installed features.
822
+ - **Prompt cache:** `ANTHROPIC_CACHE_TTL` (`auto`|`5m`|`1h`, default `auto`): a 1h cache for
823
+ an interactive turn and 5m for an autonomous run, on the Anthropic API only. `/status`
824
+ economics shows cache `writes` (migration `v1.10.0`).
825
+ - **Knowledge:** a `knowledge` status section; the knowledge base indexes what the agent
826
+ writes (`KB_AUTO_INGEST_ARTIFACTS`, `polyrob kb reindex`); sessions expire after
827
+ `SESSION_RETENTION_DAYS` (90, `polyrob sessions prune`); repeated recall becomes one note.
828
+ - **Install:** `install.sh` installs POLYROB on Linux, macOS and WSL2 in one command
829
+ (`--uninstall` keeps your data). New `polyrob setup`, `service`, `uninstall`, `config
830
+ edit` and `tools enable|disable`; an optional extra installs on first use.
831
+
832
+ ### Changed
833
+
834
+ - **Agent NFTs:** `agent_nft_withdraw_token` requires `to=`; it and `agent_nft_revoke_all` work
835
+ without the optional agent-NFT package.
836
+ - **The owner sign-in page and its errors read in plain words** ("Sign in to Rob").
837
+ - **Live-update refusals show a plain console sentence,** never the server's text.
838
+ - **The console nav says Chat and Rob;** the chats button has a visible name ("Chats ⌘K"), the
839
+ pause button says "Pause Rob", and the head lines are short and plain.
840
+ - **The avatar is an image slot.** Every new instance starts with the polyrob mark; set your own
841
+ from a file, a URL or an NFT (`polyrob avatar set`, `/avatar set`, `agent_avatar set_from` on an
842
+ owner turn). Every surface shows it.
843
+ - **Inbox cards say how long they have waited,** and when they expire if they can.
844
+ - **Rob > Overview shows each permission as a question with a Yes or No answer,** names what it
845
+ could not check in plain words, and says where memory is kept in words.
846
+ - **The console no longer shows labels in capital letters.**
847
+ - **The console no longer shows developer source footers;** the Inbox says in one line whether
848
+ every list answered.
849
+ - **Token reads:** prices come from DexScreener, GeckoTerminal and Jupiter and block a trade only
850
+ when they differ by more than 10 % (25 % on thin pools); the `token_info` screen adds on-chain
851
+ facts, Jupiter, RugCheck and Honeypot.is in a short summary. `DEFI_DATA_ENABLED` is on by default.
852
+ - **Replies:** the agent speaks to its user only with `send_message`; `done(text)` is the
853
+ run record. A cron `deliver` gets the run's last `send_message` (none sent, none
854
+ delivered); `style.verbosity=detailed` appends the record for the owner.
855
+ - **Prompts and tool text:** the model notes, the sub-agent contract, the output judge and
856
+ the tool descriptions match the code: `send_message` then `done`, `propose_action` for a
857
+ money move, `present_choice` for a choice, and the real units and limits.
858
+ - **Persona:** a chat seat renders the persona in `PERSONALITY_DEFAULT_CHARACTER`.
859
+ - **Skills:** the money, markets, X, discovery and general skills match the code and name
860
+ chat verbs, never a `polyrob …` command; money triggers no longer fire on common words,
861
+ and `secret-handling`, `person-analyzer` and others have narrower triggers.
862
+ - **First-party packs:** `discovery`, `markets` and `x` ship inside the `polyrob` wheel. ⚠️
863
+ Their SDKs stay extras (`polyrob[twitter]`, `[anysite]`, `[crypto]`); without one, the
864
+ pack's tools are withheld with the remedy. `install.sh --packs` adds them.
865
+ - **Markets pack:** the Polymarket and Hyperliquid tools are the `markets` pack; their
866
+ routes moved to `/api/packs/markets/polymarket/*` and `/api/packs/markets/hyperliquid/*`.
867
+ - **Owner authority:** in a genuine owner turn (chat, or `/send … go`, `/bridge … go`,
868
+ `/pay`) the autonomy pause and the autonomous ceiling do not apply; the caps and the
869
+ simulation bind everyone. An owner approval now sends, not re-queues.
870
+ - **Refusal taint:** after a money action fails or a gate refuses it, the rest of that run
871
+ cannot post to a public or non-owner destination; a public cron `deliver` goes to the
872
+ owner instead. A genuine owner turn clears the taint.
873
+ - **Token identity:** `defi_trade.swap`, `solana_swap` and `launchpad_buy` check WHICH
874
+ contract they buy before any quote: a symbol pinned to another address, a second contract
875
+ for a tracked symbol and an unverified token above $5 are refused.
876
+ - **Book:** `/book` and `defi_data.reconcile` warn when one symbol has more than one
877
+ contract, show positions the ledger does not list and each position's status, and no
878
+ longer claim trading is halted on a disagreement.
879
+ - **Copy:** owner-facing refusals name chat verbs (`/resume`, `/pending`), a daily-cap
880
+ refusal says when the cap frees, and the agent may not claim an act is queued or sent
881
+ without a tool result.
882
+ - **Telegram:** `/config set` shows where a flag write applies.
883
+ - **Lean base install:** `pip install polyrob` carries 24 base dependencies (was 36) and one
884
+ provider SDK; the rest moved to extras (`gemini`, `anthropic`, `memory-vector`, `docs`,
885
+ `media`, `server`). ⚠️ Without `server` an upload is refused with 503.
886
+ - **Goals:** `/goal cancel <id>` means never again (`--once` stops only this run; `/goal
887
+ allow` turns it back on). `/goals` shows what is off, who asked for each goal, and a `NOW
888
+ · STUCK · NEXT · OVER` summary.
889
+ - **Config:** `polyrob config set`, the REPL `/config set` (now with `--global`) and the
890
+ console validate and report the same way; a REPL write of a live-safe autonomy flag
891
+ applies at once, and `/autonomy on|off` needs no restart.
892
+ - **Owner rules:** `OWNER_RULES_IMMEDIATE` defaults on (a rule stated in chat binds on that
893
+ turn), `OWNER_DOC_MAX_CHARS` goes 1600 → 4000, a replaced rule moves under `##
894
+ Superseded`, and a `rules` status section names anything not loaded.
895
+ - **Records:** a workspace `.md` declares `kind: instruction | record`, and the file verbs
896
+ refuse to rewrite or delete a record (`DOC_KIND_ENFORCED`, default on). A cron job or goal
897
+ can pin its skills (`skills=[…]`).
898
+ - **Surfaces:** `polyrob gateway` starts Discord, Slack, Signal, WhatsApp and every new
899
+ surface once its credentials are set (`*_SURFACE_ENABLED=false` keeps one off); new
900
+ options `--skip`, `--no-autonomy`, `--idle-when-empty`, `--host`.
901
+ - **Webhooks:** a webhook surface can answer a platform challenge and ack before the turn
902
+ runs (replayed once after a restart); bodies are capped (64 KB, WhatsApp 3 MB) and a bot
903
+ is capped at 20 lines a minute.
904
+ - **Money regime:** the posture card shows `supervised`, `autonomous` or `armed` and names
905
+ what is missing; `AUTONOMOUS_RIG_DEFAULT=money_rail` no longer gives `defi_trade` to
906
+ agent-authored work outside `armed`.
907
+ - **Prices:** `token_info` names the pool behind a price and grades confidence on that
908
+ pool's depth; the busiest pool by 24h volume is picked; an unknown price stays unknown,
909
+ never `0.0`.
910
+ - **Prompt cache:** `TOOL_SCHEMA_STABLE_ORDER`, `STABLE_AUTONOMOUS_TOOLSET`,
911
+ `TOOL_RESULT_MAX_TOKENS` (6000) and `OPENROUTER_PROMPT_CACHE` default on; a restart
912
+ replays the rendered prompt (`FOUNDATION_REPLAY`) and catalog changes arrive at the tail.
913
+ - **Late tools:** a tool loaded mid-session grows `tools[]` (default), is deferred on an
914
+ Anthropic model that supports it (`ANTHROPIC_DEFERRED_TOOLS`, on), or goes through the
915
+ `tool_call` bridge (`TOOL_SCHEMAS_FROZEN`, off).
916
+ - **Preferences:** `voice.transcript_echo`, `stream.telegram` and
917
+ `delivery.lifecycle_daily_cap` are owner preferences.
918
+ - **Context:** a tool result reaches the model once; compaction thresholds are 70/85/95 %
919
+ (`COMPACTION_*_PCT`), old long tool results shrink to a pointer first, and old images
920
+ retire in batches. `/context` reads the provider's own token count.
921
+ - **Context:** the project-context file cap follows the model window (4%, 4,000–40,000
922
+ tokens); `MAX_EXTRACTED_CONTENT_SIZE` drops to 100,000 characters and
923
+ `MAX_EXTRACTED_CONTENT_TURN_SIZE` (200,000) bounds a turn.
924
+ - **Billing:** on OpenRouter the billed `usage.cost` outranks the catalog estimate; an
925
+ absent cost is `None`, never `0.0`.
926
+ - **Update:** `polyrob update --apply` reinstalls the extras you have under
927
+ `requirements.lock` and waits up to `--wait-idle` (1800 s) for running work (`--no-wait`,
928
+ `--force`).
929
+ - **Models:** an unknown `claude*` id resolves by family (`opus`, `sonnet`, `fable`,
930
+ `haiku`, bare `claude`) instead of a 200K sonnet row.
931
+
932
+ ### Deprecated
933
+
934
+ - The venue API paths `/api/polymarket/*` and `/api/hyperliquid/*` still answer for one
935
+ release with a `Deprecation` header. Move clients to `/api/packs/markets/...`; 1.3.0
936
+ removes the old paths.
937
+ - `LAZY_DEPS_ENABLED` is a deprecated alias of `LAZY_DEPS_MODE` (`true` = `trusted`, `false`
938
+ = `off`).
939
+
940
+ ### Removed
941
+
942
+ - **The Mindprint avatar generator.** `polyrob pfp` (generate, randomize, keep, say, studio), the
943
+ console's `/pfp.*` routes and the live terminal face are gone. A kept face is not carried over:
944
+ the slot shows the polyrob mark until you run `polyrob avatar set <image>`.
945
+ - **Dead prompt code:** the unused system-prompt managers and the shipped
946
+ `data/prompts/system_prompts.json` and `autov2_prompts.json`;
947
+ `send_message.timeout_seconds` left the schema (a call that passes it still works).
948
+ - **Separate first-party pack distributions,** `PROD_PACKS` and the per-pack closure files.
949
+ `install.sh`, `polyrob update` and `python -m migrations.migrate upgrade` retire a
950
+ leftover one.
951
+ - **Plain chat text is never a command.** A sentence that starts with stop, pause or resume
952
+ is chat; use `/pause` (`/halt`) and `/resume`. The plain-word approve/reject and the
953
+ `pause.phrases` preference are gone; use `/approve`, `/reject` or the tap tokens.
954
+ - The `VOICE_TRANSCRIPT_ECHO`, `TELEGRAM_INCREMENTAL_STREAM` and
955
+ `USER_DELIVERY_LIFECYCLE_DAILY_CAP` env flags (now owner preferences).
956
+ - The agent-writable `project/.pylibs` lazy-install directory.
957
+ - The unused `CompactionManager` policy and the dead `AUTO_KNOWLEDGE_RETENTION_DAYS`
958
+ setting.
959
+
960
+ ### Fixed
961
+
962
+ - **Honest avatar replies.** `agent_avatar set_from` and Telegram `/avatar set` no longer claim the new
963
+ image is on every surface; they say the X/Telegram profile photos change only on `polyrob avatar push`.
964
+ - **`/x status` says what each X credential unlocks and how to restore it**: the API login
965
+ covers DMs (`/x login`); the browser session covers posts and outreach (`polyrob x-account capture-session`).
966
+ - **`polyrob dashboard` no longer creates `./data/task` in the folder it runs from:** with no
967
+ `DATA_ROOT`/`POLYROB_DATA_DIR`, its session tree is `<data home>/sessions`, the tree `polyrob`
968
+ writes. `HEAD /avatar.png` answers 200 instead of 405.
969
+ - **A console run that ended without a closing event no longer reads "Working for …" forever:** it
970
+ says "Stopped after … without a final word.", and the Timeline counts steps, not "actions".
971
+ - **`defi_data.positions` lists holdings open only in the position ledger** (bought before the rail
972
+ book) as LEDGER-ONLY with basis unknown, read-only; an unreadable ledger says "could not read".
973
+ - **The position-ledger reader keeps the first row per address**, so superseded rows left in the
974
+ `## Open positions` table no longer count twice or show up as reconcile mismatches.
975
+ - **Anthropic and Anthropic-compatible providers work again with `anthropic` 1.6:** a call no longer
976
+ fails with "unexpected keyword argument 'temperature'"; a third-party endpoint still receives the
977
+ sampling settings.
978
+ - **`launchpad_claim` labels its dollar line as the claim's gas fee** (`cost:`), not as the value
979
+ of what is claimed.
980
+ - **`polyrob wallet init` with no `--data-dir` writes the derivation scheme under `<home>/wallet`,**
981
+ where the running agent reads it; before, a bip44 wallet could resolve to a different address.
982
+ - **An operator-pinned Solana payment mint keeps its case;** before, the asset store lowercased it
983
+ and named an account that does not exist.
984
+ - **An unknown console address shows the error page instead of raw JSON;** it says what happened in
985
+ plain words and keeps the details behind "Show details".
986
+ - **`cronjob_show` names the job's provider pin** — `provider: (owner's seat)` or `<pin> (pinned)`,
987
+ and for a credit-dead pin, the seat it reroutes to (or that runs are skipped).
988
+ - **The console no longer shows a stuck rate-limit banner after a few page loads;** live updates
989
+ resume by themselves.
990
+ - **A credit top-up now unlatches the provider on its own.** At most once per 5 minutes the goal
991
+ dispatcher re-checks a latched seat's balance (OpenRouter `/credits`) and releases the seat only
992
+ when the provider reports a positive balance.
993
+ - **The chat page no longer clips the file pane or covers it with the message box;** on a phone the
994
+ pane opens as a drawer ("Files and steps").
995
+ - **A chat's Files list shows only the files that chat wrote,** plus what you gave it; the
996
+ shared project folder is behind one link with its size.
997
+ - **The chat's file list reads at most 500 entries four folders deep** and no longer re-reads the
998
+ folder every 30 seconds while live updates work.
999
+ - **Starting a task where no language model is available now fails with a clear reason** (503
1000
+ `no_model`) instead of an empty chat; the console keeps your text and names Telegram and the terminal.
1001
+ - **A chat shows your question even when the run failed;** a scheduled job's run says it is not a
1002
+ chat, with its task behind a disclosure. A bound chat's tab says Chat, not New.
1003
+ - **The chats list names who started each chat,** tells a failed chat from a stopped one, shows
1004
+ finished chats in a neutral colour and shows times in your time zone.
1005
+ - **The chats list no longer shows raw file errors.** A row with a part that would not read says
1006
+ "Part of this chat is missing."; the rows say "Done", "Unknown", "Untitled chat" and "Watch only".
1007
+ - **Reopening a long chat shows its newest events,** not its oldest.
1008
+ - **The chat no longer draws a step twice** or misses one that happened while the page loaded.
1009
+ - **Messages you add while Rob works now show in the chat.**
1010
+ - **A chat that failed now says so;** a chat waiting for your answer no longer shows as stopped.
1011
+ - **The chat no longer lists sending a reply or finishing as steps,** draws each reply under its
1012
+ own steps, and ends each turn with its own summary.
1013
+ - **Chat step times and the turn duration show real times** instead of 0:00 and 0s, and a
1014
+ receipt says "1 step", not "1 actions".
1015
+ - **On a phone, the Schedule table labels its first column** ("What it does") again.
1016
+ - **The Work pane names a partial file read** instead of drawing a blank line.
1017
+ - Token reads: Arbitrum and Polygon had no price, Solana holdings lost decimals and Token-2022,
1018
+ Alchemy read one page, `reconcile` never said CLEAN on an airdropped wallet, and an unknown
1019
+ cost basis was stored as $0.
1020
+ - Every tool call now records its completion. Before, the console, the REPL fallback and
1021
+ Telegram progress never saw a tool finish, because the completion was written only on a code
1022
+ path that never ran.
1023
+ - Session feed folders no longer fill with lock files.
1024
+ - A reply could fail to appear live in the console until a reload.
1025
+ - Events of a session resumed after a restart no longer overwrite its first events.
1026
+ - Rob no longer stores the conversation context it is given as a memory of its own.
1027
+ - **ERC-8004 identity:** `read_agent_id` works on a registry that is not ERC721Enumerable
1028
+ (the Robinhood Chain registries), so the double-registration check no longer says "could
1029
+ not check"; agentId 0 is a real id.
1030
+ - **Money figures:** `defi_data.portfolio` values canonical and pinned tokens first, so the
1031
+ wallet's own position no longer shows as raw units; `launchpad_claim` prints what a claim
1032
+ is worth. The agent gives the owner only tool-printed money figures.
1033
+ - **Stall reports:** each stall of the goal pipeline names itself (`stall #N` and the time),
1034
+ so a later stall is no longer dropped as a duplicate.
1035
+ - **Prompts:** the per-step reminder, the correspondent DM framing, the browser and
1036
+ Polymarket blocks and `<owner-instructions>` name only what the session really has; the
1037
+ background reviewer now sees the work it reviews.
1038
+ - **Browser:** `search_google` URL-encodes the query; a `&`, `#` or `%` no longer cuts it.
1039
+ - **Apps:** the approve hints name `/apps approve` and the console, not a shell command.
1040
+ - **Tools:** `session_search(collection=…)` says so when the knowledge base is off or
1041
+ failing.
1042
+ - **Skills:** a cron-only session no longer gets `dca` or `exits`, matched skills are
1043
+ delivered first and can be loaded again after compaction, and one malformed user rule no
1044
+ longer drops every skill.
1045
+ - **Runtime nudges:** the planning, empty-action, loop and verify-before-done nudges enter
1046
+ history as control messages, not as a user turn, so a nudge can no longer become the
1047
+ active task; the texts name only registered actions.
1048
+ - **X OAuth 2.0:** a refused refresh token records a re-login verdict naming `/x login` and
1049
+ is not re-sent; two processes no longer spend the same refresh token; DMs fall back to the
1050
+ OAuth 1.0a keys on a 401.
1051
+ - **X posts:** a new tweet that is not readable yet is reported as X lag, not as a failed
1052
+ post.
1053
+ - **`polyrob x-account`:** on a deployed box it acts on the deployed data home and refuses
1054
+ when a key it needs is missing; before, it wrote a record the agent could not read.
1055
+ - **Deploy:** `RESTART_ONLY=1` restarts every unit that reads `/etc/polyrob/polyrob.env`.
1056
+ - **Approvals:** a decided Telegram button is removed; the REPL and the console chat box run
1057
+ the tap tokens (`/approve_p_<hex>`, `/fulfill_<ask>_<letter>`); the fallback grant card
1058
+ carries one-tap tokens.
1059
+ - **Money:** a send whose outcome is unknown says "outcome unknown — do not send again",
1060
+ never "NOT sent"; such a bridge stays `in_flight`.
1061
+ - **Packs:** a pack's money verbs can register, pack faults are isolated per pack, and
1062
+ `polyrob update` installs the `markets` pack for a `crypto` install.
1063
+ - **Wallet:** `defi_trade.transfer` sends the native gas asset (`token='native'`); a repeat
1064
+ `/send` to a Solana address is no longer a replay; a run that can never sign no longer
1065
+ raises an approval.
1066
+ - **Wallet:** an unreadable pin or position store reads as UNREADABLE, not empty; chain
1067
+ names are case-insensitive; `approve_token` clamps a near-balance amount; armed goal runs
1068
+ can transfer, not only swap.
1069
+ - **x402:** a payment above $1 is no longer refused by the SDK's default; a multi-network
1070
+ challenge is paid on Base USDC; a metered URL is payable more than once; the replay key is
1071
+ stored whole before signing.
1072
+ - **Chat:** a cron job created from chat gets `CRON_DEFAULT_MAX_DURATION_SEC`; "resume",
1073
+ "continue" or "restart" never pause.
1074
+ - **Coding:** the verify-before-done and ship-what-was-tested gates fire again and no longer
1075
+ fire on prose edits or a refused `run_tests`; `run_tests` writes its full output to a log
1076
+ and gets 300 s.
1077
+ - **Coding:** edits keep CRLF, BOM, mode and hard links, refuse binary and read-only files
1078
+ and write atomically; `apply_patch` matches hunks more reliably; TypeScript checks use the
1079
+ nearest `tsconfig.json`.
1080
+ - **Telegram:** `/bridge … go` above the autonomous ceiling no longer freezes the bot; it
1081
+ reports when it lands.
1082
+ - **Publishing:** `publish` accepts a directory such as `dist/`, swaps in a complete new
1083
+ version of a live page and reports a failed promotion.
1084
+ - **Hyperliquid:** agent approval, leverage changes and order cancellations enter the owner
1085
+ approval queue in both payment modes.
1086
+ - **Skills:** skill provenance is per tenant; chained `patch_skill` edits make one pending
1087
+ item; a queued owner rule offers a tappable `/approve_p_<hex>`.
1088
+ - **Autonomy:** rails keep a money-free base, seeders recheck due state, direct cron room
1089
+ delivery respects the pause, and a failed database read is unreadable, not empty.
1090
+ - **Console:** the wallet views show the submission journal again, and Money's Cash and
1091
+ Limits say when the ledger could not be read instead of showing zeros.
1092
+ - **X:** the startup self-test uses the credential the client really carries (no false `403
1093
+ Forbidden`).
1094
+ - **Owner thread:** records the true surface and refuses a cron `deliver_target` that is not
1095
+ the owner's own address.
1096
+ - **Webhooks:** failed turns are kept and pending events retry on redelivery.
1097
+ - **Runtime:** admin token checks and billing reconciliation work again; X cooldown
1098
+ telemetry no longer raises `NameError`; speech converters get no credentials and are
1099
+ stopped on timeout.
1100
+ - **MCP:** a cached MCP resource read no longer fails.
1101
+ - **Uninstall:** `polyrob uninstall --purge` names and deletes both homes behind a typed
1102
+ confirmation; `polyrob doctor` reads system units too.
1103
+ - **Install:** `requirements.lock` serves Python 3.11 again; a missing extra is named
1104
+ instead of a raw `ModuleNotFoundError`; `polyrob update` no longer reads a `pid: 0` marker
1105
+ as a live turn.
1106
+ - **Context:** the emergency prune keeps at least the last 3 messages with complete tool
1107
+ pairs.
1108
+ - **Console Inbox:** a `tool_approval` card shows the full grant card, not a 160-character
1109
+ preview.
1110
+ - **REPL approvals:** `[s]ession` and `[a]lways` no longer widen a money action to every
1111
+ later amount; a money action offers only once, deny or never.
1112
+ - **Console:** `/send … go` or `/bridge … go` in the chat box answers "started" at once; the
1113
+ result arrives as a notice.
1114
+ - **Cron:** a job is no longer skipped as an X DM job because its task text quotes or
1115
+ forbids a DM.
1116
+
1117
+ ### Security
1118
+
1119
+ - **Feishu/Lark webhooks are signed or refused:** an event outside a ±5-minute timestamp
1120
+ window is refused, and token-only mode (no `FEISHU_ENCRYPT_KEY`) refuses every event unless
1121
+ `FEISHU_WEBHOOK_ALLOW_UNSIGNED=true`.
1122
+ - **A cross-chain bridge from an EVM chain pays only Relay's pinned deposit contracts:** a quote
1123
+ naming any other `to` refuses before signing (the Solana origin already pinned the program).
1124
+ - **`polyrob-signer` spends an owner's over-cap grant when a send may have left**, so one approval
1125
+ cannot carry a second over-cap send after an unknown outcome or a failed ledger write.
1126
+ - **An installed skill's reference files get the same Unicode and bidi-override scan as its
1127
+ `SKILL.md`.**
1128
+ - **Agent NFTs:** a pinned collection's token leaves a wallet only when its account has no open
1129
+ approval, and `tx_guard` re-checks the collection's `runtime_sha256` on every mint, reveal
1130
+ or move; an unreadable or changed check refuses.
1131
+ - **Token-bound accounts:** `tx_guard` refuses the Tokenbound forwarder, an account selector
1132
+ at any calldata offset (including `executeNested`), and any move of an NFT into an account
1133
+ of its own collection; only one exact approve, call, reset `executeBatch` passes.
1134
+ - **NFT sale safety:** the open-approval scan covers ERC-20, ERC-721 and Permit2 grants of
1135
+ an NFT's account, with guarded ERC-721 and Permit2 revoke shapes. A read-only
1136
+ `robinhood-testnet` chain (`DEFI_EVM_RPC_ROBINHOOD_TESTNET`) serves the account reads.
1137
+ - **Money and outbound rails:** launchpad `slippage_bps` is capped at 1000; `email_send` has
1138
+ the same forged-turn gate as `message`; a leaf sub-agent cannot ask the owner; the markets
1139
+ pack's own-account reads are blocked for correspondents.
1140
+ - **Skills:** a user skill can never take a builtin or pack skill id (before,
1141
+ `secret-handling` could be replaced).
1142
+ - **Correspondent sessions:** memory recall, the digests, the continuity bridges and the
1143
+ health note are skipped in a session whose output goes to a third party.
1144
+ - **Untrusted framing:** browser, MCP and web results, recalled summaries, delegated parent
1145
+ context and attached text files are wrapped as untrusted data on every path.
1146
+ - **Packs:** a manifest cannot grant itself first-party privileges; third-party code packs
1147
+ are refused while the process holds the wallet seed.
1148
+ - **Money:** only the owner's own approval lifts the autonomous ceiling; a dapp page's
1149
+ transaction is never an owner turn; a failed pause probe or ledger result refuses.
1150
+ - **Wallet:** the agent's file tools cannot write the owner pin and token-provenance stores.
1151
+ - **Publishing and coding:** published pages carry the vhost's security headers (re-run
1152
+ `scripts/setup_publish_vhost.sh`); `coding.grep` applies the read policy to every file.
1153
+ - **Custody:** the custody process is non-dumpable and the seed variables leave
1154
+ `os.environ`, so a child cannot read them; a mistyped seed never reaches a log; the wallet
1155
+ audit files are `0600`. ⚠️ No core dumps and no `py-spy`/`gdb` attach.
1156
+ - **Installs:** every install is hash-pinned by `requirements.lock`. Lazy installs go
1157
+ through one trusted installer (`LAZY_DEPS_MODE` `off|trusted|legacy`, default `trusted`).
1158
+ ⚠️ A server without custody now installs lazily; `LAZY_DEPS_MODE=off` keeps the refusal.
1159
+ - **Approvals:** an approve counts as an exit only to a pinned route spender; the approval
1160
+ card shows every money field and a calldata digest.
1161
+ - **Swaps:** every EVM swap asserts its minimum output; `solana_swap` checks the simulated
1162
+ output and refuses an unobserved output mint.
1163
+ - **Solana guard:** every top-level token and system instruction is decoded (authority
1164
+ changes, closes, durable nonces and a fee above 0.01 SOL refuse), and the Solana bridge
1165
+ requires the pinned Relay program.
1166
+ - **Generic call and dapp:** position managers, v4 pool managers, Permit2 and Pons contracts
1167
+ are reachable only through their typed verbs; Permit2 grants are refused.
1168
+ - **Deploy:** `deploy_token` refuses `vanity` / `salt` and must mint exactly the supply to
1169
+ the wallet; the ERC-8004 agentId comes from the receipt and a second registration in
1170
+ flight is refused.
1171
+ - **Payments:** the deposit monitor credits only the increase; every EVM invoice gets a
1172
+ random sub-cent tail; a canceled subscription is never reactivated; an x402 authorization
1173
+ over 600 s is refused.
1174
+ - **Gates:** wallet reads are owner-scoped; Hyperliquid and Polymarket bind the tenant per
1175
+ call; `/pause trading` binds every entry verb; a forwarded Telegram message taints the
1176
+ turn.
1177
+ - **Runtime:** money verbs run off the event loop; a reverted swap writes no position; LP
1178
+ add and remove check the pool price and cap slippage at 1000 bps; the bridge re-authorizes
1179
+ after an owner wait.
1180
+
1181
+ ## [1.1.0] — 2026-09-21
1182
+
1183
+ ### Fixed (interface deep audit — 2026-09-21)
1184
+ Five parallel audits of the console, the HTTP/A2A/OpenAI-compat API, the CLI, the
1185
+ REPL, Telegram/email and cross-surface parity found ~270 defects; all are closed in
1186
+ this pass. The behaviour-visible ones:
1187
+ - **Console** — `GET /api/webgate/pending` renders the same composer as the Inbox
1188
+ (a locked queue is NAMED, never a shorter list); Work › Now reads `live.goals`
1189
+ (un-windowed) and dedupes against `session_id`; an ask can be ANSWERED in writing
1190
+ (`{"answer"}` rides through `GoalBoard.decide_ask(answer=)` into the retry prompt);
1191
+ a Pause/Resume control in the shell header; app Kill/Logs, file links, the chat
1192
+ file picker, Keep for the avatar; `command_reply` rendered for a slash verb (and a
1193
+ verb typed on the cold open no longer becomes a session task); knowledge/worklog/
1194
+ artifacts/invoices/live readers carry typed error/partial/`filtered_out`/
1195
+ `outstanding_*` fields; the `/pending` and `/profile` pages, `/api/sessions`
1196
+ (a 1,790-dir synchronous walk), `/api/session/{id}/stats`, the CDN script tags,
1197
+ and 19 dead assets are gone; `docs/guide/console.md` and the README match the tree.
1198
+ - **API** — ONE public-path allow-list shared by both auth gates (`api/auth_constants.py`;
1199
+ SIWE, the agent card, x402 challenge/pay and pricing were 401 whenever `API_SECRET`
1200
+ was set, and a settled x402 payment then got a 401 with no refund); x402 settles
1201
+ ONLY on the gated routes; `rob_xxx` API keys validate without `ENABLE_AUTH`;
1202
+ `API_AUTH_TOKEN` is a `service` role on `X-Service-Token` (not admin; `X-API-KEY`
1203
+ works one more release with a WARN) and `GET /api/test-auth` is deleted;
1204
+ `/api/task/metrics` is admin-only; `/health` can be degraded; A2A artifacts have a
1205
+ real tenant-scoped `GET …/workspace/{path}`, `initializing` is WORKING, push URLs
1206
+ pass the SSRF validator, every session op routes through `guard_remote`, `cancel`
1207
+ checks ownership; `polyrob serve --workers N>1` refuses unless
1208
+ `API_AUTONOMY_RUNTIME=false`; `/v1/chat/completions` threads `temperature`,
1209
+ 400s (OpenAI-shaped) on unsupported params, marks `usage.estimated`; ERC-8004
1210
+ `trustMode: onchain` needs a real agent_id + registry; docs corrected.
1211
+ - **CLI** — every owner/admin verb reads the deployed data home
1212
+ (`admin_data_dir`) and the owner tenant (`keys`, `wallet init|book|bridges|overview`,
1213
+ `owner invoices|settle|sub|correspondents|approve`, `approvals`, `apps`, `cron`,
1214
+ `session`, `subagents`, `finance` were on a shell/CWD home — a confident zero over a
1215
+ live store); `goals list|tree` read `list_recent`/`status_counts`; `surface list`
1216
+ reads the real dead-target store; EIP-55 kept on `wallet asset add`; `doctor --json`
1217
+ is the typed snapshot; `wallet set-cap` writes the live pref; new verbs
1218
+ `wallet claim|nft|dapp`, `identity register|set-uri`, `owner correspondents --history`,
1219
+ `owner paid enable|disable|price|asset|offers`, `owner groups admins`.
1220
+ - **REPL** — addresses/paths/tx hashes are no longer redacted; `/approve <id>`
1221
+ DECIDES on every seat (`/gates` manages the gates); `/reject` reads the union;
1222
+ `/cron list|add|cancel`; `/groups /mute /unmute /ban /unban /paid /cancel /new
1223
+ /start /claim /nft /dapp /contacts /identity`; `/apps <verb>`; `/status` is the
1224
+ snapshot and `/meter` the token meter; full session ids; one empty grammar.
1225
+ - **Telegram** — help is RENDERED from `core.verbs` (one SSOT, contract-tested);
1226
+ a room admin can no longer self-grant `admin`; `blocked` fails CLOSED; a paired
1227
+ sender on a forgeable surface (email) is never OWNER; free `/mute /ban` no longer
1228
+ raise; `/bridge /launch /deploy /lp` no longer block the polling loop; `/goal <id>`
1229
+ resolves without `board.list`; `/wallet balances` shows the LIVE caps and the
1230
+ cap note names `/config set budget.wallet_per_tx_usd`; `/paid cancel` is
1231
+ room-scoped; `/missed` is unclipped; a correspondent's attachment is named;
1232
+ `/cron /goal /fulfill` refused from a room; room toolset is a closed allowlist.
1233
+ - **Email + delivery rails** — see the D-section of the review (BODY.PEEK, dedup
1234
+ after dispatch, honest queue outcomes, pause gate on `email_send`, secret scrub,
1235
+ IMAP verdicts, attachments on AgentMail, HTML-only bodies, thread anchors).
1236
+ - **Parity contract** — `tests/unit/test_surface_parity.py` scans every console
1237
+ router, carries 27 new rows (six of them all-`None` on purpose), and gains
1238
+ `test_repl_covers_every_telegram_owner_verb` + `test_board_view_never_calls_list`
1239
+ + `test_repl_help_group_matches_core_verbs`.
1240
+ - **Revalidation pass (same day)** — four fresh reviewers re-read the eight commits and
1241
+ their dependents; ~45 more defects closed. The ones that mattered: the workers>1 refusal
1242
+ lived only in the CLI (the systemd entry `main.py` skipped it — now in `server_boot`);
1243
+ `require_service`'s 503 was unreachable (the container accessor RAISES, so `/api/hyperliquid|
1244
+ mcp|polymarket|admin` and SIWE answered 500); `X-Service-Token` could not pass CORS
1245
+ preflight and the console still proxied the operator token under `X-API-KEY`; the `/v1`
1246
+ OpenAI envelope skipped middleware-level 401/413; `/health` could 500 on a non-numeric
1247
+ metric; the agent-callable `read_emails` still used `RFC822` (which set `\Seen` and
1248
+ emptied the surface's inbound queue); the new outbound-queue status line looked for
1249
+ `outbox.db` on the wrong axis; a queued cross-process delivery was journalled `failed`;
1250
+ the AgentMail outage verdict could never clear; `/help gates` said "unknown command"; a
1251
+ room admin's `blocked` grant and the paired-email rule re-proven; `/fulfill <id> [answer]`
1252
+ and `/approve <id> <answer>` carry the owner's words on every seat; every CLI money ACTION
1253
+ spent under the SHELL's tenant while every VIEW read the deployed one; a `/dapp` READ
1254
+ created `dapp_sessions.db`; `KV_RE` never claimed `private_key`/`mnemonic`/`seed_phrase`/
1255
+ `passphrase`/`keystore` (they survived every scrubber verbatim); `refund_due` (a settled
1256
+ machine payment we owe back) now has one status vocabulary (`modules/x402/invoice_status.py`),
1257
+ a ledger line, a status WARN, a critical-lane owner notice and a listing filter on every seat;
1258
+ paid-room remedies are seat-aware; six REPL help groups matched to `core.verbs`; the
1259
+ `GROUP_TURN_TOOLS`/`INBOUND_MEDIA_ENABLED`/`API_AUTH_TOKEN` flag rows corrected (+regen).
1260
+
1261
+
1262
+ ### Added (057 — runtime structural upgrade, implemented 2026-09-20)
1263
+ All flag-gated and default-inert unless noted; prod arms them per the proposal's
1264
+ §4 defaults. Full flag table in `docs/CONFIGURATION.md` (24 new rows).
1265
+ - **WS-A tool rigs** — `core/config_policy/rigs.py` (the ONE table `money_rail` /
1266
+ `social` / `research` / `ops` / `full`, fixed id order); `payload.rig` on cron jobs
1267
+ and goals, `polyrob cron edit --rig`, `AUTONOMOUS_RIG_DEFAULT`;
1268
+ `AUTONOMOUS_TOOL_DISCLOSURE` lets an autonomous session widen a narrow rig;
1269
+ `STABLE_AUTONOMOUS_TOOLSET` + `TOOL_SCHEMA_STABLE_ORDER` keep the cached prompt
1270
+ prefix byte-stable; the email tool's catalog status reads `gated:credentials-rejected`.
1271
+ - **WS-B budgets by session class** — `agents/task/session_class.py` is the ONE
1272
+ answer to "is this session autonomous"; `AUTONOMOUS_CONTEXT_BUDGET_TOKENS` makes
1273
+ compaction reachable; `TOOL_RESULT_MAX_TOKENS`, `AUTONOMOUS_READ_PAGE_LINES`,
1274
+ `AUTONOMOUS_MAX_OUTPUT_TOKENS`, `LLM_OUTPUT_TRUNCATION_RETRY` (+ the
1275
+ `llm_output_truncated` event), `LLM_TIMEOUT_BY_OUTPUT` (timeout sized by expected
1276
+ output, not input), `LLM_TIMEOUT_REROUTE`, `AUTONOMOUS_SCREENSHOT_ON_BROWSER_ONLY`;
1277
+ `write_file`/`append_file` results carry `size_bytes` + `sha256`.
1278
+ - **WS-C pre-empt without discarding** — `payload.preempts` (default = money) is the
1279
+ pre-emption property; the yield is scoped to the goal holding the workspace (the
1280
+ planner is never cancelled), attaches artefacts before the cancel unwinds, and is
1281
+ a `goal_run yielded` event; `GOAL_YIELD_GRACE_SEC`, `GOAL_RESUME_SAME_SESSION`
1282
+ (+ `goal_run resumed`), `GOAL_PREFLIGHT_ENABLED`/`_STEP_SEC` (056 WS5 2b),
1283
+ `GOAL_YIELD_AGEING`, `CRON_DEFAULT_MAX_DURATION_SEC`; deferrals are `goal_run
1284
+ deferred` events; the yield probe runs inside the TickLock; the change gate never
1285
+ gates a money job; `polyrob cron prune`, `cron list` hides cancelled; the goal
1286
+ dispatcher reads the cross-process turn marker.
1287
+ - **WS-D provenance** — `source=`/`observed_at=` on `owner_doc_manage` /
1288
+ `self_context_manage` (changed lines stamped ` [from: <source> <date>]`),
1289
+ `DOC_CLAIM_PROVENANCE_REQUIRED` (a FORMAT guard on claim-shaped lines), the
1290
+ foundation block states the docs' age, and a room's allowlist note renders as a
1291
+ dated LABEL, never its name (`core/surfaces/room_label.py`; `group_allowlist.updated_at`).
1292
+ - **WS-E verification** — `core/rails/verification.py` is the ONE per-rail proof table
1293
+ (x_post / x_reply / telegram_channel / telegram_group / email / onchain), rendered
1294
+ on the `message`, `x_post`/`x_reply` and `email_send` results, cited by
1295
+ `room_read`, generated into `docs/guide/rails-verification.md`; the corrupted
1296
+ bullet in the `x-engagement` skill is repaired.
1297
+ - **WS-F durable rail verdicts** — `core/credential_verdicts.py` is a store
1298
+ (`verdicts.db`, `first_seen`/`last_seen`/`count`, shared by every unit); the email
1299
+ surface polls IMAP without the SMTP probe; the X API 402 is a durable
1300
+ `x_api_rejected` event; a missing key is a verdict warned once per process.
1301
+ - **WS-G identities** — `polyrob doctor --perms [--strict]` over `core/data_perms.py`;
1302
+ the deploy's ownership pass covers the whole data home; the three ops-loop units
1303
+ join `polyrob-data` with `UMask=0002`; a root euid refuses owner-CLI writes on a
1304
+ deployed box (`--as-root` / `POLYROB_ALLOW_ROOT_CLI`).
1305
+ - **WS-H deploy + shutdown** — `deploy_when_idle.sh` fails closed, parses the marker
1306
+ as JSON and carries a daily budget (`DEPLOY_DAILY_MAX`, 6); console/API turns hold
1307
+ the turn gate (`SURFACE_OWNER_TURN`, ON); on SIGTERM the in-flight cron/goal run
1308
+ gets an ending (`AUTONOMY_SHUTDOWN_DRAIN`, ON) and `TimeoutStopSec=90`.
1309
+ - **WS-I economics** — the status snapshot's `economics` section (calls, $/day,
1310
+ cached share, uncached/output per call, p50/p90 latency, truncations, first-call
1311
+ cache hits, `budget_runway` when a balance was read) from `usage_records`; the
1312
+ loops section renders standing rail verdicts with a SINCE clock, `rail_cut_repeat`,
1313
+ and the goals section renders `yielded ×N · resumed ×M · deferred ×K`; the security
1314
+ section renders the data-home permission audit.
1315
+
1316
+ ### Changed
1317
+ - Corrections to the load-bearing numbers behind the 057 design, measured against
1318
+ production `usage_records`/telemetry: prompt caching IS live (80% of input tokens
1319
+ cached), latency is output-bound, and compaction was unreachable under
1320
+ `TASK_MAX_INPUT_TOKENS=200000`.
1321
+
1322
+ ### Fixed (deployment)
1323
+ - `polyrob.service`, `polyrob-email.service` and `polyrob-webview.service` now run with
1324
+ `UMask=0002`: with systemd's default 022 the WAL sidecars one unit created under the shared
1325
+ data dir were group-read-only, so a sibling unit hit `attempt to write a readonly database`
1326
+ (the email surface's outbound queue, twice in two days). Same fix the root helper units got
1327
+ on 2026-09-18; ratcheted by `tests/unit/test_shared_data_units_umask.py`.
1328
+
1329
+ ### Added
1330
+ - **`goal_ask`** — a rail that hits a question only the owner can answer now raises a
1331
+ durable board ask instead of asking once into a chat line that scrolls away. The ask is
1332
+ dedup-refreshed, visible on every owner seat, and the goal that raised it is HELD (not
1333
+ re-served) while it is open: on 2026-09-12 one rail re-fired seven times in 75 minutes
1334
+ while the owner was deciding, and a buyback rail stalled for 12 hours on a question that
1335
+ was asked once and never resurfaced.
1336
+ - `polyrob cron edit` gains `--task-file <path>` (replace a job's prose without
1337
+ re-scheduling it), `--deliver <target|none>` and `--rig <name>`; `cron show|edit|cancel`
1338
+ accept a unique job-id prefix, and a rig error is reported separately from a job error.
1339
+ - `OPENROUTER_REASONING_ENABLED=false` sends `reasoning.enabled=false` — measured as the one
1340
+ lever a DeepInfra upstream honours — and `OPENROUTER_REASONING_MAX_TOKENS` bounds the
1341
+ model's reasoning inside the output cap. A cut spent on REASONING gets its own note and
1342
+ its own count, so "the answer was truncated" and "the thinking was truncated" stop
1343
+ reading alike.
1344
+ - Every OpenRouter call stamps `prefix_sha`/`tools_sha` onto its usage record, which makes a
1345
+ cache miss attributable to a changed prompt prefix rather than guessed at.
1346
+ - The composed daily digest rolls up the owner messages a cap or a pause suppressed
1347
+ (window-bounded, oldest first, day-stamped, capped at 8); an unreadable store is named
1348
+ rather than read as "nothing was missed".
1349
+ - `OPENROUTER_PROVIDER_SORT` (`latency`|`throughput`|`price`, default unset = byte-identical):
1350
+ asks OpenRouter to order upstreams for the SAME model by latency instead of its price-first
1351
+ default — an ops knob for a seat whose cheapest upstream stalls (four 290–410 s timeouts and
1352
+ five money-rail cap cuts in one afternoon on prod).
1353
+
1354
+ ### Fixed
1355
+
1356
+ - `anysite_api`: an empty answer from a `/search/` endpoint to a query longer than two words now
1357
+ carries a hint that the endpoint silently rejects long phrasings and names the two-word retry —
1358
+ the agent had twice recorded a live theme as "exhausted" on a query-shape artefact.
1359
+ - `scripts/deploy_when_idle.sh` also vetoes a deploy while an owner DM was routed in the last
1360
+ `OWNER_DM_VETO_SEC` (600) seconds, read from the `inbound_routed{tier=owner}` telemetry row
1361
+ the harness writes before any turn starts — independent of the turn marker, which failed
1362
+ twice on 2026-09-19. An unreadable telemetry DB counts as busy. `DEPLOY_WHEN_IDLE_DRY_RUN=1`
1363
+ exercises the decision without deploying (bash test).
1364
+ - The live-turn marker (`turn.active`) now always lives under `<POLYROB_DATA_DIR>/locks/`, the
1365
+ location the deploy waiter, the cron tick and `polyrob doctor` read. The agent process sets
1366
+ `POLYROB_WORKSPACE_LOCK_DIR=<project>/.polyrob`, so the marker was landing there instead and
1367
+ two deploys (10:36Z, 18:29Z on 2026-09-19) fired in the middle of a live owner turn.
1368
+ - `room_read` no longer lets an empty room ledger read as "my posts may not have rendered":
1369
+ Telegram never delivers a bot's OWN posts back as updates, so a channel only the bot posts
1370
+ to stays at 0 lines by design — both the room listing and the per-room read now say so and
1371
+ name the send receipt as the delivery confirmation (prod 2026-09-19: the agent told the
1372
+ owner for two days that channel posts were "receipt-only, visibility unconfirmed").
1373
+ - `defi_data.swap_quote` cross-checks the route's output against the keyless indexer-implied
1374
+ output and renders `⚠ SUSPECT QUOTE` when they disagree by more than 5× either way (the
1375
+ `lifi:fly` cold-response constant of 2026-09-19); consistent quotes say so, and a missing
1376
+ or zero-liquidity price renders `cross-check: unavailable` — never a verdict.
1377
+ - History dedup no longer replaces a SHORT identical tool result with a "[duplicate of …]"
1378
+ back-reference (`DEDUP_MIN_CHARS`, 160): three identical `Edited <file>` confirmations in
1379
+ one step were reported by the agent as "the dedup artifact" instead of three landed edits,
1380
+ and the pointer was longer than what it replaced.
1381
+ - A screenshot of a never-navigated page (`about:blank` / new tab) is no longer attached
1382
+ to the state message: every step of a run that never touched the browser was shipping one
1383
+ useless image per call through the vision path of the metered seat (`agents/task/agent/
1384
+ prompts.py::is_blank_page_url`). A navigated page's screenshot is unchanged.
1385
+ - The system prompt now states the executor's real per-step tool-call cap (5) instead of
1386
+ the config ceiling (10), and a deferred call's notice says it did NOT run and must be
1387
+ re-issued — a 6-call batch used to lose its 6th call from the agent's point of view.
1388
+ - The GeckoTerminal client retries once (2 s) on a 429, and a provider error that survives
1389
+ the retry now propagates from the pool resolver: `defi_data_ohlcv` says "could not resolve a
1390
+ pool: HTTP 429" instead of "no indexed pool found … not an outage" (five batched candle
1391
+ reads were reported as absent pools on 2026-09-19).
1392
+ - The X API tool remembers a `402 Payment Required` (credits depleted) for 60 min and refuses
1393
+ every further API call locally with the owner remedy instead of re-discovering it per
1394
+ endpoint (a round burned 52 calls in 15 min); a successful call clears the verdict.
1395
+ - `defi_data_swap_quote` stamps `quoted_at` (UTC) and the pair addresses on every quote, so
1396
+ two re-quotes that happen to agree are never byte-identical and the history compaction
1397
+ pass no longer folds a fresh read into "[duplicate of an earlier tool result]".
1398
+ - `defi_data_ohlcv` accepts a 32-byte pool id (Robinhood Chain singleton pools) for both
1399
+ the auto-resolved and an explicit `pool=`; the path validator treated every pool as a
1400
+ 20-byte address, so every RH candle read was refused. A token address is still an address.
1401
+ - `coding_grep` given a FILE path greps that file (it used to walk it as a directory and
1402
+ answer "(no matches)"); a path that is neither a file nor a directory errors naming it.
1403
+ - `kb_ingest` no longer refuses the agent's own plain-text documents (`.md/.txt/.rst`)
1404
+ under a workspace `data/` directory purely by path: they are admitted when they sit
1405
+ outside the runtime data subtrees and a content secret-scan passes. The broad
1406
+ `is_secret_path` classifier is unchanged for every other consumer.
1407
+ - The autonomous X post cooldown refusal now names the remaining window and the exact
1408
+ one-shot deferral (`cronjob_schedule` at an ISO instant) so a NEW executed-transaction
1409
+ report is deferred rather than dropped; a genuine re-fire is still told to skip.
1410
+ - Goal dispatch no longer starves behind staggered money rails: with
1411
+ `GOAL_YIELD_FOR_MONEY_RAIL` on, a scheduled money-class cron job does not hold the
1412
+ board back through `GOAL_DISPATCH_CRON_HEADROOM_SEC` (it pre-empts a running goal
1413
+ instead); a job mid-run and every ops-class job still defer.
1414
+ - The autonomous context budget gauges the HISTORY only — it no longer clamps the model's
1415
+ safety limit, which cut the first rail of a run at step 1.
1416
+ - The state message honours `TOOL_RESULT_MAX_TOKENS` too. It reprinted every tool result
1417
+ raw under a separate 100k-character limit, so five large JSON answers put ~110k uncached
1418
+ tokens into a single step (210k in, a 221 s timeout) with the 6k cap already armed.
1419
+ - A tool-less auxiliary LLM call no longer inherits the last step's toolset, and the
1420
+ native-tools billing path feeds the output-scaled timeout (it was sizing the budget from
1421
+ input alone).
1422
+ - An LLM timeout inside an AUTONOMOUS run never DMs the owner: a background rail's retry is
1423
+ not owner news.
1424
+ - `read_file` paged past the end of a file is an honest empty answer naming the line count,
1425
+ not a crash.
1426
+ - `coding_grep`, `kb_ingest` and the tool-availability note keep their fixes from the same
1427
+ window; the compute gates now name the limb that is ACTUALLY unmet (production ran
1428
+ posture 1 with `CODE_EXEC_ENABLED=false` and the note still said "raise the posture").
1429
+ - A credential verdict's re-probe hold doubles per repeat failure to a 6 h cap, and an SMTP
1430
+ verdict is keyed on a password change-detector digest, so a corrected password clears the
1431
+ verdict instead of waiting out a fixed TTL. A verdict READ never creates `verdicts.db`.
1432
+ - Files and SQLite stores born BETWEEN deploys are group-writable from birth (one birth
1433
+ rule in `core/sqlite_util.py` and the session state writer). A store created 30 seconds
1434
+ after a deploy's ownership pass was born `0644` and degraded with "attempt to write a
1435
+ readonly database".
1436
+ - A ledger or cooldown READ never creates `telemetry_events.db`, and a `/dapp` read never
1437
+ creates `dapp_sessions.db` — a read that plants a file makes "no data" and "never ran"
1438
+ indistinguishable.
1439
+ - `polyrob doctor` reads the DEPLOYED owner tenant (refusing rather than guessing when the
1440
+ env file is unreadable) and its money section reads without a DI container: an unread
1441
+ ledger leg renders `unavailable`, never `$0.00`. `GET /api/webgate/doctor` names a failed
1442
+ report (`checks: null` + `checks_error`) instead of a confident empty list.
1443
+ - An unreadable `./.polyrob/.env` candidate or an unreadable `.git` probe on the local
1444
+ bootstrap ladder is skipped, not a crash — both killed `polyrob owner asks` when it ran
1445
+ as the service user from another user's clone.
1446
+ - Promoting an owner-approved draft no longer trips the claim-provenance guard: the owner's
1447
+ approval of a SOURCED draft is not an unsourced claim.
1448
+ - A cron job that already told the owner during its run does not send the delivery echo
1449
+ again.
1450
+ - `polyrob doctor` in a directory the agent has never run in creates NOTHING. Its new
1451
+ money section builds the unified ledger, whose caps block asks for the wallet policy
1452
+ gate, and two read-creates-a-store defects followed: constructing the wallet audit sink
1453
+ mkdir'd `<cwd>/.polyrob/wallet/` and minted an `audit.jsonl.lock` before reading a byte
1454
+ (both are now deferred to the first real write), and on a base install without the
1455
+ `crypto` extra the missing-dependency WARNING was enough to mint
1456
+ `<cwd>/.polyrob/logs/bot.log` (a base install has no wallet by design — that is not a
1457
+ warn-worthy condition). The clean-room wheel gate gained a test for the second, which
1458
+ the dev tree structurally cannot see.
1459
+
1460
+ ## [1.0.3] — 2026-09-19
1461
+
1462
+ ### Added
1463
+ - `polyrob x-account import-session <storage_state.json> | --auth-token … --ct0 …` and
1464
+ `capture-session --out <file>`: a desktop-captured X login can now reach a headless
1465
+ server. The encrypted session store is per-box (Fernet key + identity), so the hand-off
1466
+ is plain Playwright storage state (or the two login cookies), stored under the server's
1467
+ own key on import; a file with no `auth_token` is refused.
1468
+ - **Autonomy scheduling.** A running board goal no longer starts just ahead of a due cron
1469
+ job (`GOAL_DISPATCH_CRON_HEADROOM_SEC`, also honoured while a job is mid-run), and a cron
1470
+ job classed `money` (`payload.priority`, set with `polyrob cron edit <id> --priority
1471
+ money`) can pre-empt a running board goal: the goal returns to `ready` with no failure
1472
+ counted and a `resume_note`, the rail runs on the same tick (`GOAL_YIELD_FOR_MONEY_RAIL`,
1473
+ default off). A human turn is never pre-empted. `polyrob cron edit --schedule '<spec>'`
1474
+ re-times a job with its next run recomputed.
1475
+ - **Goal budgets.** `goal_create` gained `max_steps` (6–60) and `report_back`; the default
1476
+ budget for a goal that sets none is `GOAL_DEFAULT_MAX_STEPS` (30, was a literal 20). A goal
1477
+ created from a chat reports back in one line unless `report_back=true`.
1478
+ - **Owner turns hold the shared workspace on headless surfaces.** A Telegram/email owner turn
1479
+ (like a REPL turn) marks the process busy, writes `<data>/locks/turn.active`, and takes the
1480
+ cross-process workspace lock — never refusing the human — so cron/goal ticks and the deploy
1481
+ waiter defer while you are mid-turn (`INTERACTIVE_GATE_MARKER`, default on; the lock dir is
1482
+ derived from `POLYROB_DATA_DIR` when unset). `/status` shows `turn: … active since HH:MM`.
1483
+ - **Rail ledger on every status seat.** Every `cron_run` now ends with a terminal event —
1484
+ `done`, `failed`, `cut_by_cap`, `held` (owner pause), `deferred` (owner ask), or
1485
+ `cut_by_restart` (orphan reclaimed after a restart) — and the `loops` status section shows
1486
+ each enabled job's last outcome (`rail EXIT: done 04:18 · 7 steps · 6m`, or
1487
+ `started HH:MM, no end recorded`) plus a `rail_cut` health warning with the remedy.
1488
+ - **External rails as health facts.** `/status` warns when the X browser rail is enabled
1489
+ without a stored login session (naming `polyrob x-account capture-session`), when the
1490
+ anysite user-search endpoint answers empty three calls running (`rail_probe` events), and
1491
+ when an SMTP login was rejected (`email_auth_rejected`), each with the remedy.
1492
+ - **Filesystem verbs shaped for JSON-lines data.** `jsonl_append` (one compact line per
1493
+ object), `jsonl_remove(key, values)` (backup → rewrite → verify → atomic replace; one bad
1494
+ line refuses the whole rewrite), `jsonl_validate` (counts, bad lines, duplicates), and
1495
+ `copy_file` (byte copy, no overwrite unless asked — the backup-before-rewrite primitive).
1496
+ - **`x_browser.x_reply`** — reply under an existing X post through the saved browser session
1497
+ (the lane the API tier refuses for non-mentioners); owner-approval-gated like `x_post`.
1498
+ - **Skill revisions from background turns.** A background/forged turn's `skill_manage
1499
+ patch` of an active skill lands a pending revision under `.pending/<id>/` for the owner's
1500
+ `polyrob owner promote skill` — the active skill is never touched by a forged turn.
1501
+ - **Stale session-directory GC** (`core/session_gc.py`): per-session dirs untouched for 14
1502
+ days are reported (dry-run, `session_gc` event) and removed only with
1503
+ `SESSION_DIR_GC_APPLY=true`; the first pass runs 10 minutes after start, then daily. The
1504
+ deployer purges the pip cache and vacuums the journal after a successful install.
1505
+ - The deployer gains an idle-wait entry point: it waits (up to the cron ceiling) for
1506
+ no running cron job, no running goal and no live turn, then runs `deploy_prod.sh`
1507
+ (which now refuses a direct call unless `DEPLOY_FORCE=1`). Units are runtime-masked while
1508
+ the virtualenv is rewritten and unmasked on start and on rollback.
1509
+
1510
+ - `polyrob cron edit <id> --max-duration N` — change a scheduled job's hard cap
1511
+ (tenant-scoped, ≤1800 s like the agent tool; applies from the next run). The
1512
+ EXIT/SCOUT treasury rails had a 240 s cap and timed out on 22 of 24 runs; the
1513
+ cron ceiling itself rose 600 → 1800 s because the hourly buyback rail runs
1514
+ 1-5 min per step and was cut at step 6 before its swap.
1515
+ - The `/dev` owner→developer rail relays through a host spool (`<data>/dev_rail/`)
1516
+ drained by an owner-run unit, because the hardened service identity cannot reach
1517
+ the developer's tools directly.
1518
+
1519
+ ### Fixed
1520
+
1521
+ - **Context overflow no longer kills a run.** The pre-LLM token check prunes once
1522
+ (`emergency_context_prune`) and re-checks before raising; a five-page tool step used to end
1523
+ the run with `Token overflow` and lose the round.
1524
+ - **Posture is a ceiling, not a request.** `AGENT_COMPUTE_POSTURE>=1` adds `code_execution`,
1525
+ `shell` and `coding` to autonomous toolsets only when each tool's own flag is on; a
1526
+ deploy with the flags off no longer stamps a false `[tool gap]` line on every goal record.
1527
+ The flag predicates live in `core.config_policy.capability_toggles` (tools delegate).
1528
+ - **`email` is dropped from the effective autonomous toolset while its SMTP login is
1529
+ rejected** (`core/credential_verdicts.py`, fed by the email tool's 535 path and cleared on
1530
+ the next success); the tool also remembers a rejected login for 15 minutes instead of
1531
+ re-sending bad credentials at every session start.
1532
+ - **`append_file` given a JSON object wrote a pretty-printed multi-line record** into a
1533
+ JSON-lines store; it now writes one compact line per object. `coding_str_replace` coerces a
1534
+ JSON object passed as `old_string`/`new_string` to its compact line and says so in the
1535
+ result instead of failing validation.
1536
+ - **`message` is not a missing tool.** The goal vocabulary infers the `message` action from
1537
+ "telegram"; the tool loader recorded it as `gated:unknown-tool` on every such goal.
1538
+ Action ids are recognised (`ACTION_IDS_NOT_TOOLS`); an absent action names its flag.
1539
+ - **Docker socket unreachable → one honest refusal, not a retry storm.** `run_tests`/
1540
+ `run_code` refuse up front when the agent identity cannot open the Docker socket, naming
1541
+ the posture and "do not retry".
1542
+ - `x_login_check` declares an explicit empty parameter model (ended a per-session WARNING).
1543
+ - Twitter `get_timeline` accepts `max_results` 1–100 (the X floor is clamped inside the call).
1544
+ - Browser stale-context reaper measures idle time, not allocation age.
1545
+ - A message drained on the `done()` step earns the next step instead of ending the run.
1546
+ - A host-level money-verb broadcast failure ends the run with the verbatim line.
1547
+ - Root-run confined writes take the parent's service group (dirs 0770, files 0660).
1548
+
1549
+ - `filesystem_read_file` on an over-cap multi-line file returns a numbered tail
1550
+ window under a `TRUNCATED` header instead of refusing (append-only ledgers were
1551
+ refused 15×/6h on prod).
1552
+ - H-MEM (`TaskContextManager`) base path was CWD-relative `data/auto` — read-only
1553
+ under `ProtectSystem=strict`; now `<data_home>/auto` (`DATA_PATH` still wins).
1554
+ - One log file per service entrypoint (`bot.log` / `email.log` / `webview.log`,
1555
+ `POLYROB_LOG_FILE` override) — three non-root units sharing one rotating file
1556
+ raised `PermissionError` on every emit in two of them.
1557
+ - `deploy_prod.sh` owns `$DATA_DIR/auto` for the agent identity (its root-run
1558
+ import-test created it 0700 root and every session then failed at init).
1559
+
1560
+ - **`polyrob update --apply` inside a foreign git repo.** A wheel whose
1561
+ site-packages sat inside somebody else's checkout (`/work/project/.venv/…`)
1562
+ was classified `git`, and `--apply` ran `git pull` + `pip install .` against
1563
+ THAT project. `site-packages`/`dist-packages` now never resolve a repo root.
1564
+ Also: `--apply` on pip/pipx/systemd/docker exits 1 with a structured `--json`
1565
+ payload (was exit 0 + nothing); the release `tag_name` is validated and
1566
+ checked out as `refs/tags/<ref>`; rollback is `git reset --keep`; one snapshot
1567
+ restore per failed step (`migrate_guarded.py` removed); `--json` never blocks
1568
+ on stdin; draft/pre-releases are filtered; snapshots pruned to 3 after an
1569
+ apply; `--channel git` measures the branch against its upstream instead of
1570
+ the release list; `ls /opt/polyrob` no longer counts as a running agent.
1571
+ - **Migrations ran in filename order.** `v1_10_0_*` sorts before `v1_2_0_*`;
1572
+ `shipped_migrations` now sorts by parsed version. The boot-time pre-migration
1573
+ snapshot now includes the configured `DB_PATH` (on prod the one database
1574
+ being migrated was the one NOT backed up) and takes the updater's
1575
+ `update.lock`. `session_registry.db` joins the DB manifest.
1576
+ - **Deployer.** One `pip install -c requirements.lock -e "/opt/polyrob[…]"`
1577
+ replaces a non-editable install that left a SECOND code copy in
1578
+ site-packages (4 of 7 units ran that copy); every active unit sourced from
1579
+ `deployment/` is reconciled (the webview unit carrying the de-root hardening
1580
+ never was); `polyrob-browser-server.service` is quiesced with the family;
1581
+ free space is checked on `$TMP`'s mount; the character preflight honours
1582
+ `POLYROB_DATA_DIR`; the wallet chown is guarded; the import test covers the
1583
+ telegram surface.
1584
+ - **`polyrob serve` trusted `X-Forwarded-For` from anyone** — default is now
1585
+ `127.0.0.1`; new `UVICORN_FORWARDED_ALLOW_IPS`.
1586
+ - **`polyrob profile create --service`** wrote a weaker `polyrob-<name>.service`
1587
+ (collided with `polyrob-email`); it now renders the committed
1588
+ `polyrob@.service` template (byte-pinned) and enables `polyrob@<name>`.
1589
+ - `polyrob approvals *` / `polyrob config set` act on the DEPLOYED data home.
1590
+ - `setup_publish_vhost.sh` chowns the publish root to the agent (first publish
1591
+ EACCES'd) and no longer guesses a port for `/api/`.
1592
+
1593
+ ### Changed
1594
+
1595
+ - `requirements.lock` is `uv pip compile --all-extras --universal` (every extra
1596
+ pinned, none installed unless named); `requirements.txt` is a thin pointer
1597
+ (`-c requirements.lock` + the prod extras). Root units that stay root gain
1598
+ `Group=polyrob-data` + `UMask=0002`. `.dockerignore` added; the image sets
1599
+ `UVICORN_HOST=0.0.0.0` + `POLYROB_IN_DOCKER=1`. `release.yml` runs only on
1600
+ the public repository.
1601
+
1602
+ ### Removed
1603
+
1604
+ - `webview/webview.service`, `scripts/publish_prune.sh`,
1605
+ `deployment/nginx_continuous_chat_fix.conf`, `.github/workflows/deploy-portal.yml`;
1606
+ the api+webgate units, `nginx.conf`, the Xvfb trio and the SSL scripts moved to
1607
+ `deployment/legacy/`; `deployment/CLEAN_DEPLOY.md` retired.
1608
+
1609
+ ## [1.0.2] — 2026-09-18
1610
+
1611
+ ### Added
1612
+
1613
+ - Fly.io single-tenant container posture (`deployment/fly/`): a runtime image
1614
+ (python + `polyrob[all]` + Chromium + tmux + git + the native Claude Code CLI),
1615
+ a one-machine `fly.toml` with NO services and no IP (nothing listens;
1616
+ Telegram is outbound), an entrypoint that clones the private repo onto the
1617
+ volume (credential store, never a token in the URL), layers the committed
1618
+ non-secret flags UNDER the Fly secrets, installs an instance kit on first
1619
+ boot and runs three processes as one non-root user: the agent runner
1620
+ (`touch /data/restart.agent` = clean restart after a `git pull` = deploy),
1621
+ the Claude dev `/loop` in tmux (the `/dev` Telegram rail pastes into it),
1622
+ and a watchdog. A second instance gets its own `<name>.fly.env` + a container-specific
1623
+ `dev-loop-prompt.md`. `deployment/fly/README.md` lists what to buy and which
1624
+ secrets to set.
1625
+ - X OAuth 2.0 user token: encrypted store + **auto-refresh** (`tools/x_oauth2.py`).
1626
+ The X Chat DM read (where every inbound DM now lands) needs a user-context
1627
+ OAuth2 token that X expires two hours after mint; the tree read ONE static
1628
+ env value and never refreshed it, so a hand-minted token proved the rail once
1629
+ and then inbound went dark. Every consumer (`surfaces/x/client.py`,
1630
+ `tools/twitter_tool.py`, the `polyrob x`/gateway presence checks, the CLI
1631
+ twitter gate) now resolves through `resolve_access_token`: store → refresh
1632
+ within 5 min of expiry (refresh token ROTATED and persisted before the old one
1633
+ is dropped; a failed refresh keeps the old pair) → env seed
1634
+ (`TWITTER_OAUTH2_ACCESS_TOKEN` + new `TWITTER_OAUTH2_REFRESH_TOKEN`, stored
1635
+ once) → static env override. The DM client retries a 401 exactly once on a
1636
+ refreshed token; the twitter tool rebuilds its DM + Chat clients before every
1637
+ DM read/send. `polyrob x-account oauth-login` (PKCE with a local callback),
1638
+ `oauth-import` (hidden prompts), `oauth-status`, `oauth-refresh`. New flags
1639
+ `TWITTER_OAUTH2_CLIENT_ID` / `_CLIENT_SECRET` / `_REFRESH_TOKEN`.
1640
+
1641
+ ### Changed
1642
+
1643
+ - **The per-transaction wallet ceiling is the owner's, from chat** (owner ruling
1644
+ 2026-09-18, after the second time an approved raise did nothing).
1645
+ `budget.wallet_per_tx_usd` is now an owner-override preference: an approved
1646
+ value replaces the `AGENT_WALLET_MAX_PER_TX_USD` default in either direction,
1647
+ clamped to the daily cap (`core/wallet/config.py::effective_max_per_tx_usd`).
1648
+ The daily cap (`budget.wallet_daily_usd` over `WALLET_DAILY_CAP_USD`) stays
1649
+ min-merged and env-only — it is the operator's hard envelope, so a single
1650
+ transaction can never exceed what a day may lose and no raise made from chat
1651
+ moves the maximum daily loss. Prod 2026-09-17: the owner approved
1652
+ `wallet_per_tx_usd = 220`, the pref sat on disk, the guard kept reading the
1653
+ env's $120, and the agent asked the owner to edit `polyrob.env` and restart.
1654
+
1655
+ ### Fixed
1656
+
1657
+ - **The wallet caps apply LIVE.** `PolicyGate` copied both caps at construction
1658
+ (process start), so `budget.wallet_per_tx_usd` / `budget.wallet_daily_usd` —
1659
+ documented and shown as `applies: live` — took effect only at the next
1660
+ restart, in EITHER direction (an owner tightening from chat was just as
1661
+ inert). `WalletConfig.cap_resolver` (`live_caps_resolver`) is consulted on
1662
+ every `check()` and by the cap properties; a hand-built config keeps the
1663
+ frozen values; a raising resolver keeps what the gate had.
1664
+ - **The approval pre-hook read the raw env ceiling, not the owner's.**
1665
+ `spend_lane.autonomous_ceiling_usd()` read `DEFI_AUTONOMOUS_MAX_USD` while
1666
+ `tx_guard` step 9 read the pref-resolved `budget.defi_autonomous_usd`, so the
1667
+ two halves of one lane disagreed: the owner approved a $300 autonomous
1668
+ ceiling, tx_guard honoured it, and the hook still demanded a tap for every
1669
+ live swap over the env's $5 — three taps in one afternoon for trades the
1670
+ owner had said may run unattended, and an unattended cron buyback that could
1671
+ never run. The hook now delegates to `tx_guard.autonomous_max_usd` (fail-open
1672
+ to the env value, never wider).
1673
+ - **Approving an ask a CRON run raised re-arms the job instead of waking the
1674
+ dead run.** The ask had no goal to re-arm, so resume-on-grant self-woke the
1675
+ finished cron session — a forged turn the money guard refuses — and the agent
1676
+ told the owner "trigger it from your seat" for a trade the owner had just
1677
+ approved (prod 2026-09-17 16:14). Autonomous sessions now remember their cron
1678
+ job (`autonomy_marker.cron_job_for_session`, threaded through
1679
+ `run_task_to_outcome(cron_job_id=)`), the ask carries `cron_job_id`, and an
1680
+ approval pulls that job's `next_run_at` to now (`core/cron_rearm.py`, the one
1681
+ UPDATE both `CronJobStore.run_now` and the owner queue use) so the next tick —
1682
+ a genuine cron turn — redeems the grant. No wake. A running job is left alone
1683
+ and the owner is told its next run redeems the grant.
1684
+ - **A guarded proposal that could never take effect is refused, not queued.**
1685
+ For a min-merged key with the env set, a value above the env value resolved
1686
+ to the env value after the tap — the owner saw "tap to approve", tapped, and
1687
+ nothing moved. `propose_pref_change` now refuses up front and names the exact
1688
+ env line (`WALLET_DAILY_CAP_USD=…` in the service env file) that would.
1689
+
1690
+ - `FileTokenStore` writes follow the shared-data identity convention
1691
+ (`<writer>:polyrob-data 0660` under a group-writable data dir; an existing
1692
+ file keeps its mode + group). It wrote `0600` in the writer's primary group,
1693
+ so the OAuth2 pair the root CLI imported was unreadable by `polyrob-agent`
1694
+ — the unit that needed it — and an agent-written refresh would have been
1695
+ unreadable by the owner's CLI the same way.
1696
+ - `FileTokenStore` no longer treats an UNREADABLE file as a CORRUPT one. On
1697
+ prod the `polyrob-email` unit (a non-root service identity) got `EACCES` on
1698
+ the root-owned `0600` X token store that `polyrob.service` had just written,
1699
+ and the corruption branch renamed the file aside — deleting the agent's
1700
+ freshly imported OAuth2 pair from under the process that owned it. An
1701
+ `OSError` on read now logs and yields an empty in-memory store for THAT
1702
+ process only; the file is left where it is.
1703
+
1704
+ - **The browser rail under wallet custody (proposal 049).** A custody process
1705
+ refused local Chromium — correctly — but never reached the isolated browser
1706
+ it was told to use: `BrowserManager` passed the `BrowserConfig` into
1707
+ `Browser`'s BotConfig slot, so `BROWSER_CDP_URL`/`BROWSER_WSS_URL` were
1708
+ dropped (prod 2026-09-17: the service ran, the env was set, 4,517 refusals in
1709
+ 24 h, and the agent told the owner "no remote browser configured"). Over CDP,
1710
+ every session then attached to the service's default PERSISTENT context — no
1711
+ `storage_state` (the X login silently dropped), no service-worker block, one
1712
+ cookie jar shared by every session and tenant. Both fixed: the endpoint
1713
+ reaches the browser, and a remote browser always gets a fresh context.
1714
+ - Owner-ceremony launches (`x-account capture-session`/`signup`, the pfp still)
1715
+ now consult the one launch policy: refused under custody, scrubbed env,
1716
+ sandbox on. `tests/test_browser_launch_ratchet.py` pins the launch sites.
1717
+
1718
+ ### Added
1719
+
1720
+ - `core/security/browser_rail.py`: the ONE answer to "can this process drive a
1721
+ browser, and through what" — `none (custody) → install`, `configured,
1722
+ unreachable (<reason>) → check the service`, `remote cdp ok (<version>)`.
1723
+ Read by the launch refusal, the step loop (which now skips the per-step page
1724
+ observation and warns once instead of three ERRORs per step), the
1725
+ `<tool-catalog>` (`gated:custody-no-browser` for `browser`/`x_browser`/
1726
+ `dapp_browser`), the status snapshot's `identity` section (`browser:` line;
1727
+ WARN only when a configured endpoint fails) and `polyrob doctor`.
1728
+ - `polyrob browser install|update|status|render`: the isolated browser
1729
+ service as a boundary — dedicated UID, Chromium **sandbox on** via an AppArmor
1730
+ `userns` profile (Ubuntu 24.04 restricts unprivileged user namespaces; the
1731
+ earlier unit's `--no-sandbox` was a wrong diagnosis of that), a UID-keyed nft
1732
+ egress chain (no loopback / RFC1918 / link-local / metadata from the browser),
1733
+ Chromium for the venv's Playwright pin. `deployment/polyrob-browser.service`,
1734
+ `polyrob-browser-egress.service`, `hardening/polyrob-browser-egress.sh` and
1735
+ `hardening/apparmor/polyrob-browser` are the CLI's rendered output, pinned by
1736
+ a test. `scripts/deploy_prod.sh` prints the browser revision beside the pin
1737
+ and updates on drift. `--mode server --listen <private-ip>` on a SECOND host
1738
+ writes a Playwright-server unit instead (token in a root-only env file,
1739
+ private bind enforced) and prints the agent's `BROWSER_WSS_URL` — the shape
1740
+ that removes the shared kernel. Guide: `docs/guide/self-hosting.md`.
1741
+
1742
+ ### Fixed
1743
+
1744
+ - The REPL painted 5–10 blank rows above the prompt for every provider error
1745
+ and never showed the error text: `core/logging.py` gave the file handler
1746
+ and the console handler ONE `ComfyFormatter`, whose 0.5 s duplicate filter
1747
+ saw the console's copy of each record as a repeat of the file's and
1748
+ returned `""` — the `StreamHandler` still wrote the newline, and every such
1749
+ write erased and redrew the prompt. Duplicate suppression is now a
1750
+ per-handler `logging.Filter` (a formatter cannot drop a record), and the
1751
+ REPL console renders one compact `✗ component: message` line per error;
1752
+ a re-wrapped exception (one 401 logged five layers of the same text) is
1753
+ collapsed to its first line on the console only — `bot.log` keeps every
1754
+ layer.
1755
+ - Gemini: a text part was dropped and logged as `Gemini function_call
1756
+ missing name` at ERROR. A proto `Part` answers `hasattr(part,
1757
+ "function_call")` True for every oneof member, so a plain text part hit the
1758
+ nameless-call branch and `continue`d — every text-only Gemini reply became
1759
+ "Model output has empty action list", the model was pushed into a filler
1760
+ step, and the REPL showed a second bubble ("Я жду твоего ответа"). Presence
1761
+ is now asked via `"function_call" in part`.
1762
+ - A session the terminal created (REPL, one-shot `polyrob run`) is a live
1763
+ surface: it renders every reply from the feed but bound no router, so
1764
+ `maybe_deliver_autonomous_send` pushed each chat reply through the owner
1765
+ delivery rail — dedup, the hourly rate limit and the daily cap included.
1766
+ Past the cap `send_message` told the model its answer was "NOT delivered",
1767
+ the model re-sent an apology (another duplicate bubble) and the turn closed
1768
+ `failed`. `core.surfaces.binding.bind_terminal_surface` marks such a
1769
+ session; `--resume` keeps the durable rail (2026-08-28 incident).
1770
+ - The bounded planning turn (`ALLOWED_REASONING_TURNS`) no longer logs two
1771
+ ERROR lines ("violates the agent contract") before the caller grants it.
1772
+
1773
+ ### Changed
1774
+
1775
+ - `done(text)` no longer reaches the user on any chat surface. `done` writes
1776
+ the run log (history + session feed) and nothing else; only `send_message`
1777
+ / `message` speak, in a DM as in a room — exactly what the prompt has told
1778
+ the model since C1. The old router mirror published `done` whenever
1779
+ `send_message` had not claimed the turn, and the `message` tool (a file
1780
+ with a caption) never claimed it, so on prod (2026-09-17) the owner received
1781
+ the answer AND a 2,400-char third-person session recap after every such
1782
+ turn. The unbound HTTP paths (`chat_once`, `/v1/chat/completions`) still
1783
+ fall back to `done`'s text for the response body when the turn spoke
1784
+ nothing — a request needs a body.
1785
+
1786
+ ### Removed
1787
+
1788
+ - `CHAT_SINGLE_FINAL`. Its only consumer was the `done` mirror's latch gate;
1789
+ with the mirror gone there is no second voice to gate, and a flag would be
1790
+ a knob on a rule the prompt states without one. `core/surfaces/turn_reply.py`
1791
+ keeps only the reply-text record the unbound paths read.
1792
+
1793
+ ## [1.0.1] — 2026-09-17
1794
+
1795
+ ### Added
1796
+
1797
+ - `self-deploy` skill: an agent-facing bootstrap for a FRESH instance —
1798
+ assess (model, wallet + funding per chain, email, X, autonomy grants, tool
1799
+ catalog), provision what a lever exists for (own inbox, X account, standing
1800
+ work), bundle the human-only asks into ONE message (API keys, funding
1801
+ addresses read from a tool, env flags, a CAPTCHA), verify by a READ, and
1802
+ report one readiness table. Until now `polyrob init` was the human's wizard
1803
+ and the setup interview covered only the owner contract.
1804
+ - `twitter_poll_results(tweet_id)`: reads the options, votes, shares,
1805
+ `voting_status` and end time of a poll the agent posted. The tool could post
1806
+ a poll (`poll_options`) but no read asked for `attachments.poll_ids`, so the
1807
+ agent could ask the community and never learn the answer. The
1808
+ `x-engagement` skill now teaches the post → record id → read → aggregate loop
1809
+ and pins poll answers as DATA.
1810
+ - X message reads distinguish legacy Direct Messages from encrypted X Chat,
1811
+ support OAuth 2.0 PKCE user tokens, and can verify/decrypt Chat event history
1812
+ with the official Chat XDK and account keys instead of misreporting ciphertext
1813
+ or a legacy-only page as an empty inbox.
1814
+ - The `identity` status section now reports the agent's reachable identities:
1815
+ `email:` (the address it sends AS, or `none → remedy`) and `x:` (API rail
1816
+ configured / PARTIAL with the missing key names / none, plus the handle and
1817
+ whether writes are armed). Env PRESENCE only, never a value.
1818
+ - A `liquidity` status section on every seat (status snapshot, `polyrob wallet
1819
+ overview`, Telegram `/wallet overview`, console `GET /api/webgate/liquidity`)
1820
+ lists the treasury's Uniswap v3 positions with their fees; on-chain
1821
+ enumeration is opt-in and owner-only. `/lp` is listed in the money verb
1822
+ group on every chat surface.
1823
+ - `launchpad_status` names the graduated pool (PoolKey + pool id) once a Pons
1824
+ V2 curve has graduated, and states the fee reality: the LP fee is 0, the
1825
+ hook collects, creator income is claimed via the escrow, and the launch
1826
+ locker position cannot be withdrawn.
1827
+ - `X_SIGNUP_HANDLE` / `X_SIGNUP_DISCLOSURE`: the @handle `x_signup_start`
1828
+ requests and the automation-disclosure bio it writes.
1829
+
1830
+ ### Changed
1831
+
1832
+ - Post-1.0 alignment sweep: one home per shared rule instead of hand-carried
1833
+ copies. `core.event_log` owns the telemetry db resolution and a fail-open
1834
+ `emit()` (the recap reader used to ignore `TELEMETRY_EVENT_LOG_PATH` and
1835
+ create the db on read); every owner/admin CLI verb resolves its data home
1836
+ through `cli/_admin_home.py` (the deployed-home rule now also covers
1837
+ `apps`, `surface`, `cron`, `goals`, `journey`, and `owner pending`'s goal
1838
+ board, which came from a third resolver); the sub-agent and owner-pause
1839
+ refusals every money verb states live in `core.wallet.authority`; the
1840
+ publish/app-service owner-turn clauses in `core.security.owner_turn`; the
1841
+ ship rail's orchestrator/approval/workspace helpers in `tools/ship_common.py`;
1842
+ the goal board's status/kind vocabulary in `core.goal_vocab`; the `/help`
1843
+ group order is read from `core.verbs`; the copy-layer engine is shared by
1844
+ `core.copy` and `webview.copy`; the Telegram update dedup is the core
1845
+ `IdempotencyStore` over its existing table. Twelve open-coded boolean
1846
+ truth sets now parse through `core.env`, pinned shrink-only by
1847
+ `tests/test_bool_env_parse_ratchet.py`.
1848
+ - Social-agent skills and toolsets now route public discovery, native X account
1849
+ reads, encrypted Chat, browser inbox fallback, and approval-gated writes through
1850
+ the capabilities that actually implement each operation.
1851
+ - REPL slash commands parse quoted arguments (`/steer "two words"` is one
1852
+ argument); an unbalanced quote is refused with the remedy. Free-text verbs
1853
+ (`/learn`, `/persona`) keep the raw line. `/export` names the formats the
1854
+ REPL supports and points at `polyrob session export` for the rest; `/logs`
1855
+ prints the log directory instead of a CLI verb that does not exist.
1856
+ - The approval `awaiting` event names the provider that will decide.
1857
+ - `lp_collect` / `lp_remove` set their receipt minimum from a simulated
1858
+ collect, not the position's fee-growth estimate (core rounding leaves the
1859
+ estimate several raw units high, which made a correct collect refuse).
1860
+ Every position receipt also asserts the fungible legs. LP legs are no longer
1861
+ written into the token-keyed position book: adding them double-counted
1862
+ tokens already held, and removing them on withdrawal erased unrelated
1863
+ holdings. Position receipts stay in the NFT and transaction telemetry until
1864
+ an LP-specific basis exists.
1865
+
1866
+ ### Fixed
1867
+
1868
+ - Scheduled agent runs now propagate wall-clock cancellation and are recorded as
1869
+ incomplete unless the agent actually calls `done()`. The default cron budget is
1870
+ ten minutes, preventing slow provider calls from silently turning unfinished
1871
+ treasury rails into successful ticks.
1872
+ - Provider health distinguishes a sentinel on the serving provider from one on an
1873
+ unused fallback. A credit-limited fallback is shown as a warning and explicitly
1874
+ does not claim to block the live provider.
1875
+ - Live incremental streams claim the turn's reply latch after becoming visible,
1876
+ preventing `done()` bookkeeping from producing a second user-facing response.
1877
+ - Browser management accepts operator-configured CDP and WebSocket endpoints, so
1878
+ hardened custody deployments can keep Chromium outside the signing service.
1879
+ - The owner's spend ceilings are read from the same home the preference
1880
+ writers use. `tx_guard`, the wallet config fallback and the Telegram
1881
+ `/wallet autonomous` verb resolved the preference store through the
1882
+ process home (an empty tree under a service account), so an approved
1883
+ `budget.defi_autonomous_usd` was recorded and never read and the guard kept
1884
+ refusing at the env default. Those seats may no longer call the process
1885
+ home (ratcheted).
1886
+ - X self-registration: `XPageDriver.set_handle_and_profile` was a `pass` stub
1887
+ while the docs claimed the disclosure was written into the bio — no handle
1888
+ and no disclosure were ever applied. It now edits `/settings/screen_name` and
1889
+ `/settings/profile` best-effort and RETURNS what it applied; the signup
1890
+ result carries `requested_handle`/`handle_applied`/`bio_applied` and the tool
1891
+ says plainly when the disclosure is NOT on the profile yet. The flow refuses
1892
+ up front with the remedy when the agent has no email or no inbox client
1893
+ (it used to fill an EMPTY email and pause several steps later on "no code
1894
+ arrived"), provisions the AgentMail inbox idempotently before opening a
1895
+ browser, and the default disclosure names the instance instead of the
1896
+ owner's internal tenant id (`operated by local`).
1897
+ - `x_browser` stays explicit-grant-only: it is `high_impact` +
1898
+ `delegate_blocked`, so it is not on the CLI optional-registrar table and is
1899
+ reached by explicit `tool_ids` only.
1900
+ - A per-profile daemon (`polyrob profile create --service`) no longer loads
1901
+ the primary instance's environment first: any key the profile did not
1902
+ override leaked through (its Telegram token → a 409 fight, its `TWITTER_*`
1903
+ keys → the profile posted AS the primary, its owner ids and money flags). A
1904
+ profile daemon reads its own environment files only.
1905
+ - `defi_trade.register_agent` / `set_agent_uri` referenced `os.environ` with
1906
+ no module-level import (latent `NameError`).
1907
+ - The coding and git tools resolve their confined root per TENANT, not the
1908
+ anonymous bucket, on a multi-tenant server.
1909
+ - The `twitter` extra now carries `chatxdk`, which the encrypted X Chat reads
1910
+ need; a base install without the extra still imports.
1911
+
1912
+ ### Deployment
1913
+
1914
+ - The signing service owns the wallet state directory while wallet artifacts
1915
+ remain group-readable, allowing the durable submission journal to be created on
1916
+ the first broadcast without weakening the service-identity boundary.
1917
+
1918
+ ## [1.0.0] — 2026-09-16
1919
+
1920
+ POLYROB 1.0 is the first stable public release. It brings the terminal, web
1921
+ console, chat surfaces, autonomy runtime, tool system and optional wallet rails
1922
+ under one documented control model, with explicit owner authority and
1923
+ fail-closed boundaries around credentials, sessions and money.
1924
+
1925
+ ### Agent, CLI and operator control
1926
+
1927
+ - The terminal client now supports interactive chat and one-shot runs with
1928
+ task files or stdin, file and image attachments, JSON/JSONL results,
1929
+ profile-scoped history, persistent background delegation receipts and full
1930
+ session identifiers.
1931
+ - Safe controls can pause, steer or stop a busy session at step boundaries.
1932
+ Cross-process controls are acknowledged, keyless stops are supported, and
1933
+ update/rollback refuses while a live process owns a database unless the
1934
+ operator explicitly forces it.
1935
+ - Status, doctor, owner, wallet, session and REPL views share the same typed
1936
+ runtime snapshot. Provider fallback updates the displayed provider/model only
1937
+ after the main agent actually switches.
1938
+ - A turn commits one user-facing reply. Completion bookkeeping no longer
1939
+ produces a second chat message, and workspace paths resolve to attachments,
1940
+ console links or an honest server-only state.
1941
+
1942
+ ### Web console
1943
+
1944
+ - The console now has one responsive five-destination shell for Chat, Work,
1945
+ Money, Inbox and Agent. The legacy page set and `WEBVIEW_UI` switch are
1946
+ removed.
1947
+ - Work shows running goals, schedules, cron jobs and live sessions, and can
1948
+ create goals and schedules through the same guarded writers used elsewhere.
1949
+ Money presents typed positions, movements, invoices and limits. Agent exposes
1950
+ identity, memory, skills, capabilities and permitted configuration controls.
1951
+ - The console includes durable light/dark/automatic themes, a shared command
1952
+ palette, live Socket.IO refresh, paginated chat summaries, typed artifacts
1953
+ and narrated tool activity.
1954
+ - Inline scripts were removed from the console CSP. Owner routes, session
1955
+ transcripts, files and event streams are tenant-scoped; logout revokes the
1956
+ active token and authentication storage failures deny access.
1957
+ - Console mutations rely on the HttpOnly session cookie. The standalone proxy
1958
+ forwards authenticated identity to the task API and renders structured
1959
+ refusals. Money includes an owner-scoped, read-only wallet view with safety
1960
+ labels, trusted cached balances and unresolved-submission warnings.
1961
+
1962
+ ### Autonomy, groups and owner authority
1963
+
1964
+ - Telegram groups have a public-session profile, per-chat roles and policy,
1965
+ bounded toolsets, reply threading, a room ledger and owner-only administration
1966
+ from direct messages. Denied room turns do not leak owner facts or private
1967
+ notices into the room.
1968
+ - Optional paid room actions use expiring offers, asset-aware x402 invoices,
1969
+ settlement verification, effect receipts and credits when a paid effect
1970
+ cannot be applied.
1971
+ - Owner stop instructions persist across restarts. Paused streams stay paused,
1972
+ only an owner can resume global autonomy, and owner rules distinguish
1973
+ restrictive instructions from permission-granting changes.
1974
+ - Delivery suppression is observable and recoverable: missed notices, caps,
1975
+ quiet-hour holds and unavailable producers are represented in status rather
1976
+ than silently counted as delivery.
1977
+
1978
+ ### Skills, memory, models and identity
1979
+
1980
+ - Curated character profiles ship in wheel and source distributions. Persona
1981
+ selection, authoring and inspection are available from the CLI, REPL and
1982
+ console, and the neutral stock avatar now ships without instance-specific
1983
+ identity.
1984
+ - Skill triggers, action names and tool IDs are checked against the runtime
1985
+ index. Trading, token assessment and verified-tooling guidance cover the
1986
+ capabilities exposed by the current tool catalog.
1987
+ - Owners can add, test and remove HTTPS MCP servers from the CLI, REPL or
1988
+ Telegram. Persisted servers reload per tenant; stdio entries remain local
1989
+ configuration and are refused in wallet-custody processes.
1990
+ - Model profiles and auxiliary routing were expanded, while prompt catalogs and
1991
+ recent context are kept within model size ceilings.
1992
+
1993
+ ### Optional wallet, payments and on-chain tools
1994
+
1995
+ - The optional wallet stack supports guarded EVM and Solana swaps, bridges,
1996
+ token deployment, contract calls, launchpads, dapp sessions, NFT inspection
1997
+ and transfer, revenue collection, ERC-8004 identity, asset-aware x402
1998
+ settlement and initial Uniswap v3 liquidity reads and writes.
1999
+ - Money tools remain disabled until their feature flags, tool grants, owner
2000
+ approval and spend policy all allow the action. Unpriced approvals and
2001
+ undeclared token or NFT movement are refused; submitted and confirmed effects
2002
+ are recorded separately.
2003
+ - Durable spend reservations are serialized across processes. Corrupt or
2004
+ unreadable accounting blocks further spending, chain and venue attribution is
2005
+ retained, and receipt reconciliation checks the landed effect before marking
2006
+ an action complete.
2007
+ - Token assessment adds resolver fallbacks, holder concentration, price history,
2008
+ new-pool discovery and composite screening with explicit partial/unknown
2009
+ states. These rails remain experimental and off by default.
2010
+
2011
+ ### Security and release integrity
2012
+
2013
+ - Evaluation runs default to reviewed fixture scenarios with sealed run,
2014
+ configuration and source identity. Missing, unknown, drifted or mismatched
2015
+ evidence fails scoring, and unbudgeted live evaluation seeding is disabled.
2016
+
2017
+ - Child processes receive a credential-scrubbed environment. Managed RPC URLs,
2018
+ bearer tokens and provider keys are masked in configuration, logs, stored
2019
+ results and terminal output.
2020
+ - Browser and fetch paths enforce URL and redirect checks, block protected
2021
+ network ranges, reject compressed responses, pin validated addresses and use
2022
+ one deadline across DNS and redirect hops. Untrusted content is framed at
2023
+ model and browser-render boundaries.
2024
+ - Host execution is refused when wallet custody or a payment/deposit master seed
2025
+ requires a sandbox, including when the agent wallet itself is disabled.
2026
+ - Session tokens require finite expiry and revocation identifiers. API request
2027
+ bodies, command output and concurrent reads are bounded; cancelled host and
2028
+ container processes are reaped.
2029
+ - External payment, exchange and treasury submissions journal their local
2030
+ intent, signature or transaction hash before broadcast. Ambiguous outcomes
2031
+ keep the spend interlock held until reconciliation, preventing a blind retry.
2032
+ - EVM and treasury sends reserve before signing. Submission-journal identity and
2033
+ high-water checks refuse missing or truncated history; venue attempts cannot
2034
+ be released by smaller charges or charges for another venue. A read-only
2035
+ recovery diagnostic checks EVM/Solana chain evidence while retaining every
2036
+ reservation. Shared urllib RPC replies have raw byte and encoding limits;
2037
+ malformed or unrelated EVM receipts remain pending.
2038
+ - Treasury sweeps verify the configured chain and derived signing address,
2039
+ reserve the signed gas cost, use pending nonces and require a matching
2040
+ successful receipt before bookkeeping can complete.
2041
+ - Chromium launches with sandboxing enabled. Sandbox opt-out is restricted to
2042
+ local non-custody development, failed startup reaps the driver, and remote
2043
+ browser credentials are redacted from connection errors.
2044
+ - Package manifests now carry the migrations, console assets, avatar engine,
2045
+ character library, contract sources, browser DOM helper and bundled fonts
2046
+ used at runtime. Release checks install the wheel into a bare environment and
2047
+ exercise version, help, doctor and migration commands before publication.
2048
+ - Knowledge ingestion reads bounded, descriptor-relative snapshots; rejects
2049
+ symlinks, hard-link aliases and special files; and hashes the same bytes it
2050
+ parses. DOCX admission bounds archive expansion, part and table counts, XML
2051
+ structure and extracted text, while failed replacements preserve existing
2052
+ knowledge.
2053
+ - Upload capacity remains reserved until temporary request storage is consumed
2054
+ or closed, binary sniffing is bounded, and mismatched content lengths are
2055
+ rejected.
2056
+ - Wallet audit locks are reusable only by the asyncio task that owns the spend
2057
+ reservation; unrelated tasks and worker threads cannot borrow another task's
2058
+ reservation.
2059
+ - Package builds now require setuptools 83.0 or newer.
2060
+ - Skill writes and promotions validate tenant identifiers, refuse linked paths,
2061
+ use descriptor-relative atomic writes and archives, and fail closed when the
2062
+ threat scanner is unavailable. Project-context snapshots are bounded.
2063
+ - Acceptance declarations are validated before execution or goal creation. File
2064
+ probes are confined, artifact IDs bind to their goal and session, hash/content
2065
+ checks use one snapshot, and HTTP probes pin public addresses and revalidate
2066
+ redirects.
2067
+ - Provider recovery adopts the shared model state, restores the requested native
2068
+ tool mode and refreshes capability catalogs before each step. Source precedence
2069
+ separates current owner intent from factual evidence.
2070
+ - Short untrusted tool strings are framed, final action evidence survives long
2071
+ runs, test verification requires real comparable results, and memory corrections
2072
+ do not delete nonidentical facts solely from embedding similarity.
2073
+ - Knowledge sources publish chunks and hash/count metadata atomically, preserving
2074
+ the previous source on failure and excluding stale vector-cache content.
2075
+ - Directory discovery is bounded by output, entry count, depth and elapsed time.
2076
+ PDF and DOCX parsing runs in admitted subprocesses with cancellation cleanup;
2077
+ Linux adds an address-space limit.
2078
+
2079
+ ### Breaking changes and migration
2080
+
2081
+ - The version advances directly from 0.13.0 to 1.0.0; no 0.14.0 release was
2082
+ published.
2083
+ - The legacy console routes and `WEBVIEW_UI` selector are removed. Use the five
2084
+ destination console and `/api/webgate/*` endpoints.
2085
+ - Public group sessions no longer inherit owner memory, project context or
2086
+ owner-only tools. Deployments that relied on broad group access must configure
2087
+ explicit per-chat policy and tool grants.
2088
+ - Review the [upgrading guide](docs/guide/upgrading.md),
2089
+ [configuration reference](docs/CONFIGURATION.md) and
2090
+ [security model](docs/guide/security-model.md) before enabling autonomy,
2091
+ wallet custody, code execution or public chat surfaces.
2092
+
2093
+ Releases before 1.0.0 (0.4.2 through 0.13.0) are in
2094
+ [`CHANGELOG-archive.md`](CHANGELOG-archive.md).