feat: perspectives diff view, seeded reference-architecture example, MCP perspective param (goal 0095 slice 3, ADR-0041) - #231
Merged
Conversation
…tecture, MCP perspective param (goal 0095 slice 3, ADR-0041) Compare view (AtlasPerspectiveCompareDialog): a "Compare perspectives..." row in the switcher popover opens a From/To diff over the bound DiffPerspectives wrapper (AtlasService.DiffPerspectives -> the pure atlas.DiffPerspectives helper), rendering added/removed cards and links in titled, counted groups, "No changes" only when all four are empty. Seeded example: a "System landscape" card (Web app/Data store/Sync service) with three seeded perspectives -- Current, Interim, Target -- telling the migration story via which links are members, proving the O(1) property live. MCP: atlas_search_cards/atlas_read_card gain an optional `perspective` name-or-id param, additive, filtering through FilterByPerspective. A handful of pre-existing e2e specs needed fixing/updating alongside the seed addition: exact top-level card counts (coverage stat, select-all) needed bumping by one, and two board-geometry-fragile tests (a stale-position dblclick, a frame-gutter click by fixed pixel offset) needed the same robustness idioms already used elsewhere in this suite (viewport/element stability polling, fraction-based clicks) now that the board's own fit-to-view scale shifts with the seeded card count. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FW5GkkAG8du7tNdYLk2zSd
…eplaces the fraction idiom fitView animates node geometry after board load; a bounding box measured mid-animation yields a click offset (y = staleHeight/2) that lands outside the settled frame on the pane, and Playwright re-resolves the element but never a caller-supplied position, so every retry misses forever. All seven gutter-click sites now go through one fixtures helper that polls for box stability first and uses a border-safe fixed x (a zoomed-out board's whole gutter is ~5px, so a width-proportional offset overshoots onto the first child card). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FW5GkkAG8du7tNdYLk2zSd
alicoding
enabled auto-merge (squash)
August 18, 2026 10:20
…ickFrameGutter + clickBreadcrumbSegment), unify imports Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FW5GkkAG8du7tNdYLk2zSd
…osed The 0095 seeded example widens every board the suite sees; three specs had seed-shape assumptions baked in. The breadcrumb sibling dropdown now asserts its count as a pattern (the test pins the dropdown's shape, not the seed catalogue). Mobile job 4 lands attention via the jump dialog before drilling -- at a phone viewport the seeded board exceeds what min-zoom can fit, the target frame can sit off-screen, and Playwright's scroll-into-view fights React Flow's transform forever; the jump camera-fly is the app's own door for reaching an off-screen node. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FW5GkkAG8du7tNdYLk2zSd
…r-flush race
The fixed {x:6,y:60} gutter click lands outside the frame once
fitView zooms the denser board out further (the same settled-box
class clickFrameGutter closes); rmSync gains retries because the
just-stopped server can still be flushing when cleanup runs.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FW5GkkAG8du7tNdYLk2zSd
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.
The final Perspectives slice — the computable diff no copy-per-diagram tool can produce:
AtlasService.DiffPerspectivesbinding over slice 1's pure helper. Re-parenting deliberately excluded (ADR-0041).atlas_search_cards/atlas_read_cardgain an optionalperspective(name or id), additive, filtered through the same Go helper; in-memory MCP tests both ways.Also in this PR, a root-cause fix for a whole e2e class the seed exposed: frame-gutter clicks measured their bounding box mid-fitView-animation, so the click offset landed outside the settled frame on the pane and every retry missed forever (Playwright re-resolves the element, never a caller-supplied position). All seven gutter-click sites now use one
clickFrameGutterfixture that polls for box stability and uses a border-safe fixed x. The two atlas-page tests that failed deterministically with the seed now pass in 16s.Dedicated-server e2e extended: Current→Target compare over the seeded set + no-regression on the default view. Full local gates green; screenshot-reviewed (Compare dialog + Interim-active board).
Goal: docs/goals/0095-atlas-perspectives.md (slice 3 of 3 — completes the goal).
🤖 Generated with Claude Code
https://claude.ai/code/session_01FW5GkkAG8du7tNdYLk2zSd