Skip to content

Redesign reporting view for 3-workspace model with audience toggle#18

Merged
jukka-matti merged 1 commit into
mainfrom
claude/redesign-reporting-workspaces-xCrYu
Mar 20, 2026
Merged

Redesign reporting view for 3-workspace model with audience toggle#18
jukka-matti merged 1 commit into
mainfrom
claude/redesign-reporting-workspaces-xCrYu

Conversation

@jukka-matti
Copy link
Copy Markdown
Owner

Replace flat 5-step report with workspace-aligned report types:

  • Analysis Snapshot (green, 2 sections) for SCOUT phase
  • Investigation Report (amber, 3 sections) for INVESTIGATE phase
  • Improvement Story (purple, 6 sections) for full PDCA cycle

Add Technical/Summary audience toggle for different readers.
Add workspace group headers in sidebar TOC with phase colors.
Add new components: ReportHypothesisSummary, ReportImprovementSummary,
ReportCpkLearningLoop for richer evidence trail and improvement content.

https://claude.ai/code/session_012YPrFNRtCRkkJGSXz4fBE7

Replace flat 5-step report with workspace-aligned report types:
- Analysis Snapshot (green, 2 sections) for SCOUT phase
- Investigation Report (amber, 3 sections) for INVESTIGATE phase
- Improvement Story (purple, 6 sections) for full PDCA cycle

Add Technical/Summary audience toggle for different readers.
Add workspace group headers in sidebar TOC with phase colors.
Add new components: ReportHypothesisSummary, ReportImprovementSummary,
ReportCpkLearningLoop for richer evidence trail and improvement content.

https://claude.ai/code/session_012YPrFNRtCRkkJGSXz4fBE7
@vercel
Copy link
Copy Markdown

vercel Bot commented Mar 20, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
mean-beoynd-lite-pwa Ready Ready Preview, Comment Mar 20, 2026 4:06pm
variscout_website Ready Ready Preview, Comment Mar 20, 2026 4:06pm

@jukka-matti jukka-matti merged commit 78621fd into main Mar 20, 2026
3 checks passed
@jukka-matti jukka-matti deleted the claude/redesign-reporting-workspaces-xCrYu branch March 20, 2026 22:06
jukka-matti added a commit that referenced this pull request May 14, 2026
…leanup workstream) (#166)

* fix(8f-followup): delete legacy variscout-wall-layout Dexie DB on init

Closes 8f followup HIGH #3 — pre-8f users carried an orphan IndexedDB
forever after the wallLayoutStore → canvasViewportStore shape change.
Mirror PwaHubRepository's legacy-DB cleanup pattern. Tightens the
existing test that lied about asserting deletion.

Co-Authored-By: ruflo <ruv@ruv.net>

* refactor(8f-followup): migrate canvas UI strings to typed message catalogs

Closes 8f followup HIGH #5 — 47 hardcoded English strings across
SystemLevelView, CanvasLensPicker, MobileLevelPicker, NoFocalStepPrompt,
AuthorL3View, LocalMechanismView now route through MessageCatalog.
CANVAS_LENS_REGISTRY labels/descriptions translated at render time in
CanvasLensPicker via LENS_LABEL_KEY / LENS_DESC_KEY maps; the hooks
registry keeps English for non-UI consumers. Non-English locales receive
English placeholders pending a translation pass (TODO(i18n) comment).

Co-Authored-By: ruflo <ruv@ruv.net>

* fix(8f-followup): migrate Canvas empty-state to message catalog

Closes the i18n reviewer's flagged follow-up: Canvas/index.tsx:1042
rendered the lens registry's English label and a local
CANVAS_LEVEL_LABELS map as user-facing copy, bypassing i18n.

- Export LENS_LABEL_KEY from CanvasLensPicker for cross-component reuse
- Reuse canvas.mobile.{system,process,step} for level labels
- Add canvas.lensPicker.invalidAtLevel parameterized key (32 locales,
  English placeholder elsewhere per the catalog's translation pass plan)
- Drop CANVAS_LEVEL_LABELS + remove now-unused CANVAS_LENS_REGISTRY import

Co-Authored-By: ruflo <ruv@ruv.net>

* test(8f-followup): cover CanvasLensPicker lens × level predicate

Closes 8f followup LOW #20 — load-bearing CanvasLensPicker had no
dedicated test. 18 enabled/disabled cells (3 levels × 6 lenses) +
click-dispatch + aria-label assertions.

Co-Authored-By: ruflo <ruv@ruv.net>

* docs(8f-followup): refresh stale wallLayoutStore references in store comments

Closes 8f followup LOW #18 — viewStore.ts:140 + preferencesStore.ts:178
still mentioned wallLayoutStore in doc-strings after the PR1 rename to
canvasViewportStore.

Co-Authored-By: ruflo <ruv@ruv.net>

* docs(8f-followup): fix plan frontmatter category to allowed enum value

* refactor(8f-followup): extract getStepColumnAssignments to @variscout/core/frame

Closes 8f followup HIGH #2 — AuthorL3View's private focalStepColumns
helper duplicates business logic that should live in core/frame. The
helper now lives at packages/core/src/frame/stepColumns.ts with 6
unit tests; AuthorL3View imports it. Per ADR-074 amendment + ADR-081:
Canvas embeds owner-surface computation, doesn't re-derive.

Co-Authored-By: ruflo <ruv@ruv.net>

* fix(8f-followup): tie L1 specLimits to outcome's own measureSpecs entry

Closes 8f followup MEDIUM #8 — SystemLevelView trusted a flat specLimits
prop without ADR-073-anchored contract. Now accepts measureSpecs keyed by
column and derives from measureSpecs[map.ctsColumn] internally; old prop
renamed to specLimitsOverride (advisory/debug only, deprecated). Canvas
passes { [ctsColumn]: { usl, lsl, target, cpkTarget } } as measureSpecs.
Two regression tests assert the leak scenario: wrong-column measureSpecs
key produces '--' Cpk, not a silently wrong value.

Co-Authored-By: ruflo <ruv@ruv.net>

* refactor(8f-followup): replace LocalMechanismView's focalStepColumns duplicate

Same ADR-074 amendment violation that PR2 fixed in AuthorL3View. The
private helper now delegates to getStepColumnAssignments from
@variscout/core/frame (introduced in the prior commit), flattening the
structured result into the string[] this view needs.

Co-Authored-By: ruflo <ruv@ruv.net>

* docs(8f-followup): resolve lens × level matrix gap via spec amend

Closes 8f followup HIGH #4 via AMEND path (not expand). Git blame shows
both `performance` and `yamazumi` lenses were introduced with
`enabled: false` AND registry descriptions explicitly labeling them as
"Future ... lens" — intentional V2 placeholders, not bugs. Spec §10 was
over-promised at original ship.

- Spec §10 matrix amended: 6 cells marked `(V2 — deferred; lens not
  enabled in V1)` instead of pretending they ship enabled
- V2 expansion path documented inline
- investigations.md entry marked RESOLVED 2026-05-13 with rationale

Co-Authored-By: ruflo <ruv@ruv.net>

* feat(8f-followup): replace setViewportLevel throw with warn + no-op (4.4)

l3 without focalStepId now emits console.warn and returns the viewport
unchanged instead of throwing. fitToContent guards the same path.
Updated test asserts warn was called and state did not change.

Co-Authored-By: ruflo <ruv@ruv.net>

* refactor(8f-followup): co-locate level math constants in core/canvas/viewport (4.7)

Move FIT_TO_CONTENT_ZOOM_BY_LEVEL from canvasViewportStore into
@variscout/core/canvas/viewport.ts and re-export it through the barrel.
Add LOD_SNAP_BOUNDARIES (L2_OVERVIEW_LOW=0.5, L2_DETAIL_HIGH=1.8) for
the upcoming snap-to-LOD feature. Single source of truth for level math.

Co-Authored-By: ruflo <ruv@ruv.net>

* feat(8f-followup): enforce 6px click-vs-drag deadband via clickDistance(6) (4.3)

Adds .clickDistance(6) to the d3-zoom behavior in useCanvasViewportInput.
Pointer moves ≤5px are treated as clicks; ≥6px as drags. Matches spec §6.3.

Co-Authored-By: ruflo <ruv@ruv.net>

* chore(8f-followup): delete dead worldToWallSvg + document CanvasViewport (4.5/4.6)

worldToWallSvg was an identity function with no callers outside its own test;
deleted function and test. CanvasViewport is used in Canvas/index.tsx — added
JSDoc comment explaining its role so the seam is documented.

Co-Authored-By: ruflo <ruv@ruv.net>

* feat(8f-followup): snap-to-LOD on wheel-stop via d3-zoom end handler (4.2)

Adds a 'end' listener to the zoom behavior. When the user releases the wheel
with zoom in [0.3, 0.5) or [1.8, 2.0), the viewport eases back to 0.5 or 1.8
respectively over 150ms. Exports snapTarget() for unit testing. LOD_SNAP_BOUNDARIES
lives in @variscout/core/canvas/viewport alongside LOD_THRESHOLDS.

Co-Authored-By: ruflo <ruv@ruv.net>

* feat(8f-followup): real LOD cross-fade + d3-transition snap (4.1/4.2 final)

LODSwitcher now renders both outgoing and incoming renderers in stacked
absolute divs during a 150ms window, then unmounts the outgoing. Uses
useState+useEffect+setTimeout — no external animation library needed.

useCanvasViewportInput snap-to-LOD uses d3-transition via
selection.transition().duration(150).call(zoomBehavior.transform, ...).
Adds d3-transition + @types/d3-transition to @variscout/hooks deps.

Tests: 4 LODSwitcher tests assert dual-render during transition and
single-render after 150ms via fake timers.

Co-Authored-By: ruflo <ruv@ruv.net>

* feat(8f-followup): per-Hub canvas viewport blob helpers in blobClient

Closes 8f followup HIGH #1 part 1/2 — adds loadBlobCanvasViewport +
saveBlobCanvasViewport mirroring the updateBlobEvidenceSnapshots
ETag-conditional pattern. Per ADR-081 §2 (Azure = IndexedDB + Blob sync
with ETag per ADR-079) and ADR-079.

Also adds getLocalViewportUpdatedAt to @variscout/stores so the Azure
lifecycle hook can compare timestamps without reading Dexie directly.

Co-Authored-By: ruflo <ruv@ruv.net>

* feat(8f-followup): wire Azure canvas viewport lifecycle to Blob sync

Closes 8f followup HIGH #1 part 2/2 — useCanvasViewportLifecycle (Azure)
now rehydrates from Blob after Dexie cache, debounced-persists to both
Dexie and Blob with ETag, and treats precondition-failed as last-write-
wins per spec §11 with App Insights telemetry on the conflict path.

Co-Authored-By: ruflo <ruv@ruv.net>

* feat(8f-followup): expose 4 remaining response-path CTAs at L3 column granularity

Closes 8f followup MEDIUM #9 — LocalMechanismView previously only
exposed Quick Action. Spec §5.3.a lists 5 CTAs at column-mechanism
granularity (Quick Action / Focused Investigation / IP / Sustainment /
Handoff). Threaded the 4 step-level callbacks already on CanvasProps
through to LocalMechanismView; per-column button row added with new
i18n keys (8 new MessageCatalog keys across 32 locale files). Parent
callbacks are step-only; column is visible only within the card row.

Co-Authored-By: ruflo <ruv@ruv.net>

* feat(8f-followup): mobile L3 without focalStepId navigates to step-list

Closes 8f followup MEDIUM #10 — MobileLevelPicker previously called
setLevel('l2') before setZoom(2.5) as an explicit l2 redirect comment
implied. The final committed state was already l3 (setZoom(2.5) fires
inferLevel→l3), but the intent was undocumented. Updated comment to
clarify the atomicity: both calls run synchronously before React
re-renders, so the final state is l3 with no focalStepId, and canvas
renders NoFocalStepPrompt (the step-list surface) per spec §7.

Co-Authored-By: ruflo <ruv@ruv.net>

* perf(8f-followup): selector-scope canvasViewport subscribe in d3-zoom hook

Closes 8f followup MEDIUM #11 — useCanvasViewportInput previously
subscribed to the whole canvasViewportStore; every unrelated mutation
(setRailOpen, setViewMode, openChartCluster, etc.) fired
syncElementToStoreViewport (which has its own diff-check guard, but
still did needless work). Now tracks prevViewportRef and short-circuits
on reference equality of state.viewports[hubId] — sync is skipped
entirely when the hub's viewport slice hasn't changed. Test added:
setRailOpen → d3 element __zoom unchanged.

Co-Authored-By: ruflo <ruv@ruv.net>

* chore(8f-followup): rename canvasViewport STORE_LAYER to annotation-per-hub

Closes 8f followup LOW #15 — canvasViewportStore state is keyed by hubId
not projectId since the 8f shape change. The annotation-per-project
label was technically truthful (per-project umbrella, hub-keyed inside)
but invited confusion. Renamed to annotation-per-hub; layerBoundary
test + packages/stores/CLAUDE.md table updated. 'annotation-per-project'
is now in the reserved/unused set; 'annotation-per-hub' is live.

Co-Authored-By: ruflo <ruv@ruv.net>

* docs(8f-followup): mark 19 of 20 findings RESOLVED on followup branch

---------

Co-authored-by: ruflo <ruv@ruv.net>
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.

2 participants