simplicio-loop 3.32.5__tar.gz → 3.34.1__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 (191) hide show
  1. {simplicio_loop-3.32.5/simplicio_loop.egg-info → simplicio_loop-3.34.1}/PKG-INFO +3 -3
  2. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/PYPI.md +1 -1
  3. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/README.md +8 -7
  4. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/pyproject.toml +2 -2
  5. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/__init__.py +2 -2
  6. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/hooks/README.md +1 -1
  7. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/hooks/loop_stop.py +23 -11
  8. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/hooks/simplicio_dashboard.py +82 -5
  9. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/scripts/cross_agent_wiki.py +12 -4
  10. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/SKILL.md +2 -2
  11. simplicio_loop-3.34.1/simplicio_loop/_bundle/skills/simplicio-loop/references/control-policy.md +79 -0
  12. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/cross-agent-wiki.md +1 -1
  13. {simplicio_loop-3.32.5/simplicio_loop/_bundle/skills/simplicio-tasks → simplicio_loop-3.34.1/simplicio_loop/_bundle/skills/simplicio-loop}/references/extension-points.md +2 -1
  14. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/token-capture.md +7 -7
  15. {simplicio_loop-3.32.5/simplicio_loop/_bundle/skills/simplicio-tasks → simplicio_loop-3.34.1/simplicio_loop/_bundle/skills/simplicio-loop}/references/token-economy.md +2 -2
  16. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/web-evidence.md +1 -1
  17. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-tasks/SKILL.md +1 -1
  18. {simplicio_loop-3.32.5/simplicio_loop/_bundle/skills/simplicio-loop → simplicio_loop-3.34.1/simplicio_loop/_bundle/skills/simplicio-tasks}/references/extension-points.md +2 -1
  19. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-tasks/references/token-capture.md +7 -7
  20. {simplicio_loop-3.32.5/simplicio_loop/_bundle/skills/simplicio-loop → simplicio_loop-3.34.1/simplicio_loop/_bundle/skills/simplicio-tasks}/references/token-economy.md +2 -2
  21. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-tasks/references/web-evidence.md +1 -1
  22. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/tests/test_cross_agent_wiki.py +30 -3
  23. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1/simplicio_loop/_bundle}/tests/test_loop_e2e.py +35 -0
  24. simplicio_loop-3.34.1/simplicio_loop/agent_contract.py +151 -0
  25. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/cli.py +16 -2
  26. simplicio_loop-3.34.1/simplicio_loop/control_policy.py +242 -0
  27. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/execution_board.py +139 -6
  28. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/oracle.py +5 -1
  29. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/remote_queue.py +56 -40
  30. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/runner.py +499 -13
  31. simplicio_loop-3.34.1/simplicio_loop/verified_delivery.py +158 -0
  32. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/work_item_claims.py +50 -32
  33. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1/simplicio_loop.egg-info}/PKG-INFO +3 -3
  34. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop.egg-info/SOURCES.txt +16 -0
  35. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop.egg-info/requires.txt +1 -1
  36. simplicio_loop-3.34.1/tests/test_agent_contract.py +63 -0
  37. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_cli_oracle.py +1 -1
  38. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_completion_oracle_matrix.py +62 -51
  39. simplicio_loop-3.34.1/tests/test_control_policy.py +182 -0
  40. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_cross_agent_wiki.py +30 -3
  41. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_dashboard_hook.py +24 -0
  42. simplicio_loop-3.34.1/tests/test_distributed_183_e2e.py +44 -0
  43. simplicio_loop-3.34.1/tests/test_distributed_183_external_probe.py +83 -0
  44. simplicio_loop-3.34.1/tests/test_distributed_epic_evidence.py +43 -0
  45. simplicio_loop-3.34.1/tests/test_execution_board_e2e.py +167 -0
  46. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_fan_out_scheduler.py +26 -0
  47. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_independent_watcher.py +31 -1
  48. simplicio_loop-3.34.1/tests/test_live_issue_183_identity.py +157 -0
  49. {simplicio_loop-3.32.5/simplicio_loop/_bundle → simplicio_loop-3.34.1}/tests/test_loop_e2e.py +35 -0
  50. simplicio_loop-3.34.1/tests/test_maintenance_deferred_docs.py +23 -0
  51. simplicio_loop-3.34.1/tests/test_merge_queue_live_probe.py +136 -0
  52. simplicio_loop-3.34.1/tests/test_planes_installed_e2e.py +45 -0
  53. simplicio_loop-3.34.1/tests/test_release_manifest.py +45 -0
  54. simplicio_loop-3.34.1/tests/test_remote_queue.py +259 -0
  55. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_runner_cli.py +62 -23
  56. simplicio_loop-3.34.1/tests/test_runner_progress_events.py +57 -0
  57. simplicio_loop-3.34.1/tests/test_runtime_matrix.py +43 -0
  58. simplicio_loop-3.34.1/tests/test_verified_delivery.py +79 -0
  59. simplicio_loop-3.34.1/tests/test_watcher_binding.py +103 -0
  60. simplicio_loop-3.34.1/tests/test_watcher_challenge_generation.py +101 -0
  61. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_work_item_claims.py +27 -18
  62. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_worktree_queue.py +14 -11
  63. simplicio_loop-3.32.5/simplicio_loop/agent_contract.py +0 -79
  64. simplicio_loop-3.32.5/tests/test_agent_contract.py +0 -33
  65. simplicio_loop-3.32.5/tests/test_execution_board_e2e.py +0 -42
  66. simplicio_loop-3.32.5/tests/test_remote_queue.py +0 -111
  67. simplicio_loop-3.32.5/tests/test_watcher_binding.py +0 -23
  68. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/LICENSE +0 -0
  69. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/MANIFEST.in +0 -0
  70. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/setup.cfg +0 -0
  71. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/hooks/action_gate.py +0 -0
  72. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/hooks/hooks.claude.json +0 -0
  73. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/hooks/hooks.json +0 -0
  74. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/hooks/loop_capture.py +0 -0
  75. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/hooks/orient_clamp.py +0 -0
  76. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/hooks/orient_rewrite.py +0 -0
  77. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/hooks/pre-commit.py +0 -0
  78. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/hooks/simplicio_watch.py +0 -0
  79. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/scripts/hierarchical_planner.py +0 -0
  80. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-autoresearch/SKILL.md +0 -0
  81. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-compress/SKILL.md +0 -0
  82. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-learn/SKILL.md +0 -0
  83. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/agentsview-adapter.md +0 -0
  84. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/azure-devops-adapter.md +0 -0
  85. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/bound-operators.md +0 -0
  86. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/claims-gate.md +0 -0
  87. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/cross-repo-integration.md +0 -0
  88. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/hierarchical-planner.md +0 -0
  89. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/lmcache-adapter.md +0 -0
  90. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/orchestration.md +0 -0
  91. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/quality-safety-delivery.md +0 -0
  92. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/run-journal-stall-detector.md +0 -0
  93. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/spindle-handoff.md +0 -0
  94. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/standing-loop-247.md +0 -0
  95. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/triage-verify-detail.md +0 -0
  96. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/understand-anything-adapter.md +0 -0
  97. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/video-evidence.md +0 -0
  98. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-orient/SKILL.md +0 -0
  99. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-review/SKILL.md +0 -0
  100. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-tasks/references/agentsview-adapter.md +0 -0
  101. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-tasks/references/azure-devops-adapter.md +0 -0
  102. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-tasks/references/lmcache-adapter.md +0 -0
  103. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-tasks/references/orchestration.md +0 -0
  104. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-tasks/references/quality-safety-delivery.md +0 -0
  105. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-tasks/references/standing-loop-247.md +0 -0
  106. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-tasks/references/understand-anything-adapter.md +0 -0
  107. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-tasks/references/video-evidence.md +0 -0
  108. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/tests/_selfrun.py +0 -0
  109. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/attempt_journal.py +0 -0
  110. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/budget.py +0 -0
  111. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/delivery.py +0 -0
  112. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/drain.py +0 -0
  113. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/driver_contract.py +0 -0
  114. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/evidence.py +0 -0
  115. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/flow_semantics.py +0 -0
  116. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/ops_ledger.py +0 -0
  117. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/phase_events.py +0 -0
  118. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/plan_contract.py +0 -0
  119. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/progress.py +0 -0
  120. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/recovery.py +0 -0
  121. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/runtime_adapter.py +0 -0
  122. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/source_state.py +0 -0
  123. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/task_contract.py +0 -0
  124. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop.egg-info/dependency_links.txt +0 -0
  125. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop.egg-info/entry_points.txt +0 -0
  126. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop.egg-info/top_level.txt +0 -0
  127. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_action_gate.py +0 -0
  128. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_agent_identity.py +0 -0
  129. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_agentsview_adapter.py +0 -0
  130. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_attempt_journal.py +0 -0
  131. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_autoresearch.py +0 -0
  132. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_az_boards_adapter.py +0 -0
  133. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_budget.py +0 -0
  134. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_check_e2e_demo_contract.py +0 -0
  135. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_check_e2e_installed.py +0 -0
  136. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_claims_audit.py +0 -0
  137. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_claims_manifest_unit.py +0 -0
  138. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_clean_env_contract.py +0 -0
  139. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_completion_oracle.py +0 -0
  140. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_delivery_reconciliation.py +0 -0
  141. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_delivery_source_identity.py +0 -0
  142. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_doctor_smoke.py +0 -0
  143. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_drain.py +0 -0
  144. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_drain_cli.py +0 -0
  145. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_driver_contract.py +0 -0
  146. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_e2e_demo_audit.py +0 -0
  147. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_evidence_chain.py +0 -0
  148. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_evidence_receipt.py +0 -0
  149. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_fan_out_flow.py +0 -0
  150. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_fan_out_unit.py +0 -0
  151. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_flow_audit.py +0 -0
  152. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_flow_semantics.py +0 -0
  153. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_golden_mutation.py +0 -0
  154. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_hbp_topics.py +0 -0
  155. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_hierarchical_planner.py +0 -0
  156. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_hooks_coverage.py +0 -0
  157. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_impact_audit.py +0 -0
  158. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_install_lib.py +0 -0
  159. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_learn_pipeline_removed.py +0 -0
  160. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_ledger_cli.py +0 -0
  161. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_locked_append.py +0 -0
  162. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_mirror_parity.py +0 -0
  163. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_operator_batch.py +0 -0
  164. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_operator_worktree_batch.py +0 -0
  165. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_ops_ledger.py +0 -0
  166. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_phase_events.py +0 -0
  167. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_plan_contract.py +0 -0
  168. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_planes_golden_eval.py +0 -0
  169. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_precommit_bundle_sync.py +0 -0
  170. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_preflight.py +0 -0
  171. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_progress.py +0 -0
  172. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_progress_snapshots.py +0 -0
  173. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_recovery.py +0 -0
  174. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_remote_queue_live.py +0 -0
  175. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_repo_conventions_architecture.py +0 -0
  176. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_runtime_adapter.py +0 -0
  177. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_schema_verify_integration.py +0 -0
  178. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_schema_verify_unit.py +0 -0
  179. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_simplicio_mcp_runner.py +0 -0
  180. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_system_check.py +0 -0
  181. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_task_backlog.py +0 -0
  182. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_task_contract_cli.py +0 -0
  183. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_task_contract_unit.py +0 -0
  184. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_task_to_delivery_golden_corpus.py +0 -0
  185. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_token_budget.py +0 -0
  186. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_toon_codec.py +0 -0
  187. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_verify_adapters_integration.py +0 -0
  188. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_worker_cli_contract.py +0 -0
  189. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_worker_selftests.py +0 -0
  190. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_worker_smoke.py +0 -0
  191. {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_workitem_attempts.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: simplicio-loop
3
- Version: 3.32.5
3
+ Version: 3.34.1
4
4
  Summary: The Universal Looping AI Orchestrator — a runtime-agnostic super-plugin (7 skills) that drains any queue of work end-to-end on any LLM/runtime.
5
5
  Author-email: Wesley Simplicio <wesleybob4@gmail.com>
6
6
  License: MIT
@@ -19,7 +19,7 @@ Classifier: Operating System :: OS Independent
19
19
  Requires-Python: >=3.8
20
20
  Description-Content-Type: text/markdown
21
21
  License-File: LICENSE
22
- Requires-Dist: simplicio-cli>=0.11.0
22
+ Requires-Dist: simplicio-cli>=0.16.1
23
23
  Provides-Extra: dev
24
24
  Requires-Dist: pytest>=7; extra == "dev"
25
25
  Provides-Extra: ml
@@ -70,7 +70,7 @@ Now invoke it from your agent runtime (Claude Code, Cursor, Codex, Gemini, …):
70
70
  ## Highlights
71
71
 
72
72
  - **11 runtimes, one protocol** — Claude Code, Codex, VS Code/Copilot, Cursor, Antigravity, Kiro,
73
- OpenCode, Gemini, Aider, Hermes, OpenClaw.
73
+ OpenCode, Gemini, Aider, Simplicio Agent (formerly Hermes), OpenClaw.
74
74
  - **Evidence-gated completion** — never a false "done"; exits only on a verified `<promise>`,
75
75
  cap, spindle handoff, or STOP.
76
76
  - **Token economy** — honest "answer concisely" baseline; savings credited only on verified-correct
@@ -41,7 +41,7 @@ Now invoke it from your agent runtime (Claude Code, Cursor, Codex, Gemini, …):
41
41
  ## Highlights
42
42
 
43
43
  - **11 runtimes, one protocol** — Claude Code, Codex, VS Code/Copilot, Cursor, Antigravity, Kiro,
44
- OpenCode, Gemini, Aider, Hermes, OpenClaw.
44
+ OpenCode, Gemini, Aider, Simplicio Agent (formerly Hermes), OpenClaw.
45
45
  - **Evidence-gated completion** — never a false "done"; exits only on a verified `<promise>`,
46
46
  cap, spindle handoff, or STOP.
47
47
  - **Token economy** — honest "answer concisely" baseline; savings credited only on verified-correct
@@ -10,7 +10,7 @@
10
10
  <a href="#-the-7-skills--5-accelerators"><img src="https://img.shields.io/badge/skills-7-7C3AED" alt="7 skills"></a>
11
11
  <a href="#-source-adapters"><img src="https://img.shields.io/badge/source%20adapters-5-00E08A" alt="5 source adapters"></a>
12
12
  <a href="#-11-runtimes-one-protocol"><img src="https://img.shields.io/badge/runtimes-11%20(3%20garantidos%2B8%20best--effort)-2563EB" alt="11 runtimes (3 guaranteed + 8 best-effort)"></a>
13
- <a href="#-the-48-extension-points"><img src="https://img.shields.io/badge/extension%20points-48-00E08A" alt="48 extension points"></a>
13
+ <a href="#-the-49-extension-points"><img src="https://img.shields.io/badge/extension%20points-49-00E08A" alt="49 extension points"></a>
14
14
  <a href="#-token-economy"><img src="https://img.shields.io/badge/savings-unverified-888888" alt="Savings — unverified"></a>
15
15
  <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-blue" alt="License"></a>
16
16
  <a href="https://discord.gg/wM6tr7xVb"><img src="https://img.shields.io/badge/Discord-Join%20Simplicio-5865F2?logo=discord&logoColor=white" alt="Join the Simplicio Discord"></a>
@@ -250,7 +250,7 @@ skill names no runtime; the runtime detects the skill.**
250
250
  | **OpenCode** | `AGENTS.md` | self-paced | MCP |
251
251
  | **Gemini** | `GEMINI.md` | self-paced | MCP / adapter |
252
252
  | **Aider** | `CONVENTIONS.md` | self-paced | — (LLM fallback) |
253
- | **Hermes** | native recall | native loop | **native** |
253
+ | **Simplicio Agent** *(formerly Hermes)* | native recall | native loop | **native** |
254
254
  | **OpenClaw** | plugin SDK | native scheduler | **native** |
255
255
 
256
256
  The promise: **same protocol, same gates, same safety on all 11 — Tier 1 verified mechanically,
@@ -418,11 +418,11 @@ Two different things happen when you call **`simplicio-loop`**, and they behave
418
418
 
419
419
  | Runtime | Economy (skill) | Measurement (monitor) |
420
420
  |---|---|---|
421
- | **Hermes** | ✓ | ✓ **automatic** — already routed through the proxy (`base_url → :8788`) |
421
+ | **Simplicio Agent** | ✓ | ✓ **automatic** — already routed through the proxy (`base_url → :8788`) |
422
422
  | **Claude** | ✓ (skill + hooks) | ✗ by default — Claude talks to `api.anthropic.com` directly; measured only once routed (`simplicio-cli wrap claude`, or `ANTHROPIC_BASE_URL → http://127.0.0.1:8788`) |
423
423
  | **Codex** | ✓ (skill) | ✗ by default — `simplicio-cli init codex` adds the MCP tools but does not route LLM traffic; measured with `simplicio-cli wrap codex` or an OpenAI base-url pointing at the proxy |
424
424
 
425
- So: the **savings happen on every runtime**; the **monitor tallies them automatically on Hermes**, and on
425
+ So: the **savings happen on every runtime**; the **monitor tallies them automatically on Simplicio Agent**, and on
426
426
  Claude/Codex after a **one-time routing step** (`simplicio-cli wrap …` / base-url → `:8788`). Without routing,
427
427
  the economy still applies — the monitor just won't count those tokens. `scripts/simplicio-economy.sh wire`
428
428
  does this routing for OpenAI-compatible clients at install time.
@@ -432,7 +432,7 @@ does this routing for OpenAI-compatible clients at install time.
432
432
  A view of the savings you open when you want — only the capture is always-on:
433
433
 
434
434
  - **Capture proxy** — **always-on** (the one auto-started service; the wired clients need it
435
- reachable). It silently captures + measures Claude + Codex + Hermes in the background.
435
+ reachable). It silently captures + measures Claude + Codex + Simplicio Agent in the background.
436
436
  - **Web dashboard** — `http://127.0.0.1:9090` — real-time token chart, savings gauge, the LLMs/runtimes
437
437
  and **141/144 providers (98%)** we intercept, a live proxy log. **Opens once on the first install**
438
438
  so you see it works, then it's **on-demand** — re-open it any of these ways:
@@ -530,7 +530,8 @@ cd simplicio-loop
530
530
  # install for your runtime (omit <runtime> to auto-detect)
531
531
  bash scripts/install.sh <runtime> [--global] [--minimal] # macOS / Linux
532
532
  pwsh scripts/install.ps1 <runtime> [-Global] # Windows
533
- # <runtime> ∈ claude codex vscode cursor antigravity kiro opencode gemini aider hermes openclaw
533
+ # <runtime> ∈ claude codex vscode cursor antigravity kiro opencode gemini aider simplicio_agent openclaw
534
+ # (hermes still accepted as a legacy alias for simplicio_agent)
534
535
  ```
535
536
 
536
537
  **The repo installer is full-stack by default — it installs everything.** One command sets up the whole stack:
@@ -538,7 +539,7 @@ the loop operator package (`simplicio-cli`, which exposes `simplicio-dev-cli` an
538
539
  `simplicio-mapper` transitively, auto-handling PEP 668 / externally-managed Python and symlinking
539
540
  the binaries onto `PATH`), the **full Python stack** (the package itself),
540
541
  the **7 skills + hooks** with the loop's Stop hook wired, and the **always-on capture proxy**
541
- with Claude + Codex + Hermes **routed and measured** in the background. The **dashboard opens once** on a
542
+ with Claude + Codex + Simplicio Agent **routed and measured** in the background. The **dashboard opens once** on a
542
543
  fresh install, then it's on-demand (`simplicio-loop dashboard` / `simplicio-economy.sh monitor`); the
543
544
  **menu-bar tray never opens by itself** — nothing is forced to stay open.
544
545
  Pass **`--minimal`** only for headless/CI to skip the heavy deps + the machine services. Verify any time:
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "simplicio-loop"
7
- version = "3.32.5"
7
+ version = "3.34.1"
8
8
  description = "The Universal Looping AI Orchestrator — a runtime-agnostic super-plugin (7 skills) that drains any queue of work end-to-end on any LLM/runtime."
9
9
  readme = "PYPI.md"
10
10
  requires-python = ">=3.8"
@@ -24,7 +24,7 @@ classifiers = [
24
24
  # The simplicio-loop drive requires the operator package (`simplicio-cli`), which exposes
25
25
  # `simplicio-dev-cli` and also brings the survey binary `simplicio-mapper` transitively.
26
26
  dependencies = [
27
- "simplicio-cli>=0.11.0",
27
+ "simplicio-cli>=0.16.1",
28
28
  ]
29
29
 
30
30
  # Optional: the real embedding backend for `simplicio-cli semantic --ml` / `simplicio-cli rag --ml`.
@@ -13,6 +13,6 @@ try:
13
13
  try:
14
14
  __version__ = _v("simplicio-loop")
15
15
  except PackageNotFoundError:
16
- __version__ = "3.32.5"
16
+ __version__ = "3.34.0"
17
17
  except Exception: # pragma: no cover
18
- __version__ = "3.32.5"
18
+ __version__ = "3.34.0"
@@ -114,7 +114,7 @@ Add (paths relative to the repo root, or absolute):
114
114
  `orient_clamp.py`. Claude has no `afterAgentResponse`; `loop_stop.py` folds capture in by
115
115
  reading the transcript, so `loop_capture.py` isn't needed there.
116
116
 
117
- ### Other runtimes (Codex, Gemini, Aider, OpenCode, Kiro, Antigravity, Hermes, OpenClaw)
117
+ ### Other runtimes (Codex, Gemini, Aider, OpenCode, Kiro, Antigravity, Simplicio Agent, OpenClaw)
118
118
  Most don't expose a stop hook. Use the **no-hook fallback**: the `simplicio-loop` skill
119
119
  self-paces via the host scheduler (`/loop`, OS cron, or the runtime's task scheduler), and
120
120
  `orient_clamp.py` is invoked directly. See `adapters/<runtime>/` for the per-runtime entry.
@@ -725,6 +725,22 @@ def latest_completion_receipt():
725
725
  return None
726
726
 
727
727
 
728
+ def maintenance_deferred_receipt():
729
+ """Return the active maintenance-deferred completion receipt, if any.
730
+
731
+ Backlog-only maintenance is explicitly incomplete: the loop must hand off
732
+ with the durable receipt instead of honoring a fresh completion promise.
733
+ Unreadable or unrelated receipts are treated as absent.
734
+ """
735
+ try:
736
+ receipt = latest_completion_receipt() or {}
737
+ if receipt.get("ready") is False and receipt.get("reason_code") == "maintenance_deferred":
738
+ return receipt
739
+ except Exception:
740
+ pass
741
+ return None
742
+
743
+
728
744
  def completion_oracle_payload(response_text="", flow_gap=""):
729
745
  try:
730
746
  repo_root = os.getcwd()
@@ -947,23 +963,19 @@ def main():
947
963
  # Completion detection is centralized in the shared oracle (#138). The stop hook can still
948
964
  # surface watcher/flow state in the re-feed header below, but it no longer decides COMPLETE
949
965
  # on its own.
966
+ deferred_receipt = maintenance_deferred_receipt()
967
+ if deferred_receipt:
968
+ write_handoff("maintenance deferred (backlog-only mode active)", meta, body)
969
+ cleanup_and_stop()
950
970
  if promise and resp:
951
971
  oracle = completion_oracle_payload(resp, flow_gap or "")
952
972
  if oracle.get("ready") and os.path.exists(str(oracle.get("receipt_path") or "")):
953
973
  _call_simplicio_hbp_append(iteration, promise, watcher_tag)
954
974
  refresh_cross_agent_wiki(include_handoff=False)
955
975
  cleanup_and_stop() # (3) promise fulfilled → stop, no handoff needed
956
- # Legacy converge fixtures and lightweight installs predate persisted run artifacts.
957
- # Preserve their evidence-gated contract only when the oracle explicitly reports that
958
- # no run directory exists; every persisted run remains exclusively oracle-authorized.
959
- if oracle.get("reason_code") == "run_dir_missing":
960
- match = PROMISE_RE.search(resp)
961
- if (match and match.group(1).strip() == promise.strip()
962
- and ((not evidence_required) or has_evidence)
963
- and watcher_pass and not anchor_pending() and not flow_gap):
964
- _call_simplicio_hbp_append(iteration, promise, watcher_tag)
965
- refresh_cross_agent_wiki(include_handoff=False)
966
- cleanup_and_stop()
976
+ # A promise is never sufficient without a persisted run receipt. The old
977
+ # lightweight fallback was a fail-open completion bypass (#138); missing run
978
+ # artifacts remain DELIVERY_PENDING and the loop continues or hands off at cap.
967
979
  # (3') Cursor capture may have raised the flag.
968
980
  if os.path.exists(DONE_FLAG) or os.path.exists(LEGACY_DONE_FLAG):
969
981
  oracle = completion_oracle_payload(flow_gap=flow_gap or "")
@@ -23,6 +23,7 @@ import subprocess
23
23
  import sys
24
24
  import tempfile
25
25
  import time
26
+ import urllib.parse
26
27
  from pathlib import Path
27
28
 
28
29
  HOME = os.path.expanduser("~")
@@ -43,7 +44,8 @@ SAVINGS_JSON_CANDIDATES = [
43
44
  # Raw proxy log (Simplicio-named first; engine dir kept for back-compat).
44
45
  LOG_CANDIDATES = [
45
46
  Path(HOME) / ".simplicio" / "logs" / "proxy.log",
46
- Path(HOME) / ".hermes" / "logs" / "simplicio-proxy.log",
47
+ Path(HOME) / ".simplicio-agent" / "logs" / "simplicio-proxy.log",
48
+ Path(HOME) / ".hermes" / "logs" / "simplicio-proxy.log", # legacy alias, compat window
47
49
  ]
48
50
  LOGO_CANDIDATES = [
49
51
  REPO_ROOT / "assets" / "simplicio-loop-logo.png",
@@ -52,6 +54,9 @@ LOGO_CANDIDATES = [
52
54
  # Cross-platform temp dir (Windows has no /tmp) — must match simplicio_loop/cli.py PID_FILE.
53
55
  PID_FILE = Path(tempfile.gettempdir()) / "simplicio-token-monitor.pid"
54
56
  PROXY_PORT = os.environ.get("SIMPLICIO_PROXY_PORT", "8788")
57
+ # Optional run projection for the visual dashboard. It is deliberately opt-in: the token
58
+ # monitor remains useful without a repository checkout or an active loop run.
59
+ PROGRESS_RUN = os.environ.get("SIMPLICIO_PROGRESS_RUN", "").strip()
55
60
  # Engine call: the native Simplicio engine module, invoked cross-platform via this interpreter.
56
61
  ENGINE_CMD = [sys.executable or "python3", str(REPO_ROOT / "engine" / "simplicio_engine.py")]
57
62
 
@@ -65,7 +70,8 @@ RUNTIMES = [
65
70
  {"name": "Codex", "load": "AGENTS.md", "loop": "self-paced", "state": "partial", "intercept": "native", "logo": "openai", "proc": r"\bcodex\b", "families": ["openai"]},
66
71
  {"name": "VS Code", "load": "copilot instructions", "loop": "tasks", "state": "partial", "intercept": "native", "logo": "vscode", "proc": r"Visual Studio Code|Code Helper|Copilot", "families": ["openai"]},
67
72
  {"name": "OpenClaw", "load": "plugin SDK", "loop": "native loop", "state": "native", "intercept": "native", "logo": "openclaw", "proc": r"openclaw", "families": ["openai", "anthropic"]},
68
- {"name": "Hermes", "load": "native recall", "loop": "native loop", "state": "native", "intercept": "baseurl", "logo": "hermes", "proc": r"hermes", "families": ["deepseek", "openai"]},
73
+ {"name": "Simplicio Agent", "load": "native recall", "loop": "native loop", "state": "native", "intercept": "baseurl", "logo": "simplicio_agent", "proc": r"simplicio-agent", "families": ["deepseek", "openai"]},
74
+ {"name": "Hermes (legacy)", "load": "native recall", "loop": "native loop", "state": "native", "intercept": "baseurl", "logo": "hermes", "proc": r"hermes", "families": ["deepseek", "openai"]},
69
75
  {"name": "Cursor", "load": ".cursor-plugin", "loop": "Stop hook", "state": "full", "intercept": "baseurl", "logo": "cursor", "proc": r"Cursor\.app|Cursor Helper", "families": ["openai", "anthropic"]},
70
76
  {"name": "OpenCode", "load": "AGENTS.md", "loop": "self-paced", "state": "partial", "intercept": "baseurl", "logo": "opencode", "proc": r"opencode", "families": ["openai", "anthropic"]},
71
77
  {"name": "Gemini", "load": "GEMINI.md", "loop": "self-paced", "state": "partial", "intercept": "none", "logo": "gemini", "proc": r"\bgemini\b", "families": []},
@@ -364,6 +370,11 @@ BODY = """<div class="wrap">
364
370
  </section>
365
371
  </div>
366
372
 
373
+ <section class="panel" id="progressPanel" hidden>
374
+ <div class="panel-head"><div class="title">loop progress · live receipt</div><div class="meta" id="progressMeta">waiting</div></div>
375
+ <div class="panel-body"><pre class="log" id="progressCard" aria-live="polite"></pre></div>
376
+ </section>
377
+
367
378
  <div class="footer">
368
379
  <span><span class="tm-g">Simplicio</span> <span class="tm-y">Token Monitor</span> · simplicio-loop</span>
369
380
  <span id="footMeta">--</span>
@@ -372,12 +383,25 @@ BODY = """<div class="wrap">
372
383
 
373
384
  SCRIPT = """<script>
374
385
  const GAUGE_CIRC = 327;
386
+ const PROGRESS_RUN = __PROGRESS_RUN__;
387
+ async function refreshProgress(){
388
+ if(!PROGRESS_RUN) return;
389
+ const panel=document.getElementById('progressPanel'); panel.hidden=false;
390
+ try{
391
+ const r=await fetch('/api/progress?run='+encodeURIComponent(PROGRESS_RUN),{cache:'no-store'});
392
+ const d=await r.json();
393
+ document.getElementById('progressMeta').textContent=(d.run_id||PROGRESS_RUN)+' · '+(d.status||'UNVERIFIED');
394
+ document.getElementById('progressCard').textContent=(d.label||'Progress')+' · '+String(d.percent??0)+'%\n'+
395
+ 'gates: '+JSON.stringify(d.gates||{})+'\n'+(d.blockers||[]).map(x=>'blocker: '+x).join('\n');
396
+ }catch(e){ document.getElementById('progressMeta').textContent='UNVERIFIED · '+e; }
397
+ }
375
398
  // Compact brand monograms for each LLM/runtime (recognizable marks, brand-tinted).
376
399
  const LOGOS = {
377
400
  claude:'<svg viewBox="0 0 24 24"><g stroke="#d97757" stroke-width="2.1" stroke-linecap="round"><path d="M12 3v18M3 12h18M5.5 5.5l13 13M18.5 5.5l-13 13"/></g></svg>',
378
401
  openai:'<svg viewBox="0 0 24 24"><g fill="none" stroke="#10a37f" stroke-width="1.8"><circle cx="12" cy="12" r="8"/><path d="M12 4v16M5 8l14 8M5 16l14-8"/></g></svg>',
379
402
  vscode:'<svg viewBox="0 0 24 24"><path fill="#3aa0e3" d="M17 2l5 2.5v15L17 22l-9-8 3-3 6 5V8l-6 5-3-3z"/><path fill="#3aa0e3" opacity=".55" d="M8 11L4 8 6 7l3 2.5z"/></svg>',
380
403
  openclaw:'<svg viewBox="0 0 24 24"><g fill="none" stroke="#ff7a3c" stroke-width="2.1" stroke-linecap="round"><path d="M6 4c0 6 1.5 11 6 14M12 4c.5 6 .3 11 0 14M18 4c0 6-1.5 11-6 14"/></g></svg>',
404
+ simplicio_agent:'<svg viewBox="0 0 24 24"><g stroke="#e0b341" stroke-width="2" fill="none" stroke-linecap="round"><path d="M9 5v14M15 5v14M9 12h6"/><path d="M7 8c-2.2 0-3.5 1.2-3.5 1.2M17 8c2.2 0 3.5 1.2 3.5 1.2" stroke-width="1.4"/></g></svg>',
381
405
  hermes:'<svg viewBox="0 0 24 24"><g stroke="#e0b341" stroke-width="2" fill="none" stroke-linecap="round"><path d="M9 5v14M15 5v14M9 12h6"/><path d="M7 8c-2.2 0-3.5 1.2-3.5 1.2M17 8c2.2 0 3.5 1.2 3.5 1.2" stroke-width="1.4"/></g></svg>',
382
406
  cursor:'<svg viewBox="0 0 24 24"><path fill="#cfd2d6" opacity=".28" d="M12 3l8 4.5v9L12 21l-8-4.5v-9z"/><path fill="none" stroke="#cfd2d6" stroke-width="1.5" stroke-linejoin="round" d="M12 3l8 4.5v9L12 21l-8-4.5v-9zM12 12l8-4.5M12 12v9M12 12L4 7.5"/></svg>',
383
407
  opencode:'<svg viewBox="0 0 24 24"><rect x="3" y="4" width="18" height="16" rx="2.5" fill="none" stroke="#9dff1a" stroke-width="1.6"/><path d="M7 9l3 3-3 3M13 15h4" fill="none" stroke="#9dff1a" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/></svg>',
@@ -558,7 +582,7 @@ async function refresh(){
558
582
  document.getElementById('stats').innerHTML=card('error',e.message,'red','',0,'red');
559
583
  }
560
584
  }
561
- setInterval(refresh,3000); refresh();
585
+ setInterval(refresh,3000); refresh(); setInterval(refreshProgress,1500); refreshProgress();
562
586
  </script>"""
563
587
 
564
588
  HTML = """<!DOCTYPE html>
@@ -586,7 +610,8 @@ _FAVICON = "data:image/svg+xml;base64," + _b64.b64encode(BADGE_SVG.encode()).dec
586
610
  # Inline the badge into BODY first (re.sub does not re-scan replacement text), then
587
611
  # single-pass substitution — atomic per token, so a slot value can't expand a later slot.
588
612
  BODY = BODY.replace("__BADGE__", BADGE_SVG)
589
- _SLOTS = {"__FAVICON__": _FAVICON, "__STYLE__": STYLE, "__BODY__": BODY, "__SCRIPT__": SCRIPT}
613
+ _SLOTS = {"__FAVICON__": _FAVICON, "__STYLE__": STYLE, "__BODY__": BODY,
614
+ "__SCRIPT__": SCRIPT.replace("__PROGRESS_RUN__", json.dumps(PROGRESS_RUN))}
590
615
  HTML = _re.sub(r"__(?:FAVICON|STYLE|BODY|SCRIPT)__", lambda m: _SLOTS[m.group(0)], HTML)
591
616
 
592
617
 
@@ -848,9 +873,56 @@ def _send_logo(handler):
848
873
  handler.wfile.write(_fallback_logo_svg().encode())
849
874
 
850
875
 
876
+ _RUN_ID = re.compile(r"^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$")
877
+
878
+
879
+ def _progress_root():
880
+ configured = os.environ.get("SIMPLICIO_RUNS_DIR", "")
881
+ return Path(configured).expanduser() if configured else Path.cwd() / ".orchestrator" / "runs"
882
+
883
+
884
+ def _progress_response(run_id):
885
+ """Return one receipt-backed progress snapshot without allowing path traversal."""
886
+ base = _progress_root().resolve()
887
+ if not run_id or not _RUN_ID.fullmatch(run_id):
888
+ return 400, {"schema": "simplicio.progress/v1", "status": "UNVERIFIED",
889
+ "reason_code": "run_id_invalid"}
890
+ run_dir = (base / run_id).resolve()
891
+ try:
892
+ run_dir.relative_to(base)
893
+ except ValueError:
894
+ return 400, {"schema": "simplicio.progress/v1", "status": "UNVERIFIED",
895
+ "reason_code": "run_id_outside_root"}
896
+ state_path = run_dir / "state.json"
897
+ if not state_path.is_file():
898
+ return 404, {"schema": "simplicio.progress/v1", "status": "UNVERIFIED",
899
+ "run_id": run_id, "reason_code": "run_not_found"}
900
+ try:
901
+ from simplicio_loop.progress import build_progress
902
+ state = json.loads(state_path.read_text(encoding="utf-8"))
903
+ if not isinstance(state, dict):
904
+ raise ValueError("state_not_object")
905
+ return 200, build_progress(state, run_dir=run_dir)
906
+ except (OSError, ValueError, TypeError, ImportError, json.JSONDecodeError):
907
+ return 422, {"schema": "simplicio.progress/v1", "status": "UNVERIFIED",
908
+ "run_id": run_id, "reason_code": "state_invalid"}
909
+
910
+
911
+ def _send_json(handler, status, payload):
912
+ body = json.dumps(payload, ensure_ascii=False, sort_keys=True).encode("utf-8")
913
+ handler.send_response(status)
914
+ handler.send_header("Content-Type", "application/json; charset=utf-8")
915
+ handler.send_header("Access-Control-Allow-Origin", "*")
916
+ handler.send_header("Cache-Control", "no-store")
917
+ handler.send_header("Content-Length", str(len(body)))
918
+ handler.end_headers()
919
+ handler.wfile.write(body)
920
+
921
+
851
922
  class Handler(http.server.BaseHTTPRequestHandler):
852
923
  def do_GET(self):
853
- path = self.path.split("?", 1)[0]
924
+ parsed = urllib.parse.urlsplit(self.path)
925
+ path = parsed.path
854
926
  if path == "/api/status":
855
927
  self.send_response(200)
856
928
  self.send_header("Content-Type", "application/json")
@@ -858,6 +930,11 @@ class Handler(http.server.BaseHTTPRequestHandler):
858
930
  self.send_header("Cache-Control", "no-cache")
859
931
  self.end_headers()
860
932
  self.wfile.write(json.dumps(get_status()).encode())
933
+ elif path == "/api/progress":
934
+ query = urllib.parse.parse_qs(parsed.query, keep_blank_values=True)
935
+ run_id = (query.get("run") or [""])[0]
936
+ status, payload = _progress_response(run_id)
937
+ _send_json(self, status, payload)
861
938
  elif path == "/assets/simplicio-logo.png":
862
939
  _send_logo(self)
863
940
  else:
@@ -223,7 +223,9 @@ def cmd_capture():
223
223
  git_log = _git_log()
224
224
  git_diff = _git_diff_stat()
225
225
  branch = _git_branch()
226
- agent = os.environ.get("HERMES_PROFILE", os.environ.get("CLAUDE_PROFILE", "unknown"))
226
+ agent = os.environ.get("SIMPLICIO_AGENT_PROFILE",
227
+ os.environ.get("HERMES_PROFILE", # legacy alias, compat window
228
+ os.environ.get("CLAUDE_PROFILE", "unknown")))
227
229
 
228
230
  # Extract goal from scratchpad
229
231
  goal = scratchpad
@@ -526,7 +528,8 @@ def cmd_status():
526
528
 
527
529
  def cmd_selftest():
528
530
  origin = REPO
529
- prior_env = os.environ.get("HERMES_PROFILE")
531
+ prior_env = os.environ.get("SIMPLICIO_AGENT_PROFILE")
532
+ prior_legacy_env = os.environ.get("HERMES_PROFILE")
530
533
  try:
531
534
  with tempfile.TemporaryDirectory() as tmp:
532
535
  _set_repo(tmp)
@@ -558,7 +561,8 @@ def cmd_selftest():
558
561
  "status": "MEASURED",
559
562
  "checked_at": "2026-07-01T00:00:00Z",
560
563
  }))
561
- os.environ["HERMES_PROFILE"] = "selftest"
564
+ os.environ["SIMPLICIO_AGENT_PROFILE"] = "selftest"
565
+ os.environ.pop("HERMES_PROFILE", None)
562
566
 
563
567
  cmd_capture()
564
568
  cmd_summary()
@@ -577,9 +581,13 @@ def cmd_selftest():
577
581
  finally:
578
582
  _set_repo(origin)
579
583
  if prior_env is None:
584
+ os.environ.pop("SIMPLICIO_AGENT_PROFILE", None)
585
+ else:
586
+ os.environ["SIMPLICIO_AGENT_PROFILE"] = prior_env
587
+ if prior_legacy_env is None:
580
588
  os.environ.pop("HERMES_PROFILE", None)
581
589
  else:
582
- os.environ["HERMES_PROFILE"] = prior_env
590
+ os.environ["HERMES_PROFILE"] = prior_legacy_env
583
591
 
584
592
 
585
593
  def main():
@@ -22,7 +22,7 @@ and safety details.
22
22
 
23
23
  ## Normative contract (non-negotiable)
24
24
 
25
- These invariants are MUST-level. Any runtime that loads this skill (Hermes, Claude, Cursor, or a
25
+ These invariants are MUST-level. Any runtime that loads this skill (Simplicio Agent, Claude, Cursor, or a
26
26
  bare LLM) follows them mechanically — no paraphrase, no drift:
27
27
 
28
28
  1. **Evidence-gated exit.** The loop MUST NOT terminate without concrete evidence, produced in the
@@ -245,7 +245,7 @@ flat mode. Full phase table + usage: **`references/hierarchical-planner.md`**.
245
245
 
246
246
  Every turn's key decisions, findings, and dead-ends are captured into a persistent markdown wiki
247
247
  at `.orchestrator/wiki/` (`scripts/cross_agent_wiki.py capture|summary|handoff|status`) — a
248
- per-project, cross-agent, zero-friction knowledge base that survives across agent vendors (Hermes
248
+ per-project, cross-agent, zero-friction knowledge base that survives across agent vendors (Simplicio Agent
249
249
  → Claude Code → Codex): a fresh agent reads it and sees "where we left off" with no transcript.
250
250
  Plain markdown, no vector DB. Full structure + per-turn mechanics:
251
251
  **`references/cross-agent-wiki.md`**.
@@ -0,0 +1,79 @@
1
+ # Control policy — RunProjection → LoopDecision (issue #261)
2
+
3
+ `simplicio_loop/control_policy.py` is a pure convergence policy, not a second control plane. It
4
+ takes an immutable `RunProjection` snapshot and returns a `LoopDecision`. It never opens a file,
5
+ runs a subprocess, or keeps a parallel ledger — every input and output is a plain dict, which is
6
+ what makes that guarantee structural rather than a convention to remember. The Runtime (or, in
7
+ this repo, whatever driver adopts this module) remains the sole owner of queue, lease, attempt
8
+ budget, effects, and the event log; this module only recommends a decision.
9
+
10
+ ## V(t) — the drift candidate
11
+
12
+ ```
13
+ V = a·acs_open + b·verifiers_failed + c·effects_unverified + d·backlog + e·retry_amplification
14
+ ```
15
+
16
+ Weights live in `PolicyWeights` (`a,b,c,d,e`, default `1.0, 1.0, 1.0, 0.25, 1.0`) and are published
17
+ under `WEIGHTS_VERSION = "v1"` (`simplicio_loop.control_policy.WEIGHTS_VERSION`). Calibrate by
18
+ passing a different `PolicyWeights` instance to `decide()` — bump `WEIGHTS_VERSION` when the
19
+ calibrated set changes so a `LoopDecision`'s `weights_version` field stays meaningful across runs.
20
+
21
+ ## `LoopDecision` vocabulary
22
+
23
+ `CONTINUE_SERIAL`, `CONTINUE_PARALLEL`, `OBSERVE_WAIT`, `REPLAN`, `ESCALATE`, `STOP_SUCCESS`,
24
+ `STOP_BLOCKED`, `STOP_BUDGET`, `STOP_UNSAFE` — evaluated in that priority order inside `decide()`:
25
+
26
+ 1. **Hard constraints first, never traded off against V(t).** `hard_constraints.safe` /
27
+ `authorized` / `privacy_ok` false → `STOP_UNSAFE` (`hard_constraint_violation`).
28
+ `hard_constraints.within_budget` false → `STOP_BUDGET` (`budget_exhausted`). Safety, authority,
29
+ privacy, and budget are constraints, not weights — no drift score can outrun them.
30
+ 2. **Success**: `acs_open == 0 and verifiers_failed == 0 and effects_unverified == 0` →
31
+ `STOP_SUCCESS` (`verified`).
32
+ 3. **Explicit external block**: `projection.blocked` or a non-empty `blocked_reason` →
33
+ `STOP_BLOCKED` (reason_code = the supplied `blocked_reason`, or `external_dependency_blocked`).
34
+ This is the terminal state for "no drift is possible right now," distinct from a retryable stall.
35
+ 4. **Drift classification** (`classify_drift`) over `history` + the current tick:
36
+ - `PROGRESS` (negative delta, or no repeat yet) falls through to backpressure.
37
+ - `STALL` past the hysteresis `cooldown` → `REPLAN` (`stall_escalation`).
38
+ - `OSCILLATION` (a period-2..4 cycle of state signatures) past `cooldown` → `ESCALATE`
39
+ (`oscillation_detected`) — this is the case a flat fingerprint-repeat check can never see:
40
+ amplified retries whipsawing between two states without ever converging.
41
+ - Either stall/oscillation signal *under* `cooldown` → `OBSERVE_WAIT` (`hysteresis_hold`): a
42
+ single bad tick must never flip strategy immediately.
43
+ 5. **Backpressure** (`group_candidates`): conflict-free grouping of pending candidates by
44
+ read/write-set overlap, with a simple AIMD cap — a rising `capacity_signal` (errors/queue/
45
+ memory/IO) shrinks the max group size to 1 (multiplicative decrease); a calm signal lets it grow
46
+ by one (additive increase), never a fixed universal worker count. All-conflicting or empty
47
+ candidates → `CONTINUE_SERIAL`; otherwise `CONTINUE_PARALLEL` with the computed `groups`.
48
+
49
+ ## Reason-code vocabulary (reused, not reinvented)
50
+
51
+ `hard_constraint_violation`, `budget_exhausted`, `verified`, `external_dependency_blocked` (or a
52
+ caller-supplied `blocked_reason`), `hysteresis_hold`, `stall_escalation`, `oscillation_detected`,
53
+ `no_conflict_free_parallelism`, `conflict_free_groups`. `verified` and `stall_escalation` are
54
+ reused verbatim from `simplicio_loop/flow_semantics.py` rather than given synonyms.
55
+
56
+ ## Baseline traces (issue #261 Step 0)
57
+
58
+ Six frozen fixtures under `tests/fixtures/control_policy/*.json`, replayed tick-by-tick by
59
+ `tests/test_control_policy.py`: `success` (monotonic negative drift to `STOP_SUCCESS`),
60
+ `flaky_test` (a repeat under the stall threshold that recovers), `blocked_dependency` (an explicit
61
+ `STOP_BLOCKED`, never a silent hang), `duplicate_effect` (never claims `STOP_SUCCESS` while an
62
+ effect is unverified), `overload` (a rising capacity signal shrinks `recommended_concurrency`), and
63
+ `oscillation` (a period-2 cycle that reaches `ESCALATE` within the cooldown window).
64
+
65
+ ## Out of scope here — next steps in `simplicio-runtime`
66
+
67
+ This module is the pure policy layer only. It deliberately does **not** attempt the cross-repo
68
+ acceptance criteria from issue #261, which belong in
69
+ [simplicio-runtime](https://github.com/wesleysimplicio/simplicio-runtime) (parent:
70
+ simplicio-runtime#3134, related: simplicio-runtime#3042):
71
+
72
+ - Migrating the Runtime to be the sole owner of queue, lease, attempt budget, and fan-out — this
73
+ repo's `runner.py`/`remote_queue.py` still run their own scheduling.
74
+ - Swapping full-repo fingerprints for Mapper revision/Merkle handles.
75
+ - Fixing the published package's Python-version support and fan-out packaging/capability manifest.
76
+ - The ≥40% duplicate-call-reduction benchmark (or its refutation) — this requires wiring the
77
+ policy into a real driver loop and measuring call counts before/after.
78
+ - Fault injection (lost event, duplicate event, stale projection, crash, flaky verifier) at the
79
+ Runtime's event-log/queue layer.
@@ -5,7 +5,7 @@ Moved out of `SKILL.md` § Cross-agent persistent wiki as part of the #119 shrin
5
5
  Evolved from the one-shot `HANDOFF.md` pattern (inspired by JesseBrown1980/ai-memory).
6
6
  Every turn's key decisions, findings, and dead-ends are captured into a persistent
7
7
  markdown wiki at `.orchestrator/wiki/` — a per-project, cross-agent, zero-friction
8
- knowledge base that survives across agent vendors (Hermes → Claude Code → Codex).
8
+ knowledge base that survives across agent vendors (Simplicio Agent → Claude Code → Codex).
9
9
 
10
10
  A fresh agent arriving in the repo reads the wiki and sees "where we left off"
11
11
  without needing the prior conversation transcript.
@@ -1,4 +1,4 @@
1
- # Extension points — the 48 named binding points
1
+ # Extension points — the 49 named binding points
2
2
 
3
3
  These are the named points where work happens. For each, if the host runtime exposes a native
4
4
  capability, BIND it (deterministic, local-first, near-zero token). If not, the LLM performs the
@@ -29,6 +29,7 @@ fallback with standard tools. The skill depends on the ABSTRACTION, never on a s
29
29
  | `human_gate` | Async human approval channel | ask user inline |
30
30
  | `shell_exec` | Clamped shell execution (structured output, bounded size) | Bash with `\| head -N` |
31
31
  | `retry` | Classified retry+backoff by failure class | manual retry loop |
32
+ | `convergence_policy` | Pure `RunProjection → LoopDecision` control policy (issue #261): a Lyapunov-style drift candidate V(t) over open ACs/failed verifiers/unverified effects/backlog/retry-amplification, versioned weights, stall **and** period-2+ oscillation detection, hysteresis before REPLAN/ESCALATE, and a conflict-free backpressure/parallelism recommendation (AIMD-style, no fixed worker count). Runnable form: `simplicio_loop/control_policy.py` (`decide()`) — zero I/O, zero subprocess, zero ledger; the Runtime remains sole owner of queue/lease/attempt-budget and applies the recommendation, it never obeys blindly (see `control-policy.md`). | LLM reasons about retry/parallelism by hand from the run journal and current AC/verifier counts |
32
33
  | `status` | Live observability dashboard | `gh` queries |
33
34
  | `security` | Supply-chain / secret scan | `rg` for secrets |
34
35
  | `intake` | Ingest work from sprint/board link — or, with no board, the local backlog (`task_backlog.py next`) | `gh issue list` |
@@ -16,7 +16,7 @@ or install the engine's durable integration for X. Some runtimes can do neither.
16
16
 
17
17
  ## Providers we intercept (the real breadth)
18
18
 
19
- Interception is really about **providers**, not apps. From the Hermes/OpenCode provider lists
19
+ Interception is really about **providers**, not apps. From the Simplicio Agent/OpenCode provider lists
20
20
  (`app/providers.json`, derived from `~/.hermes/models_dev_cache.json` + the active providers),
21
21
  **141 of 144 providers (98%)** are interceptable — every OpenAI-compatible endpoint (139) plus
22
22
  Anthropic (2). Only 3 are Google-native (`google`, `vertex`, `gemini`) and need their own shim.
@@ -44,7 +44,7 @@ elsewhere, with a headless print fallback.
44
44
  | Tier | Runtimes | How capture is wired | Notes |
45
45
  |---|---|---|---|
46
46
  | **native** | Claude · Codex · VS Code (Copilot) · OpenClaw | `simplicio-cli capture init <client>` (engine's durable hooks + **transparent** provider routing) | Forwards to the client's REAL provider — does not change the model. |
47
- | **base-url** | Hermes · Cursor · OpenCode | point the client's model `base_url` at `http://127.0.0.1:<port>` (OpenAI/Anthropic-compatible) | Hermes is wired this way today (→ DeepSeek). |
47
+ | **base-url** | Simplicio Agent · Cursor · OpenCode | point the client's model `base_url` at `http://127.0.0.1:<port>` (OpenAI/Anthropic-compatible) | Simplicio Agent is wired this way today (→ DeepSeek). |
48
48
  | **none** | Gemini · Kiro · Antigravity | — | Proprietary Google/AWS APIs the proxy can't speak; not interceptable yet. |
49
49
 
50
50
  **7 of 10 runtimes are interceptable; 3 are not.** The dashboard shows this live with per-runtime
@@ -53,7 +53,7 @@ logos and tier badges, and dims the non-interceptable ones.
53
53
  ## Critical caveat — proxy backend
54
54
 
55
55
  A single proxy forwards to **one upstream**. The proxy installed by `setup_simplicio.sh` targets
56
- DeepSeek (for Hermes). If you route a *different* client (e.g. Codex) through that same proxy, its
56
+ DeepSeek (for Simplicio Agent). If you route a *different* client (e.g. Codex) through that same proxy, its
57
57
  requests also go to DeepSeek — that's a **model swap, not transparent capture**.
58
58
 
59
59
  For real multi-runtime capture you want the engine's **transparent provider routing** (each client
@@ -96,12 +96,12 @@ bash scripts/simplicio-economy.sh capture anthropic
96
96
  ```
97
97
 
98
98
  `status` reports: capture proxy, token monitor (`:9090`), menu-bar tray, the deterministic operator
99
- `simplicio-dev-cli`, the **auto-capture wiring** (Claude · Codex/OpenAI · Hermes), and lifetime savings.
99
+ `simplicio-dev-cli`, the **auto-capture wiring** (Claude · Codex/OpenAI · Simplicio Agent), and lifetime savings.
100
100
 
101
101
  ### `wire` — all three runtimes measured, automatically
102
102
 
103
- `wire` (run by `setup_simplicio.sh` at the end of install) makes the monitor measure **Hermes +
104
- Claude + Codex** with no manual step. It sets, in the shell profile (cross-platform via
103
+ `wire` (run by `setup_simplicio.sh` at the end of install) makes the monitor measure **Simplicio
104
+ Agent + Claude + Codex** with no manual step. It sets, in the shell profile (cross-platform via
105
105
  `install_services.py wire` — `setx` on Windows):
106
106
 
107
107
  - `OPENAI_BASE_URL = http://127.0.0.1:<port>/v1` → Codex / Cursor / OpenCode / any OpenAI client
@@ -121,4 +121,4 @@ A **transparent** capture proxy (`--openai-api-url https://api.openai.com/v1`) w
121
121
  gpt-5.4-2026-03-05`, `usage` 108+4 tokens) and the proxy's own `/stats` recorded
122
122
  `api_requests: 4`, `primary_model: gpt-4o-mini`, `total_tokens_before: 124`. Proof that routing an
123
123
  OpenAI client through the transparent proxy **captures its tokens without changing its model** — the
124
- correct way to capture Codex/Cursor/OpenCode, kept separate from the Hermes→DeepSeek proxy.
124
+ correct way to capture Codex/Cursor/OpenCode, kept separate from the Simplicio Agent→DeepSeek proxy.
@@ -141,7 +141,7 @@ Detect platform once: `python3 -c "import platform; print(platform.system())"`
141
141
  | Comment / close | `gh issue comment N --body "…"` · `gh issue close N` |
142
142
  | Workflow dispatch | `gh api repos/{owner}/{repo}/dispatches -f event_type=X` |
143
143
 
144
- ### node (vscode, openclaw, claude-code) / python (hermes)
144
+ ### node (vscode, openclaw, claude-code) / python (simplicio-agent, formerly hermes)
145
145
  | intent | command |
146
146
  |---|---|
147
147
  | Deterministic install | `npm ci` · `pnpm install --frozen-lockfile` · `uv sync --locked` |
@@ -160,7 +160,7 @@ Detect platform once: `python3 -c "import platform; print(platform.system())"`
160
160
  | Azure login / acct | `az login` · `az account show -o json` |
161
161
  | Azure DevOps boards (if used) | `az boards work-item show --id N` · `az boards query --wiql "…"` · `az repos pr list` · `az pipelines runs list` |
162
162
 
163
- > NOTE: the 5 scanned local repos (hermes-agent, openclaw, vscode, codex, claude-code) use
163
+ > NOTE: the 5 scanned local repos (simplicio-agent (formerly hermes-agent), openclaw, vscode, codex, claude-code) use
164
164
  > **GitHub (`gh`) + GitHub Actions exclusively** — no Azure DevOps. The `az`/`az boards` rows are
165
165
  > provided for repos that DO use Azure DevOps; bind them as a `source_adapter` only when detected.
166
166
 
@@ -34,7 +34,7 @@ npx playwright install --with-deps chromium
34
34
  PWTEST_OUTPUT_DIR=.orchestrator/tee/web npx playwright test --trace on --output .orchestrator/tee/web
35
35
  ```
36
36
 
37
- **Fallback B — playwright-python / pytest (Python repos, e.g. hermes-agent):**
37
+ **Fallback B — playwright-python / pytest (Python repos, e.g. the Simplicio Agent repo, formerly hermes-agent):**
38
38
  ```bash
39
39
  pip install playwright pytest-playwright && playwright install chromium
40
40
  pytest --tracing retain-on-failure --output .orchestrator/tee/web
@@ -17,7 +17,7 @@ mention `/simplicio-tasks` keep working without breaking.
17
17
 
18
18
  | Need depth on… | Read |
19
19
  |---|---|
20
- | the 48 extension points + fallbacks | `references/extension-points.md` |
20
+ | the 49 extension points + fallbacks | `references/extension-points.md` |
21
21
  | token economy (catalog, caps, clamp, tee+CCR, terminal table) | `references/token-economy.md` |
22
22
  | discover / intake / route / autoscale / speed / model-routing | `references/orchestration.md` |
23
23
  | quality loop · safety gates · delivery · feedback | `references/quality-safety-delivery.md` |