Add adaptive guided tours to the new UI - #2506
Conversation
b22a86a to
db17534
Compare
c3d3fb5 to
9546c7f
Compare
1233eba to
97a1a43
Compare
97c915f to
81599b4
Compare
Guided-tour review update — September 8Head: This pass
Reviewed suggestions intentionally not applied
Verification
The first-day retention and Up/Down failures were missing boundary cases in earlier tests, now covered. Existing dependency advisories on main remain unchanged; this pass adds no dependencies. |
57cb577 to
bf2c3ea
Compare
There was a problem hiding this comment.
🔵 Needs a closer look
Broad cross-stack changes and unresolved moderate findings require final human review.
Review details
Files not reviewed (1)
- src/Exceptionless.Web/ClientApp/package-lock.json: Generated file
Suppressed comments (2)
src/Exceptionless.Web/ClientApp/src/lib/features/admin/components/product-tour-activity.svelte:47
- For invitations,
startedis intentionally not rendered, but it still contributes tototal. A period containing only historical prompt-start telemetry therefore shows a chart and zero-valued Shown/Accepted/Dismissed series instead of the empty state. Compute the total from the displayedkeys.
const total = $derived(tour.shown + tour.started + tour.completed + tour.dismissed);
src/Exceptionless.Web/Models/User/UpdateProductTourProgress.cs:10
Statusis required by validation but nullable in the OpenAPI contract. Consequently the generated client declaresstatus?: null | ProductTourStatus, even though either form receives a 422 response. Make the request contract non-nullable while preserving missing-value validation, and update the handler accordingly.
- Files reviewed: 103/106 changed files
- Comments generated: 2
- Review effort level: Balanced
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d2ef1ac827
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 8bba742ea7
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 5b45ad1a00
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 77755fff07
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| public enum ProductTourStatus | ||
| { | ||
| Completed = 1, | ||
| Dismissed = 2 |
There was a problem hiding this comment.
Restore decoding of legacy string tour statuses
Users whose documents were written during the earlier merged-and-reverted tour implementation can still have product_tours.*.status stored as "dismissed" or "completed", but this enum now accepts only numeric JSON, causing deserialization of the entire user document to fail. Fresh evidence in this target is that the later simplification removed ProductTourStatusConverter and its legacy regression tests, undoing the fix acknowledged in the existing thread; retain backward-compatible reading while continuing to write the numeric API/storage format.
AGENTS.md reference: AGENTS.md:L72-L75
Useful? React with 👍 / 👎.
|
|
||
| await PatchAsync(userId, patch, options => options.Cache()); | ||
|
|
||
| var user = await GetByIdAsync(userId, options => options.Cache()); |
There was a problem hiding this comment.
Refresh the user cache from an authoritative read
When an authentication read that started before PatchAsync repopulates the old user after the patch invalidates its cache entries, this cache-enabled read can return that stale document and leave both ID and email lookups stale, so a completed or dismissed tour can reappear. Fresh evidence in this target is that it again uses GetByIdAsync(...Cache()) and has removed the authoritative read plus AddDocumentsToCacheAsync refresh that the existing thread identified as its fix.
AGENTS.md reference: AGENTS.md:L72-L75
Useful? React with 👍 / 👎.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f275caae14
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| if (current != null && (current.version > params.version || | ||
| (current.version == params.version && (current.status == params.completedStatus || current.status == params.status)))) { |
There was a problem hiding this comment.
Preserve legacy completed status in the atomic patch
When a legacy record has status: "completed" and the user later dismisses a restarted guide at the same version, this predicate compares the stored string only with numeric enum values, falls through to the update branch, and overwrites the completion with Dismissed. Restoring the legacy deserializer identified in the existing review is insufficient because the script operates directly on the persisted source; also recognize the legacy "completed" value here or normalize it before applying completion precedence.
AGENTS.md reference: AGENTS.md:L72-L75
Useful? React with 👍 / 👎.
What changed
Adds five contextual guides to the Svelte UI, accessible from Help and the command palette. Guides cover navigation, project setup, saved views, error investigation, and Exie.
Stores first completion and invitation acknowledgment dates in a typed
ProductTourStateon the user. The self-onlyPUT /api/v2/users/me/product-tours/{tourName}/recordoperation validatesProductTourNames.Alland uses the existing user load/save pattern.Keeps active steps in memory. Reload ends an unfinished guide; users can restart it from Help. Finishing or dismissing exits locally even if saving fails or remains pending. Guide dismissal does not record completion.
Uses the existing feature-usage submission path for completed/dismissed actions. Removes the custom reporting UI, aggregation endpoint, version tracking, and session-storage layer.
Uses generated API types, typed route identifiers, and ordinary user-query invalidation. Preserves the shared-filter hydration fix and its regression coverage.
Opens Change Plan directly from the Exie announcement’s Upgrade Plan action, preselects the required tier, and refreshes access after a successful change.
Enforces blank lines between control-flow blocks in TypeScript and explicit class-member visibility; the visibility cleanup preserves emitted JavaScript.
Verification
Compatibility
Replacement for #2458, reverted by #2505. The API and stored shape replace the previous version of this PR. Before deployment, confirm whether a reverted-tour deployment persisted the old status/version shape; that deployment/data history remains unverified. Remains draft and unmerged.