swarph-cli 0.41.2__tar.gz → 0.41.3__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.
- {swarph_cli-0.41.2/src/swarph_cli.egg-info → swarph_cli-0.41.3}/PKG-INFO +1 -1
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/pyproject.toml +1 -1
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/__init__.py +1 -1
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/board_merge_check.py +32 -6
- {swarph_cli-0.41.2 → swarph_cli-0.41.3/src/swarph_cli.egg-info}/PKG-INFO +1 -1
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_board_merge_check.py +47 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_brain_ask_command.py +1 -1
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_watchdog.py +1 -1
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/LICENSE +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/README.md +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/setup.cfg +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/bench/__init__.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/bench/backends.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/bench/pack.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/bench/prices.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/bench/quality.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/bench/refresh_prices.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/bench/runner.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/bench/validate.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/caller.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/capture/__init__.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/capture/harden.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/capture/lineage.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/capture/liveness.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/capture/manifest.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/capture/paths.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/capture/verify.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/cell.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/chain_token.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/__init__.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/_display.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/_gateway_client.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/add.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/bench.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/board.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/brain.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/brain_ask.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/cell.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/cell_selfcheck.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/channel.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/chat.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/codegraph.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/codegraph_hook.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/compress.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/daemon.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/event.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/gateway.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/group.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/highlight.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/hook_output.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/hooks.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/import_session.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/init.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/install_hook.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/install_multiplexer.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/lane.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/mcp_server.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/memory.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/memory_sync.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/mesh.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/monitor.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/okf_links.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/onboard.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/protocol_handler.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/ratify.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/schedule.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/security.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/service.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/spawn.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/timeline.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/watchdog.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/compress/__init__.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/compress/levers.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/compress/marker.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/compress/verify.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/console_safe.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/delivery_queue.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/gateway/__init__.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/gateway/feature_registry.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/gateway/lanes_control.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/gateway/schema.sql +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/gateway/server.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/gateway/services_control.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/main.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/multiplexer.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/parsers/__init__.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/parsers/claude.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/scripts/ensure_monitor.sh +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/service/__init__.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/service/app.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/service/providers.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/session_bridge.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/stall_alert.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/systemd/swarph-watchdog.default +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/systemd/swarph-watchdog.service +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/systemd/swarph-watchdog.timer +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli.egg-info/SOURCES.txt +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli.egg-info/dependency_links.txt +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli.egg-info/entry_points.txt +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli.egg-info/requires.txt +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli.egg-info/top_level.txt +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_add_security_gate.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_artifact_add.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_artifact_hash.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_artifact_lib.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_artifact_mcp.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_artifact_skill.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_artifact_tool.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_artifact_uri.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_bench_backends.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_bench_command.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_bench_pack.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_bench_prices.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_bench_quality.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_bench_runner.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_bench_validate.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_board_command.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_brain_ask_env_diagnosis.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_brain_command.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_caller_meta_guard.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_capture_lineage.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_capture_liveness.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_capture_manifest.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_capture_paths.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_capture_security.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_cell_command_dispatch.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_cell_harden.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_cell_loader.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_cell_selfcheck.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_cell_verify.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_chain_token.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_channel_command.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_channel_post.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_chat_command.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_claude_parser.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_claude_tmux_template.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_codegraph_caller_scope.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_codegraph_command.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_codegraph_hook.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_codegraph_mcp.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_compress_caller_convention.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_compress_command.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_compress_levers.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_compress_marker.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_compress_verify.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_console_encoding_e2e.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_daemon_command.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_daemon_console_encoding.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_daemon_delivery.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_delivery_queue.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_display_sanitize.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_event_emit.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_feature_to_uri.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_gateway_brain.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_gateway_client.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_gateway_command.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_group_command.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_highlight_command.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_hook_output.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_hooks_activity_marker.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_hooks_add.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_hooks_bundle.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_hooks_init.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_hooks_lifecycle.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_hooks_merge.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_import_command.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_init_command.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_install_hook.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_install_multiplexer_command.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_lane_command.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_main.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_main_unknown_verb_guard.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_mcp_server.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_memory_command.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_memory_gateway.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_memory_sync.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_memory_sync_membrane.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_mesh_command.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_mesh_inbox_mark_read.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_mesh_inbox_sanitize.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_mesh_sidecar.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_mesh_sidecar_cursor_decoupled.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_mesh_sidecar_wake_survives_read.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_meta_edge_identity.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_monitor_cli.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_monitor_daemon_collision.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_monitor_self_name_verification.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_monitor_state_split.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_multiplexer.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_okf_links.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_onboard_command.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_packaged_artifacts_exist.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_process_liveness.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_protocol_handler.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_providers_isolation.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_ratify_command.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_repl_caller_convention.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_schedule_command.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_schedule_create_contract.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_security.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_service_app.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_service_command.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_service_providers.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_session_bridge_inject.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_session_bridge_probe.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_session_bridge_resolve.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_session_path_role_gate.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_shipped_units_match_the_cli.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_smoke_chat.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_smoke_one_shot.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_smoke_phase_5_5.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_spawn_base_hoist.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_spawn_command.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_spawn_live_pin.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_spawn_mitosis_lineage.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_spawn_tmux_session.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_spawn_windows_relaunch.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_stall_alert.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_timeline_command.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_token_file_one_parser.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_version_consistency.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_watchdog_dm_wake.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_watchdog_dm_wake_cooldown.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_watchdog_dm_wake_wiring.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_watchdog_emit_health.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_watchdog_install_flags.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_watchdog_model_rung.py +0 -0
- {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_watchdog_stale_peers.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: swarph-cli
|
|
3
|
-
Version: 0.41.
|
|
3
|
+
Version: 0.41.3
|
|
4
4
|
Summary: The `swarph` binary — a multi-LLM CLI and mesh-gateway client + bundled server (`swarph gateway`): one-shot prompts across providers, interactive `chat`, multi-provider `spawn` (claude/codex/antigravity via a ProviderMembrane with subprocess billing-scrub), `mesh` send/inbox/register, `brain-ask` over the swarph-brain (gbrain) semantic memory, git-backed `assisted_memory`, session `import`, and a stranded-session `watchdog`.
|
|
5
5
|
Author: Pierre Samson, Claude Opus
|
|
6
6
|
License: MIT
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "swarph-cli"
|
|
7
|
-
version = "0.41.
|
|
7
|
+
version = "0.41.3"
|
|
8
8
|
description = "The `swarph` binary — a multi-LLM CLI and mesh-gateway client + bundled server (`swarph gateway`): one-shot prompts across providers, interactive `chat`, multi-provider `spawn` (claude/codex/antigravity via a ProviderMembrane with subprocess billing-scrub), `mesh` send/inbox/register, `brain-ask` over the swarph-brain (gbrain) semantic memory, git-backed `assisted_memory`, session `import`, and a stranded-session `watchdog`."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = { text = "MIT" }
|
|
@@ -161,15 +161,41 @@ def decide(card: dict, pr_state: dict) -> Decision:
|
|
|
161
161
|
# vacuous for exactly the backlog it must cover. ok=None => COULD NOT
|
|
162
162
|
# EVALUATE => REFUSE, which is this file's existing doctrine for the
|
|
163
163
|
# unreachable-GitHub case and the reason it has a tri-state at all.
|
|
164
|
+
# >>> A STAMP THAT EXISTS AND LACKS THE KEY IS AS BLIND AS NO STAMP AT ALL,
|
|
165
|
+
# AND IT IS 92% OF PRODUCTION. <<< (droplet, running decide() on the
|
|
166
|
+
# INSTALLED 0.41.2 rather than reading it.)
|
|
167
|
+
#
|
|
168
|
+
# The first version tested `_vstamp is None` — ABSENCE OF THE STAMP. The
|
|
169
|
+
# backlog's actual shape is a stamp that EXISTS (written before
|
|
170
|
+
# self_authored shipped) and lacks the KEY. That fell through to the
|
|
171
|
+
# comparison, where `.get("self_authored")` returns None, `not None` is
|
|
172
|
+
# True, and the leg reported ok=True. A textbook self-review PASSED.
|
|
173
|
+
#
|
|
174
|
+
# MEASURED: 53 link_stamps in production, 4 carrying the flag — 49 (92%)
|
|
175
|
+
# are the middle shape. So the leg was VACUOUS FOR EXACTLY THE BACKLOG IT
|
|
176
|
+
# WAS BUILT FOR: the outcome the design explicitly targets, and which I
|
|
177
|
+
# reported to the date-holder as avoided. He authorised near-total
|
|
178
|
+
# ABSTENTION on the backlog; what shipped was near-total PASS — the
|
|
179
|
+
# opposite, and MORE PERMISSIVE THAN THE PHASE-1 STATE IT REPLACES.
|
|
180
|
+
#
|
|
181
|
+
# The two blind causes are kept DISTINCT in the detail because they decay
|
|
182
|
+
# differently: a missing stamp is a producer that dropped it (an outage
|
|
183
|
+
# shape); a missing key is a verdict older than the flag (a shape that
|
|
184
|
+
# drains to zero as verdicts are rewritten). A single message would make
|
|
185
|
+
# them indistinguishable, which is the naming rule one level down.
|
|
164
186
|
_vstamp = (card.get("link_stamps") or {}).get("peer_verdict")
|
|
165
|
-
if _vstamp is None:
|
|
187
|
+
if _vstamp is None or "self_authored" not in _vstamp:
|
|
188
|
+
_why = ("no link_stamp for peer_verdict at all — a producer dropped it, "
|
|
189
|
+
"or the verdict predates #199"
|
|
190
|
+
if _vstamp is None else
|
|
191
|
+
f"link_stamp exists (by={_vstamp.get('by')!r}) but carries NO "
|
|
192
|
+
f"self_authored key — the verdict predates the flag")
|
|
166
193
|
add("verdict is not self-authored", None,
|
|
167
|
-
"
|
|
168
|
-
"
|
|
169
|
-
"COULD NOT EVALUATE, never a pass")
|
|
194
|
+
f"{_why}; cannot tell whether the reviewee wrote it. "
|
|
195
|
+
f"COULD NOT EVALUATE, never a pass")
|
|
170
196
|
else:
|
|
171
|
-
add("verdict is not self-authored", not _vstamp
|
|
172
|
-
f"self_authored={_vstamp
|
|
197
|
+
add("verdict is not self-authored", not _vstamp["self_authored"],
|
|
198
|
+
f"self_authored={_vstamp['self_authored']!r} by={_vstamp.get('by')!r} "
|
|
173
199
|
f"— the person being reviewed cannot supply the review")
|
|
174
200
|
add("verdict is APPROVED", verdict["verdict"] == "APPROVED",
|
|
175
201
|
f"verdict={verdict['verdict']}")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: swarph-cli
|
|
3
|
-
Version: 0.41.
|
|
3
|
+
Version: 0.41.3
|
|
4
4
|
Summary: The `swarph` binary — a multi-LLM CLI and mesh-gateway client + bundled server (`swarph gateway`): one-shot prompts across providers, interactive `chat`, multi-provider `spawn` (claude/codex/antigravity via a ProviderMembrane with subprocess billing-scrub), `mesh` send/inbox/register, `brain-ask` over the swarph-brain (gbrain) semantic memory, git-backed `assisted_memory`, session `import`, and a stranded-session `watchdog`.
|
|
5
5
|
Author: Pierre Samson, Claude Opus
|
|
6
6
|
License: MIT
|
|
@@ -347,3 +347,50 @@ def test_a_READY_card_with_NO_peer_verdict_REFUSES():
|
|
|
347
347
|
d = mc.decide(_card(links={"pr": "https://github.com/o/r/pull/152"}), _pr())
|
|
348
348
|
assert _fail(d, "peer verdict recorded on the card")
|
|
349
349
|
assert d.verdict != "WOULD_MERGE"
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
def test_a_stamp_WITHOUT_the_self_authored_KEY_abstains_like_no_stamp():
|
|
353
|
+
""">>> THE BUG THAT SHIPPED IN 0.41.2, AND IT WAS 92% OF PRODUCTION. <<<
|
|
354
|
+
|
|
355
|
+
Found by droplet RUNNING decide() on the installed package instead of reading
|
|
356
|
+
it. The first version tested `_vstamp is None` — absence of the STAMP. The
|
|
357
|
+
backlog's real shape is a stamp that EXISTS (written before self_authored
|
|
358
|
+
shipped) and lacks the KEY: it fell through to the comparison, where
|
|
359
|
+
`.get("self_authored")` returns None, `not None` is True, and A TEXTBOOK
|
|
360
|
+
SELF-REVIEW PASSED.
|
|
361
|
+
|
|
362
|
+
Measured at the time: 53 link_stamps in production, 4 carrying the flag — 49
|
|
363
|
+
(92%) were this shape. The leg was VACUOUS FOR EXACTLY THE BACKLOG IT WAS
|
|
364
|
+
BUILT FOR, which is the outcome the design explicitly targets and which I had
|
|
365
|
+
reported to the date-holder as avoided. He authorised near-total ABSTENTION;
|
|
366
|
+
what shipped was near-total PASS.
|
|
367
|
+
|
|
368
|
+
WHY THE VERIFICATION MISSED IT: the wheel audit and the end-to-end check
|
|
369
|
+
covered self_authored=True (refuses) and no-stamp (abstains). Both correct,
|
|
370
|
+
NEITHER IS THE PRODUCTION SHAPE. The untested case was the only one that
|
|
371
|
+
exists in the data.
|
|
372
|
+
"""
|
|
373
|
+
stamp_no_key = {"peer_verdict": {"by": "droplet", "caller_bound": True,
|
|
374
|
+
"at": "2026-08-01T00:00:00Z"}}
|
|
375
|
+
d = mc.decide(_card(created_by="lab-ovh", assignee="droplet",
|
|
376
|
+
link_stamps=stamp_no_key), _pr())
|
|
377
|
+
check = [c for c in d.checks if c.name == "verdict is not self-authored"][0]
|
|
378
|
+
assert check.ok is None, (
|
|
379
|
+
"a stamp lacking the self_authored KEY passed the self-review leg — "
|
|
380
|
+
"vacuous for 92% of production")
|
|
381
|
+
assert d.verdict != "WOULD_MERGE"
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
def test_the_two_BLIND_causes_are_named_distinctly():
|
|
385
|
+
"""They decay differently and must not print the same: a MISSING STAMP is a
|
|
386
|
+
producer that dropped it (outage shape); a MISSING KEY is a verdict older than
|
|
387
|
+
the flag (drains to zero as verdicts are rewritten). One message for both
|
|
388
|
+
would make a permanent outage indistinguishable from a shrinking backlog."""
|
|
389
|
+
no_stamp = mc.decide(_card(created_by="lab-ovh", link_stamps={}), _pr())
|
|
390
|
+
no_key = mc.decide(_card(created_by="lab-ovh",
|
|
391
|
+
link_stamps={"peer_verdict": {"by": "droplet"}}), _pr())
|
|
392
|
+
d1 = [c for c in no_stamp.checks if c.name == "verdict is not self-authored"][0].detail
|
|
393
|
+
d2 = [c for c in no_key.checks if c.name == "verdict is not self-authored"][0].detail
|
|
394
|
+
assert d1 != d2, "both blind causes printed the same detail"
|
|
395
|
+
assert "at all" in d1
|
|
396
|
+
assert "predates the flag" in d2
|
|
@@ -17,7 +17,7 @@ from swarph_cli.commands import brain_ask as ba
|
|
|
17
17
|
|
|
18
18
|
def test_version_is_0_33_0():
|
|
19
19
|
import swarph_cli
|
|
20
|
-
assert swarph_cli.__version__ == "0.41.
|
|
20
|
+
assert swarph_cli.__version__ == "0.41.3"
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
# --- request / response plumbing -------------------------------------------
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|