Skip to content

chore(deps): bump actions/checkout from 4.2.2 to 6.0.2#3

Closed
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/github_actions/actions/checkout-6.0.2
Closed

chore(deps): bump actions/checkout from 4.2.2 to 6.0.2#3
dependabot[bot] wants to merge 1 commit into
mainfrom
dependabot/github_actions/actions/checkout-6.0.2

Conversation

@dependabot
Copy link
Copy Markdown
Contributor

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

Bumps actions/checkout from 4.2.2 to 6.0.2.

Release notes

Sourced from actions/checkout's releases.

v6.0.2

What's Changed

Full Changelog: actions/checkout@v6.0.1...v6.0.2

v6.0.1

What's Changed

Full Changelog: actions/checkout@v6...v6.0.1

v6.0.0

What's Changed

Full Changelog: actions/checkout@v5.0.0...v6.0.0

v6-beta

What's Changed

Updated persist-credentials to store the credentials under $RUNNER_TEMP instead of directly in the local git config.

This requires a minimum Actions Runner version of v2.329.0 to access the persisted credentials for Docker container action scenarios.

v5.0.1

What's Changed

Full Changelog: actions/checkout@v5...v5.0.1

v5.0.0

What's Changed

⚠️ Minimum Compatible Runner Version

v2.327.1
Release Notes

... (truncated)

Changelog

Sourced from actions/checkout's changelog.

Changelog

v6.0.2

v6.0.1

v6.0.0

v5.0.1

v5.0.0

v4.3.1

v4.3.0

v4.2.2

v4.2.1

v4.2.0

v4.1.7

v4.1.6

... (truncated)

Commits

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 github_actions Pull requests that update GitHub Actions 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 14, 2026 7:24am
variscout_website Ready Ready Preview, Comment Mar 14, 2026 7:24am

Bumps [actions/checkout](https://github.com/actions/checkout) from 4.2.2 to 6.0.2.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](actions/checkout@11bd719...de0fac2)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: 6.0.2
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
@dependabot dependabot Bot force-pushed the dependabot/github_actions/actions/checkout-6.0.2 branch from 7369eac to 899db6a Compare March 14, 2026 07:19
jukka-matti added a commit that referenced this pull request Mar 19, 2026
…l-model-hierarchy

Replace shallow AI Adaptation subsection with proper Three AI Modes table
(No AI / AI Enabled / AI + Knowledge Base) and Four AI Context Layers.
Move Knowledge Layer from Product Concerns to architectural treatment.
Add 5 verification chart types to IMPROVE phase detail. Expand known
gap #3 with explicit document upload gap during FRAME/SCOUT.

Co-Authored-By: ruflo <ruv@ruv.net>
@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/github_actions/actions/checkout-6.0.2 branch March 20, 2026 12:56
jukka-matti added a commit that referenced this pull request Apr 27, 2026
Combines three sequenced PRs into one spec per feedback_full_vision_spec
memory:
- PR #1 (H1): team notes on state items — question / gemba / data-gap /
  decision kinds, persisted in ProcessHubInvestigationMetadata.stateNotes
- PR #2 (V2 follow-up): full EvidenceSheet rendering — refactors
  ProcessHubEvidenceContract to split countFor (sync) + loadFindingsFor
  (async), eliminates the synthetic-Finding cast from PR #99
- PR #3 (H2 launch): General Evidence Source for CSV/Excel — adds
  GENERIC_TABULAR_PROFILE to DATA_PROFILE_REGISTRY, mapping confirmation
  UI in ProcessHubEvidencePanel, cadence metadata

Resolves both prior open questions inline:
- Evidence contract split (countFor + loadFindingsFor + onChipClick +
  onFindingSelect — cleaner than overloading findingsFor sync/async)
- Mapping UX explicit confirmation (matches operating-model § "analyst
  confirms mappings" language)

Updates spec index, marks the parent V2 actionable-panel spec as
Delivered (PRs #98 #99).

Co-Authored-By: ruflo <ruv@ruv.net>
jukka-matti added a commit that referenced this pull request Apr 27, 2026
Sequenced TDD breakdown for 3 PRs:
- PR #1: team notes on state items (~250-350 LOC, 8 tasks). New
  ProcessStateNote types in core, ProcessHubInvestigationMetadata
  extension, ProcessHubNotesContract on the panel, StateItemNotesDrawer
  in apps/azure, Dashboard wiring via useStorage round-trip.
- PR #2: full EvidenceSheet rendering (~300-400 LOC, 5 tasks). Refactors
  ProcessHubEvidenceContract to split countFor (sync) + loadFindingsFor
  (async); EvidenceSheet bottom sheet; Dashboard owns sheet state +
  async load via useStorage; eliminates synthetic-Finding cast from PR
  #99.
- PR #3: General Evidence Source for CSV/Excel (~600-800 LOC, 4 tasks).
  GENERIC_TABULAR_PROFILE in DATA_PROFILE_REGISTRY; profile picker UI;
  mapping confirmation form; cadence selector (5 actual EvidenceCadence
  values); telemetry on save.

Three implementation reality notes flagged at top:
1. Actual DataProfileDefinition signature differs from spec sketch
   (single 'label' field; detect takes only rows; confidence is
   'high'/'medium'/'low' enum not number).
2. EvidenceCadence enum lacks 'monthly' — use existing 5 values.
3. Spec back-link upgrades to Markdown link in PR #1 Task 7.

Co-Authored-By: ruflo <ruv@ruv.net>
jukka-matti added a commit that referenced this pull request Apr 28, 2026
* feat(core): add GENERIC_TABULAR_PROFILE for CSV/Excel evidence sources

First H2 capability — any CSV/Excel with at least one numeric column
becomes a recurring evidence source via this profile. Detection scales
confidence from low → high based on numeric-column ratio (>=60% high,
>=30% medium, else low). Validate rejects empty snapshots. Apply is
identity (no derived signals — that's domain-specific work for future
profiles like agent-review-log).

DATA_PROFILE_REGISTRY now contains both agent-review-log and
generic-tabular; detectDataProfiles returns multi-match results for
files matching both (e.g., a review log will match both since its
columns are tabular).

Phase 3 PR #3, Task 2.

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

* feat(azure): add multi-step wizard for general Evidence Source upload

Extends ProcessHubEvidencePanel with a New Source flow alongside the
existing quick Agent Review Log path. State machine routes through:
upload → detect → optional profile picker → mapping confirmation →
cadence (5 EvidenceCadence values, no monthly) → save.

Reuses parseText, detectDataProfiles, and DATA_PROFILE_REGISTRY from
@variscout/core. Telemetry process_hub.evidence_source_created emits
non-PII payload (hubId, profileId, columnCount, rowCount, cadence) per
ADR-059. The Agent Review Log quick-create + auto-apply path is
preserved unchanged.

Phase 3 PR #3, Task 3.

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

* fix(azure): remove unused 'detecting' WizardState variant

The variant was declared but never set — handleNewSourceFile awaits
parseText + detectDataProfiles synchronously and jumps straight to
confirming-mapping / picking-profile / error. Dead code removed; if a
loading indicator becomes worth the UX cost on large files, reintroduce
with a simpler shape (just sourceName, no rows yet).

Phase 3 PR #3, 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 6, 2026
* data-flow F1+F2 P5.1: AzureHubRepository skeleton + composition root

Adds AzureHubRepository implementing HubRepository from @variscout/core/persistence.
Dispatch short-circuits HUB_PERSIST_SNAPSHOT to saveProcessHubToIndexedDB (bootstrap);
all other action kinds throw explicit P5.2/P5.3 not-yet-implemented error. Read APIs
wire against existing Azure Dexie tables (processHubs, evidenceSources, evidenceSnapshots,
evidenceSourceCursors); F3-pending entities (investigations, findings, questions,
causalLinks, suspectedCauses) are stubbed. Module-scoped azureHubRepository singleton
mirrors PWA composition-root pattern. apps/azure/CLAUDE.md updated with
persistence-boundary invariant documenting R12+R13 exceptions.

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

* data-flow F1+F2 P5.1 review fixes: hubs.list tombstone filter + multi-hub outcomes test + dispatch error test

- hubs.list() now filters h.deletedAt === null; hubs.get stays unscoped (comment added)
- outcomes.get has O(n hubs) comment noting F3 normalization will remove the scan
- AzureHubRepository.read.test: hubs.list tombstone test + multi-hub outcomes.get test
- AzureHubRepository.test: HUB_PERSIST_SNAPSHOT error propagation test
- Fix 4: corrected misleading fake-indexeddb comment ("kept at line 1" → "must be the first import statement")

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

* data-flow F1+F2 P5.2: Azure cascade helper with Dexie transaction

Adds cascadeArchiveDescendants(parentKind, parentId, archivedAt) in
apps/azure/src/persistence/cascadeArchive.ts. Uses transitiveCascade()
from @variscout/core/persistence; wraps all Dexie writes in a single
'rw' transaction covering evidenceSnapshots, evidenceSources,
evidenceSourceCursors, and processHubs. Per-kind stubs with F3 comments
for investigation/finding/question/causalLink/suspectedCause/rowProvenance/
canvasState (no Azure tables today). Outcome cascade explicitly deferred
to P5.3 per-action handler (hub blob mutation). Evidence source cursor
hub-range query uses compound PK [hubId+sourceId] between(). 10 new tests
covering: evidenceSource→cursor cascade, hub multi-table cascade,
investigation no-op, rollback, idempotency, empty-descendants. Barrel
updated to re-export the helper.

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

* data-flow F1+F2 P5.2 review fixes: cascade JSDoc + rollback comment + fan-out test

- Fix 1: add ## Atomic call pattern (P5.3+) section to cascadeArchiveDescendants
  JSDoc prescribing the outer-transaction wrapping pattern P5.3 must use to
  keep parent-row update + descendant cascade atomic; explains Dexie 4 zone reuse.
- Fix 2: replace hedge comment in rollback test with confident pass-confirmation
  statement — rollback path verified green at P5.2 baseline (1098 tests).
- Fix 3: add cursor2 for src2 in the hub multi-table cascade test to cover the
  fan-out path (hub → both evidenceSource cursors via compound key-range scan).

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

* data-flow F1+F2 P5.3: Azure per-action handlers + applyAction module

Implements all HubAction handlers in a new applyAction.ts module (Option B):
- Hub-blob mutations (HUB_UPDATE_GOAL, HUB_UPDATE_PRIMARY_SCOPE_DIMENSIONS,
  OUTCOME_ADD, OUTCOME_UPDATE, OUTCOME_ARCHIVE) — read-modify-write via
  saveProcessHubToIndexedDB.
- Direct Dexie table writes (EVIDENCE_ADD_SNAPSHOT, EVIDENCE_ARCHIVE_SNAPSHOT,
  EVIDENCE_SOURCE_ADD, EVIDENCE_SOURCE_UPDATE_CURSOR, EVIDENCE_SOURCE_REMOVE).
- EVIDENCE_SOURCE_REMOVE atomically wraps cascade + parent soft-delete in a
  single db.transaction; outer table list is a superset of cascadeArchiveDescendants'
  internal transaction to satisfy Dexie zone propagation.
- Session-only kinds (INVESTIGATION_*, FINDING_*, QUESTION_*, CAUSAL_LINK_*,
  SUSPECTED_CAUSE_*) — documented no-ops with F3 comment.
- Canvas kinds — documented no-ops with HUB_PERSIST_SNAPSHOT-flow comment.
- TypeScript exhaustiveness via assertNever() ensures compile-time completeness.

AzureHubRepository.dispatch now delegates to applyAction after the
HUB_PERSIST_SNAPSHOT short-circuit.

Adds 73 new tests (1098 → 1171). Adds sustainment-deferral note to
apps/azure/CLAUDE.md Invariants section.

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

* data-flow F1+F2 P5.3 review fixes: parent-update rollback test + @internal barrel + idempotency notes

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

* data-flow F1+F2 P6: Azure call-site migration to dispatch (storage facade + cursor sync)

Migration A: replace saveProcessHubToIndexedDB, saveEvidenceSourceToIndexedDB,
saveEvidenceSnapshotToIndexedDB in the three StorageProvider save methods with
azureHubRepository.dispatch(HUB_PERSIST_SNAPSHOT | EVIDENCE_SOURCE_ADD |
EVIDENCE_ADD_SNAPSHOT). Cloud-sync blocks unchanged. List/cache paths (lines 548,
595, 642) intentionally kept on direct localDb helpers (read-sync only).
Bootstrap save in listProcessHubs (line 548) left on direct call — it syncs cloud
→ local cache, not a hub-write dispatch path.

Migration B: replace db.evidenceSourceCursors.{get,put} in useEvidenceSourceSync
with azureHubRepository.evidenceSources.getCursor (Option B-1) and
dispatch(EVIDENCE_SOURCE_UPDATE_CURSOR). No direct Dexie usage remains in the file.

Tests: storage.test.ts — added db.processHubs mock for ensureDefaultProcessHubInIndexedDB;
added persistence mock for azureHubRepository.dispatch; added saveProcessHub /
saveEvidenceSource / saveEvidenceSnapshot tests asserting dispatch called with correct
action shapes. useEvidenceSourceSync.test.ts — replaced db.evidenceSourceCursors mock
with azureHubRepository mock; updated markSeen test to assert dispatch call shape.

Tests: 1173 → 1178 ✓ (5 new). Build: clean.

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

* data-flow F1+F2 P6 review fix: tighten cloud-sync test mocks for evidence paths

Add hoisted mocks + vi.mock factory entries for all six evidence-blob
functions (listBlobEvidenceSnapshots, saveBlobEvidenceSnapshot,
updateBlobEvidenceSnapshots, listBlobEvidenceSources,
saveBlobEvidenceSource, updateBlobEvidenceSources). Previously the
saveEvidenceSnapshotToCloud path called undefined blob functions which
were silently swallowed, letting the cloud-sync assertion pass without
the blob calls ever firing. Tighten the existing snapshot online test
to assert exact dispatch shape (provenance: []) + blob function calls.
Add parallel online + cloud-sync test for saveEvidenceSource covering
dispatch shape and blob function calls. Tests: 1178→1179.

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

* data-flow F1+F2 P7: ESLint dexie/db guard + dispatch-only docs

- P7.1: Update packages/stores, apps/pwa, apps/azure CLAUDE.md files to
  explicitly state the dispatch-only invariant (domain stores never import
  dexie directly; access via HubRepository / pwaHubRepository.dispatch /
  azureHubRepository.dispatch). Update "will add" references to past tense
  now that P7.2 delivers the rule. Enumerate R12+R13 exceptions clearly in
  each file.
- P7.2: Add ESLint no-restricted-imports rule in eslint.config.js blocking
  dexie package imports and **/db/schema glob imports outside the documented
  allow-list (persistence/, db/, wallLayoutStore.ts, azure services/storage
  + localDb + cloudSync + lib/persistence, test files). Smoke-tested: rule
  fires on ProcessHubEvidencePanel.tsx with clear actionable message; passes
  cleanly against current codebase (0 errors).
- P7.3: Confirmed pnpm lint is already a step in pr-ready-check.sh (no
  script change needed). pr-ready-check passes end-to-end.

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

* data-flow F1+F2 P8.3 closeout: doc polish + decision-log + spec delivered

- Minor #1: add bootstrap cache-fill comment above storage.ts:548 for-loop
- Minor #2: R12 self-document comment on wallLayoutStore Dexie import
- Minor #3: fix plan frontmatter category (implementation-plan/audit → implementation)
- decision-log: F1+F2 closeout entry (what/why/deltas) + session backlog row
- spec: 2026-05-06-data-flow-foundation-design.md status active → delivered

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 9, 2026
… V1 PRs

- Add PR-RPS-1 SHIPPED entry to §1
- Replace items #1, #3, #4 (Charter/Sustainment/Handoff piecewise) with the
  unified RPS V1 PR-RPS-2 through PR-RPS-10 sequence
- F5's HubAction work now subsumed by PR-RPS-9 + PR-RPS-10 (note added)
- Resolve §5 "F5 timing" question (moot post-RPS V1)
- Add 3 new heuristics to §6 (step-back-for-system-design, drop-methodology-
  bridges, code-review-must-checkout-PR-branch)
- Add RPS V1 spec + plan as related/references

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>
jukka-matti added a commit that referenced this pull request May 14, 2026
… mismatches)

The beforeEach import fix in e73fca6 closes the responsesApi.test.ts
item from the deferred-tsc-errors entry. Adds item #4 capturing the
9 newly-surfaced SustainmentRecord + ProcessMap fixture-shape mismatches
that became visible once responsesApi.test.ts was unblocked.

Co-Authored-By: ruflo <ruv@ruv.net>
jukka-matti added a commit that referenced this pull request May 14, 2026
… Canvas decomposition + tsc hygiene (#168)

* fix(pwa): eliminate setState-in-render warning by replacing bare usePanelsStore() with individual field selectors

The bare `const store = usePanelsStore()` whole-store subscription in
`useAppPanels` violated the CLAUDE.md/ADR-078 "Never bare useStore()" rule.
In React 19 Strict Mode + Zustand 5 (useSyncExternalStore), the whole-store
snapshot causes tearing detection to fire on every panelsStore update
(panel-state transitions co-incident with LOD switches, frame-tab activation,
Lock canvas toggle), producing 8+ "Cannot update a component (AppMain) while
rendering" warnings per interaction.

Fix: rewrite useAppPanels.ts to use 24 individual usePanelsStore(s => s.field)
selectors — one per state field and action. useEffect dependency arrays cleaned
accordingly (no more `store` object in deps). App.tsx return interface unchanged.

Regression test added in apps/pwa/src/__tests__/App.test.tsx: mounts App,
exercises showFrame() panel transition, asserts zero setState-in-render warnings.
All 40 PWA test files green; pwa build green.

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

* docs(investigations): add commit hash + correct rule attribution

Spec-review followup: add commit hash 6c5bc1a to the setState-in-render
resolution paragraph, and correct rule attribution from "CLAUDE.md / ADR-078"
to "packages/stores/CLAUDE.md:18 (cites ADR-041)" — ADR-078 covers the
6-stores-across-3-layers model, not selector discipline.

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

* refactor(pwa): extract openDataTableAtRow compound action + drop dead _vi import

Code-review followup: per feedback_fix_absorbed_violations_at_seam, lift the
two bare usePanelsStore.setState() calls in useAppPanels.openDataTableAtRow
into a single store-action openDataTableAtRow(index, isDesktop). Drops the
last bare-setState seam violation in the hook. Also removes a dead `vi as _vi`
import from App.test.tsx.

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

* feat(cleanup): brand ProcessHubId opaque type + WallCanvas sentinel removal

Define `ProcessHubId = string & { readonly __brand: 'ProcessHubId' }` in
`packages/core/src/processHub.ts` (the only definition point). Add
`asProcessHubId()` (throws on empty) and `isProcessHubId()` predicate;
update `DEFAULT_PROCESS_HUB_ID` and `normalizeProcessHubId` to return
`ProcessHubId`. Re-export from stores for back-compat consumption.

Replace `hubId ?? '__wall-canvas-unbound__'` sentinel in WallCanvas with
`hubId ?? null`; update `useCanvasViewportInput` to accept `ProcessHubId | null`
with a null short-circuit (no store writes when hub is absent).

25-file sweep across packages/hooks/ui/apps: all `string`-typed hub slots
at store boundaries cast/narrowed to `ProcessHubId`; test fixtures use
`const h = (id: string) => id as ProcessHubId` helper. Both app lifecycle
hooks (PWA + Azure) use `normalizeProcessHubId(hubId)` → `boundHubId` so
the raw `string | null | undefined` param never reaches store calls.

Closes LOW #19 from the 8f retrospective (docs/investigations.md updated).

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

* fix(cleanup): move h() cast helper after imports in mapwall test

Prettier placed the const between two import statements during the
pre-commit format pass. Move it after all imports to keep ES module
import grouping clean.

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

* chore(stores): sweep ProcessHubId imports to @variscout/core

Removes the back-compat re-export shim at canvasViewportStore.ts:16 per
feedback_no_backcompat_clean_architecture; 7 consumers now import the
branded type directly from @variscout/core/processHub. Barrel index.ts
updated to re-export ProcessHubId from @variscout/core/processHub directly
(not via the store file) so existing code that happens to pull from the
barrel continues to compile.

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

* chore(cleanup): finish ProcessHubId import sweep to @variscout/core

Sweep the remaining ~15 consumers missed by the earlier pass; barrel
shim removal exposed the gaps via TS error. All ProcessHubId imports
now go directly to @variscout/core/processHub.

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

* test(core, hooks): cover asProcessHubId/isProcessHubId + useCanvasViewportInput null short-circuit

Two Important test gaps from PR2 code review: factory throw-on-empty
(asProcessHubId, isProcessHubId) and the new hubId:null no-op path in
useCanvasViewportInput. Both verify load-bearing contracts that were
shipped without exercise.

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

* refactor(canvas): extract useCanvasHypothesisDrawing hook

Moves all drawing-mode pointer/keyboard event handlers and the
reset effect out of Canvas/index.tsx into a dedicated hook. The
hook returns stable handler refs plus endpointLabel and
parseEndpointElement helpers — 12 vitest tests cover all branches.

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

* refactor(canvas): extract useCanvasHypothesisArrows hook

Moves arrowSegments state, cardElements ref, and both useLayoutEffects
(ResizeObserver setup + DOM measurement) out of Canvas/index.tsx into a
dedicated hook. Measurement is stable equality-guarded to avoid needless
re-renders. 8 vitest tests cover empty, ResizeObserver attach/detach, and
remeasure-on-viewport-change paths.

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

* refactor(canvas): extract CanvasLevelRouter sub-component

Moves the lens-validity gate and all l1/l2/l3 content composition
out of Canvas/index.tsx into an internal sub-component. Canvas drops
from 1135 to 848 lines. CanvasAuthoringMode and CanvasL3Archetype are
defined in CanvasLevelRouter and re-exported from Canvas to avoid a
circular import. 10 vitest tests cover the routing, lens-invalid empty
state, archetype switching, and mode-toggle visibility. Barrel updates
and CanvasWorkspace.test.tsx mock additions for the two new hooks land
in this commit.

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

* chore(types): add vite-env.d.ts + trivial tsc fixes in core/hooks (pre-existing)

Category A — add minimal ImportMeta.env / ImportMeta.glob augmentation .d.ts
files to packages/core/src/ and packages/hooks/src/ so that import.meta.env.DEV
and import.meta.glob(...) resolve without requiring vite as a direct dep.
Overloaded signatures distinguish eager (→ T) from lazy (→ () => Promise<T>)
so calls into registerLocaleLoaders (which expects LocaleLoaderMap) type-check.

Category C — two trivial fixes:
  - packages/hooks/src/__tests__/setup.ts: cast (window as unknown as Record...)
    to satisfy TS2352 (neither type sufficiently overlaps).
  - packages/hooks/src/__tests__/findingSourceLensCapture.test.ts: add _filters
    param to the vi.fn mock that takes one argument; was inferred as 0-arg.
  - packages/hooks/src/__tests__/setup.ts: /// <reference types="vitest/globals" />
    so beforeEach is recognised by standalone tsc (globals:true is vitest-only).

All pre-existing; unrelated to PR1/PR2/PR3 logic.

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

* chore(test): cast DataRow fixtures + log deferred tsc errors (pre-existing)

Category B — cast Record<string,unknown>[] test fixtures to DataRow[] at the
constant definition site so useParetoChartData and useYamazumiChartData calls
type-check without changing test behaviour:
  - packages/hooks/src/__tests__/timeLensWiring.test.ts: add DataRow import +
    cast PARETO_100 at buildParetoRows(100) assignment.
  - packages/hooks/src/__tests__/useYamazumiChartData.test.ts: add DataRow
    import + change EMPTY_DATA type annotation from Record<string,unknown>[] to
    DataRow[].

docs/investigations.md — new entry "Pre-existing tsc errors deferred from
PR #168" listing the 3 remaining items that are out of scope for a trivial-cast
pass: d3 type deps (useCanvasViewportInput.ts:2-4), tuple-mock fetch typing
(useHubCommentStream.test.ts:274-277), and beforeEach globals in
responsesApi.test.ts:862.

All pre-existing; unrelated to PR1/PR2/PR3 logic.

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

* chore(test): import beforeEach in responsesApi.test.ts

One-line addendum to the pre-existing-tsc-error cleanup commit: the
responsesApi.test.ts file uses beforeEach at line 862 but the vitest
import on line 1 omits it. Same category as the other ImportMeta /
test-globals fixes in afd8c8b.

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

* docs(investigations): close item #3 + log item #4 (core fixture-shape mismatches)

The beforeEach import fix in e73fca6 closes the responsesApi.test.ts
item from the deferred-tsc-errors entry. Adds item #4 capturing the
9 newly-surfaced SustainmentRecord + ProcessMap fixture-shape mismatches
that became visible once responsesApi.test.ts was unblocked.

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

---------

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 github_actions Pull requests that update GitHub Actions code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant