Skip to content

Commit f178c51

Browse files
committed
feat: add fleet release closeout gate
1 parent e3a6c97 commit f178c51

10 files changed

Lines changed: 367 additions & 2 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9393
- `brigade repos release plan/build/list/show/compare/closeout/archive` for local fleet release train bundles that collect per-repo release readiness, release candidates, fleet action reconciliation, verification, review, security, and operator evidence into manual-only publish plans without remote mutation.
9494
- `brigade repos release actions` and `brigade repos release evidence` for reviewed release train action queues and manual publish evidence records that stay local, explicit, and non-executing.
9595
- `brigade repos release reconcile` and `summary` for resolving fleet release actions against manual evidence and including reconciliation summaries in release train closeouts.
96+
- `brigade repos release report/checklist/hygiene/import-issues/ready` for local release train review reports, evidence checklists, hygiene checks, unresolved evidence imports, and manual publish readiness gates.
9697
- `brigade work sweep closeout <sweep-id|latest>` for reviewable sweep closeout records that block unresolved pending imports, support explicit deferrals, and surface unclosed sweeps through inbox hygiene.
9798
- `brigade work backup init/status/doctor/import-issues` for read-only local backup health summaries and `backup-health` inbox imports.
9899
- Backup health checks for stale snapshots, failed or stale checks, failed or stale prunes, missing summaries, overdue restore rehearsals, and unsafe private summary fields.

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,7 @@ Roadmap and repo-fleet commands:
522522
- `brigade repos release plan/build/list/show/compare/closeout/archive` builds local fleet release train bundles under `.brigade/repos/releases/`, classifies each configured repo as ready, blocked, needing review or dispatch, in progress, stale, missing a release candidate, or deferred, and writes a manual-only publish checklist without pushing, tagging, publishing, or mutating remotes.
523523
- `brigade repos release actions plan/build/list/show/start/done/defer/archive` and `brigade repos release evidence plan/record/list/show` turn reviewed release trains into local train action queues and manual publish evidence records without executing verification, publishing, or remote-mutating commands.
524524
- `brigade repos release reconcile` and `brigade repos release summary` reconcile train actions against manual evidence records and summarize unresolved, missing, blocked, skipped, deferred, and completed release evidence.
525+
- `brigade repos release report/checklist/hygiene/import-issues/ready` builds local review reports, shows manual evidence checklists, reports train hygiene, routes unresolved train evidence into the work inbox, and gates manual publish readiness without running any publish step.
525526

526527
Repo fleet and pattern registry output is local and privacy preserving. It records presence, counts, labels, fingerprints, command labels, log labels, and receipt references, but does not copy repo guidance files, private paths, raw logs, scanner output, private config, owner names, exact private repo names, or raw evidence into public artifacts. Fleet sweeps and fleet release trains run only explicit foreground local read/report commands, never clone, pull, push, tag, publish, fix, promote, dismiss, or mutate remotes.
527528

ROADMAP.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ Goal: make Brigade a safe target for local automations that discover useful work
4646
- Check local release readiness before publish operations. Status: implemented with `brigade release plan`, `doctor`, `run`, `runs`, and `show`, collecting work closeout, verification, review, scanner, security, handoff, content-guard, docs, changelog, roadmap, and git-state evidence without pushing, tagging, or mutating remotes.
4747
- Build local release candidate packets before manual publish steps. Status: implemented with `brigade release candidate plan/build/list/show/archive`, local candidate bundles, evidence JSON, release notes drafts, manual-only publish plans, candidate health warnings, and no remote mutation.
4848
- Audit roadmap closure and neutral pattern coverage. Status: started with `brigade roadmap audit`, `brigade roadmap patterns`, stale phase warnings, documented command drift checks, roadmap-audit imports, and source-pattern decision records without public reference names.
49-
- Inspect local repo fleet readiness without copying private repo contents. Status: started with gitignored `.brigade/repos.toml`, `brigade repos init/list/show/scan/doctor/import-issues`, `brigade repos sweep plan/run/runs/show/closeout`, `brigade repos report plan/build/list/show/archive/closeout`, `brigade repos actions plan/build/list/show/start/done/defer/archive`, `brigade repos actions dispatch`, `brigade repos actions reconcile`, `brigade repos actions context`, `brigade repos release plan/build/list/show/compare/closeout/archive`, `brigade repos release actions`, `brigade repos release evidence`, `brigade repos release reconcile`, and `brigade repos release summary`, using safe metadata summaries, explicit fleet evidence sweeps, local fleet reports, reviewed fleet action queues, per-repo work import dispatch, action-scoped context packs, fleet release train bundles, manual publish evidence records, AGENTS and fallback guidance detection, repo-fleet imports, and daily-loop health surfacing.
49+
- Inspect local repo fleet readiness without copying private repo contents. Status: started with gitignored `.brigade/repos.toml`, `brigade repos init/list/show/scan/doctor/import-issues`, `brigade repos sweep plan/run/runs/show/closeout`, `brigade repos report plan/build/list/show/archive/closeout`, `brigade repos actions plan/build/list/show/start/done/defer/archive`, `brigade repos actions dispatch`, `brigade repos actions reconcile`, `brigade repos actions context`, `brigade repos release plan/build/list/show/compare/closeout/archive`, `brigade repos release actions`, `brigade repos release evidence`, `brigade repos release reconcile`, `brigade repos release summary`, and `brigade repos release report/checklist/hygiene/import-issues/ready`, using safe metadata summaries, explicit fleet evidence sweeps, local fleet reports, reviewed fleet action queues, per-repo work import dispatch, action-scoped context packs, fleet release train bundles, manual publish evidence records, AGENTS and fallback guidance detection, repo-fleet imports, and daily-loop health surfacing.
5050
- Close out scanner sweeps after review. Status: started with `brigade work sweep closeout <sweep-id|latest>`, deferred import recording, missing-reference blocking, and inbox hygiene warnings for unclosed sweeps.
5151
- Inspect local operator state from one read-only center view. Status: started with `brigade center status/activity/reviews/templates`, `brigade center report plan/build/list/show/archive/review/compare/closeout`, and `brigade center actions plan/build/list/show/start/done/defer/archive`, aggregating local work, imports, sweeps, reviews, handoffs, tools, learning, context packs, projects, security, and release state into JSON, reviewed action queues, closeouts, and local report bundles without a daemon or server.
5252

docs/operator-center.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,8 @@ Each action stores:
119119

120120
`brigade repos release actions` turns reviewed release trains into local per-repo action queues, and `brigade repos release evidence` records manual publish evidence such as verification, release doctor, candidate compare, tag, push, and release outcomes. `brigade repos release reconcile` resolves actions against those evidence records, and `brigade repos release summary` reports unresolved, missing, blocked, skipped, deferred, and completed evidence. These records are local metadata only.
121121

122+
`brigade repos release report/checklist/hygiene/import-issues/ready` provides the closeout layer around those trains: review report files, manual evidence checklists, hygiene warnings, local task imports for unresolved evidence, and a final ready gate for manual publishing.
123+
122124
Center status, center reviews, work brief, work doctor, release doctor, and release evidence include fleet sweep, fleet report, fleet action queue, dispatch, reconciliation, fleet release train action, and manual evidence health.
123125

124126
The operator center never invokes scanners, tools, reviewers, handoff ingestion, release publishing, git commands that mutate state, or remote APIs. Only `center report build`, `center report archive`, and `center actions build/start/done/defer/archive` write local gitignored center files.

docs/release-candidates.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ The fleet publish plan is manual-only. It can include checklist labels for verif
5454

5555
Reviewed release trains can produce local release action queues with `brigade repos release actions build`. Operators can also record manual publish evidence with `brigade repos release evidence record`. Evidence records track the repo id, train id, step, status, safe summary, and fingerprints. `brigade repos release reconcile` marks train actions done only after required evidence is completed, skipped, or deferred, and `brigade repos release summary` shows missing or blocked evidence. These are receipts of manual work, not commands to run.
5656

57+
For final review, `brigade repos release report` writes local train review report files, `checklist` shows required manual evidence, `import-issues` routes unresolved evidence into the local work inbox, and `ready` fails until blocked repos, unresolved actions, missing evidence, and blocked evidence are cleared or explicitly reviewed.
58+
5759
## Boundary
5860

5961
Release candidate and fleet release train commands are local and explicit. Brigade does not push, tag, create releases, mutate pull requests, edit changelogs outside generated local bundles, upload artifacts, approve content-guard findings, start daemons, install schedulers, or store secrets.

docs/repo-fleet.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ brigade repos release show <train-id>
4343
brigade repos release compare <train-id|latest>
4444
brigade repos release reconcile <train-id|latest>
4545
brigade repos release summary <train-id|latest>
46+
brigade repos release report <train-id|latest>
47+
brigade repos release checklist <train-id|latest>
48+
brigade repos release hygiene
49+
brigade repos release import-issues <train-id|latest>
50+
brigade repos release ready <train-id|latest>
4651
brigade repos release closeout <train-id|latest>
4752
brigade repos release archive <train-id>
4853
brigade repos release actions plan <train-id|latest>
@@ -122,6 +127,8 @@ Each repo is classified as `ready`, `blocked`, `needs-review`, `needs-dispatch`,
122127

123128
`brigade repos release reconcile <train-id|latest>` compares release-train actions with manual evidence records. An action is marked done only when the repo has required evidence for verification, release doctor, candidate compare, tag, push, and release, and none of those records are blocked. Completed, skipped, and deferred evidence all count as reviewed operator outcomes. Missing or blocked evidence keeps the action open. `brigade repos release summary <train-id|latest>` reports per-repo evidence status, unresolved action counts, and suggested next commands. Release train closeout includes summary counts when available.
124129

130+
`brigade repos release report <train-id|latest>` writes `RELEASE_TRAIN_REPORT.md` and `RELEASE_TRAIN_REPORT.json` into the train bundle. `checklist` prints the required evidence rows for each repo. `hygiene` reports unclosed, stale, or missing-report trains. `import-issues` routes missing or blocked release evidence into the local work inbox as `source: repo-fleet-release`. `ready` is a local manual-publish gate that fails when the train has blocked repos, unresolved train actions, missing evidence, or blocked evidence.
131+
125132
Privacy boundaries:
126133

127134
- No cloning.

docs/roadmap-completion-plan.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@ Implementation scope:
155155
- Coordinate local fleet release trains from safe per-repo release readiness, candidate, verification, review, security, operator, and fleet action evidence without pushing, tagging, publishing, or mutating remotes.
156156
- Turn reviewed fleet release trains into local release action queues and record manual publish evidence without executing verification, tag, push, release, or remote-mutating commands.
157157
- Reconcile fleet release train actions against manual evidence records and include summary counts in train closeout.
158+
- Add fleet release train report bundles, manual evidence checklists, hygiene checks, unresolved-evidence work imports, and a local manual-publish ready gate.
158159

159160
Acceptance:
160161

@@ -168,6 +169,7 @@ Acceptance:
168169
- Tests cover fleet release train plan/build/list/show/compare/closeout/archive text and JSON, per-repo classifications, bundle evidence, manual-only publish plans, compare warnings, closeout states, daily-loop integration, and release-doctor integration.
169170
- Tests cover fleet release train action plan/build/list/show/start/done/defer/archive and manual release evidence plan/record/list/show, including health integration and no command execution.
170171
- Tests cover release train reconcile and summary for complete, skipped, deferred, blocked, and missing evidence states.
172+
- Tests cover release train report, checklist, hygiene, import-issues, and ready gate behavior without remote mutation.
171173
- Tests prove private repo names, owner names, org names, local paths, and raw evidence are not copied into public docs, fixtures, imports, handoffs, release evidence, or committed diffs.
172174

173175
Phase 35 status:
@@ -221,6 +223,15 @@ Phase 45 status:
221223
- Release summaries report per-repo evidence status, missing evidence, blocked evidence, unresolved action counts, and suggested next commands.
222224
- Release train closeout now includes reconciliation summary counts when available.
223225

226+
Phase 46-50 status:
227+
228+
- Implemented command surface: `brigade repos release report <train-id|latest>`.
229+
- Implemented command surface: `brigade repos release import-issues <train-id|latest>`.
230+
- Implemented command surface: `brigade repos release checklist <train-id|latest>`.
231+
- Implemented command surface: `brigade repos release hygiene`.
232+
- Implemented command surface: `brigade repos release ready <train-id|latest>`.
233+
- Release reports write `RELEASE_TRAIN_REPORT.md` and `RELEASE_TRAIN_REPORT.json` into the local train bundle. Import routing uses `source: repo-fleet-release` and preserves source fingerprints. The ready gate remains local and fails on blocked repos, unresolved actions, missing evidence, or blocked evidence.
234+
224235
### 3. Inspiration Pattern Registry
225236

226237
Deliverable: a bounded local record of external workflow patterns Brigade intends to support.

src/brigade/cli.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,11 +323,19 @@ def _build_parser() -> argparse.ArgumentParser:
323323
p_repos_release_item.add_argument("train_id", help="Train id, unique prefix, or latest.")
324324
p_repos_release_item.add_argument("--target", "-t", type=Path, default=Path("."), help="Repo or workspace to inspect.")
325325
p_repos_release_item.add_argument("--json", action="store_true", help="Print machine-readable JSON.")
326-
for name in ("reconcile", "summary"):
326+
for name in ("reconcile", "summary", "report", "checklist", "ready"):
327327
p_repos_release_review = repos_release_sub.add_parser(name, help=f"{name.title()} one repo fleet release train.")
328328
p_repos_release_review.add_argument("train_id", nargs="?", default="latest", help="Train id, unique prefix, or latest.")
329329
p_repos_release_review.add_argument("--target", "-t", type=Path, default=Path("."), help="Repo or workspace to inspect.")
330330
p_repos_release_review.add_argument("--json", action="store_true", help="Print machine-readable JSON.")
331+
p_repos_release_hygiene = repos_release_sub.add_parser("hygiene", help="Check fleet release train hygiene.")
332+
p_repos_release_hygiene.add_argument("--target", "-t", type=Path, default=Path("."), help="Repo or workspace to inspect.")
333+
p_repos_release_hygiene.add_argument("--json", action="store_true", help="Print machine-readable JSON.")
334+
p_repos_release_import = repos_release_sub.add_parser("import-issues", help="Import fleet release train issues into the local work inbox.")
335+
p_repos_release_import.add_argument("train_id", nargs="?", default="latest", help="Train id, unique prefix, or latest.")
336+
p_repos_release_import.add_argument("--target", "-t", type=Path, default=Path("."), help="Repo or workspace to update.")
337+
p_repos_release_import.add_argument("--dry-run", action="store_true", help="Validate without writing imports.")
338+
p_repos_release_import.add_argument("--json", action="store_true", help="Print machine-readable JSON.")
331339
p_repos_release_closeout = repos_release_sub.add_parser("closeout", help="Close out one repo fleet release train.")
332340
p_repos_release_closeout.add_argument("train_id", nargs="?", default="latest", help="Train id, unique prefix, or latest.")
333341
p_repos_release_closeout.add_argument("--target", "-t", type=Path, default=Path("."), help="Repo or workspace to update.")
@@ -1810,6 +1818,16 @@ def main(argv=None) -> int:
18101818
return repos_cmd.release_reconcile(target=args.target, train_id=args.train_id, json_output=args.json)
18111819
if args.repos_release_command == "summary":
18121820
return repos_cmd.release_summary(target=args.target, train_id=args.train_id, json_output=args.json)
1821+
if args.repos_release_command == "report":
1822+
return repos_cmd.release_report(target=args.target, train_id=args.train_id, json_output=args.json)
1823+
if args.repos_release_command == "checklist":
1824+
return repos_cmd.release_checklist(target=args.target, train_id=args.train_id, json_output=args.json)
1825+
if args.repos_release_command == "ready":
1826+
return repos_cmd.release_ready(target=args.target, train_id=args.train_id, json_output=args.json)
1827+
if args.repos_release_command == "hygiene":
1828+
return repos_cmd.release_hygiene(target=args.target, json_output=args.json)
1829+
if args.repos_release_command == "import-issues":
1830+
return repos_cmd.release_import_issues(target=args.target, train_id=args.train_id, dry_run=args.dry_run, json_output=args.json)
18131831
if args.repos_release_command == "actions":
18141832
if args.repos_release_actions_command == "plan":
18151833
return repos_cmd.release_actions_plan(target=args.target, train_id=args.train_id, json_output=args.json)

0 commit comments

Comments
 (0)