sliceagent 0.2.0__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 (373) hide show
  1. {sliceagent-0.2.0 → sliceagent-0.3.0}/.env.example +11 -5
  2. sliceagent-0.3.0/.github/workflows/publish.yml +67 -0
  3. {sliceagent-0.2.0 → sliceagent-0.3.0}/.gitignore +19 -4
  4. {sliceagent-0.2.0 → sliceagent-0.3.0}/CHANGELOG.md +174 -0
  5. {sliceagent-0.2.0 → sliceagent-0.3.0}/NOTICE +2 -2
  6. {sliceagent-0.2.0 → sliceagent-0.3.0}/PKG-INFO +101 -34
  7. {sliceagent-0.2.0 → sliceagent-0.3.0}/QUICKSTART.md +26 -6
  8. {sliceagent-0.2.0 → sliceagent-0.3.0}/README.md +96 -30
  9. sliceagent-0.3.0/SECURITY.md +43 -0
  10. sliceagent-0.3.0/benchmarks/provider_concurrency_probe.py +134 -0
  11. {sliceagent-0.2.0 → sliceagent-0.3.0}/benchmarks/subagent_fanout.py +4 -8
  12. sliceagent-0.3.0/docs/CONFIGURATION.md +94 -0
  13. sliceagent-0.3.0/docs/ENDGAME-CONTEXT-DESIGN.md +248 -0
  14. sliceagent-0.3.0/docs/MEMORY-LAYERS-DESIGN.md +325 -0
  15. sliceagent-0.3.0/docs/SUBAGENT-DESIGN.md +250 -0
  16. sliceagent-0.3.0/evals/__init__.py +2 -0
  17. sliceagent-0.3.0/evals/context_contract_eval.py +282 -0
  18. sliceagent-0.3.0/evals/oldprompt_memory_model.txt +11 -0
  19. sliceagent-0.3.0/evals/receipt_claims.py +617 -0
  20. sliceagent-0.3.0/evals/receipt_prompt_ab.py +469 -0
  21. sliceagent-0.3.0/evals/self_inspection_tool_eval.py +633 -0
  22. sliceagent-0.3.0/evals/selfnarrative_ab.py +863 -0
  23. sliceagent-0.3.0/evals/usersim.py +298 -0
  24. sliceagent-0.3.0/evals/usersim_pty.py +303 -0
  25. {sliceagent-0.2.0 → sliceagent-0.3.0}/install.ps1 +70 -8
  26. {sliceagent-0.2.0 → sliceagent-0.3.0}/install.sh +27 -3
  27. {sliceagent-0.2.0 → sliceagent-0.3.0}/pyproject.toml +11 -9
  28. {sliceagent-0.2.0 → sliceagent-0.3.0}/sliceagent.toml.example +5 -6
  29. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/__init__.py +1 -1
  30. sliceagent-0.3.0/src/sliceagent/active_work.py +1087 -0
  31. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/agents.py +25 -9
  32. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/background_review.py +36 -22
  33. sliceagent-0.3.0/src/sliceagent/cli.py +2656 -0
  34. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/code_grep.py +55 -63
  35. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/config.py +22 -18
  36. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/context.py +81 -15
  37. sliceagent-0.3.0/src/sliceagent/context_compiler.py +355 -0
  38. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/context_overflow.py +24 -5
  39. sliceagent-0.3.0/src/sliceagent/contextfs.py +1657 -0
  40. sliceagent-0.3.0/src/sliceagent/deliverables.py +134 -0
  41. sliceagent-0.3.0/src/sliceagent/discourse.py +2129 -0
  42. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/envspec.py +32 -14
  43. sliceagent-0.3.0/src/sliceagent/errors.py +286 -0
  44. sliceagent-0.3.0/src/sliceagent/event_ledger.py +438 -0
  45. sliceagent-0.3.0/src/sliceagent/events.py +341 -0
  46. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/execution.py +46 -96
  47. sliceagent-0.3.0/src/sliceagent/fan_in.py +585 -0
  48. sliceagent-0.3.0/src/sliceagent/guidance.py +28 -0
  49. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/hippocampus.py +278 -118
  50. sliceagent-0.3.0/src/sliceagent/hooks.py +406 -0
  51. sliceagent-0.3.0/src/sliceagent/identity.py +176 -0
  52. sliceagent-0.3.0/src/sliceagent/intent.py +2795 -0
  53. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/interfaces.py +49 -7
  54. sliceagent-0.3.0/src/sliceagent/knowledge.py +1444 -0
  55. sliceagent-0.3.0/src/sliceagent/knowledge_index.py +438 -0
  56. sliceagent-0.3.0/src/sliceagent/llm.py +2098 -0
  57. sliceagent-0.3.0/src/sliceagent/loop.py +1722 -0
  58. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/mcp_client.py +107 -26
  59. sliceagent-0.3.0/src/sliceagent/memory.py +1452 -0
  60. sliceagent-0.3.0/src/sliceagent/mentions.py +126 -0
  61. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/model_catalog.py +11 -3
  62. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/model_runner.py +19 -5
  63. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/monitor.py +25 -10
  64. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/neocortex.py +34 -40
  65. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/onboarding.py +20 -25
  66. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/oracle.py +3 -2
  67. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/pagetable.py +46 -32
  68. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/persistence.py +182 -20
  69. sliceagent-0.3.0/src/sliceagent/pfc.py +468 -0
  70. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/platform_compat.py +74 -11
  71. sliceagent-0.3.0/src/sliceagent/plugins.py +216 -0
  72. sliceagent-0.3.0/src/sliceagent/private_state.py +118 -0
  73. sliceagent-0.3.0/src/sliceagent/progress.py +1169 -0
  74. sliceagent-0.3.0/src/sliceagent/prompt.py +304 -0
  75. sliceagent-0.3.0/src/sliceagent/reach.py +163 -0
  76. sliceagent-0.3.0/src/sliceagent/receipts.py +759 -0
  77. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/records.py +11 -4
  78. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/recovery.py +10 -4
  79. sliceagent-0.3.0/src/sliceagent/regions.py +1855 -0
  80. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/registry.py +126 -31
  81. sliceagent-0.3.0/src/sliceagent/runtime_persistence.py +1708 -0
  82. sliceagent-0.3.0/src/sliceagent/safeguards.py +871 -0
  83. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/safety.py +76 -18
  84. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/sandbox.py +12 -3
  85. sliceagent-0.3.0/src/sliceagent/scheduler.py +901 -0
  86. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/search_index.py +29 -15
  87. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/seed.py +141 -50
  88. sliceagent-0.3.0/src/sliceagent/session.py +525 -0
  89. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/skill_usage.py +10 -1
  90. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/skills.py +29 -2
  91. sliceagent-0.3.0/src/sliceagent/slash.py +37 -0
  92. sliceagent-0.3.0/src/sliceagent/slice_reducer.py +673 -0
  93. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/slice_state.py +69 -1
  94. sliceagent-0.3.0/src/sliceagent/subagent.py +2770 -0
  95. sliceagent-0.3.0/src/sliceagent/subagent_contract.py +1110 -0
  96. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/taskstate.py +13 -1
  97. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/telemetry.py +17 -6
  98. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/terminal.py +12 -5
  99. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/text_utils.py +3 -1
  100. sliceagent-0.3.0/src/sliceagent/tool_identity.py +24 -0
  101. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/tools.py +510 -87
  102. sliceagent-0.3.0/src/sliceagent/tui.py +3109 -0
  103. sliceagent-0.3.0/src/sliceagent/tui_projection.py +329 -0
  104. sliceagent-0.3.0/src/sliceagent/updater.py +368 -0
  105. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/web.py +11 -4
  106. sliceagent-0.3.0/src/sliceagent/workspace_context.py +416 -0
  107. sliceagent-0.3.0/src/sliceagent/workspace_handoff.py +39 -0
  108. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_active_focus.py +20 -0
  109. sliceagent-0.3.0/tests/test_active_work.py +542 -0
  110. sliceagent-0.3.0/tests/test_active_work_persistence.py +47 -0
  111. sliceagent-0.3.0/tests/test_admission_retirement.py +262 -0
  112. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_agents.py +20 -9
  113. sliceagent-0.3.0/tests/test_artifact_federation.py +79 -0
  114. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_ask_echo.py +1 -14
  115. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_ask_user.py +1 -59
  116. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_background_review.py +24 -0
  117. sliceagent-0.3.0/tests/test_block_rendering.py +148 -0
  118. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_bugfix_2b.py +8 -8
  119. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_bugfix_current_request.py +7 -5
  120. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_bugfix_memory_wave.py +41 -0
  121. sliceagent-0.3.0/tests/test_bugfix_p0c.py +230 -0
  122. sliceagent-0.3.0/tests/test_bugfix_selfreview_siblings.py +55 -0
  123. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_bugfix_subagent_wave.py +3 -3
  124. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_bugfix_tools_wave.py +10 -10
  125. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_bughunt_fixes.py +144 -174
  126. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_cache_manifest.py +13 -7
  127. sliceagent-0.3.0/tests/test_catastrophic_safeguard.py +287 -0
  128. sliceagent-0.3.0/tests/test_cli_smoke.py +329 -0
  129. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_code_grep.py +73 -41
  130. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_config_journey.py +34 -13
  131. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_consolidate.py +24 -3
  132. sliceagent-0.3.0/tests/test_context_compiler.py +251 -0
  133. sliceagent-0.3.0/tests/test_context_contract_eval.py +120 -0
  134. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_context_elasticity.py +37 -6
  135. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_context_overflow.py +13 -0
  136. sliceagent-0.3.0/tests/test_contextfs.py +592 -0
  137. sliceagent-0.3.0/tests/test_deepseek_v4.py +213 -0
  138. sliceagent-0.3.0/tests/test_dependency_first_seed.py +77 -0
  139. sliceagent-0.3.0/tests/test_discourse.py +820 -0
  140. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_episode.py +29 -1
  141. sliceagent-0.3.0/tests/test_errors_backoff.py +281 -0
  142. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_esc_sentinel.py +18 -14
  143. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_event_dispatch.py +17 -0
  144. sliceagent-0.3.0/tests/test_event_ledger.py +273 -0
  145. sliceagent-0.3.0/tests/test_execution_kernel.py +2540 -0
  146. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_extreview_fixes.py +0 -17
  147. sliceagent-0.3.0/tests/test_fan_in.py +308 -0
  148. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_file_lock.py +2 -2
  149. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_guidance.py +3 -32
  150. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_history.py +57 -0
  151. sliceagent-0.3.0/tests/test_identity.py +64 -0
  152. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_intent_state.py +65 -5
  153. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_invariant_fixes.py +2 -61
  154. sliceagent-0.3.0/tests/test_knowledge.py +957 -0
  155. sliceagent-0.3.0/tests/test_live_composer.py +1047 -0
  156. sliceagent-0.3.0/tests/test_llm_streaming.py +1364 -0
  157. sliceagent-0.3.0/tests/test_llm_watchdog.py +486 -0
  158. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_loop_overflow.py +136 -30
  159. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_mcp_output_cap.py +38 -5
  160. sliceagent-0.3.0/tests/test_mcp_runtime.py +220 -0
  161. sliceagent-0.3.0/tests/test_memem_knowledge_index.py +196 -0
  162. sliceagent-0.3.0/tests/test_mind_model_demo_replay.py +489 -0
  163. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_model_call_observability.py +59 -1
  164. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_monitor.py +42 -0
  165. sliceagent-0.3.0/tests/test_observation_repeat_advisory.py +149 -0
  166. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_onboarding.py +7 -2
  167. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_pinned_composer.py +35 -2
  168. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_product_features.py +33 -32
  169. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_progress_status.py +46 -2
  170. sliceagent-0.3.0/tests/test_projection_truth.py +788 -0
  171. sliceagent-0.3.0/tests/test_prompt_kernel.py +105 -0
  172. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_provenance.py +23 -0
  173. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_proxy_interrupt.py +41 -1
  174. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_reach.py +12 -3
  175. sliceagent-0.3.0/tests/test_reachset.py +35 -0
  176. sliceagent-0.3.0/tests/test_readonly_subagent.py +516 -0
  177. sliceagent-0.3.0/tests/test_receipt_context.py +273 -0
  178. sliceagent-0.3.0/tests/test_receipt_elasticity.py +291 -0
  179. sliceagent-0.3.0/tests/test_receipt_eval.py +790 -0
  180. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_records.py +44 -2
  181. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_reliability.py +224 -73
  182. sliceagent-0.3.0/tests/test_review_deliverable.py +280 -0
  183. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_runtime_boundaries.py +2 -2
  184. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_runtime_persistence.py +682 -1
  185. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_safety.py +28 -0
  186. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_search_index.py +40 -0
  187. sliceagent-0.3.0/tests/test_self_inspection_tool_eval.py +425 -0
  188. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_selfreview_fixes.py +9 -29
  189. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_slice_lifecycle.py +21 -2
  190. sliceagent-0.3.0/tests/test_slice_reducer.py +217 -0
  191. sliceagent-0.3.0/tests/test_steered_status.py +183 -0
  192. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_subagent_artifacts.py +66 -23
  193. sliceagent-0.3.0/tests/test_subagent_contract.py +2362 -0
  194. sliceagent-0.3.0/tests/test_subagent_matrix_truth.py +389 -0
  195. sliceagent-0.3.0/tests/test_subagent_orchestration.py +808 -0
  196. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_subagent_review_fixes.py +1 -1
  197. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_subagent_roster.py +90 -45
  198. sliceagent-0.3.0/tests/test_subagent_steering.py +355 -0
  199. sliceagent-0.3.0/tests/test_subagent_work_binding.py +169 -0
  200. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_telemetry_convergence.py +15 -0
  201. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_tool_dedup.py +2 -3
  202. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_tools_robust.py +6 -5
  203. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_topic_switch.py +14 -17
  204. sliceagent-0.3.0/tests/test_trajectory.py +124 -0
  205. sliceagent-0.3.0/tests/test_tui.py +496 -0
  206. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_tui_menus.py +2 -2
  207. sliceagent-0.3.0/tests/test_tui_render.py +428 -0
  208. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_tui_widgets.py +20 -5
  209. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_turn_budget.py +6 -38
  210. sliceagent-0.3.0/tests/test_turn_contract.py +470 -0
  211. sliceagent-0.3.0/tests/test_turn_progress.py +681 -0
  212. sliceagent-0.3.0/tests/test_turn_receipts.py +379 -0
  213. sliceagent-0.3.0/tests/test_update_work.py +201 -0
  214. sliceagent-0.3.0/tests/test_updater.py +401 -0
  215. sliceagent-0.3.0/tests/test_wave_commitments.py +224 -0
  216. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_web.py +37 -0
  217. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_windows_footguns.py +16 -0
  218. sliceagent-0.3.0/tests/test_workspace_context.py +201 -0
  219. sliceagent-0.3.0/tests/test_workspace_switch.py +1257 -0
  220. sliceagent-0.3.0/uv.lock +1489 -0
  221. sliceagent-0.2.0/.github/workflows/publish.yml +0 -36
  222. sliceagent-0.2.0/SECURITY.md +0 -37
  223. sliceagent-0.2.0/src/sliceagent/cli.py +0 -1293
  224. sliceagent-0.2.0/src/sliceagent/errors.py +0 -169
  225. sliceagent-0.2.0/src/sliceagent/events.py +0 -163
  226. sliceagent-0.2.0/src/sliceagent/guardrails.py +0 -438
  227. sliceagent-0.2.0/src/sliceagent/guidance.py +0 -69
  228. sliceagent-0.2.0/src/sliceagent/hooks.py +0 -455
  229. sliceagent-0.2.0/src/sliceagent/intent.py +0 -724
  230. sliceagent-0.2.0/src/sliceagent/llm.py +0 -768
  231. sliceagent-0.2.0/src/sliceagent/loop.py +0 -995
  232. sliceagent-0.2.0/src/sliceagent/memory.py +0 -480
  233. sliceagent-0.2.0/src/sliceagent/pfc.py +0 -446
  234. sliceagent-0.2.0/src/sliceagent/plugins.py +0 -127
  235. sliceagent-0.2.0/src/sliceagent/policy.py +0 -268
  236. sliceagent-0.2.0/src/sliceagent/progress.py +0 -464
  237. sliceagent-0.2.0/src/sliceagent/prompt.py +0 -280
  238. sliceagent-0.2.0/src/sliceagent/regions.py +0 -934
  239. sliceagent-0.2.0/src/sliceagent/runtime_persistence.py +0 -583
  240. sliceagent-0.2.0/src/sliceagent/scheduler.py +0 -200
  241. sliceagent-0.2.0/src/sliceagent/session.py +0 -271
  242. sliceagent-0.2.0/src/sliceagent/subagent.py +0 -882
  243. sliceagent-0.2.0/src/sliceagent/subagent_contract.py +0 -407
  244. sliceagent-0.2.0/src/sliceagent/tui.py +0 -1790
  245. sliceagent-0.2.0/tests/test_bugfix_p0c.py +0 -85
  246. sliceagent-0.2.0/tests/test_bugfix_selfreview_siblings.py +0 -83
  247. sliceagent-0.2.0/tests/test_cli_smoke.py +0 -162
  248. sliceagent-0.2.0/tests/test_errors_backoff.py +0 -107
  249. sliceagent-0.2.0/tests/test_execution_kernel.py +0 -937
  250. sliceagent-0.2.0/tests/test_guardrails.py +0 -283
  251. sliceagent-0.2.0/tests/test_live_composer.py +0 -194
  252. sliceagent-0.2.0/tests/test_llm_streaming.py +0 -320
  253. sliceagent-0.2.0/tests/test_llm_watchdog.py +0 -99
  254. sliceagent-0.2.0/tests/test_mcp_runtime.py +0 -102
  255. sliceagent-0.2.0/tests/test_permission_patterns.py +0 -78
  256. sliceagent-0.2.0/tests/test_readonly_subagent.py +0 -287
  257. sliceagent-0.2.0/tests/test_subagent_contract.py +0 -488
  258. sliceagent-0.2.0/tests/test_trajectory.py +0 -287
  259. sliceagent-0.2.0/tests/test_tui.py +0 -225
  260. sliceagent-0.2.0/tests/test_tui_render.py +0 -172
  261. sliceagent-0.2.0/tests/test_turn_progress.py +0 -270
  262. {sliceagent-0.2.0 → sliceagent-0.3.0}/.dockerignore +0 -0
  263. {sliceagent-0.2.0 → sliceagent-0.3.0}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
  264. {sliceagent-0.2.0 → sliceagent-0.3.0}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
  265. {sliceagent-0.2.0 → sliceagent-0.3.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  266. {sliceagent-0.2.0 → sliceagent-0.3.0}/.github/dependabot.yml +0 -0
  267. {sliceagent-0.2.0 → sliceagent-0.3.0}/.github/workflows/ci.yml +0 -0
  268. {sliceagent-0.2.0 → sliceagent-0.3.0}/CODE_OF_CONDUCT.md +0 -0
  269. {sliceagent-0.2.0 → sliceagent-0.3.0}/CONTRIBUTING.md +0 -0
  270. {sliceagent-0.2.0 → sliceagent-0.3.0}/Dockerfile +0 -0
  271. {sliceagent-0.2.0 → sliceagent-0.3.0}/LICENSE +0 -0
  272. {sliceagent-0.2.0 → sliceagent-0.3.0}/assets/sliceagent-core-loop.gif +0 -0
  273. {sliceagent-0.2.0 → sliceagent-0.3.0}/benchmarks/README.md +0 -0
  274. {sliceagent-0.2.0 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s1_longhorizon_debug/meta.json +0 -0
  275. {sliceagent-0.2.0 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s1_longhorizon_debug/prompts.json +0 -0
  276. {sliceagent-0.2.0 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s1_longhorizon_debug/reference_fix.py +0 -0
  277. {sliceagent-0.2.0 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s1_longhorizon_debug/setup.py +0 -0
  278. {sliceagent-0.2.0 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s1_longhorizon_debug/verify.py +0 -0
  279. {sliceagent-0.2.0 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s2_taskdag_scheduler/meta.json +0 -0
  280. {sliceagent-0.2.0 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s2_taskdag_scheduler/prompts.json +0 -0
  281. {sliceagent-0.2.0 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s2_taskdag_scheduler/reference_fix.py +0 -0
  282. {sliceagent-0.2.0 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s2_taskdag_scheduler/setup.py +0 -0
  283. {sliceagent-0.2.0 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s2_taskdag_scheduler/verify.py +0 -0
  284. {sliceagent-0.2.0 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s3_intervalset_algebra/meta.json +0 -0
  285. {sliceagent-0.2.0 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s3_intervalset_algebra/prompts.json +0 -0
  286. {sliceagent-0.2.0 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s3_intervalset_algebra/reference_fix.py +0 -0
  287. {sliceagent-0.2.0 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s3_intervalset_algebra/setup.py +0 -0
  288. {sliceagent-0.2.0 → sliceagent-0.3.0}/benchmarks/multiturn_coding/s3_intervalset_algebra/verify.py +0 -0
  289. {sliceagent-0.2.0 → sliceagent-0.3.0}/benchmarks/run.py +0 -0
  290. {sliceagent-0.2.0 → sliceagent-0.3.0}/examples/plugins/hello/__init__.py +0 -0
  291. {sliceagent-0.2.0 → sliceagent-0.3.0}/examples/plugins/hello/plugin.toml +0 -0
  292. {sliceagent-0.2.0 → sliceagent-0.3.0}/scripts/check_windows_footguns.py +0 -0
  293. {sliceagent-0.2.0 → sliceagent-0.3.0}/scripts/gen_config_reference.py +0 -0
  294. {sliceagent-0.2.0 → sliceagent-0.3.0}/scripts/run_tests.sh +0 -0
  295. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/__main__.py +0 -0
  296. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/access.py +0 -0
  297. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/binsniff.py +0 -0
  298. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/clock.py +0 -0
  299. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/code_index.py +0 -0
  300. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/finding_types.py +0 -0
  301. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/flags.py +0 -0
  302. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/fuzzy.py +0 -0
  303. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/mcp_security.py +0 -0
  304. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/metrics.py +0 -0
  305. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/procman.py +0 -0
  306. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/retriever.py +0 -0
  307. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/sensory_cortex.py +0 -0
  308. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/skill_provenance.py +0 -0
  309. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/subdir_hints.py +0 -0
  310. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/swap.py +0 -0
  311. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/tool_summary.py +0 -0
  312. {sliceagent-0.2.0 → sliceagent-0.3.0}/src/sliceagent/workspace_revision.py +0 -0
  313. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/README.md +0 -0
  314. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_benchmark_runner.py +0 -0
  315. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_binary_view.py +0 -0
  316. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_bound_is_relevance.py +0 -0
  317. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_breadth_e2e.py +0 -0
  318. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_bugfix_breadth_wave.py +0 -0
  319. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_bugfix_linenum.py +0 -0
  320. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_bugfix_loop_wave.py +0 -0
  321. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_bugfix_p0a.py +0 -0
  322. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_bugfix_p0b.py +0 -0
  323. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_bugfix_selfreview.py +0 -0
  324. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_bugfix_skills_h1.py +0 -0
  325. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_bugfix_slice_wave.py +0 -0
  326. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_checkpoint.py +0 -0
  327. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_closure.py +0 -0
  328. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_code_index.py +0 -0
  329. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_config_docs_current.py +0 -0
  330. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_conversation.py +0 -0
  331. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_coresidency.py +0 -0
  332. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_echo_before_blocking.py +0 -0
  333. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_exec_env.py +0 -0
  334. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_finding_types.py +0 -0
  335. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_flags.py +0 -0
  336. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_fuzzy.py +0 -0
  337. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_ghost_index.py +0 -0
  338. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_llm_cache.py +0 -0
  339. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_llm_usage_cache.py +0 -0
  340. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_log_redaction.py +0 -0
  341. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_memory.py +0 -0
  342. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_memory_persist.py +0 -0
  343. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_menu_select.py +0 -0
  344. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_metrics.py +0 -0
  345. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_mining.py +0 -0
  346. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_model_catalog.py +0 -0
  347. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_model_identity.py +0 -0
  348. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_pageout_compaction.py +0 -0
  349. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_persistence_protocol.py +0 -0
  350. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_plan_tier.py +0 -0
  351. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_procman.py +0 -0
  352. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_prompt_ab.py +0 -0
  353. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_provider_lineup.py +0 -0
  354. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_recall_search.py +0 -0
  355. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_refault.py +0 -0
  356. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_registry_validation.py +0 -0
  357. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_repo_map_bounded.py +0 -0
  358. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_requirements.py +0 -0
  359. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_review_fixes.py +0 -0
  360. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_route_lexical.py +0 -0
  361. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_seal_markdown.py +0 -0
  362. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_skill_meta.py +0 -0
  363. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_skill_metadata.py +0 -0
  364. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_subdir_hints.py +0 -0
  365. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_task_agnostic.py +0 -0
  366. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_task_state_roundtrip.py +0 -0
  367. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_terminal.py +0 -0
  368. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_tool_result_ok.py +0 -0
  369. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_verification_agent.py +0 -0
  370. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_workspace.py +0 -0
  371. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_workspace_revision.py +0 -0
  372. {sliceagent-0.2.0 → sliceagent-0.3.0}/tests/test_world_region.py +0 -0
  373. {sliceagent-0.2.0 → 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
@@ -47,10 +47,20 @@ runs/
47
47
  *.pdf
48
48
 
49
49
  # ── internal-only: untracked 2026-07-02 for the public launch (files stay on disk locally) ──
50
- # 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.
51
52
  # prototype/ = superseded ~250-line JS proof-of-concept (its own README: "not the production codebase")
52
53
  # docs/STEP3-PLAN.md, docs/MEMEM-DIAGNOSIS.md = internal R&D planning notes, not user docs
53
- 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
54
64
  prototype/
55
65
  docs/STEP3-PLAN.md
56
66
  docs/MEMEM-DIAGNOSIS.md
@@ -58,8 +68,13 @@ docs/MEMEM-DIAGNOSIS.md
58
68
  # internal engineering roadmap (wave planning), not product docs — untracked 2026-07-02
59
69
  ROADMAP.md
60
70
 
61
- # all of docs/ is internal (architecture/spec/brand assets) not published; untracked 2026-07-02
62
- 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
63
78
 
64
79
  # ColBench raw HF dataset (huge; selected tasks are committed under evals/colbench/tasks/)
65
80
  evals/colbench/data/
@@ -5,6 +5,180 @@ 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
+
8
182
  ## [0.2.0] — 2026-07-10
9
183
 
10
184
  A typed re-architecture of the core around a single canonical design (elastic slice, execution kernel,
@@ -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).
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sliceagent
3
- Version: 0.2.0
4
- Summary: A coding agent with a new context-engineering framework: bounded, deterministic, reconstructed context (slice architecture) — built for long-horizon work.
3
+ Version: 0.3.0
4
+ Summary: A coding agent with history-bounded, task-elastic reconstructed context — built for long-horizon work.
5
5
  Author: TT-Wang
6
6
  License-Expression: MIT
7
7
  License-File: LICENSE
@@ -16,12 +16,13 @@ Classifier: Topic :: Software Development :: Build Tools
16
16
  Requires-Python: >=3.11
17
17
  Requires-Dist: httpx>=0.27
18
18
  Requires-Dist: mcp>=1.0
19
- Requires-Dist: memem>=2.9.7
20
- Requires-Dist: numpy>=1.24
21
19
  Requires-Dist: openai>=1.40
22
20
  Provides-Extra: dev
23
21
  Requires-Dist: pytest>=8; extra == 'dev'
24
22
  Requires-Dist: ruff>=0.6; extra == 'dev'
23
+ Provides-Extra: memory
24
+ Requires-Dist: memem>=2.9.7; extra == 'memory'
25
+ Requires-Dist: numpy>=1.24; extra == 'memory'
25
26
  Provides-Extra: treesitter
26
27
  Requires-Dist: tree-sitter-python>=0.21; extra == 'treesitter'
27
28
  Requires-Dist: tree-sitter>=0.21; extra == 'treesitter'
@@ -55,14 +56,23 @@ The field's default is *bigger windows + summarize*. sliceagent does the opposit
55
56
  alt="The core loop: a transcript agent re-sends its entire growing history every turn (208k to 1.66M tokens over 6 turns), while sliceagent rebuilds a history-bounded, task-elastic seed from the carried slice, live files, and lessons, then seals each turn to disk, and the hippocampus pages past turns back into future seeds on demand — peak input stayed ~12-15k in the s1 benchmark, 112x smaller by turn 6.">
56
57
  </p>
57
58
 
58
- sliceagent's memory is organized like a brain: fast, lossy **perception** of the live world; an elastic **working memory** for the current task; a **hippocampus** backed by always-on local artifacts; and an optional **neocortex** that derives durable lessons. Every turn *reconstructs* a history-bounded working set from these — it never replays a growing transcript.
59
+ sliceagent's memory is organized like a brain: fast, lossy **perception** of the live world; an elastic **working memory** for the current task; a **hippocampus** backed by always-on local artifacts; and a typed native **neocortex** for provenance-linked USER, PROJECT, and CRAFT knowledge. Every turn *reconstructs* a history-bounded working set from these — it never replays a growing transcript. With Memem's structured-index protocol (2.10+) installed, Memem is the primary semantic retrieval backend for typed L2; it is not another brain layer or a second record authority.
59
60
 
60
61
  | Region | Role |
61
62
  |---|---|
62
- | **Sensory cortex** — live perception | Re-derives the world each turn—git state, project facts, repo map—rather than trusting remembered copies. |
63
- | **Prefrontal cortex** — working memory | The carried **Slice**: task-elastic, provenance-tagged state (intent, findings, plan, change-set), sealed at each turn boundary. |
64
- | **Hippocampus** — episodic memory | Seals each turn or child report into the always-on local artifact store; pages a specific record back in on demand. |
65
- | **Neocortex** — long-term memory | Optionally derives and retrieves provenance-tagged cross-session lessons; it is not required for task recovery. |
63
+ | **Sensory cortex** — live perception | Re-derives only live resources named by the active dependency closure; unrelated repo maps, history, and memory are not eagerly injected. |
64
+ | **Prefrontal cortex** — working memory | Source-linked **Active Work** for genuine unresolved, cross-turn user commitments; it is not a shadow scheduler for tools or subagents. |
65
+ | **Hippocampus** — episodic memory | Seals every turn into the always-on local artifact store; optional child-report artifacts add re-readable locators without gating direct report delivery. |
66
+ | **Neocortex** — long-term memory | Stores scoped, provenance-linked USER, PROJECT, and CRAFT records in one typed model; Memem provides primary semantic retrieval when available, with native search as failover. |
67
+
68
+ The implementation contracts are documented in [End-game context design](docs/ENDGAME-CONTEXT-DESIGN.md) and
69
+ [Memory layers design](docs/MEMORY-LAYERS-DESIGN.md).
70
+
71
+ The exact current request is admitted once into an application event ledger and one Active Work root. Context
72
+ is selected from that graph's unresolved dependency closure before physical elasticity is applied. After
73
+ execution, the sealed turn carries a canonical receipt distinguishing requested, rejected, started, settled,
74
+ and applied work. A constant-size receipt projection remains visible without constructing an autobiography
75
+ from conversational residue.
66
76
 
67
77
  ```text
68
78
  ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐
@@ -90,7 +100,7 @@ sliceagent's memory is organized like a brain: fast, lossy **perception** of the
90
100
  live views re-derive, archived detail returns by handle.
91
101
  ```
92
102
 
93
- Each turn faults in what the active task references — the carried slice, live views, selected artifacts, and any relevant derived lessons — and hands the model an elastic **Seed**. The model acts; observations fold back into working memory; at the turn boundary the episode is sealed into an immutable local artifact and the next checkpoint is published. If semantic memory is available, it may additionally distill a durable lesson. Net effect: **for stable active task state, context does not grow merely with session age; it can still expand with genuine task complexity.**
103
+ Each turn faults in what the active task references — the carried slice, live views, selected artifacts, and applicable typed USER, PROJECT, or CRAFT knowledge — and hands the model an elastic **Seed**. The model acts; observations fold back into working memory; at the turn boundary the episode is sealed into an immutable local artifact and the next checkpoint is published. Qualifying evidence may then consolidate into a native typed lesson; optional semantic retrieval may index it but is not required. Net effect: **for stable active task state, context does not grow merely with session age; it can still expand with genuine task complexity.**
94
104
 
95
105
  ## Benchmark
96
106
 
@@ -180,7 +190,7 @@ Per turn (mean of 3 runs) — the orchestrator's context is what caps how large
180
190
  | 5 · follow-up | 41,447 | 338,507 |
181
191
  | 6 · follow-up | 31,963 | 362,595 |
182
192
 
183
- In these runs, sliceagent's orchestrator peak stayed roughly flat because each turn retained active digests and handles rather than child trajectories; its largest single request averaged **~17k** across the six-turn workload. A transcript orchestrator **re-carries the whole session every turn**, so the same delegation-heavy session reached a **~21× larger orchestrator peak and ~3.7× more total tokens** once both agents' children were counted. Parent context does not grow with child trajectory length, though it may still grow when more delegated results are genuinely relevant. Delegation is table stakes; the architectural advantage is durable, re-readable child artifacts plus a history-bounded parent.
193
+ In these runs, sliceagent's orchestrator peak stayed roughly flat because it carried child results rather than child trajectories; its largest single request averaged **~17k** across the six-turn workload. A transcript orchestrator **re-carries the whole session every turn**, so the same delegation-heavy session reached a **~21× larger orchestrator peak and ~3.7× more total tokens** once both agents' children were counted. Parent context does not grow with child trajectory length, though it may still grow when more delegated results are genuinely relevant. Delegation is table stakes; the architectural advantage is direct child outcomes, optional re-readable artifacts, and a history-bounded parent.
184
194
 
185
195
  *N = 3 runs, single model, one opponent, needs the Codex CLI installed. A value-recall sub-check varied wildly run-to-run (sliceagent 1–3 / 3, Codex 0–2 / 3) — it turns on a behavioral re-read choice, so it is within noise and **not** part of the claim. The defensible result is the orchestrator-context and total-token gap, which is structural and held across all three runs (orchestrator 8.8–14.3×, total 3.2–4.3×).*
186
196
 
@@ -257,14 +267,42 @@ pipx install "sliceagent[tui]" # pipx
257
267
  pip install "sliceagent[tui]" # plain pip (use a venv)
258
268
  ```
259
269
 
270
+ Native evidence, Active Work, history, and typed knowledge are included in the base install. The
271
+ `sliceagent[tui,memory]` extra adds optional Memem; when its structured-index protocol is available (Memem 2.10+),
272
+ SliceAgent uses it as primary L2 retrieval and falls back to native search on a whole-query failure. Older Memem
273
+ versions are reported as unavailable for this protocol rather than used as an unscoped recall tail. Typed record
274
+ truth and `@sliceagent/` durability remain available without it.
275
+
260
276
  If `pip` refuses with `Requires-Python >=3.11`: `conda create -n sliceagent python=3.12 -y && conda activate sliceagent`, then pip install. Prefer env vars over the wizard? Export **both** `LLM_API_KEY` and `AGENT_MODEL` (plus `LLM_BASE_URL` for non-OpenAI endpoints). `ripgrep` is recommended (code search degrades gracefully without it).
261
277
  </details>
262
278
 
263
- Footprint is light (no torch). `pip install -e .` works for a clone. Homebrew / Docker arrive in v0.2. → Full walkthrough in **[QUICKSTART.md](QUICKSTART.md)**.
279
+ ### Updating
280
+
281
+ For installs created by the one-line installer:
282
+
283
+ ```bash
284
+ sliceagent update
285
+ ```
286
+
287
+ The command updates only when it can positively identify SliceAgent's isolated `uv` tool environment;
288
+ it never replaces an editable checkout or guesses at a manager-owned environment. On Windows, exit
289
+ SliceAgent and follow the external process guidance it prints. If your installed version predates
290
+ `sliceagent update`, re-run the one-line installer; the installer is deliberately safe to re-run.
291
+
292
+ Self-managed installs stay self-managed: `uv tool upgrade sliceagent`, `pipx upgrade sliceagent`, or
293
+ `python -m pip install --upgrade "sliceagent[tui]"` (or `sliceagent[tui,memory]` when using Memem). Source checkouts should pull first, then run
294
+ `uv sync --all-extras`.
295
+
296
+ Footprint is light (no torch), and `pip install -e .` works for a clone. Distribution is currently through
297
+ the one-line installers and PyPI; no Homebrew formula or prebuilt SliceAgent container image is advertised.
298
+ Docker is available separately as the optional POSIX/WSL2 command-sandbox backend. → Full walkthrough in
299
+ **[QUICKSTART.md](QUICKSTART.md)**.
264
300
 
265
301
  ## Usage
266
302
 
267
- Run `sliceagent` in your project and type what you want in plain language. It rebuilds its working context, investigates, edits (auto-applied or confirmed, per your mode), and can run your tests to verify. A turn looks like:
303
+ Run `sliceagent` in your project and type what you want in plain language. It rebuilds its working context,
304
+ investigates, edits, and can run your tests to verify. Ordinary requested work proceeds without permission
305
+ prompts; only a narrow high-confidence catastrophic-command safeguard can refuse execution. A turn looks like:
268
306
 
269
307
  ```text
270
308
  ❯ why does retry_with_backoff drop the last attempt? fix it
@@ -275,12 +313,14 @@ Run `sliceagent` in your project and type what you want in plain language. It re
275
313
  ◌ 2/3 add a regression test · Running pytest -q · 00:12
276
314
  │ run pytest -q
277
315
  │ 38 passed
278
- The regression reproduces the bug and passes with the fix.
279
- ┌─ assistant ─────────────────────────────────────────────┐
280
- │ The loop exits on `attempt == max` before the final │
281
- sleep+retry, so the last attempt never runs. Changed the
282
- bound to `attempt <= max` and added a regression test. │
283
- └──────────────────────────────────────────────────────────┘
316
+ agent note · The focused regression now passes.
317
+ assistant ───────────────────────────────────────────────
318
+
319
+ The loop exits on `attempt == max` before the final
320
+ sleep+retry, so the last attempt never runs. Changed the
321
+ bound to `attempt <= max` and added a regression test.
322
+
323
+ ───────────────────────────────────────────────────────────
284
324
  ✓ turn saved · plan 3/3 · 2 passes · 4 read · 1 edit · 1 cmd · 00:18
285
325
  ```
286
326
 
@@ -290,54 +330,81 @@ Attach a file or path to your message with `@`: `@src/errors.py explain the back
290
330
 
291
331
  | Command | What it does |
292
332
  |---|---|
293
- | `/config` · `/model` · `/reasoning` | add/switch providers · switch model / reasoning effort (persists) |
294
- | `/mode` | permission mode: **baby-sitter** (confirm each edit + command) · **teenager** (default; confirm risky ones) · **let-it-go** (auto-run all but catastrophic) |
295
- | `/undo` | revert the last edit(s) |
296
- | `/cwd [path]` | show the fixed workspace root; with a path, show where to relaunch |
333
+ | `/config` · `/model` | add/switch providers · switch model / reasoning effort (persists) |
334
+ | `Esc` | revert the last edit(s) |
335
+ | `/cwd [path]` | show the workspace; with a path, atomically switch it without restarting the UI or model client |
297
336
  | `/cost` | tokens and estimated $ spent this session |
298
337
  | `/skills` · `/tools` · `/mcp` · `/plugins` · `/agents` | list what's available to the agent |
299
338
  | `/threads` · `/resume` | switch between, or resume, parked topics |
300
339
  | `/learn <note>` | save a durable lesson yourself |
301
340
  | `/plan` | show the current task plan |
341
+ | `/update` | show the safe process-boundary update command |
302
342
  | `Ctrl-C` · `exit` | interrupt the turn · quit |
303
343
 
344
+ Public `/` palette: `/config` · `/model` · `/cwd` · `/learn` · `/plan` · `/cost` · `/update` · `/threads` · `/resume` · `/plugins` · `/mcp` · `/skills` · `/tools` · `/agents` · `/help` · `/exit`.
345
+ The typed compatibility aliases `/reasoning`, `/undo`, and `/switch` remain accepted, but stay out of the
346
+ palette because `/model`, Esc, and `/resume` are their clearer public spellings.
347
+
348
+ File mentions accept exact workspace paths such as `@app/jobs/[id]/page.tsx`; quote paths containing spaces,
349
+ for example `@"docs/my guide.md"`.
350
+
304
351
  Prefix an unrelated request with `New task:` to start it with fresh task state while parking the current task
305
352
  for `/resume`. Ambiguous follow-ups deliberately continue the active task so context is never discarded on a
306
353
  guess.
307
354
 
308
- It can edit code (workspace-confined, reversible with `/undo`), run regular shell commands through a sandbox (`local` by default, `docker` for full isolation), search the tree and the web, and delegate decomposable research to a fresh one-shot read-only explorer (each child gets its own history-bounded, task-elastic slice). That narrow surface is the demo default. Set `AGENT_ADVANCED_AGENTS=1` to expose writable and named specialist delegation (and nested delegation when `AGENT_SUBAGENT_DEPTH` is raised above its default of `1`), or `AGENT_ADVANCED_TOOLS=1` to expose persistent process and interactive terminal tools. The flags are independent. Three permission modes gate actions, all with a hard floor on catastrophic commands; secrets are scrubbed from anything persisted or logged.
355
+ It can edit code in the primary workspace and grounded focus roots (reversible with `/undo`), run regular shell commands through a sandbox (`local` by default, `docker` for container isolation on POSIX/WSL2), search the tree and the web, and delegate decomposable research to a fresh one-shot read-only explorer (each child gets its own history-bounded, task-elastic slice). Native Windows uses the local backend; run SliceAgent inside WSL2 if you want the Docker backend. That narrow surface is the demo default. Set `AGENT_ADVANCED_AGENTS=1` to expose writable and named specialist delegation (and nested delegation when `AGENT_SUBAGENT_DEPTH` is raised above its default of `1`), or `AGENT_ADVANCED_TOOLS=1` to expose persistent process and interactive terminal tools. The flags are independent. Ordinary work runs directly from the user's request; the host retains only a narrow safeguard against high-confidence catastrophic shell commands. Secrets are scrubbed from anything persisted or logged.
309
356
 
310
- Every clean or interrupted agent task turn and every subagent report is sealed into the always-on local artifact/checkpoint path, independently of semantic memory. The model can refine retained detail through the read-only `artifacts/` namespace. Cross-session semantic lessons are a separate, optional derived layer powered by memem; task recovery does not depend on it.
357
+ Every clean or interrupted agent task turn is sealed into the always-on local artifact/checkpoint path.
358
+ Subagent reports return directly to the parent in launch order; when optional artifact persistence succeeds,
359
+ they also gain durable re-readable locators. The model reads exact evidence, project history, Active Work, and
360
+ typed knowledge through the permanent read-only `@sliceagent/` namespace in every workspace.
361
+ `@sliceagent/memory/status.md` is the bounded general summary; raw host-counted inventory lives separately at
362
+ `@sliceagent/memory/diagnostics.md` for explicit diagnostic requests. Compatibility counts are not layer sizes
363
+ or an L2 backlog. Memem is primary semantic retrieval when enabled; task recovery and typed record truth do
364
+ not depend on it.
311
365
 
312
- If a timeout or disconnect leaves an operation's side effects uncertain, SliceAgent carries a durable,
313
- target-scoped reconciliation gate into the next turn: it permits matching live read-only inspection, then
314
- requires an explicit evidence-backed resolution before more effects or task switching in that workspace.
315
- Opaque shell/code effects also require live user confirmation; a directory listing is never treated as proof
316
- of file contents. Ambiguous recovery journals stop startup before plugins or MCP processes run.
366
+ Automatic knowledge push is lifecycle- and revision-aware: stale or dependency-drifted PROJECT observations and
367
+ resolved diagnostic reports remain explicitly searchable, but do not reappear as if they described the current
368
+ workspace. USER preferences and reusable CRAFT procedures do not decay merely because time passed.
369
+
370
+ If a timeout or disconnect leaves an operation's side effects uncertain, SliceAgent records that uncertainty
371
+ durably and shows it to the model as grounding on later turns. It can re-observe relevant live state before
372
+ making claims, but the receipt does not block ordinary work, task switching, undo, or workspace navigation.
373
+ Ambiguous recovery journals still stop startup before plugins or MCP processes run because that boundary
374
+ protects the integrity of the durable local store rather than interpreting user intent.
317
375
 
318
376
  **Configuration.** `sliceagent config --list` prints every setting. Set them persistently in `~/.sliceagent/config.toml` (written by `init`), or override any one via an environment variable:
319
377
 
320
378
  | Setting | Default | Purpose |
321
379
  |---|---|---|
322
380
  | `AGENT_MODEL` | *(required)* | the model id to run |
323
- | `AGENT_POLICY` | `teenager` | permission mode |
324
- | `AGENT_SANDBOX` | `local` | `local` or `docker` (isolated) |
381
+ | `AGENT_SANDBOX` | `local` | `local`, or `docker` on POSIX/WSL2 (native Windows: use `local` or run under WSL2) |
325
382
  | `AGENT_MAX_STEPS` | `60` | per-turn step ceiling |
326
383
  | `AGENT_CONTEXT_WINDOW` | *(catalog or unset)* | explicit provider window for strict per-call preflight; unknown models otherwise use compatibility mode |
327
384
  | `AGENT_ADVANCED_AGENTS` | *(off)* | enable writable and named specialists; unlock the nested surface subject to the depth ceiling |
328
385
  | `AGENT_SUBAGENT_DEPTH` | `1` | delegation depth ceiling; raise it to permit nested advanced agents |
386
+ | `AGENT_DELEGATION_TIMEOUT` | `900` | hard ceiling in seconds for one child-agent wave; raise for unusually slow providers |
387
+ | `AGENT_EXPLORER_REASONING` | `staged` | fast evidence navigation followed by one full, tool-free final synthesis (`fast`/`full` are single-stage overrides) |
388
+ | `AGENT_EXPLORER_NAV_STEPS` | `6` | fast-navigation model-step ceiling for staged explorers; one separate synthesis step stays reserved |
389
+ | `LLM_HARD_TIMEOUT_SEC` | *(completion-budget derived)* | absolute per-call watchdog; provider-agnostic default allows the configured completion cap at a conservative generation rate (minimum 180s) |
390
+ | `LLM_STREAM_CLOSE_GRACE_SEC` | `2` | bounded wait to prove a cancelled/timed-out SSE request physically closed before any retry |
391
+ | `LLM_PROVIDER_MAX_INFLIGHT` | `4` | process-wide physical request cap per provider account; indeterminate calls hold their slot until the transport closes |
329
392
  | `AGENT_ADVANCED_TOOLS` | *(off)* | enable persistent process and interactive terminal tools |
330
393
  | `SLICEAGENT_CACHE_DIR` | `~/.sliceagent` | always-on local checkpoints, immutable artifacts, and recovery journals |
331
- | `SLICEAGENT_VAULT` | `~/.sliceagent/vault` | optional semantic-memory and legacy compatibility records |
394
+ | `SLICEAGENT_VAULT` | `~/.sliceagent/vault` | legacy episodic/task/roster compatibility records (not canonical typed L2) |
332
395
  | `AGENT_VERIFY_CMD` | *(unset)* | test command used as the verification oracle |
333
396
 
397
+ DeepSeek official-API configurations should move from the retiring `deepseek-chat` / `deepseek-reasoner`
398
+ aliases to `deepseek-v4-flash` or `deepseek-v4-pro`. SliceAgent keeps the old names temporarily compatible,
399
+ but new provider setup and model suggestions use the V4 names.
400
+
334
401
  ## License
335
402
 
336
403
  **MIT** — see [LICENSE](LICENSE). Third-party components and their licenses are listed in [NOTICE](NOTICE). Security policy + threat model: **[SECURITY.md](SECURITY.md)**.
337
404
 
338
405
  ## Acknowledgements
339
406
 
340
- sliceagent's design was informed by two excellent open-source agents: **[Hermes](https://github.com/NousResearch/hermes)** (MIT) and **[Kimi Code](https://github.com/MoonshotAI/kimi-code)**. A few peripheral utilities are ported from Hermes (see [NOTICE](NOTICE)); most of the rest are patterns we studied and reimplemented on our own terms. The optional cross-session semantic-memory layer is powered by [memem](https://github.com/TT-Wang/memem); local artifacts and recovery do not depend on it. With thanks to their authors.
407
+ sliceagent's design was informed by two excellent open-source agents: **[Hermes Agent](https://github.com/NousResearch/hermes-agent)** (MIT) and **[Kimi Code](https://github.com/MoonshotAI/kimi-code)**. A few peripheral utilities are ported from Hermes (see [NOTICE](NOTICE)); most of the rest are patterns we studied and reimplemented on our own terms. [memem](https://github.com/TT-Wang/memem) provides primary semantic retrieval for SliceAgent-owned typed L2 knowledge when the memory extra is installed. Its value/primary-index/cue representation was also informed by Microsoft [Memora](https://github.com/microsoft/Memora) (MIT). Neither is another brain layer, and local artifacts and recovery do not depend on them. With thanks to their authors.
341
408
 
342
409
  ## Contact
343
410