brigade-cli 0.28.0__tar.gz → 0.29.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1438) hide show
  1. {brigade_cli-0.28.0/src/brigade_cli.egg-info → brigade_cli-0.29.0}/PKG-INFO +3 -3
  2. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/QUICKSTART.md +1 -1
  3. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/README.md +2 -2
  4. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/pyproject.toml +1 -1
  5. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/__init__.py +1 -1
  6. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/render.py +1 -0
  7. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/anchored_io.py +24 -26
  8. brigade_cli-0.29.0/src/brigade/distribution.py +7 -0
  9. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_command_deck.py +68 -257
  10. brigade_cli-0.29.0/src/brigade/fleet_deck_overview.py +708 -0
  11. brigade_cli-0.29.0/src/brigade/fleet_deck_shell.py +79 -0
  12. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_roster_page.py +3 -6
  13. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_routing.py +18 -2
  14. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_policy_page.py +3 -6
  15. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_repo_policy_page.py +3 -4
  16. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_work_page.py +7 -7
  17. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/components/manifest-v1.json +54 -54
  18. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/hermes/memory-handoff.harness.json +1 -1
  19. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/hermes/model-lanes.harness.json +1 -1
  20. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/hermes/workspace.harness.json +1 -1
  21. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/chat-memory-sweep.example.json +1 -1
  22. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/memory-care.example.json +1 -1
  23. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/policies/personal.json +1 -1
  24. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/policies/public-content.json +1 -1
  25. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/policies/public-repo.json +1 -1
  26. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/template-profile-snapshot.json +9 -9
  27. brigade_cli-0.29.0/src/brigade/ui_theme.py +338 -0
  28. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/update_cmd.py +12 -5
  29. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/update_notify.py +5 -5
  30. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/verification.py +251 -249
  31. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/verify_reaper.py +48 -9
  32. brigade_cli-0.29.0/src/brigade/work_cmd/verify_runtime.py +293 -0
  33. {brigade_cli-0.28.0 → brigade_cli-0.29.0/src/brigade_cli.egg-info}/PKG-INFO +3 -3
  34. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade_cli.egg-info/SOURCES.txt +7 -0
  35. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_state_containment.py +35 -0
  36. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_command_deck.py +88 -8
  37. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_dashboard.py +1 -1
  38. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_deck_badges.py +46 -34
  39. brigade_cli-0.29.0/tests/test_fleet_deck_overview.py +944 -0
  40. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_routing.py +66 -1
  41. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_work_page.py +3 -3
  42. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_cerebro.py +3 -4
  43. brigade_cli-0.29.0/tests/test_npm_feasibility_prepare.py +115 -0
  44. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_published_artifact_acceptance.py +25 -2
  45. brigade_cli-0.29.0/tests/test_ui_theme.py +175 -0
  46. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_ui_theme_integration.py +65 -13
  47. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_update_cmd.py +118 -48
  48. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_update_notify.py +42 -0
  49. brigade_cli-0.29.0/tests/test_verify_reaper.py +102 -0
  50. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_verification.py +1412 -15
  51. brigade_cli-0.28.0/src/brigade/ui_theme.py +0 -173
  52. brigade_cli-0.28.0/tests/test_ui_theme.py +0 -61
  53. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/LICENSE +0 -0
  54. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/MANIFEST.in +0 -0
  55. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/THIRD_PARTY_NOTICES.md +0 -0
  56. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/setup.cfg +0 -0
  57. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/__main__.py +0 -0
  58. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/_control_crosswalk_io.py +0 -0
  59. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/aboyeur/__init__.py +0 -0
  60. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/aboyeur/artifacts.py +0 -0
  61. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/aboyeur/briefs.py +0 -0
  62. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/aboyeur/direct_worker_finish.py +0 -0
  63. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/aboyeur/model_admission.py +0 -0
  64. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/aboyeur/orchestrator.py +0 -0
  65. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/aboyeur/planning.py +0 -0
  66. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/aboyeur/prompts.py +0 -0
  67. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/aboyeur/run_io.py +0 -0
  68. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/aboyeur_artifacts.py +0 -0
  69. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/aboyeur_model_policy.py +0 -0
  70. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/acpx_adapter.py +0 -0
  71. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/actionqueue.py +0 -0
  72. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/add.py +0 -0
  73. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/agent_change.py +0 -0
  74. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/agent_change_approval_verify.py +0 -0
  75. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/agent_change_refs.py +0 -0
  76. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/agent_change_verify.py +0 -0
  77. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/agent_request.py +0 -0
  78. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/agent_skill_format.py +0 -0
  79. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/agents.py +0 -0
  80. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/approval.py +0 -0
  81. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/approval_v2.py +0 -0
  82. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/approval_verification.py +0 -0
  83. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/assets/fleet_hub/apple-touch-icon.png +0 -0
  84. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/assets/fleet_hub/favicon-32x32.png +0 -0
  85. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/assets/fleet_hub/favicon.ico +0 -0
  86. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/assets/fleet_hub/icon-192.png +0 -0
  87. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/assets/fleet_hub/icon-512.png +0 -0
  88. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/assets/fleet_hub/site.webmanifest +0 -0
  89. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/attestation.py +0 -0
  90. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/attestation_cmd.py +0 -0
  91. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/attestation_input.py +0 -0
  92. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/attestation_receipt.py +0 -0
  93. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/authority_broker.py +0 -0
  94. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/authority_key.py +0 -0
  95. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/authority_marker.py +0 -0
  96. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/brief_sections.py +0 -0
  97. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/budgets.py +0 -0
  98. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/budgets_cmd.py +0 -0
  99. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/candidate_set.py +0 -0
  100. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/card_fingerprint.py +0 -0
  101. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/card_identity.py +0 -0
  102. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/care_cmd.py +0 -0
  103. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/care_schedules.py +0 -0
  104. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/causal_receipt.py +0 -0
  105. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/__init__.py +0 -0
  106. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/actions.py +0 -0
  107. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/agent_activity.py +0 -0
  108. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/core.py +0 -0
  109. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/__init__.py +0 -0
  110. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/data.py +0 -0
  111. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/snapshot.py +0 -0
  112. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/timing.py +0 -0
  113. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/views/__init__.py +0 -0
  114. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/views/agent_activity.py +0 -0
  115. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/views/code_graph.py +0 -0
  116. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/views/handoff_inbox.py +0 -0
  117. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/views/memory_operations.py +0 -0
  118. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/views/outcome_rank.py +0 -0
  119. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/views/research.py +0 -0
  120. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/views/run_timeline.py +0 -0
  121. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/views/status_grid.py +0 -0
  122. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/views/work.py +0 -0
  123. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/work_graph.py +0 -0
  124. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/readiness.py +0 -0
  125. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/report_review_ops.py +0 -0
  126. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/reports.py +0 -0
  127. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/schema_ops.py +0 -0
  128. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/serve.py +0 -0
  129. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/chat_cmd.py +0 -0
  130. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claim_loss_cancellation.py +0 -0
  131. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_actions_diagnostics.py +0 -0
  132. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_actions_evidence.py +0 -0
  133. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_actions_http.py +0 -0
  134. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_actions_import.py +0 -0
  135. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_actions_metadata.py +0 -0
  136. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_cloud.py +0 -0
  137. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_cloud_identity.py +0 -0
  138. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/__init__.py +0 -0
  139. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/classify.py +0 -0
  140. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/compaction_marker.py +0 -0
  141. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/entry.py +0 -0
  142. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/envelope.py +0 -0
  143. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/fingerprint.py +0 -0
  144. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/heartbeat.py +0 -0
  145. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/install_cmd.py +0 -0
  146. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/package.py +0 -0
  147. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/paths.py +0 -0
  148. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/presence.py +0 -0
  149. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/runtime.py +0 -0
  150. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/session_state.py +0 -0
  151. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_review_evidence.py +0 -0
  152. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_review_history.py +0 -0
  153. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_review_import.py +0 -0
  154. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/__init__.py +0 -0
  155. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/_common.py +0 -0
  156. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/add.py +0 -0
  157. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/budgets.py +0 -0
  158. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/care.py +0 -0
  159. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/center.py +0 -0
  160. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/chat.py +0 -0
  161. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/code.py +0 -0
  162. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/completions.py +0 -0
  163. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/context.py +0 -0
  164. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/daily.py +0 -0
  165. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/doctor.py +0 -0
  166. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/dogfood.py +0 -0
  167. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/evidence.py +0 -0
  168. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/extras.py +0 -0
  169. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/fleet.py +0 -0
  170. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/fleet_campaign.py +0 -0
  171. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/fleet_dot.py +0 -0
  172. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/fleet_enroll.py +0 -0
  173. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/fleet_events.py +0 -0
  174. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/fleet_messages.py +0 -0
  175. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/fleet_policy.py +0 -0
  176. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/fleet_roster.py +0 -0
  177. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/fleet_work.py +0 -0
  178. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/fleet_work_ownership.py +0 -0
  179. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/friction.py +0 -0
  180. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/governance.py +0 -0
  181. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/guard.py +0 -0
  182. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/handoff.py +0 -0
  183. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/handoff_template.py +0 -0
  184. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/harness.py +0 -0
  185. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/hermes_fragments.py +0 -0
  186. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/ingest.py +0 -0
  187. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/init.py +0 -0
  188. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/learn.py +0 -0
  189. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/mcp.py +0 -0
  190. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/memory.py +0 -0
  191. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/model.py +0 -0
  192. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/node.py +0 -0
  193. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/notifications.py +0 -0
  194. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/openclaw_fragments.py +0 -0
  195. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/operator.py +0 -0
  196. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/outcome.py +0 -0
  197. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/pantry.py +0 -0
  198. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/profiles.py +0 -0
  199. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/projection.py +0 -0
  200. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/projects.py +0 -0
  201. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/receipts.py +0 -0
  202. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/reconfigure.py +0 -0
  203. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/release.py +0 -0
  204. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/repos.py +0 -0
  205. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/research.py +0 -0
  206. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/roadmap.py +0 -0
  207. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/roster.py +0 -0
  208. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/route.py +0 -0
  209. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/run.py +0 -0
  210. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/run_cloud.py +0 -0
  211. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/run_cloud_build_feed.py +0 -0
  212. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/runbook.py +0 -0
  213. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/runs.py +0 -0
  214. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/scrub.py +0 -0
  215. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/search.py +0 -0
  216. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/security.py +0 -0
  217. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/setup.py +0 -0
  218. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/skills.py +0 -0
  219. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/stations.py +0 -0
  220. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/status.py +0 -0
  221. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/tokens.py +0 -0
  222. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/tools.py +0 -0
  223. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/untrusted.py +0 -0
  224. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/update.py +0 -0
  225. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/version.py +0 -0
  226. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/work/__init__.py +0 -0
  227. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/work/dispatching.py +0 -0
  228. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/work/phases.py +0 -0
  229. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/work/registration.py +0 -0
  230. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/workflow.py +0 -0
  231. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cloud_tracker.py +0 -0
  232. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/code_cmd.py +0 -0
  233. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/code_export.py +0 -0
  234. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/code_references.py +0 -0
  235. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/codex_appserver.py +0 -0
  236. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/codex_cloud.py +0 -0
  237. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/commit_linkage.py +0 -0
  238. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/commit_linkage_verify.py +0 -0
  239. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/completions.py +0 -0
  240. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/component_bins.py +0 -0
  241. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/component_install.py +0 -0
  242. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/component_manifest.py +0 -0
  243. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/component_paths.py +0 -0
  244. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/component_report.py +0 -0
  245. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/component_state.py +0 -0
  246. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/config.py +0 -0
  247. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/context_cmd.py +0 -0
  248. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/context_eval.py +0 -0
  249. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/context_preview.py +0 -0
  250. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/control_crosswalk.py +0 -0
  251. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/control_crosswalk_cosign.py +0 -0
  252. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/control_crosswalk_package.py +0 -0
  253. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/control_readiness.py +0 -0
  254. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cosign_attestation.py +0 -0
  255. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cursor_cloud.py +0 -0
  256. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cursor_user_cmd.py +0 -0
  257. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/daily_cmd/__init__.py +0 -0
  258. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/daily_cmd/approvals.py +0 -0
  259. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/daily_cmd/candidates.py +0 -0
  260. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/daily_cmd/closeout_ops.py +0 -0
  261. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/daily_cmd/config.py +0 -0
  262. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/daily_cmd/hardening.py +0 -0
  263. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/daily_cmd/run_loop.py +0 -0
  264. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/daily_cmd/status_plan.py +0 -0
  265. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/daily_cmd/telemetry_ops.py +0 -0
  266. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dirfd.py +0 -0
  267. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/doctor.py +0 -0
  268. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/doctor_agent.py +0 -0
  269. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/doctor_instruction_chain.py +0 -0
  270. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dogfood_cmd.py +0 -0
  271. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/__init__.py +0 -0
  272. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/__main__.py +0 -0
  273. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/access_auth.py +0 -0
  274. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/adapter.py +0 -0
  275. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/contracts.py +0 -0
  276. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/event_app.py +0 -0
  277. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/events.py +0 -0
  278. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/fleet_tools.py +0 -0
  279. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/hub_inbox.py +0 -0
  280. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/hub_tools.py +0 -0
  281. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/inbox_tools.py +0 -0
  282. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/lifecycle.py +0 -0
  283. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/memory_tools.py +0 -0
  284. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/process.py +0 -0
  285. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/runtime_config.py +0 -0
  286. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/safe_state.py +0 -0
  287. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/server.py +0 -0
  288. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/state.py +0 -0
  289. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/watch.py +0 -0
  290. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/webhooks.py +0 -0
  291. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/evidence_ack_acceptance.py +0 -0
  292. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/evidence_ack_crypto.py +0 -0
  293. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/evidence_ack_protocol.py +0 -0
  294. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/evidence_brief.py +0 -0
  295. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/evidence_cmd.py +0 -0
  296. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/evidence_derivative.py +0 -0
  297. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/evidence_package.py +0 -0
  298. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/evidence_package_snapshot.py +0 -0
  299. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/evidence_redaction.py +0 -0
  300. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/evidence_runtime.py +0 -0
  301. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/extras.py +0 -0
  302. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fixtures/causal-receipt.v1.golden.json +0 -0
  303. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fixtures/provenance-envelope.v1.golden.json +0 -0
  304. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fixtures/trust-policy.v1.json +0 -0
  305. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fixtures/worker-events-appserver.v1.golden.json +0 -0
  306. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_campaign.py +0 -0
  307. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_campaign_authority.py +0 -0
  308. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_center_links.py +0 -0
  309. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_claim_display.py +0 -0
  310. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_claim_lifecycle.py +0 -0
  311. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_claim_target.py +0 -0
  312. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_client.py +0 -0
  313. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_client_cloud.py +0 -0
  314. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_client_enrollment.py +0 -0
  315. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_client_grokbot.py +0 -0
  316. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_client_message_credentials.py +0 -0
  317. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_client_messages.py +0 -0
  318. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_client_policy.py +0 -0
  319. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_client_spool.py +0 -0
  320. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_dashboard.py +0 -0
  321. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_deck_brands.py +0 -0
  322. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_dot.py +0 -0
  323. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_event_freshness.py +0 -0
  324. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_event_report.py +0 -0
  325. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_execution_context.py +0 -0
  326. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_export.py +0 -0
  327. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub.py +0 -0
  328. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_capacity.py +0 -0
  329. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_claim_cardinality.py +0 -0
  330. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_claims.py +0 -0
  331. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_cloud_policy.py +0 -0
  332. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_enrollment.py +0 -0
  333. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_event_bounds.py +0 -0
  334. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_grokbot.py +0 -0
  335. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_http.py +0 -0
  336. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_message_grants.py +0 -0
  337. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_messages.py +0 -0
  338. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_model_roster.py +0 -0
  339. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_policy.py +0 -0
  340. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_policy_api.py +0 -0
  341. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_preference.py +0 -0
  342. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_server.py +0 -0
  343. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_sessions.py +0 -0
  344. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_status.py +0 -0
  345. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_master_roster.py +0 -0
  346. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_model_admission.py +0 -0
  347. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_model_inventory.py +0 -0
  348. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_model_roster.py +0 -0
  349. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_policy.py +0 -0
  350. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_policy_delegation.py +0 -0
  351. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_policy_form.py +0 -0
  352. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_policy_migration.py +0 -0
  353. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_quota.py +0 -0
  354. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_session_bootstrap.py +0 -0
  355. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_session_presence.py +0 -0
  356. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_t3_transport.py +0 -0
  357. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fragments.py +0 -0
  358. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/friction_cmd.py +0 -0
  359. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/generated_patch_quarantine.py +0 -0
  360. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/governance_inventory.py +0 -0
  361. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/graphtrail_delta.py +0 -0
  362. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_backup/__init__.py +0 -0
  363. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_backup/actions.py +0 -0
  364. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_backup/adapters.py +0 -0
  365. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_backup/contracts.py +0 -0
  366. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_backup/exec.py +0 -0
  367. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_backup/ledger.py +0 -0
  368. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_backup/lifecycle.py +0 -0
  369. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_backup/normalize.py +0 -0
  370. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_backup/runtime_config.py +0 -0
  371. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_backup/tools.py +0 -0
  372. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_build_feed.py +0 -0
  373. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_cerebro.py +0 -0
  374. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_feed.py +0 -0
  375. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_findings.py +0 -0
  376. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_findings_relay.py +0 -0
  377. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/__init__.py +0 -0
  378. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/actions.py +0 -0
  379. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/app.py +0 -0
  380. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/contracts.py +0 -0
  381. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/exec.py +0 -0
  382. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/ledger.py +0 -0
  383. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/lifecycle.py +0 -0
  384. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/normalize.py +0 -0
  385. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/policy.py +0 -0
  386. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/probes.py +0 -0
  387. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/registry.py +0 -0
  388. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/runtime_config.py +0 -0
  389. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/tools.py +0 -0
  390. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_job_clock.py +0 -0
  391. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_job_validation.py +0 -0
  392. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_jobs.py +0 -0
  393. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_jobs_claim_target.py +0 -0
  394. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_jobs_expiry.py +0 -0
  395. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_jobs_hub.py +0 -0
  396. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_mcp.py +0 -0
  397. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_n8n/__init__.py +0 -0
  398. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_n8n/actions.py +0 -0
  399. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_n8n/client.py +0 -0
  400. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_n8n/contracts.py +0 -0
  401. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_n8n/lifecycle.py +0 -0
  402. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_n8n/runtime_config.py +0 -0
  403. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_n8n/tools.py +0 -0
  404. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/__init__.py +0 -0
  405. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/actions.py +0 -0
  406. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/adapters.py +0 -0
  407. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/capabilities.py +0 -0
  408. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/catalog.py +0 -0
  409. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/content_policy.py +0 -0
  410. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/contracts.py +0 -0
  411. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/excalidraw_client.py +0 -0
  412. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/lifecycle.py +0 -0
  413. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/native_client.py +0 -0
  414. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/operator_adapter.py +0 -0
  415. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/path_policy.py +0 -0
  416. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/runtime_config.py +0 -0
  417. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/store.py +0 -0
  418. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/tls.py +0 -0
  419. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/tools.py +0 -0
  420. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/utf8.py +0 -0
  421. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_operations_relay.py +0 -0
  422. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_ops.py +0 -0
  423. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_pack_relay.py +0 -0
  424. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_packs.py +0 -0
  425. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_paths.py +0 -0
  426. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_reconcile.py +0 -0
  427. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_scout_feed.py +0 -0
  428. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_t3/__init__.py +0 -0
  429. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_t3/__main__.py +0 -0
  430. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_t3/contracts.py +0 -0
  431. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_t3/fleet.py +0 -0
  432. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_t3/intake.py +0 -0
  433. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_t3/ledger.py +0 -0
  434. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_t3/lifecycle.py +0 -0
  435. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_t3/runtime_config.py +0 -0
  436. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_t3/tools.py +0 -0
  437. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_t3/watch.py +0 -0
  438. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_wazuh/__init__.py +0 -0
  439. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_wazuh/contracts.py +0 -0
  440. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_wazuh/lifecycle.py +0 -0
  441. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_wazuh/normalize.py +0 -0
  442. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_wazuh/policy.py +0 -0
  443. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_wazuh/store.py +0 -0
  444. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_wazuh/tools.py +0 -0
  445. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/__init__.py +0 -0
  446. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/__main__.py +0 -0
  447. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/allowlist.py +0 -0
  448. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/audit.py +0 -0
  449. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/baseline.py +0 -0
  450. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/cli.py +0 -0
  451. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/detectors/__init__.py +0 -0
  452. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/detectors/opf.py +0 -0
  453. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/engine.py +0 -0
  454. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/examples/n8n-validation/blocked-local-service.json +0 -0
  455. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/examples/n8n-validation/blocked-secret-token.json +0 -0
  456. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/examples/n8n-validation/clean-blog-post.json +0 -0
  457. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/examples/n8n-validation/clean-social-post.json +0 -0
  458. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/examples/n8n-validation/warn-review-email.json +0 -0
  459. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/git_commits.py +0 -0
  460. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/git_scan.py +0 -0
  461. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/n8n_advisory.py +0 -0
  462. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/n8n_validate.py +0 -0
  463. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/policies/in-house-repo.json +0 -0
  464. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/policies/openclaw-message.json +0 -0
  465. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/policies/pr-draft.json +0 -0
  466. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/policies/public-content.json +0 -0
  467. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/policies/public-repo.json +0 -0
  468. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/policy.py +0 -0
  469. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/pr_draft.py +0 -0
  470. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/pr_prepare.py +0 -0
  471. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/publish_check.py +0 -0
  472. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/report.py +0 -0
  473. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/rev_range.py +0 -0
  474. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/rules.py +0 -0
  475. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/types.py +0 -0
  476. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/handoff.py +0 -0
  477. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/handoff_cmd/__init__.py +0 -0
  478. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/handoff_cmd/drafts.py +0 -0
  479. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/handoff_cmd/inspect_ops.py +0 -0
  480. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/handoff_cmd/issue_ops.py +0 -0
  481. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/handoff_cmd/linting.py +0 -0
  482. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/handoff_cmd/migrate_ops.py +0 -0
  483. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/handoff_cmd/models.py +0 -0
  484. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/handoff_cmd/readability.py +0 -0
  485. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/handoff_cmd/receipts.py +0 -0
  486. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/handoff_cmd/sources.py +0 -0
  487. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/handoff_content.py +0 -0
  488. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/harness_profile_cmd.py +0 -0
  489. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/harness_profile_doctor.py +0 -0
  490. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/harness_profiles.py +0 -0
  491. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/hermes_adapter.py +0 -0
  492. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/inbox_lock.py +0 -0
  493. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/ingest.py +0 -0
  494. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/install.py +0 -0
  495. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/journal_export.py +0 -0
  496. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/jules_cloud.py +0 -0
  497. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/learn_cmd.py +0 -0
  498. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/localio.py +0 -0
  499. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/managed.py +0 -0
  500. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/managed_block.py +0 -0
  501. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/managed_snapshot.py +0 -0
  502. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/mcp_adapters.py +0 -0
  503. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/mcp_cmd.py +0 -0
  504. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/mcp_fidelity.py +0 -0
  505. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/mcp_runtime.py +0 -0
  506. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/mcp_server.py +0 -0
  507. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_care_closeout.py +0 -0
  508. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_care_plan.py +0 -0
  509. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_cmd.py +0 -0
  510. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_doctor/__init__.py +0 -0
  511. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_doctor/__main__.py +0 -0
  512. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_doctor/cli.py +0 -0
  513. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_doctor/compact.py +0 -0
  514. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_doctor/git.py +0 -0
  515. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_doctor/init_git.py +0 -0
  516. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_doctor/lint.py +0 -0
  517. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_doctor/parsing.py +0 -0
  518. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_doctor/paths.py +0 -0
  519. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_doctor/safety.py +0 -0
  520. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_doctor/status.py +0 -0
  521. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_doctor_cmd.py +0 -0
  522. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_hooks.py +0 -0
  523. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_identity_audit.py +0 -0
  524. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_operations.py +0 -0
  525. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_proposal_io.py +0 -0
  526. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_proposals.py +0 -0
  527. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_retrieval_eval/__init__.py +0 -0
  528. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_retrieval_eval/__main__.py +0 -0
  529. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_retrieval_eval/adapters.py +0 -0
  530. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_retrieval_eval/corpus.py +0 -0
  531. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_retrieval_eval/harness.py +0 -0
  532. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_retrieval_eval/metrics.py +0 -0
  533. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_retrieval_eval/projection.py +0 -0
  534. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_retrieval_eval/quality.py +0 -0
  535. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_retrieval_eval/report.py +0 -0
  536. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_search_diagnostics.py +0 -0
  537. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_vault.py +0 -0
  538. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/message_envelope.py +0 -0
  539. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/model_inventory.py +0 -0
  540. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/model_scorecard.py +0 -0
  541. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/model_trials.py +0 -0
  542. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/node.py +0 -0
  543. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/notifications_cmd.py +0 -0
  544. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/obsidian_vault.py +0 -0
  545. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/operator_cmd/__init__.py +0 -0
  546. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/operator_cmd/adoption.py +0 -0
  547. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/operator_cmd/guide.py +0 -0
  548. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/operator_cmd/health.py +0 -0
  549. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/operator_cmd/lifecycle.py +0 -0
  550. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/operator_cmd/migration.py +0 -0
  551. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/operator_cmd/surfaces.py +0 -0
  552. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/outcome.py +0 -0
  553. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/outcome_cmd.py +0 -0
  554. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/outcome_discovery.py +0 -0
  555. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/outcome_repair.py +0 -0
  556. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/pantry_cmd.py +0 -0
  557. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/pantry_compat.py +0 -0
  558. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/phases_cmd/__init__.py +0 -0
  559. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/phases_cmd/checks_actions.py +0 -0
  560. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/phases_cmd/constants.py +0 -0
  561. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/phases_cmd/session_lifecycle.py +0 -0
  562. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/phases_cmd/session_ops.py +0 -0
  563. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/pi_mcp_bridge.py +0 -0
  564. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/pi_mcp_cmd.py +0 -0
  565. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/proc.py +0 -0
  566. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/profiles.py +0 -0
  567. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/profiles_cmd.py +0 -0
  568. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/projection/__init__.py +0 -0
  569. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/projection/fixture.py +0 -0
  570. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/projection/kernel.py +0 -0
  571. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/projection_cmd.py +0 -0
  572. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/projects_cmd.py +0 -0
  573. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/prompt.py +0 -0
  574. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/provenance.py +0 -0
  575. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/py.typed +0 -0
  576. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/receipt_schema.py +0 -0
  577. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/receipt_signing.py +0 -0
  578. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/receipts_cmd.py +0 -0
  579. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/receipts_trailer.py +0 -0
  580. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/reconfigure.py +0 -0
  581. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/registry.py +0 -0
  582. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/release_cmd/__init__.py +0 -0
  583. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/release_cmd/candidate.py +0 -0
  584. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/release_cmd/candidate_audit_ops.py +0 -0
  585. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/release_cmd/ci.py +0 -0
  586. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/release_cmd/commands.py +0 -0
  587. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/release_cmd/evidence.py +0 -0
  588. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/release_cmd/install_smoke.py +0 -0
  589. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/release_cmd/paths.py +0 -0
  590. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/release_cmd/schema_ops.py +0 -0
  591. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/release_cmd/version_guard.py +0 -0
  592. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/release_version_sync.py +0 -0
  593. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/render.py +0 -0
  594. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/reportstore.py +0 -0
  595. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/repos_cmd/__init__.py +0 -0
  596. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/repos_cmd/actions_dispatch.py +0 -0
  597. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/repos_cmd/adoption.py +0 -0
  598. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/repos_cmd/constants.py +0 -0
  599. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/repos_cmd/fleet.py +0 -0
  600. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/repos_cmd/fleet_health.py +0 -0
  601. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/repos_cmd/friction_fleet.py +0 -0
  602. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/repos_cmd/release_ops.py +0 -0
  603. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/repos_cmd/release_train.py +0 -0
  604. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/repos_cmd/sweeps.py +0 -0
  605. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/__init__.py +0 -0
  606. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/browser_preflight.py +0 -0
  607. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/claim_audit.py +0 -0
  608. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/config.py +0 -0
  609. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/doctor.py +0 -0
  610. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/engine.py +0 -0
  611. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/extract.py +0 -0
  612. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/handoff.py +0 -0
  613. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/llm.py +0 -0
  614. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/provenance.py +0 -0
  615. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/registry.py +0 -0
  616. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/report.py +0 -0
  617. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/sources/__init__.py +0 -0
  618. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/sources/browser_ai.py +0 -0
  619. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/sources/cli.py +0 -0
  620. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/sources/local.py +0 -0
  621. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/sources/web.py +0 -0
  622. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/types.py +0 -0
  623. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research_cmd.py +0 -0
  624. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/result_integrity.py +0 -0
  625. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/roadmap_cmd.py +0 -0
  626. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/roster.py +0 -0
  627. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/roster_cmd.py +0 -0
  628. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/route_catalog.py +0 -0
  629. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/route_policy.py +0 -0
  630. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/route_receipts.py +0 -0
  631. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/router.py +0 -0
  632. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_audit.py +0 -0
  633. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_budget.py +0 -0
  634. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_checkpoint.py +0 -0
  635. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_control.py +0 -0
  636. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_control_journal.py +0 -0
  637. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_dirfd.py +0 -0
  638. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_event_cursor.py +0 -0
  639. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_events.py +0 -0
  640. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_id.py +0 -0
  641. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_journal.py +0 -0
  642. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_lifecycle.py +0 -0
  643. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_preference.py +0 -0
  644. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_projector.py +0 -0
  645. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_reap.py +0 -0
  646. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_receipts.py +0 -0
  647. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_redaction.py +0 -0
  648. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_resume.py +0 -0
  649. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_seat.py +0 -0
  650. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_shadow.py +0 -0
  651. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_transport.py +0 -0
  652. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/runbook_cmd.py +0 -0
  653. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/runguard.py +0 -0
  654. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/runs_cmd.py +0 -0
  655. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/runs_cmd_worktrees.py +0 -0
  656. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/runs_diff.py +0 -0
  657. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/runs_serve.py +0 -0
  658. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/runs_view.html +0 -0
  659. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/scanner_isolation.py +0 -0
  660. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/scorecard.py +0 -0
  661. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/scrub.py +0 -0
  662. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/search_cmd.py +0 -0
  663. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/seat_health.py +0 -0
  664. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/seat_health_policy.py +0 -0
  665. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/security_cmd/__init__.py +0 -0
  666. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/security_cmd/commands.py +0 -0
  667. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/security_cmd/config.py +0 -0
  668. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/security_cmd/enrichment.py +0 -0
  669. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/security_cmd/models.py +0 -0
  670. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/security_cmd/reports.py +0 -0
  671. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/security_cmd/scan_detectors.py +0 -0
  672. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/security_cmd/scan_engine.py +0 -0
  673. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/security_cmd/suppression.py +0 -0
  674. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/security_cmd/template_audit_ops.py +0 -0
  675. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/selection.py +0 -0
  676. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/skill_obligations.py +0 -0
  677. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/skills_cmd/__init__.py +0 -0
  678. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/skills_cmd/adapters.py +0 -0
  679. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/skills_cmd/inbox.py +0 -0
  680. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/skills_cmd/install.py +0 -0
  681. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/skills_cmd/packs.py +0 -0
  682. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/skills_cmd/registry.py +0 -0
  683. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/skills_cmd/search_validate.py +0 -0
  684. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/skills_cmd/sync_history.py +0 -0
  685. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/station.py +0 -0
  686. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/station_health.py +0 -0
  687. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/station_manifest.py +0 -0
  688. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/stations_cmd.py +0 -0
  689. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/status.py +0 -0
  690. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/telemetry_export.py +0 -0
  691. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/template_profiles.py +0 -0
  692. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/adal/memory-handoffs/TEMPLATE.md +0 -0
  693. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/aider/memory-handoffs/TEMPLATE.md +0 -0
  694. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/amp/memory-handoffs/TEMPLATE.md +0 -0
  695. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/antigravity/memory-handoffs/TEMPLATE.md +0 -0
  696. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/claude/memory-handoffs/TEMPLATE.md +0 -0
  697. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/codex/memory-handoffs/TEMPLATE.md +0 -0
  698. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/continue/memory-handoffs/TEMPLATE.md +0 -0
  699. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/control-crosswalk.json +0 -0
  700. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/copilot/memory-handoffs/TEMPLATE.md +0 -0
  701. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/crush/memory-handoffs/TEMPLATE.md +0 -0
  702. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/cursor/memory-handoffs/TEMPLATE.md +0 -0
  703. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/depth/repo.json +0 -0
  704. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/depth/workspace.json +0 -0
  705. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/evals/adversarial/failed-verification/cases/acknowledge-broken-receipt.prompt.md +0 -0
  706. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/evals/adversarial/failed-verification/cases/report-failing-tests.prompt.md +0 -0
  707. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/evals/adversarial/failed-verification/manifest.json +0 -0
  708. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/evals/adversarial/prompt-injection/cases/disregard-system-prompt.prompt.md +0 -0
  709. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/evals/adversarial/prompt-injection/cases/fake-system-block.prompt.md +0 -0
  710. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/evals/adversarial/prompt-injection/cases/handoff-lint-regression.prompt.md +0 -0
  711. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/evals/adversarial/prompt-injection/fixtures/handoff-lint-regression.md +0 -0
  712. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/evals/adversarial/prompt-injection/manifest.json +0 -0
  713. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/evals/adversarial/unsafe-command/cases/refuse-destructive-shell.prompt.md +0 -0
  714. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/evals/adversarial/unsafe-command/cases/refuse-force-push.prompt.md +0 -0
  715. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/evals/adversarial/unsafe-command/manifest.json +0 -0
  716. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/evals/adversarial/untrusted-evidence/cases/benign-quoted-payload.prompt.md +0 -0
  717. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/evals/adversarial/untrusted-evidence/cases/hostile-tool-output.prompt.md +0 -0
  718. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/evals/adversarial/untrusted-evidence/manifest.json +0 -0
  719. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/generic/harness-adapter-checklist.md +0 -0
  720. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/generic/memory-contract.md +0 -0
  721. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/goose/memory-handoffs/TEMPLATE.md +0 -0
  722. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/grok/hooks/brigade-work.json +0 -0
  723. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/grok/hooks/brigade-work.sh +0 -0
  724. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/grok/memory-handoffs/TEMPLATE.md +0 -0
  725. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/handoff/handoff-sources.example.json +0 -0
  726. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/handoff/openclaw-ingest-receipt.example.json +0 -0
  727. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/adal.json +0 -0
  728. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/aider.json +0 -0
  729. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/amp.json +0 -0
  730. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/antigravity.json +0 -0
  731. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/claude.json +0 -0
  732. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/codex.json +0 -0
  733. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/continue.json +0 -0
  734. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/copilot.json +0 -0
  735. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/crush.json +0 -0
  736. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/cursor.json +0 -0
  737. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/goose.json +0 -0
  738. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/grok.json +0 -0
  739. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/hermes.json +0 -0
  740. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/kimi.json +0 -0
  741. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/openclaw.json +0 -0
  742. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/opencode.json +0 -0
  743. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/openhands.json +0 -0
  744. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/pi.json +0 -0
  745. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/qwen.json +0 -0
  746. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/hermes/README.md +0 -0
  747. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/hermes/memory-handoffs/TEMPLATE.md +0 -0
  748. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/hooks/pre-push +0 -0
  749. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/includes/publisher.json +0 -0
  750. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/includes/repo-extras.json +0 -0
  751. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/kimi/memory-handoffs/TEMPLATE.md +0 -0
  752. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/cards/backup-restic.md +0 -0
  753. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/cards/chat-surface-crawlers.md +0 -0
  754. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/cards/content-safety.md +0 -0
  755. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/cards/handoff-flow.md +0 -0
  756. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/cards/memory-architecture.md +0 -0
  757. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/cards/memory-care-staleness.md +0 -0
  758. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/cards/memory-scanner.md +0 -0
  759. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/cards/multi-workspace-handoff-admin.md +0 -0
  760. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/cards/obsidian-notes.md +0 -0
  761. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/cards/pipeline-standups.md +0 -0
  762. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/cards/token-glace-output-compaction.md +0 -0
  763. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/cards/workspace-file-maintenance.md +0 -0
  764. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory-care/runbooks/daily-care-pass.json +0 -0
  765. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory-care/runbooks/ingest-sweep.json +0 -0
  766. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory-care/runbooks/weekly-outcome-ratchet.json +0 -0
  767. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/openclaw/README.md +0 -0
  768. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/openclaw/acp-escalation.openclaw.json +0 -0
  769. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/openclaw/memory-sweep-cron.openclaw.json +0 -0
  770. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/openclaw/model-aliases.openclaw.json +0 -0
  771. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/openclaw/ollama-memory-search.openclaw.json +0 -0
  772. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/opencode/memory-handoffs/TEMPLATE.md +0 -0
  773. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/openhands/memory-handoffs/TEMPLATE.md +0 -0
  774. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/pi/extensions/brigade-mcp-bridge.js +0 -0
  775. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/pi/memory-handoffs/TEMPLATE.md +0 -0
  776. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/qwen/memory-handoffs/TEMPLATE.md +0 -0
  777. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/repo/AGENTS.md +0 -0
  778. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/repo/CLAUDE.md +0 -0
  779. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/repo/INSTALL_FOR_AGENTS.md +0 -0
  780. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/rosters/budget-open-weight.toml +0 -0
  781. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/rosters/full-multi-lane.toml +0 -0
  782. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/rosters/minimal-single-cli.toml +0 -0
  783. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/rosters/review-heavy.toml +0 -0
  784. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/scripts/backup-restic.sh +0 -0
  785. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/brigade-work/CHANGELOG.md +0 -0
  786. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/brigade-work/SKILL.md +0 -0
  787. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/brigade-work/skill.json +0 -0
  788. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/card-refresh/CHANGELOG.md +0 -0
  789. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/card-refresh/SKILL.md +0 -0
  790. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/card-refresh/skill.json +0 -0
  791. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/forward-plan/CHANGELOG.md +0 -0
  792. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/forward-plan/SKILL.md +0 -0
  793. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/forward-plan/plan.template.json +0 -0
  794. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/forward-plan/skill.json +0 -0
  795. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/handoff-inbox-drain/CHANGELOG.md +0 -0
  796. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/handoff-inbox-drain/SKILL.md +0 -0
  797. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/handoff-inbox-drain/skill.json +0 -0
  798. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/note/CHANGELOG.md +0 -0
  799. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/note/SKILL.md +0 -0
  800. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/note/skill.json +0 -0
  801. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/ultra-work-scout/CHANGELOG.md +0 -0
  802. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/ultra-work-scout/SKILL.md +0 -0
  803. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/ultra-work-scout/skill.json +0 -0
  804. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/stations/managed-snapshot.json +0 -0
  805. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/workspace/AGENTS.md +0 -0
  806. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/workspace/CLAUDE.md +0 -0
  807. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/workspace/HEARTBEAT.md +0 -0
  808. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/workspace/IDENTITY.md +0 -0
  809. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/workspace/INSTALL_FOR_AGENTS.md +0 -0
  810. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/workspace/MEMORY.md +0 -0
  811. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/workspace/SAFETY_RULES.md +0 -0
  812. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/workspace/SOUL.md +0 -0
  813. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/workspace/TOOLS.md +0 -0
  814. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/workspace/USER.md +0 -0
  815. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/workspace/rules/acceptance-driven-work.md +0 -0
  816. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/workspace/rules/issue-tdd-loop.md +0 -0
  817. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates.py +0 -0
  818. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tokens_cmd.py +0 -0
  819. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/toml_compat.py +0 -0
  820. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/__init__.py +0 -0
  821. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/calls.py +0 -0
  822. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/catalog_health.py +0 -0
  823. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/catalog_manage.py +0 -0
  824. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/checkpoint_store.py +0 -0
  825. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/checkpoints.py +0 -0
  826. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/config.py +0 -0
  827. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/constants.py +0 -0
  828. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/helpers.py +0 -0
  829. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/issues.py +0 -0
  830. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/mcp.py +0 -0
  831. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/packs.py +0 -0
  832. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/paths.py +0 -0
  833. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/projections.py +0 -0
  834. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/runs.py +0 -0
  835. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/runtimes.py +0 -0
  836. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/safety.py +0 -0
  837. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/status.py +0 -0
  838. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/trust_gate.py +0 -0
  839. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/untrusted.py +0 -0
  840. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/untrusted_cmd.py +0 -0
  841. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/verification_contract.py +0 -0
  842. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/verify_manifest.py +0 -0
  843. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/verify_trial.py +0 -0
  844. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/version_cmd.py +0 -0
  845. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/wiring.py +0 -0
  846. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/__init__.py +0 -0
  847. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/backup.py +0 -0
  848. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/campaign.py +0 -0
  849. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/claiming.py +0 -0
  850. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/config.py +0 -0
  851. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/constants.py +0 -0
  852. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/edges.py +0 -0
  853. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/footprint.py +0 -0
  854. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/helpers.py +0 -0
  855. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/imports.py +0 -0
  856. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/inbox_lock.py +0 -0
  857. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/ledger/__init__.py +0 -0
  858. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/ledger/authority_store.py +0 -0
  859. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/ledger/descriptor_anchors.py +0 -0
  860. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/ledger/import_model.py +0 -0
  861. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/ledger/inbox_provenance.py +0 -0
  862. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/ledger/locking.py +0 -0
  863. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/ledger/queries_handoffs.py +0 -0
  864. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/ledger/tasks_plans.py +0 -0
  865. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/nt_dirfd.py +0 -0
  866. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/partition.py +0 -0
  867. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/reviews.py +0 -0
  868. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/scanner_platform.py +0 -0
  869. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/scanners.py +0 -0
  870. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/services.py +0 -0
  871. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/session/__init__.py +0 -0
  872. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/session/briefing.py +0 -0
  873. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/session/fleet_routing.py +0 -0
  874. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/session/lifecycle.py +0 -0
  875. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/session/run_status.py +0 -0
  876. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/session/task_ops.py +0 -0
  877. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/session_resume.py +0 -0
  878. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/sweeps.py +0 -0
  879. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/verify_ranking.py +0 -0
  880. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/verify_scoreability.py +0 -0
  881. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_run_archive.py +0 -0
  882. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worker_events.py +0 -0
  883. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worker_failure.py +0 -0
  884. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/workflow_cmd.py +0 -0
  885. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worklore_brigade.py +0 -0
  886. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worklore_brigade_sync.py +0 -0
  887. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worklore_client.py +0 -0
  888. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worklore_github.py +0 -0
  889. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worklore_github_sync.py +0 -0
  890. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worklore_http.py +0 -0
  891. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worklore_ownership.py +0 -0
  892. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worklore_scope.py +0 -0
  893. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worklore_store.py +0 -0
  894. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worklore_store_operations.py +0 -0
  895. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worklore_validate.py +0 -0
  896. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade_cli.egg-info/dependency_links.txt +0 -0
  897. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade_cli.egg-info/entry_points.txt +0 -0
  898. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade_cli.egg-info/requires.txt +0 -0
  899. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade_cli.egg-info/top_level.txt +0 -0
  900. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_aboyeur.py +0 -0
  901. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_aboyeur_facade.py +0 -0
  902. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_aboyeur_orchestrator_health_routing.py +0 -0
  903. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_aboyeur_run_io.py +0 -0
  904. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_aboyeur_seat_health_probe.py +0 -0
  905. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_aboyeur_status.py +0 -0
  906. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_acpx_adapter.py +0 -0
  907. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_actionqueue.py +0 -0
  908. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_add.py +0 -0
  909. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_agent_change.py +0 -0
  910. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_agent_change_approval_integration.py +0 -0
  911. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_agent_change_approval_policy.py +0 -0
  912. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_agent_change_approval_resources.py +0 -0
  913. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_agent_notify_station_contracts.py +0 -0
  914. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_agent_request.py +0 -0
  915. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_agent_skill_format.py +0 -0
  916. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_agent_write_probes.py +0 -0
  917. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_agents.py +0 -0
  918. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_agents_model_pin.py +0 -0
  919. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_agents_oracle.py +0 -0
  920. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_agents_windows_executable.py +0 -0
  921. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_approval.py +0 -0
  922. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_attestation.py +0 -0
  923. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_attestation_input.py +0 -0
  924. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_attestation_input_integration.py +0 -0
  925. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_attestation_receipt.py +0 -0
  926. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_authority_broker.py +0 -0
  927. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_authority_store_hmac.py +0 -0
  928. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_budgets.py +0 -0
  929. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_candidate_set.py +0 -0
  930. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_card_fingerprint.py +0 -0
  931. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_card_identity.py +0 -0
  932. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_care_cmd.py +0 -0
  933. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_causal_receipt.py +0 -0
  934. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_center_actions_cmd.py +0 -0
  935. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_center_agent_activity.py +0 -0
  936. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_center_dashboard.py +0 -0
  937. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_center_page_load.py +0 -0
  938. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_center_readiness_cmd.py +0 -0
  939. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_center_report_cmd.py +0 -0
  940. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_center_research_view.py +0 -0
  941. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_center_serve.py +0 -0
  942. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_ci_pytest_shard.py +0 -0
  943. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_ci_workflow.py +0 -0
  944. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claim_loss_review.py +0 -0
  945. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_actions_diagnostics.py +0 -0
  946. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_actions_evidence.py +0 -0
  947. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_actions_http.py +0 -0
  948. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_actions_import.py +0 -0
  949. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_actions_metadata.py +0 -0
  950. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_cloud.py +0 -0
  951. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_cloud_adoption.py +0 -0
  952. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_cloud_identity.py +0 -0
  953. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_compaction_marker.py +0 -0
  954. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_doctor.py +0 -0
  955. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_entry.py +0 -0
  956. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_envelope.py +0 -0
  957. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_fingerprint.py +0 -0
  958. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_heartbeat.py +0 -0
  959. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_latch_race.py +0 -0
  960. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_runtime.py +0 -0
  961. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_settings_merge.py +0 -0
  962. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_stdin_bounds.py +0 -0
  963. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_tilde_user.py +0 -0
  964. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_user_scope.py +0 -0
  965. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_user_target.py +0 -0
  966. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_review_evidence.py +0 -0
  967. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_review_history.py +0 -0
  968. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_review_import.py +0 -0
  969. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_workflow.py +0 -0
  970. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_cli_help.py +0 -0
  971. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_cli_inventory_contract.py +0 -0
  972. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_cli_setup.py +0 -0
  973. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_cli_update.py +0 -0
  974. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_cloud_tracker.py +0 -0
  975. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_code_export.py +0 -0
  976. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_code_graph_brief.py +0 -0
  977. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_code_reference_schema.py +0 -0
  978. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_code_verbs_and_target.py +0 -0
  979. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_codex_appserver.py +0 -0
  980. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_codex_appserver_integration.py +0 -0
  981. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_codex_cloud.py +0 -0
  982. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_commit_linkage.py +0 -0
  983. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_completions.py +0 -0
  984. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_component_bins.py +0 -0
  985. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_component_install.py +0 -0
  986. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_component_manifest.py +0 -0
  987. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_component_manifest_provenance.py +0 -0
  988. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_component_paths.py +0 -0
  989. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_component_report.py +0 -0
  990. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_component_state.py +0 -0
  991. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_config.py +0 -0
  992. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_conftest_home_isolation.py +0 -0
  993. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_conftest_host_daemons.py +0 -0
  994. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_context_cmd.py +0 -0
  995. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_context_eval.py +0 -0
  996. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_context_learning_closeout_cmd.py +0 -0
  997. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_context_preview.py +0 -0
  998. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_control_crosswalk.py +0 -0
  999. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_cosign_attestation.py +0 -0
  1000. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_cosign_statement_profiles.py +0 -0
  1001. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_cursor_cloud.py +0 -0
  1002. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_cursor_install_state_migration.py +0 -0
  1003. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_cursor_user_cmd.py +0 -0
  1004. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_daily_driver_cmd.py +0 -0
  1005. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dashboard_code_graph.py +0 -0
  1006. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dashboard_handoffs.py +0 -0
  1007. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dashboard_memory_operations.py +0 -0
  1008. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dashboard_outcomes.py +0 -0
  1009. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dashboard_runs.py +0 -0
  1010. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dashboard_status.py +0 -0
  1011. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dashboard_work.py +0 -0
  1012. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_direct_worker_finish_tree.py +0 -0
  1013. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_directory_authority_legacy_migration.py +0 -0
  1014. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dirfd.py +0 -0
  1015. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_doctor.py +0 -0
  1016. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_doctor_agent.py +0 -0
  1017. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dogfood_cmd.py +0 -0
  1018. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_access_auth.py +0 -0
  1019. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_adapter.py +0 -0
  1020. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_compat.py +0 -0
  1021. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_contracts.py +0 -0
  1022. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_events.py +0 -0
  1023. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_fleet_tools.py +0 -0
  1024. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_hub_tools.py +0 -0
  1025. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_inbox_tools.py +0 -0
  1026. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_lifecycle.py +0 -0
  1027. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_memory_tools.py +0 -0
  1028. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_process.py +0 -0
  1029. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_runtime.py +0 -0
  1030. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_state.py +0 -0
  1031. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_watch.py +0 -0
  1032. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_error_refusal_copy.py +0 -0
  1033. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_evidence_ack_acceptance.py +0 -0
  1034. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_evidence_ack_crypto.py +0 -0
  1035. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_evidence_ack_protocol.py +0 -0
  1036. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_evidence_branded_surface.py +0 -0
  1037. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_evidence_cmd.py +0 -0
  1038. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_evidence_derivative.py +0 -0
  1039. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_evidence_package.py +0 -0
  1040. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_evidence_package_snapshot.py +0 -0
  1041. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_evidence_redaction.py +0 -0
  1042. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_evidence_runtime.py +0 -0
  1043. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_extras_gate.py +0 -0
  1044. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_action_dispatch_cmd.py +0 -0
  1045. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_agent_unread.py +0 -0
  1046. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_authority_proof.py +0 -0
  1047. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_campaign.py +0 -0
  1048. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_campaign_authority.py +0 -0
  1049. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_center_links.py +0 -0
  1050. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_claim_display.py +0 -0
  1051. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_claim_generations.py +0 -0
  1052. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_claim_loss_cancellation.py +0 -0
  1053. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_claim_release.py +0 -0
  1054. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_claim_target.py +0 -0
  1055. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_claims.py +0 -0
  1056. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_client_hardening.py +0 -0
  1057. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_client_message_credentials.py +0 -0
  1058. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_cloud.py +0 -0
  1059. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_dot.py +0 -0
  1060. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_enrollment.py +0 -0
  1061. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_events_cli.py +0 -0
  1062. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_export.py +0 -0
  1063. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_hub_capacity.py +0 -0
  1064. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_hub_container_recipes.py +0 -0
  1065. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_hub_event_bounds.py +0 -0
  1066. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_hub_grokbot_expiry.py +0 -0
  1067. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_hub_policy.py +0 -0
  1068. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_hub_request_bounds.py +0 -0
  1069. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_hub_review_bounds.py +0 -0
  1070. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_hub_server.py +0 -0
  1071. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_master_roster.py +0 -0
  1072. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_message_grants.py +0 -0
  1073. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_messages.py +0 -0
  1074. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_messages_metadata.py +0 -0
  1075. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_messages_startup.py +0 -0
  1076. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_model_admission.py +0 -0
  1077. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_model_inventory.py +0 -0
  1078. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_model_roster.py +0 -0
  1079. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_models_list.py +0 -0
  1080. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_native_launch_binding.py +0 -0
  1081. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_nodes.py +0 -0
  1082. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_policy.py +0 -0
  1083. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_policy_api.py +0 -0
  1084. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_policy_api_context.py +0 -0
  1085. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_policy_cli.py +0 -0
  1086. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_policy_core_completion.py +0 -0
  1087. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_policy_delegation.py +0 -0
  1088. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_policy_migration.py +0 -0
  1089. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_policy_page.py +0 -0
  1090. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_quota.py +0 -0
  1091. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_repo_policy_page.py +0 -0
  1092. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_roster_page.py +0 -0
  1093. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_session_bootstrap.py +0 -0
  1094. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_session_presence.py +0 -0
  1095. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_sync.py +0 -0
  1096. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_t3_contract.py +0 -0
  1097. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_t3_transport.py +0 -0
  1098. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_work_next.py +0 -0
  1099. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_work_ownership_cli.py +0 -0
  1100. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_forward_plan_skill.py +0 -0
  1101. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fragments.py +0 -0
  1102. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_friction_cmd.py +0 -0
  1103. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_generated_patch_quarantine.py +0 -0
  1104. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_gitignore.py +0 -0
  1105. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_governance_inventory.py +0 -0
  1106. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_graphtrail_delta.py +0 -0
  1107. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grok_hook_runtime.py +0 -0
  1108. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_backup_actions.py +0 -0
  1109. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_backup_adapters.py +0 -0
  1110. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_backup_contracts.py +0 -0
  1111. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_backup_ledger.py +0 -0
  1112. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_backup_lifecycle.py +0 -0
  1113. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_backup_runtime.py +0 -0
  1114. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_build_feed.py +0 -0
  1115. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_client_identity.py +0 -0
  1116. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_feed.py +0 -0
  1117. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_findings.py +0 -0
  1118. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_findings_relay.py +0 -0
  1119. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_fleet_actions.py +0 -0
  1120. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_fleet_app.py +0 -0
  1121. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_fleet_contracts.py +0 -0
  1122. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_fleet_exec.py +0 -0
  1123. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_fleet_ledger.py +0 -0
  1124. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_fleet_lifecycle.py +0 -0
  1125. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_fleet_normalize.py +0 -0
  1126. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_fleet_probes.py +0 -0
  1127. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_fleet_registry.py +0 -0
  1128. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_fleet_remediation.py +0 -0
  1129. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_fleet_runtime_config.py +0 -0
  1130. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_fleet_tools.py +0 -0
  1131. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_jobs.py +0 -0
  1132. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_mcp.py +0 -0
  1133. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_n8n_actions.py +0 -0
  1134. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_n8n_client.py +0 -0
  1135. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_n8n_contracts.py +0 -0
  1136. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_n8n_lifecycle.py +0 -0
  1137. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_n8n_runtime.py +0 -0
  1138. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_n8n_tools.py +0 -0
  1139. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_obsidian_actions.py +0 -0
  1140. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_obsidian_adapters.py +0 -0
  1141. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_obsidian_capabilities.py +0 -0
  1142. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_obsidian_client.py +0 -0
  1143. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_obsidian_contracts.py +0 -0
  1144. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_obsidian_excalidraw_client.py +0 -0
  1145. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_obsidian_lifecycle.py +0 -0
  1146. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_obsidian_operator_install.py +0 -0
  1147. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_obsidian_operator_plugin.py +0 -0
  1148. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_obsidian_phase2.py +0 -0
  1149. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_obsidian_policy.py +0 -0
  1150. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_obsidian_runtime.py +0 -0
  1151. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_operations_relay.py +0 -0
  1152. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_ops.py +0 -0
  1153. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_pack_relay.py +0 -0
  1154. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_packs.py +0 -0
  1155. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_reconcile.py +0 -0
  1156. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_scout_feed.py +0 -0
  1157. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_t3_contracts.py +0 -0
  1158. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_t3_fleet.py +0 -0
  1159. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_t3_intake.py +0 -0
  1160. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_t3_ledger.py +0 -0
  1161. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_t3_lifecycle.py +0 -0
  1162. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_t3_runtime.py +0 -0
  1163. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_t3_tools.py +0 -0
  1164. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_t3_watch.py +0 -0
  1165. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_wazuh_contracts.py +0 -0
  1166. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_wazuh_lifecycle.py +0 -0
  1167. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_wazuh_normalize.py +0 -0
  1168. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_wazuh_policy.py +0 -0
  1169. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_wazuh_store.py +0 -0
  1170. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_wazuh_tools.py +0 -0
  1171. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_handoff.py +0 -0
  1172. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_handoff_cmd.py +0 -0
  1173. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_handoff_injection_lint.py +0 -0
  1174. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_handoff_readability.py +0 -0
  1175. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_harness_conformance_probe.py +0 -0
  1176. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_harness_profile_cmd.py +0 -0
  1177. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_harness_user_scope.py +0 -0
  1178. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_harness_user_scope_slice2.py +0 -0
  1179. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_hub_seat_resolution.py +0 -0
  1180. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_ingest.py +0 -0
  1181. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_init.py +0 -0
  1182. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_install.py +0 -0
  1183. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_instruction_profiles.py +0 -0
  1184. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_issue266_benchmark.py +0 -0
  1185. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_issue266_work_status_memory.py +0 -0
  1186. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_issue362_code_evidence_facades.py +0 -0
  1187. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_journal_export.py +0 -0
  1188. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_jules_cloud.py +0 -0
  1189. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_ledger_1233_findings.py +0 -0
  1190. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_ledger_facade.py +0 -0
  1191. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_localio.py +0 -0
  1192. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_managed.py +0 -0
  1193. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_managed_block.py +0 -0
  1194. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_managed_snapshot.py +0 -0
  1195. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_mcp_adapters.py +0 -0
  1196. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_mcp_cmd.py +0 -0
  1197. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_mcp_fidelity.py +0 -0
  1198. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_mcp_integration.py +0 -0
  1199. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_mcp_projection.py +0 -0
  1200. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_mcp_runtime.py +0 -0
  1201. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_mcp_server.py +0 -0
  1202. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_mcp_url_only_import.py +0 -0
  1203. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_mcp_user_scope.py +0 -0
  1204. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_care_skills.py +0 -0
  1205. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_cmd.py +0 -0
  1206. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_hooks.py +0 -0
  1207. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_identity_audit.py +0 -0
  1208. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_inventory_cmd.py +0 -0
  1209. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_proposal_capabilities.py +0 -0
  1210. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_proposals.py +0 -0
  1211. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_retrieval_eval.py +0 -0
  1212. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_search_mcp.py +0 -0
  1213. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_search_redundancy.py +0 -0
  1214. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_task_recall.py +0 -0
  1215. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_topology_cmd.py +0 -0
  1216. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_vault_projection.py +0 -0
  1217. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_vault_propose.py +0 -0
  1218. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_vault_search.py +0 -0
  1219. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_message_envelope.py +0 -0
  1220. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_model_inventory.py +0 -0
  1221. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_model_scorecard.py +0 -0
  1222. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_model_seat_denial.py +0 -0
  1223. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_model_trials.py +0 -0
  1224. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_model_trials_adversarial_fixtures.py +0 -0
  1225. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_module_size_ratchet.py +0 -0
  1226. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_mypy_override_ratchet.py +0 -0
  1227. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_neutrality.py +0 -0
  1228. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_node.py +0 -0
  1229. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_notifications_cmd.py +0 -0
  1230. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_opencode_mcp_contract.py +0 -0
  1231. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_opencode_profile_contract.py +0 -0
  1232. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_operator_checkup.py +0 -0
  1233. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_operator_cmd.py +0 -0
  1234. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_outcome.py +0 -0
  1235. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_outcome_activegraph.py +0 -0
  1236. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_outcome_backfill_scorecard.py +0 -0
  1237. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_outcome_cmd.py +0 -0
  1238. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_outcome_execute.py +0 -0
  1239. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_outcome_infrastructure_attribution.py +0 -0
  1240. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_outcome_repair.py +0 -0
  1241. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_outcome_reused_receipt_dedup.py +0 -0
  1242. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_pantry_cmd.py +0 -0
  1243. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_pantry_compat.py +0 -0
  1244. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_parity_backlog.py +0 -0
  1245. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_phase257_facades.py +0 -0
  1246. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_phase_ledger_session_cmd.py +0 -0
  1247. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_phases_cmd_facade.py +0 -0
  1248. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_pi_mcp_bridge.py +0 -0
  1249. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_posix_facade_behaviour.py +0 -0
  1250. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_posix_facade_guard.py +0 -0
  1251. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_pre_push_hook.py +0 -0
  1252. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_privacy_regression.py +0 -0
  1253. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_proc.py +0 -0
  1254. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_producer_run_id.py +0 -0
  1255. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_profiles.py +0 -0
  1256. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_projection_cli.py +0 -0
  1257. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_projection_conformance.py +0 -0
  1258. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_projection_kernel.py +0 -0
  1259. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_prompt.py +0 -0
  1260. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_provenance_envelope.py +0 -0
  1261. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_publish_workflow.py +0 -0
  1262. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_read_only_enforcement.py +0 -0
  1263. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_readme_brand_header.py +0 -0
  1264. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_receipt_schema_audit.py +0 -0
  1265. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_receipt_signing.py +0 -0
  1266. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_receipts_cmd.py +0 -0
  1267. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_receipts_trailer.py +0 -0
  1268. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_reconfigure.py +0 -0
  1269. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_registry.py +0 -0
  1270. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_release_checklist.py +0 -0
  1271. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_release_ci_health_cmd.py +0 -0
  1272. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_release_cmd.py +0 -0
  1273. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_release_manifest_generator.py +0 -0
  1274. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_release_metadata.py +0 -0
  1275. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_release_readiness_hygiene_cmd.py +0 -0
  1276. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_release_reconcile_evidence_cmd.py +0 -0
  1277. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_release_smoke_health_cmd.py +0 -0
  1278. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_release_train_evidence_cmd.py +0 -0
  1279. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_release_version_guard.py +0 -0
  1280. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_release_version_sync.py +0 -0
  1281. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_release_waivers_manifest_cmd.py +0 -0
  1282. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_repeat_watch_approval_runner.py +0 -0
  1283. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_report_review_closeout_cmd.py +0 -0
  1284. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_reportstore.py +0 -0
  1285. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_repos_actions_cmd.py +0 -0
  1286. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_repos_adoption_cmd.py +0 -0
  1287. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_repos_cmd.py +0 -0
  1288. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_repos_cmd_facade.py +0 -0
  1289. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_repos_friction_cmd.py +0 -0
  1290. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_repos_release_train_cmd.py +0 -0
  1291. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_repos_sweep_health_cmd.py +0 -0
  1292. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_acceptance.py +0 -0
  1293. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_browser_ai.py +0 -0
  1294. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_claim_audit.py +0 -0
  1295. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_cli_sources.py +0 -0
  1296. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_cmd.py +0 -0
  1297. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_config.py +0 -0
  1298. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_doctor.py +0 -0
  1299. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_engine.py +0 -0
  1300. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_extract.py +0 -0
  1301. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_finding_envelope.py +0 -0
  1302. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_handoff.py +0 -0
  1303. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_llm.py +0 -0
  1304. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_local_sources.py +0 -0
  1305. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_provenance.py +0 -0
  1306. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_registry.py +0 -0
  1307. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_report.py +0 -0
  1308. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_review_regressions.py +0 -0
  1309. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_types.py +0 -0
  1310. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_web.py +0 -0
  1311. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_result_integrity.py +0 -0
  1312. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_roadmap_cmd.py +0 -0
  1313. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_roadmap_inventory_cmd.py +0 -0
  1314. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_roster.py +0 -0
  1315. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_roster_cmd.py +0 -0
  1316. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_roster_doctor.py +0 -0
  1317. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_route_policy.py +0 -0
  1318. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_route_receipts.py +0 -0
  1319. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_router.py +0 -0
  1320. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_router_properties.py +0 -0
  1321. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_audit.py +0 -0
  1322. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_budget.py +0 -0
  1323. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_checkpoint.py +0 -0
  1324. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_cli.py +0 -0
  1325. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_control.py +0 -0
  1326. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_detach.py +0 -0
  1327. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_dirfd.py +0 -0
  1328. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_event_cursor.py +0 -0
  1329. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_events.py +0 -0
  1330. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_events_cursor_control.py +0 -0
  1331. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_journal.py +0 -0
  1332. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_journal_measurement.py +0 -0
  1333. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_journal_process_qualification.py +0 -0
  1334. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_journal_qualification.py +0 -0
  1335. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_lifecycle.py +0 -0
  1336. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_preference.py +0 -0
  1337. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_projector.py +0 -0
  1338. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_reap.py +0 -0
  1339. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_receipts.py +0 -0
  1340. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_redaction.py +0 -0
  1341. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_resume.py +0 -0
  1342. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_seat.py +0 -0
  1343. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_shadow.py +0 -0
  1344. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_transport.py +0 -0
  1345. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_transport_dag.py +0 -0
  1346. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_transport_env.py +0 -0
  1347. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_transport_failfast.py +0 -0
  1348. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_transport_recovery.py +0 -0
  1349. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_worktree.py +0 -0
  1350. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_runbook_cmd.py +0 -0
  1351. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_runbook_import.py +0 -0
  1352. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_runguard.py +0 -0
  1353. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_runguard_wait.py +0 -0
  1354. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_runs_cmd.py +0 -0
  1355. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_runs_diff.py +0 -0
  1356. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_runs_json_contracts.py +0 -0
  1357. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_runs_serve.py +0 -0
  1358. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_runs_watch.py +0 -0
  1359. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_scanner_runs_dir_adoption.py +0 -0
  1360. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_scorecard.py +0 -0
  1361. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_scorecard_reconcile.py +0 -0
  1362. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_scrub.py +0 -0
  1363. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_search_cmd.py +0 -0
  1364. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_seat_health.py +0 -0
  1365. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_seat_health_policy.py +0 -0
  1366. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_security_cmd.py +0 -0
  1367. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_security_diff.py +0 -0
  1368. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_security_template_audit_cmd.py +0 -0
  1369. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_selection.py +0 -0
  1370. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_size_ratchet_baseline.py +0 -0
  1371. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_skill_obligations_audit.py +0 -0
  1372. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_skill_templates_metadata.py +0 -0
  1373. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_skills_cmd.py +0 -0
  1374. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_skills_cmd_facade.py +0 -0
  1375. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_skills_state_windows.py +0 -0
  1376. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_station.py +0 -0
  1377. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_station_manifest.py +0 -0
  1378. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_stations_discover.py +0 -0
  1379. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_stations_verify.py +0 -0
  1380. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_status.py +0 -0
  1381. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_subprocess_guards.py +0 -0
  1382. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_surface_aware_install.py +0 -0
  1383. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_telemetry_export.py +0 -0
  1384. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_template_profiles.py +0 -0
  1385. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_test_fixture_contract.py +0 -0
  1386. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_thread_sync.py +0 -0
  1387. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_tokens_cmd.py +0 -0
  1388. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_toml_compat.py +0 -0
  1389. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_tool_output_compaction.py +0 -0
  1390. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_tools_cmd_facade.py +0 -0
  1391. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_trust_capability.py +0 -0
  1392. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_untrusted.py +0 -0
  1393. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_untrusted_cmd.py +0 -0
  1394. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_verification_contract.py +0 -0
  1395. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_verify_brigade_skill.py +0 -0
  1396. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_verify_manifest_tracked.py +0 -0
  1397. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_verify_parallel.py +0 -0
  1398. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_verify_script.py +0 -0
  1399. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_verify_trial.py +0 -0
  1400. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_version_sync_script.py +0 -0
  1401. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_waiver_policy_health_cmd.py +0 -0
  1402. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_windows_job.py +0 -0
  1403. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_windows_pytest.py +0 -0
  1404. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_windows_read_security.py +0 -0
  1405. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_wiring_resolve_target.py +0 -0
  1406. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_backup.py +0 -0
  1407. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_campaign.py +0 -0
  1408. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_claim.py +0 -0
  1409. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_dispatch_annotations.py +0 -0
  1410. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_edges.py +0 -0
  1411. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_facade.py +0 -0
  1412. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_footprint.py +0 -0
  1413. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_imports.py +0 -0
  1414. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_ledger.py +0 -0
  1415. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_ledger_integrity.py +0 -0
  1416. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_partition.py +0 -0
  1417. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_reviews.py +0 -0
  1418. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_scanners.py +0 -0
  1419. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_services.py +0 -0
  1420. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_session.py +0 -0
  1421. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_sweeps.py +0 -0
  1422. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_verify_ranking.py +0 -0
  1423. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_work_graph_hardening.py +0 -0
  1424. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_import_inbox_windows.py +0 -0
  1425. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_import_provenance_stamp.py +0 -0
  1426. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_run_archive.py +0 -0
  1427. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_store_measurement.py +0 -0
  1428. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_worker_events.py +0 -0
  1429. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_worker_failure.py +0 -0
  1430. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_workflow_cmd.py +0 -0
  1431. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_worklore_brigade.py +0 -0
  1432. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_worklore_client.py +0 -0
  1433. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_worklore_github.py +0 -0
  1434. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_worklore_http.py +0 -0
  1435. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_worklore_ownership.py +0 -0
  1436. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_worklore_scope.py +0 -0
  1437. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_worklore_store.py +0 -0
  1438. {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_worklore_validate.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: brigade-cli
3
- Version: 0.28.0
3
+ Version: 0.29.0
4
4
  Summary: Your agents run loops. Brigade keeps the receipts. Local control plane for multi-agent coding: share MCP/tools/memory, remember via handoffs, prove with file receipts, improve by promoting skills only on real exit codes. Claude Code, Codex, Grok, Hermes, OpenClaw, and more. Stations for evidence, code graph, pantry, skills. pipx install brigade-cli.
5
5
  Author-email: Solomon Neas <me@solomonneas.dev>
6
6
  License: MIT
@@ -72,7 +72,7 @@ Dynamic: license-file
72
72
  <img src="https://shieldcn.dev/badge/license-MIT-4e7247.svg?size=xs" alt="MIT license">
73
73
  </p>
74
74
 
75
- Published **v0.27.0** is the stable install (`brigade-cli==0.27.0`). It adds per-repo parallel-safe work waves, cross-repo ready-work campaigns, Memory Operations, an optional fleet hub, care-managed memory jobs, cloud seats with receipts, vault projection, run lineage, code-graph views, bounded recall, declared budgets, and a machine-readable control crosswalk. Main is now the **0.28 beta** line.
75
+ Published **v0.28.0** is the stable install (`brigade-cli==0.28.0`). It hardens fleet claims with claim-loss cancellation, generation fences that reject stale claim holders and operations, and bounded Fleet Hub requests, keeps hook session state inside validated directories, and adds the dot connector pack. v0.27.0 added per-repo parallel-safe work waves, cross-repo ready-work campaigns, Memory Operations, an optional fleet hub, care-managed memory jobs, cloud seats with receipts, vault projection, run lineage, code-graph views, bounded recall, declared budgets, and a machine-readable control crosswalk. Main is now the **0.29 beta** line.
76
76
 
77
77
  ## What it does
78
78
 
@@ -88,7 +88,7 @@ Learning in Brigade is outcome-based skill scoring, promotion, and rollback from
88
88
 
89
89
  Install with `pipx install brigade-cli` or `uv tool install brigade-cli`, then follow the [install guide](https://brigade.tools/docs/getting-started/install), [QUICKSTART.md](QUICKSTART.md), or give [first 10 minutes](docs/first-10-minutes.md) and [docs/agents-guide.md](docs/agents-guide.md) to your coding agent.
90
90
 
91
- Stable channel: published v0.27.0. Preview channel: `brigade update --channel beta` for `0.28.0.devYYYYMMDD` wheels. Details: [update channels](docs/update-channels.md).
91
+ Stable channel: published v0.28.0. Preview channel: `brigade update --channel beta` for `0.29.0.devYYYYMMDD` wheels. Details: [update channels](docs/update-channels.md).
92
92
 
93
93
  ## How it compares
94
94
 
@@ -87,7 +87,7 @@ uv tool install brigade-cli
87
87
  brigade setup
88
88
  ```
89
89
 
90
- For an intentional Brigade development machine on the `0.28` preview line:
90
+ For an intentional Brigade development machine on the `0.29` preview line:
91
91
 
92
92
  ```bash
93
93
  brigade update --channel beta
@@ -23,7 +23,7 @@
23
23
  <img src="https://shieldcn.dev/badge/license-MIT-4e7247.svg?size=xs" alt="MIT license">
24
24
  </p>
25
25
 
26
- Published **v0.27.0** is the stable install (`brigade-cli==0.27.0`). It adds per-repo parallel-safe work waves, cross-repo ready-work campaigns, Memory Operations, an optional fleet hub, care-managed memory jobs, cloud seats with receipts, vault projection, run lineage, code-graph views, bounded recall, declared budgets, and a machine-readable control crosswalk. Main is now the **0.28 beta** line.
26
+ Published **v0.28.0** is the stable install (`brigade-cli==0.28.0`). It hardens fleet claims with claim-loss cancellation, generation fences that reject stale claim holders and operations, and bounded Fleet Hub requests, keeps hook session state inside validated directories, and adds the dot connector pack. v0.27.0 added per-repo parallel-safe work waves, cross-repo ready-work campaigns, Memory Operations, an optional fleet hub, care-managed memory jobs, cloud seats with receipts, vault projection, run lineage, code-graph views, bounded recall, declared budgets, and a machine-readable control crosswalk. Main is now the **0.29 beta** line.
27
27
 
28
28
  ## What it does
29
29
 
@@ -39,7 +39,7 @@ Learning in Brigade is outcome-based skill scoring, promotion, and rollback from
39
39
 
40
40
  Install with `pipx install brigade-cli` or `uv tool install brigade-cli`, then follow the [install guide](https://brigade.tools/docs/getting-started/install), [QUICKSTART.md](QUICKSTART.md), or give [first 10 minutes](docs/first-10-minutes.md) and [docs/agents-guide.md](docs/agents-guide.md) to your coding agent.
41
41
 
42
- Stable channel: published v0.27.0. Preview channel: `brigade update --channel beta` for `0.28.0.devYYYYMMDD` wheels. Details: [update channels](docs/update-channels.md).
42
+ Stable channel: published v0.28.0. Preview channel: `brigade update --channel beta` for `0.29.0.devYYYYMMDD` wheels. Details: [update channels](docs/update-channels.md).
43
43
 
44
44
  ## How it compares
45
45
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "brigade-cli"
7
- version = "0.28.0"
7
+ version = "0.29.0"
8
8
  description = "Your agents run loops. Brigade keeps the receipts. Local control plane for multi-agent coding: share MCP/tools/memory, remember via handoffs, prove with file receipts, improve by promoting skills only on real exit codes. Claude Code, Codex, Grok, Hermes, OpenClaw, and more. Stations for evidence, code graph, pantry, skills. pipx install brigade-cli."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -1,3 +1,3 @@
1
1
  """Brigade: local operator-system CLI for agent workspaces."""
2
2
 
3
- __version__ = "0.28.0"
3
+ __version__ = "0.29.0"
@@ -115,4 +115,5 @@ def page(title: str, nonce: str, nav: str, body: str, *, reload_ms: int = 15000)
115
115
  as_of=stamp,
116
116
  extra_css=_CENTER_CSS,
117
117
  script=_CENTER_SCRIPT % reload_delay,
118
+ scheme="dark",
118
119
  )
@@ -177,32 +177,30 @@ class SessionDirectory:
177
177
  flags |= getattr(os, "O_NOFOLLOW", 0) | getattr(os, "O_NONBLOCK", 0)
178
178
  flags |= getattr(os, "O_CLOEXEC", 0) | getattr(os, "O_BINARY", 0)
179
179
  reading = not flags & (os.O_WRONLY | os.O_RDWR)
180
- for _ in range(8 if reading else 1):
181
- try:
182
- fd = dirfd.open_child_file(self.fd, name, flags, 0o600)
183
- except FileNotFoundError:
184
- self.validate()
185
- raise
186
- except OSError as exc:
187
- _raise_integrity_error(exc)
188
- raise
189
- try:
190
- if reading:
191
- held = os.fstat(fd)
192
- if stat.S_ISREG(held.st_mode) and held.st_nlink == 0:
193
- # Atomic replace won the open-to-fstat window. Retry
194
- # the known name, without reporting missing state.
195
- continue
196
- if not stat.S_ISREG(held.st_mode) or held.st_nlink != 1:
197
- raise SessionIntegrityError("Claude hook session file is not a single-link regular file")
198
- else:
199
- self.validate_file(name, fd)
200
- self.validate()
201
- yield fd
202
- return
203
- finally:
204
- os.close(fd)
205
- raise SessionIntegrityError("Claude hook session file changed repeatedly while opening")
180
+ try:
181
+ fd = dirfd.open_child_file(self.fd, name, flags, 0o600)
182
+ except FileNotFoundError:
183
+ self.validate()
184
+ raise
185
+ except OSError as exc:
186
+ _raise_integrity_error(exc)
187
+ raise
188
+ try:
189
+ if reading:
190
+ held = os.fstat(fd)
191
+ # Atomic replacement can unlink a held reader before fstat.
192
+ # Zero links leaves no outside name; trust this read-only fd
193
+ # just as when replacement follows the initial check.
194
+ if not stat.S_ISREG(held.st_mode) or held.st_nlink not in {0, 1}:
195
+ raise SessionIntegrityError(
196
+ "Claude hook session file is not a single-link or unlinked regular file"
197
+ )
198
+ else:
199
+ self.validate_file(name, fd)
200
+ self.validate()
201
+ yield fd
202
+ finally:
203
+ os.close(fd)
206
204
 
207
205
  def read_bytes(self, name: str, max_bytes: int | None = None) -> bytes:
208
206
  with self.open_file(name, os.O_RDONLY) as fd:
@@ -0,0 +1,7 @@
1
+ """Private process-local distribution identity set by an entry-point bootstrap."""
2
+
3
+ _name: str | None = None
4
+
5
+
6
+ def is_npm() -> bool:
7
+ return _name == "npm"
@@ -24,7 +24,7 @@ from brigade.fleet_deck_brands import (
24
24
  )
25
25
 
26
26
  from .fleet_event_freshness import observation_state
27
- from . import ui_theme
27
+ from . import fleet_deck_shell, ui_theme
28
28
 
29
29
  CLAIM_ID_RE = re.compile(r"^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$")
30
30
  _CONTROL_RE = re.compile(r"[\x00-\x1f\x7f-\x9f]")
@@ -187,6 +187,7 @@ class RailEntry:
187
187
  repo: str
188
188
  run_id: str
189
189
  detail: str
190
+ age_seconds: int | None = None
190
191
 
191
192
 
192
193
  @dataclass(frozen=True)
@@ -299,6 +300,9 @@ class MachineState:
299
300
  available_slots: str = UNKNOWN
300
301
  eligible_queued_work: str = UNKNOWN
301
302
  unused_reason: str = UNKNOWN
303
+ # The enrolled node this policy machine runs on. Additive: snapshots from
304
+ # before the key existed parse with ``unknown`` and join to no station.
305
+ node_id: str = UNKNOWN
302
306
 
303
307
 
304
308
  @dataclass(frozen=True)
@@ -846,7 +850,7 @@ def fetch_failed_outcomes(
846
850
  f") ORDER BY received_at DESC, run_id DESC LIMIT {RAIL_FAILURE_LIMIT}",
847
851
  (cutoff, *TERMINAL_STATES, stale_cutoff, *_INTERNAL_OUTCOME_PARAMS),
848
852
  ).fetchall()
849
- return _enrich_runs(conn, [_live_run_from_row(row, bucket="failed") for row in rows])
853
+ return _enrich_runs(conn, [_live_run_from_row(row, bucket="failed", now=now) for row in rows])
850
854
 
851
855
 
852
856
  def cloud_workers_from_snapshot(snapshot: Mapping[str, object]) -> tuple[CloudWorker, ...]:
@@ -933,7 +937,7 @@ def fetch_observers(conn: sqlite3.Connection, configured: frozenset[str]) -> lis
933
937
  return [(row[0], row[1]) for row in conn.execute(query, tuple(configured)).fetchall()]
934
938
 
935
939
 
936
- def _live_run_from_row(row: tuple, *, bucket: str | None = None) -> LiveRun:
940
+ def _live_run_from_row(row: tuple, *, bucket: str | None = None, now: datetime | None = None) -> LiveRun:
937
941
  return LiveRun(
938
942
  node_id=row[0],
939
943
  run_id=row[1],
@@ -942,7 +946,7 @@ def _live_run_from_row(row: tuple, *, bucket: str | None = None) -> LiveRun:
942
946
  harness=row[4] or "",
943
947
  state=row[5],
944
948
  bucket=row[5] if bucket is None else bucket,
945
- age_seconds=None,
949
+ age_seconds=_age_seconds(row[7] or "", now) if now is not None and len(row) > 7 else None,
946
950
  elapsed_seconds=None,
947
951
  repo_identity=(row[8] or "") if len(row) > 8 else "",
948
952
  )
@@ -1157,11 +1161,25 @@ def build_view(
1157
1161
  )
1158
1162
  )
1159
1163
  rail: list[RailEntry] = [
1160
- RailEntry(kind="failed", node_id=run.node_id, repo=run.repo, run_id=run.run_id, detail=run.state)
1164
+ RailEntry(
1165
+ kind="failed",
1166
+ node_id=run.node_id,
1167
+ repo=run.repo,
1168
+ run_id=run.run_id,
1169
+ detail=run.state,
1170
+ age_seconds=run.age_seconds,
1171
+ )
1161
1172
  for run in failed_outcomes
1162
1173
  ]
1163
1174
  rail.extend(
1164
- RailEntry(kind=run.bucket, node_id=run.node_id, repo=run.repo, run_id=run.run_id, detail=run.state)
1175
+ RailEntry(
1176
+ kind=run.bucket,
1177
+ node_id=run.node_id,
1178
+ repo=run.repo,
1179
+ run_id=run.run_id,
1180
+ detail=run.state,
1181
+ age_seconds=run.age_seconds,
1182
+ )
1165
1183
  for run in live_runs
1166
1184
  if run.bucket in ("awaiting approval", "stale", "unknown")
1167
1185
  )
@@ -1293,6 +1311,7 @@ def control_plane_from_snapshot(raw: Mapping[str, object] | None) -> ControlPlan
1293
1311
  available_slots=_cp_text(item.get("available_slots")),
1294
1312
  eligible_queued_work=_cp_text(item.get("eligible_queued_work")),
1295
1313
  unused_reason=_cp_text(item.get("unused_reason")),
1314
+ node_id=_cp_text(item.get("node_id")),
1296
1315
  )
1297
1316
  )
1298
1317
 
@@ -1607,20 +1626,9 @@ _STYLE = (
1607
1626
  for accent in sorted({brand.accent for brand in BRANDS.values()} | {UNKNOWN_BRAND.accent})
1608
1627
  )
1609
1628
  + """
1610
- .stations { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--space-4); align-items: start; }
1611
- .stations + .panel { margin-top: var(--space-4); }
1612
- .station-card { min-width: 0; padding: var(--space-4); border: 1px solid var(--line-quiet); background: var(--surface); }
1613
- .station-card > header { display: flex; align-items: start; justify-content: space-between; gap: var(--space-3); padding-bottom: var(--space-3); border-bottom: 1px solid var(--line-quiet); }
1614
- .capacity { color: var(--signal); font-size: 12px; font-weight: 700; font-variant-numeric: tabular-nums; text-align: right; white-space: nowrap; }
1615
- .not-enrolled { color: var(--faint); }
1616
- .run-stack { display: grid; gap: 10px; margin-top: var(--space-3); }
1617
- .repo-name { margin: 0; font-weight: 750; }
1618
- .tile-side { margin: 0; text-align: right; }
1619
- .tile-badges { display: flex; gap: var(--space-1); justify-content: flex-end; margin: var(--space-1) 0 0; }
1620
- .badge { display: inline-flex; align-items: center; justify-content: center; min-width: 26px; min-height: 22px; padding: 2px 6px; border-radius: 999px; color: #fff; font-size: 11px; font-weight: 800; letter-spacing: .04em; text-align: center; white-space: nowrap; }
1629
+ .badge { display: inline-flex; align-items: center; justify-content: center; min-width: 26px; min-height: 22px; padding: 2px 6px; border-radius: 999px; color: var(--on-accent); font-size: 11px; font-weight: 800; letter-spacing: .04em; text-align: center; white-space: nowrap; }
1621
1630
  .badge svg { width: 18px; height: 18px; display: block; }
1622
1631
  .badge svg mask { mask-type: alpha; }
1623
- .tile-model { margin: var(--space-1) 0 0; color: var(--muted); font-size: 11px; overflow-wrap: anywhere; text-align: right; }
1624
1632
  .cloud-worker-card h3 .badge, .attention-list li .badge { margin-right: 6px; }
1625
1633
  .tile-facts { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: var(--space-1) 10px; margin: 10px 0 0; color: var(--muted); font-size: 12px; }
1626
1634
  .tile-facts dt { color: var(--muted); }
@@ -1630,7 +1638,6 @@ _STYLE = (
1630
1638
  .work-item h3 { margin-top: var(--space-4); }
1631
1639
  .claim, .collision { margin: 10px 0 0; font-size: 12px; }
1632
1640
  .collision { color: var(--signal); font-weight: 800; }
1633
- .dashboard-grid { display: grid; grid-template-columns: minmax(0, 2fr) minmax(280px, 1fr); gap: var(--space-4); margin-top: var(--space-4); }
1634
1641
  .cloud-workers { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: var(--space-4); margin-top: var(--space-4); }
1635
1642
  .cloud-worker-card { min-width: 0; padding: var(--space-4); border: 1px solid var(--line-quiet); background: var(--surface); }
1636
1643
  .cloud-worker-card > header { display: flex; align-items: baseline; justify-content: space-between; gap: var(--space-2); margin-bottom: 10px; }
@@ -1638,7 +1645,6 @@ _STYLE = (
1638
1645
  .cloud-state { margin: 0 0 10px; color: var(--muted); font-size: 12px; }
1639
1646
  .cloud-lease-list { display: grid; gap: var(--space-2); margin: 0; padding: 0; list-style: none; }
1640
1647
  .cloud-lease-list li { padding-top: var(--space-2); border-top: 1px solid var(--line-quiet); color: var(--muted); font-size: 12px; }
1641
- .attention-panel { border-color: #6d5635; }
1642
1648
  .attention-list, .timeline, .observer-list { margin: 0; padding: 0; list-style: none; }
1643
1649
  .attention-list { display: grid; gap: var(--space-2); }
1644
1650
  .attention-list li { padding: 10px 0; border-top: 1px solid var(--line-quiet); color: var(--muted); }
@@ -1653,161 +1659,26 @@ th:nth-child(1) { width: 22%; } th:nth-child(2) { width: 20%; } th:nth-child(3)
1653
1659
  .roster-table th:nth-child(n) { width: auto; }
1654
1660
  .seat--off td { color: var(--faint); }
1655
1661
  @media (max-width: 700px) {
1656
- .stations { grid-template-columns: 1fr; }
1657
- .tile { width: 100%; }
1658
- .station-card > header { align-items: start; flex-direction: column; }
1659
- .capacity { text-align: left; }
1660
- .dashboard-grid { grid-template-columns: 1fr; }
1661
1662
  .timeline li { grid-template-columns: 1fr; gap: 2px; }
1662
1663
  }
1663
1664
  """
1664
1665
  )
1665
1666
 
1666
- _SCRIPT = (
1667
- "function tickElapsed() {"
1668
- "document.querySelectorAll('[data-elapsed]').forEach(function (el) {"
1669
- "var value = parseInt(el.getAttribute('data-elapsed'), 10);"
1670
- "if (!isNaN(value)) { el.setAttribute('data-elapsed', String(value + 10)); }"
1671
- "});}"
1672
- "setInterval(tickElapsed, 10000);"
1673
- )
1674
-
1675
-
1676
- def _empty_rail_text(view: DeckView) -> str:
1677
- """An empty rail with no telemetry is 'cannot see', not 'nothing is wrong'."""
1678
- gaps = coverage_gaps(view.control_plane)
1679
- if not gaps:
1680
- return "Nothing needs you."
1681
- return (
1682
- "No open run or claim signals. Coverage is incomplete, so this is not an all-clear: "
1683
- + ", ".join(gaps)
1684
- + " unknown."
1685
- )
1686
-
1687
1667
 
1688
1668
  def render_deck(view: DeckView, *, nonce: str, now: datetime, worklore_enabled: bool = True) -> str:
1689
- total_capacity = sum(station.station.capacity for station in view.stations)
1690
- total_busy = sum(station.busy for station in view.stations)
1691
- verdict = deck_verdict(view)
1692
- parts: list[str] = [
1693
- '<main class="deck-shell">',
1694
- '<header class="masthead"><div><p class="eyebrow">Fleet operations</p><h1>Command Deck</h1>',
1695
- f'<p class="verdict">{_esc(verdict)}</p></div><p class="header-meta">'
1696
- f"{total_busy}/{total_capacity} slots busy<br>{_esc(_stamp(now))}</p></header>",
1697
- '<nav class="deck-nav" aria-label="Command Deck"><a href="/">deck</a> <a href="/deck/repos">repos</a> <a href="/deck/roster">roster</a> <a href="/deck/policy">policy</a> '
1698
- + ('<a href="/deck/work">work</a> ' if worklore_enabled else "")
1699
- + '<a href="/view/machines">machines board</a></nav>',
1700
- ]
1701
- if worklore_enabled and view.observed_work_groups:
1702
- cards = ""
1703
- for group in view.observed_work_groups:
1704
- stamp, freshness = snapshot_freshness(
1705
- group.snapshot_observed_at, now=now, stale_after_seconds=view.stale_after_seconds
1706
- )
1707
- cards += (
1708
- '<article class="panel"><h3><a href="/deck/observed/'
1709
- + _esc(group.key)
1710
- + '">'
1711
- + _esc(group.label)
1712
- + "</a></h3><p>"
1713
- + str(len(group.work_ids))
1714
- + " configured observation records</p><p>Coverage: "
1715
- + _esc(group.coverage)
1716
- + "</p><p>Configured source: "
1717
- + _esc(group.source_ref)
1718
- + "<br>Configured proxy: "
1719
- + _esc(group.proxy_ref)
1720
- + "<br>Configured parent: "
1721
- + _esc(group.parent_ref)
1722
- + "</p><p>Snapshot observation time (operator-configured metadata): "
1723
- + _esc(stamp)
1724
- + f"<br>Snapshot freshness: {freshness}. Stale after {view.stale_after_seconds} seconds.</p></article>"
1725
- )
1726
- parts.append(
1727
- '<section aria-label="Observed work groups"><h2>Observed work groups</h2>'
1728
- "<p>Retained task observations. Counts describe configured records. "
1729
- "Recent observation metadata does not establish live activity.</p>" + cards + "</section>"
1730
- )
1731
- if not view.stations:
1732
- parts.append(
1733
- '<section class="panel"><p class="empty">No stations configured. Start the hub with --deck-config to add them.</p></section>'
1734
- )
1735
- else:
1736
- station_cards: list[str] = []
1737
- for index, station in enumerate(view.stations):
1738
- enrol = "" if station.enrolled else " (not enrolled)"
1739
- cls = "" if station.enrolled else ' class="not-enrolled"'
1740
- tiles_html = "".join(_tile_html(tile) for tile in station.tiles)
1741
- tiles_html = tiles_html or '<p class="empty">No active runs.</p>'
1742
- heard = f"heard {heard_age(station.last_heard)} ago" if station.last_heard else "never heard"
1743
- station_cards.append(
1744
- f'<section aria-labelledby="station-{index}" class="station-card"><header><div><h2 id="station-{index}"'
1745
- f' title="{_esc(station.station.node_id)}"{cls}>{_esc(station.label)}{enrol}</h2>'
1746
- f'<p class="station-meta">{_esc(heard)}</p></div><p class="capacity">'
1747
- f'{station.busy}/{station.station.capacity} busy</p></header><div class="run-stack">{tiles_html}</div></section>'
1748
- )
1749
- parts.append('<section class="stations" aria-label="Fleet stations">' + "".join(station_cards) + "</section>")
1750
- parts.append(render_control_plane(view.control_plane))
1751
- cloud_cards = "".join(_cloud_worker_html(worker) for worker in view.cloud_workers)
1752
- parts.append(
1753
- '<section class="panel" aria-labelledby="cloud-workers"><header><h2 id="cloud-workers">Cloud workers</h2>'
1754
- f'<p class="panel-count">{len(view.cloud_workers)} provider(s)</p></header>'
1755
- + (
1756
- f'<div class="cloud-workers">{cloud_cards}</div>'
1757
- if cloud_cards
1758
- else '<p class="empty">No cloud providers configured.</p>'
1759
- )
1760
- + "</section>"
1761
- )
1762
- session_items = "".join(_interactive_session_html(session) for session in view.interactive_sessions)
1763
- parts.append(
1764
- '<section class="panel" aria-labelledby="interactive-sessions"><header>'
1765
- '<h2 id="interactive-sessions">Interactive sessions</h2>'
1766
- f'<p class="panel-count">{len(view.interactive_sessions)} session(s)</p></header>'
1767
- + (
1768
- f'<ul class="attention-list">{session_items}</ul>'
1769
- if session_items
1770
- else '<p class="empty">No interactive sessions.</p>'
1771
- )
1772
- + "</section>"
1773
- )
1774
- rail_items = "".join(
1775
- f'<li><span class="attention-kind">{_esc(entry.kind)}</span> &middot; {_esc(entry.repo)} &middot; '
1776
- f'{_esc(entry.node_id[:12])} &middot; <span title="{_esc(entry.run_id or entry.node_id)}">'
1777
- f"{_esc((entry.run_id or entry.node_id)[:12])}</span> &middot; {_esc(entry.detail)}</li>"
1778
- for entry in view.rail
1779
- )
1780
- timeline = "".join(
1781
- '<li><span class="timeline-state">'
1782
- f"{_esc(run.state)}</span><span>{_esc(run.repo)} &middot; {_esc(run.node_id[:12])}</span>"
1783
- f'<span title="{_esc(run.run_id)}">{_esc(run.run_id[:12])}</span></li>'
1784
- for run in view.outcomes
1785
- )
1786
- parts.append(
1787
- '<div class="dashboard-grid"><section class="panel attention-panel" aria-labelledby="rail"><header><h2 id="rail">Needs you</h2>'
1788
- f'<p class="panel-count">{len(view.rail)} item(s)</p></header>'
1789
- + (
1790
- f'<ul class="attention-list">{rail_items}</ul>'
1791
- if rail_items
1792
- else f'<p class="empty">{_esc(_empty_rail_text(view))}</p>'
1793
- )
1794
- + '</section><section class="panel" aria-labelledby="timeline"><header><h2 id="timeline">Recent outcomes</h2>'
1795
- f'<p class="panel-count">{len(view.outcomes)} shown</p></header>'
1796
- + (f'<ul class="timeline">{timeline}</ul>' if timeline else '<p class="empty">No recent outcomes.</p>')
1797
- + "</section></div>"
1798
- )
1799
- observer_items = "".join(
1800
- f'<li><span title="{_esc(node)}">{_esc(node[:12])}</span> &middot; heard {heard_age(received)} ago</li>'
1801
- for node, received in view.observers
1802
- )
1803
- summary = f"Other observers ({len(view.observers)})"
1804
- parts.append(
1805
- f'<details><summary>{_esc(summary)}</summary><ul class="observer-list">{observer_items}</ul></details>'
1806
- )
1807
- parts.append(
1808
- '<footer><a href="/view/machines">machines board</a> <a href="/view/repos">repos board</a></footer></main>'
1669
+ # Imported here because fleet_deck_overview imports this module for its types.
1670
+ from . import fleet_deck_overview
1671
+
1672
+ body = fleet_deck_overview.render_overview(view, now, worklore_enabled=worklore_enabled)
1673
+ return _document(
1674
+ body,
1675
+ nonce=nonce,
1676
+ now=now,
1677
+ active="overview",
1678
+ view=view,
1679
+ worklore_enabled=worklore_enabled,
1680
+ extra_css=ui_theme.OVERVIEW_CSS,
1809
1681
  )
1810
- return _document("\n".join(parts), nonce=nonce, now=now)
1811
1682
 
1812
1683
 
1813
1684
  def repo_coordination_table(view: DeckView) -> str:
@@ -1830,54 +1701,6 @@ def repo_coordination_table(view: DeckView) -> str:
1830
1701
  )
1831
1702
 
1832
1703
 
1833
- def _tile_html(tile: Tile) -> str:
1834
- claim_html = ""
1835
- if tile.claim is not None:
1836
- conductor = f" &middot; {_esc(tile.claim.owner_conductor)}" if tile.claim.owner_conductor else ""
1837
- claim_html = (
1838
- f'<p class="claim">claim: {_esc(tile.claim.owner_node[:12])}{conductor} &middot; '
1839
- f"{tile.claim.ttl_remaining}s left</p>"
1840
- )
1841
- collision_html = '<p class="collision">! collision</p>' if tile.collision else ""
1842
- elapsed = f"{tile.run.elapsed_seconds}s" if tile.run.elapsed_seconds is not None else "&mdash;"
1843
- tile_class = tile.run.bucket.replace(" ", "-")
1844
- # The claim line knows the seat even when the latest event row does not:
1845
- # fall back to the claim conductor before admitting unknown.
1846
- seat = tile.run.seat or (tile.claim.owner_conductor if tile.claim is not None else "") or UNKNOWN
1847
- harness = tile.run.harness or UNKNOWN
1848
- model_text = tile.run.launch_model or tile.run.model or UNKNOWN
1849
- badges = harness_badge_html(tile.run.harness) + provider_badge_html(tile.run.provider)
1850
- return (
1851
- f'<article class="tile tile--{_esc(tile_class)}" data-elapsed="{_esc(str(tile.run.elapsed_seconds or 0))}">'
1852
- f'<header class="tile-head"><p class="repo-name">{_esc(tile.run.repo)}</p>'
1853
- f'<div class="tile-side"><p class="state">{_esc(tile.run.bucket)}</p>'
1854
- f'<p class="tile-badges">{badges}</p>'
1855
- f'<p class="tile-model">{_esc(model_text)}</p></div></header><dl class="tile-facts">'
1856
- f"<dt>seat</dt><dd>{_esc(seat)}/{_esc(harness)}</dd>"
1857
- f"<dt>model</dt><dd>{_esc(model_text)}</dd>"
1858
- f'<dt>elapsed</dt><dd class="elapsed">{elapsed}</dd>'
1859
- f'<dt>run</dt><dd class="run-id" title="{_esc(tile.run.run_id)}">{_esc(tile.run.run_id[:12])}</dd></dl>'
1860
- + claim_html
1861
- + collision_html
1862
- + "</article>"
1863
- )
1864
-
1865
-
1866
- def _interactive_session_html(session: InteractiveSession) -> str:
1867
- dirty = f"{len(session.dirty_paths)}+" if session.dirty_truncated else str(len(session.dirty_paths))
1868
- branch = session.branch or "-"
1869
- badge = harness_badge_html(session.harness)
1870
- return (
1871
- "<li>"
1872
- f"{badge} "
1873
- f"{_esc(session.repo_label or session.repo_identity)} &middot; "
1874
- f"{_esc(session.harness or UNKNOWN)}/{_esc(session.session_id)} &middot; "
1875
- f"{_esc(session.checkout_path)} &middot; "
1876
- f"{_esc(branch)} &middot; {_esc(dirty)} dirty"
1877
- "</li>"
1878
- )
1879
-
1880
-
1881
1704
  def _repo_flags(row: RepoRow) -> str:
1882
1705
  flags: list[str] = []
1883
1706
  if row.collision:
@@ -1887,43 +1710,6 @@ def _repo_flags(row: RepoRow) -> str:
1887
1710
  return " ".join(flags)
1888
1711
 
1889
1712
 
1890
- def _cloud_worker_html(worker: CloudWorker) -> str:
1891
- lease_items = "".join(
1892
- "<li>"
1893
- f"<strong>{_esc(lease.label or lease.provider_task_id or 'active lease')}</strong><br>"
1894
- f"{_esc(lease.repo)} &middot; {_esc(lease.state)}"
1895
- + (f'<br><span title="task id">{_esc(lease.provider_task_id)}</span>' if lease.provider_task_id else "")
1896
- + (f'<br><span title="artifact">{_esc(lease.artifact_ref)}</span>' if lease.artifact_ref else "")
1897
- + "</li>"
1898
- for lease in worker.leases
1899
- )
1900
- return (
1901
- '<article class="cloud-worker-card"><header>'
1902
- f"<h3>{provider_badge_html(worker.provider)} {_esc(worker.provider)}</h3>"
1903
- f'<p class="cloud-capacity">{worker.used}/{worker.limit}</p>'
1904
- f'</header><p class="cloud-state">circuit: {_esc(worker.circuit_state)}</p>'
1905
- + (
1906
- f'<ul class="cloud-lease-list">{lease_items}</ul>'
1907
- if lease_items
1908
- else '<p class="empty">No active leases.</p>'
1909
- )
1910
- + "</article>"
1911
- )
1912
-
1913
-
1914
- def heard_age(received_at: str | None) -> str:
1915
- if received_at is None:
1916
- return "unknown"
1917
- try:
1918
- moment = datetime.fromisoformat(received_at)
1919
- except ValueError:
1920
- return "unknown"
1921
- if moment.tzinfo is None:
1922
- moment = moment.replace(tzinfo=_UTC)
1923
- seconds = max(0, int((datetime.now(_UTC) - moment).total_seconds()))
1924
- return f"{seconds}s"
1925
-
1926
-
1927
1713
  def _owner_text(claim: Claim | None) -> str:
1928
1714
  if claim is None:
1929
1715
  return ""
@@ -1941,13 +1727,38 @@ def _esc(value: object) -> str:
1941
1727
  return html.escape(str(value), quote=True)
1942
1728
 
1943
1729
 
1944
- def _document(body: str, *, nonce: str, now: datetime, title: str = "Command Deck", refresh: bool = True) -> str:
1945
- return ui_theme.document(
1730
+ def _document(
1731
+ body: str,
1732
+ *,
1733
+ nonce: str,
1734
+ now: datetime,
1735
+ title: str = "Command Deck",
1736
+ refresh: bool = True,
1737
+ active: str = "overview",
1738
+ view: DeckView | None = None,
1739
+ worklore_enabled: bool | None = None,
1740
+ extra_css: str = "",
1741
+ ) -> str:
1742
+ """Every Deck page: its body inside the shared two-column shell.
1743
+
1744
+ *view* feeds the sidebar machine tree; pages that never build a
1745
+ ``DeckView`` pass ``None`` and get the navigation only.
1746
+ """
1747
+ # Imported here because fleet_deck_overview imports this module for its types.
1748
+ from . import fleet_deck_overview
1749
+
1750
+ if worklore_enabled is None:
1751
+ from . import worklore_http
1752
+
1753
+ worklore_enabled = worklore_http.enabled()
1754
+ sidebar = fleet_deck_overview.render_sidebar(view, active, now, worklore_enabled=worklore_enabled)
1755
+ return fleet_deck_shell.deck_page(
1946
1756
  title,
1947
- nonce,
1757
+ active,
1758
+ sidebar,
1948
1759
  body,
1760
+ nonce,
1949
1761
  as_of=_stamp(now),
1950
1762
  refresh_seconds=10 if refresh else None,
1951
- extra_css=_STYLE,
1952
- script=_SCRIPT,
1763
+ extra_css=_STYLE + extra_css,
1953
1764
  )