Skip to content

chore(deps): bump lucide-react from 0.475.0 to 0.577.0#5

Closed
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/npm_and_yarn/lucide-react-0.577.0
Closed

chore(deps): bump lucide-react from 0.475.0 to 0.577.0#5
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/npm_and_yarn/lucide-react-0.577.0

Conversation

@dependabot
Copy link
Copy Markdown
Contributor

@dependabot dependabot Bot commented on behalf of github Mar 14, 2026

Bumps lucide-react from 0.475.0 to 0.577.0.

Release notes

Sourced from lucide-react's releases.

Version 0.577.0

What's Changed

New Contributors

Full Changelog: lucide-icons/lucide@0.576.0...0.577.0

Version 0.576.0

What's Changed

Full Changelog: lucide-icons/lucide@0.575.0...0.576.0

Version 0.575.0

What's Changed

New Contributors

Full Changelog: lucide-icons/lucide@0.573.0...0.575.0

Version 0.574.0

What's Changed

New Contributors

... (truncated)

Commits
  • f6c0d06 chore(deps): bump rollup from 4.53.3 to 4.59.0 (#4106)
  • 67c0485 feat(scripts): added helper script to automatically update OpenCollective bac...
  • b6ed43d feat(packages): Added aria-hidden fallback for decorative icons to all packag...
  • 076e0bb chore(dependencies): Update dependencies (#3809)
  • 80d6f73 fix(icons): Rename fingerprint icon to fingerprint-pattern (#3767)
  • 1cfb3ff chore(deps-dev): bump vite from 6.3.5 to 6.3.6 (#3611)
  • e71198d chore: icon alias improvements (#2861)
  • 3e644fd chore(scripts): Refactor scripts to typescript (#3316)
  • 19fa01b build(deps-dev): bump vite from 6.3.2 to 6.3.4 (#3181)
  • 03eb862 use implicit return in react package (#2325)
  • Additional commits viewable in compare view
Maintainer changes

This version was pushed to npm by [GitHub Actions](https://www.npmjs.com/~GitHub Actions), a new releaser for lucide-react since your current version.


Dependabot compatibility score

Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


Dependabot commands and options

You can trigger Dependabot actions by commenting on this PR:

  • @dependabot rebase will rebase this PR
  • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
  • @dependabot show <dependency name> ignore conditions will show all of the ignore conditions of the specified dependency
  • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
  • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)

@dependabot dependabot Bot added dependencies Pull requests that update a dependency file javascript Pull requests that update javascript code labels Mar 14, 2026
@vercel
Copy link
Copy Markdown

vercel Bot commented Mar 14, 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 0:51am
variscout_website Ready Ready Preview, Comment Mar 20, 2026 0:51am

@dependabot dependabot Bot force-pushed the dependabot/npm_and_yarn/lucide-react-0.577.0 branch from a93d9e9 to adee592 Compare March 14, 2026 07:29
@dependabot dependabot Bot force-pushed the dependabot/npm_and_yarn/lucide-react-0.577.0 branch from adee592 to 5ff2b9f Compare March 17, 2026 17:19
jukka-matti added a commit that referenced this pull request Mar 19, 2026
Update adr-021-security-evaluation.md:
  - Key Vault and managed identity gaps marked RESOLVED (e56298d)
  - Risk matrix #5: LOW/AMBER -> GREEN/GREEN

Update traceability.md:
  - Module map: ai/promptTemplates -> ai/prompts/*

Update ai-data-flow.md:
  - Mermaid diagram: promptTemplates -> prompts/* modules

Update adr-025-internationalization.md:
  - File reference -> prompts/ with note about split modules

Update ai-integration-evaluation.md:
  - Added [NOTE] explaining post-evaluation refactor
  - P0-1 and P1-1 file references updated to new module paths

Update architecture.md:
  - Added ai/prompts/ and ai/ to core module table
  - Added channelType to Teams context detection table
@dependabot dependabot Bot force-pushed the dependabot/npm_and_yarn/lucide-react-0.577.0 branch from 5ff2b9f to b2e7c99 Compare March 19, 2026 20:27
Bumps [lucide-react](https://github.com/lucide-icons/lucide/tree/HEAD/packages/lucide-react) from 0.475.0 to 0.577.0.
- [Release notes](https://github.com/lucide-icons/lucide/releases)
- [Commits](https://github.com/lucide-icons/lucide/commits/0.577.0/packages/lucide-react)

---
updated-dependencies:
- dependency-name: lucide-react
  dependency-version: 0.577.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
@jukka-matti
Copy link
Copy Markdown
Owner

Applied this update directly on main in a consolidated dependency bump commit (all 13 Dependabot updates at once). Closing this PR.

@dependabot @github
Copy link
Copy Markdown
Contributor Author

dependabot Bot commented on behalf of github Mar 20, 2026

OK, I won't notify you again about this release, but will get in touch when a new version is available. If you'd rather skip all updates until the next major or minor version, let me know by commenting @dependabot ignore this major version or @dependabot ignore this minor version. You can also ignore all major, minor, or patch releases for a dependency by adding an ignore condition with the desired update_types to your config file.

If you change your mind, just re-open this PR and I'll resolve any conflicts on it.

@dependabot dependabot Bot deleted the dependabot/npm_and_yarn/lucide-react-0.577.0 branch March 20, 2026 12:56
jukka-matti added a commit that referenced this pull request Apr 18, 2026
…aching panel

First concrete deliverable from the FRAME umbrella (ADR-070). Fixes the
silent-empty-chart bug on every seeded sample, replaces Minitab-mimicking
toggle labels with story-matching ones, and adds a static coaching panel
that surfaces the existing CoScout capability-mode knowledge in the UI
without requiring an AI call.

Changes:
- Seed subgroupConfig: { method: 'fixed-size', size: 5 } on 15 seeded samples
  (coffee, injection, cookie-weight, investigation-showcase, mango-export,
  journey + journeyBefore + journeyAfter, textiles, avocado, sock-mystery,
  hospital-ward, pizza, delivery, packaging, weld-defects, call-wait).
  Previously only syringe-barrel-weight seeded this; the capability chart
  now renders non-empty on load for any capability-eligible sample.
- Rename CapabilityMetricToggle labels from "Values" / "Capability" to
  "Measurements" / "Cpk stability" to match the ADR-038 story (Cpk plotted
  as a control chart across subgroups). Update the disabled-state tooltip
  to match.
- New CapabilityCoachingPanel component (packages/ui/src/components/
  CapabilityCoachingPanel/) — static educational content explaining the
  two capability numbers, centering-vs-spread diagnostics, and why
  rational subgroups matter. Content distilled from
  packages/core/src/ai/prompts/coScout/modes/capability.ts:54-81.
  Pure presentational, no AI call required; safe in all tiers including
  PWA free. Dashboard integration is deferred to PR #5 (capability-leg
  wiring + end-to-end verification) per the FRAME plan.

Tests: 1164 ui tests pass (adds 6 for CapabilityCoachingPanel).
pr-ready-check.sh green (tests + lint + docs:check).

Stacked on feat/syringe-barrel-demo (PR #65) since that PR added the
subgroupConfig?/displayOptions?/separateParetoData? fields to SampleConfig.
When PR #65 merges to main, this branch rebases cleanly.

Plan: /Users/.../plans/i-was-interviewing-greg-dynamic-umbrella.md
Spec: docs/superpowers/specs/2026-04-18-frame-process-map-design.md
ADR:  docs/07-decisions/adr-070-frame-workspace.md

Co-Authored-By: ruflo <ruv@ruv.net>
jukka-matti added a commit that referenced this pull request Apr 18, 2026
Third deliverable from the FRAME umbrella (ADR-070). Adds the interactive
component the FRAME workspace will render, consuming the core primitives
from PR #70. No app integration in this PR — FrameView + nav tab insertion
land in PR #5 alongside capability-leg wiring and end-to-end verification.

Changes:
- packages/ui/src/components/ProcessMap/ProcessMapBase.tsx — the interactive
  component. Renders three regions on one canvas:

    • left→right spine of process-step cards (SIPOC / temporal)
    • tributaries (little xs) as checkbox rows on each step, with the
      checkbox doubling as the rational-subgroup-axis toggle
    • an ocean card at the right carrying the CTS (customer-felt outcome)
      dropdown + target / LSL / USL inputs

  Plus a hunches panel (pin to step or tributary, promoted to SuspectedCause
  hubs later in the investigation workspace) and a gap strip at the bottom
  rendering the global gaps from detectGaps(). Step-scoped gaps render
  inline next to the affected step card.

  V1 interactions are deliberately structured (buttons, dropdowns, inline
  inputs) — not a freeform drag-and-drop canvas. That comes in V2+ per
  ADR-070.

  Props-based. Parent owns state; the component is a thin controller over
  the existing ProcessMap type. data-testid on every interactive surface
  for RTL + future E2E selectors.

- packages/ui/src/components/ProcessMap/__tests__/ProcessMapBase.test.tsx —
  21 tests covering step CRUD (add / rename / remove with order re-packing
  and orphan cleanup of tributaries + hunches), tributary CRUD + subgroup-
  axis toggling (both directions), CTS + specs wiring, hunch add/remove
  with pinning, gap rendering (global gap strip + step-scoped inline),
  and disabled mode hiding destructive controls.

- packages/ui/src/index.ts — export ProcessMapBase + type.

Tests: 1179 ui tests pass (+21 from this PR). Lint clean (0 errors;
15 pre-existing warnings unchanged). packages/hooks/src/__tests__/
index.test.ts flaked under turbo's concurrent run (known issue per
MEMORY.md — passes when run alone).

Stacked on feat/frame-data-model (PR #70) — imports ProcessMap, Gap,
ProcessMapTributary, ProcessMapHunch from @variscout/core/frame.

Plan: .claude/plans/i-was-interviewing-greg-dynamic-umbrella.md
Spec: docs/superpowers/specs/2026-04-18-frame-process-map-design.md
ADR:  docs/07-decisions/adr-070-frame-workspace.md

Co-Authored-By: ruflo <ruv@ruv.net>
jukka-matti added a commit that referenced this pull request Apr 18, 2026
Third deliverable from the FRAME umbrella (ADR-070). Adds the interactive
component the FRAME workspace will render, consuming the core primitives
from PR #70. No app integration in this PR — FrameView + nav tab insertion
land in PR #5 alongside capability-leg wiring and end-to-end verification.

Changes:
- packages/ui/src/components/ProcessMap/ProcessMapBase.tsx — the interactive
  component. Renders three regions on one canvas:

    • left→right spine of process-step cards (SIPOC / temporal)
    • tributaries (little xs) as checkbox rows on each step, with the
      checkbox doubling as the rational-subgroup-axis toggle
    • an ocean card at the right carrying the CTS (customer-felt outcome)
      dropdown + target / LSL / USL inputs

  Plus a hunches panel (pin to step or tributary, promoted to SuspectedCause
  hubs later in the investigation workspace) and a gap strip at the bottom
  rendering the global gaps from detectGaps(). Step-scoped gaps render
  inline next to the affected step card.

  V1 interactions are deliberately structured (buttons, dropdowns, inline
  inputs) — not a freeform drag-and-drop canvas. That comes in V2+ per
  ADR-070.

  Props-based. Parent owns state; the component is a thin controller over
  the existing ProcessMap type. data-testid on every interactive surface
  for RTL + future E2E selectors.

- packages/ui/src/components/ProcessMap/__tests__/ProcessMapBase.test.tsx —
  21 tests covering step CRUD (add / rename / remove with order re-packing
  and orphan cleanup of tributaries + hunches), tributary CRUD + subgroup-
  axis toggling (both directions), CTS + specs wiring, hunch add/remove
  with pinning, gap rendering (global gap strip + step-scoped inline),
  and disabled mode hiding destructive controls.

- packages/ui/src/index.ts — export ProcessMapBase + type.

Tests: 1179 ui tests pass (+21 from this PR). Lint clean (0 errors;
15 pre-existing warnings unchanged). packages/hooks/src/__tests__/
index.test.ts flaked under turbo's concurrent run (known issue per
MEMORY.md — passes when run alone).

Stacked on feat/frame-data-model (PR #70) — imports ProcessMap, Gap,
ProcessMapTributary, ProcessMapHunch from @variscout/core/frame.

Plan: .claude/plans/i-was-interviewing-greg-dynamic-umbrella.md
Spec: docs/superpowers/specs/2026-04-18-frame-process-map-design.md
ADR:  docs/07-decisions/adr-070-frame-workspace.md

Co-Authored-By: ruflo <ruv@ruv.net>
jukka-matti added a commit that referenced this pull request Apr 18, 2026
…nt (#71)

Third deliverable from the FRAME umbrella (ADR-070). Adds the interactive
component the FRAME workspace will render, consuming the core primitives
from PR #70. No app integration in this PR — FrameView + nav tab insertion
land in PR #5 alongside capability-leg wiring and end-to-end verification.

Changes:
- packages/ui/src/components/ProcessMap/ProcessMapBase.tsx — the interactive
  component. Renders three regions on one canvas:

    • left→right spine of process-step cards (SIPOC / temporal)
    • tributaries (little xs) as checkbox rows on each step, with the
      checkbox doubling as the rational-subgroup-axis toggle
    • an ocean card at the right carrying the CTS (customer-felt outcome)
      dropdown + target / LSL / USL inputs

  Plus a hunches panel (pin to step or tributary, promoted to SuspectedCause
  hubs later in the investigation workspace) and a gap strip at the bottom
  rendering the global gaps from detectGaps(). Step-scoped gaps render
  inline next to the affected step card.

  V1 interactions are deliberately structured (buttons, dropdowns, inline
  inputs) — not a freeform drag-and-drop canvas. That comes in V2+ per
  ADR-070.

  Props-based. Parent owns state; the component is a thin controller over
  the existing ProcessMap type. data-testid on every interactive surface
  for RTL + future E2E selectors.

- packages/ui/src/components/ProcessMap/__tests__/ProcessMapBase.test.tsx —
  21 tests covering step CRUD (add / rename / remove with order re-packing
  and orphan cleanup of tributaries + hunches), tributary CRUD + subgroup-
  axis toggling (both directions), CTS + specs wiring, hunch add/remove
  with pinning, gap rendering (global gap strip + step-scoped inline),
  and disabled mode hiding destructive controls.

- packages/ui/src/index.ts — export ProcessMapBase + type.

Tests: 1179 ui tests pass (+21 from this PR). Lint clean (0 errors;
15 pre-existing warnings unchanged). packages/hooks/src/__tests__/
index.test.ts flaked under turbo's concurrent run (known issue per
MEMORY.md — passes when run alone).

Stacked on feat/frame-data-model (PR #70) — imports ProcessMap, Gap,
ProcessMapTributary, ProcessMapHunch from @variscout/core/frame.

Plan: .claude/plans/i-was-interviewing-greg-dynamic-umbrella.md
Spec: docs/superpowers/specs/2026-04-18-frame-process-map-design.md
ADR:  docs/07-decisions/adr-070-frame-workspace.md

Co-authored-by: ruflo <ruv@ruv.net>
jukka-matti added a commit that referenced this pull request Apr 18, 2026
…aching panel

First concrete deliverable from the FRAME umbrella (ADR-070). Fixes the
silent-empty-chart bug on every seeded sample, replaces Minitab-mimicking
toggle labels with story-matching ones, and adds a static coaching panel
that surfaces the existing CoScout capability-mode knowledge in the UI
without requiring an AI call.

Changes:
- Seed subgroupConfig: { method: 'fixed-size', size: 5 } on 15 seeded samples
  (coffee, injection, cookie-weight, investigation-showcase, mango-export,
  journey + journeyBefore + journeyAfter, textiles, avocado, sock-mystery,
  hospital-ward, pizza, delivery, packaging, weld-defects, call-wait).
  Previously only syringe-barrel-weight seeded this; the capability chart
  now renders non-empty on load for any capability-eligible sample.
- Rename CapabilityMetricToggle labels from "Values" / "Capability" to
  "Measurements" / "Cpk stability" to match the ADR-038 story (Cpk plotted
  as a control chart across subgroups). Update the disabled-state tooltip
  to match.
- New CapabilityCoachingPanel component (packages/ui/src/components/
  CapabilityCoachingPanel/) — static educational content explaining the
  two capability numbers, centering-vs-spread diagnostics, and why
  rational subgroups matter. Content distilled from
  packages/core/src/ai/prompts/coScout/modes/capability.ts:54-81.
  Pure presentational, no AI call required; safe in all tiers including
  PWA free. Dashboard integration is deferred to PR #5 (capability-leg
  wiring + end-to-end verification) per the FRAME plan.

Tests: 1164 ui tests pass (adds 6 for CapabilityCoachingPanel).
pr-ready-check.sh green (tests + lint + docs:check).

Stacked on feat/syringe-barrel-demo (PR #65) since that PR added the
subgroupConfig?/displayOptions?/separateParetoData? fields to SampleConfig.
When PR #65 merges to main, this branch rebases cleanly.

Plan: /Users/.../plans/i-was-interviewing-greg-dynamic-umbrella.md
Spec: docs/superpowers/specs/2026-04-18-frame-process-map-design.md
ADR:  docs/07-decisions/adr-070-frame-workspace.md

Co-Authored-By: ruflo <ruv@ruv.net>
jukka-matti added a commit that referenced this pull request Apr 18, 2026
…aching panel (#69)

First concrete deliverable from the FRAME umbrella (ADR-070). Fixes the
silent-empty-chart bug on every seeded sample, replaces Minitab-mimicking
toggle labels with story-matching ones, and adds a static coaching panel
that surfaces the existing CoScout capability-mode knowledge in the UI
without requiring an AI call.

Changes:
- Seed subgroupConfig: { method: 'fixed-size', size: 5 } on 15 seeded samples
  (coffee, injection, cookie-weight, investigation-showcase, mango-export,
  journey + journeyBefore + journeyAfter, textiles, avocado, sock-mystery,
  hospital-ward, pizza, delivery, packaging, weld-defects, call-wait).
  Previously only syringe-barrel-weight seeded this; the capability chart
  now renders non-empty on load for any capability-eligible sample.
- Rename CapabilityMetricToggle labels from "Values" / "Capability" to
  "Measurements" / "Cpk stability" to match the ADR-038 story (Cpk plotted
  as a control chart across subgroups). Update the disabled-state tooltip
  to match.
- New CapabilityCoachingPanel component (packages/ui/src/components/
  CapabilityCoachingPanel/) — static educational content explaining the
  two capability numbers, centering-vs-spread diagnostics, and why
  rational subgroups matter. Content distilled from
  packages/core/src/ai/prompts/coScout/modes/capability.ts:54-81.
  Pure presentational, no AI call required; safe in all tiers including
  PWA free. Dashboard integration is deferred to PR #5 (capability-leg
  wiring + end-to-end verification) per the FRAME plan.

Tests: 1164 ui tests pass (adds 6 for CapabilityCoachingPanel).
pr-ready-check.sh green (tests + lint + docs:check).

Stacked on feat/syringe-barrel-demo (PR #65) since that PR added the
subgroupConfig?/displayOptions?/separateParetoData? fields to SampleConfig.
When PR #65 merges to main, this branch rebases cleanly.

Plan: /Users/.../plans/i-was-interviewing-greg-dynamic-umbrella.md
Spec: docs/superpowers/specs/2026-04-18-frame-process-map-design.md
ADR:  docs/07-decisions/adr-070-frame-workspace.md

Co-authored-by: ruflo <ruv@ruv.net>
jukka-matti added a commit that referenced this pull request Apr 27, 2026
F-6 closes the Phase 6 acceptance gate. All 8 acceptance criteria covered:

- AC #1 visually confirmed in chrome — flipping investigation status to
  `resolved` renders the "Set up sustainment cadence" prompt in the editor
  (Coffee Moisture sample, vite at :5173).
- AC #1-#5 functionally covered by 78 component/page/service tests
  (SustainmentEditors, ProcessHubSustainmentRegion, ProcessHubFormat.sustainment,
  Dashboard.processHub, Editor.sustainment, blobClient).
- AC #5 also covered by 39 core sustainment tests (selectSustainmentBuckets +
  path constructors).
- AC #6 vacuously satisfied — no sustainment fields wired into AI context
  builders yet (consistent with spec open-question #4 deferring CoScout
  proactivity). No PII surface.
- AC #7 covered by 14 schema.v6 + sustainmentStorage migration tests.
- AC #8 confirmed: process-hubs/{hubId}/sustainment/... path constructors at
  packages/core/src/sustainment.ts:307-343, consumed by
  apps/azure/src/services/blobClient.ts:444-470.

Total deterministic verification: 153 tests across @variscout/core,
@variscout/azure-app components/pages/services. All green.

Index reconciliation in docs/superpowers/specs/index.md is intentionally
deferred — the file already carries unstaged operating-model workstream
edits that the user wants kept on a separate branch.

Deferred to a follow-up interactive walk (file as F-8 if regressions
surface): full Flow A configuration, Flow B-D execution (verdict logging,
drifting+escalate, handoff record), bucket-split visual rendering colors,
mobile/dark/fi locale spot checks, duplicate-render quirk visual
confirmation. Functional contract for all of these is covered by the 78
Phase 6 component/page tests.

Co-Authored-By: ruflo <ruv@ruv.net>
jukka-matti added a commit that referenced this pull request Apr 27, 2026
Sequenced TDD plan for Phase 2 V2 closure:
- PR #4: response-path routing (ResponsePathAction in core, actionToHref
  in azure, panel refactor with required actions contract, Dashboard
  wiring + telemetry)
- PR #5: evidence chip from findingCounts (linkFindingsToStateItems pure
  aggregator, chip render in panel, Azure consumer wires resolver +
  chip click)

Documents two pragmatic divergences from spec:
1. linkFindingsToStateItems takes findingsByInvestigationId Map (not
   flat Finding[]) since Finding has no direct investigationId field
2. EvidenceSheet full-list rendering deferred (Dashboard doesn't load
   findings hub-wide today); chip click navigates instead

Spec amended with implementation-plan back-link.

Co-Authored-By: ruflo <ruv@ruv.net>
jukka-matti added a commit that referenced this pull request Apr 27, 2026
* feat(core): add ResponsePathAction discriminated union + deriveResponsePathAction

Pure mapping from a state item's response-path to a domain action.
Exhaustive on ProcessStateResponsePath. Returns 'unsupported' for paths
with no current Azure surface (monitor → informational, MSA → planned).

Phase 2 V2 PR #4, Task 5.

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

* test(core): add compile-time exhaustiveness guard for deriveResponsePathAction

Adds a @ts-expect-error test that fails to compile if a future
ProcessStateResponsePath variant is added without a matching case
in deriveResponsePathAction.

Phase 2 V2 PR #4, code-review followup.

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

* feat(azure): add actionToHref URL adapter for ResponsePathAction

Thin Azure-side adapter mapping ResponsePathAction discriminated union
to URL strings. Single URL source — adding a new ResponsePathAction
variant in core triggers a TS build error here via the exhaustive
switch.

Phase 2 V2 PR #4, Task 7.

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

* refactor(azure): move processHubRoutes from routing/ to lib/

Honors apps/azure/CLAUDE.md FSD rule: 'Don't introduce new top-level
directories. Feature-Sliced Design: features/, hooks/, components/,
services/, auth/, db/, lib/.'

Phase 2 V2 PR #4, code-review followup.

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

* feat(azure): add safeTrackEvent wrapper for no-PII telemetry events

Try/catch'd facade over App Insights trackEvent. Silently swallows
failures so telemetry can never block UX. Caller is responsible for
ADR-059 no-PII compliance in the payload (enum values, opaque IDs,
integers only).

Phase 2 V2 PR #4, Task 8.

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

* refactor(ui): require actions + evidence contracts on ProcessHubCurrentStatePanel

Refactors panel to take 3 required props (state, actions, evidence)
instead of 1 (state). State-item cards become clickable affordances when
the action is supported; 'monitor' and 'measurement-system-work' paths
render as 'Informational' / 'Planned' pills with no click affordance.

evidence contract is unused in this PR (passes through stubbed); PR #5
wires the chip count + click.

Per feedback_no_backcompat_clean_architecture memory: required props
by default. The Azure consumer (ProcessHubReviewPanel) is refactored
in the next subagent task to pass these contracts.

Adds keyboard activation (Enter/Space), aria-label, and tooltip text
on planned/informational cards.

8 existing tests rewired + 6 new action-behavior tests = 14 tests.

Phase 2 V2 PR #4, Tasks 9-10.

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

* test(ui): add Space-key activation test + a11y TODO on title tooltip

Code-review followups for ProcessHubCurrentStatePanel:
- Add a Space-key keyboard activation test to mirror the Enter-key
  test (ARIA button convention).
- Document the title-attribute tooltip's accessibility limitation
  (touch unreachable, screen-reader unreliable per WCAG 1.3.3 / 4.1.2)
  as an inline TODO. Pill text already conveys the state visually;
  upgrade to a Tooltip primitive when the design system grows one.

Phase 2 V2 PR #4, code-review followup.

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

* feat(azure): wire ProcessHubReviewPanel + Dashboard to ProcessHubCurrentStatePanel actions

ProcessHubReviewPanel now passes the required actions + evidence contracts
to the panel. Adds defaultInvestigationId memo (most-recent investigation
heuristic) and actionFor closure that calls deriveResponsePathAction.

Dashboard wires handleResponsePathAction with safeTrackEvent telemetry
(hubId/responsePath/lens/severity — no PII per ADR-059) and routes via
the existing onOpenProject callback.

evidence contract is stubbed in this PR (passes empty findingsFor +
no-op onChipClick); PR #5 wires the chip count + click.

Phase 2 V2 PR #4, Tasks 11-12.

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

* fix(azure): pass real hubId to telemetry instead of investigation ID

ADR-059 forbids logging customer-meaningful identifiers. The previous
handler labeled an investigation ID as 'hubId' in the telemetry payload,
which is a real leak. Now ProcessHubReviewPanel passes rollup.hub.id
(an admin-assigned slug) explicitly to the Dashboard handler.

Also:
- Add safeTrackEvent to handleResponsePathAction useCallback deps
- Document the intentional empty-string defaultInvestigationId fallback

Phase 2 V2 PR #4, code-review followup.

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

* chore(core): commit assertNever helper that powers exhaustive switches

The assertNever function was added to types.ts and exported from
index.ts as part of the ResponsePathAction work, but the types.ts
change was inadvertently left uncommitted while the export and its
consumers landed across several commits. Local tests passed because
the working directory had it; CI would have failed with an unresolved
export.

Phase 2 V2 PR #4, missing-commit recovery.

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

---------

Co-authored-by: ruflo <ruv@ruv.net>
jukka-matti added a commit that referenced this pull request Apr 27, 2026
* feat(core): add linkFindingsToStateItems pure aggregator

Pure 2-input join: state items × findings (pre-grouped by investigation
ID). Caller provides a resolver implementing the per-item-type linkage
rules. Findings filtered to RELEVANT_FINDING_STATUSES (analyzed,
improving, resolved).

Phase 2 V2 PR #5, Tasks 1-3.

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

* test(core): replace Math.random with sequential counter in processEvidence tests

Per packages/core/CLAUDE.md hard rule: never Math.random in tests. The
finding-ID factory now uses a module-scoped sequential counter for
deterministic test fixtures.

Phase 2 V2 PR #5, code-review followup.

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

* feat(ui): add evidence chip to ProcessHubCurrentStatePanel state-item cards

Each state-item card now renders a small evidence chip in the lower-right
showing the count of linked findings (analyzed / improving / resolved).
Chip click fires evidence.onChipClick with the item + resolved findings;
event.stopPropagation prevents the card click from also firing.

Chip is independent of action support — Planned/Informational cards still
show evidence counts when present. Chip is omitted when findings is empty.

The evidence prop, previously stubbed in PR #4, is now wired through.
Azure consumer still passes a stub findingsFor (() => []), so the chip
won't render in the running app until the next subagent task wires
findingsFor to ProcessHubInvestigationMetadata.findingCounts.

5 new chip tests added (count display, singular/plural, empty omit,
click fires + stops propagation, renders on unsupported cards too).

Phase 2 V2 PR #5, Tasks 4-5.

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

* feat(azure): wire evidence chip to findingCounts in ProcessHubReviewPanel

Replaces the PR #4 stub evidence contract with a real wiring:

- findingsFor: derives chip count from
  ProcessHubInvestigationMetadata.findingCounts (relevant statuses
  analyzed + improving + resolved). Returns synthetic Finding-shaped
  placeholder objects (only id surface) — chip uses .length.
- onChipClick: emits 'process_hub.evidence_chip_click' App Insights
  event with no-PII payload (hubId, responsePath, lens, evidenceCount)
  and navigates to the most-recent linked investigation via the
  existing onOpenInvestigation callback.

Pragmatic divergence from spec: Dashboard doesn't load full Finding[]
objects today. The EvidenceSheet with finding labels is deferred to a
follow-up PR — see plan PR #5 future work.

Phase 2 V2 PR #5, Task 6.

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

* docs(azure): clarify ProcessHubReviewPanel evidence wiring shortcuts

Two reviewer-flagged comment additions:

1. The Finding[] cast in findingsFor is intentionally narrow — chip only
   reads .length. Adds a TODO referencing the follow-up EvidenceSheet PR
   that will introduce a Pick<Finding, 'id'> narrow type at the panel's
   evidence-contract boundary, removing the cast.

2. Documents the per-investigation item.investigationIds[0] navigation
   target — typically a single linked investigation, so most-recency is
   moot. Hub-aggregate items already fall back to the most-recent via
   defaultInvestigationId.

No code changes — comments only.

Phase 2 V2 PR #5, code-review followup.

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

---------

Co-authored-by: ruflo <ruv@ruv.net>
jukka-matti added a commit that referenced this pull request May 8, 2026
8-task TDD-shaped plan executing the spec at
docs/superpowers/specs/2026-05-07-canvas-hypothesis-arrow-drawing-design.md.

Tasks (bottom-up):
1. useHypothesisDrawTool state machine + endpoint resolver (hooks)
2. activeCanvasTool field + auto-enable hypotheses overlay (hooks)
3. HypothesisDrawToolButton chrome component (ui)
4. HypothesisDraftPopover form (ui, hand-rolled positioning)
5. StepNodeMarker promoted-hypothesis pip (ui, Lucide Flag)
6. CanvasStepCard updates: replace badge, data-arrow-endpoint,
   gate click during draw
7. Canvas chrome integration: button + pointer handlers + rubber-band
   SVG + state-machine wiring through CanvasWorkspace
8. CanvasStepOverlay Remove button + investigations.md resolution
   + manual chrome walk steps

Plan-time deferrals locked: column resolution via card.metricColumn
(Risk #1); return-to-select after Save (Risk #2); hand-rolled
positioning, no new dep (Risk #5); Lucide Flag with status colors
(Risk #6).

Subagent-driven dispatch per master plan D6 + feedback_subagent_driven_default.
Sonnet for >=70% of dispatches; Opus for final review only.

Master plan section 4 8d entry updated with forward link to this plan.

Co-Authored-By: ruflo <ruv@ruv.net>
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

dependencies Pull requests that update a dependency file javascript Pull requests that update javascript code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant