feat(wedge): PR-WV1-4 — canvas response paths 5→3 + handoff retirement#187
Merged
Conversation
…implify open-sustainment action
…production Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Drop sustainment/handoff handlers, signals prop, prerequisite-locked branch, and PREREQUISITE_TOOLTIP_KEY from CanvasStepOverlay. Component now passes (path, hasHandler) to computeCtaState with no signals dependency. useTranslation removed as no longer referenced.
…iring Removes the `onSustainment` and `onHandoff` prop chain from the Canvas component tree (CanvasProps → CanvasWorkspace → CanvasLevelRouter → LocalMechanismView) and from both FrameView consumer apps. The sustainment and handoff panels remain reachable via other entry points (response-path prompts, action-item navigation, URL-driven handoff in Editor). Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… to Sustainment Wedge V1 folds Handoff into Sustainment. Deletes all Handoff UI components and wires all showHandoff() call sites to route to Sustainment instead. - Delete HandoffForm.tsx (281 LoC), its test, its barrel index.ts - Delete HandoffPanel.tsx in both azure (297 LoC) and pwa (297 LoC) - Remove HandoffForm export from @variscout/ui barrel - Drop 'control-handoff' from RESPONSE_LABELS in ProcessHubCurrentStatePanel - Redirect showHandoff() → showSustainment() in both panelStores - Remove HandoffPanel lazy import + render block from pwa App.tsx - Remove HandoffPanel import + render block + navigationHandoffTargetId state from azure Editor.tsx; remove handoff-specific useEffects + prop - Remove pendingHandoffTargetId state from azure App.tsx; clean prop chain - Strip handoffTargetId param from Dashboard.onOpenProject signature + handleRecordHandoff; remove PENDING_HANDOFF_TARGET_KEY constant - Drop surface=handoff URL variant from processHubRoutes.ts - Remove 'handoff' from usePanelsPersistence STUB_VIEWS - Update panelsStore tests to assert sustainment redirect - Update processHubRoutes tests to drop surface=handoff assertions + snapshot showHandoff() is kept as a named alias on both stores (routes to sustainment) so Inbox/context-link call sites remain intact without requiring simultaneous FrameView changes. handoffTargetId state field + 'handoff' in activeView union are dead values until Task 7 cleanup. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…n + retire handoffTargetId dead state - Remove 'control-handoff-missing' from ProcessHubAttentionReason union (processHub.ts) - Retire selectControlHandoffCandidates logic — returns [] per ADR-082 handoff-folds-into-sustainment (sustainment.ts) - Drop selectControlHandoffCandidates describe block from sustainment.test.ts (2 tests) - Drop 'includes controlled investigations missing a ControlHandoff' test from processHub.test.ts (1 test) - Remove handoffTargetId field + initial state from both panelsStore files (azure + pwa) - Remove 'handoff' from activeView union in both panelsStore files + initFromViewState param type (azure) - Remove handoffTargetId selector read, return-shape entry, and UseAppPanelsReturn type member from useAppPanels.ts - Persona-routing grep: empty (no usePersonaStore / PersonaRouter / *HomeShell references)
…idates Deletes the stub selectControlHandoffCandidates (always returned []) and removes the dead "Control handoff" UI bucket from ProcessHubSustainmentRegion. Propagates onRecordHandoff prop removal up through CadenceQueues → ReviewPanel → ProcessHubView → Dashboard; drops handleRecordHandoff callback and its orphaned usePanelsStore import. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…llowup)
Task 4 removed `signals` from `CanvasStepOverlayProps` but the parent
chain (CanvasWorkspace → Canvas → CanvasStepOverlay) still passed
`signals={signals}` through without consuming it, causing TS2322.
Remove the entire chain:
- Drop `signals: WorkflowReadinessSignals` from CanvasProps + CanvasWorkspaceProps
- Drop `signals` useMemo + JSX prop from both FrameView files
- Remove `hasCompletedInterventionEvidence` helper (only used by signals useMemo)
- Remove unused imports: WorkflowReadinessSignals, ImprovementProject
- Update Canvas/CanvasWorkspace tests: remove SIGNALS const + all usages
- Update FrameView tests: remove WorkflowReadinessSignals import, signals type
in mock, signals prop assertions; retain contextLinkGroups assertion
WorkflowReadinessSignals + isSustainmentReady remain in @variscout/core
(sustainmentConfirmed still used in IPDetail/stageState.ts, isCharterReady
is a live export). Only the Canvas passthrough chain is dead.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…anel test Task 1 simplified ResponsePathAction's open-sustainment variant to drop the surface discriminator. The ProcessHubCurrentStatePanel test still constructed the action with the old surface: 'review' field, breaking tsc. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Removes full-lifecycle.spec.ts entirely — its only test drove the deleted HandoffPanel UX (Record control handoff → System name / Reaction plan / Acknowledge handoff / Mark operational); no Sustainment equivalent exists so rewriting would produce a fake test, and the seedLifecycleHub helper had no remaining callers. Logs the surviving survey/handoff.ts rule layer in docs/investigations.md as a deferred cleanup item per Opus PR #187 review.
This was referenced May 17, 2026
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
Retires the canvas drill menu's Handoff response path end-to-end and reduces the canvas drill CTAs from 5 to 3 (Quick action / Focused investigation / Improvement Project). Handoff is folded into Sustainment-closure per wedge spec §10 and ADR-082 (already shipped at the IP-stage level via PR-WV1-2).
Material scope correction vs the master sequencer:
usePersonaStore,personaRouter,*HomeShell.tsx, orpersonaRoleinpackages//apps/. Persona was design-only; code never shipped post-wedge-pivot.'control-handoff'.HandoffForm(281 LoC) +HandoffPanel× 2 (297 LoC each) + a wholeonRecordHandoffprop chain through 4 component layers + the Sustainment-region "Control handoff" bucket all retired.'control-handoff-missing'was runtime-computed (not stored), so no.vrsmigration was required (partial-integration policy declared upfront in Task 7).What changed
Core (
@variscout/core):ProcessStateResponsePath: drop'control-handoff'(7 values → 6)ResponsePathAction.open-sustainment: dropsurface: 'review' | 'handoff'discriminator (no longer meaningful)deriveResponsePathAction: drop the case + simplifyisHandoffReady/selectControlHandoffCandidates/ control-handoff push block inbuildCurrentProcessState: all deletedSustainmentReviewReason: drop'control-handoff-missing'(4 values remain)index.ts+processHub.tsUI (
@variscout/ui):ResponsePathKind: 5 values → 3 (quick-action | focused-investigation | charter)ResponsePathCtaState: drop'prerequisite-locked'variant (all 3 surviving paths are always-available)computeCtaState: dropsignalsparam; use canonicalassertNeverfrom@variscout/core/typesCanvasStepOverlay: dropsignals+onSustainment+onHandoffprops; dropPREREQUISITE_TOOLTIP_KEY; dropuseTranslation(no longer needed); render exactly 3 CTAsCanvas+CanvasWorkspace: drop deadsignals/onSustainment/onHandoffpassthrough chainLocalMechanismView: drop sustainment/handoff buttons +ColumnMiniChartprop cleanupProcessHubSustainmentRegion: drophandoffCandidatesbucket +onRecordHandoffprop chain (cascades toProcessHubCadenceQueues,ProcessHubReviewPanel,ProcessHubView,Dashboard)ProcessHubCurrentStatePanel: drop'control-handoff': 'Control handoff'label entryHandoff/HandoffForm.tsx(281 LoC) + tests + barrelApps:
apps/azure/src/components/handoff/HandoffPanel.tsx(297 LoC) — deletedapps/pwa/src/components/HandoffPanel.tsx(297 LoC) — deletedpanelsStore.showHandoff→ aliased toshowSustainmentin both apps (keeps Inbox-prompt / context-link routing reachable; documented with inline comment)Editor.tsx, bothApp.tsxfiles,Dashboard.tsx,processHubRoutes.ts,usePanelsPersistence.ts: HandoffPanel state + URL surface=handoff + render paths all retireduseAppPanels.ts:handoffTargetIdselector + return-shape member droppedFrameView.tsxfiles:handleSustainment/handleHandoffcallbacks deleted;signalsuseMemo deleted;WorkflowReadinessSignalsimport droppedPreserved invariants
'sustain'via co-located reducer dispatch (independent of the deleted Canvas-CTA path).surface === 'handoff'and context-link callers still route to the Sustainment panel via theshowHandoffalias.'handoff'as a surface type onControlHandoffrecords — that's a legitimate domain field on stored records, unrelated to the deprecated navigation surface.Plan
Sub-plan:
docs/superpowers/plans/2026-05-16-pr-wv1-4-canvas-paths-persona-deletion.mdMaster sequencer:
docs/superpowers/plans/2026-05-16-wedge-implementation.md8 implementation tasks + 1 cascading fix (dead
signalsprop chain caught bypnpm build) + 1 test-fixup (stalesurface: 'review'). 11 commits total, net -1626 lines across ~50 files.Test plan
pnpm test(turbo) green —@variscout/core3447 pass,@variscout/uibuild clean,@variscout/pwa366 pass,@variscout/azure-app1329 passpnpm build(turbo) greenbash scripts/pr-ready-check.shgreenclaude --chrome: canvas drill = 3 CTAs; Sustainment auto-fires; Inbox routes handoff prompts to Sustainment panelWedge progress
🤖 Generated with Claude Code