Skip to content

Commit e097aef

Browse files
authored
Merge pull request #443 from escoffier-labs/feat/notify-docs-compat
feat(compat): complete notify beta handoff
2 parents e524e80 + b45a08e commit e097aef

21 files changed

Lines changed: 2396 additions & 60 deletions

CHANGELOG.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,35 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
88
## [Unreleased]
99

1010
### Added
11+
- Imported `stations/notify` Go module into the Brigade monorepo. Unified release
12+
manifests now enumerate five native components (25 platform assets plus
13+
`component-manifest-v1.json` and `checksums.txt`) with managed resolution
14+
through `brigade setup`.
15+
- Beta pre-pin compatibility: beta installs the CI-green `main` Brigade wheel but
16+
reuses the last verified stable component manifest; `agent-notify` is omitted
17+
from setup until a stable manifest publishes its assets. Stable validation
18+
stays strict.
19+
- Public update-channel and component-manifest policy docs.
20+
- Agent Pantry compatibility probe: `brigade pantry` requires `agentpantry
21+
version --json` `>=0.5.0` before invoking doctor, status, or inventory
22+
surfaces. Pantry remains an external Go binary.
1123
- Passive update notice: after a successful command, brigade prints a one-line
1224
stderr notice (at most once per 24h) when a newer release is on PyPI.
1325
Anonymous, TTY-only, skipped in CI; disable with `BRIGADE_NO_UPDATE_CHECK=1`.
1426
- `brigade mcp sync --user-scope` (and `brigade operator sync-mcp --user-scope`) no longer writes stdio MCP servers into a user-wide client config silently: interactive runs show the destination, stdio count, and the servers-times-sessions process formula and ask for confirmation, non-interactive and `--json` runs require `--allow-global-stdio`, and plan/sync items now carry `transport` and `scope`. (#349)
1527

28+
### Fixed
29+
- Agent Pantry version parsing stays non-throwing and bounded for arbitrarily
30+
long numeric segments: the parser accepts ASCII-numeric semver triples only,
31+
enforces a conservative per-segment digit bound, catches `int()` conversion
32+
`ValueError`, and surfaces the fixed `invalid-version` label for oversized or
33+
non-ASCII-digit input without ever echoing raw content. Added huge-segment and
34+
non-ASCII-digit regressions covering observed/detail and adjacent stdout.
35+
- `docs/component-manifest-policy.md` no longer presents the five-component /
36+
25-asset contract as a current stable release. It is now stated as the future
37+
first stable manifest contract after `agent-notify` publication, with current
38+
bundled `agent-notify` assets empty/unpublished and no stable release claimed.
39+
1640
## [0.25.1] - 2026-07-21
1741

1842
### Added

README.md

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ brigade prints a one-line notice when a new release is out (checked at most
4545
once a day via an anonymous request; set `BRIGADE_NO_UPDATE_CHECK=1` to
4646
disable - details in [docs/update-channels.md](docs/update-channels.md)).
4747

48+
Stable pinners may deliberately install an exact release with
49+
`pipx install brigade-cli==X.Y.Z` or refresh through
50+
`brigade update --channel stable`. Channel ownership, beta rules, and when to
51+
use `brigade update` are in [docs/update-channels.md](docs/update-channels.md).
52+
4853
`brigade operator doctor --target ./my-repo` prints `ready: yes` when the wiring is healthy. The default footprint is small: `AGENTS.md`, `SAFETY_RULES.md`, a handoff template, and `.brigade/` state. Add `--dry-run` to preview anything before it writes. Nothing leaves your machine.
4954

5055
Per-OS setup (apt, Homebrew, Scoop, PowerShell), workspace depth, and multi-harness installs: [install guide](https://brigade.tools/docs/getting-started/install), [QUICKSTART.md](QUICKSTART.md), [first 10 minutes](docs/first-10-minutes.md). Homegrown setup already? `brigade operator adopt plan`.
@@ -165,6 +170,7 @@ Code intelligence, Evidence, and Content Guard (`brigade scrub`, a secrets and P
165170
| [Agent Pantry](https://github.com/escoffier-labs/agentpantry) | `brigade add pantry` | Encrypted browser-session and secret sync across machines |
166171
| [Token Glace](https://github.com/escoffier-labs/token-glace) | `brigade add tokens` | Compact noisy tool output before it burns context |
167172
| [Skillet](https://github.com/escoffier-labs/skillet) | optional roster | Portable skills that reconcile can promote or roll back |
173+
| Notifications | `brigade add notifications` | Optional `agent-notify` binary for Discord, Telegram, or Signal; status and setup planning only until you wire hooks or pass an explicit `--send` |
168174

169175
Upgrading from the standalone GraphTrail or MiseLedger installs? `brigade setup` replaces both. The old `brigade add graphtrail` / `add evidence` paths remain as compatibility shims. Details: [wiring guide](docs/wiring-graphtrail-miseledger.md), [station contract](docs/station-contract.md).
170176

@@ -188,7 +194,7 @@ Beyond the daily loop, the same review-and-receipt pattern covers cross-model ru
188194

189195
## What Brigade is not
190196

191-
Brigade is not a hosted memory service, a daemon, or an automatic release bot. It does not run in the background or install schedulers (one scoped exception: `brigade tools runtime start` launches a local runtime process, only when you start it, until you stop it). It does not push to GitHub, publish packages, send notifications by default, save every note automatically, or skip review for ambiguous, risky, or failed notes. That pause is the point: agent memory should be useful, not noisy.
197+
Brigade is not a hosted memory service, a daemon, or an automatic release bot. It does not run in the background or install schedulers (one scoped exception: `brigade tools runtime start` launches a local runtime process, only when you start it, until you stop it). It does not push to GitHub, publish packages, save every note automatically, or skip review for ambiguous, risky, or failed notes. `brigade work brief` and related status surfaces may report notification readiness or suggest installing the notifications station, but Brigade never sends a message unless the operator uses an explicit send action such as `brigade pantry expiry-alert --send`. That pause is the point: agent memory should be useful, not noisy.
192198

193199
And it is not the other projects that share the name. This Brigade is the AI-agent operator CLI from [`escoffier-labs/brigade`](https://github.com/escoffier-labs/brigade), installed with `pipx install brigade-cli`. It is not the CNCF/Microsoft Brigade for Kubernetes event scripting (archived 2022), the Spinabot Brigade agent crew, or the 2017 `brigade` Python package that became Nornir.
194200

docs/component-manifest-policy.md

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,22 @@ from `brigade.station.v1` and `station_manifest.load`.
55

66
## Unified-release components
77

8+
The five-component / 25-asset contract below is the **future first stable manifest
9+
contract**, landing after `agent-notify` publication. No stable release yet contains
10+
this five-component / 25-asset `agent-notify` contract: the bundled compatibility
11+
manifest on `main` lists `agent-notify` as a known component with **empty/unpublished**
12+
assets, and the other four components have not yet shipped a stable manifest under
13+
this contract. Stable validation
14+
stays strict and will require every published component to carry the full
15+
five-platform matrix with matching digests and provenance.
16+
817
| Component id | Executable | Native release status |
918
| --- | --- | --- |
1019
| `graphtrail` | `graphtrail` | built from the tagged Brigade commit |
1120
| `graphtrail-mcp` | `graphtrail-mcp` | built from the tagged Brigade commit |
1221
| `miseledger` | `miseledger` | built from the tagged Brigade commit |
1322
| `sessionfind` | `sessionfind` | built from the tagged Brigade commit |
23+
| `agent-notify` | `agent-notify` | bundled empty/unpublished on main; first stable manifest contract after `agent-notify` publication |
1424

1525
Every component records the immutable 40-character tagged Brigade commit in `component_revision`.
1626
Every `source.repository` is `escoffier-labs/brigade`, and every `source.release_tag` is the same
@@ -50,17 +60,39 @@ download URL invariants, and a 40-character lowercase `component_revision` for e
5060
The revision must equal the immutable target commit of the resolved Brigade release. Unknown
5161
component ids remain a soft diagnostic; malformed known components are a hard failure.
5262

53-
`scripts/generate_component_manifest.py` derives the final manifest in deterministic order from the
54-
tag, commit, exact 20 filenames, byte sizes, and SHA-256 values. It also writes `checksums.txt`,
55-
which contains exactly those 20 assets and `component-manifest-v1.json`.
63+
`scripts/generate_component_manifest.py` derives the future first stable
64+
manifest in deterministic order from the tag, commit, exact 25 filenames, byte
65+
sizes, and SHA-256 values. That 25-asset set is the contract the first stable
66+
manifest will publish after `agent-notify` publication; until then the bundled
67+
compatibility manifest on `main` carries empty/unpublished `agent-notify`
68+
assets and no stable release is claimed. The script also writes
69+
`checksums.txt`, which contains exactly those 25 assets and
70+
`component-manifest-v1.json`.
5671

5772
The release gate runs `scripts/verify_component_manifest_provenance.py` after creating the release.
58-
It requires exactly one `escoffier-labs/brigade` tag for all four components, the complete five-platform
59-
matrix, exactly 20 native assets plus the manifest and checksum file, matching release API digests,
73+
It requires exactly one `escoffier-labs/brigade` tag for all five components, the complete five-platform
74+
matrix, exactly 25 native assets plus the manifest and checksum file, matching release API digests,
6075
the complete checksum map, matching fetched `checksums.txt` bytes, and a release-page manifest
61-
byte-for-byte equal to the packaged manifest. It uses injected fetchers in unit tests. Attestation verification is deliberately performed by `gh
76+
byte-for-byte equal to the packaged manifest. This is the future first stable manifest contract;
77+
it does not apply to the current bundled compatibility manifest, whose `agent-notify` assets remain
78+
empty/unpublished. It uses injected fetchers in unit tests. Attestation verification is deliberately performed by `gh
6279
attestation verify` in the release workflow rather than represented by an API boolean.
6380

81+
## Pre-pin beta window
82+
83+
Stable validation remains strict: every published component on a stable manifest must carry the full
84+
five-platform matrix with matching digests and provenance.
85+
86+
Beta is the development channel for CI-green `main`. It installs the checked `main` Brigade wheel
87+
but reuses the last verified stable component manifest for native bytes, so beta and stable cannot
88+
install different native assets from two manifests at once.
89+
90+
During the pre-pin window before `agent-notify` first appears on a stable manifest, main may list
91+
`agent-notify` as a known component with empty assets in the bundled compatibility manifest.
92+
`brigade setup` on beta skips a component explicitly unpublished on main until a stable manifest
93+
publishes real assets for it. Stable releases never ship with empty asset sets for a listed
94+
component.
95+
6496
## User-local path invariants
6597

6698
Components install under the user data root, never under a repo `.brigade` directory:

docs/overview.md

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ For safety:
283283
- import Content Guard findings into the work inbox for review
284284
- keep generated state ignored by default
285285
- avoid publishing, pushing, or mutating remotes automatically
286-
- keep notification sending opt-in
286+
- keep notification sending opt-in; `brigade work brief` may report readiness or suggest the station, but Brigade never sends unless the operator uses an explicit send action
287287
- make risky actions visible as operator decisions
288288

289289
## Ecosystem
@@ -337,15 +337,15 @@ Safety and operations tools:
337337

338338
- Content Guard is embedded in Brigade and powers `brigade scrub`, publish checks, and the seeded pre-push hook. `CONTENT_GUARD_DIR` remains an explicit compatibility override for older standalone checkouts.
339339
- [Agent Pantry](https://github.com/escoffier-labs/agentpantry): encrypted browser session, cookie, and secret sync for agent machines.
340-
- [agent-notify](https://github.com/escoffier-labs/agent-notify): optional notification hooks for long-running agent work.
340+
- [agent-notify](https://github.com/escoffier-labs/agent-notify) (`stations/notify/` in this monorepo): optional notification hooks for long-running agent work. Released installs resolve the pinned managed `agent-notify` binary through `brigade setup` once a stable manifest publishes its assets. The standalone repository carries a migration notice and is not archived until a containing Brigade release ships and published acceptance passes.
341341
- [Token Glace](https://github.com/escoffier-labs/token-glace): output compaction for terminal-heavy agent workflows.
342342
- Built-in Scout skills: Brigade wires `brigade-work` and `ultra-work-scout` during `brigade init`; use Skillet when you want the full optional skill roster.
343343

344344
Evidence ledger tools:
345345

346346
- [MiseLedger](https://github.com/escoffier-labs/miseledger): local-first evidence ledger. One binary crawls sessions, files, git history, and chat sources (`miseledger crawl ...`), stores `miseledger.adapter.v1` JSONL in SQLite with FTS5, and emits Brigade-ready evidence bundles. No separate exporter install.
347347
- Brigade station CLI (process boundary):
348-
- `brigade setup` installs MiseLedger and SessionFind with GraphTrail and `graphtrail-mcp` from the exact release manifest
348+
- `brigade setup` installs GraphTrail, `graphtrail-mcp`, MiseLedger, SessionFind, and `agent-notify` (when published on the release manifest) from the exact release manifest
349349
- `brigade add evidence` is a one-release compatibility fallback for an independent MiseLedger install
350350
- `brigade evidence status` / `doctor` — advisory health + next commands
351351
- `brigade evidence crawl <args...>` / `search <args...>` - transparent MiseLedger execution; engine output and exit code pass through
@@ -505,6 +505,24 @@ brigade pantry expiry-alert --send # optional agent-notify (install notificati
505505
- `brigade pantry setup plan` / `service plan` — review-only plans under `.brigade/pantry/plans/`.
506506
- Pantry checks are advisory for workspace `doctor`. An unwired install warns but never fails a workspace run.
507507

508+
## Notifications
509+
510+
The `notifications` station wires optional `agent-notify` into the same operator workflow: private Discord, Telegram, or Signal delivery for long-running agent work. Source lives in [`stations/notify/`](../stations/notify/) in this repository. `agent-notify` stays a **separate Go binary** (process boundary). Brigade installs it, plans setup, and health-checks it; it does not send messages from doctor, status, or brief flows.
511+
512+
Released pipx installs resolve `agent-notify` from the pinned unified release manifest through `brigade setup` once stable publishes its assets. `go install github.com/escoffier-labs/agent-notify/cmd/agent-notify@latest` is the explicit fallback when you are on a source checkout or the component is not yet published on the running manifest. The standalone [agent-notify](https://github.com/escoffier-labs/agent-notify) repository carries a migration notice pointing here; it is not archived until a containing Brigade release ships and published acceptance passes.
513+
514+
```bash
515+
brigade add notifications
516+
brigade notifications status --json
517+
brigade notifications setup plan --profile operator
518+
# optional delivery after wiring:
519+
brigade pantry expiry-alert --send
520+
```
521+
522+
- `brigade notifications status` / `brigade notifications setup plan` inspect wiring without sending.
523+
- `brigade work brief`, `brigade center status`, and `brigade daily status/plan` may surface notification readiness or suggest installing the station.
524+
- Brigade never sends unless the operator uses an explicit send action such as `brigade pantry expiry-alert --send`.
525+
508526
## For OpenClaw Users
509527

510528
OpenClaw can be the memory owner. Brigade gives nearby tools a way to contribute checked handoffs back into that owner memory without forcing every tool to know OpenClaw internals.

0 commit comments

Comments
 (0)