{{ message }}
Repository navigation
Conversation
Contributor
Author
Contributor
Author
Screen.Recording.2026-10-14.at.23.55.52.mp4 |
Member
This branch has not been deployed
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.

Summary
positionon branch create/set-zone and card create/move. Correct the misleading “zone center” description and document coordinates, anchors, and trigger behavior.agor_boards_set_positionfor an existing branch/card placement, using its board-object ID. Pinned entities use zone-relative coordinates/anchors; unpinned entities use absolute canvas coordinates.Repositioning design / authorization
Use the existing authenticated
board-objects.get→board-objects.patchpath rather than extendingset_zone: it works for both entity types, preserves zone membership, retains the existing board capability/RBAC and tenant hooks, and cannot execute zone prompt templates.set_zoneretains its existing trigger semantics, includingalways_new. No schema or migration changes.Board objects and their parent boards/entities remain tenant-owned. A real HTTP MCP test uses the production service hooks and a scope-required database proxy against PostgreSQL as a verified NOSUPERUSER/NOBYPASSRLS role. Both direct and facade calls deny a foreign-tenant admin and a same-tenant non-editor without modifying the target; the owner can reposition branches and cards in an
always_newzone without triggering work. The same-tenant caller has board Viewer access, so card denial also exercises the mutation capability gate.Validation
All final checks passed; 195 tests passed:
pnpm --filter @agor/core exec vitest run src/utils/board-placement.test.ts— 23 passed.pnpm --filter @agor/daemon exec vitest run src/mcp/tools/boards.test.ts src/mcp/tools/branches.test.ts src/mcp/tools/branches.tenant-scope.test.ts src/mcp/tools/branches.realtime.test.ts src/mcp/tools/cards.test.ts src/services/cards.test.ts src/register-hooks.board-entities.test.ts src/register-hooks.board-mcp.test.ts src/services/repos.test.ts— 171 passed, 9 suites.AGOR_DB_DIALECT=postgresql AGOR_TEST_POSTGRES_URL=<disposable database> pnpm --filter @agor/daemon exec vitest run src/mcp/tools/board-placement.postgres.test.ts— 1 passed, actual PostgreSQL/RLS (not skipped).pnpm --filter @agor/core --filter @agor/daemon exec tsc --noEmit --customConditions source --rootDir ../..— exit 0. Source resolution avoids triggering Turbo's dependency builds in the fresh worktree.pnpm check:multitenancy-boundaries, and Git whitespace check — passed.No
pnpm buildwas run. A source-mode local preview was started separately for manual development; its deployment-local configuration is not part of this PR.UI follow-up
board-objectsPATCH as canvas/MCP. Do not infer board permission from branch metadata-edit permission. Guard stale placements, unavailable zones, failures, and identity changes while awaiting reads.UI follow-up validation
cd apps/agor-ui && pnpm exec vitest run src/components/BranchModal/BranchPlacementModal.test.tsx src/components/BranchModal/BranchModal.placement.test.tsx src/components/BranchModal/BranchModal.test.tsx src/components/BranchModal/useBranchModalForm.test.tsx src/components/SessionCanvas/SessionCanvas.placement-reconciliation.test.tsx— 116 passed, 5 suites.cd apps/agor-daemon && pnpm exec vitest run src/register-hooks.board-entities.test.ts src/register-hooks.board-mcp.test.ts src/services/board-objects.test.ts— 8 passed, 3 suites.cd apps/agor-ui && pnpm exec tsc -p tsconfig.app.json --customConditions source --erasableSyntaxOnly false --noEmit— exit 0. The source-mode override is necessary because existing core source uses enums/parameter properties; it avoids dependency builds. The unmodified erasable-only setting rejects those existing core constructs.The new UI tests cover Work Context placement, no-board disabling, coordinates/clamping, anchor moves, unpinning, board access denial, rejected patches, stale placement, empty input, and cancelling a pending write after an authority change. The existing PostgreSQL cross-tenant/RLS evidence above covers the unchanged backend mutation boundary.
Teammate → Branches entry point
Validation for this entry point:
pnpm --filter agor-ui exec vitest run src/components/BranchListDrawer/BoardBranchList.placement.test.tsx src/components/BranchListDrawer/BoardBranchList.test.tsx src/components/BranchModal/BranchPlacementModal.test.tsx src/components/BoardTeammatePanel/BoardTeammatePanel.create.test.tsx— 34 tests passed, 4 suites.--customConditions source --erasableSyntaxOnly false --noEmit— exit 0; new test separately typechecked against the UI config with the same flags — exit 0.