Skip to content

September 2026

  • A “what if this input changed” question now comes back with a written answer, not just a table of numbers. Asking what happens downstream if a cost pool rises returned the figures and a list of notes, leaving you to work out which results the change reaches directly, which ones only move as a consequence of those, and which carry no figure at all — and the notes were written for whoever was reading the raw response, naming internal fields you never see. The answer now opens by saying how much of the change it can account for and across how many results, then lists the results the change reaches directly with each one’s share of the change you applied. Results it could measure only in part, and results it could not measure at all, get their own sections rather than sitting unmarked in the same list. A result it could not measure is named and left without a figure, because the honest answer there is that the amount is unknown, not that it is zero — and anything further downstream of it is missing from the answer entirely, which the answer tells you. Results that only move as a consequence of another are listed separately and marked as already included in the figures above, so they are never added on top. Where the change cannot be followed at all — most often because the table you asked about is used as a driver rather than as a pool of money to split — the answer leads with that reason and points you at the driver scenario tool instead. Every figure comes from the same calculation as before, and none of them changed. See How the Assistant Stays Honest.

  • Xero joins the native ERP connectors. Connect a Xero organisation in one click — sign in, approve the grant, pick the organisation, and you’re done; there’s no developer account, client id, or client secret to obtain, and PlaidCloud keeps the connection authorized from then on. A Xero: Import Entity step pulls eleven Accounting API entities — chart of accounts, contacts, invoices, credit notes, payments, manual journals, bank transactions, items, tracking categories, tax rates, and currencies — narrowed by status, a date range, and a modified-since cutoff, with no query to write. A Xero: Post Document step posts manual journals, invoices, bills, payments, and credit notes back from a header and lines table, in any mix within one batch, with a test mode that validates every document before anything posts and an idempotent write path that never posts a re-run document twice. Where an outcome is ambiguous, a document is only reported posted once Xero confirms it in a settled state — anything else is held for you to resolve rather than guessed at. Every attempt lands in ERP Post History alongside your other ERP posts. See Connect to Xero.

  • Salesforce reads into PlaidCloud as a native connector. Connect a Salesforce org with a client id and secret from an External Client App — no certificate to manage and no interactive login — and Test Connection reports what those credentials actually reach: the organization id, the API version, and the Run As user every row and field will be scoped to. A new Salesforce: Query Object step extracts any standard or custom object into a project table over Salesforce’s Bulk API. The object list and the field list are read from the org itself, each field shows the type it will really land as before you save, and a field type that cannot be landed honestly — a compound address or geolocation, a file blob, an encrypted or polymorphic field — is marked unusable with the reason and the component fields to tick instead. Narrow the extract at Salesforce with field-and-operator filter terms, and name the window a run is loading — on a scheduled step, from a workflow variable such as {period} — so each window is read once and re-running it says plainly it already collected that window instead of quietly pulling it twice. See Connect to Salesforce.

  • Oracle HFM/FCCS self-serve extract. Pull ad-hoc data slices from Oracle Financial Consolidation and Close (FCCS) directly in a workflow. Connect with a service account, pick a point of view (Scenario, Year, Period, Entity, Account, and more) from metadata-driven selectors, and get a result table back — no ticket to the HFM team. Repeat slices are served from cache, the landed table is row-level-security-ready, and any slice can be promoted to a scheduled recurring load. See Connect to Oracle HFM/FCCS.

  • Self-serve extracts from SAP ECC and S/4HANA land typed, not just text. Search SAP by what you already know — a table, a transaction code, or a saved SAP Query — and pick from a table’s fields with SAP’s descriptions, with its key fields filled in, or see a transaction’s or query’s own selection screen as a Filters tab, built from the parameters and select-options SAP defined for that object, before you build anything. The table extract fills in columns and the primary key from SAP’s data dictionary, offers SAP’s own value help for filters, and lands every column with its real SAP type: dates, exact decimals with currency amounts shifted to their true value, integers, floating-point and decimal-float columns, and UTC timestamps to the second, or as fraction-preserving ISO text for the longer SAP timestamp types. A column too large for its decimal type lands as text instead, and a column whose SAP type changes replaces the whole table — either way with a warning naming the column. Its bounding filter grid takes an Include or Exclude row per column, any of ten comparisons — equals, not-equals, greater than, greater than or equal, less than, less than or equal, between, not-between, and pattern match — a range, and several values per column; excluding a range, a not-between filter, pattern matching, and more than one condition on the same column need the current PlaidCloud SAP package on the agent’s SAP system, and an older package still runs simple equals, inequality, and range filters on either an Include or an Exclude row. The extract can also run incrementally, reading only rows at or after a date or UTC timestamp watermark. Two more steps run a transaction or report program — with its selection screen as the filter form, a dropdown of the object’s saved SAP variants that fills the form from a variant’s stored values and lists beside it any of those values it couldn’t carry over, defaulted by SAP instead, and amounts landed as numbers — and run a saved SAP Query, with its own selection screen as filters and amounts, integers, and dates landed typed. Everything else lands as text. The table, transaction, and query steps each preview sample rows, show a plan of how the run goes and anything that would stop it, and list the SAP authorizations the object needs for your Basis team. The general-purpose Call SAP RFC step now types a table result from the function’s own field definitions, and adds a Parquet file output alongside JSON and delimited text. Extracts run through a PlaidLink agent and the PlaidCloud SAP package, under SAP’s own authorization checks on the RFC user. See Ad-Hoc Extracts from SAP ECC / S/4HANA.

  • IBM TM1 / Planning Analytics connector. Read cube data or a dimension hierarchy straight from a TM1 server in a workflow — connect over TM1’s REST API (Native or CAM authentication), then run a saved cube view or write MDX, with a point-of-view slice to pin dimension members beyond what the query already fixes, or load a TM1 hierarchy’s elements and parent/child structure directly into a PlaidCloud dimension. Cube, view, and dimension names are discovered live from the connected database, and a preview shows the first rows and a cell count before you save a cube query. Because TM1 has no change tracking, a point-of-view member can be pinned to a {period} workflow variable instead of a literal name, so a scheduled workflow pulls one period at a time and builds up history incrementally. A dimension load refuses, rather than silently drops, a TM1 element that sits under more than one parent — a PlaidCloud dimension can’t represent that — and flags any consolidation weight it can’t carry as a plain rollup sign. PlaidCloud calls TM1’s REST API directly by default, so the server needs a network path it can reach — a public endpoint, an allowlisted IP, or a VPN — but a cube query can also run through an installed PlaidLink agent for a TM1 server that’s only reachable from inside your own network. See Connect to TM1.

  • Oracle Essbase connector. Run a live MDX query against an Essbase cube and land the result grid in a table, or load a dimension outline into a PlaidCloud dimension. Essbase: Query Cube now runs against Oracle’s MDX query endpoint, with correct column headers, alias handling, and restricted-cell handling — a restricted (#NoAccess) or otherwise unparseable cell now raises a clear error instead of silently landing as text. Member and alias labels in results are now deterministic, drawn from the alias table configured on the connection rather than a per-session default — if you relied on the old session-default aliasing, you may see different label text now. Row Limit now defaults to 250,000 rather than “unlimited” — an extract exceeding the effective limit is refused, naming the count and the cap, rather than run unbounded; raise Row Limit explicitly for a legitimate larger extract. Test Connection is now available for Essbase connections, alongside TM1 and HFM/FCCS. A new Essbase: Read Dimension step loads a dimension outline into a PlaidCloud dimension, refusing by name — rather than silently mis-loading — a hierarchy it can’t represent: shared members, label-only members, Dynamic Calc members, attribute dimensions, an unrepresentable consolidation operator, or an outline with more than 5,000 total outline members. See Connect to Oracle Essbase, Essbase: Query Cube, and Essbase: Read Dimension.

  • Anaplan connector. Read from Anaplan over its own Integration API — cloud-direct, and read-only: nothing is ever written back. Anaplan: Read View reads a saved view exactly as it was saved, with no row, column, or page selection of any kind — build a different saved view in Anaplan to read a different slice — and lands each column with its declared Anaplan type when the view puts Line Items on its columns axis, or as text (with a warning) otherwise; a number Anaplan renders ambiguously is refused rather than guessed at, and one that does parse lands at full precision. Anaplan: Read Export runs a pre-existing Anaplan export action — the API can’t create one — and lands every column as text, since the field Anaplan publishes to declare an export’s column types can’t be trusted. Anaplan: Read List reads one or more Anaplan lists into a PlaidCloud dimension in a single step, root list first, with access-control flags and list subsets left out and every edge rolling up as a plain addition; a list that can’t be represented as a clean hierarchy — a duplicate ID, an unresolvable or conflicting parent, a colliding property name — is refused by name before anything lands. Connect with an Anaplan username and password, or with a CA certificate and its private key for an automated, scheduled connection — Anaplan’s own multi-factor authentication applies to signing in with email and password, so certificate authentication is the non-password option. Because Anaplan’s request budget is shared across every integration on your tenant, stagger Anaplan workflow schedules rather than running them all at once. See Connect to Anaplan.

  • Import a named range or a cell range from Excel. The Import Excel step can now read a workbook-defined named range or a specific cell range (Sheet1$A1:J100) as an alternative to reading a whole worksheet, and you can mix worksheets, named ranges, and cell ranges within the same import. The sheet picker lists named ranges alongside worksheets, so selecting one works the same way as selecting a sheet. A named range that refers to more than one disjoint area, or a cell range that’s out of bounds or inverted, is rejected with a clear error instead of being imported wrong. See Import Excel.

  • A workflow run can post live, simulate, or skip its ERP posting steps. Every run carries a posting mode, chosen when you start it. Live posts exactly as it always has. Simulate has every ERP posting step build and validate exactly what it would post, then commit nothing and never contact the ERP — the would-post entries land in ERP Post History marked simulated, so you can review them before running live, and clear them independently of real posts. Off skips posting steps entirely. A project also carries its own posting mode cap, which any member with write access to an unlocked project can set, and a run’s effective mode is always the more restrictive of the two — a project capped to Simulate stays simulated no matter what mode the run is started with. A sub-workflow, a macro, a model or loop run, and a run you resume after a stop all inherit their parent run’s mode, so a simulated run can’t post for real anywhere inside itself. SAP posting, attachment, and RFC steps don’t dry-run — under Simulate or Off they’re skipped outright, since SAP’s own test flags still open a real connection. See Choose a Posting Mode.

  • The Posting Register gives finance and accounting one docked workspace to review ERP postings across every project — and to act on them in bulk. A tenant-level console, outside any single project, opens to an exception queue of the postings most likely to need attention — in doubt, unconfirmed, pending, or failed — aged against the platform’s own timers rather than a guess, shown as live count tiles, with simulated postings excluded and counted on their own. A navigation rail down the left opens each screen — postings, simulated, exceptions, approvals, delegations, roll-up, trends, control totals, lineage, exports and alerts, and AI assist — as a pane in place, so moving between screens no longer stacks floating windows. Along the top, a scope bar of pickers lets you choose a project, connection, or entity by name from a scoped list rather than typing an identifier; state is a multi-select, the active scope stays on screen, and you can bookmark it as a shareable deep link or keep a saved view. The grid lists every posting you’re permitted to see, and from it you can select in bulk — ticking rows, or matching everything the current filter finds across every page — preview the impact first, then clear simulated postings or retry only the ones the ERP rejected or never received, with a high-value action asking you to type the affected amount before it unlocks. A detail drawer docks on the right so the list stays visible, and its new Journal tab reads a posting the way an accountant would: debit and credit lines by account, only the columns each ERP actually captures, each line’s dimensions or worktags beneath it, and a per-currency balance check that never blends currencies or rounds an out-of-balance posting to zero. In the exception queue the arrow keys walk from posting to posting with the drawer following, so a full triage pass needs no mouse. Every amount renders as an accounting figure — thousands separators, negatives in parentheses, each currency’s own decimal places, uncaptured money left blank rather than zero, and a group spanning more than one currency split into a row per currency instead of a blended total. AI Assist turns a plain-language question into the register’s own filters and adds proactive cards and per-posting advice, all computed live over your own grants. Reversal runs from the drawer or the API, with segregation-of-duties approval routed to every qualified approver through an approvals inbox, bounded delegation, and escalation; a whole intercompany run reverses at once, tied to zero per currency and matched into pairs. Trends break failure rate and latency down by connection or ERP type, Lineage drills a posting back to the run that produced it and out to its document in the ERP, and Control Totals give each batch a balanced, imbalanced, or indeterminate verdict with the reason attached. Exports and alerts download the register as CSV or JSON — masked unless you hold the top security tier — and schedule a recurring delivery or an alert on a failed post, an aging authorization, or a reversal. Closing a period seals its postings into a permanent, immutable snapshot, sealed automatically each day. Four security scopes — view, operate, approve, and admin — govern who can open the console and what they can do inside it, and the console hides the rail entries and buttons a caller lacks the scope for rather than only disabling them, mirroring what the server enforces. Visibility follows your existing connection and project grants, so a reviewer only ever sees postings they were already entitled to see, and the register strips personal-identifier fields, withholds the ERP’s own business key, and never lets a dimension or worktag value leave in an export, digest, or comment. See Review the Posting Register.

  • Weave reports what it could not check, not just what it found. Weave reads the configuration your project has already saved — allocation column mappings, workflow structures, the expressions on a transform step — and reports the problems it finds in one voice: “Weave noticed …”. It also has a third answer that most checks do not. When you create an allocation step, PlaidCloud lets you save it before its column mapping is filled in, because you are still building it; a monitor reading that same empty mapping would report the step as healthy. Weave says “Weave hasn’t checked …” instead, with the reason, and never counts, sorts or colours an unchecked step as one that passed. It gives that same answer wherever judging would mean guessing: an expression reading a variable that each workflow sets differently is reported unchecked, rather than risk calling a working expression broken. Each report opens with its own denominator — how many of the project’s steps and workflows it checked, out of how many there are — and names separately what it has no rule for at all, saying plainly that those have not been judged either way. So a clean result can never be read as a clean project. No AI model is involved: every check is a fixed rule and every sentence is written in advance, so a report costs nothing however often you ask for one. The findings are reachable through the platform API; the notifications panel that will show them inside PlaidCloud is separate work. See What Weave Checks.

  • AI agents connected over MCP get ready-made task starters. An agent client that supports MCP prompts now offers PlaidCloud’s own starters as a menu — Import a CSV file into a table, Explain a cost change, Debug a failed workflow, Explore project data — so you pick the task instead of describing the sequence of steps it takes. Importing a CSV changes the most: give the document account by name and the file by name or path, and the import finds them, creates the table with the columns and types read from the file, and loads it, in one step — no account identifier and no column list to supply. It reads delimited text only; an Excel workbook or a Parquet file is rejected rather than misread. Naming the folder keeps the search to it and is worth doing on a large account. Where a name matches more than one thing it asks which you meant and lists the candidates rather than guessing; where it cannot find the file it lists the nearest names and says how much it searched. See Task Starters.

  • Loading aliases, properties or values into a dimension now refuses rows that name a member the dimension does not hold. A Dimension Load, or a bulk load from a table or data frame, used to store an alias, property or value against any name it was given, whether or not that member existed — attributes nothing could reach, which a later copy or export then carried along. The load now checks every row’s member before it writes anything, and if any are missing it fails with the names, so the load either lands in full or not at all. Setting a single member’s alias, property or value already refused an unknown member; the bulk loads now match. See Loading and Unloading Dimensions.

  • A cost-trace answer that may be reporting a part-loaded period now says so before it gives the figure. Where a change is the same size as the shortfall in rows between the two periods being compared, the answer cannot tell a real movement from a period that has not finished loading, and it has warned about that since it learned to measure it. The warning came after the figure, though — and the opening line is the part built to be forwarded, the part a reader stops at. Cut any of these answers at its first comma and what travelled was a movement stated to the cent with nothing to suggest it might not have happened. The line now opens “this may not be a change at all” and gives the figure after that. The rating beside the figure has moved too. It read “attribution is medium confidence”, which rates how the change was divided up and never whether it occurred — but sitting in brackets against two currency amounts, readers given only that line took it as a verdict on the number itself, and “medium confidence” on a figure that may be an artefact is not a medium-confidence answer. It is now a sentence of its own at the end, naming what it covers and stating plainly that whether the change happened is not rated. Three smaller things go with it. Where several recombined branches all moved the same way, that agreement is no longer left reading as corroboration: a short load pulls every branch down together, so branches agreeing is exactly what the shortfall itself produces, and the line now says so where it says they agreed. The instruction at the end names the period to check and which end of the comparison is short — it used to say “check the later one”, which could have meant the period, the table, or the load — and where the comparison is between two versions or scenarios rather than two periods, it names both sides rather than one. And where part of the change could not be attributed, the sentence reporting how much is left over now carries the warning’s own condition, because quoted on its own it read as a settled amount and undercut the warning above it. An answer carrying no such warning reads exactly as before, and no figure changes. See Analyze Allocations With an AI Agent.

  • Asking what drove a change now searches for the field that best explains it, on every workspace. Where you don’t name a field to break a change down by, the answer looks for the one that best accounts for it — naming its largest member and how much of the move sits there. That search was switched on per workspace and was off nearly everywhere, so most readers got a pool-level answer with no leading factor named, and nothing on the page said a search had been available to ask for. It now runs everywhere. Nothing else about it changes: where nothing it tried explains the move well enough to report, it still says so and offers the closest thing as exactly that, rather than picking something. The separate search over combinations of fields — a move confined to one region and one product line — remains switched on per workspace and is unchanged. No figure changes. See Tracing Allocations.

  • A cost-trace answer about a table that recombines several branches now carries its rating, and the part it could not account for, in the line built to be forwarded. That first line gave the combined move and a count of which way the branches went — “across 4 recombined branches, 2 rose and 2 unattributable” — and stopped there. Nine lines below, the same answer rated itself low overall and reported that the branch figures shown accounted for $12.2m of a $25.1m change. Forwarded on its own, which is what that line is for, it read as a clean 59.2% growth story; and “2 unattributable” reads as two branches too small to measure, when in this case they were the larger half. The line now states the rating, in the same words an answer about a single figure has always used, and says what the branches it did attribute leave unaccounted for. It gives the amount left over rather than the amount covered, because readers shown only the covered figure took away “about half was explained” and stopped there. An answer whose branches all reported reads exactly as before, as does one already rated high — the rating is stated only where it is below high, as everywhere else on the page. No figure changes. See How the Assistant Stays Honest.

  • A cost-trace answer’s year-over-year verdict now tells you how fast the same figure grew the year before. The verdict compares this period’s move with last year’s in currency, so a figure that grew 14.7% after growing 31.2% — less than half the pace — is reported as “normal in size”, and the earlier rate appeared nowhere on the page. Readers given such an answer came away with “normal, business as usual” when the story was a marked slowdown. The answer now adds one sentence stating what the earlier move was as a percentage of where that period started: “The 2024 → 2025 move was 31.2% of that period’s opening level.” It deliberately does not put the two rates side by side. The percentage beside the verdict compares amounts, not rates, and setting the two rates next to it invites dividing one into the other for a different answer than the one printed — so this period’s rate stays where it already is, at the head of the line. Given the new sentence, readers describe the period as decelerating rather than normal. The verdict itself is unchanged and no figure changes. See Analyze Allocations With an AI Agent.

  • A cost-trace answer that names a leading factor beside a concentrated member now says the two are different cuts of the same change. A step line can carry both: the factor behind the move — the pool the figure is drawn from moved, rather than this slice’s share of it — and then the member the move sits in, one branch at 70% of it. Both are right, and they split the change on different axes, one between the factors that produced it and one between the members it landed on. Read left to right they look like competing answers to one question, and the more specific one wins: readers given only the page took “the pool total fell” and “one branch is 70% of it” as a contradiction and picked one. An answer that already breaks a conserved pool down by member said the two were separate measurements, and that is the one shape it was stated in — so an answer narrowed to one line of business, entity or programme said it nowhere, which is exactly where the factor named is most often the pool total. Those answers now say it once, under Honest limits, and only where a step line carries both statements and nothing else on the page already says it. No figure changes. See How the Assistant Stays Honest.

  • A cost-trace answer’s year-over-year verdict now says what it is a verdict about. The word came first and the thing it judged came several clauses later — “YoY: normal — 62% the size of last year’s move in absolute terms” — so a reader scanning the line stopped at “normal” and took it as a verdict on the whole answer. It rates one thing only: how big this period’s change was against the last one’s, in currency. It says nothing about whether the money went where it should have, and nothing about the confidence in the rest of the answer. The verdict now carries that scope on the word itself — “YoY: normal in size” — the way it already did where the two periods moved in opposite directions, and it carries it on the shorter forms of the line too, including the one that withholds the percentage because the multiple is too large to read. This tells you what was weighed; it weighs nothing new, and no figure changes. See Analyze Allocations With an AI Agent.

  • A cost-trace answer that names a leading factor now says that figure is not a share of its member list. The answer gives the factor a percentage of the change — “the shift in this slice’s share of the pool … explains 73% of the move” — and prints, below it, a member list that accounts for the whole of the same change. Both are right, and that is what sends a reader hunting: the two are cuts of one change on different axes, one between the factors behind it and one between members, and neither is part of the other. On one tax model a reader chasing the 73% through four accounts at 55.6%, 23.9%, 12.7% and 7.8% found no combination of them that made it, because there is none. The list now says so above its rows, so it travels with them when they are copied out. It appears only where the factor percentage is under 100% — at 100% there is no remainder to go looking for — and where the rows shown account for the whole change; a list showing only the largest movers already says its rows do not add up. No figure changes. See Analyze Allocations With an AI Agent.

  • A cost-trace answer narrowed to one member now says whose change its list of movers breaks down. That list is the part of an answer most likely to be copied out whole, and it was headed by the breakdown alone — “All movers by account” — while the whole table’s change on the same column is printed above it. So the last scope you passed on the way down named the wrong population, and the rows below it did not add up to the figure above them. Nothing about that looks wrong: the rows are exact and they add to the narrowed change exactly, so reconciling from the top gives a self-consistent wrong answer with nothing to prompt a second look, and each member’s share of the wider move comes out wrong by whatever the rest of the table did. The heading now names the narrowing, between the breakdown and the column the rows are ranked on — “All movers by account within entity=EU_DIST”, “All movers by branch within lob=COMMERCIAL — net_contribution”. It reads within rather than for because the breakdown is often by account, and “by account for entity=EU_DIST” is read as the verb before it is read as the scope. An answer covering the whole table reads exactly as before, and no figure changes. See How the Assistant Stays Honest.

  • A cost-trace answer narrowed to one member now says where the rest of the table moved the other way. The answer already prints the narrowed change and, beside it, how the whole table moved on the same column — and left the subtraction between them to you. On one tax model a line was up $3,834,183.58 inside a table up $3,196,800.00, which means everything outside that line came down $637,383.58; on an insurance model a line was up $4,650,016.11 inside a book down $23,755,719.72. Both are the same story — the line gained share in a pool going the other way — and both read as ordinary growth to anyone who did not do the arithmetic. Where the movement outside the narrowed rows runs against them, the answer now states its amount and direction and names the column it belongs to. Where it runs the same way, which is the ordinary case, nothing is added. Both figures it is drawn from are printed above it, so the arithmetic can be checked on the page. No figure you already see changes. See How the Assistant Stays Honest.

  • A cost-trace answer covering several value columns now offers a next step where it had none. Its list of movers breaks one column down by member, while the other columns are reported for the slice as a whole — so what the page cannot tell you is what a single member did across every column: which branch took most of the funding-charge fall, and what its interest income did at the same time. On an answer whose only other content was findings, that left the page ending with nothing to run. It now suggests narrowing to one member of the list — the heading above the rows names the field they are cut by — and says the rows above cover one column. Where the answer already offers to narrow for a stronger reason, it keeps the offer it had. No figure changes. See Analyzing Allocations with AI.

  • A cost-trace answer whose upstream table is written by more than one step no longer offers to attribute the change to one of them. Where two steps write the same table the answer stops there and asks you to pick one, listing each step with the id to paste. The offer read as a way to get that step’s own number. It is not: picking a step decides which one the trace follows in, and where the steps’ rows overlap the figure that comes back covers all of them — which the answer’s own limits already said, and is why it would not pick a step for you. The offer now says what running it does, and the line describing that step of the trace states that more than one enabled step produces the table rather than that one of them might have. No figure changes. See Analyzing Allocations with AI.

  • A cost-trace member list cut by more than one field now says when every row it shows sits on the same value of one of them. Ask why a figure moved and you can have the change broken down by more than one field at once — account and sales document, say. Where the list shows only its largest rows, every one of those rows can land on the same account, so one of the two fields you asked for does no visible work and nothing said so — and on one model all twenty rows did, while other accounts existed. A reader could not tell whether that was the only account or merely the one with the biggest single rows, and those point at opposite next steps: the first says the account question is settled and the story is in the documents, the second says the rest of the movement sits on an account this list never reached. The list now names the constant field and its value, says which field the rows do differ in, and says that rows are ranked one at a time — so movement spread across many small rows does not reach a list of the largest. A list whose rows genuinely span its fields gains nothing, and a complete list is unchanged: there a single value is a fact about the data rather than an artefact of the ranking, and there is no unshown remainder for another value to sit in. No figure changes, and this says nothing the line sizing the shown rows against the whole change already says. See Analyzing Allocations With AI.

  • A cost-trace answer covering several value columns now says when those columns did not move at anything like the same rate. Ask why a figure moved on a table that reports several columns at once — revenue alongside cost, income alongside the charges deducted from it — and the opening line says which way the other columns went. On one automotive model the three columns moved 0.2%, 4.1% and 38.0%, and that line gave the leading column’s 38.0% and then said only that the other two were down. It is the line most likely to be forwarded on its own, and a reader given it alone came away believing every column had fallen by something like that much, when one of them had barely moved — a wrong size, not a vague one, and it points at a different problem and a different conversation. Where the column the answer leads on has moved several times further than the rest, the line now adds that the others moved by much smaller percentages; where the rates are far apart but the leading column is not the outlier, it says only that they differ. Columns that moved at comparable rates read exactly as they did, in one word, and the line is unchanged wherever the answer prints no percentages to check it against. No figure changes. See How the Assistant Stays Honest.

  • A cost-trace answer covering several value columns now states a second exact relation between them. An answer over several columns already says how they add up — that one column is another less two more, say — and stopped there. A second relation sitting in the same figures went unsaid: on a banking model the capital charge was exactly four tenths of the funding charge in both periods, and a reader told how the columns add up stops looking for further relations, reading two charges as independent cost lines when they are one quantity counted twice. The answer now names that ratio and says the two therefore moved at the same rate — or, where the ratio holds across a change of sign, that they moved in proportion; where a wider group of columns holds one, it names the group instead. The note that one column is small enough for a given dollar amount to be a larger percentage of it than of the others is now left out wherever the figures beside it already show that column moving at another’s rate — which is precisely where it set up a difference they then denied.

  • A cost-trace summary now says how much of the depth it reports actually carried a figure. Ask why a figure moved and the summary closes by saying how many steps back it traced. That count is the only thing on the line saying how far it got, and the summary is the part most likely to be forwarded on its own or read by an assistant with none of the page around it — so a reader takes the depth as corroboration. On one model the summary said it had traced two steps upstream while the step-by-step account below showed the second one returning nothing at all. The line now reads “Traced 2 stages upstream; only 1 of the 2 came back with a figure — no figure at all for the remainder”, which says that the second step was reached and came back empty rather than that its change was nil. A step whose change was measured but could not be pinned on a single producing step still counts, because a measured change is evidence, and that it could not be attributed is already stated under Honest limits. No figure changes, and a summary whose steps all returned a figure reads exactly as before. See How the Assistant Stays Honest.

  • A cost-trace answer that reports medium confidence now tells you what the limit is, under Honest limits. Where part of a change comes from several effects moving at once rather than from any one of them, that is the reason the answer is rated medium — and on an answer covering a single figure it was said only in brackets beside the rating, twice on the same page, with no Honest limits section at all. A reader was handed a grade, the same sentence twice, and nothing to act on, and could not tell an answer that had been checked from one that had not. The share and what it means are now stated once, where every other limit is stated, and the rating keeps its short label. Answers covering several columns are unchanged. No figure changes. See How the Assistant Stays Honest.

  • A cost-trace answer about a table that recombines several allocation branches now names each branch the same way throughout, and says what the branches are to one another. The list of branch figures named a branch by the step that builds it while the step-by-step account below named the same branch by the table that step writes, with nothing on the page linking the two — readable only on models where a step name happens to contain its table’s name, and guesswork everywhere else. Each branch figure now carries both names. The opening line also says the branches are separate paths that never feed one another, and, where the figures shown do come to the combined total, that they sum to it: “recombined” was the only word asserting that, and readers asked to draw the model from the headings alone drew a chain of four steps instead of four steps side by side. No figure changes. See Analyzing Allocations With AI.

  • A cost-trace answer narrowed to one slice of a recombined table now says how each branch’s whole table moved. Every branch line names the change in its own pool as the thing that branch’s move was measured against, and the size and direction of that pool appeared nowhere — so a slice falling inside a book that fell just as far read as a problem of its own. An unnarrowed answer over a single table has stated its whole-table comparison since it shipped; a recombined table was left out, because its branches are separate tables and there is no single whole table to name. Each branch’s own table is now listed over the same two periods, named on every line, with the narrowed rows included in it. No figure changes. See How the Assistant Stays Honest.

  • A cost-trace answer no longer offers to break a change down by a field whose breakdown is already on the page. Ask why a figure moved without naming a field and the assistant picks the one that best explains the change, then lists every member’s move under it. On an answer covering a single column, the field it picked is the field that member list is grouped by — so the suggestion to “break the change down by that field” came back with the same table, and the note beside it warned that the figures would not match the ones you had just read, when they match exactly. A warning you can check and find false is worse than none: it teaches you to discount the other suggestions on the page, including the one worth acting on. The suggestion is now left out where it would return what is already in front of you — and where the search scored a second field, the answer offers that one instead, so you get a view you do not already have rather than one fewer next step. Where nothing else scored it is simply dropped, unless it is the only next step on the page, in which case it stands rather than leaving you with none. Where the breakdown would genuinely answer on a different column — a table reporting several columns at once, where the assistant searched one and the answer leads on another — the suggestion is unchanged, because there it really does return something new. See Analyzing Allocations With AI.

  • A cost-trace answer no longer promises that a member’s percentage will differ from the figure it quotes. Where the assistant picks the field that best explains a change, the share it reports is that field’s shift in share of the pool, and a breakdown by the same field reports each member’s own change. Both are correct, they are different measurements, and the answer has always said so — but it went on to promise that “the number for a given member will not match this figure”, which set up a comparison that cannot be made: no member breakdown prints a per-member percentage in any answer, the rows are amounts. Follow the suggestion and you got money figures, found nothing to check the warning against, and reasonably concluded the honesty notes were noise. Both the limit and the suggestion now say only what the two measures are and stop there. No figure changes, and the distinction between the two measures is still stated wherever it was before. See How the Assistant Stays Honest.

  • A cost-trace answer no longer calls an offset “partial” where it cancelled most of the movement. Where one member’s rise or fall is larger than the whole net change, the line naming that member closed with “others partly offset”. That one word covered everything from a couple of per cent to over ninety: on an insurance model where one account moved $22,067,919.71 against a whole net change of $1,792,719.72, opposite moves had cancelled more than nine tenths of that account’s rise, and “partly” told a reader close to the opposite of what happened. The line now says the movement was offset by opposite moves elsewhere and characterises the size no further. No figure changes. See Analyzing Allocations With AI.

  • A cost-trace member list no longer includes members that did not move. Where the list shows every member, two accounts identical in both periods appeared as rows at $0.00 under a heading that says movers — so a list read as a ranking handed you rows carrying no movement, in the block most likely to be copied into a slide. Members whose change is exactly zero are now left out. A list where nothing moved at all is shown as it was, since the alternative is a heading with no rows under it, and a list showing only the largest movers keeps them, because there a $0.00 row tells you the ranking has reached the bottom of what moved. No figure changes, and the rows still add up to the change they break down. See Analyzing Allocations With AI.

  • Table Explorer’s column details panel profiles every column, flags data quality issues, and shows how numeric columns relate to each other. Select a column and its statistics include null count and percentage, and — for text columns — blank count and percentage (a blank being empty or whitespace-only, distinct from null), plus distinct values as a percentage of non-null rows. Numeric columns also get a skewness figure showing whether their values lean to one side of the average, a histogram showing the shape of their distribution across 10 buckets, and Pearson and Spearman correlation coefficients against up to 10 other numeric columns in view, scoped to the rows that have a value in all of them. Every column is also checked against a five-part data quality radar — outliers, format mismatches, duplicate values in a declared row key, dimension members not found in a linked dimension, and constant columns — with badges on the column itself and a ranked summary window opened from the Actions menu. All of it is computed deterministically, respects row-level security so you only ever see it for rows you’re entitled to, and — except for the correlation coefficients’ own row scope — is independent of any filter you’ve applied. The existing Min, Max, Mean, Sum, and Standard Deviation continue to appear for numeric columns and continue to respect your current filter. See The Details View.

  • A cost-trace confidence line no longer follows the column it rates lower with a reassuring word about all of them. Ask why a figure moved on a table that reports several columns at once — income alongside the charges deducted from it — and the answer names any column it is less sure of before giving an overall rating: “medium for the net_contribution column (gross offsetting); high overall across 4 columns”. The overall rating is an average weighted by how much each column moved, and a summary column is the difference between the others, so it is the smallest mover and carries the least weight in its own rating. On a real banking model the three columns outvoting it were the income and charges it is made of — the same movement counted twice — so “high overall” was reassurance about columns nobody had asked about, sitting on the one figure the whole answer is built on. A reader skimming to the end of the line took “high” away. Where the column rated lower is the one the answer is about, the line now states the stronger rating of the other columns — “high for the other 3 columns” — instead of claiming it overall. No rating changes, and the weaker column is still named first, as before. Where the lower-rated column is not the one the answer leads on — a column the assistant chose to search, say — the line is unchanged, because the overall rating is then about the column you asked for. See Analyzing Allocations With AI.

  • A cost-trace answer now says on the same line that a “100%” split is arithmetic rather than a cause. Ask why a figure moved and the step-by-step account at the end read “dominant: the value coming in explains 100% of the move”. An allocation shares out a pool without changing its size, so where a whole-pool answer credits all of a movement to the value coming in, that figure is arithmetic and not a finding about what drove anything — which the answer said, in a different section, and in a short form beneath only one kind of step. Every other step’s line said only that the split describes the whole pool, which reads as a note about scope; so on a four-column banking answer the same 100% appeared four times and was called mechanical once, and the one marked step read as the only doubtful one. The line beneath every such step now says the split is arithmetic and not a driver finding. It quotes no percentage of its own, because that one line also prints where an answer withholds the split entirely, and beside a different column’s figure in the opening summary. No figure changes, and steps that measured a genuine leading factor — a question narrowed to one member — read exactly as before. See Analyzing Allocations With AI.

  • A cost-trace answer no longer leads with a split that cannot come out any other way. An allocation shares out a pool without changing its size, so on an answer covering the whole group the split between the factors behind a change reads 100% to the value coming in and 0% to the driver total — the same on every such answer, for every allocation, in every period. That figure said nothing about your data, yet it opened the summary under the word “Dominant:”, and the answer then withdrew it twice further down. A reader given such a page took it as a measurement and would have called off any look at the mix — on a page whose very next line named the one member whose share of the pool had actually shifted. The line now reads “Factor split at stage 1, which cannot vary: an allocation preserves the total it distributes, so whatever moved it reads 100% to the value coming in and 0% to the driver total.” Both figures are still printed, so an answer that states the split still reads differently from one that withheld it, and a step whose split measured less than all of it keeps its own figures and still reads as a finding. See Analyzing Allocations With AI.

  • A cost-trace answer that declines to apportion a change now says which figure is missing, and shows the two period totals it declined over. Two things were wrong on the same page. The limits note read “No figure is reported for this answer” on answers carrying nine figures, every one exact to the cent — it meant no figure apportioning the change to a cause, and said “figure” bare, which in finance is any number; a reader took it to mean the tool had failed and that the figures above it were void. And an answer that declines because the total crossed zero printed neither of the two amounts that crossed it, while closing by telling you to read the two periods as separate figures. The note now names which figure is missing, and the line that declines reads “not attributable (sign flip) — this slice went from $45,031,369.24 to -$20,776,630.76”, saying whether the pair is the slice you asked about or the whole column so it cannot be taken for the whole table’s pair printed elsewhere. No figure changes, and the opening summary still quotes none — an answer that leads with a number is doing the thing it is declining to do. See Analyzing Allocations With AI.

  • Templated emails gain variables and one-click formatting. The Notify Via Email step’s template editor now reaches your project and workflow variables — insert any of them from the Insert menu, or reference them as variables['<name>'], alongside the built-in project, model, and run-date values. A new Style menu wraps the selected text in email-safe HTML formatting — bold, italic, underline, headings, bulleted and numbered lists, block quotes, and links — without hand-typing tags. See Send Templated HTML Email Notifications.

  • A cost-trace answer now says in full which of two measures a member’s share is on. Ask why a figure moved and the answer can name one branch, programme or entity as most of the change — and that share is measured one of two ways. Either the member moved on its own, or it took a larger slice of a pool that was moving anyway, and on a transfer-pricing or allocation model the difference is whether the member’s own conduct explains its figure or the basis moved underneath it. The first of those closed on three words, “its own change”, tagged onto the end of the figure. Readers could not tell which measure it named, and the reading it most invited was the other one — that the member had barely moved and merely gained share. The answer now says the share is the member’s own change and not its share of the pool shifting. The second measure’s wording is unchanged, and no figure changes. See How the Assistant Stays Honest.

  • A cost-trace answer now reconciles a charge concentrated in one member with a ranking that puts that member last. Ask why a figure moved on a table that reports several columns at once, and the answer can name one branch, programme or entity as most of the change in a charge column while the member list beside it ranks that same member last of four. Both are true — a member whose charges fell alongside its income nets out to almost nothing — but nothing on the page said so, so the two blocks read as contradicting each other, and the natural conclusion was that one of them must be wrong. The member list now says, above the rows, which columns the ranking subtracts, so a member large in a charge and small on the net reads as arithmetic rather than as a mistake. The answer does not claim that is what happened in your figures — only that it can — because saying so needs a measure the answer does not always have. It says nothing at all where the columns do not add up to one another, since there is nothing in those figures that identifies a charge, and nothing where no member is reported as concentrated. See How the Assistant Stays Honest.

  • A cost-trace confidence rating covering several columns no longer says it is rating a breakdown only one of them has. Ask why a figure moved on a table that reports several columns at once and the answer can break one of those columns down by a field — programme, line of business, branch — and list its members. The rating above that list named the field and then counted every column: “in this breakdown by programme, high across 3 columns”, while telling you a few lines below, under Honest limits, that two of the three describe the whole pool only. Read as written it promised three member breakdowns where there is one. The rating now says it is in the figures, and the member list keeps naming both the field and the column its members belong to, in its own heading. An answer covering a single column is unchanged and still names the field: there the rating and the breakdown cover the same thing. See Analyzing Allocations With AI.

  • A cost-trace summary’s confidence rating now says it covers the breakdown, not the cause — and what qualifies it stands apart from it. Ask why a figure moved and the answer opens with a one-line summary that can name a likely cause, point at the member behind most of the movement, and size the change against last year, before closing with a confidence rating. That rating has only ever covered how the change was broken down and traced back through the steps behind it — never whether the causes above it hold — but nothing on the line said so, and a reader who stopped at “high” took the lot as settled. The line now reads “Confidence in the decomposition, not in why it moved: high”, and leaves off the second half where the summary named no cause, so it never disowns a claim it did not make. Anything qualifying the rating now follows as its own sentence under Caveats:; previously a dash joined the two, and a dash reads as because, so a high rating appeared to rest on the very limit standing beside it. This is the part of an answer most likely to be forwarded on its own, or read by an assistant with none of the page around it. Nothing about the rating itself changes, and the qualifications are unchanged and still set out in full further down. See Answers You Can Trust.

  • A cost-trace confidence rating now says what it is rating where the answer has already withdrawn the cause. An allocation shares out a pool without changing its size, so on an answer covering the whole pool the split between “the value coming in” and “the driver” is forced by that arithmetic rather than measured — which the answer sets out twice, once under Honest limits and once against the traced stage. The rating above all of that read “high (clean attribution)”, so a reader who stopped at the confidence line — which is where a reader in a hurry stops — took the cause as settled while the same page was withdrawing it a few lines further down. The rating now reads “high across 3 columns (clean attribution — rated on the arithmetic, not on why it moved)”, so the line refuses that reading on its own rather than relying on being read alongside the limits. The rating itself has not changed: the figures still tie out, and they are still rated high. Where the split was genuinely measured, and where only some of the columns cover the whole pool, the line reads exactly as before. See How the Assistant Stays Honest.

  • A cost-trace answer no longer rates several columns with one reassuring word when it has set out a limit on one of them. Ask why a figure moved on a table that reports several columns at once and you get a single confidence rating covering them all. Where the columns all rate the same there is no weaker one to name — but one of them could still carry a limit under Honest limits, and on a real banking model the line read “medium across 4 columns” twelve lines above a limit on the very column the answer leads with. The rating now closes by naming any column carrying such a limit, so the two are read together rather than one contradicting the other a screen later. The limit itself is not repeated in the rating — it is a statement about how a change divides between its causes, not about the figure being weak, and it stays in full under Honest limits. Where every column carries the same limit the rating is unchanged, because the breakdown already says so once above the figures; and where a column is already named as less confident, that naming stands as before. See How the Assistant Stays Honest.

  • A cost-trace answer no longer sums up several columns as all moving the same way when some of them are charges. Ask why a figure moved on a table that reports several columns at once — income alongside the charges deducted from it, or revenue alongside cost — and the opening line used to close with a count: “with all 4 columns down”. Two of those four falling were charges, and a charge falling is relief rather than more bad news, so a single count made four different movements read as one story. Where the columns add up to one another exactly, the opening line now names them instead and says which of them the headline figure subtracts, so a fall in a charge reads as what it is. Columns that all count the same way are unchanged, and so are columns that do not add up to one another — there is nothing in those figures that identifies a charge, and the answer does not guess. See How the Assistant Stays Honest.

  • A narrowed cost-trace answer now shows how the whole table moved. Ask why a cost moved for one line of business, entity or programme and you get that member’s own figures — which mean little on their own. A line that grew 4.2% inside a book that shrank 6.2% is a different story from one that grew inside a book that grew, and the same number describes both. The answer now lists, beside its own figures, how the whole table moved over the same periods on each column it reports, and says that the narrowed rows are part of that total. Where the two disagree in sign — the member negative at both ends of the period while the table is positive at both — the answer says so in words rather than leaving it to a minus sign. Nothing new is measured: those figures were already what the narrowed change was compared against, and were simply never shown. An unnarrowed answer is unchanged, since it already reports the whole table. See How the Assistant Stays Honest.

  • A cost-trace answer now says whether it covers the whole table or one member of it. Ask why a cost moved and you get a figure; ask the same question narrowed to one line of business, entity or programme and you get another. Read one after the other, the two used to look alike, so the narrowed figure could be taken for a component of the wider one — and it need not be, because the members left out can move the other way. Each answer’s opening line now says which it is: a narrowed answer states that it is that member’s own totals in each period with the rest of the table set aside, and an unnarrowed one states that its figures are the table’s own totals in each period with every member included. Where a narrowed answer’s figures are negative at both ends, its percentage carries no extra note, because the answer already says the balance went further below zero. The unnarrowed statement is left off where the answer has already reported a gap in its own working — a table that recombines several allocations, one of which could not be attributed — so it is never read as a claim that nothing was left out. See How the Assistant Stays Honest.

  • Builder-seat limits are now enforced. Inviting a new Builder, promoting an existing member to Builder, or reactivating a disabled Builder is blocked with a clear message once your plan’s builder-seat limit is reached, instead of being silently allowed past it. Viewers remain free and unlimited on every plan. See Viewer vs. Builder.

  • Loading a hierarchy into a dimension is much faster on large dimensions. Each row of a load re-read the whole membership of the hierarchy it was loading into, and of the main hierarchy, just to answer three yes/no questions about that row’s own parent and child. Most of a load’s time went on that reading, and the cost grew with the dimension — roughly quadrupling each time the number of members doubled — so a load did not merely take longer on a larger dimension — it got slower as it went. Those three questions are now asked about the two members concerned rather than by fetching every member, so the work per row no longer depends on how many members the dimension already holds. Nothing about what a load does changes: the same rows are added, moved, or refused, with the same messages. The gain is largest on a dimension whose main hierarchy is empty or sparse, where every row took the slowest path.

  • Exporting a dimension that has alternate hierarchies is much faster. An export covering every hierarchy built and wrote the target table once per hierarchy, and each of those writes costs much the same whether it carries a hundred rows or a hundred thousand — so a dimension with twenty alternate hierarchies could spend more than a minute producing a few thousand rows, almost all of it on the repetition rather than the data. The export is now assembled and written in one pass, and the work of gathering every hierarchy’s attributes — repeated once per hierarchy, and growing with the square of how many there were — is done once. Two things you may notice change with it: exported rows now come out in a stable order, the main hierarchy first and the alternates alphabetically, where before the order could differ between two runs of the same export; and an export in level format no longer runs out of level columns when an alternate hierarchy is deeper than whichever one happened to be written first. Nothing else about what an export produces changes. See Dimension Export.

  • A cost-trace answer that names the leading factor behind a change now tells you what to ask next. Ask why a figure moved and the step-by-step account can name what most of the movement came from and put a percentage on it — “the shift in this branch’s share of the pool explains 60% of the move”. Those were the answers with the most worth following up and the ones that ended with nothing suggested, because the usual next steps did not fit: narrowing to one member is advice an already-narrowed question has taken, and breaking the change down by a field needs a field that explains it, which this shape does not have. The answer now closes by saying that each such percentage is measured once, across the whole of the period you compared — so a move that happened in one jump and one that built steadily give the same figure — and offering to re-run over several narrower periods and compare those against each other, since one narrower period on its own is the same two-point comparison again. It adds that those narrower figures will not sum to the one above, because each period is measured on its own. It names no particular period, because which part of the range matters is yours to choose. No figure changes; an answer already suggesting a period fix because a step could not be aggregated keeps that more specific suggestion, and an answer comparing two scenarios, versions or budget against actual gets no such suggestion, since there is no narrower range to run. See Answers You Can Trust.

  • A cost-trace answer that says its figures cover every step writing a table no longer offers to measure one of those steps by itself. Where a second step writes rows into the same column the answer is summing, it says so, withholds the split between the factors behind the change, and offers you a look at each of the other writers. That offer said it would measure the named step on its own — and the overlap that made the answer withhold the split in the first place is exactly what stops it: the change that comes back still covers every writer. So the page promised and denied the same thing, three lines apart, and the promise was the half carrying the id you paste. Both the offer and the limit beside it now say the same thing — running it follows the change back in through that step instead, and what comes back is a separate measurement rather than that step’s share of the change shown. The answer still leads on its figures being exact. No figure changes. See Analyzing Allocations with AI.

  • A cost-trace answer that cannot separate two fields now names them, sizes each one, and offers to cut the change by both. Ask why a figure moved without naming a field and the assistant searches for the one that best explains it. Where two score too closely to separate it applies neither, and it used to say only that several had scored similarly and ask you to pick — while the answer beside it, where one field did win, named its field, sized it and rated the runner-up. Everything needed was already to hand and none of it was printed. That mattered because the tied candidates are not interchangeable: on one automotive model both had moved further than the whole column did, and a reader given only “scored similarly” took the first of them as the story. The answer now names each candidate with its strongest member and that member’s own change, against the change in the column as a whole, and says the candidates overlap rather than divide the pool between them — so their figures are not parts of one total and are not to be added, which on that model would have come to more than four times the column’s own change. It also offers one more next step than before: breaking the change down by two of the tied fields at once, offered as something to run rather than as a finding, because no search scored the pair. An answer where one field did win reads exactly as before. No figure changes. See How the Assistant Stays Honest.

  • Asking for the last child of a dimension member works again. The call had failed with a type error on every use.

  • Backing up every dimension in a project works again. The whole-project backup had failed without reading any dimension’s contents.

  • Walking up a dimension from a member through the API works again. Every call had failed with a type error, while walking down worked.

  • Dimensions deeper than about a thousand levels can be read. Every traversal of such a dimension had failed with a recursion error, and asking whether a member descends from another had failed on every call.

  • Loading a large parent-child dimension table takes seconds rather than minutes, and bulk-loading a very large dimension no longer fails on a timeout.

  • A calculated column in a file import no longer comes back empty when you leave its Source blank. A column that takes its value from an expression does not need a Source — the expression already says where the value comes from, and the form does not ask for one. Leaving it blank loaded that column as an empty value on every row, and the import still reported success: what came back was a table that looked correctly loaded, with one column silently blank from top to bottom and nothing in the run log to say so. On a real load that was 340,265 rows of a project reference that should have carried 34,626 values. The only way to get the expression’s values was to also point Source at a column, which has no bearing on what the expression computes and so gave no hint that it was load-bearing. Expressions and constants now behave the way the form implies, on every file import — CSV, Excel, JSON, Parquet, fixed-width, YXDB, and the rest. A column that genuinely has no counterpart in the file, such as a constant, loads exactly as it did before. If you filled in Source on a calculated column to work around this, you can clear it — and any table loaded while that column’s Source was blank holds empty values for it and wants reloading. See Advanced Data Mapper Usage.

  • A cost-trace member breakdown now says when one of its members was positive in one period and negative in the other. A member’s row gives only how much it changed, so a reader supplies the levels — and an account cannot fall by more than it had. Where a member sits on one side of zero in the first period and the other side in the second, its row is larger than its figure in either period on its own: a reserve standing at $6,037,704.00 that ended at -$14,525,495.99 printed as -$20,563,199.99 and read as a large cost taken out rather than a balance that turned into a credit. A blind read of one such answer put that account’s closing position at roughly +$80,000,000 and would have briefed “reserves down 20%”. The breakdown now names that member above its rows, gives both of its figures where it is the only one, and says the row measures the size of the swing between the periods rather than a change within one. No figure changes and no row is reordered. See Analyzing Allocations with AI.

  • The AI assistant now has the real list of connection types, and no longer offers ones that cannot be saved. Ask an assistant what kind of connection to create and it reads a list of supported types. That list was maintained by hand and had drifted badly from the one the server actually accepts: of the 24 types it named, 15 could not be saved at all — it offered SQL Server under a name the server rejects, Google BigQuery under another, and named S3, SFTP, Kafka, MongoDB and SAP as connection types when they are not — while 49 types that do work were missing from it, among them Oracle E-Business Suite, Sage Intacct, Databricks’ lakehouse, Xero, Stripe, Ramp and Oracle Essbase. So an assistant would write a connection that failed on save, or tell you a connector you have does not exist. It now reads the same list the server gates on, so the two cannot disagree. Two smaller ones go with it. The list of sources for importing a table into a project named Sage and DB2, which that step does not take — both are imported as workflow steps instead — and an assistant that offered either got a rejection before anything ran; the list now matches what the step accepts. And a workflow setting called remediation was offered with three values for a setting that does not exist, so an assistant that set it was told the change had been accepted and nothing happened; it has been removed. Setting a remediation workflow is unaffected and works as before. No connection, workflow or import you already have changes. See Connect Your AI Agent.

  • The Labels box has a visible Add button again, and labels typed on a new workflow step are kept. The box had been rebuilt around chips you commit with Enter or a comma, and nothing on screen said so — the entry field’s placeholder was the only hint — so the control read as though labels could no longer be added at all. An Add button now sits beside the field on every Labels box: projects, workflows, steps, tables, dimensions, data editors, and UDFs. Enter and a comma still work, and the × on a chip and Backspace on an empty field still remove one. Separately, a label typed on a workflow step you were creating for the first time appeared as a chip and was then silently dropped when the step was saved, because the step did not exist yet when the label was added; those labels are now attached to the step once it is created. See Organizing Work with Labels.

  • A workflow step whose source table holds a decimal or floating-point column can be edited again. Opening such a step and saving it — changing anything at all, or nothing — failed with Update failed — Internal Server Error, leaving no way to edit the step. Saving a step that computes a column with an expression checks that expression first, by building a single sample row in the shapes of the step’s own columns and compiling the expression against it. The builder covered twelve of the twenty column types a step is allowed to read, and the eight it did not cover — double-precision and other floating-point numbers, decimals, small integers, auto-numbering columns, unique identifiers and binary columns — stopped the save outright instead of being reported as something you could act on. All twenty are covered now, and a column type the check does not recognise no longer stands between you and saving. Steps without a computed column were never affected, and nothing about the affected steps was wrong — they save as they are, with no edit needed.

  • A project whose name contains an & can be created again. Every new project is registered with the dashboards service so its published tables can be charted, and that registration looks the project up by name. The lookup was being sent in a form the dashboards service could only read by falling back to a parser that cuts a value off at the first & — so for a project named Financial Close & Reporting it arrived as Financial Close, was rejected, and New Project failed with a server error. Importing a project archive whose name contains an & failed the same way. A name containing a + had the same cause with a quieter symptom: the + arrived as a space, so the lookup matched nothing and reported no error at all. Lookups are now sent in the form the dashboards service reads directly, and both characters arrive intact. The same lookup sits behind row access role names, dashboard names, and table and schema names, so any of those carrying an & or a + are fixed with it. If a project create failed this way, check your project list before creating it again: it may still hold an entry for the project that never finished being created. Delete that entry first — a half-created project has no dashboards database behind it, so its published tables cannot be charted. See Creating New Projects.

  • A cost-trace answer about a table that recombines several branches no longer lets you take the part it could not account for as the branches it could not measure. Its opening line gives a count of branches it could not measure and, one clause later, the amount left over — two facts about missing information side by side, with nothing saying how they relate. Readers took the second for the first. They are not the same claim: the amount left over is a subtraction, and a branch that reaches the recombination by more than one route has its rows counted twice and widens that same amount. The branches it could not measure would produce it; so would the double count; and which of the two did is not something the answer can tell. The line now says the amount is a subtraction and names both, ranking neither, so you know to ask about both. The limits note below it gave the branches it could not measure as the reason for the shortfall — it now states the two facts without that claim and names the second possibility as well. An answer whose branches all reported reads exactly as before, and no figure moves. See How the Assistant Stays Honest.

  • A cost-trace answer comparing two versions or scenarios now says which of the two sides holds fewer rows. Where the two sides of a comparison are unevenly populated the answer warns you, and it named the short one “the thinner side” — thinner being defined as holding fewer rows, so the sentence reduced to “the side with fewer rows has fewer rows” and told you nothing about which one it was. Whether it is version 8 that is a partial load or version 7 changes the story completely. It now calls them the first and second side, in the order Values compared and the row counts are already printed on the same page, so the words resolve against something you can see. The opening line names that side the same way, where it used to call it “the later side (version 8)” — a calendar word on a comparison with no calendar in it, and a second name for something the answer had already named once. Separately, and on every answer carrying this warning, including comparisons between two periods: where the money moved roughly in step with the rows the answer called the two proportions “the same” — while printing, on one shape, 50% against 45%. The test behind that phrase allows a gap of a few percentage points, so the answer now says the two are close to the same proportion. No figure moves. See How the Assistant Stays Honest.

  • A project archive’s table data now survives the round trip — taken with the data, and restored with it. Export Project Archive offers a full backup — the project and the contents of its tables — and two separate faults stood between you and one. On every warehouse except Databend the export of each table failed. Because a table whose data cannot be read is deliberately left out rather than allowed to abandon the whole archive, the export still finished and reported success: the archive that came back looked complete, listed every table, and held no rows at all. The only sign was the export’s own closing message, which named every table as one that went in without its data. Underneath that, each table’s file was built by reading the entire table into memory first, so a table of a few million rows needed gigabytes to produce a file of a few tens of megabytes — and since an archive exports three tables at a time, a project with large tables could stop the export outright and lose the tables that were in flight. Table data is now read the way the single-table export and the table bundle already read it, and the warehouse writes each table’s file straight to storage itself instead of passing it through PlaidCloud, so what an export needs no longer grows with the table and the file arrives sooner. On a project that uses Row Access an archive now carries the rows the person taking it is granted, and a project Architect archives every row — before this, table data on such a project could not be archived at all and failed the same silent way. Restoring one had the matching fault from the other end: on the lakehouse (StarRocks) every table’s data was handed to the warehouse in a form it could not read, so an import reported success and returned a project with every workflow, table and dimension in place and not a row in any of them. Archived table data now loads on restore, and an import that ends up with no table data at all is reported as a failure rather than a success. A table’s data is now held back only where the archive and the table it is going into disagree on column names or their order — what a load actually goes by — where before a disagreement about a column’s type was enough on its own, which happens routinely between what an archive records and what is physically stored; a genuine type change is reported and the data loads. Whole-number, decimal and true/false columns also now record their real type in the archive rather than text.

If you are holding a full archive taken before this release, or restored one and found it empty, do it again: the closing message says how many tables went in — or came back — without their data, and where that count matches every table you asked for, there are no rows behind any of it. See Archive a Project.

  • The AI assistant can now answer questions about data in a project that uses row access, and shows you only the rows you are granted. The assistant writes its own queries, and those queries were not going through row access — so in a project with row access grants defined they were blocked, and the assistant could only report that something had failed. Its queries now carry the same grants as every other way of reading that data. Where the grants cannot be applied to a particular query, the assistant is told why and what to ask for instead, rather than a bare failure. Projects that do not use row access are unaffected.

  • A question the AI assistant answers using a text pattern no longer fails. Where the assistant’s query included a pattern containing a colon, the colon was mistaken for a placeholder awaiting a value, and the query was rejected before it ran — the assistant could only say that it had failed. Such patterns are now read as the text they are.

  • A cost-trace answer comparing two versions or scenarios no longer describes that comparison as time. Point a question at a version, a scenario or any other column that is not a date and the answer works out what it is actually comparing — but it read that classification across every step behind the answer rather than off the step the answer is about, and where the column you compared is absent further upstream, that upstream step counts as being over time whatever you asked. So the opening line said the change matched “the row shortfall between the periods” and told you to check the later period had finished loading, on an answer whose own limits described the very same figures as two sides of a comparison. The opening line is the part built to be forwarded, so it was the wrong half of that pair that travelled. That line, the sentence saying what population the figures cover, the pair being compared, the year-over-year verdict and the suggested next steps now all read the step the answer is about. The answer also no longer offers to re-run over narrower time windows where the only figure that suggestion points at is not over time — following it could not have changed that figure. An answer comparing two periods reads exactly as before and no figure moves.

  • A cost-trace step line now gives every factor’s share of a change, not just the largest one’s. The line read “the shift in this slice’s share of the pool … explains 60% of the move” and stopped there, so readers subtracted to 40% and put it against the one other factor. Both halves of that are wrong. A change divides between two factors and the interaction between them, and where the two factors partly cancel, one of them can account for more than the leftover while the interaction runs negative — on one answer in the sample set the true split is 60%, 52% and minus 12%. Subtracting understates the second factor by twelve points and never suspects the third exists. The line now states all three, and says they sum to 100% before rounding, which is what lets a reader place the negative one; where a share does run negative it adds that this happens when the factors pull against each other. Five wordings that named the other factors without their figures were read cold first and every one still left the reader subtracting, so the figures are the fix rather than the words around them. Where the line names the shift in a slice’s share of the pool as the second factor, it now names the driver that pool was split on, as it already did where that factor leads — unnamed, a share of a pool is a split whose basis a reader cannot recover. A step line with one factor, or with three, is unchanged, and no figure a reader already sees changes. See How the Assistant Stays Honest.

  • An answer that could not attribute a change across several value columns no longer offers to re-run it over narrower periods. That suggestion is meant for an answer that names a leading factor, but the check for whether this answer had one asked a different question from the one the rest of the report asks. On an answer whose columns were all unattributable the two disagreed — and because such an answer promotes its next step into its opening line, the suggestion appeared inside the sentence saying the question could not be answered. Both now ask the same question, and every other answer keeps the suggestion exactly as before.

  • A cost-trace answer that picks its own breakdown now shows the two amounts behind the figure it quotes. Ask a question without naming a breakdown and the answer searches for the dimension that best explains the change, then reports how much of it concentrates in one member — as a share shift, which measures how that member’s slice of the pool moved. The list of movers higher up the same page gives that member a cash figure instead, and dividing it by the column’s change gives a different number: 71% against 98% on one answer in the sample set, 1.7 times against 1.9 on another. Both are correct and they measure different things — but the answer said so only in words, while putting one of the two numbers on the page. Every reader who checked did the division, met a figure that disagreed, and took the answer’s own number for a mistake; asked what they would circulate, they quoted the one they had derived and dropped the one the answer had given them. The answer now states what the column changed by and what the member’s own change was, both in cash, so the second measure can be read instead of reconstructed. It deliberately does not restate the share shift in cash: that figure is a shift in proportion rather than money that moved, and shown beside real amounts a reader would file it as one. No figure a reader already sees changes. See How the Assistant Stays Honest.

  • A cost-trace summary no longer counts branches it could not measure as though they had moved. Where an answer covers a table that recombines several branches, its one-line summary tallies which way each branch went. Where some could not be attributed, that tally read “2 rose and 2 unattributable” — a direction paired with a state of knowledge — and read at speed the eye completes it as “2 rose and 2 fell”. Two readers given only that line did exactly that. It turns “we could only measure half of this model” into “the branches partly offset each other”, and those lead to opposite decisions. The tally now reads “2 rose, and 2 could not be measured”, and the equivalent line about a table’s value columns changes with it. Every count still appears — that tally is the only place a flat or unmeasured branch is disclosed. The same summary warns, where a movement is the same size as the shortfall in rows between the two periods compared, that the movement may not be real; it introduced that warning with “but”, which promises the news is about to improve where a second and larger problem follows, and now reads “and worse”. An answer whose branches all moved the same way, and an answer carrying no such warning, are unchanged, and no figure moves. See How the Assistant Stays Honest.

  • The faithfulness check no longer passes a rewrite that kept half of a limit. Every cost-trace answer comes with a check your assistant can run on the version it reworded — did it keep the confidence rating, keep every limit, invent no figure? Two of the limits an answer can state say two separate things at once. One says that a narrowing reached some of the tables behind the answer and covers every value on the rest; the other says a change was measured against neither the previous year nor recent periods. The check asked only that one of a limit’s phrases survive the rewrite, so a rewrite that kept either half and dropped the other came back reported as faithful — and the half most often dropped was the one saying the narrowing had not reached everything. It now asks for each separate thing the limit actually says. A rewrite that states a limit in its own words still passes, and a limit that says one thing is checked exactly as before. The check also no longer credits a limit it was never given. Where a limit had no wording recorded against it, the check fell back to the words of its internal name, so ordinary language — “driver”, “read”, “scenario”, “structural” — could stand in for it: a rewrite describing a reorganisation was accepted as having kept two limits it never mentions. Those limits, raised when a driver scenario or a forward-impact trace cannot be completed, are now matched on what they claim, or — where no wording has been recorded for them — satisfied only by the limit itself. No answer’s own wording changes. See How the Assistant Stays Honest.

  • A cost-trace answer asked for without its summary line and its step-by-step account no longer comes back saying nothing was found. An assistant can ask for an answer with parts of it left out — most often the one-line summary and the account of how the trace got there. Where both were left out together, the answer came back as the single sentence “No attribution was produced for this trace.”, and everything else it held went with them: the confidence rating, the list of the members that moved and by how much, the honest limits, and the suggested next steps. The trace had measured all of it. An assistant narrating from that answer had nothing to narrate, and its faithfulness check could not be satisfied — the limits it is required to keep were not in the answer to keep. The answer now returns what it has, opening on its confidence rating, and that sentence is kept for the one case it is true of: an answer with nothing on it at all. An answer asked for in full is unchanged and no figure moves. See How the Assistant Stays Honest.

  • A cost-trace answer that could not apply your narrowing now names what you could narrow by instead, and three shapes of it that said nothing at all now explain themselves. Where the column you named is not on the answer’s table, the answer said so and stopped — the right refusal, and it left you knowing the number in front of you was not the one you wanted with nothing named that you could ask for. It now ends by offering that table’s own columns, read from the table rather than guessed. Where you named a column but supplied no value for it, nothing on the page mentioned your narrowing at all: the answer now says the filter named the column and gave it no value — the column is there, and a re-ask with a value will work — and the suggested next step names that column first rather than burying it in a list. A request that failed both ways at once no longer prints an empty value list back at you as product=[], and gives each half its own cause, so the reason the unrecoverable one failed is not carried across to the one that would have worked. And an answer covering several recombined tables, which took no opening at all, now distinguishes the two ways it gets there: where no branch’s table has the column it says that of all of them, rather than that “not every” one does — which reads as though some branch had been narrowed after all — and where some branches were narrowed and others could not be, it says the figures are part the slice you asked for and part whole table, and marks the combined total as not being that slice’s. An answer whose narrowing applied in full reads exactly as before and no figure moves. See How the Assistant Stays Honest.

  • A cost-trace answer narrowed on only part of what you asked for no longer reports it as though all of it applied. Ask about lob=COMMERCIAL and region=WEST where the answer’s table carries lob but no region, and the figures come back narrowed on the line of business and covering every region — the useful answer, and the one that was computed. The page then described it as though both halves had been applied, naming region=WEST in the opening sentence, the sentence saying what population the figures cover, the heading of the block comparing them against the whole table, the heading of the list of movers, the summary line, and the step-by-step account. Every figure was right; every description of what it covered was not, and nothing said the region had been dropped. The answer now names only what actually narrowed the figures, opens by saying which column could not be applied and why — “region could not be isolated (cost_line_admin has no region column) — so these figures cover all region values” — and repeats it in its honest limits alongside the population the figures are measured over. A column you name but leave without values is said differently, because you can fix that one by asking again. Where a recombined table’s branches disagree about the column, the answer no longer names one of them as the table that lacks it, and no longer says the figures cover every value of a column that some of those branches were narrowed on — it says instead that each branch is narrowed on the column only where its table has it. Where the branches each carry a different one of the columns you asked for, it names each column separately as not being on every branch’s table, rather than making one claim that is untrue of every table on the page. An answer whose narrowing applied in full is unchanged and no figure moves. See How the Assistant Stays Honest.

  • A cost-trace answer no longer reports the whole table’s figures as the line of business, entity or programme you asked about. Narrow a question to entity=DE and, where the answer’s table has no entity column at all, that narrowing cannot be applied — every figure comes back covering the whole table. The answer went on naming the narrowing anyway, in every place it names one: the opening sentence, the sentence saying what population the figures cover, the heading of the block comparing them against the whole table, the heading of the list of movers, the summary line, and the step-by-step account at the end. Nothing said the narrowing had been dropped. So the page read as a clean, high-confidence answer about a population it was not about — and the block meant to contrast the narrowed figures against the whole table printed the same figures twice, under a heading promising a comparison. Readers shown that page could not tell it from a table where DE happens to be the whole business. The answer now opens by saying the narrowing could not be applied and which column is missing — “entity=DE could not be isolated — cost_line_admin has no entity column — so this is the whole table” — gives its figures as the whole table’s, and names the narrowing nowhere else. The step-by-step account no longer marks a step that ran unnarrowed as the narrowed one. An answer whose narrowing applied normally reads exactly as before and no figure changes. See How the Assistant Stays Honest.

  • Downloading a folder as a ZIP now brings down everything inside it. Download as ZIP built its archive from a listing that stopped at the folder itself, so on every account type except Amazon S3, Wasabi and Google Cloud Storage — OneDrive, SFTP, Azure Blob Storage, Azure Data Lake Storage, Google Drive, WebDAV, FTP and the S3-compatible stores — files sitting in sub-folders were left out of the archive. A folder holding nothing but sub-folders came down as an empty ZIP, reported as a successful download — the case least likely to look wrong until you open it. Sub-folders are now followed to any depth on every account type, and the archive keeps the folder structure shown in the explorer. A download of a folder named Report also no longer reaches into a separate folder called Report2024 and packs its contents in alongside — a folder is now matched as a folder rather than as the first characters of a name. If you have worked from a folder download taken from one of those accounts, take it again — anything below the top level of the folder was missing from it. See Download Folder Contents.

  • Copying a folder in Document now copies it, on OneDrive and SFTP accounts. Dragging a folder onto another offers Move Folder or Copy Folder, and on those two account types both choices were carried out as a move. On an SFTP account, choosing Copy renamed the source folder away — so the folder you asked to copy stopped existing, and the browser reported success either way, including when the move itself had failed. If you have copied a folder on an SFTP account and later found it missing from where it was, it was moved to the destination rather than lost — look for it there. On a OneDrive account neither choice worked at all: Copy Folder, Move Folder and renaming a folder each failed outright. All three now work, Copy leaves the original where it is, and a move that cannot be completed says so instead of reporting success. Copying and moving a folder on a OneDrive account also work now for AI assistants connected over MCP, where they had never run. Amazon S3, Google Cloud Storage, Wasabi and Azure accounts were never affected. See Using Document.

  • Copying and moving a file on an SFTP account work again. Both ended in an error every time, and the error was not the whole story. Where the destination folder already existed the file had in fact been copied, so a copy reported as failed had happened, and a move left the file in both places instead of moving it; where the destination folder did not exist, nothing was copied and nothing created the folder. Worth checking: an SFTP file move you were told had failed may have left the file at the destination as well as where it started. Both operations now do what they say, and create the destination folder where one is needed.

  • A cost-trace summary now says its figures are changes, and over which two periods. The one-line summary an answer publishes for forwarding — into a chat reply, a dashboard tile or an automated step — listed each value column’s change as a bare figure, interest_income=$6,177,792.16, and named no period anywhere. Read on its own it was taken for the period’s closing balance, and on a table where one column is the others netted the figures still balance under that reading — so a reader who checked them against each other got a self-consistent wrong answer, with nothing prompting a second look. Given only that line, three independent readers each reported a line of business losing $3.0m, where it was $12.9m down already and had fallen a further $3.0m. The line now leads its figures with the window they are a change over and signs the ones that rose. It also no longer gives one blended rating over columns the answer below it rates differently: where a column is rated lower, that column is named first with its rating and the reason for it, and the rating for the rest follows. An answer about a single value column is unchanged, an answer whose columns agree reads as it did, and no figure moves. See How the Assistant Stays Honest.

  • The faithfulness check now reports on an answer whose fields arrive in the wrong shape, instead of failing outright. Every cost-trace answer comes with a check your assistant can run on the version it reworded — did it keep the confidence rating, keep every limit, invent no figure? The check is handed the original answer alongside the rewrite, and an assistant that rebuilds that answer rather than passing it through can get a field’s shape wrong. Two of those fields brought the check down with an error rather than a verdict: the answer’s opening summary arriving as a number, a list or a structure in place of text, and one of its stated limits arriving labelled with a list or a structure in place of a name. Every other misshapen field was already reported around. Now these two are as well — a summary that isn’t text is left out of the report rather than printed as one, and a limit with an unusable label still reaches Honest limits word for word, with only the label dropped. A well-formed answer is unchanged, and so is everything the assistant writes. See How the Assistant Stays Honest.

  • A cost-trace answer no longer says a change was offset by opposite moves and then rates that same breakdown a clean one. The line naming the member behind a change said movement in both directions had canceled out as soon as that member’s own change edged past the whole net change, while the confidence beside it only counted the offsetting as material a good deal further on. So an answer whose largest line came in a fraction over the net said both things on the same page, with nothing to say which to believe — and the identical sentence had earned a lowered rating on two other answers. That line now says moves offset each other only where the offsetting is large enough to lower the rating, and below that gives the member’s percentage instead. The percentage is given to one decimal place where it goes above 100%, so the small excess over 100% is not distorted by rounding. Answers where the offsetting is material are unchanged, the separate line naming which factor moved is untouched, and no figure moves. See How the Assistant Stays Honest.

  • A cost-trace confidence rating no longer describes the cleanest of several columns while a worse one goes unmentioned. Where an answer covers several value columns graded alike, it took whichever column came first and gave that column’s reason, and its own residual share, as the answer’s — so an answer whose worst column had 91% of its movement in the part no single factor accounts for was published as mostly clean, with 6%. Where any column’s movement is dominated by effects that cannot be separated, that is now the reason the rating gives, and no share measured over the other columns is quoted with it. An answer whose columns agree is unchanged, and no figure you see moves. See How the Assistant Stays Honest.

  • A cost-trace summary now states its confidence wherever the answer carries a limit. The rating was left off altogether where no step behind an answer raised a warning of its own, even where the answer as a whole carried one — a four-column answer that could not be sized against last year ended on its figures with no rating at all, while the report below it carried both the grade and the limit. That summary is the line most often forwarded on its own, into a chat reply, a dashboard or an automated step, where silence reads as nothing to say. It now states the rating and names the limit. A summary that already stated a confidence is unchanged, and an answer with nothing to flag still closes without one. See How the Assistant Stays Honest.

  • A cost-trace answer no longer suggests narrowing a period it has just asked you to check. Where one of the two periods holds far fewer rows than the other, the answer says so and asks for the load to be checked before the change is relied on — and then, a few lines further down, used to offer splitting that same period into narrower ones as the next thing to try. Narrower windows scatter a shortfall rather than resolving it, and the row count that raised the doubt gets weaker in every one of them, so the suggestion is now left out there. It is also left out where an answer covers several value columns and the column it leads with carries no percentage of its own: every percentage the suggestion would qualify then belongs to a column you did not ask about, so it read as a limit on your answer while touching none of it. Answers whose own leading figure the suggestion is really about are unchanged. See How the Assistant Stays Honest.

  • A cost-trace member list says two members are shown at the same amount, not that they moved by exactly the same amount. The comparison is of the figures as printed, to the cent — and the line can sit directly beneath one saying those same figures are rounded and do not add up to the change. Read together, one claimed an exactness the other had just qualified, leaving a reader to work out which to believe. No figure changes and no row is reordered; what the line asks of you is the same. See Analyzing Allocations with AI.

  • A cost-trace member list no longer reads as a ranking where two members tie. A list of members is a ranking, so where two rows show the same amount the one printed first reads as the bigger problem — and nothing separates them. On one automotive model two cost centres each moved -$1,738,461.53 and the page gave no way to tell that from a genuine first and second, so the wrong one would be briefed off it. The table now names those members above the rows and says the order between them is not a ranking. Where a table shows only the largest movers and the cut itself fell on a tie, it also says a member just as large was left out, which is the case where the tie decides not merely the order but which member you see. It does not claim how the order was chosen, since that is not always checkable. No figure changes and no row is reordered, and members that did not move at all are not described as tied — there is no ranking between two nothings to disown. See Analyzing Allocations with AI.

  • A cost-trace answer’s stated change now agrees with the two levels stated beside it. An answer opens with where a figure started and finished and gives the change between them, and all three were rounded to the cent from their own exact totals — so where two of those roundings fell either side of a half cent, the three did not agree. One tax answer read from $25,999,193.60 to $29,833,377.18 and gave the change as $3,834,183.59: a cent more than the difference between the two figures printed with it, and a cent more than the account rows underneath added to. Each figure was within half a cent of its own exact total and nothing on the page said which was the odd one, so a reader who checked by hand came away certain something was wrong and unable to say what. The change is now the difference between the two levels as printed, so subtracting them gives the figure the answer states. Nothing else moves — not the two levels, not the member rows, and not the percentage, which is taken from the exact totals rather than from the rounded ones. See Analyzing Allocations with AI.

  • A cost-trace member table now adds up to the change it breaks down. Each row is rounded to the cent for display while the change itself is rounded once, so on a large movement the column you add up by hand could land a cent away from the figure the answer opens with — with nothing on the page to say whether that was rounding or a mistake. Where the two differ, the table now carries a line above its rows giving both figures and saying the difference is the rounding. No figure changes: no row is nudged to force the tie, so every row still matches its source exactly. A table showing only the largest movers is unaffected — its rows are meant not to add up, and it already says by how much and why. See Analyzing Allocations with AI.

  • The faithfulness check now catches a rewritten answer that deleted its limits. Every cost-trace answer comes with a check your assistant can run on its own reworded version: did it keep the confidence rating, keep every limit, and invent no figure? An answer’s opening summary closes with a short form of the same limits set out below it — by design, so that line still carries them when it is forwarded on its own — and the check read the whole answer. So a rewrite that kept the summary and deleted the Honest limits section it summarizes came back clean: the shortening an assistant is most likely to make, and the one thing this check exists to catch. Lines the answer itself wrote and the rewrite passed through word for word — its opening summary, its step-by-step account of how the change was traced, and the matching next-step suggestion — no longer count as stating a limit. A rewrite that puts a limit in its own words still passes, so does one that keeps the section, and so does one that states the limit somewhere else in the answer. No answer changes — nothing the assistant writes moves, only what the check will accept. See How the Assistant Stays Honest.

  • Trying to run a workflow that’s already running now tells you so. Clicking Run on a workflow that’s still running used to fail with a bare “Internal Server Error” and no explanation, in both the Workflow Detail window and the Workflow Canvas — it now tells you the workflow is already running, and a REST API client hitting the same endpoint gets an HTTP 409 Conflict with the same message instead of a 500. The fix covers the same “nothing was changed” class of condition everywhere it comes up — stopping an already-stopped workflow, editing a locked dimension — not just starting a workflow twice. See Run a Workflow.

  • A cost-trace answer comparing two scenarios no longer describes them as periods. Asking why a figure moved means naming two things to compare it between, and those need not be periods — point the comparison at a scenario, a version, a case, or budget against actual and you get a sound account of the difference between them. The wording around it, though, was written for a calendar. Comparing version 7 with version 8, the answer stepped back one and reported a year-over-year verdict sizing the change against version 6 — “275% the size of last year’s move; 6 → 7 moved -$400,000” — with every figure in it correct and the subject of the sentence wrong. It called the two versions periods, and called the one with fewer rows possibly still loading. An answer now works out whether the column it compares across is a period at all, from the column’s type, its name and the shape of the values you gave it. Where it is not, the opening line names the values compared rather than periods, no year-earlier verdict is offered and the answer says why under Honest limits, and a difference in row counts is described as a difference in what each side covers rather than as an incomplete period. No figure changes. The test is deliberately cautious — a column counts as a period if its type says so, or its name does, or the values look like dates, months, quarters or years — so a whole-number fiscal_year and a text 2026-03 are both still read as periods, and comparisons across a date, period, month, quarter or year column are unchanged. See Answers You Can Trust.

  • Connection credentials are write-only everywhere, and saving a connection never erases one by accident. Every credential field in a connection editor — a password, an API key, an OAuth client secret or refresh token, an SSL client key, an SSH private key — shows blank when you reopen the connection and keeps its stored value if you leave it blank on save; type a new value only when you want to replace it. Twelve single-line credential fields across a dozen connection kinds — among them a Stripe access token, a Monday.com access token, a Bill.com password and developer key, several OAuth2 client secrets, and a Workday API refresh token — used to render as plain visible text instead; they’re masked now, and a saved value is never redisplayed once you leave the field. The REST API key, OAuth client secret, and OAuth refresh token on a REST connection are write-only the same way. Multi-line credentials (the SSL client key and SSH private key on a SQL or Git connection, a Postman API key, a Slack or Teams incoming-webhook URL) stay visible while you’re actively typing them, since that kind of field can’t be masked, but are otherwise write-only too. The same rule holds over the REST API and MCP: send an empty string for a credential field and PlaidCloud keeps the stored value; send null to clear it. Every other field — a database’s read-only flag, a Snowflake account name, a PostgreSQL database, schema, or host name, an SSL mode, an SSH port, among others — shows its real saved value everywhere the connection is shown, and clears normally when you send it blank. See Create and Manage a Connection.

  • An ERP posting step now previews instead of posting live when its own Validate Only setting is left unset. Every ERP posting step carries its own Validate Only setting (labeled Preview or Test Only Mode on some steps), separate from a run’s posting mode. The step editor has always saved this setting explicitly, but a step configuration written another way — over the REST API, over MCP, or through a workflow bundle import — that left the setting out entirely used to post live by default. It now defaults to preview instead, matching what the step editor has always done; setting it to post live on purpose still posts live. See Choose a Posting Mode.

  • A workflow can no longer end up with the same step listed twice. A workflow step can only appear once. A workflow’s structure used to be able to gain one step in two places — most often by retrying an attach or copy that looked like it had failed, when it had actually already gone through — and that duplicate was silently fatal to a run: a Standard Serial run, and a Standard Parallel run stopped at a chosen end step, got stuck in Running forever, with no error, nothing to stop or resume, and disabling the duplicated step didn’t help. (A Standard Parallel run to completion tolerated the duplicate and simply ran it once — that’s unchanged.) Every way of changing a workflow’s structure — inserting steps, copying a step, cloning a workflow, importing a workflow bundle, and the same operations through the REST API and MCP — now refuses a change that would create the duplicate, naming the step so you know what to fix. A workflow that already has a duplicate from before this fix now fails immediately with a clear error instead of hanging, and reordering it (including drag-and-drop) tells you the same thing rather than letting you keep working with it stuck. Delete the duplicate step to repair it — removing steps was never restricted. See Choosing a Workflow Type and Copy & Paste Steps.

  • An Import SQL step whose background worker is interrupted mid-run now retries automatically instead of failing the workflow. The worker that runs an Import SQL step against your database can occasionally restart or get evicted partway through — a platform-side interruption, not something in your workflow — and the platform now re-runs that table’s import for you rather than giving up on it. The retry replaces the table’s contents in full, so you end up with the same result as a single clean run, with nothing for you to do. Previously the retry was refused outright with “has already been attempted,” which failed the step — and on a Standard Serial workflow, stopped every step after it as well. A retried import does take longer than a clean one, since the retry only starts once the platform notices the earlier attempt was interrupted — allow up to about half an hour beyond the step’s usual run time before assuming it’s stuck. Restoring a project and loading a dimension still refuse a second attempt by design, because re-running either would create a duplicate rather than replace anything — that protection is unchanged. See Import SQL.

  • Filtering a dimension hierarchy finds members by their property values again. The Filter: box at the bottom of the hierarchy window searches the alternate, alias, property and value columns you have showing, not just the member’s name in the tree — so typing an account code finds the members carrying it in a property. On the main hierarchy pane this had narrowed to matching the name alone, which is why a code plainly visible in a property column returned no rows; the alternate pane was never affected, so the same box behaved differently in the two panes. Choosing Alternate Hierarchy now also clears the filter from the main pane instead of leaving it filtered. See Finding Nodes in a Hierarchy.

  • The Advanced dimension filter can filter on properties, not only aggregations. Its Column list now offers every property column alongside the aggregations, and a property is compared as text — =, != or contains, ignoring case — against either a value you type or another column. Previously only aggregation columns were offered and any non-numeric value was refused, so a property could not be filtered at all; on a dimension with no aggregations the column list came up empty with nothing to pick. The hierarchy window rebuilds its tree whenever you add, edit or delete an alias, property, value, aggregation or alternate hierarchy, and every way of filtering it now keeps working through that rebuild for as long as the window stays open, not just the first time. Advanced criteria keep applying, switching to a saved layout that carries aggregation filters applies them again instead of leaving the grid silently unfiltered, and the filter strip above the tree is rebuilt to match rather than going stale or holding onto a slicer for an aggregation you’ve since deleted. One thing to know: switching to a saved layout always brings back that layout’s own saved filters, so a filter you’ve adjusted on the fly without saving it into the layout won’t survive an edit that rebuilds the tree. See Advanced Filters.

  • An AI agent tracing an allocation is no longer told a second, independent check confirmed the answer when no such check was possible. When you ask why a cost moved and narrow the question to one slice — a single programme, product line or legal entity — the answer carries a cross-check of that slice against the driver behind the split. Where you narrowed by the very thing the allocation shares out within (a programme whose cost is spread across cost centres, say), that cross-check was comparing a figure with itself, so it agreed every time and could never have done otherwise. Nothing you read on the page said so, but anything reading the answer’s underlying data — a dashboard, or an AI agent judging how far to trust the answer — took the agreement as independent confirmation. The answer now states that the check could not be made there, and why. Where the driver genuinely no longer accounts for the slice, the disagreement is still reported as before, and narrowing by any other column still gets the real check. The written answer is unchanged. See Tracing Allocations.

  • Sample project content is visible to the whole workspace, and viewers get a welcome. The guided sample project, its workflow, and each sample’s auto-built dashboard are now shared workspace-wide the moment they’re created, so a viewer sees the finished sample the same way a builder does, with no separate sharing step needed. Sample dashboards created before this fix pick up the same workspace-wide visibility automatically. And a viewer who lands in a workspace with no visible content yet now gets a welcome offering a short how-to introduction, a guided tour of the app, and quick access to help — so there’s always a next step. See Start With the Sample Project.

  • Single-sign-on invites no longer send a password-setup email. In a workspace that enforces single sign-on, inviting a new member no longer sends the set-your-password welcome email, since the member signs in through your identity provider and has no PlaidCloud password to set. Workspaces that don’t enforce single sign-on are unchanged. See New Member Welcome Email.

  • The Identity tab no longer appears for members who don’t administer identity. Every signed-in member carries a marker saying they are logged in, and that marker was being read as though it granted access to Identity administration — so the Identity tab appeared in the sidebar for everyone, regardless of their security groups. Opening it showed an empty screen: every screen inside it (Members, Member Directory, Distro Lists, Security Groups, the Security Log) has always been individually permission-checked, so a member without those permissions saw nothing there and no member, group, or security data was reachable. The tab is now shown only to members who hold at least one Identity administration permission. Nothing about your own account moves — your profile, options, View My Current Effective Security, and gravatar settings are in the user menu in the upper right, not in that tab, and are unchanged. A member who holds no application permissions at all now lands on the Home page explaining that, instead of on an empty Identity tab. See Managing Security Groups and Assignments.

  • Asking an AI agent the same “what if” question twice now returns the same answer. Asking what happens if an input rises returns the list of results that change, each with an estimate. That list came back in whichever order your project happened to hold its steps in, so the same question, on a model nothing had touched, could return the same results in a different order the next time it was asked — and anyone reading the first entry as the largest was reading whichever one came out first. The same ordering decided two more things. Where two allocations write the same result and each contributes the same amount to it, the answer names one of them as that result’s source; which of the two got named was decided by that ordering as well. And where a table is fed by more than one route — two allocations feeding it, or an allocation alongside a transform step — the answer followed only one of those routes onward, and that ordering chose which. These are now settled, so two identical runs return an identical answer and a difference between this week’s answer and last week’s is a real change in your model rather than a reshuffle. One thing worth knowing as you compare: an estimate for a result that sits below a table fed by more than one route is now measured along the same route every time, which may not be the route an earlier run happened to take, so such an estimate can differ from one you saw before. Estimates for results whose tables are each fed by a single route are unaffected. See Tracing Allocations.

  • Dash apps open for signed-in users again. Opening a Dash app could fail with “Request Header Fields Too Large” before the app itself was ever reached. Once you were signed in, your browser sent a sign-in cookie larger than the app host would accept, so the request was turned away at the door — and because it never got as far as your app, nothing in the app’s own logs explained why. The host now accepts a much larger cookie. An app that is already published picks this up the next time it is built, so use Rebuild on its row if you are still seeing that error. See Rebuilding a Dash App.

  • Setting a project or workflow variable shows you what each variable holds right now. The Project: Set Variable Values and Workflow: Set Variable Values steps list every variable in scope again — one row each, with its Current Value and Memo read fresh every time you open the step. Tick Set on the rows you want the step to write and leave the rest alone. Until now the step showed only the rows already saved on it, and the Current Value beside them was not the current value: it echoed whatever that variable held the last time that step was saved, which could be months ago — and on a step built since the step forms were rebuilt it had never held anything at all, so the column sat blank. Either way it was no help in deciding what to set, and with no list to pick from you had to type a variable’s name from memory and go to another screen to see its value. Nothing about what the step writes has changed — only ticked rows are ever written — so an existing step goes on doing exactly what it did. See Set Project Variable and Set Workflow Variable.

  • A dimension’s “Referenced in Tables” list shows every table that uses it. Select a dimension and the panel on the right lists the table columns mapped to it. It only ever listed columns on tables built by a workflow step, so a dimension used on a table that no step builds — one created directly with New Table, one restored from a snapshot, or one whose step has since been deleted — came up empty, and the mapping looked as though it had been lost. Every mapped column is now listed, with the step and workflow columns left blank where there is no step that builds the table. Double-clicking the table or column still opens it in Table Explorer.

  • Setting a column’s dimension through the API or the assistant now checks that the dimension exists. You can give the dimension’s name, its folder path and name, or its id — any of the three is accepted, as it is everywhere else a dimension is named, and stored correctly. Where two dimensions share a name, the path tells them apart. A value that doesn’t resolve to exactly one of the project’s dimensions is refused with a clear message instead of being accepted and then quietly ignored: the column would not show in the dimension’s “Referenced in Tables” list, would be left behind when the dimension was deleted, would be invisible to the row-level security coverage check so a real gap went unreported, and would be dropped when the table was brought into another project as a bundle. Setting or clearing the dimension from the column properties panel is unchanged.

  • A document account’s folder tree is accurate again, and Delete Old Files reaches sub-folders. Anything reading a document account’s tree — the listing call behind the REST and JSON-RPC APIs, and the listing action of the document_browse tool an AI coding agent connects to — was given a tree that was wrong below its top level, and which way it was wrong depended on the account. On OneDrive / SharePoint and SFTP, every folder was shown holding its own neighbours instead of its contents, and repeating its parent folder’s files as though they were its own, so a folder could appear to contain itself; below that level the tree came back empty. On Azure Blob, the top level was right and everything under it came back empty. Nothing reported an error in either case and the result looked entirely plausible, so an agent asked to inventory an account, size a copy, or choose files to import was working from a structure that does not exist. listing now follows sub-folders to any depth on every account type. Amazon S3, Wasabi and Google Cloud Storage accounts reported the right tree throughout and are unchanged, as is the separate dir listing, which still answers one directory level on the three account types above.

    The Delete Old Files step shared the fault, so check any retention step you have scheduled. With Recursive switched on it never reached sub-folders on OneDrive / SharePoint, SFTP or Azure Blob accounts: it removed only what sat directly in the folder you named, and reported success. A step that has been quietly under-deleting will therefore remove considerably more on its next run than it did last month — use the step editor’s Test button to see what it now matches before letting a scheduled run reach it. On OneDrive / SharePoint the step could also count a folder as one of the items old enough to remove, whether or not Recursive was on; only files are ever deleted now. The historic action that lists those same files without deleting them — over REST, JSON-RPC, or document_browse — is corrected with it. Amazon S3, Wasabi and Google Cloud Storage accounts are unaffected either way. See Delete Old Files.

  • Exporting a dimension’s properties over the API works again. save_properties_to_dataframe — the REST and JSON-RPC call that hands you a dimension’s properties as a table, in the shape its matching load call takes back — failed on any dimension that had a property value set. Usually it failed outright with an error about unpacking, so you knew. The case worth checking is the quiet one: on a dimension whose members are all exactly two characters long — a currency or country code list, say — it raised nothing and returned an empty table, so an export that looked clean may have carried none of your properties. It now returns every member, property and value, and a property holding a list of values comes back as that list rather than the internal text it is stored behind.

    The matching value export is fixed with it. save_values_to_dataframe returned each number as text, and load_values_from_dataframe refuses anything that is not a number — so a set of values exported by one could not be loaded back by the other, which is the pair’s whole purpose. Values now come back as numbers; if you read this call’s output yourself, its value column is now a JSON number where it was a JSON string.

    And bulk-loading aliases now takes effect immediately, rather than at the dimension’s next use. load_aliases_from_dataframe wrote the aliases but left the dimension still answering from the ones it had before, so anything that went on to look a member up by alias in the same operation — a further load, a lookup, an export — behaved as though the load had not happened: a newly loaded alias was reported as not existing, and a replaced one still pointed at the member it used to name. The aliases themselves were written correctly and were right the next time the dimension was opened, so this shows up as a result that changes on a second run rather than as an error. The alias export was correct throughout and is unchanged. See Loading and Unloading Dimensions.