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.
- {simplicio_loop-3.32.5/simplicio_loop.egg-info → simplicio_loop-3.34.1}/PKG-INFO +3 -3
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/PYPI.md +1 -1
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/README.md +8 -7
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/pyproject.toml +2 -2
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/__init__.py +2 -2
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/hooks/README.md +1 -1
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/hooks/loop_stop.py +23 -11
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/hooks/simplicio_dashboard.py +82 -5
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/scripts/cross_agent_wiki.py +12 -4
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/SKILL.md +2 -2
- simplicio_loop-3.34.1/simplicio_loop/_bundle/skills/simplicio-loop/references/control-policy.md +79 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/cross-agent-wiki.md +1 -1
- {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
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/token-capture.md +7 -7
- {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
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/web-evidence.md +1 -1
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-tasks/SKILL.md +1 -1
- {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
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-tasks/references/token-capture.md +7 -7
- {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
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-tasks/references/web-evidence.md +1 -1
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/tests/test_cross_agent_wiki.py +30 -3
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1/simplicio_loop/_bundle}/tests/test_loop_e2e.py +35 -0
- simplicio_loop-3.34.1/simplicio_loop/agent_contract.py +151 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/cli.py +16 -2
- simplicio_loop-3.34.1/simplicio_loop/control_policy.py +242 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/execution_board.py +139 -6
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/oracle.py +5 -1
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/remote_queue.py +56 -40
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/runner.py +499 -13
- simplicio_loop-3.34.1/simplicio_loop/verified_delivery.py +158 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/work_item_claims.py +50 -32
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1/simplicio_loop.egg-info}/PKG-INFO +3 -3
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop.egg-info/SOURCES.txt +16 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop.egg-info/requires.txt +1 -1
- simplicio_loop-3.34.1/tests/test_agent_contract.py +63 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_cli_oracle.py +1 -1
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_completion_oracle_matrix.py +62 -51
- simplicio_loop-3.34.1/tests/test_control_policy.py +182 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_cross_agent_wiki.py +30 -3
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_dashboard_hook.py +24 -0
- simplicio_loop-3.34.1/tests/test_distributed_183_e2e.py +44 -0
- simplicio_loop-3.34.1/tests/test_distributed_183_external_probe.py +83 -0
- simplicio_loop-3.34.1/tests/test_distributed_epic_evidence.py +43 -0
- simplicio_loop-3.34.1/tests/test_execution_board_e2e.py +167 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_fan_out_scheduler.py +26 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_independent_watcher.py +31 -1
- simplicio_loop-3.34.1/tests/test_live_issue_183_identity.py +157 -0
- {simplicio_loop-3.32.5/simplicio_loop/_bundle → simplicio_loop-3.34.1}/tests/test_loop_e2e.py +35 -0
- simplicio_loop-3.34.1/tests/test_maintenance_deferred_docs.py +23 -0
- simplicio_loop-3.34.1/tests/test_merge_queue_live_probe.py +136 -0
- simplicio_loop-3.34.1/tests/test_planes_installed_e2e.py +45 -0
- simplicio_loop-3.34.1/tests/test_release_manifest.py +45 -0
- simplicio_loop-3.34.1/tests/test_remote_queue.py +259 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_runner_cli.py +62 -23
- simplicio_loop-3.34.1/tests/test_runner_progress_events.py +57 -0
- simplicio_loop-3.34.1/tests/test_runtime_matrix.py +43 -0
- simplicio_loop-3.34.1/tests/test_verified_delivery.py +79 -0
- simplicio_loop-3.34.1/tests/test_watcher_binding.py +103 -0
- simplicio_loop-3.34.1/tests/test_watcher_challenge_generation.py +101 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_work_item_claims.py +27 -18
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_worktree_queue.py +14 -11
- simplicio_loop-3.32.5/simplicio_loop/agent_contract.py +0 -79
- simplicio_loop-3.32.5/tests/test_agent_contract.py +0 -33
- simplicio_loop-3.32.5/tests/test_execution_board_e2e.py +0 -42
- simplicio_loop-3.32.5/tests/test_remote_queue.py +0 -111
- simplicio_loop-3.32.5/tests/test_watcher_binding.py +0 -23
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/LICENSE +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/MANIFEST.in +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/setup.cfg +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/hooks/action_gate.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/hooks/hooks.claude.json +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/hooks/hooks.json +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/hooks/loop_capture.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/hooks/orient_clamp.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/hooks/orient_rewrite.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/hooks/pre-commit.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/hooks/simplicio_watch.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/scripts/hierarchical_planner.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-autoresearch/SKILL.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-compress/SKILL.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-learn/SKILL.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/agentsview-adapter.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/azure-devops-adapter.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/bound-operators.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/claims-gate.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/cross-repo-integration.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/hierarchical-planner.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/lmcache-adapter.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/orchestration.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/quality-safety-delivery.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/run-journal-stall-detector.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/spindle-handoff.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/standing-loop-247.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/triage-verify-detail.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/understand-anything-adapter.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-loop/references/video-evidence.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-orient/SKILL.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-review/SKILL.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-tasks/references/agentsview-adapter.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-tasks/references/azure-devops-adapter.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-tasks/references/lmcache-adapter.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-tasks/references/orchestration.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-tasks/references/quality-safety-delivery.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-tasks/references/standing-loop-247.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-tasks/references/understand-anything-adapter.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/skills/simplicio-tasks/references/video-evidence.md +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/tests/_selfrun.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/attempt_journal.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/budget.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/delivery.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/drain.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/driver_contract.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/evidence.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/flow_semantics.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/ops_ledger.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/phase_events.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/plan_contract.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/progress.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/recovery.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/runtime_adapter.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/source_state.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/task_contract.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop.egg-info/dependency_links.txt +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop.egg-info/entry_points.txt +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop.egg-info/top_level.txt +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_action_gate.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_agent_identity.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_agentsview_adapter.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_attempt_journal.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_autoresearch.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_az_boards_adapter.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_budget.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_check_e2e_demo_contract.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_check_e2e_installed.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_claims_audit.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_claims_manifest_unit.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_clean_env_contract.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_completion_oracle.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_delivery_reconciliation.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_delivery_source_identity.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_doctor_smoke.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_drain.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_drain_cli.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_driver_contract.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_e2e_demo_audit.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_evidence_chain.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_evidence_receipt.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_fan_out_flow.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_fan_out_unit.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_flow_audit.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_flow_semantics.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_golden_mutation.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_hbp_topics.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_hierarchical_planner.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_hooks_coverage.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_impact_audit.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_install_lib.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_learn_pipeline_removed.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_ledger_cli.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_locked_append.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_mirror_parity.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_operator_batch.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_operator_worktree_batch.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_ops_ledger.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_phase_events.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_plan_contract.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_planes_golden_eval.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_precommit_bundle_sync.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_preflight.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_progress.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_progress_snapshots.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_recovery.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_remote_queue_live.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_repo_conventions_architecture.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_runtime_adapter.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_schema_verify_integration.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_schema_verify_unit.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_simplicio_mcp_runner.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_system_check.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_task_backlog.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_task_contract_cli.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_task_contract_unit.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_task_to_delivery_golden_corpus.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_token_budget.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_toon_codec.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_verify_adapters_integration.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_worker_cli_contract.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_worker_selftests.py +0 -0
- {simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/tests/test_worker_smoke.py +0 -0
- {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.
|
|
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.
|
|
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-
|
|
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
|
-
| **
|
|
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
|
-
| **
|
|
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
|
|
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 +
|
|
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
|
|
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 +
|
|
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.
|
|
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.
|
|
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`.
|
|
@@ -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,
|
|
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
|
-
#
|
|
957
|
-
#
|
|
958
|
-
#
|
|
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 "")
|
{simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/hooks/simplicio_dashboard.py
RENAMED
|
@@ -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) / ".
|
|
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": "
|
|
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,
|
|
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
|
-
|
|
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:
|
{simplicio_loop-3.32.5 → simplicio_loop-3.34.1}/simplicio_loop/_bundle/scripts/cross_agent_wiki.py
RENAMED
|
@@ -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("
|
|
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("
|
|
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["
|
|
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"] =
|
|
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 (
|
|
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 (
|
|
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`**.
|
simplicio_loop-3.34.1/simplicio_loop/_bundle/skills/simplicio-loop/references/control-policy.md
ADDED
|
@@ -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 (
|
|
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
|
|
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
|
|
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** |
|
|
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
|
|
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 ·
|
|
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 **
|
|
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
|
|
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
|
|
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` |
|