sliceagent 0.1.18__tar.gz → 0.3.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 (375) hide show
  1. {sliceagent-0.1.18 → sliceagent-0.3.0}/.env.example +11 -5
  2. sliceagent-0.3.0/.github/workflows/publish.yml +67 -0
  3. {sliceagent-0.1.18 → sliceagent-0.3.0}/.gitignore +22 -4
  4. {sliceagent-0.1.18 → sliceagent-0.3.0}/CHANGELOG.md +216 -0
  5. {sliceagent-0.1.18 → sliceagent-0.3.0}/NOTICE +2 -2
  6. sliceagent-0.3.0/PKG-INFO +411 -0
  7. sliceagent-0.3.0/QUICKSTART.md +124 -0
  8. sliceagent-0.3.0/README.md +378 -0
  9. sliceagent-0.3.0/SECURITY.md +43 -0
  10. {sliceagent-0.1.18 → sliceagent-0.3.0}/benchmarks/README.md +14 -1
  11. sliceagent-0.3.0/benchmarks/provider_concurrency_probe.py +134 -0
  12. {sliceagent-0.1.18 → sliceagent-0.3.0}/benchmarks/run.py +48 -11
  13. sliceagent-0.3.0/benchmarks/subagent_fanout.py +725 -0
  14. sliceagent-0.3.0/docs/CONFIGURATION.md +94 -0
  15. sliceagent-0.3.0/docs/ENDGAME-CONTEXT-DESIGN.md +248 -0
  16. sliceagent-0.3.0/docs/MEMORY-LAYERS-DESIGN.md +325 -0
  17. sliceagent-0.3.0/docs/SUBAGENT-DESIGN.md +250 -0
  18. sliceagent-0.3.0/evals/__init__.py +2 -0
  19. sliceagent-0.3.0/evals/context_contract_eval.py +282 -0
  20. sliceagent-0.3.0/evals/oldprompt_memory_model.txt +11 -0
  21. sliceagent-0.3.0/evals/receipt_claims.py +617 -0
  22. sliceagent-0.3.0/evals/receipt_prompt_ab.py +469 -0
  23. sliceagent-0.3.0/evals/self_inspection_tool_eval.py +633 -0
  24. sliceagent-0.3.0/evals/selfnarrative_ab.py +863 -0
  25. sliceagent-0.3.0/evals/usersim.py +298 -0
  26. sliceagent-0.3.0/evals/usersim_pty.py +303 -0
  27. {sliceagent-0.1.18 → sliceagent-0.3.0}/install.ps1 +70 -8
  28. {sliceagent-0.1.18 → sliceagent-0.3.0}/install.sh +27 -3
  29. {sliceagent-0.1.18 → sliceagent-0.3.0}/pyproject.toml +11 -9
  30. {sliceagent-0.1.18 → sliceagent-0.3.0}/sliceagent.toml.example +5 -6
  31. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/__init__.py +1 -1
  32. sliceagent-0.3.0/src/sliceagent/active_work.py +1087 -0
  33. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/agents.py +26 -9
  34. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/background_review.py +36 -22
  35. sliceagent-0.3.0/src/sliceagent/cli.py +2656 -0
  36. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/code_grep.py +55 -63
  37. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/code_index.py +1 -1
  38. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/config.py +22 -18
  39. sliceagent-0.3.0/src/sliceagent/context.py +380 -0
  40. sliceagent-0.3.0/src/sliceagent/context_compiler.py +355 -0
  41. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/context_overflow.py +24 -5
  42. sliceagent-0.3.0/src/sliceagent/contextfs.py +1657 -0
  43. sliceagent-0.3.0/src/sliceagent/deliverables.py +134 -0
  44. sliceagent-0.3.0/src/sliceagent/discourse.py +2129 -0
  45. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/envspec.py +42 -15
  46. sliceagent-0.3.0/src/sliceagent/errors.py +286 -0
  47. sliceagent-0.3.0/src/sliceagent/event_ledger.py +438 -0
  48. sliceagent-0.3.0/src/sliceagent/events.py +341 -0
  49. sliceagent-0.3.0/src/sliceagent/execution.py +417 -0
  50. sliceagent-0.3.0/src/sliceagent/fan_in.py +585 -0
  51. sliceagent-0.3.0/src/sliceagent/guidance.py +28 -0
  52. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/hippocampus.py +362 -132
  53. sliceagent-0.3.0/src/sliceagent/hooks.py +406 -0
  54. sliceagent-0.3.0/src/sliceagent/identity.py +176 -0
  55. sliceagent-0.3.0/src/sliceagent/intent.py +2795 -0
  56. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/interfaces.py +60 -7
  57. sliceagent-0.3.0/src/sliceagent/knowledge.py +1444 -0
  58. sliceagent-0.3.0/src/sliceagent/knowledge_index.py +438 -0
  59. sliceagent-0.3.0/src/sliceagent/llm.py +2098 -0
  60. sliceagent-0.3.0/src/sliceagent/loop.py +1722 -0
  61. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/mcp_client.py +117 -28
  62. sliceagent-0.3.0/src/sliceagent/memory.py +1452 -0
  63. sliceagent-0.3.0/src/sliceagent/mentions.py +126 -0
  64. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/model_catalog.py +11 -3
  65. sliceagent-0.3.0/src/sliceagent/model_runner.py +61 -0
  66. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/monitor.py +59 -17
  67. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/neocortex.py +39 -42
  68. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/onboarding.py +24 -26
  69. sliceagent-0.3.0/src/sliceagent/oracle.py +53 -0
  70. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/pagetable.py +47 -33
  71. sliceagent-0.3.0/src/sliceagent/persistence.py +1430 -0
  72. sliceagent-0.3.0/src/sliceagent/pfc.py +468 -0
  73. sliceagent-0.3.0/src/sliceagent/platform_compat.py +381 -0
  74. sliceagent-0.3.0/src/sliceagent/plugins.py +216 -0
  75. sliceagent-0.3.0/src/sliceagent/private_state.py +118 -0
  76. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/procman.py +40 -26
  77. sliceagent-0.3.0/src/sliceagent/progress.py +1169 -0
  78. sliceagent-0.3.0/src/sliceagent/prompt.py +304 -0
  79. sliceagent-0.3.0/src/sliceagent/reach.py +163 -0
  80. sliceagent-0.3.0/src/sliceagent/receipts.py +759 -0
  81. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/records.py +11 -4
  82. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/recovery.py +32 -8
  83. sliceagent-0.3.0/src/sliceagent/regions.py +1855 -0
  84. sliceagent-0.3.0/src/sliceagent/registry.py +337 -0
  85. sliceagent-0.3.0/src/sliceagent/runtime_persistence.py +1708 -0
  86. sliceagent-0.3.0/src/sliceagent/safeguards.py +871 -0
  87. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/safety.py +76 -18
  88. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/sandbox.py +57 -7
  89. sliceagent-0.3.0/src/sliceagent/scheduler.py +901 -0
  90. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/search_index.py +29 -15
  91. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/seed.py +170 -61
  92. sliceagent-0.3.0/src/sliceagent/session.py +525 -0
  93. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/skill_usage.py +10 -1
  94. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/skills.py +29 -2
  95. sliceagent-0.3.0/src/sliceagent/slash.py +37 -0
  96. sliceagent-0.3.0/src/sliceagent/slice_reducer.py +673 -0
  97. sliceagent-0.3.0/src/sliceagent/slice_state.py +289 -0
  98. sliceagent-0.3.0/src/sliceagent/subagent.py +2770 -0
  99. sliceagent-0.3.0/src/sliceagent/subagent_contract.py +1110 -0
  100. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/swap.py +2 -1
  101. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/taskstate.py +49 -3
  102. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/telemetry.py +17 -6
  103. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/terminal.py +48 -35
  104. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/text_utils.py +3 -1
  105. sliceagent-0.3.0/src/sliceagent/tool_identity.py +24 -0
  106. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/tools.py +694 -101
  107. sliceagent-0.3.0/src/sliceagent/tui.py +3109 -0
  108. sliceagent-0.3.0/src/sliceagent/tui_projection.py +329 -0
  109. sliceagent-0.3.0/src/sliceagent/updater.py +368 -0
  110. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/web.py +11 -4
  111. sliceagent-0.3.0/src/sliceagent/workspace_context.py +416 -0
  112. sliceagent-0.3.0/src/sliceagent/workspace_handoff.py +39 -0
  113. sliceagent-0.3.0/src/sliceagent/workspace_revision.py +117 -0
  114. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_active_focus.py +20 -0
  115. sliceagent-0.3.0/tests/test_active_work.py +542 -0
  116. sliceagent-0.3.0/tests/test_active_work_persistence.py +47 -0
  117. sliceagent-0.3.0/tests/test_admission_retirement.py +262 -0
  118. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_agents.py +20 -9
  119. sliceagent-0.3.0/tests/test_artifact_federation.py +79 -0
  120. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_ask_echo.py +3 -14
  121. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_ask_user.py +1 -59
  122. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_background_review.py +24 -0
  123. sliceagent-0.3.0/tests/test_benchmark_runner.py +164 -0
  124. sliceagent-0.3.0/tests/test_block_rendering.py +148 -0
  125. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_bound_is_relevance.py +7 -8
  126. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_breadth_e2e.py +1 -1
  127. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_bugfix_2b.py +8 -8
  128. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_bugfix_current_request.py +7 -5
  129. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_bugfix_memory_wave.py +41 -0
  130. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_bugfix_p0a.py +2 -2
  131. sliceagent-0.3.0/tests/test_bugfix_p0c.py +230 -0
  132. sliceagent-0.3.0/tests/test_bugfix_selfreview_siblings.py +55 -0
  133. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_bugfix_subagent_wave.py +3 -3
  134. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_bugfix_tools_wave.py +10 -10
  135. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_bughunt_fixes.py +178 -196
  136. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_cache_manifest.py +13 -7
  137. sliceagent-0.3.0/tests/test_catastrophic_safeguard.py +287 -0
  138. sliceagent-0.3.0/tests/test_cli_smoke.py +329 -0
  139. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_code_grep.py +73 -41
  140. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_config_journey.py +34 -13
  141. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_consolidate.py +24 -3
  142. sliceagent-0.3.0/tests/test_context_compiler.py +251 -0
  143. sliceagent-0.3.0/tests/test_context_contract_eval.py +120 -0
  144. sliceagent-0.3.0/tests/test_context_elasticity.py +521 -0
  145. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_context_overflow.py +13 -0
  146. sliceagent-0.3.0/tests/test_contextfs.py +592 -0
  147. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_conversation.py +15 -1
  148. sliceagent-0.3.0/tests/test_deepseek_v4.py +213 -0
  149. sliceagent-0.3.0/tests/test_dependency_first_seed.py +77 -0
  150. sliceagent-0.3.0/tests/test_discourse.py +820 -0
  151. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_echo_before_blocking.py +14 -1
  152. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_episode.py +70 -2
  153. sliceagent-0.3.0/tests/test_errors_backoff.py +281 -0
  154. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_esc_sentinel.py +18 -14
  155. sliceagent-0.3.0/tests/test_event_dispatch.py +63 -0
  156. sliceagent-0.3.0/tests/test_event_ledger.py +273 -0
  157. sliceagent-0.3.0/tests/test_execution_kernel.py +2540 -0
  158. sliceagent-0.3.0/tests/test_extreview_fixes.py +114 -0
  159. sliceagent-0.3.0/tests/test_fan_in.py +308 -0
  160. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_file_lock.py +2 -2
  161. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_guidance.py +3 -32
  162. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_history.py +57 -0
  163. sliceagent-0.3.0/tests/test_identity.py +64 -0
  164. sliceagent-0.3.0/tests/test_intent_state.py +569 -0
  165. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_invariant_fixes.py +2 -61
  166. sliceagent-0.3.0/tests/test_knowledge.py +957 -0
  167. sliceagent-0.3.0/tests/test_live_composer.py +1047 -0
  168. sliceagent-0.3.0/tests/test_llm_streaming.py +1364 -0
  169. sliceagent-0.3.0/tests/test_llm_watchdog.py +486 -0
  170. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_loop_overflow.py +205 -37
  171. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_mcp_output_cap.py +38 -5
  172. sliceagent-0.3.0/tests/test_mcp_runtime.py +220 -0
  173. sliceagent-0.3.0/tests/test_memem_knowledge_index.py +196 -0
  174. sliceagent-0.3.0/tests/test_mind_model_demo_replay.py +489 -0
  175. sliceagent-0.3.0/tests/test_model_call_observability.py +340 -0
  176. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_monitor.py +62 -1
  177. sliceagent-0.3.0/tests/test_observation_repeat_advisory.py +149 -0
  178. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_onboarding.py +7 -2
  179. sliceagent-0.3.0/tests/test_persistence_protocol.py +385 -0
  180. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_pinned_composer.py +35 -2
  181. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_procman.py +19 -0
  182. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_product_features.py +88 -19
  183. sliceagent-0.3.0/tests/test_progress_status.py +202 -0
  184. sliceagent-0.3.0/tests/test_projection_truth.py +788 -0
  185. sliceagent-0.3.0/tests/test_prompt_kernel.py +105 -0
  186. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_provenance.py +44 -10
  187. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_proxy_interrupt.py +41 -1
  188. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_reach.py +12 -3
  189. sliceagent-0.3.0/tests/test_reachset.py +35 -0
  190. sliceagent-0.3.0/tests/test_readonly_subagent.py +516 -0
  191. sliceagent-0.3.0/tests/test_receipt_context.py +273 -0
  192. sliceagent-0.3.0/tests/test_receipt_elasticity.py +291 -0
  193. sliceagent-0.3.0/tests/test_receipt_eval.py +790 -0
  194. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_records.py +44 -2
  195. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_reliability.py +224 -73
  196. sliceagent-0.3.0/tests/test_requirements.py +240 -0
  197. sliceagent-0.3.0/tests/test_review_deliverable.py +280 -0
  198. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_route_lexical.py +10 -5
  199. sliceagent-0.3.0/tests/test_runtime_boundaries.py +257 -0
  200. sliceagent-0.3.0/tests/test_runtime_persistence.py +1368 -0
  201. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_safety.py +28 -0
  202. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_search_index.py +40 -0
  203. sliceagent-0.3.0/tests/test_self_inspection_tool_eval.py +425 -0
  204. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_selfreview_fixes.py +9 -29
  205. sliceagent-0.3.0/tests/test_slice_lifecycle.py +173 -0
  206. sliceagent-0.3.0/tests/test_slice_reducer.py +217 -0
  207. sliceagent-0.3.0/tests/test_steered_status.py +183 -0
  208. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_subagent_artifacts.py +66 -23
  209. sliceagent-0.3.0/tests/test_subagent_contract.py +2362 -0
  210. sliceagent-0.3.0/tests/test_subagent_matrix_truth.py +389 -0
  211. sliceagent-0.3.0/tests/test_subagent_orchestration.py +808 -0
  212. sliceagent-0.3.0/tests/test_subagent_review_fixes.py +102 -0
  213. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_subagent_roster.py +93 -43
  214. sliceagent-0.3.0/tests/test_subagent_steering.py +355 -0
  215. sliceagent-0.3.0/tests/test_subagent_work_binding.py +169 -0
  216. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_task_state_roundtrip.py +10 -0
  217. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_telemetry_convergence.py +15 -0
  218. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_tool_dedup.py +10 -7
  219. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_tools_robust.py +6 -5
  220. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_topic_switch.py +59 -2
  221. sliceagent-0.3.0/tests/test_trajectory.py +124 -0
  222. sliceagent-0.3.0/tests/test_tui.py +496 -0
  223. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_tui_menus.py +2 -2
  224. sliceagent-0.3.0/tests/test_tui_render.py +428 -0
  225. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_tui_widgets.py +20 -5
  226. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_turn_budget.py +6 -38
  227. sliceagent-0.3.0/tests/test_turn_contract.py +470 -0
  228. sliceagent-0.3.0/tests/test_turn_progress.py +681 -0
  229. sliceagent-0.3.0/tests/test_turn_receipts.py +379 -0
  230. sliceagent-0.3.0/tests/test_update_work.py +201 -0
  231. sliceagent-0.3.0/tests/test_updater.py +401 -0
  232. sliceagent-0.3.0/tests/test_wave_commitments.py +224 -0
  233. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_web.py +37 -0
  234. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_windows_footguns.py +16 -0
  235. sliceagent-0.3.0/tests/test_workspace_context.py +201 -0
  236. sliceagent-0.3.0/tests/test_workspace_revision.py +83 -0
  237. sliceagent-0.3.0/tests/test_workspace_switch.py +1257 -0
  238. sliceagent-0.3.0/uv.lock +1489 -0
  239. sliceagent-0.1.18/.github/workflows/publish.yml +0 -36
  240. sliceagent-0.1.18/PKG-INFO +0 -295
  241. sliceagent-0.1.18/QUICKSTART.md +0 -83
  242. sliceagent-0.1.18/README.md +0 -263
  243. sliceagent-0.1.18/SECURITY.md +0 -37
  244. sliceagent-0.1.18/src/sliceagent/cli.py +0 -1004
  245. sliceagent-0.1.18/src/sliceagent/errors.py +0 -167
  246. sliceagent-0.1.18/src/sliceagent/events.py +0 -96
  247. sliceagent-0.1.18/src/sliceagent/guardrails.py +0 -438
  248. sliceagent-0.1.18/src/sliceagent/guidance.py +0 -69
  249. sliceagent-0.1.18/src/sliceagent/hooks.py +0 -338
  250. sliceagent-0.1.18/src/sliceagent/llm.py +0 -768
  251. sliceagent-0.1.18/src/sliceagent/loop.py +0 -556
  252. sliceagent-0.1.18/src/sliceagent/memory.py +0 -454
  253. sliceagent-0.1.18/src/sliceagent/oracle.py +0 -38
  254. sliceagent-0.1.18/src/sliceagent/pfc.py +0 -447
  255. sliceagent-0.1.18/src/sliceagent/platform_compat.py +0 -188
  256. sliceagent-0.1.18/src/sliceagent/plugins.py +0 -127
  257. sliceagent-0.1.18/src/sliceagent/policy.py +0 -258
  258. sliceagent-0.1.18/src/sliceagent/prompt.py +0 -273
  259. sliceagent-0.1.18/src/sliceagent/regions.py +0 -710
  260. sliceagent-0.1.18/src/sliceagent/registry.py +0 -128
  261. sliceagent-0.1.18/src/sliceagent/scheduler.py +0 -92
  262. sliceagent-0.1.18/src/sliceagent/session.py +0 -224
  263. sliceagent-0.1.18/src/sliceagent/subagent.py +0 -599
  264. sliceagent-0.1.18/src/sliceagent/tui.py +0 -1504
  265. sliceagent-0.1.18/tests/test_bugfix_p0c.py +0 -85
  266. sliceagent-0.1.18/tests/test_bugfix_selfreview_siblings.py +0 -83
  267. sliceagent-0.1.18/tests/test_cli_smoke.py +0 -162
  268. sliceagent-0.1.18/tests/test_errors_backoff.py +0 -107
  269. sliceagent-0.1.18/tests/test_guardrails.py +0 -283
  270. sliceagent-0.1.18/tests/test_live_composer.py +0 -182
  271. sliceagent-0.1.18/tests/test_llm_streaming.py +0 -320
  272. sliceagent-0.1.18/tests/test_llm_watchdog.py +0 -99
  273. sliceagent-0.1.18/tests/test_mcp_runtime.py +0 -75
  274. sliceagent-0.1.18/tests/test_permission_patterns.py +0 -78
  275. sliceagent-0.1.18/tests/test_progress_status.py +0 -96
  276. sliceagent-0.1.18/tests/test_readonly_subagent.py +0 -282
  277. sliceagent-0.1.18/tests/test_requirements.py +0 -156
  278. sliceagent-0.1.18/tests/test_slice_lifecycle.py +0 -87
  279. sliceagent-0.1.18/tests/test_trajectory.py +0 -287
  280. sliceagent-0.1.18/tests/test_tui.py +0 -133
  281. sliceagent-0.1.18/tests/test_tui_render.py +0 -120
  282. {sliceagent-0.1.18 → sliceagent-0.3.0}/.dockerignore +0 -0
  283. {sliceagent-0.1.18 → sliceagent-0.3.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  284. {sliceagent-0.1.18 → sliceagent-0.3.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  285. {sliceagent-0.1.18 → sliceagent-0.3.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  286. {sliceagent-0.1.18 → sliceagent-0.3.0}/.github/dependabot.yml +0 -0
  287. {sliceagent-0.1.18 → sliceagent-0.3.0}/.github/workflows/ci.yml +0 -0
  288. {sliceagent-0.1.18 → sliceagent-0.3.0}/CODE_OF_CONDUCT.md +0 -0
  289. {sliceagent-0.1.18 → sliceagent-0.3.0}/CONTRIBUTING.md +0 -0
  290. {sliceagent-0.1.18 → sliceagent-0.3.0}/Dockerfile +0 -0
  291. {sliceagent-0.1.18 → sliceagent-0.3.0}/LICENSE +0 -0
  292. {sliceagent-0.1.18 → sliceagent-0.3.0}/assets/sliceagent-core-loop.gif +0 -0
  293. {sliceagent-0.1.18 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s1_longhorizon_debug/meta.json +0 -0
  294. {sliceagent-0.1.18 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s1_longhorizon_debug/prompts.json +0 -0
  295. {sliceagent-0.1.18 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s1_longhorizon_debug/reference_fix.py +0 -0
  296. {sliceagent-0.1.18 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s1_longhorizon_debug/setup.py +0 -0
  297. {sliceagent-0.1.18 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s1_longhorizon_debug/verify.py +0 -0
  298. {sliceagent-0.1.18 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s2_taskdag_scheduler/meta.json +0 -0
  299. {sliceagent-0.1.18 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s2_taskdag_scheduler/prompts.json +0 -0
  300. {sliceagent-0.1.18 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s2_taskdag_scheduler/reference_fix.py +0 -0
  301. {sliceagent-0.1.18 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s2_taskdag_scheduler/setup.py +0 -0
  302. {sliceagent-0.1.18 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s2_taskdag_scheduler/verify.py +0 -0
  303. {sliceagent-0.1.18 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s3_intervalset_algebra/meta.json +0 -0
  304. {sliceagent-0.1.18 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s3_intervalset_algebra/prompts.json +0 -0
  305. {sliceagent-0.1.18 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s3_intervalset_algebra/reference_fix.py +0 -0
  306. {sliceagent-0.1.18 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s3_intervalset_algebra/setup.py +0 -0
  307. {sliceagent-0.1.18 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s3_intervalset_algebra/verify.py +0 -0
  308. {sliceagent-0.1.18 → sliceagent-0.3.0}/examples/plugins/hello/__init__.py +0 -0
  309. {sliceagent-0.1.18 → sliceagent-0.3.0}/examples/plugins/hello/plugin.toml +0 -0
  310. {sliceagent-0.1.18 → sliceagent-0.3.0}/scripts/check_windows_footguns.py +0 -0
  311. {sliceagent-0.1.18 → sliceagent-0.3.0}/scripts/gen_config_reference.py +0 -0
  312. {sliceagent-0.1.18 → sliceagent-0.3.0}/scripts/run_tests.sh +0 -0
  313. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/__main__.py +0 -0
  314. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/access.py +0 -0
  315. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/binsniff.py +0 -0
  316. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/clock.py +0 -0
  317. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/finding_types.py +0 -0
  318. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/flags.py +0 -0
  319. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/fuzzy.py +0 -0
  320. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/mcp_security.py +0 -0
  321. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/metrics.py +0 -0
  322. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/retriever.py +0 -0
  323. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/sensory_cortex.py +0 -0
  324. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/skill_provenance.py +0 -0
  325. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/subdir_hints.py +0 -0
  326. {sliceagent-0.1.18 → sliceagent-0.3.0}/src/sliceagent/tool_summary.py +0 -0
  327. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/README.md +0 -0
  328. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_binary_view.py +0 -0
  329. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_bugfix_breadth_wave.py +0 -0
  330. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_bugfix_linenum.py +0 -0
  331. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_bugfix_loop_wave.py +0 -0
  332. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_bugfix_p0b.py +0 -0
  333. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_bugfix_selfreview.py +0 -0
  334. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_bugfix_skills_h1.py +0 -0
  335. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_bugfix_slice_wave.py +0 -0
  336. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_checkpoint.py +0 -0
  337. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_closure.py +0 -0
  338. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_code_index.py +0 -0
  339. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_config_docs_current.py +0 -0
  340. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_coresidency.py +0 -0
  341. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_exec_env.py +0 -0
  342. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_finding_types.py +0 -0
  343. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_flags.py +0 -0
  344. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_fuzzy.py +0 -0
  345. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_ghost_index.py +0 -0
  346. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_llm_cache.py +0 -0
  347. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_llm_usage_cache.py +0 -0
  348. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_log_redaction.py +0 -0
  349. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_memory.py +0 -0
  350. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_memory_persist.py +0 -0
  351. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_menu_select.py +0 -0
  352. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_metrics.py +0 -0
  353. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_mining.py +0 -0
  354. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_model_catalog.py +0 -0
  355. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_model_identity.py +0 -0
  356. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_pageout_compaction.py +0 -0
  357. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_plan_tier.py +0 -0
  358. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_prompt_ab.py +0 -0
  359. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_provider_lineup.py +0 -0
  360. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_recall_search.py +0 -0
  361. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_refault.py +0 -0
  362. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_registry_validation.py +0 -0
  363. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_repo_map_bounded.py +0 -0
  364. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_review_fixes.py +0 -0
  365. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_seal_markdown.py +0 -0
  366. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_skill_meta.py +0 -0
  367. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_skill_metadata.py +0 -0
  368. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_subdir_hints.py +0 -0
  369. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_task_agnostic.py +0 -0
  370. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_terminal.py +0 -0
  371. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_tool_result_ok.py +0 -0
  372. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_verification_agent.py +0 -0
  373. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_workspace.py +0 -0
  374. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_world_region.py +0 -0
  375. {sliceagent-0.1.18 → sliceagent-0.3.0}/tests/test_world_state.py +0 -0
@@ -4,18 +4,24 @@
4
4
  LLM_API_KEY=sk-... # REQUIRED — any OpenAI-compatible provider (OpenAI/DeepSeek/Moonshot/…)
5
5
  AGENT_MODEL=gpt-5.5 # REQUIRED — model id (no default; pick your provider's model)
6
6
  # LLM_BASE_URL=https://api.deepseek.com # provider endpoint; omit for OpenAI
7
+ # LLM_HARD_TIMEOUT_SEC=300 # absolute whole-call watchdog; unset derives from completion budget
8
+ # LLM_STREAM_CLOSE_GRACE_SEC=2 # wait to prove a cancelled SSE stream physically closed
9
+ # LLM_PROVIDER_MAX_INFLIGHT=4 # physical request cap; timed-out calls hold a slot until closed
7
10
  # AGENT_PROXY=http://127.0.0.1:7890 # optional proxy URL (default: direct connection)
8
11
  # SHOW_SLICE=1 # print the slice each turn
9
12
  # back-compat: OPENAI_API_KEY / OPENAI_BASE_URL / MOONSHOT_API_KEY are still accepted as fallbacks
10
13
 
11
- # --- memory tier (ON by default memem ships as a dependency; these just relocate the stores) ---
12
- # SLICEAGENT_VAULT=~/.sliceagent/vault # sliceagent's STATE vault (episodic cache + task-state records)
13
- # MEMEM_VAULT=~/obsidian-brain # memem's lesson vault (markdown long-term memories)
14
+ # --- memory tier (native typed knowledge is always on; Memem is an optional `memory` install extra) ---
15
+ # SLICEAGENT_VAULT=~/.sliceagent/vault # legacy episodic/task/roster compatibility records
16
+ # MEMEM_VAULT=~/obsidian-brain # memem's human-readable semantic-index projection
14
17
  # MEMEM_DIR=~/.memem # memem's index/state dir
15
18
 
16
- # --- safety / hooks (optional) ---
17
- # AGENT_POLICY=teenager # teenager (default: auto edits, ask on commands) | baby-sitter (ask on all) | let-it-go (auto) — all block catastrophic
19
+ # --- execution / hooks (optional) ---
20
+ # AGENT_SANDBOX=local # local (not an OS boundary) | docker (POSIX/WSL2; native Windows use local/WSL2)
18
21
  # AGENT_MINE=deterministic # write side of memory loop: deterministic (default) | llm | off
19
22
  # AGENT_SUBAGENT_DEPTH=1 # max delegation depth (0 disables spawn_subagent)
23
+ # AGENT_DELEGATION_TIMEOUT=900 # hard ceiling for a child-agent wave; cannot be disabled
24
+ # AGENT_EXPLORER_REASONING=staged # fast evidence navigation + one full tool-free synthesis
25
+ # AGENT_EXPLORER_NAV_STEPS=6 # staged explorer's fast-navigation ceiling (then synthesis)
20
26
  # AGENT_VERIFY_CMD=python3 -m pytest -q # Oracle: run before "done"; failures force another turn
21
27
  # AGENT_MAX_TOKENS=200000 # budget ceiling
@@ -0,0 +1,67 @@
1
+ name: publish
2
+
3
+ # Publish to PyPI via trusted publishing (OIDC — no tokens).
4
+ # Trigger: a published GitHub release. The release tag must match the package version.
5
+ on:
6
+ release:
7
+ types: [published]
8
+
9
+ jobs:
10
+ build:
11
+ runs-on: ubuntu-latest
12
+ steps:
13
+ - uses: actions/checkout@v7
14
+ with:
15
+ ref: ${{ github.event.release.tag_name }}
16
+ - uses: actions/setup-python@v6
17
+ with:
18
+ python-version: "3.12"
19
+ - name: Verify release tag matches package version
20
+ env:
21
+ RELEASE_TAG: ${{ github.event.release.tag_name }}
22
+ run: |
23
+ python - <<'PY'
24
+ import ast
25
+ import os
26
+ from pathlib import Path
27
+
28
+ tree = ast.parse(Path("src/sliceagent/__init__.py").read_text(encoding="utf-8"))
29
+ version = next(
30
+ ast.literal_eval(node.value)
31
+ for node in tree.body
32
+ if isinstance(node, ast.Assign)
33
+ and any(isinstance(target, ast.Name) and target.id == "__version__" for target in node.targets)
34
+ )
35
+ tag = os.environ["RELEASE_TAG"]
36
+ expected_tag = f"v{version}"
37
+ expected_ref = f"refs/tags/{tag}"
38
+ if tag != expected_tag:
39
+ raise SystemExit(f"release tag {tag!r} does not match package version {version!r}")
40
+ if os.environ["GITHUB_REF"] != expected_ref:
41
+ raise SystemExit(
42
+ f"release ref {os.environ['GITHUB_REF']!r} does not match tag ref {expected_ref!r}"
43
+ )
44
+ print(f"Publishing SliceAgent {version} from {expected_ref}")
45
+ PY
46
+ - name: Build and validate distributions
47
+ run: |
48
+ python -m pip install build twine
49
+ python -m build
50
+ python -m twine check dist/*
51
+ - uses: actions/upload-artifact@v7
52
+ with:
53
+ name: dist
54
+ path: dist/
55
+
56
+ publish:
57
+ needs: build
58
+ runs-on: ubuntu-latest
59
+ environment: pypi
60
+ permissions:
61
+ id-token: write # OIDC token for PyPI trusted publishing
62
+ steps:
63
+ - uses: actions/download-artifact@v8
64
+ with:
65
+ name: dist
66
+ path: dist/
67
+ - uses: pypa/gh-action-pypi-publish@release/v1
@@ -27,6 +27,9 @@ scratch/
27
27
  evals/prompt_ab/variants/
28
28
  evals/prompt_ab/runs/
29
29
 
30
+ # internal design doc — kept local, not published to the repo or the sdist
31
+ CORE-DESIGN.md
32
+
30
33
  # local sliceagent state / monitor runtime (personal; not part of the repo)
31
34
  .sliceagent/
32
35
  .memagent/ # legacy pre-rename state dir (ignore so an upgraded checkout stays clean)
@@ -44,10 +47,20 @@ runs/
44
47
  *.pdf
45
48
 
46
49
  # ── internal-only: untracked 2026-07-02 for the public launch (files stay on disk locally) ──
47
- # evals/ = internal benchmark harness + ~127 MB of captured tbench/job run artifacts (deb/lz4/pt/logs)
50
+ # evals/ contains ~127 MB of captured tbench/job artifacts. Keep those ignored, but version the small,
51
+ # receipt-grounded prompt experiment needed to reproduce the mind-model claim and its offline tests.
48
52
  # prototype/ = superseded ~250-line JS proof-of-concept (its own README: "not the production codebase")
49
53
  # docs/STEP3-PLAN.md, docs/MEMEM-DIAGNOSIS.md = internal R&D planning notes, not user docs
50
- evals/
54
+ evals/*
55
+ !evals/__init__.py
56
+ !evals/oldprompt_memory_model.txt
57
+ !evals/receipt_claims.py
58
+ !evals/receipt_prompt_ab.py
59
+ !evals/context_contract_eval.py
60
+ !evals/self_inspection_tool_eval.py
61
+ !evals/selfnarrative_ab.py
62
+ !evals/usersim.py
63
+ !evals/usersim_pty.py
51
64
  prototype/
52
65
  docs/STEP3-PLAN.md
53
66
  docs/MEMEM-DIAGNOSIS.md
@@ -55,8 +68,13 @@ docs/MEMEM-DIAGNOSIS.md
55
68
  # internal engineering roadmap (wave planning), not product docs — untracked 2026-07-02
56
69
  ROADMAP.md
57
70
 
58
- # all of docs/ is internal (architecture/spec/brand assets) not published; untracked 2026-07-02
59
- docs/
71
+ # Architecture specs below are part of the OSS design contract; other internal
72
+ # drafts and brand assets remain local by default.
73
+ docs/*
74
+ !docs/ENDGAME-CONTEXT-DESIGN.md
75
+ !docs/MEMORY-LAYERS-DESIGN.md
76
+ !docs/SUBAGENT-DESIGN.md
77
+ !docs/CONFIGURATION.md
60
78
 
61
79
  # ColBench raw HF dataset (huge; selected tasks are committed under evals/colbench/tasks/)
62
80
  evals/colbench/data/
@@ -5,6 +5,222 @@ this project aims for [Semantic Versioning](https://semver.org/).
5
5
 
6
6
  ## [Unreleased]
7
7
 
8
+ ## [0.3.0] — 2026-07-17
9
+
10
+ ### Added
11
+ - **Intent Fidelity v2.** One shared, ephemeral turn contract now separates user-authorized action spans
12
+ from quoted/reported prior output, grounds historical references in sealed responses, resolves numbered
13
+ items and launch-ordered subagents, and helps the model carry terse confirmations onto the immediately
14
+ pending proposal or explicitly selected numbered option. This intent metadata is advisory context, not a
15
+ second host-side permission system.
16
+ - **Safe update path.** `sliceagent update` now updates a positively identified canonical `uv tool`
17
+ install before any API-key, workspace, plugin, or MCP startup. Editable/direct installs are preserved,
18
+ alternative package managers receive exact guidance, and `/update` points active sessions to the safe
19
+ process boundary.
20
+ - **Seamless workspace handoff.** `/cwd <path>` and the model-facing `change_workspace` control tool now
21
+ stage and validate the target runtime, durably seal the current turn, and atomically replace only
22
+ workspace-owned resources. The terminal application, model client, token/cost counters, and connection stay
23
+ alive; target preparation failures roll back to the untouched current workspace.
24
+ - **Canonical execution receipts.** Every tool lifecycle now records requested, rejected-before-start,
25
+ physically started, settled, and effect-applied states under one invocation identity. Sealed receipts flow
26
+ into turns, recovered crashes, child-artifact references, terminal completion, and receipt-grounded recall;
27
+ large-task aggregates remain exact without replaying thousands of operation rows into the prompt.
28
+ - **Receipt-aware mind-model evaluation.** The paired old-autobiography/operating-contract harness now proves
29
+ the substituted system-prompt diff on one Git revision and workspace, retains full replies, rejects
30
+ screen-derived ground truth, and scores lifecycle claims, abstentions, corrections, and required coverage
31
+ directly against sealed receipts.
32
+
33
+ ### Changed
34
+ - **Subagents now return direct, ordered outcomes.** Every completed child contributes its full normalized
35
+ report to the parent as an ordinary tool result in launch order. The parent continues its normal loop and
36
+ owns synthesis; there is no synthetic fan-in packet, transcript reset, child-lifecycle mutation of Active
37
+ Work, or hidden terminal-delivery enforcement. Active Work is reserved for genuine cross-turn user
38
+ commitments rather than acting as a second scheduler.
39
+ - **Subagent persistence is optional and fail-soft.** Once a safe child report exists, artifact-store,
40
+ reference-publication, or memory-mirror failures are retained as warnings instead of discarding useful
41
+ evidence or making the child indeterminate. Truly unresolved execution remains indeterminate; optional
42
+ artifacts remain durable locators, not a prerequisite for parent delivery.
43
+ - **Subagent progress uses truthful readiness language.** The live matrix distinguishes running, queued,
44
+ failed, completed-without-report, and report-ready children without describing a report as sealed merely
45
+ because it is ready for the parent. “Partial report” is reserved for actually partial report bytes;
46
+ operationally incomplete work and persistence status stay separate from report completeness.
47
+ - **One typed memory model, with Memem as retrieval rather than authority.** L0 remains canonical sealed
48
+ evidence, L1 remains rebuildable Active Work, and native SQLite owns provenance-linked USER/PROJECT/CRAFT
49
+ L2 records. Memem 2.10's structured external-index protocol is the primary semantic ranker when available:
50
+ stable IDs, hard scope partitions, one primary abstraction, and bounded cue anchors are always resolved back
51
+ through SliceAgent's lifecycle, revision, sensitivity, and provenance predicates. Resolved or revision-drifted
52
+ project diagnostics stay explicit-pull instead of being re-injected as current bugs; a whole-query native
53
+ fallback preserves availability without co-ranking historical full-body noise.
54
+ - **Autonomous admission kernel.** General permission modes, host-side turn-authority denials,
55
+ reconciliation locks, and loop-policy refusals are retired. Ordinary requested work now flows directly;
56
+ the host retains only a narrow, high-confidence safeguard for commands that could catastrophically damage
57
+ the machine (such as formatting a device or recursively deleting `/` or the user's home).
58
+ - **Calmer, informative Rich TUI.** The footer no longer pins task text; it restores total-token and
59
+ dollar-savings meters. The live reasoning/progress row also shows only current activity (or the active plan
60
+ step), never the task's first prompt. Assistant replies have more breathing room, and the composer drops its
61
+ redundant title. Combined greetings such as “hi how are you” stay on the cheap chitchat path instead of
62
+ becoming a durable task title.
63
+ - **Natural workspace intent.** “Go/open/work in the hunter workspace” now navigates without requiring
64
+ implementation-shaped wording. Safe fallback path probes remain observational, and an assistant's exact
65
+ workspace-path clarification carries naturally into a terse confirmation such as “yes.”
66
+ - **Elastic observation flow.** Pipelines and fallback branches composed entirely of read-only commands
67
+ (for example `find … | sort` and `ls … 2>/dev/null || ls …`) remain ordinary inspection. A failed operation
68
+ does not poison unrelated reads, and terminal messages report the actual failed action without internal
69
+ policy jargon.
70
+ - **Capability-shaped intent grounding.** Effects are understood by governing action, concrete target, and
71
+ command family rather than by tool name or stray keywords. Coordinated directives retain each capability;
72
+ quoted filenames, exact commands, dotfiles, file sets, requirements, VCS/package operations, and adjacent
73
+ “go” or “continue” confirmations remain grounded without turning intent recognition into authorization.
74
+ - **Typed evidence selection.** One `EvidenceQuery` now owns execution-recall family, predicate, and scope.
75
+ Receipt projections distinguish exact aggregates from failure details and latest-turn from task-wide recall,
76
+ while the slice remains elastic for active complexity and history-bounded with respect to transcript age.
77
+ - **Plugin execution-admission APIs are intentionally retired.** Plugins continue to register tools, skills,
78
+ and MCP servers, but the old `register_hook` / `intent_effect` permission surfaces and hook-bearing
79
+ `load_plugins` tuple are removed with the policy-gate machinery. This is a deliberate pre-1.0 API break;
80
+ ordinary advisory behavior belongs in tool results or skills, not hidden host-side action gates.
81
+
82
+ ### Fixed
83
+ - **Delegated results can no longer disappear behind a synthetic delivery gate.** Successful child reports
84
+ reach the next parent model call in full and in order, so a stale deliverable contract, revision mismatch,
85
+ or missing heading cannot replace the requested final answer with a host-authored interruption. The model
86
+ remains responsible for synthesizing and delivering the user-visible result.
87
+ - **Useful child reports survive optional publication failures.** A completed, normalized report is returned
88
+ directly even when its artifact, reference, or memory mirror cannot be written. Those failures remain
89
+ visible as persistence warnings; they no longer erase child evidence or turn a known report into an
90
+ indeterminate execution outcome.
91
+ - **Child reports are not silently lost at lifecycle edges.** A mixed indeterminate batch gets one
92
+ synthesis-only closeout over settled siblings before the turn parks; deadline-grace completion retains the
93
+ full direct report without requiring an artifact; context overflow parks instead of evicting an unseen
94
+ report; and crash recovery advertises the exact interrupted-turn artifact for one resumed seed.
95
+ - **Broad subagent reviews no longer collapse into timeout cascades.** Repository audits use ignore-aware,
96
+ source-weighted scopes and staged 2–3-child waves instead of one exhaustive child per directory. Every child
97
+ drains and assembles SSE off the main thread even without a UI sink, so an ordinary long reasoning response
98
+ is not mistaken for 60 seconds of transport silence. The completion-budget-aware monotonic watchdog remains
99
+ configurable with `LLM_HARD_TIMEOUT_SEC`; provider SDK retries stay disabled and the model runner is the one
100
+ visible retry owner. A process-wide physical-call lease now bounds live requests per provider account,
101
+ including sockets whose logical watchdog already returned, while pre-admission cancellation cannot start a
102
+ late request and capacity wait shares the same absolute deadline as execution.
103
+ - **Canonical installs can actually self-update.** The updater now recognizes the standard
104
+ `python = "3.12"` field emitted by current `uv tool` receipts while continuing to reject custom
105
+ requirements, resolver settings, and non-public package sources. Trusted executable discovery rejects
106
+ repository and arbitrary-PATH shims while correctly following Homebrew/Nix-style manager-owned symlink
107
+ chains; a receipt-provided bin can no longer redirect execution to an unrelated external target.
108
+ - **Native Windows paths keep one identity across the runtime.** Model-facing mention handles stay
109
+ slash-normalized, physical workspace evidence retains its native invocation spelling, and workspace
110
+ transitions compare case-insensitive canonical identities without changing display paths. Git-Bash live
111
+ composition reuses the application-selected terminal I/O, while POSIX-only PTY eval support is loaded only
112
+ when a live eval actually runs.
113
+ - **Concurrent evidence appends are serialized on Windows too.** The JSONL `FileLock` now uses a
114
+ canonical-path-keyed Windows kernel mutex with abandoned-owner recovery, matching the existing POSIX `flock`
115
+ guarantee instead of allowing independently opened append handles to overwrite records.
116
+ - **Private state modes do not leak into shared skills.** Personal vault/config/default-skill files remain
117
+ owner-only, while an explicitly selected project/shared skill directory creates collaborator-readable
118
+ `SKILL.md` files and preserves an existing file mode across atomic rewrites.
119
+ - **Workspace switches preserve the live collaboration state.** One application session identity now spans
120
+ in-process workspace handoffs; conversation, standing user intent, proposals, and every open topic survive
121
+ A→B→A, while file residency, observed facts, revisions, receipt snapshots, and old artifact handles are
122
+ restored only from the selected workspace. Handoff publication stages fallible derived objects first, and
123
+ teardown/logging failures can no longer falsify a switch that already committed.
124
+ - **Durable evidence has an unambiguous order and explicit gaps.** A crash-durable monotonic turn order is
125
+ shared by journals, artifacts, and checkpoints (including recovery and idempotent retries); legacy
126
+ same-second ties expand as partial evidence instead of task-ID guessing. Corrupt immutable records now
127
+ propagate bounded gap metadata into execution/quality coverage and the artifact index rather than silently
128
+ producing exact counts over survivors.
129
+ - **Intent continuity no longer drifts across attribution or redaction.** A user who adopts wording from an
130
+ assistant recommendation retains a live imperative; quoted/fenced proposal examples cannot authorize a
131
+ later “yes”; nested numbered details cannot steal top-level ordinals; and persistence-only secret masks
132
+ preserve source offsets so exact user clauses still point to the same words after recovery.
133
+ - **User-reported failures close only on real proof.** Stale tool errors clear only after the exact failed call
134
+ succeeds. Test/build reports clear only after an explicit file-tool edit followed by a status-propagating
135
+ shell command whose test/lint/type/build family matches the report; sequential families accumulate only
136
+ until the next edit. Help, list, collect, dry-run, skip, or exit-zero modes do not count, and source text
137
+ inside `execute_code` is never treated as a mutation or verification receipt.
138
+ Neutral lifecycle cancellations remain visible as “not run” without becoming blockers, evidence, warning
139
+ completions, or policy errors; catastrophic safety refusals remain explicit and adverse.
140
+ - **Child budgets remain hard batch ceilings.** Delegated token reservations now carry across scheduler waves,
141
+ so interleaved effects or serialized writable children cannot each receive the parent's full remaining cap;
142
+ children rejected before physical start no longer dilute a valid sibling's reservation.
143
+ - **Subagent fan-out now degrades gracefully under provider pressure.** A wave admits at most four child model
144
+ loops, launches the first pair immediately, and ramps later starts instead of creating a synchronized provider
145
+ burst. Explorers default to at most six fast evidence-navigation steps followed by one full, tool-free
146
+ synthesis. Clean navigation or planned navigation-budget exhaustion may hand off only typed workspace
147
+ evidence; the latter carries an explicit incomplete-coverage note. The fast navigator suppresses the generic
148
+ max-step closeout, avoiding a redundant billed call, while cancellation, uncertainty, fatal provider/tool
149
+ stops, token exhaustion, truncation, and evidence-free runs never synthesize. The live matrix is driven by typed
150
+ queued/starting/model-active/reasoning/writing/tool/
151
+ retry/terminal phases rather than detail-string inference. Exhausted attempts, truncated output,
152
+ cancellation, or a final-synthesis failure start no wrapper-level recovery call. Usable partial report text,
153
+ observations, trace, and usage return directly as an explicitly partial outcome; optional artifact
154
+ persistence does not create an Active Work dependency or gate delivery. Cancellation still wakes retry
155
+ backoff and prevents a late outcome from publishing into a replacement task.
156
+ - **Hung read deadlines stay live.** Timeout-enabled pure reads use bounded daemon workers and a short grace
157
+ period; unresolved readers become typed indeterminate outcomes, later barriers are cancelled, Ctrl-C remains
158
+ responsive, and a permanently stuck reader no longer freezes the turn or process exit.
159
+ - **Read scheduling keeps truthful lifecycle boundaries.** Lifecycle children no longer disable adjacent read
160
+ deadlines; exhausted daemon capacity settles as a typed not-started cancellation; late indeterminate results
161
+ still close later effects; and a start journal crossing a deadline cannot enter its handler or route a late
162
+ lifecycle edge into a newer turn/workspace.
163
+ - **Registry outcomes stay typed at every edge.** Preflight-cancelled calls bypass execution-only effect
164
+ factories, availability is admitted exactly once before the durable start boundary, direct validation
165
+ failures never construct execution effects, and registry replacement cannot mix an admitted handler with a
166
+ stale effect factory. Invalid explicit statuses become indeterminate instead of successful, and byte or
167
+ unrenderable extension results remain inside the canonical outcome path.
168
+ - **Streaming deadlines cannot leak output into a later turn.** On platforms without a synchronous SIGALRM
169
+ lease, both Chat Completions and Responses interactive paths use the blocking daemon watchdog rather than
170
+ abandoning an SSE worker that could continue emitting deltas after timeout.
171
+ - **Plugin/MCP extension startup is transactional and bounded.** Plugin packages support relative imports and
172
+ fully roll back registry, skill, MCP, and module state on failure. MCP timeouts cancel discarded workers,
173
+ malformed configuration/descriptors are contained before spawn, and remote tool names cannot control
174
+ page-out paths or labels.
175
+ - **The catastrophic floor survives extension failure and common shell spelling.** A crashing/no-op earlier
176
+ preflight hook cannot skip the later machine-safety check, and high-confidence POSIX escaped executable names
177
+ or quoted raw-device assignments are recognized without treating escaped literal home/glob operands as wipes.
178
+ - **Varying re-inspection loops get an advisory recovery cue.** Eight distinct observation calls returning the
179
+ same meaningful result add one model-only nudge to synthesize, act, or ask. It never rejects a tool or emits a
180
+ user-facing policy error.
181
+
182
+ ## [0.2.0] — 2026-07-10
183
+
184
+ A typed re-architecture of the core around a single canonical design (elastic slice, execution kernel,
185
+ crash-safe persistence), plus a rebuilt Rich TUI. No change to the thesis — same history-bounded,
186
+ task-elastic slice — but the invariants are now enforced by typed subsystems rather than convention.
187
+
188
+ ### Added
189
+ - **Typed core kernel.** The active slice is split into typed semantic regions (intent, task, evidence,
190
+ working set, continuity, turn runtime), each owning its own seal/reset lifecycle, replacing the flat
191
+ field-classification table. A provenance-tagged **intent ledger** captures verbatim user directives with
192
+ their source handles, deterministically promotes explicit constraint language (`must`/`never`/`only`),
193
+ and records supersession/satisfaction as explicit transitions.
194
+ - **Execution kernel.** Structured tool outcomes (succeeded/failed/cancelled/**indeterminate**), ordered
195
+ read/write waves (pure reads parallel, effects as barriers), reconciliation gates that block dependent
196
+ actions after an unprovable outcome, and one capacity-preflighted model-call path.
197
+ - **Crash-safe persistence.** A pending-journal → immutable-artifact → checkpoint compare-and-swap commit
198
+ order with idempotent replay, a full error taxonomy, and an OS-backed workspace lease, so an interrupted
199
+ turn resumes without re-running side effects. Dependency-scoped workspace revisions stale only the claims
200
+ whose inputs actually changed.
201
+ - **Rebuilt TUI.** A single `TurnProgress` event reducer folds loop events into an immutable snapshot;
202
+ the renderer projects that snapshot (semantic tool buckets, bounded plan/tally, width-responsive
203
+ diagnostics, one live-status owner) instead of interpreting events independently.
204
+
205
+ ### Changed
206
+ - Elastic residency is centralized: a pressure controller chooses graded fidelity globally
207
+ (full → excerpt → digest → locator) so no region can consume the window unnoticed.
208
+ - Per-turn cost framing corrected throughout the docs to **history-bounded, task-elastic** — bounded with
209
+ respect to session length, not a fixed size regardless of task breadth.
210
+
211
+ ### Fixed
212
+ - **Intent ledger and progress signals no longer lost on resume.** Checkpoint state is deep-frozen on
213
+ write; the resume and crash-recovery paths now thaw it fully at the boundary (and the deserializers
214
+ accept any `Mapping`), so binding user directives and their provenance survive a restart instead of
215
+ being silently dropped.
216
+ - **A completed first-turn objective no longer stays pinned as a mandatory, un-pageable block** — a clean
217
+ turn with no unresolved state marks it pageable background; unresolved state or explicit continuation
218
+ keeps it active.
219
+ - Security/reliability hardening from external review: WAL/recovery redacts tool-call arguments; process
220
+ kill reaps the whole spawn-captured process group; `code_review` and the read-only git policy refuse
221
+ external-diff/textconv and config injection; subagent children charge their tokens to the parent budget,
222
+ stay isolated from the parent's private state, and write durable state 0600/0700.
223
+
8
224
  ## [0.1.18] — 2026-07-09
9
225
 
10
226
  ### Added
@@ -6,7 +6,7 @@ This product includes code ported from, and architecture reimplemented after, th
6
6
  open-source projects below. We are grateful to their authors.
7
7
 
8
8
  ────────────────────────────────────────────────────────────────────────────
9
- Hermes — https://github.com/NousResearch/hermes (MIT License)
9
+ Hermes Agent — https://github.com/NousResearch/hermes-agent (MIT License)
10
10
  Copyright (c) 2025 Nous Research
11
11
 
12
12
  Verbatim / closely-ported source:
@@ -28,7 +28,7 @@ Kimi-Code — https://github.com/MoonshotAI/kimi-code (Moonshot AI)
28
28
  ARCHITECTURE AND PATTERNS reimplemented in Python (no source copied — ideas,
29
29
  not code):
30
30
  access.py + scheduler.py (resource-access model for safe tool parallelism),
31
- policy.py (permission chain), config.py (layered config), clock.py, cron.py,
31
+ config.py (layered config), clock.py, cron.py,
32
32
  flags.py, model_catalog.py, mcp_client.py (the mcp__server__tool namespacing),
33
33
  loop.py (micro-compaction), tui.py (selector menus + footer/streaming),
34
34
  code_grep.py (ripgrep pagination), agents.py (named-agent registry).