Skip to content

Commit d6da0b0

Browse files
mabry1985claude
andauthored
refactor: pm-stack → Portfolio Manager bundle (manager-of-teams tier) (#9)
* chore: bump portfolio pin v0.4.0 -> v0.5.0 (portfolio_autodispatch) Closes the cross-board loop — auto-dispatch held work once its dependency ships (planned-dispatch links + idempotent portfolio_autodispatch). ADR 0055 P3. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * refactor: pm-stack → Portfolio Manager bundle (the manager-of-teams tier) Completes the portfolio→team split (ADR 0055). The Lead Engineer bundle is the team tier (project_board + a repo's coding agents); pm-stack is now the manager tier that orchestrates + SPAWNS those teams. - enabled: [delegates, portfolio] — the manager spine only (was: also project_board + agent_browser). The PM runs no board of its own. - project_board + agent_browser stay INSTALLED but off: a spawned team's plugins.dir defaults to this host's plugins dir, so the teams the PM spins up discover them here without a per-team reinstall. Install once, provision many teams. - portfolio pinned v0.5.0 → v0.7.2 (the team-spawning release: portfolio_spinup_team / teardown_team / autodispose / teams). - archetype: Project Manager → Portfolio Manager, with a starting SOUL (the spin-up / dispatch / roll-up / sequence / dispose loop). - config: portfolio.team_template wired (empty → the plugin's shipped example; point it at a creds-filled copy for teams that run real model turns). - verified_against 0.35.3 → 0.66.0. README rewritten for the manager tier. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
1 parent a2476c1 commit d6da0b0

2 files changed

Lines changed: 125 additions & 53 deletions

File tree

README.md

Lines changed: 55 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,70 @@
1-
# Project Manager Stack — a protoAgent plugin bundle
1+
# Portfolio Manager — a protoAgent plugin bundle
22

33
A **bundle** (ADR 0040): a curated, pinned set of plugins you install with one command.
4-
`pm-stack` stands up a board-driven project-management agent — it decomposes an idea,
5-
dispatches coding agents to ship it, and gives the agent a real browser.
4+
`pm-stack` stands up a **Portfolio Manager** — the manager-of-teams tier of the
5+
portfolio→team hierarchy (ADR 0055). It orchestrates work across **many Lead Engineer
6+
teams**: it spins a team up per project, dispatches features to each team's board over
7+
A2A, rolls up a bounded cross-board view, sequences cross-board dependencies, and disposes
8+
a team once its board drains. It runs **no board of its own** — that's the team tier.
9+
10+
The project-team counterpart is the **[Lead Engineer](https://github.com/protoLabsAI/leadEngineer)**
11+
bundle (a single repo + its coding agents). This bundle is the manager that delegates to them.
612

713
## What's in it
8-
| Plugin | Role |
9-
|---|---|
10-
| **[project_board](https://github.com/protoLabsAI/projectBoard-plugin)** | beads-backed 6-state board + ACP spawn loop + adversarial planning + Kanban/list view |
11-
| **[agent_browser](https://github.com/protoLabsAI/agent-browser-plugin)** | browser automation (vercel-labs/agent-browser) + a live Browser panel |
12-
| **delegates** | the ACP/A2A spawn spine (ships with protoAgent) |
13-
14-
The two external plugins are **pinned to release tags**`pm-stack` is a *tested combo*,
15-
not "whatever's latest." The pin means **"last verified working"** and only moves through
16-
a passing verification (ADR 0049): CI installs this manifest's pin set into a scratch
17-
agent and probes every declared console view on each PR + weekly, and a scheduled job
18-
opens a pin-bump PR when a member tags a new release. `verified_against:` in the manifest
19-
records the core version the set was last verified on.
14+
| Plugin | Role | On the PM? |
15+
|---|---|---|
16+
| **delegates** | the ACP/A2A spawn spine (ships with protoAgent) | **enabled** |
17+
| **[portfolio](https://github.com/protoLabsAI/portfolio-plugin)** | orchestrate + **spawn** teams: `portfolio_spinup_team`, `dispatch`, `rollup`, `diff`/`watch`, `link`/`plan`/`autodispatch`, `autodispose` | **enabled** |
18+
| **[project_board](https://github.com/protoLabsAI/projectBoard-plugin)** | beads-backed board + ACP spawn loop — the **team's** board | installed, off |
19+
| **[agent_browser](https://github.com/protoLabsAI/agent-browser-plugin)** | browser automation — the **team's** browser | installed, off |
2020

21-
```bash
22-
# verify locally (from a protoAgent checkout, deps synced)
23-
uv run --no-sync python /path/to/pm-stack/scripts/verify_bundle.py /path/to/pm-stack
21+
### Why the team plugins are installed but off
22+
A Portfolio Manager doesn't run a board. But the **Lead Engineer teams it spawns do**
23+
and a spawned team's `plugins.dir` defaults to **this host's** plugins dir. So pm-stack
24+
installs `project_board` (+ `agent_browser`) here, off by default, and every team the PM
25+
spins up discovers them on this host without a per-team reinstall. **Install once, provision
26+
many teams.**
2427

25-
# check members for newer release tags (rewrites refs in place)
26-
python3 scripts/check_bundle_updates.py protoagent.bundle.yaml
27-
```
28+
The external plugins are **pinned to release tags**`pm-stack` is a *tested combo*, not
29+
"whatever's latest." A pin means **"last verified working"** and only moves through a passing
30+
verification (ADR 0049): CI installs this manifest's pin set into a scratch agent and probes
31+
every declared console view on each PR + weekly, and a scheduled job opens a pin-bump PR when
32+
a member tags a new release. `verified_against:` records the core version the set was last
33+
verified on.
2834

2935
## Install
3036
```bash
3137
python -m server plugin install https://github.com/protoLabsAI/pm-stack
3238
```
33-
That fans out and installs each member (pinned in `plugins.lock`). It does **not** enable
34-
anything — install ≠ enable ≠ trust. To turn the stack on, the installer prints the suggested
35-
`plugins.enabled` list + config; apply them to your `config/langgraph-config.yaml`:
39+
Install ≠ enable ≠ trust — the installer prints the suggested `plugins.enabled` + config;
40+
apply them to your `config/langgraph-config.yaml`:
3641
```yaml
3742
plugins:
38-
enabled: [delegates, project_board, agent_browser]
39-
agent_browser:
40-
panel_mode: full
43+
enabled: [delegates, portfolio]
44+
portfolio:
45+
# The base team config portfolio_spinup_team clones per project. Empty uses the portfolio
46+
# plugin's shipped example; point it at a creds-filled copy (gateway key + model.api_base)
47+
# so spawned teams run real model turns.
48+
team_template: /path/to/your/team-template
4149
```
42-
then restart. Each plugin's own README covers its prerequisites (the board needs the `br`
43-
CLI; agent_browser needs the `agent-browser` binary).
50+
then restart. The board the PM's teams run needs the `br` (beads) CLI on this host.
4451

45-
## See it running
46-
**[roxy](https://github.com/protoLabsAI/roxy)** runs this stack — the reference host.
52+
## Spinning up teams
53+
Once enabled, the Portfolio Manager spins up an ephemeral Lead Engineer team per project:
54+
```
55+
portfolio_spinup_team(name="docs-team", repo="/abs/path/to/repo") # boots + registers a board
56+
portfolio_dispatch(board="docs-team", title=…, spec=…) # send it work over A2A
57+
portfolio_autodispose() # once its board drains, dispose it
58+
```
59+
See the [portfolio plugin](https://github.com/protoLabsAI/portfolio-plugin) for the full tool
60+
set + team-template details, and [Lead Engineer](https://github.com/protoLabsAI/leadEngineer)
61+
for the team tier.
62+
63+
## Maintenance
64+
```bash
65+
# verify locally (from a protoAgent checkout, deps synced)
66+
uv run --no-sync python /path/to/pm-stack/scripts/verify_bundle.py /path/to/pm-stack
67+
68+
# check members for newer release tags (rewrites refs in place)
69+
python3 scripts/check_bundle_updates.py protoagent.bundle.yaml
70+
```

protoagent.bundle.yaml

Lines changed: 70 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,83 @@
1-
# A protoAgent plugin BUNDLE (ADR 0040) — a curated, pinned set of plugins installed
2-
# together with one command. Install: python -m server plugin install <this-repo-url>
1+
# A protoAgent plugin BUNDLE (ADR 0040) — the Portfolio Manager tier of the
2+
# portfolio→team hierarchy, the manager-of-teams counterpart to the Lead Engineer
3+
# bundle (github.com/protoLabsAI/leadEngineer).
4+
#
5+
# Install: python -m server plugin install <this-repo-url>
6+
#
7+
# A Portfolio Manager orchestrates work across MANY Lead Engineer teams: it spins a
8+
# team up per project (portfolio_spinup_team), dispatches features to it over A2A,
9+
# rolls up + diffs + sequences cross-board dependencies, and disposes a team once its
10+
# board drains. It does NOT run a board itself — that's the team tier.
11+
#
12+
# So this bundle ENABLES the manager tier (delegates + portfolio) but INSTALLS the
13+
# team tier too (project_board + agent_browser, off by default): a spawned team's
14+
# plugins.dir defaults to THIS host's plugins dir, so the team discovers project_board
15+
# here without a per-team reinstall. Install once, provision many teams.
316
#
417
# PIN LIFECYCLE (ADR 0049): pins are release TAGS and only move through a passing
518
# verify — .github/workflows/verify-bundle.yml installs this manifest into a scratch
619
# agent and probes every declared console view (each PR + weekly), and the scheduled
720
# bump job opens a PR when a member tags a new release. Keep member entries on ONE
821
# line (scripts/check_bundle_updates.py rewrites the `ref:` token in place).
922
id: pm-stack
10-
name: Project Manager Stack
23+
name: Portfolio Manager
1124
description: >-
12-
A board-driven project-management agent stack — beads-backed board orchestration
13-
that decomposes an idea and dispatches coding agents to ship it, a real browser,
14-
and the delegate spine that powers them. Composes three standalone plugins.
25+
The manager-of-teams tier (ADR 0055). One agent orchestrates work across MANY Lead
26+
Engineer teams: it spins a team up per project on demand (portfolio_spinup_team),
27+
dispatches features to each team's board over A2A, rolls up a bounded cross-board
28+
view, watches for changes, sequences cross-board dependencies, and disposes a team
29+
once its board drains. It runs no board of its own — the project-team counterpart is
30+
the Lead Engineer bundle. Enables the manager spine (delegates + portfolio) and
31+
carries the team plugins (project_board + agent_browser, installed but off) so the
32+
teams it spawns discover them on this host. The portfolio→team split of the old
33+
pm-stack.
1534
16-
# The core version this pin set was last verified against (ADR 0049). The verify
17-
# workflow smokes against protoAgent main; bump this when re-verified on a release.
18-
verified_against: 0.35.3
35+
# The core version this exact pin set was last verified against (ADR 0049). The verify
36+
# workflow checks out this protoAgent ref for the smoke — bump on re-verify.
37+
verified_against: 0.66.0
1938

2039
plugins:
21-
- { id: delegates, builtin: true } # ships with protoAgent
22-
- { id: project_board, url: https://github.com/protoLabsAI/projectBoard-plugin, ref: v0.19.0 }
23-
- { id: agent_browser, url: https://github.com/protoLabsAI/agent-browser-plugin, ref: v0.5.1 }
24-
- { id: portfolio, url: https://github.com/protoLabsAI/portfolio-plugin, ref: v0.5.0 }
25-
enabled: [delegates, project_board, agent_browser, portfolio] # suggested turn-on list (you apply it)
26-
config: # recommended defaults (you apply them)
27-
agent_browser:
28-
panel_mode: full
40+
- { id: delegates, builtin: true } # ACP/A2A spawn spine — ships with protoAgent
41+
- { id: portfolio, url: https://github.com/protoLabsAI/portfolio-plugin, ref: v0.7.2 } # orchestrate + spawn teams
42+
- { id: project_board, url: https://github.com/protoLabsAI/projectBoard-plugin, ref: v0.19.0 } # installed-not-enabled: spawned teams' board
43+
- { id: agent_browser, url: https://github.com/protoLabsAI/agent-browser-plugin, ref: v0.5.1 } # installed-not-enabled: spawned teams' browser
44+
45+
# The PM runs the MANAGER tier only. project_board + agent_browser stay installed-but-off
46+
# here — they're for the Lead Engineer teams this PM spawns (which discover them via this
47+
# host's plugins dir), not for the PM itself.
48+
enabled: [delegates, portfolio]
49+
config:
50+
portfolio:
51+
# The base team config portfolio_spinup_team clones per project. Empty falls back to
52+
# the portfolio plugin's shipped example (a generic project_board + delegates team);
53+
# point this at a creds-filled copy (gateway key + model.api_base) so spawned teams
54+
# run real model turns. {{REPO}} / {{TEAM_NAME}} / {{GATE}} are filled per spawn.
55+
team_template: ""
2956

30-
# Agent archetype (ADR 0042) — presents this bundle as a starter "agent type" in the
31-
# new-agent picker. Additive metadata; it doesn't change the bundle shape.
57+
# Agent archetype (ADR 0042) — presents this bundle as a "Portfolio Manager" agent type
58+
# in the new-agent picker, with a starting persona. Additive metadata.
3259
archetype:
33-
label: Project Manager
34-
icon: LayoutGrid
35-
blurb: Board-driven shipping agent — decomposes an idea and ships it through coding agents.
60+
label: Portfolio Manager
61+
icon: Network
62+
blurb: Orchestrates many engineering teams — spins one up per project, dispatches + rolls up work, disposes it when the board drains.
63+
soul: |
64+
# Portfolio Manager
65+
66+
You are a portfolio manager. You orchestrate work across MANY engineering teams —
67+
you do not write code or run a board yourself.
68+
69+
Your loop, per project:
70+
- Spin up a team for it with `portfolio_spinup_team(name, repo)` — an ephemeral
71+
Lead Engineer pinned to that repo. Reuse a standing team if one already fits.
72+
- Dispatch self-sufficient features to its board with `portfolio_dispatch` (give a
73+
clear spec + acceptance criteria + the files to touch — a vague task ships nothing).
74+
- Sequence cross-team dependencies with `portfolio_link` + `portfolio_plan` +
75+
`portfolio_autodispatch`; hold work behind a blocker and release it when that ships.
76+
- Stay current without polling: `portfolio_watch` once, then read the deltas
77+
`portfolio_diff` surfaces (merged / blocked / unblocked / new).
78+
- Dispose a finite project's team when its board drains — `portfolio_autodispose`
79+
(or `portfolio_teardown_team`). Standing teams you keep.
80+
81+
Think in terms of OUTCOMES across the portfolio, not individual diffs. Keep each
82+
team's brief small and shippable, watch the rollup, unblock what's stuck, and report
83+
progress as features merge to done.

0 commit comments

Comments
 (0)