Skip to main content
Week of June 8, 2026
APIAudience StudioBreaking ChangeBug FixDashboardData StudioImprovementIntegrationsNew FeaturePlatform

Lookalike Studio

Lookalike Studio is a new guided builder for creating lookalike audiences from a seed audience, available at My Audiences → Lookalike Studio. It uses the same two-column layout as Audience Studio and walks you through the full workflow:
  • Seed and population — Start from a seed dataset, then choose the larger population to model against. The picker only allows joinable pairs, hiding any population that lacks a join-key Rosetta Stone mapping to the seed.
  • Similarity attributes — Candidate features are classified automatically and shown in a searchable list with categorical/continuous, source, and cardinality badges. Identity attributes are surfaced separately as the join keys.
  • Configure output — Size the audience by count (top N highest-scoring users) or by a similarity-score threshold, and choose whether to include your original seed users.
  • Connections (optional) — Attach destination connectors to the output using the same eligibility checks and per-connector configuration as Audience Studio. The output is automatically mapped to the unique_id attribute, so it can be delivered to connectors and reused as a future seed audience.
  • Finalize — Name the audience (with an auto-generated, collision-free dataset slug), add a description and tags, and review a summary of the full configuration before building.
Clicking Create Lookalike Audience assembles and submits the workflow for immediate execution, with a live progress dialog that continues server-side if you close it and a success drawer on completion. Intermediate build checkpoints are hidden from dataset listings so the catalog only shows the finished audience.Read more →

Attributes API: filter semantic search by minimum relevance score

GET /attributes now accepts a min_score query parameter that bounds results by the cosine similarity between the search term’s embedding and each attribute’s embedding. min_score is a number in the interval [0, 1]; attributes scoring below the threshold are excluded from both the returned records and the total count, so weakly related attributes no longer dilute search results. Setting min_score=0 disables the threshold entirely and returns the top per_page matches ranked purely by relevance — useful when a search comes back empty and you want to widen the net.The Narrative Model Context Protocol (MCP) narrative_attributes_search tool exposes the same min_score argument and applies a sensible default so loosely related attributes are dropped without the caller having to specify a threshold on every query. Reconnect your MCP client to pick up the updated tool schema.

Cached mappings for NQL

Mappings now support a new cached_mapping expression type alongside the existing SQL expression type. A cached mapping references a separate cache dataset whose output column holds pre-computed attribute values; at query time, rows from the source dataset are joined to the cache using the configured input_expressions as the join key. This lets you reuse expensive attribute computations across queries without recomputing them inline.Cached mappings can be created and read through the company-scoped Mappings API (for example, POST /mappings/companies/{company_id}). The referenced cache dataset must already exist, be owned by the same company, and have an output column whose type matches the target attribute.A few constraints apply while the feature rolls out:
  • Cached mappings are not permitted on opt-out attributes (data_privacy_request_identifier, unique_id, identifier_relation).
  • Materialized fields cannot be backed by a cached mapping, and an existing mapping cannot be converted to a cached mapping while an active materialized field on the same dataset references it.
  • DELETE statements that filter on a cached mapping are rejected with DELETE on cached mappings not yet supported.
See Mapping types for the full schema and validation rules.

Compute pool idle-timeout disable sentinel changed to -1

For AWS EMR compute pools, the sentinel value that disables idle-termination on idleTimeoutSeconds is now -1 instead of 0. Validation accepts null, -1, or any value in the [60, 604800] range; 0 is now rejected.Existing AWS EMR pools that used 0 to disable idle-termination have been migrated to -1 automatically, so no action is required for currently running pools. Callers that create or update compute pools should switch to -1 (or omit the field) to disable idle-termination going forward.

Dataset mutations now propagate across Data Studio tabs

Fixed an issue in Data Studio where dataset changes made in one tab did not reach other open tabs. Deleting a dataset in one tab no longer left a stale name-uniqueness error in another, and renaming or otherwise updating a dataset from one surface now syncs into the kept-alive Dataset Details page without requiring a manual refresh. Datasets auto-created from file uploads are also pushed into the shared datasets store immediately, so every open tab sees the new dataset as soon as ingestion finishes.

Job mutation endpoints now documented

The public OpenAPI reference now documents the full set of job mutation endpoints alongside the existing GET /jobs and GET /jobs/{job_id}. The newly documented endpoints are run, complete, fail, request-cancellation, cancel, and reschedule, each with their request body schemas.The JobResponse state enum also gained the previously undocumented pending_cancellation value, which is returned by the request-cancellation endpoint while a job is winding down.

Jobs API pagination and filtering improvements

The GET /jobs endpoint now returns full pagination metadata alongside the existing records array. Responses include current_page, total_pages, and total_records, making it straightforward to build paginated UIs and iterate through large result sets. The change is additive — existing clients that only read records continue to work unchanged.Job listings can now be filtered by multiple state and type values in a single request, so you no longer need to issue separate calls per state or job type. The endpoint also enforces a maximum page size to keep responses predictable.Job responses now include the default data plane ID rather than returning null when no data plane is explicitly set, simplifying client logic that previously had to handle the missing-value case.

Jobs dashboard fixes: tab rendering, status filter, and data plane scoping

Three fixes to how jobs are listed and filtered in the dashboard.
  • Dataset Jobs tab renders correctly. Fixed an issue on the dataset detail page where the Jobs tab showed a blank table body and a large empty space even when jobs existed — the pagination control reported the correct count (for example, “1 to 1 of 1”), but the rows themselves were clipped to invisibility by a collapsed container. Job rows now render as expected.
  • Dataset Jobs tab shows jobs across all data planes. Fixed the dataset Jobs tab dropping jobs when viewing a dataset under a non-default data plane. Because a dataset is a global object, its jobs are now fetched by dataset_id only — independent of the selected data plane — so the tab consistently lists every job for the dataset. The standalone Jobs page continues to scope by data plane as before.
  • Jobs Status filter keeps all options visible. Fixed an issue on the Jobs page where selecting a value in the Status filter caused the other status options to disappear from the dropdown, making it impossible to switch to or add another status without clearing the filter first. The Status filter now always lists the full set of job states regardless of which option is currently applied, so you can freely change selections or combine multiple statuses.

Label Studio: build labeling projects from your datasets

Label Studio is a new studio for creating and running labeling projects against the datasets already in your platform, joining Prompt Studio, Classifier Studio, and LLM Studio under My Models.Create a project. Launch the builder from My Models → Label Studio → New and walk through four steps: pick the source dataset, choose the attribute whose values define your label taxonomy, configure how each row’s source input is presented for labeling, and give the project a name and optional description. The attribute picker lists every Rosetta Stone attribute in your workspace, grouped into Eligible (primitive attributes that define an enumerated set of allowed values — valid label taxonomies) and Not eligible (shown disabled so you can see why an attribute can’t be picked), with the allowed values previewed inline. If your workspace has no attributes yet, the step links straight to Rosetta Stone → Attributes so you can define one without leaving the flow. Hitting Create project provisions a label dataset in your currently selected data plane, seeds it with the distinct source inputs from your chosen attribute, activates the dataset, and drops you into the project workspace.Label your data. Each project opens into a dedicated workspace whose Label tab renders the labeling queue as a sortable grid — input string, assigned label, source, and labeled-at timestamp — with unlabeled rows surfaced first. A filter bar lets you toggle between Unlabeled, Labeled, and All rows, narrow to a specific class, and refresh from the server without losing staged work. Each row exposes a searchable inline dropdown bound to the target attribute’s allowed values, so the only labels you can assign are ones the schema already understands. Selections stage locally until you click Add Labels, which commits every pending change in a single atomic write; if the write fails, staged selections are preserved so you can retry without losing work. While a newly created project’s seed sample is still generating server-side, the grid shows a spinner and polls for completion.Track distribution. The Distribution tab shows what your labeled data actually looks like: KPI cards for Total Labels, distinct Classes, and an Imbalance indicator that highlights when the gap between your largest and smallest class crosses the threshold, plus a per-class bar chart and a donut chart splitting labels by source — human review, LLM-assisted labeling, and imports. Aggregations run server-side, and saving labels in the Label tab refreshes the distribution view automatically. A Train Model action in the workspace header becomes active once a project has accumulated enough labeled examples.Manage the lifecycle. Archiving a project from the Label Studio listing cascades the cleanup — the label dataset, the project’s seed, write, and distribution workflows, and its distribution materialized views are all removed, with success and failure toasts so you know the result. Opening an unknown or inaccessible project ID renders a friendly not-found state with a link back to the listing.

MCP server: better typo handling and broader fuzzy search coverage

The Narrative Model Context Protocol (MCP) server’s fuzzy matcher has been rewritten to align with the reference fuzzywuzzy WRatio algorithm, so search tools recover more reliably from typos, word-order differences, and partial substring matches. Each candidate is now scored on a 0–100 scale by combining four ratios — raw Levenshtein, token-sort, token-set, and a sliding-window partial ratio — with scaling and gating that mirror fuzzywuzzy’s defaults. Per-tool score thresholds have been tuned so legitimate near-matches (conversion against convesion_events3, edge vs edges, myAttributeName vs my attribute name) clear the cut while unrelated candidates do not.Fuzzy ranking now backs every MCP search tool, not just narrative_datasets_search and narrative_access_rules_search. The narrative_attributes_search, narrative_jobs_search, and narrative_context_search_companies tools all rank search_term against their primary text fields (name, display name, description, and similar) and return results ordered by descending match score. Tag, status, and data-plane filters continue to work as exact-match constraints alongside search_term. Queries longer than 200 characters are rejected up front to keep per-call latency bounded on large corpora. Reconnect your MCP client to pick up the updated tool descriptions.

Force-reschedule terminal jobs

POST /jobs/{id}/reschedule now accepts an optional body with a force flag. By default the endpoint remains a no-op for terminal jobs (Completed, Cancelled, Failed). Setting force: true reschedules the job even when it is in a terminal state, resetting it to Pending and clearing its executor so the operator re-dispatches it onto a fresh cluster — useful for re-running a job that already finished.The endpoint now returns a RescheduleJobResponse whose outcome field reports what happened (rescheduled or skipped_terminal) alongside the job’s current state. The body is optional, so existing callers that send no body are unaffected.

Rosetta AI Chat: redesigned chat surface, @-mention constructs, and artifacts sidebar

Rosetta AI Chat has been rebuilt end to end around how multi-step agent runs actually feel. The chat surface, message bar, transcript, and toolbar all moved at once, so the experience reads as a single coherent conversation instead of a stream of disconnected tool outputs.Live progress, grouped by round. Tool calls now render in-flight from the run’s live messages — you can watch each step of a Rosetta turn as it executes instead of waiting for the final answer. Related steps are grouped into round summaries with a unified progress component, so a multi-step investigation (chained dataset lookups, NQL refinements, knowledge base searches) reads as one coherent unit rather than a wall of individual tool invocations. The legacy “thinking…” placeholder has been replaced by this richer round-progress UI.@-mention datasets, attributes, and NQL. The message bar now supports typed constructs: press @ to mention a dataset (with a virtualized, filterable picker), an attribute, or an NQL query. Mentions render as inline chips in both your message and the transcript, and hovering one reveals a details popover so the agent — and you — can see exactly which object you meant. New conversations also surface a quick-action row (“Normalize Data”, “Create Identity Graph”, “Create an Audience”, “Classify Data”) that seeds the message bar with a starter prompt.Artifacts sidebar. Charts, tables, datasets, attributes, and other agent-produced objects are now split out of the transcript into a dedicated Artifacts sidebar, oldest first, so you can scan everything Rosetta produced during a conversation without scrolling back through the chat. References stay inline in the message where they were introduced; only the heavier produced artifacts collect in the drawer.Polish across the surface. Messages submit optimistically and animate in, agent responses fade between states, collapsed agent messages get a subtle bottom shadow so longer turns are easier to scan, and the chat container width, header, and conversation history have all been tightened to the redesign. A new per-message hover toolbar exposes message actions in place. Mobile gets dedicated layout and behavior tweaks so the chat works in narrow viewports.The legacy Rosetta “About” page has been removed in favor of this surface.
Week of June 1, 2026
APIAgent ConversationsBreaking ChangeBug FixComposable IdentityDashboardData StudioImprovementIntegrationsMarketplaceNew FeaturePlatformWorkflow DSLWorkflows

Rosetta AI Chat now runs on the Narrative MCP servers

Ask Rosetta AI Chat anything about your data or the Narrative platform — your datasets, attributes, NQL, access rules, security posture, or how to do something in the product — and get current, accurate answers grounded in the live state of your account.
Rosetta AI Chat — Hi! I'm Rosetta, your big data assistant. I can help you query, forecast, and buy data; build audiences; explain security policies; and use the Narrative platform.
Rosetta is also easier to find: it’s now a top-level entry in the side navigation, promoted out of the old Tools submenu.Why answers are better now. Rosetta AI Chat has been rebuilt on top of the Narrative Data Collaboration MCP server and the Narrative Knowledge Base MCP server — the same servers your team can connect to from Claude Code, Claude Desktop, Cursor, or any other MCP-aware client. Instead of running on a bespoke tool layer that only Rosetta could see, every question goes through the live MCP tool catalog: dataset, attribute, and access-rule lookups use the same fuzzy search and pagination, and how-to and platform answers ground against the live Knowledge Base instead of a snapshot embedded in the chat.Every new MCP capability shows up in chat for free. New tools, skills, and fixes that land on the MCP servers — workflow orchestration, access rules, dataset operations, NQL execution, schema-compatible tool input, persistent sessions, auto-auth, fuzzy search, and the rest of this month’s launches — appear in Rosetta the moment they ship. There is no longer a separate “chat backend” to keep in sync with what external agents see, so every investment in the MCP surface compounds across every Narrative-aware harness at once — Rosetta AI Chat, Claude Code, Claude Desktop, Cursor, and anything else you connect.The migration also fixes a class of session-lifecycle bugs: conversations are created server-side on the first message and their ids are adopted into the URL in place, so refreshing the page resumes the same conversation and in-flight responses are no longer cancelled by client-side navigation. The embedded Rosetta tab updates its path without remounting, keeping a single tab per chat instead of spawning a new one for every session.

Public /health endpoint no longer exposes infrastructure details

The public Open API /health endpoint now returns a detail-free response by default to avoid leaking infrastructure information (database hostnames, S3 bucket names, per-dependency error messages). Unauthenticated callers receive {"success": true|false} with the same 200 (healthy) or 500 (unhealthy) status code as before, so existing uptime probes, load balancer checks, and synthetics canaries that rely on the HTTP status keep working unchanged.To retrieve the full HealthCheckResult with per-dependency details, send the stage-specific secret in the X-Narrative-Health-Check-Secret header. The secret is stored in SSM at /${stage}/open-api/health-check/secret and can be rotated independently per stage. The internal API’s /health endpoint is unchanged, as it is only reachable through a private VPCE.

Rosetta AI Chat: playful thinking messages and richer tool call rendering

Rosetta AI Chat now keeps you company while it works. Instead of a single static “Thinking…” line, the chat cycles through a rotating set of short, on-topic loading messages that riff on what you actually asked — so a question about churn might surface “Churning the butter…” while a question about your budget might surface “Counting the beans…”. When Chrome’s on-device language model is available, the messages are generated locally and tailored to your prompt; otherwise the chat falls back to a curated set of generic messages. Nothing about your request leaves the browser to power the animation.Tool calls render more consistently as well. Every tool invocation now flows through a single, unified renderer, so MCP tool activity in the conversation looks coherent across the catalog rather than varying tool by tool. Submitting a message is also more responsive — your turn appears in the transcript optimistically the moment you hit send, instead of waiting for the server round-trip. And the previous cap on how many tool-call iterations a single Rosetta turn could take has been lifted, so longer multi-step investigations (chained dataset lookups, NQL refinements, knowledge base searches) can run to completion without being cut short.

Auto-titled agent conversations

Agent conversations now generate a human-readable title automatically on the first user turn. When you call POST /agents/conversations/{id}/runs on an unnamed conversation, the platform enqueues a one-shot, schema-constrained inference over the first user message and writes the result to agent_conversations.name — no extra request needed and no impact on the agent run itself (no extra messages, no version bump).Naming is idempotent: it only fires while name is null, and the underlying workflow rejects duplicate IDs, so retries and concurrent first runs converge on a single title. Once a conversation has a name — whether set by auto-titling or by an explicit update — subsequent runs leave it alone.Run responses now include a current_name field that reflects the conversation’s title at the time the run was observed, so clients can render the latest name alongside run state without a separate GET /agents/conversations/{id} round trip.

In-flight progress for agent runs

GET /agents/runs/{id} now streams an agent run’s progress while it’s still executing through a new live.messages field. As the agent loop produces each turn — tool calls, tool results, and intermediate model responses — it appends them best-effort so you can render activity in real time instead of waiting for the run to reach a terminal state.Live messages only appear while the run is non-terminal. Once the run finishes (or fails), the live entries are cleared and the committed message log under messages becomes authoritative, so live turns never get a sequence_no and never bump the conversation version. The streaming path is best-effort and never fails the run itself.

Compute pool lookups tolerate transient errors

Jobs running on compute pools no longer fail permanently when the compute-pool lookup hits a transient error. Previously, the AWS data plane operator collapsed every lookup failure — 5xx responses, timeouts, connectivity blips, and genuine 404s — into a single “compute pool could not be resolved (it may have been archived or does not exist)” failure, which terminally killed the job even when the pool was active the whole time.The operator now classifies lookup outcomes three ways: active pools dispatch as before, genuinely missing or archived pools still fail fast with the same actionable message, and transient errors (HTTP 429, 5xx, or connectivity/timeout) leave the job untouched so the next poll retries the lookup. The “could not be resolved” message is now only surfaced when the pool is actually gone, so it accurately reflects the situation when you see it.

Dashboard updates: dataset picker, refreshed logo, and Yahoo connector fix

  • Horizontally scrollable dataset picker. The dataset picker used across the Composable Identity builders — Edge Builder, Graph Studio input configuration, and Match Report Builder — now scrolls horizontally instead of squeezing its columns into the available width. The ID, Display Name, Unique Name, and Created At columns each render at their natural width and stay legible regardless of how narrow the surrounding panel is, making it easier to identify the right dataset when selecting first-party sources, graph inputs, or match report sources.
  • Refreshed Narrative logo. The Narrative logo has been updated across the dashboard. The new mark renders inline as an SVG, so it inherits the surrounding text color and stays crisp at every size — from the top navigation bar to compact in-app badges.
  • Yahoo connector shows all opt-out and PXID connections. Fixed an issue in the Yahoo DSP connector where some opt-out and PXID (partner match) connections were missing from the connector’s settings view. All existing opt-out and partner match connections now appear, so you can review and manage every connection tied to your profile.

Data Studio: interactive runs deliver previewable results

Clicking Run in Data Studio now produces a previewable sample on every data plane, including Snowflake Native App data planes where the Preview Results panel previously stayed empty. Behind the scenes, an interactive run is now submitted as a two-task workflow — CreateMaterializedViewIfNotExists followed by CreateDatasetSample — so the sample is orchestrated server-side and is guaranteed to exist by the time the run resolves. NQL is still pre-validated client-side, so the detailed error dialog continues to surface syntax and binding problems before any work is scheduled.The result dataset is still a temporary materialized view tagged _nio_interactive with a one-day retention policy, and still appears on the Queries page under Interactive queries. Two refinements make it easier to find:
  • Human-readable names and descriptions. When Chrome’s on-device model is available, Data Studio generates a display name and description for the result dataset from the NQL you ran. Generation is best-effort — unsupported browsers, an undownloaded model, or a timeout all fall back to the previous unnamed view, and the underlying dataset name stays a UUID so re-runs never collide with an existing view.
  • Refresh and auto-refresh on My Queries. Every tab on the My Queries page now has a refresh button, and interactive runs refresh the queries and datasets stores automatically when they complete. New runs show up in history without a page reload, and rows prefer the generated display name when one is present.

Datasets API: filter by data plane and tag

GET /datasets now accepts data_plane_id and tag query parameters so you can narrow the list without filtering client-side.
  • data_plane_id takes a single data plane UUID and returns only datasets stored on that plane.
  • tag is repeatable — pass it multiple times (e.g. ?tag=foo&tag=bar) to restrict results to datasets carrying any of the given tags. Unknown tag values return a 400 instead of a server error.
Both filters compose with the existing q keyword search and pagination parameters.Two improvements to the Narrative Model Context Protocol (MCP) server and its marketplace surface.
  • Narrative Conversations API snippet on MCP server pages. MCP server detail pages in the marketplace (/marketplace/mcp-servers/[slug]) now include a Narrative Conversations API option in the Configuration section, alongside the existing third-party client snippets for Claude Code, Cowork, Claude Desktop, ChatGPT, and Codex. The new option shows the defaults.mcp_servers fragment to drop into an Agent Conversations API request, with the selected server expressed as { alias, url, description } — the array shape the Conversations API expects, which is distinct from the mcpServers object used by the Claude harnesses. The alias, URL, and description are derived from the listing you’re viewing, so you can copy the snippet directly into a request without leaving the platform. Other defaults fields (such as model, data_plane_id, and execution_cluster) are elided as ... since they’re out of scope for adding a server. Claude Code remains the default-selected snippet.
  • Fuzzy matching for dataset and access-rule search. The narrative_datasets_search and narrative_access_rules_search tools now use token-aware fuzzy matching instead of plain substring matching, so agents recover gracefully from typos, word-order differences, and minor morphological variation (e.g. edge vs edges, myAttributeName vs my attribute name). Each candidate is scored on a 0–100 scale using a Levenshtein-derived combination of token-sort and token-set ratios, weighted across fields. For datasets, search_term now ranks against name, display_name, and description; for access rules, it ranks against name and description. Results are returned ordered by descending match score, and matches that don’t clear a per-tool score threshold are dropped. Tag and data-plane filters continue to work as exact-match constraints alongside search_term. Reconnect your MCP client to pick up the new tool descriptions.

Platform updates: credit limit enforcement and interactive query routing

  • Credit limit enforcement on usage-producing endpoints. Endpoints that start usage-producing work on Narrative-owned data planes now check the company’s credit limit before running. POST /nql/run, POST /openapi/model-inference/run, POST /agents/conversations/{id}/runs, and the workflow run and trigger endpoints reject requests with HTTP 403 and an RFC 7807 Company Credit Limit Exceeded response when the company has no credit account or has exceeded its limit. Runs targeted at customer-owned data planes are unaffected. If your account is blocked, reach out to your account manager to restore access.
  • Interactive queries open in Dataset Details. Clicking an interactive query on the Queries page now opens it in Dataset Details instead of Data Studio. Interactive queries are temporary materialized-view datasets with no editable query to load, so routing them to Data Studio produced an error. They now land on the dataset’s NQL tab, which shows the originating query. As part of this fix, the Queries page was rebuilt around the standard object browser pattern, with one tab per query type, live counts in the tab headings, and type-aware row actions (datasets offer both Dataset Details and Data Studio; access rules, forecasts, templates, and views continue to open in Data Studio).

RecalculateStatistics workflow task

You can now refresh a dataset’s column statistics from within a workflow using the new RecalculateStatistics task. This is useful after a step that loads or modifies data — for example, chaining it after an ExecuteDml task so downstream consumers see up-to-date statistics without a separate manual trigger.Specify the target dataset by either datasetId or datasetName (exactly one), with an optional computePoolId to control where the job runs. The dataset must already have a statistics configuration. The task waits for the recalculation to complete and outputs totalRows and columnCount, which downstream tasks can reference via export.as or ${…} expressions.

Cancel workflow executions via API

You can now cancel a running workflow execution through the public API. Two endpoints are available: POST /workflows/{workflowId}/cancel cancels the currently running execution of a workflow, and POST /workflows/{workflowId}/runs/{runId}/cancel cancels a specific run by its run ID.The run-level endpoint is the recommended option because it guarantees that only the intended execution is cancelled. Cancelling by workflow ID alone is subject to a race condition where the targeted execution finishes and a new one starts before the server processes the request, which would cancel the new execution instead. Both endpoints return 204 No Content once the cancellation request has been accepted.In addition, subscriptions can now be cancelled through POST /subscriptions/{subscriptionId}/cancel. Cancelled subscriptions cannot be reactivated.

Reference datasets by ID in workflow tasks

Workflow DSL tasks that operate on a dataset now accept either datasetId or datasetName, giving you more flexibility when wiring tasks together. Previously, datasetName was required.This applies to the RefreshMaterializedView, CreateDatasetSample, and CreateRosettaStoneMappingsIfNotExist tasks. Use datasetId when an upstream task outputs a dataset id (for example via export.as), or continue using datasetName when referencing a known dataset by name. Exactly one of the two must be supplied.
Week of May 25, 2026
APIBug FixComposable IdentityDashboardData StudioDeprecationImprovementIntegrationsNew FeaturePlatform

Composable AI Marketplace

Compose AI agents that work with your data — without writing custom code — by combining prebuilt building blocks from a single marketplace.
Narrative Marketplace landing page — Easily build agents that work with your data. Skills, models, apps, and MCP servers. Everything you need in one place.
Open /marketplace to browse and install skills, models, apps, MCP servers, data plane providers, and licensed datasets. Whether you want Rosetta AI Chat to draft an NQL query, Claude Desktop to build an identity graph, or an internal automation to activate an audience into Facebook, you assemble it from the same catalog instead of stitching infrastructure together yourself.Six catalog kinds, browsable from the new landing page and via the Browse all menu entry:
  • Models — the LLMs available for inference. Claude Opus, Sonnet, and Haiku via Bedrock on the Narrative Cloud data plane at launch, with additional providers reachable through other data planes.
  • Data Plane Providers — where workloads run. Narrative Cloud (first-party, auto-installed for every company) and Snowflake at launch. Each provider page lists its available models and the compatible app connectors that link to its app detail page.
  • MCP Servers — what AI agents can do with your data. Three always-available remote HTTP servers ship at launch: Narrative Data Collaboration (mcp.narrative.io, OAuth), Knowledge Base (docs.narrative.io), and Agent Feedback (narrative.support). Each detail page lists the available tools and a copyable client configuration you can paste into Claude Code, Claude Desktop, Cursor, or any other MCP-aware client.
  • Skills — harness-agnostic, prebuilt agent workflows (writing NQL, generating identity graphs, applying Rosetta Stone mappings, etc.) that orchestrate the MCP servers on top of your data. Filter by plugin, search published skills, and open a detail page showing Specifications, Dependencies, and Installation. Eight skills at launch. See Installing skills.
  • Apps — the connectors and integrations (Facebook, Google Ads, Snowflake, S3, The Trade Desk, TikTok, Pinterest, and more) that activate audiences and move data into and out of the platform. Rebuilt around typed app manifests, with search, sort, filter, and a unified Install / Launch flow.
  • Data — third-party datasets a data owner makes available through a Narrative access rule. Queried with NQL rather than installed: each detail page shows a copyable SELECT … FROM companySlug.ruleName snippet, a Schema table, the Rosetta Stone attributes the dataset surfaces, and CPM pricing inline. Access-gated — listings only appear when the active company can query the underlying rule.
Skills and MCP Servers are cross-linked: each skill lists the servers it requires under Requires MCP Servers, and each server lists the skills that depend on it under Used by Skills — so you can navigate between related listings without guessing.

List agent conversations

The Agent Conversations API now supports GET /agents/conversations to fetch a paginated list of the calling user’s conversations, newest first by created_at. Results are scoped to both the bearer token’s company_id and user_id — peers in the same company cannot see each other’s conversations.The endpoint uses the standard page / per_page query parameters (default per_page is 50) and returns the usual paginated envelope with prev_page, current_page, next_page, total_records, total_pages, and records. Callers with no conversations get an empty records array rather than a 404. Access requires the agent_conversations:read permission.

Structured outputs for agent runs

Agent runs now expose the model’s final answer through two mutually exclusive fields, removing the prior requirement that every caller-supplied output_format_schema declare a top-level text: string.On status: completed, the GET /agents/runs/{id} response populates exactly one of:
  • final_text — the plain-text answer, used when the caller did not supply an output_format_schema (text mode).
  • final_structured_output — a JSON object conforming verbatim to the caller’s output_format_schema (structured mode). The shape is whatever the caller defined — oneOf, extraction results, nested objects, etc. — with no top-level text field required or implied.
Previously, runs with custom output schemas that didn’t include a top-level text field failed post-inference with AgentLoopSchemaDecodeFailed. Existing text-mode callers see no change: final_text continues to be populated as before, with final_structured_output set to null.

Compute pools: default on registration and copy identifier

Two improvements to the compute pools surface.
  • Default compute pool on company registration. New companies are now provisioned with a usable compute target the moment registration completes. Every non-B2B register flow creates a private, x-small AWS EMR compute pool on the Narrative data plane and pins it as the company-level default for that data plane. Jobs that don’t pin a pool explicitly — and have no dataset-level or data-plane default to fall back to — now resolve to this seeded pool instead of failing with “no compute pool configured”. You can rename, archive, or replace the default at any time. B2B registration is unaffected since it maps to a pre-existing configured company.
  • Copy Identifier action. The Compute Pools tab on the Data Plane detail page now includes a Copy Identifier action in each row’s kebab menu, letting you grab a compute pool’s UUID without opening the Edit drawer. This matches the existing copy-identifier affordances on data planes, datasets, jobs, and workflows.

Marketplace polish: Home discovery, Data catalog fix, and standalone apps cleanup

Follow-up polish to the Composable AI Marketplace launched earlier this week.
  • Home page Browse Apps for zero-install users. Logged-out visitors and fresh tenants now see a Browse Apps row of up to eight marketplace apps on the Home page, alongside the Get Started cards. Cards link to each app’s marketplace listing, and a Browse all apps button routes to /marketplace/apps. Once you have at least one installed app, Home flips back to the installed-Apps section with Launch buttons. The View all apps button in the installed-Apps section now also routes to /marketplace/apps. Tab titles are now distinct: /apps reads Installed Apps and /marketplace/apps keeps Apps.
  • First-load fix for the Data catalog. Fixed a race condition that could cause the Marketplace Data catalog to render empty on a cold first load even when you had accessible products. The store backing accessible access rules now waits for the API service to initialize before fetching, so the catalog populates correctly on first paint without requiring a refresh. The fix also covers auth-state transitions (such as View As switches) that re-trigger service initialization.
  • Deprecated standalone apps removed. Legacy standalone apps already replaced by native Platform UI experiences are no longer accessible from the dashboard. This includes Touchless PII Hasher, Data Studio for Buyers, Data Studio for Sellers (Access Rules and Data Streams), and Shop Builder (Quick Start, Settings, and Site Pages). All functionality is available directly in the Platform UI — update any bookmarks pointing at /touchless-pii-hasher/hash, /buy/buyer-studio, /sell/access-rules, /sell/data-streams, or /shop-builder/* to the corresponding Platform pages.
  • Launch lineup mention. Five public-domain Data listings ship at launch: The Movies Dataset, US state polygons, German PLZ → lat/long, German PLZ polygons, and Germany polygon.

Match Report polish: builder, listing, and viewer

Polish across the Marketplace Match Report flow shipped earlier this month.
  • Automatic sample data for Graph Builder and Match Reports. Datasets created from the Graph Builder and Match Report builders now kick off a sample-generation job automatically as soon as the underlying workflow completes. Sample data is available immediately after the build finishes, so you can start exploring results without manually triggering a sample job. The Match Reports list and detail pages also now surface the sample job status alongside the workflow status, and handle the edge case where a workflow fails after the dataset has already been created — so partially built reports are still discoverable and recoverable.
  • Supplier access rule filtering and Match Report builder polish. Fixed an issue where eligible supplier access rules were filtered against their backing datasets’ Rosetta Stone mappings instead of the access rules’ own mappings — suppliers that exposed graph edge mappings through their access rules are now correctly listed. Access rule details now include a Mappings section showing the Rosetta Stone attributes and properties exposed through the rule, the supplier steps in the builder were retitled to Supplier Identity Access Rule and Supplier Enrichment Access Rule, and access rule names now fall back to a sensible default when missing.
  • Listing improvements. The Marketplace Match Reports listing page loads faster and only shows reports that are ready to view. The page no longer issues redundant requests for in-progress workflow runs, and reports backed by incomplete dataset outputs are hidden until they finish processing — so the reports you see are always ready to open.
  • Viewer refinements. The Marketplace Match Report viewer now focuses on the report itself: the NQL and Metadata tabs have been removed so the Report view is the single landing surface for evaluating a supplier match. The listing’s Dataset ID column links straight to the dataset details page with a tooltip clarifying the destination. Reports built on older, unsupported tag versions now show a clear error message instead of attempting to render, and Match Report builds tag the dataset with a schema version (_nio_ci_match_report:0.1) so future viewer updates remain backwards compatible with existing reports.

MCP server: auto-auth, persistent sessions, workflow tagging, schema compatibility, and access-rules fix

Five improvements to the Narrative Model Context Protocol (MCP) server.
  • Auto-authenticated MCP in agent conversations. Agent conversations now automatically authenticate to Narrative’s own MCP server. When mcp_servers[].url on a conversation points at https://mcp.narrative.io/mcp (or the dev equivalent), the platform mints a short-lived API token for the calling user and company and attaches it as a Bearer credential on every tools/list and tools/call issued during the run. Agents can now use the full Narrative MCP toolset — datasets, attributes, NQL, workflows, jobs, access rules, and the rest — without you needing to manage API tokens or wire authentication into your client. Public MCP servers outside the Narrative allowlist continue to be called unauthenticated. The minted token lives only for the duration of the in-flight HTTP call and is never persisted, returned in API responses, or logged.
  • Persistent MCP server sessions. The MCP server now persists sessions across reconnects, so AI assistants no longer have to re-bootstrap a fresh session on every request. Sessions are keyed by a hash of the bearer token and stored in the marketplace database with the bound Narrative API token encrypted at rest using a dedicated KMS key. Subsequent requests rehydrate the existing session, preserving the user’s selected company context across reconnects and process restarts. Server-minted API tokens are also refreshed automatically when they’re within five minutes of expiry, so long-running agent conversations no longer fail with token-expired errors mid-flight. Caller-provided API tokens remain pass-through and are not refreshed.
  • Auto-tagging for MCP-created workflows. Workflows created through narrative_workflows_create are now automatically tagged with created_by_mcp_server. The tag is appended to any tags an agent supplies (preserving their order) and is not duplicated if the agent already includes it, making it easy to identify and filter workflows that were authored by AI assistants.
  • Tool schema compatibility. Tool input schemas now use only the JSON Schema subset that Anthropic, Bedrock, and Cortex all accept — definitions that previously included unsupported keywords (such as $ref/$defs, oneOf, numeric minimum/maximum, string pattern/maxLength, or non-whitelisted format values) could be rejected with HTTP 400 by direct MCP clients like Claude Desktop, Cursor, and the Anthropic Messages API. All registered tools have been migrated to the safe subset, and a per-tool cap of 24 optional parameters (Anthropic’s limit, counted across nested objects) is now enforced by tests so future tools cannot regress. Reconnect your MCP client to pick up the new schemas.
  • Implicit-share access rules describe fix. Fixed a parsing error in narrative_access_rules_describe when describing rules of type implicit_share. The upstream GET /v2/access-rules/{id} endpoint omits dataset_ids for implicit-share rules, which previously caused the MCP client to fail decoding the response. The field is now optional and renders as _none_ when absent or empty.

Model Inference messages now use content blocks

The Model Inference RunRequest API now uses a structured content array on each message instead of a flat text string. Each content block is one of text, tool_use, or tool_result, so multi-turn conversations involving tool calls round-trip through the API without being flattened to prose. Responses always emit the new shape, and the assistant role is now accepted alongside system and user.The legacy { "role", "text" } request shape is still accepted for backwards compatibility — the API auto-canonicalizes legacy messages into a single text content block — but new integrations should send content blocks directly. See the updated RunRequest schema for examples.

Redesigned side navigation and Home page

The dashboard side navigation has been restructured to surface the most-used destinations directly. The Tools group is gone — Rosetta AI Chat is now a top-level entry, Secret Sharing has moved under Settings, and the collapsible Installed Apps sub-menu has been replaced with a single top-level link to a new /apps page that lists only the apps you have installed. The new order is Home → Installed Apps → Rosetta AI Chat → Rosetta Stone → My Data → My Models → My Audiences → Marketplace → Settings.The Home page has been redesigned to match the marketplace pattern. A new Get Started section offers three entry points into Normalize, Marketplace, and Explore, and an Apps section below it shows your installed app manifests as launchable cards. The Apps section is hidden when you have no installations, so fresh tenants land on a focused Get Started view.

Skill detail pages: arguments, examples, and npx skills install

Skill detail pages in the Marketplace now document each skill’s slash-command arguments and offer a faster install path. The Specifications section renders an Arguments table — Argument, Required / Default, and Description — for every skill that accepts flags, and each skill’s example prompts have been updated to show those arguments in use (for example, /write-nql --dataset 123 --run --limit 50 …). Skills without arguments hide the table.The Installation section now leads with the skills CLInpx skills add narrative-io/narrative-skills-marketplace — as the default install option, with the existing Claude Code /plugin commands available from the harness picker.Also in this release: added an Agent Conversations resource (Read + Write) under Query & Analytics in the API key create and edit drawer, and improved the resource label fallback so resources not yet in the SDK’s label map display as title case.

Bug fixes

  • Compute pool provider must match the data plane platform. Creating a compute pool now fails fast when the pool’s provider does not match its data plane’s platform — for example, a Snowflake pool targeting an AWS data plane, or an AWS EMR pool targeting a Snowflake data plane. Previously these mismatches were accepted and could silently be elected as defaults, surfacing only as runtime operator failures at job dispatch. The check runs at create time; provider type cannot drift afterward because ComputePoolUpdate has no externalId field.
  • AWS data plane job cancellation. Resolved two issues in the AWS data plane operator that could cause running jobs to be cancelled unexpectedly shortly after dispatch. The iteration-tail idle-cluster reaper now accounts for steps submitted earlier in the same iteration, so a cluster that just received fresh work is no longer terminated based on a stale snapshot showing only completed bootstrap steps. Additionally, operator-managed clusters are now segregated by deployment stage, preventing dev and prod operators running in the same AWS account from treating each other’s pending steps as orphans. Jobs running on EMR compute pools should no longer surface the “cancelled without a jobs-API cancellation request” failure caused by these races.
  • Snowflake SELECT struct/array results. Fixed an issue where NQL SELECT jobs against Snowflake-backed datasets returned struct and array columns in an unexpected shape. SELECT job results now use the same Spark JSON converter as the rest of the platform, so nested values are serialized consistently with other query and export paths.
  • Edge Builder dirty-state. Fixed an issue in the Edge Builder where existing graph edge mappings were incorrectly flagged as “dirty” on load, enabling the save controls even though no changes had been made. Hydrating a saved mapping now correctly reflects its persisted state, including nested object attributes that were previously normalized inconsistently.
Week of May 18, 2026
APIAgent ConversationsBug FixComposable IdentityDashboardData StudioImprovementIntegrationsNew FeaturePlatform

MCP server: workflows, access rules, and API token auth

The Narrative Model Context Protocol (MCP) server gained three significant expansions this week, broadening the agent surface from data exploration into orchestration and marketplace navigation.

Workflow and data plane tools

Five new tools let agents enumerate data planes, create workflows from YAML, and track their runs end-to-end:
  • narrative_data_planes_list / narrative_data_planes_describe — enumerate data planes accessible to the active company and describe one or more by id.
  • narrative_workflows_create — submit a workflow from a YAML specification with optional trigger_immediately, schedule_immediately, and tags.
  • narrative_workflows_describe — fetch one or more workflows by id; opt into include=["specification"] only when you need the full YAML.
  • narrative_workflows_list_runs — list a workflow’s runs with cursor pagination.
The recommended flow is data_planes_list → workflows_create → workflows_list_runs.

Access rule tools

Two new tools let agents discover and inspect access rules:
  • narrative_access_rules_search — search rules the active company owns or has been granted, with composable AND filters on search_term, exposed_attribute_names, tags, dataset_ids, company_ids, owned_only, and shared_only. At least one filter is required.
  • narrative_access_rules_describe — describe one or more rules with a selectable include= set (metadata, mappings, nql, schema, collaborators, pricing).
To reference a rule in NQL, use <owning_company_slug>.<access_rule_name>.

API token authentication

The MCP server now accepts opaque Narrative API tokens in the Authorization: Bearer header, alongside the existing Stytch OAuth JWT path. This enables server-to-server and scripted MCP clients to connect without a browser-based login flow. See Connecting to the Narrative MCP Server for the updated auth flow.

Agent Conversations API launch

Narrative now exposes a public Agent Conversations API for driving multi-turn LLM agent loops directly from your applications. A conversation is a long-lived container with a pinned system_prompt and a defaults block — model, data plane, max iterations, tools, and an output JSON schema — that every subsequent run inherits and can override per call.

Endpoints

Available under /agents:
  • POST /agents/conversations / GET /agents/conversations/{id} — create and inspect a conversation.
  • POST /agents/conversations/{id}/runs — start an asynchronous run with a user_message, or resume a paused run with tool_outputs. Runs use client_op_id for idempotency and expected_version for optimistic concurrency.
  • GET /agents/runs/{id} — poll a run through pending → running → completed | requires_action | failed. Response echoes effective_config, submitted_inference_job_ids, pending_tool_calls when paused, and final_text on completion.
  • GET /agents/conversations/{id}/messages — retrieve the transcript with assistant content blocks and tool calls. Supports since for incremental fetches.

Tool routing

The API uses a single routing rule: the dash in the wire name decides where a tool call goes.
  • MCP-resolved tools keep their {alias}-{name} wire form. The platform discovers each mcp_servers[] entry’s catalog at run start via the JSON-RPC tools/list method, so adding, removing, or changing a tool on the server is picked up automatically — no API change needed.
  • Caller-answered tools are declared as top-level tools[] entries with a bare, dash-free name and no alias. When called, the run pauses at status: requires_action; respond with a follow-up run carrying payload.kind: tool_outputs.
  • tool_choice accepts the bare name plus mcp_alias when pinning an MCP tool ({ "kind": "specific_tool", "mcp_alias": "docs", "name": "search_kb" }), or just name for caller-declared tools.
Access is gated by the new agent_conversations permission (read for the GET endpoints, write to create conversations and runs).

Composable Identity: builder, viewer refresh, and consistent pickers

A coordinated upgrade across the Composable Identity surfaces.
  • Match Report builder. A new guided builder at My Data > Reports > New report walks you through Source → Supplier → Match Identifiers → Supplier Enrichment → Finalize, generating the workflow that materializes a Marketplace Match Report — no hand-authored YAML required.
  • Viewer visual refresh. The Match Report viewer now uses a consistent card-based layout, with new breakdown cards for identifier-type summaries and identity enrichment.
  • Object Browser pickers. Dataset and access-rule selection across Composable Identity now uses the Object Browser, replacing the legacy dropdown.
  • Graph builder fix. Third-party source ID types are no longer grouped with first-party sources when constructing Label Connected Components arguments — graphs combining first- and third-party data now produce correct connected components.

Compute pool admin controls: delegated management and configurable timeouts

Compute pools gained two operator-grade controls this week.
  • Delegated management. Data plane owners can now grant other companies the right to create, update, and archive compute pools on a shared data plane via the new manage_compute_pools field on DataPlaneCollaborators. Previously any participant could provision pools just by being listed in participants; that permission is now governed separately, so owners can keep participation broad while restricting who may stand up infrastructure. Rights are re-evaluated on every call — revoking manage_compute_pools immediately removes a collaborator’s ability to mutate pools they previously created.
  • Configurable EMR timeouts. aws_emr pools now accept two optional knobs on the provider payload. idle_timeout_seconds overrides EMR’s AutoTerminationPolicy and the operator-side idle reaper (default 15 min, 0 disables auto-termination, range 60s–7d). job_execution_timeout_seconds caps how long a single job’s EMR step may stay in RUNNING before the operator cancels it (no enforcement by default, range 60s–7d). The shared Narrative pool ships with a 1-hour cap; pools you own can pick their own limit. Orphan steps left after an operator crash are also detected and cancelled on the next iteration.

Native Sources page in Data Studio

The My Data > Sources page has been rebuilt natively in the platform, replacing the legacy embedded experience. The page now loads faster, matches the rest of the platform UI, and exposes source management directly without an iframe wrapper.From the new page you can:
  • Browse your configured sources in a unified listing with an empty state for first-time setup
  • Create a new managed S3 bucket source from the New Source dialog, with inline validation of bucket configuration
  • View per-source authentication and configuration details in the auth config panel
Companies are currently limited to a single managed S3 bucket source; the New Source action is disabled with a tooltip once that limit is reached.

Per-route Open Graph previews

Links shared from the platform now render section-aware previews in Slack, Discord, iMessage, Twitter, LinkedIn, and other unfurling clients. Each route — Marketplace, Workspace, Rosetta, Connector, Rosetta AI, and the default app shell — resolves to a brand-aligned Open Graph image generated on the fly, so a shared Marketplace link no longer shows the same artwork as a Workspace or Rosetta AI link.The change wires og:image, og:url, og:title, and the matching Twitter card tags reactively for every page, with a worker-default image as a fallback for first paint. No action is required from you — existing links pick up the new previews automatically the next time they are re-scraped by a sharing client.
Week of May 11, 2026
APIBug FixDashboardData StudioDeprecationImprovementIntegrationsNQLNew FeaturePlatform

Compute pools: company defaults, self-service on shared planes, and aws_emr polish

Three changes broaden compute pools into a real multi-tenant primitive.
  • Company-level default. A new tier in the resolution chain — job-specific → dataset default → company default → data-plane default — covers operations with no dataset analog (model training, inference, healthchecks). Managed via PUT/DELETE /company/{id}/data-planes/{dpId}/default-compute-pool[/{poolId}], scoped per data plane.
  • Participants can create pools on shared data planes. POST /data-planes/{id}/compute-pools now permits any company allowed by dataPlane.collaborators, not just the owner — unlocking self-service compute on the Narrative-hosted data plane. Pool ownership stays with the creator; update/archive remain governed by strict pool ownership.
  • aws_emr create polish. external_id is now optional for the aws_emr provider (the server fills it in). AWS data planes never auto-promote the first pool to the data plane default — this is now the permanent steady state, not a migration-period restriction.

Installations API pagination and lookup

The public GET /installations endpoint now returns a paginated response and accepts page (1-based, default 1) and per_page (default 100) query parameters. Responses include currentPage, nextPage, prevPage, totalRecords, and totalPages alongside the records array. The App Invites list endpoint has been aligned to use the same page and per_page parameters in place of the previous page_number and page_size, and its response now includes the same pagination fields.A new GET /installations/{id} endpoint returns a single installation by ID for the authenticated company, and POST /installations now explicitly requires a user access token — app installation tokens and app client credential tokens are rejected with a 403 response.The private GET /companies/{id}/installations and POST /companies/{id}/installations endpoints are deprecated in favor of GET /installations and POST /installations.

Redesigned Marketplace Apps listing

The Marketplace Apps directory has been rebuilt around typed app manifests, giving you a faster, more consistent way to discover and launch apps.The listing page now supports search, sort by name or developer, and filtering — making it easier to find the right connector or app in a growing catalog. Each app card surfaces the publisher, a short description, and a primary Install or Launch action that adapts based on whether the app is already installed.Selecting an app opens a dedicated detail page with richer merchandising content, and installing an app now opens a permissions sidebar so you can review what the app will access before granting approval. Native apps and external apps share a unified launch flow, so opening an installed app behaves consistently across the marketplace.

Marketplace Match Report viewer

You can now view and interpret Marketplace Match Reports directly in the platform. The report viewer visualizes how your identity data overlaps with a third-party supplier, helping you evaluate supplier fit before committing spend.The viewer displays:
  • Identity Enrichment — a left-to-right flow showing your starting identifiers, which ones matched the supplier, and the net-new identifiers gained
  • Key Performance Metrics — headline KPIs including match rate, ID enrichment multiplier, and IDs per person
  • Demographic & Behavioral Enrichment — attribute-level distributions showing how the supplier characterizes your matched customers
Navigate to Identity Resolution > Marketplace Match Report and select a report to view it. Reports can be shared via link.For a detailed walkthrough of every section and the math behind each metric, see Viewing a marketplace match report.

MCP server: NQL tools and clearer dataset sample hints

The Narrative Model Context Protocol (MCP) server gained NQL execution and a smaller polish that removes a common agent confusion.
  • NQL tools. Three new tools — narrative_nql_validate, narrative_nql_run, and narrative_nql_get_job — let agents validate, submit, and poll NQL queries (including CREATE MATERIALIZED VIEW) without leaving the chat interface. Both _run and _get_job accept optional data_plane_id and compute_pool_id overrides. Recommended flow: validate → run → get_job.
  • Empty-sample hints. narrative_datasets_describe now distinguishes between a dataset with zero records and one whose sample simply hasn’t been requested yet. The rendered sample section appends either // dataset has no records yet or // no sample has been requested yet. Call narrative_dataset_request_sample to request one. so agents know what to do next.

Tool use in Model Inference

Model Inference on AWS data planes now supports tool use through the runModelInference SDK call and the RunModelInference workflow task.You can define tools the model is allowed to call and control how it selects them:
  • tools — a list of tool definitions, each with a name, description, and JSON Schema input_schema. Tools default to strict mode, which constrains sampling to match the input schema exactly.
  • tool_choice — controls tool selection: auto (model decides), any (model must call some tool), or specific_tool (model must call the named tool).
When the model invokes tools, the job result includes a tool_calls array (each with an id, tool name, and arguments) alongside a stop_reason that mirrors Bedrock’s Converse values (end_turn, tool_use, max_tokens, stop_sequence). The existing structured_output field is now optional and is omitted when the model stops to call a tool instead of producing a final response.The change is backward compatible: requests without tools behave exactly as before.

Bug fixes and enhancements

  • NQL UNION ALL usage collection — Fixed an issue in the NQL compiler where UNION ALL queries only collected field usages from the first branch of the union. Usages from subsequent branches were dropped, which could cause downstream graph edges and access checks to be incomplete.
  • AI-assisted mapping reliability — Fixed a validation error that could cause AI-powered features — including mapping generation, column normalization, dataset descriptions, and retention policy suggestions — to fail when the underlying model returned a discriminated-union response.
  • Dataset detail page reactivity — Fixed a bug where statistics, record counts, and last ingestion time on the dataset detail page could display stale values after the underlying data updated.
Week of May 4, 2026
APIBug FixImprovementIntegrationsNew FeatureWorkflow DSLWorkflows

Run NQL on AWS EMR compute pools

AWS data planes can now execute NQL jobs on Amazon EMR Spark clusters provisioned as compute pools. The compute pools API supports a new aws_emr provider type with a configurable size (x_small through 6x_large) that targets the equivalent Snowflake warehouse’s memory budget on EMR. Sizes x_large and above use EMR Managed Scaling so clusters expand and contract with load. Pair this with the existing context selector to direct NQL workloads to right-sized Spark clusters within your AWS data plane.

Claude Sonnet 4.6 and Opus 4.6 in Model Inference

Model Inference on AWS data planes now supports Anthropic’s Claude Sonnet 4.6 (anthropic.claude-sonnet-4.6) and Claude Opus 4.6 (anthropic.claude-opus-4.6). The new models are available wherever existing Claude models are accepted, including the runModelInference SDK call and the RunModelInference workflow task. Structured output via JSON Schema works the same as on prior generations. See Supported Models for the full list.

GenerateSample workflow task

You can now trigger sample-data generation for a dataset directly from a workflow with the new GenerateSample task. This is useful when you want to refresh sample data after a dataset is created or updated by an earlier task in the same workflow — for example, immediately after a RefreshMaterializedView step.The task takes a datasetName (and optional executionCluster) and outputs the generated sample’s datasetId and rowCount, which can be referenced by downstream tasks via export.as or ${…} expressions.

Dataset stats fixes

Two fixes to the dataset stats API:
  • Correct routing for Iceberg datasetsGET /datasets/{id}/stats now consistently routes by data plane: Iceberg datasets read from real Iceberg snapshots, while Snowflake datasets continue to read from synthetic stats history. Previously, when stats history rows existed for an Iceberg dataset, those synthetic values were served instead of the correct snapshot data.
  • Integer overflow for large cardinalitiesapproxCountDistinct and countDistinct values are now represented as 64-bit integers (int64) end-to-end, fixing an overflow that caused truncated values for columns with more than ~2.1 billion distinct values.

Expanded MCP server tooling

The Narrative Model Context Protocol (MCP) server gained a richer toolset and a clearer naming convention for AI assistants. All tools now use the narrative_* prefix (previously nio_*), and dataset and attribute tools follow a consistent ${entity}s_search / ${entity}s_describe pattern so assistants surface a recognizable namespace.

New tools

  • narrative_datasets_search and narrative_datasets_describe — find datasets by name, description, or tags, and fetch details with a selectable include= field set: metadata, schema, mappings, sample, stats, column_stats_config, retention_policy, and nql (defaults to metadata and schema).
  • narrative_attributes_search and narrative_attributes_describe — explore Rosetta Stone attributes by name or fetch full details for one or more attributes by id.
  • narrative_dataset_get_column_stats and narrative_dataset_set_column_stats_config — read per-column statistics and configure which columns have stats collected. Pass include= to opt into expensive payloads such as histograms; they are off by default to keep responses cheap on wide columns.
  • The existing narrative_context_* tools continue to list and switch the active company.
*_describe tools accept multiple ids per call and execute upstream fetches in parallel, with configurable concurrency and a per-request id cap to keep latency predictable.

Breaking changes

  • datasets_get_schema has been replaced by narrative_datasets_describe. Clients should switch to the new tool name and pass dataset_ids (array) instead of dataset_id (string); schema is still returned by default, so existing schema-only flows work with the swap.
  • The earlier access_rules_* tools have been removed. Use narrative_datasets_search / narrative_datasets_describe and narrative_attributes_search / narrative_attributes_describe to navigate datasets and attributes; equivalent access-rule functionality will return as part of the consolidated tool set.
  • Reconnect any MCP clients that have cached the older nio_* tool names.
Week of April 27, 2026
APIBug FixComposable IdentityDashboardImprovementIntegrationsNQLNew FeatureWorkflows

Data Collaboration MCP Server

Narrative now ships a remote Model Context Protocol (MCP) server, letting AI agents like Claude explore datasets, kick off queries, refresh materialized views, and manage your Narrative account — all from a single conversation. The server exposes an initial set of tools for listing the companies you have access to, switching the active company for a session, and retrieving dataset schemas, with more tools to follow.Authentication uses a standard OAuth authorization flow: the MCP client opens a browser-based login, and the server exchanges the resulting credential for a scoped Narrative access token via the new POST /authentication/exchange-mcp-token endpoint. The endpoint returns the user’s profile, an access token for the default company, and the full list of accessible companies so assistants can offer company-switching without a separate lookup.To get started, see Connecting to the Narrative MCP Server.

Connected Components workflow task

The connected components algorithm — the backend of Graph Studio identity resolution — is now available as a standalone workflow task that runs on both AWS and Snowflake data planes.
  • Full cross-platform support. Identity graph building now works on AWS data planes alongside Snowflake, so you can resolve identifiers against data in either environment.
  • Observable, composable jobs. What was previously a single opaque graph-building operation is now broken into multiple independent NQL jobs. Each step is individually observable, making it easier to debug and monitor progress — and avoiding timeouts on large datasets that could stall a single monolithic query.

Multi-company switching

Users who belong to multiple companies can now switch between them directly from the platform header without needing admin privileges. This lets you manage datasets, workflows, and other business objects across different companies from a single account, rather than being locked to one company at a time.

Graceful session expiry handling

The platform UI now handles session timeouts proactively and reactively. Before your session expires, a Session expiring dialog appears with a live countdown and gives you the option to Stay signed in (which extends the session) or Log out immediately. If a request fails because your session has already expired, the UI now redirects you cleanly to sign in again instead of surfacing opaque authentication errors.

Updates to Jobs management screen

The Jobs page received several improvements to make it easier to monitor and investigate job activity:
  • Server-side pagination. The table now loads rows page-by-page from the server, removing the previous 100-row cap so you can browse your full job history.
  • Dataset column. A new Dataset column shows which dataset each job reads from or writes to, so you can scan job activity without opening individual rows.
  • Workflow search and filtering. Search by workflow_id or workflow_run_id to narrow the table to a specific workflow run, or use the new Workflow Enqueued status filter to see only workflow-created jobs.
  • Copy Job JSON. A new row action copies the full job record to your clipboard as formatted JSON for debugging or sharing with support.

Updates to Workflow management screen

The Workflows page received several improvements to bring it into parity with the Jobs page:
  • Data plane scoping. The Workflows list now filters to the data plane selected in the context selector, with status chip counts reflecting only the visible workflows.
  • Live run durations. The Duration column now ticks every second while a run is in flight, matching the live behavior already used on the Jobs page.
  • Auto-created datasets default change. Datasets created through automatic flows (e.g., file uploads) no longer derive metrics by default, avoiding unnecessary computation.

Clearer NQL DML error messages

NQL INSERT, UPDATE, DELETE, and MERGE statements now return more descriptive error messages when the target dataset is invalid. Instead of a generic “invalid table name” response, you now get specific feedback explaining the problem—whether the dataset wasn’t found, isn’t owned by your company, isn’t a regular dataset (for example, a view, materialized view, access rule, or subscription dataset), or isn’t Narrative-managed.INSERT, UPDATE, and DELETE errors also include a hint reminding you to reference the target dataset by name, since referencing it by id is a common mistake that’s not supported for these operations.

INSERT INTO … SELECT in NQL

NQL now supports populating a dataset with rows selected from another table using INSERT INTO ... SELECT. You can read from datasets and views owned by your company, including subqueries and joins, making it easier to copy and transform data between your own datasets in a single statement:
INSERT INTO company_data.target_dataset (id, name)
SELECT id, name FROM company_data.source_dataset WHERE created_at > '2026-01-01'
For safety, source tables are restricted to datasets and views owned by the caller’s company. Access rules and rosetta_stone tables are not valid sources, and UPDATE and DELETE continue to require that any referenced table is the target table itself.

Bug fixes

  • Context selector popover alignment. Fixed an issue where the context selector popover could be cut off or misaligned on smaller viewports.
  • Dataset name resolution in Jobs table. Dataset names now render correctly for jobs referencing datasets beyond the first cached page of results.
Week of April 20, 2026
APIDashboardData StudioImprovementNQLNew Feature

Access rules API now returns attribute mappings

The Access Rules V2 API now includes a mappings field in every access rule response. This field lists the Rosetta Stone attributes that are mapped to columns selected by the rule, along with the specific attribute properties exposed. Mappings are filtered by the caller’s attribute viewing permissions, so each organization sees only the attributes they have access to. Read more →

Run data plane health checks from the dashboard

You can now trigger a data plane health check directly from the Data Planes list page and the Jobs page. On the Data Planes list, each row’s action menu includes a new Run health check option. The Jobs page header adds a dedicated action button that enqueues a health check against the currently selected data plane. Both entry points provide toast feedback with the enqueued job ID so you can track progress.

Exchange token endpoint for switching company scope

Added a new POST /authentication/exchange-token endpoint that lets an authenticated user exchange their current access token for a new one scoped to a different company they have access to. The request accepts a companyId and returns a fresh login response (access token, legacy token, and session cookies) for the target company, making it easier to build multi-company workflows without re-authenticating.The /whoami response now also includes an accessibleCompanies field listing every company the caller can switch into, so applications can discover valid targets for exchange-token without a separate lookup.

Granular DML row statistics

DML job results now include a detailed breakdown of row-level changes. In addition to the existing affected_rows count, the Jobs API response now returns inserted_rows, updated_rows, and deleted_rows for each completed DML operation. Materialized view refreshes also report these granular row statistics when available, giving you clearer visibility into exactly what changed during each data operation.The Jobs API response also includes a new operator_type field that indicates the underlying execution type used by the data plane, decoupled from the user-facing job type.

NQL ARRAY_POSITION function

NQL now supports the ARRAY_POSITION function, which returns the zero-based index of the first occurrence of an element in an array. If the element is not found, or if the search value is NULL, the function returns NULL:
SELECT ARRAY_POSITION(ARRAY('john', 'jack', 'jill'), 'jack')
-- 1
This is useful when you need to determine where a specific value appears within an array column. Read more →

Tab overflow menu and company switch cleanup

The tab bar now includes an overflow menu that appears after your open tabs, giving you quick access to Close all tabs and Close other tabs actions. The menu is hidden when only the Home tab is open, keeping the interface clean.Additionally, switching between companies now automatically clears your open tabs and navigates you to the home page. Previously, switching companies would reload the current URL in the new company context, which could display tabs referencing records from the previous company.

View datasets

You can now create view datasets by passing create_as_view: true in your NQL CREATE MATERIALIZED VIEW requests. A view dataset acts as a logical layer over your existing data — instead of materializing and storing a full copy, it defines a reusable query that references source datasets directly.View datasets are ideal for creating curated, read-only perspectives on your data without duplicating storage. When a view dataset is referenced in a query, its underlying NQL definition is automatically expanded and resolved inline.Notable behavior for view datasets:
  • No connections — view datasets cannot have connectors attached, since they don’t store data independently
  • No access rules — access rules cannot be created on top of view datasets
  • No billing — queries that create view datasets are not billed, as no data is physically materialized
  • No forecasting — row-count forecasts are skipped for view dataset queries
  • Compatible NQL subset — view datasets do not support MERGE, DELTA, PARTITION BY, or chunking strategies
Week of April 13, 2026
APIDashboardImprovementNew Feature

Classifier Studio

You can now build and train classifiers directly from the platform with the new Classifier Studio, available under My Models alongside LLM Studio and Prompt Studio. A guided builder walks you from dataset selection to a running training job without leaving the UI:
  • Dataset & label selection — pick a dataset in your current data plane and choose the label column from its primitive-typed columns (string, boolean, double, long, timestamptz).
  • Feature configuration — select dataset columns as features and assign a feature type (text, categorical, numeric, count vectorizer, or embedding); the builder suggests types based on column schema and exposes per-type parameters with sensible defaults.
  • Algorithm configuration — choose between Logistic Regression and Random Forest, tune algorithm-specific hyperparameters, and configure your test/train split (test size, random state, stratification).
  • Finalize — name and version your model, add tags, confirm the data plane, and review the full configuration summary before kicking off training.
The builder supports inline edit and remove actions on every step, streamlined dropdowns for algorithm and feature selection, and a toast notification on training success with a direct link to track progress in Jobs. For a full walkthrough of every module and action, see the Classifier Studio interface reference.

App loading screen

The platform now displays a branded loading screen while your workspace initializes. Instead of seeing a blank page or partially loaded interface, you get a smooth visual transition with an animated progress indicator as data planes, installed apps, and configuration load in the background. The loading screen also reappears naturally when switching between companies, providing a consistent experience during context changes.

Dataset connector compatibility check

You can now check whether a dataset’s schema is compatible with installed connector interfaces using the new dataset compatibility API. The endpoint validates your dataset schema against all connector interfaces available through your installed apps, returning a list of compatible and incompatible interfaces with detailed validation errors.Filter results by interface tags to quickly find connectors relevant to your use case. This helps you understand which connectors can work with your data before setting up a delivery, reducing trial-and-error when configuring data pipelines.
Week of April 6, 2026
APIBug FixComposable IdentityDashboardImprovementNQLNew FeaturePlatform

Dataset statistics now include Rosetta Stone attributes

Dataset statistics now include Rosetta Stone normalized attributes alongside native columns — cardinality, distributions, completeness, and approximate distinct counts on normalized values are visible in the same statistics view. Available on Snowflake data planes today, with AWS support coming soon. Read more →Histograms are now off by default for new datasets, with a limit of 16 histograms per dataset. New Snowflake datasets automatically receive a default statistics configuration, and historical statistics are now stored for trend analysis. Snowflake only — AWS support is in development.
Breaking change: Existing datasets without a statistics configuration will return an error when clicking Update Statistics. Create a configuration via the Statistics Configuration API or the dataset settings UI.

Edge Builder improvements

The Edge Builder now supports using individual leaf properties from object-mapped attributes as target IDs — select specific properties like value, full_name, or city from complex attributes such as hashed identifiers or addresses. A new edit mode lets you modify existing graph edge mappings without starting over: update source IDs, add or remove target ID groups, and review a summary of pending changes before applying.

Data plane health checks

A new POST /data-planes/{id}/health-check endpoint validates that your data plane infrastructure is correctly configured. For AWS data planes, this includes verifying cross-account trust relationships and IAM permissions. When a health check detects that a compute pool’s backing resource no longer exists, the system automatically archives the pool and re-elects a new default.

Jobs API idempotency

Terminal state transitions in the Jobs API are now idempotent — completing, failing, or cancelling a job that is already in a terminal state returns a successful response instead of an error.

Bug fixes

  • Fixed Rosetta AI chat and chat message views not scrolling when conversations exceeded the visible area
  • The dataset statistics refresh button now updates record count and size alongside column statistics
  • The statistics API no longer fails when a Rosetta Stone attribute’s type references another attribute by ID
  • value is no longer treated as a reserved word in NQL, fixing mapping expressions like id.value

Previous Release Notes

Q1 2026

January – March 2026

Q4 2025

October – December 2025