From dd4181e93ebc27ecae6e577a7294090b173c212c Mon Sep 17 00:00:00 2001 From: release-notes-bot Date: Tue, 30 Jun 2026 14:58:29 +0000 Subject: [PATCH 1/2] release-note pipeline start: v6.0.0-beta.3 --- .claude/release-notes/input-v6.0.0-beta.3.md | 164 ++++++++++++++++++ .../runs/v6.0.0-beta.3/public-note.env | 1 + .../runs/v6.0.0-beta.3/route.json | 11 ++ .../release-notes/runs/v6.0.0-beta.3/run.env | 13 ++ 4 files changed, 189 insertions(+) create mode 100644 .claude/release-notes/input-v6.0.0-beta.3.md create mode 100644 .claude/release-notes/runs/v6.0.0-beta.3/public-note.env create mode 100644 .claude/release-notes/runs/v6.0.0-beta.3/route.json create mode 100644 .claude/release-notes/runs/v6.0.0-beta.3/run.env diff --git a/.claude/release-notes/input-v6.0.0-beta.3.md b/.claude/release-notes/input-v6.0.0-beta.3.md new file mode 100644 index 000000000..db990bb71 --- /dev/null +++ b/.claude/release-notes/input-v6.0.0-beta.3.md @@ -0,0 +1,164 @@ +# Velt SDK Release Notes - v6.0.0-beta.3 +Release Date: June 30, 2026 + +## Summary +| SDK | Files Changed | Insertions | Deletions | +|-----|--------------|------------|----------| +| HTML/Vanilla (sdk) | 151 | +6791 | -862 | +| React (sdk-react) | 4 | +14 | -4 | + +## Features + +### 1. [Comments] `restrictTextSearchToAnchor` — control the text-comment highlight fallback search + +**What:** A new boolean control on `velt-comments` that decides how aggressively the SDK searches the DOM when re-locating a text comment's highlight. By default (`false`) the SDK now falls back to a wider (body-level, or location-scoped) search when the commented text is no longer found inside the comment's original anchor element. Setting it to `true` restricts the search to the anchor element only — no fallback — so a comment ghosts immediately if its anchor text is gone. + +**Why:** Some apps re-render or move the DOM around a text comment's anchor element. When that happens the stored text can no longer be found under the original anchor, and the comment would ghost even though the text still exists elsewhere on the page. The body-level fallback recovers those comments. Apps that deliberately reuse the same text across regions (and never want a comment to re-bind outside its anchor) can opt out with this flag. + +**Impact:** Customers get a single switch to choose between maximum highlight recovery (default, fallback enabled) and strict anchor-only matching. The default flips behavior toward recovery, so previously-ghosted text comments may now re-highlight (see Bug Fixes #1 for the underlying behavior change). + +**Prop:** +| Prop / Attribute | Type | Default | +|------|------|---------| +| `restrictTextSearchToAnchor` / `restrict-text-search-to-anchor` | `boolean` | `false` | + +**React:** +```jsx + +``` + +**HTML:** +```html + +``` + +**API Methods:** +```ts +commentElement.enableRestrictTextSearchToAnchor(): void; +commentElement.disableRestrictTextSearchToAnchor(): void; +``` + +**Example:** +```ts +const commentElement = client.getCommentElement(); + +// Restrict the highlight search to the anchor element only (no body-level fallback). +commentElement.enableRestrictTextSearchToAnchor(); + +// Allow the body-level fallback search before ghosting (default behavior). +commentElement.disableRestrictTextSearchToAnchor(); +``` + +--- + +## Improvements + +### 1. [Self-hosting] `fieldsToRemove` allowlist extended to reaction, recorder, and activity annotations + +**What:** The self-hosting field allowlist (`fieldsToRemove`) — which moves customer-private top-level fields out of Velt's database and into the customer's own storage on write, then restores them from the resolver cache on read — now applies to reaction annotations, recorder annotations, and all activity feature types. Previously the `fieldsToRemove` extraction in `ActivityUtilsService` only ran for activities whose `featureType === 'custom'`; it now runs for every feature type (custom, comment, reaction, recorder, …). The reaction and recorder annotation resolver services now read `fieldsToRemove` from their data-provider config and expose it via a new internal config accessor on the resolver service, and both `ReactionUtilsService` and `RecorderUtilsService` strip/restore those fields around the Velt-DB write (`RecorderUtilsService` received the `stripRecorderAnnotationData` / merge counterpart alongside `ReactionUtilsService`'s reaction-annotation strip/restore). To support arbitrary custom fields, `PartialReactionAnnotation` gained an index signature (`[key: string]: any`). + +**Why:** Self-hosting customers (e.g. Harvey) rely on the resolver system to keep their private data out of Velt's database. That guarantee previously only covered comments and custom activities, leaving reaction and recording metadata fields with no way to be self-hosted. Extending the same allowlist mechanism closes that gap. The activity-side change is also a correctness fix: a reaction embedded in an `ActivityRecord`'s `entityData` is written through the activity allowlist, which keeps `entityData` opaque and never re-filters it — so without removing the field on both the changed and unchanged code paths, an unchanged reaction activity could leak a customer-private field to Velt's database. + +**Impact:** Customers can now list reaction- and recorder-specific custom fields (and any activity feature type's custom fields) in their resolver's `fieldsToRemove` config and have those values stored only in their own backend. The values still round-trip transparently on read via the resolver cache. Fields are matched on `!== undefined`, so falsy-but-meaningful values (`0`, `false`, `""`) are moved too. + +**Example (reaction annotation data provider):** +```ts +// Fields listed here are written to your storage (stripped data) and deleted +// from the payload sent to Velt's database; they are restored on read. +reactionAnnotationDataProvider = { + config: { + fieldsToRemove: ['internalRef', 'tenantId'], + }, + // ...resolver implementation +}; +``` + +### 2. [Comments / Sidebar v2] Selecting a resolved status now surfaces resolved comments under "hide resolved" presets + +**What:** In the v2 comment sidebar's filter engine, the "hide resolved by default" rule now treats an explicit status-field selection as an override. An annotation survives the hide rule when it is non-terminal **or** the user has explicitly selected its status in the status field filter. This applies to the `all`, `unread`, `read`, `open`, and `assignedToMe` quick-filter presets. + +**Why:** Presets like `all` hide terminal (resolved) comments by design. But once a user explicitly picks "Resolved" in the status field filter, they clearly want to see resolved comments — the preset's default hide was suppressing the very comments they asked for. + +**Impact:** Explicitly selecting a terminal/resolved status surfaces those comments even under presets that otherwise hide resolved comments, instead of returning an empty or short list. + +--- + +## Bug Fixes + +### 1. [Comments] Text comments failing to highlight are now recovered via a body-level fallback search + +**What:** When a text comment's stored text can no longer be found inside its resolved anchor element, the SDK now retries the search in a wider scope before ghosting the comment. The fallback scope is `document.body` for body-anchored comments and the comment's location element for location-scoped comments (so the fallback never escapes the location and matches the same text in a different location/document). The highlight-resolution logic was refactored into two private service-internal helpers — one that runs anchor-first then falls back to the scoped search, and one that validates the matched nodes (excluding `