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.
- {brigade_cli-0.28.0/src/brigade_cli.egg-info → brigade_cli-0.29.0}/PKG-INFO +3 -3
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/QUICKSTART.md +1 -1
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/README.md +2 -2
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/pyproject.toml +1 -1
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/__init__.py +1 -1
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/render.py +1 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/anchored_io.py +24 -26
- brigade_cli-0.29.0/src/brigade/distribution.py +7 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_command_deck.py +68 -257
- brigade_cli-0.29.0/src/brigade/fleet_deck_overview.py +708 -0
- brigade_cli-0.29.0/src/brigade/fleet_deck_shell.py +79 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_roster_page.py +3 -6
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_routing.py +18 -2
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_policy_page.py +3 -6
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_repo_policy_page.py +3 -4
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_work_page.py +7 -7
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/components/manifest-v1.json +54 -54
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/hermes/memory-handoff.harness.json +1 -1
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/hermes/model-lanes.harness.json +1 -1
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/hermes/workspace.harness.json +1 -1
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/chat-memory-sweep.example.json +1 -1
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/memory-care.example.json +1 -1
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/policies/personal.json +1 -1
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/policies/public-content.json +1 -1
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/policies/public-repo.json +1 -1
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/template-profile-snapshot.json +9 -9
- brigade_cli-0.29.0/src/brigade/ui_theme.py +338 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/update_cmd.py +12 -5
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/update_notify.py +5 -5
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/verification.py +251 -249
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/verify_reaper.py +48 -9
- brigade_cli-0.29.0/src/brigade/work_cmd/verify_runtime.py +293 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0/src/brigade_cli.egg-info}/PKG-INFO +3 -3
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade_cli.egg-info/SOURCES.txt +7 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_state_containment.py +35 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_command_deck.py +88 -8
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_dashboard.py +1 -1
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_deck_badges.py +46 -34
- brigade_cli-0.29.0/tests/test_fleet_deck_overview.py +944 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_routing.py +66 -1
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_work_page.py +3 -3
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_cerebro.py +3 -4
- brigade_cli-0.29.0/tests/test_npm_feasibility_prepare.py +115 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_published_artifact_acceptance.py +25 -2
- brigade_cli-0.29.0/tests/test_ui_theme.py +175 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_ui_theme_integration.py +65 -13
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_update_cmd.py +118 -48
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_update_notify.py +42 -0
- brigade_cli-0.29.0/tests/test_verify_reaper.py +102 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_verification.py +1412 -15
- brigade_cli-0.28.0/src/brigade/ui_theme.py +0 -173
- brigade_cli-0.28.0/tests/test_ui_theme.py +0 -61
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/LICENSE +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/MANIFEST.in +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/THIRD_PARTY_NOTICES.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/setup.cfg +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/__main__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/_control_crosswalk_io.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/aboyeur/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/aboyeur/artifacts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/aboyeur/briefs.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/aboyeur/direct_worker_finish.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/aboyeur/model_admission.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/aboyeur/orchestrator.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/aboyeur/planning.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/aboyeur/prompts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/aboyeur/run_io.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/aboyeur_artifacts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/aboyeur_model_policy.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/acpx_adapter.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/actionqueue.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/add.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/agent_change.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/agent_change_approval_verify.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/agent_change_refs.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/agent_change_verify.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/agent_request.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/agent_skill_format.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/agents.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/approval.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/approval_v2.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/approval_verification.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/assets/fleet_hub/apple-touch-icon.png +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/assets/fleet_hub/favicon-32x32.png +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/assets/fleet_hub/favicon.ico +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/assets/fleet_hub/icon-192.png +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/assets/fleet_hub/icon-512.png +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/assets/fleet_hub/site.webmanifest +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/attestation.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/attestation_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/attestation_input.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/attestation_receipt.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/authority_broker.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/authority_key.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/authority_marker.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/brief_sections.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/budgets.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/budgets_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/candidate_set.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/card_fingerprint.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/card_identity.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/care_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/care_schedules.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/causal_receipt.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/actions.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/agent_activity.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/core.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/data.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/snapshot.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/timing.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/views/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/views/agent_activity.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/views/code_graph.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/views/handoff_inbox.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/views/memory_operations.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/views/outcome_rank.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/views/research.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/views/run_timeline.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/views/status_grid.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/views/work.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/dashboard/work_graph.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/readiness.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/report_review_ops.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/reports.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/schema_ops.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/center_cmd/serve.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/chat_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claim_loss_cancellation.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_actions_diagnostics.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_actions_evidence.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_actions_http.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_actions_import.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_actions_metadata.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_cloud.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_cloud_identity.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/classify.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/compaction_marker.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/entry.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/envelope.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/fingerprint.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/heartbeat.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/install_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/package.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/paths.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/presence.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/runtime.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_hooks/session_state.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_review_evidence.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_review_history.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/claude_review_import.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/_common.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/add.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/budgets.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/care.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/center.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/chat.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/code.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/completions.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/context.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/daily.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/doctor.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/dogfood.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/evidence.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/extras.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/fleet.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/fleet_campaign.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/fleet_dot.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/fleet_enroll.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/fleet_events.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/fleet_messages.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/fleet_policy.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/fleet_roster.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/fleet_work.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/fleet_work_ownership.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/friction.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/governance.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/guard.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/handoff.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/handoff_template.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/harness.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/hermes_fragments.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/ingest.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/init.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/learn.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/mcp.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/memory.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/model.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/node.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/notifications.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/openclaw_fragments.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/operator.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/outcome.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/pantry.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/profiles.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/projection.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/projects.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/receipts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/reconfigure.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/release.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/repos.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/research.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/roadmap.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/roster.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/route.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/run.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/run_cloud.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/run_cloud_build_feed.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/runbook.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/runs.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/scrub.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/search.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/security.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/setup.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/skills.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/stations.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/status.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/tokens.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/tools.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/untrusted.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/update.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/version.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/work/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/work/dispatching.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/work/phases.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/work/registration.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cli/workflow.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cloud_tracker.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/code_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/code_export.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/code_references.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/codex_appserver.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/codex_cloud.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/commit_linkage.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/commit_linkage_verify.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/completions.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/component_bins.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/component_install.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/component_manifest.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/component_paths.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/component_report.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/component_state.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/config.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/context_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/context_eval.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/context_preview.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/control_crosswalk.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/control_crosswalk_cosign.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/control_crosswalk_package.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/control_readiness.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cosign_attestation.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cursor_cloud.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/cursor_user_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/daily_cmd/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/daily_cmd/approvals.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/daily_cmd/candidates.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/daily_cmd/closeout_ops.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/daily_cmd/config.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/daily_cmd/hardening.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/daily_cmd/run_loop.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/daily_cmd/status_plan.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/daily_cmd/telemetry_ops.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dirfd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/doctor.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/doctor_agent.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/doctor_instruction_chain.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dogfood_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/__main__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/access_auth.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/adapter.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/contracts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/event_app.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/events.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/fleet_tools.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/hub_inbox.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/hub_tools.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/inbox_tools.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/lifecycle.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/memory_tools.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/process.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/runtime_config.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/safe_state.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/server.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/state.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/watch.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/dot/webhooks.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/evidence_ack_acceptance.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/evidence_ack_crypto.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/evidence_ack_protocol.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/evidence_brief.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/evidence_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/evidence_derivative.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/evidence_package.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/evidence_package_snapshot.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/evidence_redaction.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/evidence_runtime.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/extras.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fixtures/causal-receipt.v1.golden.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fixtures/provenance-envelope.v1.golden.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fixtures/trust-policy.v1.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fixtures/worker-events-appserver.v1.golden.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_campaign.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_campaign_authority.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_center_links.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_claim_display.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_claim_lifecycle.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_claim_target.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_client.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_client_cloud.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_client_enrollment.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_client_grokbot.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_client_message_credentials.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_client_messages.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_client_policy.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_client_spool.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_dashboard.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_deck_brands.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_dot.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_event_freshness.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_event_report.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_execution_context.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_export.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_capacity.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_claim_cardinality.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_claims.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_cloud_policy.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_enrollment.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_event_bounds.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_grokbot.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_http.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_message_grants.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_messages.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_model_roster.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_policy.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_policy_api.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_preference.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_server.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_sessions.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_hub_status.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_master_roster.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_model_admission.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_model_inventory.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_model_roster.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_policy.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_policy_delegation.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_policy_form.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_policy_migration.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_quota.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_session_bootstrap.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_session_presence.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fleet_t3_transport.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/fragments.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/friction_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/generated_patch_quarantine.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/governance_inventory.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/graphtrail_delta.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_backup/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_backup/actions.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_backup/adapters.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_backup/contracts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_backup/exec.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_backup/ledger.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_backup/lifecycle.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_backup/normalize.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_backup/runtime_config.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_backup/tools.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_build_feed.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_cerebro.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_feed.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_findings.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_findings_relay.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/actions.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/app.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/contracts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/exec.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/ledger.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/lifecycle.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/normalize.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/policy.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/probes.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/registry.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/runtime_config.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_fleet/tools.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_job_clock.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_job_validation.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_jobs.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_jobs_claim_target.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_jobs_expiry.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_jobs_hub.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_mcp.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_n8n/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_n8n/actions.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_n8n/client.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_n8n/contracts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_n8n/lifecycle.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_n8n/runtime_config.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_n8n/tools.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/actions.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/adapters.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/capabilities.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/catalog.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/content_policy.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/contracts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/excalidraw_client.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/lifecycle.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/native_client.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/operator_adapter.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/path_policy.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/runtime_config.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/store.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/tls.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/tools.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_obsidian/utf8.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_operations_relay.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_ops.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_pack_relay.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_packs.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_paths.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_reconcile.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_scout_feed.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_t3/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_t3/__main__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_t3/contracts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_t3/fleet.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_t3/intake.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_t3/ledger.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_t3/lifecycle.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_t3/runtime_config.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_t3/tools.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_t3/watch.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_wazuh/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_wazuh/contracts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_wazuh/lifecycle.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_wazuh/normalize.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_wazuh/policy.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_wazuh/store.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/grokbot_wazuh/tools.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/__main__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/allowlist.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/audit.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/baseline.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/cli.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/detectors/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/detectors/opf.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/engine.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/examples/n8n-validation/blocked-local-service.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/examples/n8n-validation/blocked-secret-token.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/examples/n8n-validation/clean-blog-post.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/examples/n8n-validation/clean-social-post.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/examples/n8n-validation/warn-review-email.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/git_commits.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/git_scan.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/n8n_advisory.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/n8n_validate.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/policies/in-house-repo.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/policies/openclaw-message.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/policies/pr-draft.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/policies/public-content.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/policies/public-repo.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/policy.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/pr_draft.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/pr_prepare.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/publish_check.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/report.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/rev_range.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/rules.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/guard/types.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/handoff.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/handoff_cmd/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/handoff_cmd/drafts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/handoff_cmd/inspect_ops.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/handoff_cmd/issue_ops.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/handoff_cmd/linting.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/handoff_cmd/migrate_ops.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/handoff_cmd/models.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/handoff_cmd/readability.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/handoff_cmd/receipts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/handoff_cmd/sources.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/handoff_content.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/harness_profile_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/harness_profile_doctor.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/harness_profiles.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/hermes_adapter.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/inbox_lock.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/ingest.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/install.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/journal_export.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/jules_cloud.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/learn_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/localio.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/managed.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/managed_block.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/managed_snapshot.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/mcp_adapters.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/mcp_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/mcp_fidelity.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/mcp_runtime.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/mcp_server.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_care_closeout.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_care_plan.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_doctor/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_doctor/__main__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_doctor/cli.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_doctor/compact.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_doctor/git.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_doctor/init_git.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_doctor/lint.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_doctor/parsing.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_doctor/paths.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_doctor/safety.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_doctor/status.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_doctor_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_hooks.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_identity_audit.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_operations.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_proposal_io.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_proposals.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_retrieval_eval/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_retrieval_eval/__main__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_retrieval_eval/adapters.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_retrieval_eval/corpus.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_retrieval_eval/harness.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_retrieval_eval/metrics.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_retrieval_eval/projection.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_retrieval_eval/quality.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_retrieval_eval/report.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_search_diagnostics.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/memory_vault.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/message_envelope.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/model_inventory.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/model_scorecard.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/model_trials.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/node.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/notifications_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/obsidian_vault.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/operator_cmd/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/operator_cmd/adoption.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/operator_cmd/guide.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/operator_cmd/health.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/operator_cmd/lifecycle.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/operator_cmd/migration.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/operator_cmd/surfaces.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/outcome.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/outcome_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/outcome_discovery.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/outcome_repair.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/pantry_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/pantry_compat.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/phases_cmd/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/phases_cmd/checks_actions.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/phases_cmd/constants.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/phases_cmd/session_lifecycle.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/phases_cmd/session_ops.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/pi_mcp_bridge.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/pi_mcp_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/proc.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/profiles.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/profiles_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/projection/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/projection/fixture.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/projection/kernel.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/projection_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/projects_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/prompt.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/provenance.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/py.typed +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/receipt_schema.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/receipt_signing.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/receipts_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/receipts_trailer.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/reconfigure.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/registry.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/release_cmd/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/release_cmd/candidate.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/release_cmd/candidate_audit_ops.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/release_cmd/ci.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/release_cmd/commands.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/release_cmd/evidence.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/release_cmd/install_smoke.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/release_cmd/paths.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/release_cmd/schema_ops.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/release_cmd/version_guard.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/release_version_sync.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/render.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/reportstore.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/repos_cmd/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/repos_cmd/actions_dispatch.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/repos_cmd/adoption.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/repos_cmd/constants.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/repos_cmd/fleet.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/repos_cmd/fleet_health.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/repos_cmd/friction_fleet.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/repos_cmd/release_ops.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/repos_cmd/release_train.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/repos_cmd/sweeps.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/browser_preflight.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/claim_audit.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/config.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/doctor.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/engine.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/extract.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/handoff.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/llm.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/provenance.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/registry.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/report.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/sources/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/sources/browser_ai.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/sources/cli.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/sources/local.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/sources/web.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research/types.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/research_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/result_integrity.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/roadmap_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/roster.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/roster_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/route_catalog.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/route_policy.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/route_receipts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/router.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_audit.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_budget.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_checkpoint.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_control.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_control_journal.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_dirfd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_event_cursor.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_events.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_id.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_journal.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_lifecycle.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_preference.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_projector.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_reap.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_receipts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_redaction.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_resume.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_seat.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_shadow.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/run_transport.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/runbook_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/runguard.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/runs_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/runs_cmd_worktrees.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/runs_diff.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/runs_serve.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/runs_view.html +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/scanner_isolation.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/scorecard.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/scrub.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/search_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/seat_health.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/seat_health_policy.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/security_cmd/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/security_cmd/commands.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/security_cmd/config.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/security_cmd/enrichment.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/security_cmd/models.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/security_cmd/reports.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/security_cmd/scan_detectors.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/security_cmd/scan_engine.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/security_cmd/suppression.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/security_cmd/template_audit_ops.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/selection.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/skill_obligations.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/skills_cmd/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/skills_cmd/adapters.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/skills_cmd/inbox.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/skills_cmd/install.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/skills_cmd/packs.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/skills_cmd/registry.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/skills_cmd/search_validate.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/skills_cmd/sync_history.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/station.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/station_health.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/station_manifest.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/stations_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/status.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/telemetry_export.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/template_profiles.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/adal/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/aider/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/amp/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/antigravity/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/claude/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/codex/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/continue/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/control-crosswalk.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/copilot/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/crush/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/cursor/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/depth/repo.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/depth/workspace.json +0 -0
- {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
- {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
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/evals/adversarial/failed-verification/manifest.json +0 -0
- {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
- {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
- {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
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/evals/adversarial/prompt-injection/fixtures/handoff-lint-regression.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/evals/adversarial/prompt-injection/manifest.json +0 -0
- {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
- {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
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/evals/adversarial/unsafe-command/manifest.json +0 -0
- {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
- {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
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/evals/adversarial/untrusted-evidence/manifest.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/generic/harness-adapter-checklist.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/generic/memory-contract.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/goose/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/grok/hooks/brigade-work.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/grok/hooks/brigade-work.sh +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/grok/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/handoff/handoff-sources.example.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/handoff/openclaw-ingest-receipt.example.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/adal.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/aider.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/amp.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/antigravity.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/claude.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/codex.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/continue.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/copilot.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/crush.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/cursor.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/goose.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/grok.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/hermes.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/kimi.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/openclaw.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/opencode.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/openhands.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/pi.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/harnesses/qwen.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/hermes/README.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/hermes/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/hooks/pre-push +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/includes/publisher.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/includes/repo-extras.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/kimi/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/cards/backup-restic.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/cards/chat-surface-crawlers.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/cards/content-safety.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/cards/handoff-flow.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/cards/memory-architecture.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/cards/memory-care-staleness.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/cards/memory-scanner.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/cards/multi-workspace-handoff-admin.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/cards/obsidian-notes.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/cards/pipeline-standups.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/cards/token-glace-output-compaction.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory/cards/workspace-file-maintenance.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory-care/runbooks/daily-care-pass.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory-care/runbooks/ingest-sweep.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/memory-care/runbooks/weekly-outcome-ratchet.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/openclaw/README.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/openclaw/acp-escalation.openclaw.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/openclaw/memory-sweep-cron.openclaw.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/openclaw/model-aliases.openclaw.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/openclaw/ollama-memory-search.openclaw.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/opencode/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/openhands/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/pi/extensions/brigade-mcp-bridge.js +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/pi/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/qwen/memory-handoffs/TEMPLATE.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/repo/AGENTS.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/repo/CLAUDE.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/repo/INSTALL_FOR_AGENTS.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/rosters/budget-open-weight.toml +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/rosters/full-multi-lane.toml +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/rosters/minimal-single-cli.toml +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/rosters/review-heavy.toml +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/scripts/backup-restic.sh +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/brigade-work/CHANGELOG.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/brigade-work/SKILL.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/brigade-work/skill.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/card-refresh/CHANGELOG.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/card-refresh/SKILL.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/card-refresh/skill.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/forward-plan/CHANGELOG.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/forward-plan/SKILL.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/forward-plan/plan.template.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/forward-plan/skill.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/handoff-inbox-drain/CHANGELOG.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/handoff-inbox-drain/SKILL.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/handoff-inbox-drain/skill.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/note/CHANGELOG.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/note/SKILL.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/note/skill.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/ultra-work-scout/CHANGELOG.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/ultra-work-scout/SKILL.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/skills/ultra-work-scout/skill.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/stations/managed-snapshot.json +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/workspace/AGENTS.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/workspace/CLAUDE.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/workspace/HEARTBEAT.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/workspace/IDENTITY.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/workspace/INSTALL_FOR_AGENTS.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/workspace/MEMORY.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/workspace/SAFETY_RULES.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/workspace/SOUL.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/workspace/TOOLS.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/workspace/USER.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/workspace/rules/acceptance-driven-work.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates/workspace/rules/issue-tdd-loop.md +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/templates.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tokens_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/toml_compat.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/calls.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/catalog_health.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/catalog_manage.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/checkpoint_store.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/checkpoints.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/config.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/constants.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/helpers.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/issues.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/mcp.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/packs.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/paths.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/projections.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/runs.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/runtimes.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/safety.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/tools_cmd/status.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/trust_gate.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/untrusted.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/untrusted_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/verification_contract.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/verify_manifest.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/verify_trial.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/version_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/wiring.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/backup.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/campaign.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/claiming.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/config.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/constants.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/edges.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/footprint.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/helpers.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/imports.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/inbox_lock.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/ledger/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/ledger/authority_store.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/ledger/descriptor_anchors.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/ledger/import_model.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/ledger/inbox_provenance.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/ledger/locking.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/ledger/queries_handoffs.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/ledger/tasks_plans.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/nt_dirfd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/partition.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/reviews.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/scanner_platform.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/scanners.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/services.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/session/__init__.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/session/briefing.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/session/fleet_routing.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/session/lifecycle.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/session/run_status.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/session/task_ops.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/session_resume.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/sweeps.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/verify_ranking.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_cmd/verify_scoreability.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/work_run_archive.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worker_events.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worker_failure.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/workflow_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worklore_brigade.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worklore_brigade_sync.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worklore_client.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worklore_github.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worklore_github_sync.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worklore_http.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worklore_ownership.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worklore_scope.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worklore_store.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worklore_store_operations.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade/worklore_validate.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade_cli.egg-info/dependency_links.txt +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade_cli.egg-info/entry_points.txt +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade_cli.egg-info/requires.txt +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/src/brigade_cli.egg-info/top_level.txt +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_aboyeur.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_aboyeur_facade.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_aboyeur_orchestrator_health_routing.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_aboyeur_run_io.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_aboyeur_seat_health_probe.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_aboyeur_status.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_acpx_adapter.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_actionqueue.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_add.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_agent_change.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_agent_change_approval_integration.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_agent_change_approval_policy.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_agent_change_approval_resources.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_agent_notify_station_contracts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_agent_request.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_agent_skill_format.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_agent_write_probes.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_agents.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_agents_model_pin.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_agents_oracle.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_agents_windows_executable.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_approval.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_attestation.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_attestation_input.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_attestation_input_integration.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_attestation_receipt.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_authority_broker.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_authority_store_hmac.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_budgets.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_candidate_set.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_card_fingerprint.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_card_identity.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_care_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_causal_receipt.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_center_actions_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_center_agent_activity.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_center_dashboard.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_center_page_load.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_center_readiness_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_center_report_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_center_research_view.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_center_serve.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_ci_pytest_shard.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_ci_workflow.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claim_loss_review.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_actions_diagnostics.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_actions_evidence.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_actions_http.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_actions_import.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_actions_metadata.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_cloud.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_cloud_adoption.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_cloud_identity.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_compaction_marker.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_doctor.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_entry.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_envelope.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_fingerprint.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_heartbeat.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_latch_race.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_runtime.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_settings_merge.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_stdin_bounds.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_tilde_user.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_user_scope.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_hooks_user_target.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_review_evidence.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_review_history.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_review_import.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_claude_workflow.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_cli_help.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_cli_inventory_contract.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_cli_setup.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_cli_update.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_cloud_tracker.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_code_export.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_code_graph_brief.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_code_reference_schema.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_code_verbs_and_target.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_codex_appserver.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_codex_appserver_integration.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_codex_cloud.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_commit_linkage.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_completions.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_component_bins.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_component_install.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_component_manifest.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_component_manifest_provenance.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_component_paths.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_component_report.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_component_state.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_config.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_conftest_home_isolation.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_conftest_host_daemons.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_context_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_context_eval.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_context_learning_closeout_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_context_preview.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_control_crosswalk.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_cosign_attestation.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_cosign_statement_profiles.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_cursor_cloud.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_cursor_install_state_migration.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_cursor_user_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_daily_driver_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dashboard_code_graph.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dashboard_handoffs.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dashboard_memory_operations.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dashboard_outcomes.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dashboard_runs.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dashboard_status.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dashboard_work.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_direct_worker_finish_tree.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_directory_authority_legacy_migration.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dirfd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_doctor.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_doctor_agent.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dogfood_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_access_auth.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_adapter.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_compat.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_contracts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_events.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_fleet_tools.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_hub_tools.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_inbox_tools.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_lifecycle.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_memory_tools.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_process.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_runtime.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_state.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_dot_watch.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_error_refusal_copy.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_evidence_ack_acceptance.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_evidence_ack_crypto.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_evidence_ack_protocol.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_evidence_branded_surface.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_evidence_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_evidence_derivative.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_evidence_package.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_evidence_package_snapshot.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_evidence_redaction.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_evidence_runtime.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_extras_gate.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_action_dispatch_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_agent_unread.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_authority_proof.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_campaign.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_campaign_authority.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_center_links.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_claim_display.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_claim_generations.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_claim_loss_cancellation.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_claim_release.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_claim_target.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_claims.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_client_hardening.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_client_message_credentials.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_cloud.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_dot.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_enrollment.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_events_cli.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_export.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_hub_capacity.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_hub_container_recipes.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_hub_event_bounds.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_hub_grokbot_expiry.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_hub_policy.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_hub_request_bounds.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_hub_review_bounds.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_hub_server.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_master_roster.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_message_grants.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_messages.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_messages_metadata.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_messages_startup.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_model_admission.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_model_inventory.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_model_roster.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_models_list.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_native_launch_binding.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_nodes.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_policy.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_policy_api.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_policy_api_context.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_policy_cli.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_policy_core_completion.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_policy_delegation.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_policy_migration.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_policy_page.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_quota.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_repo_policy_page.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_roster_page.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_session_bootstrap.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_session_presence.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_sync.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_t3_contract.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_t3_transport.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_work_next.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fleet_work_ownership_cli.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_forward_plan_skill.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_fragments.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_friction_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_generated_patch_quarantine.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_gitignore.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_governance_inventory.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_graphtrail_delta.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grok_hook_runtime.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_backup_actions.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_backup_adapters.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_backup_contracts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_backup_ledger.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_backup_lifecycle.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_backup_runtime.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_build_feed.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_client_identity.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_feed.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_findings.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_findings_relay.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_fleet_actions.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_fleet_app.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_fleet_contracts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_fleet_exec.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_fleet_ledger.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_fleet_lifecycle.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_fleet_normalize.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_fleet_probes.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_fleet_registry.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_fleet_remediation.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_fleet_runtime_config.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_fleet_tools.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_jobs.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_mcp.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_n8n_actions.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_n8n_client.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_n8n_contracts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_n8n_lifecycle.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_n8n_runtime.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_n8n_tools.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_obsidian_actions.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_obsidian_adapters.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_obsidian_capabilities.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_obsidian_client.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_obsidian_contracts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_obsidian_excalidraw_client.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_obsidian_lifecycle.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_obsidian_operator_install.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_obsidian_operator_plugin.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_obsidian_phase2.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_obsidian_policy.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_obsidian_runtime.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_operations_relay.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_ops.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_pack_relay.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_packs.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_reconcile.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_scout_feed.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_t3_contracts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_t3_fleet.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_t3_intake.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_t3_ledger.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_t3_lifecycle.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_t3_runtime.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_t3_tools.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_t3_watch.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_wazuh_contracts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_wazuh_lifecycle.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_wazuh_normalize.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_wazuh_policy.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_wazuh_store.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_grokbot_wazuh_tools.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_handoff.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_handoff_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_handoff_injection_lint.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_handoff_readability.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_harness_conformance_probe.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_harness_profile_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_harness_user_scope.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_harness_user_scope_slice2.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_hub_seat_resolution.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_ingest.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_init.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_install.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_instruction_profiles.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_issue266_benchmark.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_issue266_work_status_memory.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_issue362_code_evidence_facades.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_journal_export.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_jules_cloud.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_ledger_1233_findings.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_ledger_facade.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_localio.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_managed.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_managed_block.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_managed_snapshot.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_mcp_adapters.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_mcp_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_mcp_fidelity.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_mcp_integration.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_mcp_projection.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_mcp_runtime.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_mcp_server.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_mcp_url_only_import.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_mcp_user_scope.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_care_skills.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_hooks.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_identity_audit.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_inventory_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_proposal_capabilities.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_proposals.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_retrieval_eval.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_search_mcp.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_search_redundancy.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_task_recall.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_topology_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_vault_projection.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_vault_propose.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_memory_vault_search.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_message_envelope.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_model_inventory.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_model_scorecard.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_model_seat_denial.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_model_trials.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_model_trials_adversarial_fixtures.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_module_size_ratchet.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_mypy_override_ratchet.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_neutrality.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_node.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_notifications_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_opencode_mcp_contract.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_opencode_profile_contract.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_operator_checkup.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_operator_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_outcome.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_outcome_activegraph.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_outcome_backfill_scorecard.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_outcome_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_outcome_execute.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_outcome_infrastructure_attribution.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_outcome_repair.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_outcome_reused_receipt_dedup.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_pantry_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_pantry_compat.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_parity_backlog.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_phase257_facades.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_phase_ledger_session_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_phases_cmd_facade.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_pi_mcp_bridge.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_posix_facade_behaviour.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_posix_facade_guard.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_pre_push_hook.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_privacy_regression.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_proc.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_producer_run_id.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_profiles.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_projection_cli.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_projection_conformance.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_projection_kernel.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_prompt.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_provenance_envelope.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_publish_workflow.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_read_only_enforcement.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_readme_brand_header.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_receipt_schema_audit.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_receipt_signing.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_receipts_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_receipts_trailer.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_reconfigure.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_registry.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_release_checklist.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_release_ci_health_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_release_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_release_manifest_generator.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_release_metadata.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_release_readiness_hygiene_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_release_reconcile_evidence_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_release_smoke_health_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_release_train_evidence_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_release_version_guard.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_release_version_sync.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_release_waivers_manifest_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_repeat_watch_approval_runner.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_report_review_closeout_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_reportstore.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_repos_actions_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_repos_adoption_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_repos_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_repos_cmd_facade.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_repos_friction_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_repos_release_train_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_repos_sweep_health_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_acceptance.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_browser_ai.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_claim_audit.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_cli_sources.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_config.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_doctor.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_engine.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_extract.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_finding_envelope.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_handoff.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_llm.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_local_sources.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_provenance.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_registry.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_report.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_review_regressions.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_types.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_research_web.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_result_integrity.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_roadmap_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_roadmap_inventory_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_roster.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_roster_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_roster_doctor.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_route_policy.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_route_receipts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_router.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_router_properties.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_audit.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_budget.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_checkpoint.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_cli.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_control.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_detach.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_dirfd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_event_cursor.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_events.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_events_cursor_control.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_journal.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_journal_measurement.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_journal_process_qualification.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_journal_qualification.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_lifecycle.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_preference.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_projector.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_reap.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_receipts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_redaction.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_resume.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_seat.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_shadow.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_transport.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_transport_dag.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_transport_env.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_transport_failfast.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_transport_recovery.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_run_worktree.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_runbook_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_runbook_import.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_runguard.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_runguard_wait.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_runs_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_runs_diff.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_runs_json_contracts.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_runs_serve.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_runs_watch.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_scanner_runs_dir_adoption.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_scorecard.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_scorecard_reconcile.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_scrub.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_search_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_seat_health.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_seat_health_policy.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_security_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_security_diff.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_security_template_audit_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_selection.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_size_ratchet_baseline.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_skill_obligations_audit.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_skill_templates_metadata.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_skills_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_skills_cmd_facade.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_skills_state_windows.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_station.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_station_manifest.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_stations_discover.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_stations_verify.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_status.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_subprocess_guards.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_surface_aware_install.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_telemetry_export.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_template_profiles.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_test_fixture_contract.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_thread_sync.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_tokens_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_toml_compat.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_tool_output_compaction.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_tools_cmd_facade.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_trust_capability.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_untrusted.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_untrusted_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_verification_contract.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_verify_brigade_skill.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_verify_manifest_tracked.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_verify_parallel.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_verify_script.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_verify_trial.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_version_sync_script.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_waiver_policy_health_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_windows_job.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_windows_pytest.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_windows_read_security.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_wiring_resolve_target.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_backup.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_campaign.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_claim.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_dispatch_annotations.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_edges.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_facade.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_footprint.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_imports.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_ledger.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_ledger_integrity.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_partition.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_reviews.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_scanners.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_services.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_session.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_sweeps.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_verify_ranking.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_cmd_work_graph_hardening.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_import_inbox_windows.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_import_provenance_stamp.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_run_archive.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_work_store_measurement.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_worker_events.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_worker_failure.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_workflow_cmd.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_worklore_brigade.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_worklore_client.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_worklore_github.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_worklore_http.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_worklore_ownership.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_worklore_scope.py +0 -0
- {brigade_cli-0.28.0 → brigade_cli-0.29.0}/tests/test_worklore_store.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
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
|
|
|
@@ -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.
|
|
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.
|
|
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.
|
|
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"
|
|
@@ -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
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
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:
|
|
@@ -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(
|
|
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(
|
|
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
|
-
.
|
|
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
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
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> · {_esc(entry.repo)} · '
|
|
1776
|
-
f'{_esc(entry.node_id[:12])} · <span title="{_esc(entry.run_id or entry.node_id)}">'
|
|
1777
|
-
f"{_esc((entry.run_id or entry.node_id)[:12])}</span> · {_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)} · {_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> · 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" · {_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} · '
|
|
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 "—"
|
|
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)} · "
|
|
1874
|
-
f"{_esc(session.harness or UNKNOWN)}/{_esc(session.session_id)} · "
|
|
1875
|
-
f"{_esc(session.checkout_path)} · "
|
|
1876
|
-
f"{_esc(branch)} · {_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)} · {_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(
|
|
1945
|
-
|
|
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
|
-
|
|
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
|
)
|