Skip to content

feat: perspectives diff view, seeded reference-architecture example, MCP perspective param (goal 0095 slice 3, ADR-0041) - #231

Merged
alicoding merged 5 commits into
mainfrom
perspectives-diff
Aug 18, 2026
Merged

feat: perspectives diff view, seeded reference-architecture example, MCP perspective param (goal 0095 slice 3, ADR-0041)#231
alicoding merged 5 commits into
mainfrom
perspectives-diff

Conversation

@alicoding

Copy link
Copy Markdown
Owner

The final Perspectives slice — the computable diff no copy-per-diagram tool can produce:

  • Compare perspectives… in the switcher (2+ perspectives): From/To selects over four counted groups — Added/Removed cards, Added/Removed links — via a new thin AtlasService.DiffPerspectives binding over slice 1's pure helper. Re-parenting deliberately excluded (ADR-0041).
  • Seeded example: a "System landscape" area (Web app / Data store / Sync service — a new Component kind) with three seeded perspectives, Current → Interim → Target, whose link membership tells a migration story; a title edit reflects in all three — the O(1) property demonstrated live. All new goldens at SeedRevision 1; fingerprints recorded from the fingerprint test's own printed truth.
  • MCP: atlas_search_cards/atlas_read_card gain an optional perspective (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 clickFrameGutter fixture 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

alicoding and others added 2 commits August 18, 2026 05:54
…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
alicoding enabled auto-merge (squash) August 18, 2026 10:20
alicoding and others added 3 commits August 18, 2026 06:28
…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
@alicoding
alicoding merged commit 15469e0 into main Aug 18, 2026
26 of 27 checks passed
@alicoding
alicoding deleted the perspectives-diff branch August 18, 2026 11:58
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant