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.
Files changed (228) hide show
  1. {swarph_cli-0.41.2/src/swarph_cli.egg-info → swarph_cli-0.41.3}/PKG-INFO +1 -1
  2. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/pyproject.toml +1 -1
  3. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/__init__.py +1 -1
  4. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/board_merge_check.py +32 -6
  5. {swarph_cli-0.41.2 → swarph_cli-0.41.3/src/swarph_cli.egg-info}/PKG-INFO +1 -1
  6. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_board_merge_check.py +47 -0
  7. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_brain_ask_command.py +1 -1
  8. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_watchdog.py +1 -1
  9. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/LICENSE +0 -0
  10. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/README.md +0 -0
  11. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/setup.cfg +0 -0
  12. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/bench/__init__.py +0 -0
  13. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/bench/backends.py +0 -0
  14. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/bench/pack.py +0 -0
  15. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/bench/prices.py +0 -0
  16. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/bench/quality.py +0 -0
  17. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/bench/refresh_prices.py +0 -0
  18. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/bench/runner.py +0 -0
  19. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/bench/validate.py +0 -0
  20. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/caller.py +0 -0
  21. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/capture/__init__.py +0 -0
  22. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/capture/harden.py +0 -0
  23. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/capture/lineage.py +0 -0
  24. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/capture/liveness.py +0 -0
  25. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/capture/manifest.py +0 -0
  26. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/capture/paths.py +0 -0
  27. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/capture/verify.py +0 -0
  28. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/cell.py +0 -0
  29. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/chain_token.py +0 -0
  30. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/__init__.py +0 -0
  31. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/_display.py +0 -0
  32. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/_gateway_client.py +0 -0
  33. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/add.py +0 -0
  34. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/bench.py +0 -0
  35. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/board.py +0 -0
  36. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/brain.py +0 -0
  37. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/brain_ask.py +0 -0
  38. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/cell.py +0 -0
  39. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/cell_selfcheck.py +0 -0
  40. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/channel.py +0 -0
  41. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/chat.py +0 -0
  42. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/codegraph.py +0 -0
  43. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/codegraph_hook.py +0 -0
  44. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/compress.py +0 -0
  45. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/daemon.py +0 -0
  46. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/event.py +0 -0
  47. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/gateway.py +0 -0
  48. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/group.py +0 -0
  49. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/highlight.py +0 -0
  50. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/hook_output.py +0 -0
  51. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/hooks.py +0 -0
  52. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/import_session.py +0 -0
  53. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/init.py +0 -0
  54. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/install_hook.py +0 -0
  55. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/install_multiplexer.py +0 -0
  56. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/lane.py +0 -0
  57. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/mcp_server.py +0 -0
  58. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/memory.py +0 -0
  59. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/memory_sync.py +0 -0
  60. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/mesh.py +0 -0
  61. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/monitor.py +0 -0
  62. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/okf_links.py +0 -0
  63. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/onboard.py +0 -0
  64. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/protocol_handler.py +0 -0
  65. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/ratify.py +0 -0
  66. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/schedule.py +0 -0
  67. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/security.py +0 -0
  68. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/service.py +0 -0
  69. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/spawn.py +0 -0
  70. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/timeline.py +0 -0
  71. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/commands/watchdog.py +0 -0
  72. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/compress/__init__.py +0 -0
  73. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/compress/levers.py +0 -0
  74. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/compress/marker.py +0 -0
  75. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/compress/verify.py +0 -0
  76. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/console_safe.py +0 -0
  77. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/delivery_queue.py +0 -0
  78. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/gateway/__init__.py +0 -0
  79. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/gateway/feature_registry.py +0 -0
  80. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/gateway/lanes_control.py +0 -0
  81. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/gateway/schema.sql +0 -0
  82. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/gateway/server.py +0 -0
  83. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/gateway/services_control.py +0 -0
  84. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/main.py +0 -0
  85. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/multiplexer.py +0 -0
  86. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/parsers/__init__.py +0 -0
  87. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/parsers/claude.py +0 -0
  88. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/scripts/ensure_monitor.sh +0 -0
  89. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/service/__init__.py +0 -0
  90. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/service/app.py +0 -0
  91. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/service/providers.py +0 -0
  92. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/session_bridge.py +0 -0
  93. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/stall_alert.py +0 -0
  94. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/systemd/swarph-watchdog.default +0 -0
  95. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/systemd/swarph-watchdog.service +0 -0
  96. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli/systemd/swarph-watchdog.timer +0 -0
  97. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli.egg-info/SOURCES.txt +0 -0
  98. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli.egg-info/dependency_links.txt +0 -0
  99. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli.egg-info/entry_points.txt +0 -0
  100. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli.egg-info/requires.txt +0 -0
  101. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/src/swarph_cli.egg-info/top_level.txt +0 -0
  102. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_add_security_gate.py +0 -0
  103. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_artifact_add.py +0 -0
  104. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_artifact_hash.py +0 -0
  105. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_artifact_lib.py +0 -0
  106. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_artifact_mcp.py +0 -0
  107. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_artifact_skill.py +0 -0
  108. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_artifact_tool.py +0 -0
  109. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_artifact_uri.py +0 -0
  110. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_bench_backends.py +0 -0
  111. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_bench_command.py +0 -0
  112. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_bench_pack.py +0 -0
  113. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_bench_prices.py +0 -0
  114. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_bench_quality.py +0 -0
  115. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_bench_runner.py +0 -0
  116. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_bench_validate.py +0 -0
  117. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_board_command.py +0 -0
  118. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_brain_ask_env_diagnosis.py +0 -0
  119. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_brain_command.py +0 -0
  120. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_caller_meta_guard.py +0 -0
  121. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_capture_lineage.py +0 -0
  122. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_capture_liveness.py +0 -0
  123. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_capture_manifest.py +0 -0
  124. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_capture_paths.py +0 -0
  125. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_capture_security.py +0 -0
  126. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_cell_command_dispatch.py +0 -0
  127. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_cell_harden.py +0 -0
  128. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_cell_loader.py +0 -0
  129. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_cell_selfcheck.py +0 -0
  130. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_cell_verify.py +0 -0
  131. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_chain_token.py +0 -0
  132. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_channel_command.py +0 -0
  133. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_channel_post.py +0 -0
  134. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_chat_command.py +0 -0
  135. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_claude_parser.py +0 -0
  136. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_claude_tmux_template.py +0 -0
  137. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_codegraph_caller_scope.py +0 -0
  138. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_codegraph_command.py +0 -0
  139. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_codegraph_hook.py +0 -0
  140. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_codegraph_mcp.py +0 -0
  141. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_compress_caller_convention.py +0 -0
  142. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_compress_command.py +0 -0
  143. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_compress_levers.py +0 -0
  144. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_compress_marker.py +0 -0
  145. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_compress_verify.py +0 -0
  146. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_console_encoding_e2e.py +0 -0
  147. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_daemon_command.py +0 -0
  148. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_daemon_console_encoding.py +0 -0
  149. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_daemon_delivery.py +0 -0
  150. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_delivery_queue.py +0 -0
  151. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_display_sanitize.py +0 -0
  152. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_event_emit.py +0 -0
  153. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_feature_to_uri.py +0 -0
  154. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_gateway_brain.py +0 -0
  155. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_gateway_client.py +0 -0
  156. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_gateway_command.py +0 -0
  157. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_group_command.py +0 -0
  158. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_highlight_command.py +0 -0
  159. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_hook_output.py +0 -0
  160. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_hooks_activity_marker.py +0 -0
  161. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_hooks_add.py +0 -0
  162. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_hooks_bundle.py +0 -0
  163. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_hooks_init.py +0 -0
  164. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_hooks_lifecycle.py +0 -0
  165. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_hooks_merge.py +0 -0
  166. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_import_command.py +0 -0
  167. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_init_command.py +0 -0
  168. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_install_hook.py +0 -0
  169. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_install_multiplexer_command.py +0 -0
  170. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_lane_command.py +0 -0
  171. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_main.py +0 -0
  172. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_main_unknown_verb_guard.py +0 -0
  173. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_mcp_server.py +0 -0
  174. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_memory_command.py +0 -0
  175. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_memory_gateway.py +0 -0
  176. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_memory_sync.py +0 -0
  177. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_memory_sync_membrane.py +0 -0
  178. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_mesh_command.py +0 -0
  179. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_mesh_inbox_mark_read.py +0 -0
  180. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_mesh_inbox_sanitize.py +0 -0
  181. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_mesh_sidecar.py +0 -0
  182. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_mesh_sidecar_cursor_decoupled.py +0 -0
  183. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_mesh_sidecar_wake_survives_read.py +0 -0
  184. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_meta_edge_identity.py +0 -0
  185. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_monitor_cli.py +0 -0
  186. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_monitor_daemon_collision.py +0 -0
  187. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_monitor_self_name_verification.py +0 -0
  188. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_monitor_state_split.py +0 -0
  189. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_multiplexer.py +0 -0
  190. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_okf_links.py +0 -0
  191. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_onboard_command.py +0 -0
  192. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_packaged_artifacts_exist.py +0 -0
  193. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_process_liveness.py +0 -0
  194. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_protocol_handler.py +0 -0
  195. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_providers_isolation.py +0 -0
  196. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_ratify_command.py +0 -0
  197. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_repl_caller_convention.py +0 -0
  198. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_schedule_command.py +0 -0
  199. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_schedule_create_contract.py +0 -0
  200. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_security.py +0 -0
  201. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_service_app.py +0 -0
  202. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_service_command.py +0 -0
  203. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_service_providers.py +0 -0
  204. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_session_bridge_inject.py +0 -0
  205. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_session_bridge_probe.py +0 -0
  206. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_session_bridge_resolve.py +0 -0
  207. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_session_path_role_gate.py +0 -0
  208. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_shipped_units_match_the_cli.py +0 -0
  209. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_smoke_chat.py +0 -0
  210. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_smoke_one_shot.py +0 -0
  211. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_smoke_phase_5_5.py +0 -0
  212. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_spawn_base_hoist.py +0 -0
  213. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_spawn_command.py +0 -0
  214. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_spawn_live_pin.py +0 -0
  215. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_spawn_mitosis_lineage.py +0 -0
  216. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_spawn_tmux_session.py +0 -0
  217. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_spawn_windows_relaunch.py +0 -0
  218. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_stall_alert.py +0 -0
  219. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_timeline_command.py +0 -0
  220. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_token_file_one_parser.py +0 -0
  221. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_version_consistency.py +0 -0
  222. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_watchdog_dm_wake.py +0 -0
  223. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_watchdog_dm_wake_cooldown.py +0 -0
  224. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_watchdog_dm_wake_wiring.py +0 -0
  225. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_watchdog_emit_health.py +0 -0
  226. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_watchdog_install_flags.py +0 -0
  227. {swarph_cli-0.41.2 → swarph_cli-0.41.3}/tests/test_watchdog_model_rung.py +0 -0
  228. {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.2
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.2"
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" }
@@ -16,6 +16,6 @@ The architecture splits CLI from substrate so:
16
16
 
17
17
  from __future__ import annotations
18
18
 
19
- __version__ = "0.41.2"
19
+ __version__ = "0.41.3"
20
20
 
21
21
  __all__ = ["__version__"]
@@ -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
- "no link_stamp for peer_verdict cannot tell who wrote it "
168
- "(pre-#199 verdict, or a producer that dropped link_stamps); "
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.get("self_authored"),
172
- f"self_authored={_vstamp.get('self_authored')!r} by={_vstamp.get('by')!r} "
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.2
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.2"
20
+ assert swarph_cli.__version__ == "0.41.3"
21
21
 
22
22
 
23
23
  # --- request / response plumbing -------------------------------------------
@@ -1043,4 +1043,4 @@ def test_parser_defaults_process_name_claude_liveness_cmd_none():
1043
1043
 
1044
1044
  def test_version_is_0_33_0():
1045
1045
  import swarph_cli
1046
- assert swarph_cli.__version__ == "0.41.2"
1046
+ assert swarph_cli.__version__ == "0.41.3"
File without changes
File without changes
File without changes