chore: rolling promotion dev -> main - #2767
Conversation
…ssign/clear state API A1 of cross-agent-delegate W1: additive nullable TEXT columns with EXPECTED_SCHEMA/schemaIsCurrent lockstep and additive backfill (no user_version bump); ROSTER typed constant (claude|codex|pi|hermes|prime) with named rejection errors; declaration-only assignTask/clearTaskAssignment appending assign/clear timeline events.
A2 of cross-agent-delegate W1: CLI verbs over the A1 state API (single timeline event per op — no double-append), pair invariant + roster rejections with exit 1 and named errors, declaration-only at any card status, status renders the assignment, CLAUDE.md Task subcommands table documents the verb/flags and the lane-path-only serialization consequence.
…eeze preserved B of cross-agent-delegate W1: lane-path serializer gains the two declared-routing fields (14-key explicit projection alongside lane/enforcedBlock); laneless --json and mcp genieTask strip them via explicit key-picking projections, keeping the byte-frozen shapes identical to pre-change output; leak lists extended and a byte-identical laneless fixture regression added.
C of cross-agent-delegate W1: insertSnapshotRows carries assigned_agent/assigned_reason (?? null backfill for older snapshots; insertTaskRows extraction keeps cognitive complexity within budget); exportState verified column-blind (no change); roadmap-sync.ts verified hash-based — first sync after upgrade exports (never diverged), second is none. Round-trip + older-snapshot + sync-baseline tests added.
…oups + quality pass
Fresh reviewer re-derived all evidence at ca39117: six success criteria PASS, full gate matches the declared pre-existing failure set exactly, scope confined to wish files + two authorized deviations. MEDIUM doc-contract finding carried into delegate-bridge (W2) as a named prerequisite; two LOW + one INFO recorded.
Codex PR review (P2, verified): handleList serialized raw TaskRow[], leaking assignedAgent/assignedReason onto a non-lane machine-readable surface — the wish contract is lane-path board --json only. Hoist the frozen projection into task-state.ts next to TaskRow (canonical copy, was local to mcp-tools) and ship task list --json through it; leak regression proven red on the unfixed code.
feat(v5): declared agent routing on the board (wish: cross-agent-delegate)
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: ASSERTIVE Plan: Pro Plus Run ID: 📒 Files selected for processing (2)
📝 WalkthroughWalkthroughThe change adds nullable task assignment fields, roster validation, transactional assignment and clearing APIs, CLI support, database backfills, snapshot compatibility, lane-board serialization, frozen MCP projections, design records, and version updates. ChangesCross-agent task assignment
Release metadata
Estimated code review effort: 4 (Complex) | ~45 minutes Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1🛠️ Fix failing CI checks 💡
📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/lib/v5/task-state.ts`:
- Around line 1190-1195: Move the current-row lookup and no-op comparison from
the outer assignTask flow into the apply.immediate() transaction, using the
transaction’s read immediately before mutation and event creation. Ensure
concurrent assign, clear, and reassign operations derive events from the row
state serialized by each immediate transaction, and add regression coverage
using Promise.allSettled() for these concurrent cases.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: ASSERTIVE
Plan: Pro Plus
Run ID: 54c071e3-505f-49c3-aa98-5fb05f388bb6
⛔ Files ignored due to path filters (1)
CLAUDE.mdis excluded by!*.md
📒 Files selected for processing (23)
.claude-plugin/marketplace.json.genie/INDEX.md.genie/brainstorms/cross-agent-delegate/DESIGN.md.genie/brainstorms/cross-agent-delegate/DRAFT.md.genie/wishes/cross-agent-delegate/WISH.mdpackage.jsonplugins/genie/.claude-plugin/plugin.jsonplugins/genie/.codex-plugin/plugin.jsonplugins/genie/.kimi-plugin/plugin.jsonplugins/genie/package.jsonplugins/hermes-genie/plugin.yamlplugins/pi-genie/package.jsonsrc/lib/v5/card-render.test.tssrc/lib/v5/genie-db.test.tssrc/lib/v5/genie-db.tssrc/lib/v5/mcp-tools.tssrc/lib/v5/task-state.test.tssrc/lib/v5/task-state.tssrc/term-commands/mcp.test.tssrc/term-commands/v5-board.test.tssrc/term-commands/v5-board.tssrc/term-commands/v5-task.test.tssrc/term-commands/v5-task.ts
…e immediate transaction Concurrent assign/clear/reassign writers previously read the current row before the write transaction, so a racing commit could produce a stale from in the timeline note, a stale no-op decision, or a raw FK-constraint error on a concurrent delete. The row read, existence check, no-op comparison, and event append now all run inside one immediate transaction. Adds a multi-process Promise.allSettled regression test asserting the wish-event timeline forms an unbroken from→to chain under contention.
…e the immediate transaction assignTask and clearTaskAssignment read the current row and ran their no-op comparison before the write transaction, so a racing writer could commit in the window: a clear's 'was …' note could name a pair that was no longer current, a stale no-op decision could double-write, and a card deleted in the window surfaced a raw FK-constraint error instead of UnknownTaskError. The row read, existence check, no-op comparison, and event append now all run inside one immediate transaction (the checkoutTask/deleteTask pattern); pair validation and the fail-fast existence check keep their original error precedence. Adds a multi-process Promise.allSettled regression test: 9 concurrent assign/clear/reassign writers on one card, asserting the assign/clear timeline replays to the exact final row and every clear names the pair its transaction serialized against (fails ~3/4 runs pre-fix).
…serialize fix(task-state): serialize assign/wish identity writes inside their immediate transactions
Rolling Promotion PR
Auto-maintained rolling promotion PR from
devtomain.Process:
ready-to-mergeadded when all checks passSummary by CodeRabbit