Skip to content

Commit 3c3ba0e

Browse files
mabry1985claude
andauthored
chore: bump portfolio pin v0.14.1 → v0.14.2 (protoAgent ≥ 0.77 compat) (#17)
* chore: bump portfolio pin v0.14.1 -> v0.14.2 (two-tier store paths) + verified_against 0.81.0 portfolio v0.14.2 fixes the dashboard 500 on protoAgent >= 0.77 (scope_leaf was deleted in protoAgent#1481; the plugin's PM data stores now resolve via instance_paths().store() with a legacy fallback). verified_against trued up to the 0.81.0 host this pin set is being proven on. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * verify: probe enabled members' GET data routes (page-200 alone missed a dead data layer) The view probe asserts the PAGE serves 200, but portfolio v0.14.1's page did serve 200 while every /api/plugins/portfolio/* data route 500'd (the deleted scope_leaf import) — verify stayed green while the dashboard was dead. Now every parameterless GET route under an ENABLED member's gated prefix must answer <500. Carried-but-off members (project_board, agent_browser) are exempt: their data layers legitimately need runtime state (a bound repo, a browser) the scratch agent doesn't have. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
1 parent eef6dc1 commit 3c3ba0e

2 files changed

Lines changed: 32 additions & 7 deletions

File tree

protoagent.bundle.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,11 +34,11 @@ description: >-
3434
3535
# The core version this exact pin set was last verified against (ADR 0049). The verify
3636
# workflow checks out this protoAgent ref for the smoke — bump on re-verify.
37-
verified_against: 0.66.0
37+
verified_against: 0.81.0
3838

3939
plugins:
4040
- { id: delegates, builtin: true } # ACP/A2A spawn spine — ships with protoAgent
41-
- { id: portfolio, url: https://github.com/protoLabsAI/portfolio-plugin, ref: v0.14.1 } # orchestrate + spawn teams
41+
- { id: portfolio, url: https://github.com/protoLabsAI/portfolio-plugin, ref: v0.14.2 } # orchestrate + spawn teams
4242
- { id: project_board, url: https://github.com/protoLabsAI/projectBoard-plugin, ref: v0.24.0 } # installed-not-enabled: spawned teams' board
4343
- { id: agent_browser, url: https://github.com/protoLabsAI/agent-browser-plugin, ref: v0.5.1 } # installed-not-enabled: spawned teams' browser
4444

scripts/verify_bundle.py

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,19 @@
22
"""Verify a bundle's pin set against a protoAgent checkout (ADR 0049).
33
44
Installs the bundle (at its pinned refs) into a SCRATCH agent, enables every member,
5-
loads them through the real plugin loader, and probes every declared console-view
6-
path over HTTP — the check that catches "the pin predates the view fix" before an
7-
operator spawns a broken archetype.
5+
loads them through the real plugin loader, probes every declared console-view path
6+
over HTTP, and probes the parameterless GET data routes of the members the bundle
7+
ENABLES — the checks that catch "the pin predates the view fix" and "the page serves
8+
but the data layer 500s" before an operator spawns a broken archetype.
89
910
Run from inside a protoAgent checkout with deps synced (the verify workflow does
1011
exactly this):
1112
1213
uv run --no-sync python /path/to/bundle/scripts/verify_bundle.py /path/to/bundle
1314
1415
The bundle path must be a git repo (a CI checkout is); the installer clones from it.
15-
Exit code 0 = every member installed, loaded, and every declared view answered 200.
16+
Exit code 0 = every member installed, loaded, every declared view answered 200, and
17+
every enabled member's parameterless GET data route answered < 500.
1618
"""
1719

1820
from __future__ import annotations
@@ -91,12 +93,35 @@ def main(bundle_src: str) -> int:
9193
if not ok:
9294
failures.append(f"{pid}: view {path!r} returned {status}")
9395

96+
# ── 4. PROBE the data routes of ENABLED members ───────────────────────────────
97+
# The page probe alone can't catch a data-layer break: a view page serves 200
98+
# while every /api/plugins/<id>/* route 500s (portfolio v0.14.1 importing the
99+
# scope_leaf knob protoAgent 0.77 deleted — the dashboard died, verify stayed
100+
# green). So every parameterless GET route under an enabled member's gated
101+
# prefix must answer < 500. Enabled members only: carried-but-off members
102+
# (project_board, agent_browser) legitimately need runtime state (a bound
103+
# repo, a browser) this scratch agent doesn't have.
104+
from fastapi.routing import APIRoute
105+
106+
enabled_members = set(summary.get("enabled") or []) & set(members)
107+
for route in app.routes:
108+
if not isinstance(route, APIRoute) or "GET" not in (route.methods or set()) or "{" in route.path:
109+
continue
110+
pid = next((p for p in enabled_members if route.path.startswith(f"/api/plugins/{p}/")), None)
111+
if pid is None:
112+
continue
113+
status = client.get(route.path).status_code
114+
ok = status < 500
115+
print(f" data {pid} {route.path!r} -> {status}{'' if ok else ' ✗'}")
116+
if not ok:
117+
failures.append(f"{pid}: data route {route.path!r} returned {status}")
118+
94119
if failures:
95120
print(f"\nFAIL ({len(failures)}):")
96121
for f in failures:
97122
print(f" - {f}")
98123
return 1
99-
print(f"\nOK — {len(members)} member(s) installed+loaded, all declared views serve 200.")
124+
print(f"\nOK — {len(members)} member(s) installed+loaded, declared views serve 200, enabled data routes < 500.")
100125
return 0
101126

102127

0 commit comments

Comments
 (0)