fix: the PM owns board triage — onboarding becomes scan-and-report only#35
Merged
Conversation
…ly (v0.15.1) Live dogfooding postmortem: spun up a team, dispatched one feature. The team's own board ended up with TWO beads for the SAME work, twice over — once for its onboarding task, once for the dispatched feature. Its own audit log showed why: the freshly-booted agent called board_create_feature TWICE, ~7-9s apart, same title each time (fixed at the tool level in projectBoard-plugin#63). But that's a symptom. The onboarding instruction itself told the team to BOTH "auto-fix the safe stuff directly" AND "board the judgment gaps" -- a distinction an LLM under its own steam, freshly booted, didn't reliably keep straight. In practice everything it found -- even the "safe" items -- became a board feature. Patching the dedup at board_create_feature closes the duplicate-creation bug, but leaves the team deciding what goes on its own board, which is the PM's job. Onboarding is now READ-ONLY: scan and report PASS/GAP per item, no board writes, no code changes. portfolio_spinup_team's result surfaces the summary + an explicit "next" nudge to review it and portfolio_dispatch whatever needs real work -- the same dedup-guarded path (#25) every other feature goes through. The PM decides what's on the board; the team never self-boards. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
👀 Quinn is reviewing — verdict (PASS / WARN / FAIL) + findings to follow. |
There was a problem hiding this comment.
QA Audit — PR #35 | fix: the PM owns board triage — onboarding becomes scan-and-report only
VERDICT: WARN (non-blocking — CI not yet terminal)
CI Status
- test: queued
Diff Review
_onboard_instructionrewritten to forbid board writes + code changes; still invokesonboard-projectfor the scan (__init__.py:645-668)_spinup_teamnextfield now conditionally prompts the PM to review the onboarding summary +portfolio_dispatchgaps themselves, rather than assuming the team did it (__init__.py:1241-1248)- Docstrings for
portfolio_spinup_teamand its args updated to reflect the read-only contract (__init__.py:1604-1647) - Version bump 0.15.0 → 0.15.1 consistent across
protoagent.plugin.yamlandpyproject.toml - Two new tests verify the instruction forbids board writes, forbids code changes, and defers to the PM (
tests/test_team_spawn.py:1025-1041)
Observations
- LOW: clawpatch structural review skipped — repo not in project registry. Diff-based review only; no cross-file concerns identified.
- LOW: CI still queued. Formal PASS/FAIL deferred until checks are terminal.
— Quinn, QA Engineer
|
Submitted COMMENT review on #35. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Found live, in dogfooding (companion to projectBoard-plugin#63)
Spun up a team via Roxy, dispatched one feature. The team's board ended up with two beads for the same work, twice over:
The team's own audit log showed the immediate cause: its agent called
board_create_featuretwice, ~7-9s apart, same title each time — fixed at the tool level in projectBoard-plugin#63 (a dedup guard onboard_create_featureitself).But that's the symptom, not the root cause
The onboarding instruction (
_onboard_instruction) told the team to both "auto-fix the safe, deterministic gaps directly" and "board the judgment gaps... as features if they need real work." That's a judgment call — and a freshly-booted agent, under its own steam, didn't reliably keep the two modes apart: everything it found, even the "safe" items, ended up as a board feature (both PRs #33 and #34 exist — the "safe direct auto-fix" PROTO.md doc got boarded + PR'd exactly like the real dispatched feature).Patching the dedup at
board_create_featurestops the duplicate creation, but leaves the team deciding what goes on its own board — which is the PM's job, not the team's.Fix
Onboarding is now read-only: scan and report
PASS/GAPper item — no board writes, no code changes, full stop.portfolio_spinup_team's result surfaces the summary plus an explicitnextnudge to review it andportfolio_dispatchwhatever needs real work — the same dedup-guarded path (#25) every other feature already goes through. The PM decides what's on the board; the team never self-boards.Changes
_onboard_instruction: rewritten to forbid board/code writes explicitly; still runs theonboard-projectskill, just to scan.portfolio_spinup_teamdocstring +onboardarg doc: reflect the new contract.nextfield in the spinup result: nudges the caller to review the onboarding summary and dispatch, when onboarding ran.test_onboard_instruction_forbids_board_writes_and_code_changes,test_onboard_instruction_defers_the_call_to_the_pm.Gate:
ruff check . && ruff format --check . && pytest -q— 127 passed.Version bumped 0.15.0 → 0.15.1 (behavior change to an existing tool's side effects).
Companion PR (bundle soul update): portfolio-manager-stack#26.
🤖 Generated with Claude Code