@eigenpal/cli 0.20.57 → 0.20.59

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js CHANGED
@@ -208063,7 +208063,7 @@ function toPutBody(body) {
208063
208063
  // package.json
208064
208064
  var package_default = {
208065
208065
  name: "@eigenpal/cli",
208066
- version: "0.20.57",
208066
+ version: "0.20.59",
208067
208067
  description: "Eigenpal CLI — author and run document workflows from your terminal. Agent-ready.",
208068
208068
  keywords: [
208069
208069
  "eigenpal",
@@ -20,7 +20,7 @@
20
20
  "title": "Changelog",
21
21
  "description": "Production release history for the EigenPal platform.",
22
22
  "source": "public",
23
- "content": "---\ntitle: Changelog\ndescription: Production release history for the EigenPal platform.\n---\n\nEigenPal ships on a unified platform version. Each production release updates Studio, the public API, infrastructure, and (when applicable) the CLI and SDKs together.\n\n{/* GENERATED:CHANGELOG_INDEX START */}\n\n## 0.20.57 (2026-10-18)\n\n- Internal improvements.\n\n---\n\n## 0.20.56 (2026-10-17)\n\n- Internal improvements.\n\n---\n\n## 0.20.55 (2026-10-16)\n\n- Internal improvements.\n\n---\n\n## 0.20.54 (2026-10-16)\n\n### Infrastructure & processing\n\n- Agent definitions now load reliably when starting runs.\n\n---\n\n## 0.20.53 (2026-10-16)\n\n### Platform (Studio)\n\n- Experimental agents now use their TypeScript definitions consistently when running and resuming, with more reliable definition validation and preserved version history.\n\n### Public API\n\n- Agent metadata now follows the released definition consistently across agent listings and runs.\n\n### CLI\n\n- Agent packages now use TypeScript for configuration and schemas. Frozen installs require captured definitions so resumed runs continue using the same version.\n\n---\n\n## 0.20.52 (2026-10-16)\n\n### Platform (Studio)\n\n- Agent validation and run preparation retry once after a temporary timeout.\n\n---\n\n## 0.20.51 (2026-10-16)\n\n### Infrastructure & processing\n\n- Improve OCR update reliability when spare processing capacity is available.\n- OpenParser prioritizes organizations that have purchased credits within regular and batch request queues. Regular requests still precede batches, and long-waiting requests retain protection against starvation.\n\n---\n\n## 0.20.50 (2026-10-16)\n\n- Internal improvements.\n\n---\n\n## 0.20.49 (2026-10-16)\n\n### Platform (Studio)\n\n- Support TypeScript agent definitions in authoring, releases and execution while preserving existing agents and interrupted runs. New agents use typed configuration and schemas.\n\n### Public API\n\n- Agent endpoints support typed agent definitions and validate inputs against the selected release's schemas while preserving existing agent releases.\n\n### CLI\n\n- Create, validate and release agents with typed TypeScript configuration and schemas. Existing agents remain supported, and dataset validation checks the agent's declared schemas.\n\n---\n\n## 0.20.48 (2026-10-15)\n\n### SDK\n\n- Preserve special JSON Schema keys during compilation without changing schema data.\n- The open-source TypeScript authoring SDK provides `createAgent`, typed input/output schemas, and a compiler for agent configuration. Existing agents continue running unchanged; TypeScript source integration follows separately.\n\n---\n\n## 0.20.47 (2026-10-15)\n\n### CLI\n\n- Git authentication keeps working after runtime upgrades when running the CLI from source.\n\n---\n\n## 0.20.46 (2026-10-15)\n\n### Platform (Studio)\n\n- Training conversations show saved messages while the agent prepares in the background. Messages submitted during preparation wait safely until the agent is ready, and connection errors leave conversation history readable.\n\n---\n\n## 0.20.45 (2026-10-14)\n\n### Platform (Studio)\n\n- Human review now displays confidence scores for nested fields even when lineage evidence is unavailable. Run rows also keep review and duration badges from overlapping in narrower lists.\n- Dataset tab in Studio no longer shows \"No runs yet\" for examples that have run. Agent experiment batches now point each example's `latestRunId` at the new run (the workflow path already did), and the examples list falls back to the newest run by example id when that pointer is missing or stale — the same source the example detail pane's Run Activity reads — so the list and detail can no longer disagree about whether an example has ever run.\n- Fix the caret jumping to the end of the \"Note on this example\" field on every keystroke in the dataset-review Resolve panel. The textarea now edits a local draft that stays fresh through React's controlled-state restoration, while still lifting each keystroke to the session draft.\n- Public research now uses the approved company search when its initial query is left blank, avoiding an unnecessary error at the start of research. Model connection failures now include a diagnostic error code when available, helping distinguish timeouts, refused connections and certificate problems.\n- Fix duplicate nested workflow timeline rows and missing start times that leave running leaf-step timers at zero.\n\n### Public API\n\n- Start workflow runs with a bare workflow ID such as `wf_abc` in the `target` field, for JSON and multipart requests. Existing `workflows.&lt;id-or-slug&gt;` targets remain supported.\n\n### CLI\n\n- Clarify how to flag specific dataset review fields and attach field comments with current workflow values. Agent guidance now keeps expected outputs aligned with the full intended workflow output and leaves comparison rules to evaluators.\n\n### Infrastructure & processing\n\n- Grounded extraction now preserves confidence for scalar fields inside nested objects and arrays, so review routing and confidence displays remain complete for structured outputs.\n- Fix duplicate nested workflow timeline rows and missing start times that leave running leaf-step timers at zero.\n\n---\n\n## 0.20.44 (2026-10-14)\n\n- Internal improvements.\n\n---\n\n## 0.20.43 (2026-10-13)\n\n### Platform (Studio)\n\n- GPT-6.1 Sol is available for agents, with lower cached-input pricing than GPT-6 Sol.\n- Organization admins can choose a default runtime model for agents in Model settings. Agents can inherit that choice or select a specific model. Changing the organization default applies to new runs; existing runs keep their selected model.\n- Pro includes 5,000 credits each month. Organization admins can enable optional pay-as-you-go at $1 per 100 additional credits, billed with the monthly subscription. Billing now clearly shows available, used, and reserved credits, the renewal date, and outstanding additional usage.\n\n### Public API\n\n- Agent responses expose their runtime model override. New agent runs resolve an organization default when unpinned and snapshot the model selected from the requested source version and runtime policy.\n\n---\n\n## 0.20.42 (2026-10-13)\n\n### Platform (Studio)\n\n- Apply operating system security updates to application and processing container images.\n- Rerun with changes now preserves the original workflow version and its input fields, including older releases and saved drafts. If that version cannot be loaded, the form shows an error instead of running a newer version.\n- Run details: input values can now be selected and copied, with a copy button on each value. The Rerun menu adds \"Rerun with changes\", which opens the Trigger page pre-filled with the run's inputs and tags so you can edit them before running. Uploaded files need to be added again.\n- Workflow builder: step outputs that are files (such as the merged PDF from Merge Documents) now show as `file` in reference pills and the variable browser, matching file inputs. Start node inputs that come from an external file source show the source name as a badge.\n\n### Public API\n\n- Webhook events now include the run's tags in `data.run.tags`. Tags stay in the event even when a large `output` is omitted, so you can tag a run with your own identifiers in `POST /api/v1/runs` and match every webhook back to your records without an extra API call.\n\n### CLI\n\n- Updated workflow guidance to explain how waiting for child runs frees processing capacity and how to start a child without waiting for its result.\n\n### SDK\n\n- The `tags` option when starting a run now documents that tags are returned in every webhook event as `data.run.tags`, for correlating events with your own records.\n\n### Infrastructure & processing\n\n[View full release notes →](/releases/0.20.42)\n\n---\n\n## 0.20.41 (2026-10-13)\n\n### Platform (Studio)\n\n- Workflow canvas, for large workflows with conditions, switches, loops and parallel steps: - Nested blocks stay inside their branch. - Fork and join lines meet every branch. - Short branches no longer stretch into empty panes. - Containers show their description and can be collapsed to a one-line summary. - Loops say what they repeat over. - \"Fit to screen\" shows the whole workflow. - \"Add step\" buttons appear on hover inside branches and in longer workflows.\n- Workflow editor and Evals fixes: - Undo now takes one step back per change, including the first change after an undo. - Undoing a newly added step also closes its settings panel. - Cmd+S saves from inside a field, including edits you haven't left the field for yet. - Leaving with unsaved changes offers Save & Leave. - The unsaved-changes marker is a labelled \"Unsaved\" status. It no longer appears on Evals right after saving. - New steps describe missing settings by name (\"Input is required\") instead of raw validation text. - The run panel opens the output when a run finishes. - Experiments that no evaluator scored show \"Not scored\" instead of 0%. - Evaluator names are formatted as you type, and save errors read as plain sentences. - A new dataset example opens on its Input tab. - The toast for starting an experiment from Dataset has a View link to the results.\n- Workflow editor and Evals: the canvas is calmer, with Start and End matching the step cards, Run inside the Start card, neutral connectors, quieter step containers and a subtle response on hover and click. Switching between Editor and Evals, and between Experiments, Dataset and Evaluators, now responds the moment you click, and the workflow version stays visible on both views. Experiments are listed by their example count with a short id instead of a long raw id, \"Run all dataset examples\" shows progress while it starts, an empty time range shows a single clear message instead of empty charts, and experiments without evaluators point you to adding one. Workflow Pal always builds with the current Parse Document and explains that the previous version is kept only for existing workflows.\n- Workflow editor: - The canvas has Undo and Redo buttons. - Renaming a step, a workflow input, or a Set Value or Extract Data field updates every reference to it. - The run panel shows the run's status and duration first. - Step types are named as on the canvas (\"Set Value\"). - When a run input is missing, the form highlights the field and moves the cursor to it. Evals: the pass threshold is set in the evaluator config and saved with it, with a single \"Save evaluators\" button.\n- Grafana dashboard: the Deployment target now defaults to All and panels merge targets, so the dashboard keeps working after an app pod restart changes the scrape target's IP instead of showing NO TARGET until someone picks the new one.\n- Workflows: new Merge Documents step combines several uploaded files (PDFs, scans, phone photos, Word, PowerPoint and OpenDocument files) into one PDF, so Parse, Label Pages, Split and Inspect Pages number pages continuously across every file. Its output lists which pages came from which upload, and the run view shows that page map. In the step picker, Parse Document is now the only parser offered for new steps; existing steps on the previous parser show as Parse Document v1 and offer a one-click switch. Run views now preview the right document when a step reads a file produced earlier in the run, and output files show their real names.\n- Prometheus: a new `eigenpal_automation_ocr_pages_total\\{automation_id}` counter reports the OCR pages each workflow processed. The Grafana dashboard now shows total OCR pages for the selected range, an OCR pages by workflow table, and a pages-per-minute chart of the top 10 workflows.\n- SSO: API keys owned by an SSO user no longer stop working 24 hours after the owner's last sign-in when EigenPal cannot re-check them with the identity provider. Scrapers and integrations keep running; keys still stop when the identity provider refuses the owner, the owner is removed or demoted, or the key is revoked. Refused keys now log a reason (`owner_refused_by_directory`, `owner_without_access`) instead of failing silently.\n\n### Public API\n\n- Starting a run with a single file for an input declared as a list of files now works: the file is treated as a one-item list instead of being rejected.\n- `GET /api/v1/runs` accepts `hasExample=true` to return only runs linked to a dataset example, so evaluation views no longer have to page through production runs to find them.\n\n### SDK\n\n- Listing runs accepts a `hasExample` filter (`has_example` in Python) that returns only runs linked to a dataset example.\n\n[View full release notes →](/releases/0.20.41)\n\n---\n\n## 0.20.40 (2026-10-11)\n\n### Platform (Studio)\n\n- Security hardening: people join an organization only by accepting an invite (the direct \"add existing user\" endpoint is gone), only owners can grant the admin role, members can revoke only their own API keys, API keys can no longer manage keys, members, invites, organization settings, sharing or billing, and demoting someone to viewer or reviewer revokes their API keys. Agent training only reads this session's uploads, email triggers accept a sender only when DMARC passes for the From domain or, for domains without DMARC, SPF passes for that domain, and workflow templates cannot read files from the worker.\n\n### Public API\n\n- Listing workflow executions only resolves file names for files in your own organization.\n\n---\n\n## 0.20.39 (2026-10-10)\n\n### Platform (Studio)\n\n- File source connections: a \"Files (multiple)\" input can now use an external source. Callers start the run with a list of file references (for example several GFR documents for one mortgage application), and the platform fetches each one through the connection and hands the workflow the full list of files, in order.\n- Run form: lists are easier to fill in. Execution tags, and inputs that take a list of text or numbers, now use a chip input: type a value and press Enter, or paste a whole column or row at once. A value that doesn't fit, such as text in a number list, is marked before the run starts. Inputs with a fixed set of allowed values show every option as a chip you can toggle.\n\n### CLI\n\n- The workflow reference now documents `source` on file-list inputs (`type: array`, `items: \\{ type: file }`), which take one file reference per file.\n\n### Infrastructure & processing\n\n- Pushes and fetches of workflow source that are in progress during a platform update now finish instead of being cut off.\n\n---\n\n## 0.20.38 (2026-10-09)\n\n- Internal improvements.\n\n---\n\n## 0.20.37 (2026-10-09)\n\n### Platform (Studio)\n\n- Error reports sent from the browser now scrub tokens, secrets and sensitive URL parts before they leave the page, the same way server error reports already did.\n- Runs started from the CLI keep showing a plain \"CLI\" trigger in run details, without an extra SDK badge, now that the CLI identifies itself on API requests.\n- Grafana dashboard: a new \"Worker slots online\" tile shows how many jobs your workers can run at once, next to \"Workers online\". Slot panels and the worker table now say \"worker slots\" so a worker (one process) is never confused with its job slots.\n\n### CLI\n\n- The CLI now identifies itself on every API request with a `User-Agent: eigenpal-cli/&lt;version&gt; (&lt;runtime&gt;; &lt;os&gt;)` header and the same `X-Eigenpal-Sdk-*` headers the SDKs send, so CLI traffic and errors can be told apart from SDK and browser traffic. Runs started from the CLI record the CLI version in their trigger metadata.\n\n### Infrastructure & processing\n\n- When an AI extraction or vision step returns output that does not match its schema, the run now fails as a schema mismatch in the model output instead of a generic platform error, so failure reports and metrics point at the step's schema or model rather than at the platform.\n\n---\n\n## 0.20.36 (2026-10-09)\n\n- Internal improvements.\n\n---\n\n## 0.20.35 (2026-10-09)\n\n### Platform (Studio)\n\n- Monitoring: the Prometheus metrics endpoint now counts failed runs by cause (`eigenpal_execution_failures_total`), so input problems and deliberate workflow rejections no longer look like platform errors. A run stopped by a workflow's `control.fail` step now reports the `workflow_rejected` failure code.\n\n### Infrastructure & processing\n\n- Monitoring: the Prometheus metrics endpoint now counts failed runs by cause (`eigenpal_execution_failures_total`), so input problems and deliberate workflow rejections no longer look like platform errors. A run stopped by a workflow's `control.fail` step now reports the `workflow_rejected` failure code.\n\n---\n\n## 0.20.34 (2026-10-08)\n\n### Platform (Studio)\n\n- Monitoring: the Prometheus metrics endpoint now reports registered organizations and users, organizations active in the last 7 and 30 days, and paying organizations, so operators can follow adoption next to processing health.\n\n---\n\n## 0.20.33 (2026-10-08)\n\n### Platform (Studio)\n\n- Monitoring: our team now tracks run volume, outcomes and timing across EigenPal Cloud in real time, so slowdowns and failures are spotted and fixed sooner.\n\n---\n\n## 0.20.32 (2026-10-08)\n\n### Platform (Studio)\n\n- Billing: our team is now notified as soon as a payment, renewal, failed payment, refund or dispute happens, so billing problems on your account get followed up faster.\n\n---\n\n## 0.20.31 (2026-10-08)\n\n### Platform (Studio)\n\n- Monitoring: the Webhooks section of the EigenPal Grafana dashboard now shows events delivered alongside events not delivered, with a donut of delivery outcomes for the selected range and a per-minute chart of delivered versus not delivered.\n- Summary research now saves valid claims together while identifying only those needing correction. Clearer review guidance and more reliable document access reduce repeated failed attempts before completing financial chapters.\n- Public research claim details now show the full sentence, acceptance status and supporting evidence, including earlier claims that were subsequently revised.\n- Webhooks: endpoints can now be shared like workflows. A Manager of an endpoint (and any owner or admin) shares it with people and groups as Viewer, Editor or Manager, and members can create their own endpoints. An endpoint receives either every run (owners and admins only) or runs of selected workflows, and nobody can point one at runs of a workflow they cannot open. Existing endpoints stay private to owners and admins.\n\n---\n\n## 0.20.30 (2026-10-08)\n\n### Platform (Studio)\n\n- Fixed run cancellation and research approvals being rejected behind HTTPS reverse proxies while retaining browser origin checks. Improved public research with relevant source excerpts, a source-checked driver brief, and an independent editing pass. Chapter agents can investigate material public evidence gaps with human-approved searches and record their research decisions. Source pickers now emphasize filenames with file types underneath.\n\n---\n\n## 0.20.29 (2026-10-08)\n\n### Platform (Studio)\n\n- Settings, File Sources is now a list of named data source connections. **Add data source** opens a side panel where you pick GPFS/GFR, Amazon S3 or Azure Blob Storage, name the connection and fill in its settings, so a deployment can keep, for example, a test and a production registry side by side. Workflow inputs pick a connection by name in the builder, and run forms and API docs show the reference format it expects. Connections defined in the deployment configuration are marked as such and open read-only, with any configuration problems listed. Stored secrets can be removed, and contradictory sign-in settings are refused when saved.\n- Monitoring: the Prometheus metrics endpoint now reports webhook delivery attempts with their outcome and failure reason, events that were never delivered, delivery backlog and the oldest due delivery, and receiver response times. The EigenPal Grafana dashboard has a new \"Webhooks\" section, and the metrics guide includes ready-to-use alert rules for failing receivers, undelivered events and stalled delivery.\n- Webhooks: a new **Delivery settings** panel sets the retry policy, the request timeout and, on self-hosted deployments, whether endpoints may resolve to private network addresses. Settings pinned by the deployment show a lock. Each failed delivery now explains why it failed (for example, blocked private address, TLS handshake failure or connection refused), right in the delivery list, and links to the setting that fixes it. Deliveries waiting to retry show when the next attempt runs, and unsaved endpoint changes collect in a save bar that no longer shifts the page.\n\n### Public API\n\n- Run inputs that fetch a file from a file source connection now accept the reference as two fields as well as one string: `\\{ \"stackId\": \"...\", \"fileId\": \"...\" }` for GPFS/GFR, `\\{ \"bucket\": \"...\", \"key\": \"...\" }` for Amazon S3 and `\\{ \"container\": \"...\", \"blobName\": \"...\" }` for Azure Blob Storage, alongside `stackId/fileId`, `bucket/key` and `container/blobName`. Fields that do not match the connection's type are rejected with a message naming the expected ones.\n\n### CLI\n\n- The bundled webhooks guide and reference now cover delivery settings, the retry schedule, and how to ask for a retry while your receiver is still storing a run.\n- The bundled Prometheus metrics guide now documents webhook delivery metrics and example alert rules.\n\n### Infrastructure & processing\n\n- File source inputs can now fetch documents from Amazon S3 (and S3-compatible storage such as MinIO or Ceph) and from Azure Blob Storage, alongside GPFS/GFR registries. A run passes `stackId/fileId`, `bucket/key` or `container/blobName`; GFR can still take a bare file id, which uses the configured default stack. S3 signs in with an access key or by assuming an AWS role, and Azure with a Microsoft Entra ID service principal or a SAS token. Each connection can be limited to an allow-list of stacks, buckets or containers, and a deployment can have several connections of one type. On-premises deployments can pin file source settings in the Helm chart, where they show as managed and read-only in Settings, File Sources, and can trust an internal certificate authority for outbound connections. All sources honor the standard HTTPS proxy settings. Brief network or storage outages are retried automatically while fetching, while a bad reference, a missing file or denied access fails the run straight away. For existing GFR callers, a file id that contains `/` is now read as `stackId/fileId`.\n- Self-hosted deployments now deliver webhooks to endpoints on the private network by default, matching file sources and telemetry export. Previously these deliveries were refused without sending a request. Loopback, link-local and cloud metadata addresses stay blocked on every deployment, so a webhook can never reach the worker itself or node credentials.\n\n---\n\n## 0.20.28 (2026-10-07)\n\n### Platform (Studio)\n\n- Parse native and scanned documents automatically with the new Parse Document step. It preserves usable native PDF pages, recovers unread content with configured OCR or vision, and reports the source and completeness of each page. Advanced controls let you choose providers, restrict backends, require layout evidence, and tune vision processing. Existing parser steps keep their behavior. New workflows use automatic parsing, and you can review an explicit migration before publishing an updated workflow. The CLI and SDKs also provide a parsing configuration readiness check to help prepare deployments for scanned documents.\n- Preserve workbook-aware XLS/XLSX display formatting, trim empty trailing sheet extent before conversion limits, and expose optional original cell evidence for mixed date/identifier extraction. Forward sheet metadata through workflow execution and document how agents should use source evidence.\n\n### Public API\n\n- Inspect configured document-reading capabilities and provider selection through the authenticated parsing readiness endpoint. The response reports native/OCR/vision configuration and does not claim live endpoint verification.\n\n### CLI\n\n- Review document-parser migrations before publishing them with the new parser migration command. Updated workflow templates and agent guidance use automatic parsing by default. Inspect parsing configuration readiness through the CLI and SDKs to check whether your deployment has providers for scanned documents.\n\n### SDK\n\n- Review document-parser migrations before publishing them with the new parser migration command. Updated workflow templates and agent guidance use automatic parsing by default. Inspect parsing configuration readiness through the CLI and SDKs to check whether your deployment has providers for scanned documents.\n\n---\n\n## 0.20.27 (2026-10-07)\n\n### Platform (Studio)\n\n- Restore the PDF embedding, employment verification, Hacker News digest, and slow pipeline templates in the workflow template picker.\n- Financial summaries now investigate the drivers behind material changes across reporting periods. Other chapters wait for completed financial analysis and use it as additional context; incomplete financial chapters can be retried before the rest of the summary proceeds.\n- Monitoring: the Prometheus metrics endpoint now reports LLM token usage and finished runs for each workflow and agent, and the EigenPal Grafana dashboard has a new \"Usage by workflow\" section showing tokens, share of total, runs, and tokens per run per workflow, plus a chart of the top 10 consumers and a workflow filter.\n- Strengthened document image processing and mathematical expression rendering security.\n- Workflow access control: share workflows and folders with specific people or groups at four levels (Viewer, Runner, Editor, Manager). Access is set on top-level folders, the way a shared drive is run: everything inside a folder has that folder's access, so there is one place to check and change it. Making a folder private limits it to the people and groups you choose. Groups come straight from your identity provider (Keycloak, Entra ID, Okta, or a corporate sign-in service) and stay managed there, or can be created in EigenPal for password users. Each folder says at the top who can open it, with a Manage access button, and right-clicking a folder or workflow offers Manage access too. The access panel shows everyone who can open an item and why, and says who gains or loses access before you save. Moving something into a folder with different access asks first and shows the access before and after. Settings gains an Access control page: check whether a person can open a folder or workflow and see exactly why, see each person's groups and what your identity provider reports for them, and manage groups. A per-person access review sits on each member. Every sharing and group change is recorded in the audit log. Directory changes apply within minutes, and disabling someone at the identity provider signs them out of EigenPal. Admins can make every new top-level folder and workflow start private, and export who can open what as a CSV for access reviews. When an owner or admin opens a private item only their role lets them see, that is recorded too. Run history of a deleted workflow is visible to owners and admins only. Nothing changes for an organization until it makes something private.\n- Faster folder navigation for workflows. A folder tree now sits beside the workflow list: open any folder in one click, keep your place as you move around, and use the arrow keys to browse it. Long folder paths fold their middle into a menu so the path stays readable. Organize by dragging. Drop a workflow or folder onto a folder in the list, in the tree, or in the path above the list to move it there. Folders in the tree open when you hover over them while dragging, so you can move items several levels deep in one go. A preview follows the pointer and names where the item will land, only valid folders light up, and every move can be undone from the confirmation. Top-level folders and workflows show who they are shared with. Hover the avatars to see each person and group with their access level, or click them to manage sharing.\n\n### Public API\n\n- Automations, runs, datasets, experiments, evaluators, versions, folders, files and review endpoints now honor workflow access control. A workflow the caller cannot open answers `404`, exactly like one that does not exist, and is left out of every list. A workflow the caller can open but not change answers `403` for the change. Starting a run needs Runner access. API keys act with the access of the person who created them.\n\n### CLI\n\n- Simplify the bundled Prometheus metrics guide to bearer API key authentication and the metrics reference.\n\n### SDK\n\n- Strengthened Python SDK generation security while preserving Python 3.10 compatibility.\n\n[View full release notes →](/releases/0.20.27)\n\n---\n\n## 0.20.26 (2026-10-06)\n\n### Infrastructure & processing\n\n- Applied security updates to the GPU hosts that run document recognition and to a logging dependency used by the processing services.\n\n---\n\n## 0.20.25 (2026-10-06)\n\n### Platform (Studio)\n\n- Workflow Pal now honors configured authentication and custom headers for private model gateways, matching workflow execution and preventing chat failures on gateways requiring additional credentials.\n\n---\n\n## 0.20.24 (2026-10-06)\n\n### Platform (Studio)\n\n- Workflow and agent Swagger exports now include the run's `execution` object, documenting status and execution details consistently with API responses.\n\n---\n\n## 0.20.23 (2026-10-05)\n\n### Platform (Studio)\n\n- API keys: choose an access level when you create a key. **Full access** works with the API, CLI, and SDKs, as every existing key does. **Observability (read-only)**, available to owners and admins, can only read the Prometheus metrics endpoint, so monitoring systems no longer need a key that can run automations or read your data. On self-hosted deployments the Prometheus endpoint is now on by default and authenticates with an observability key, so monitoring needs no server configuration.\n- Monitoring: the Prometheus metrics endpoint for self-hosted deployments now reports LLM token usage by model, execution throughput and failure counts, execution, queue-wait, step, and LLM call latency histograms, OCR page volume, human-review outcomes, and per-worker process health (memory, CPU, event loop lag, and busy slots) alongside live queue depth. Counters stay accurate across restarts and data retention, a single scrape target covers the whole deployment, and collectors that request OpenMetrics (including Prometheus 3) receive it. Metric names follow Prometheus naming conventions, and the new Prometheus metrics documentation covers every metric. Owners and admins can turn the endpoint off in Settings > Monitoring, which also links to a prefilled form for creating an observability API key.\n\n### Public API\n\n- API keys now have an access level. Every API endpoint requires a **Full access** key, which is what all existing keys have, so existing integrations keep working. An **Observability (read-only)** key is refused with `403` by every endpoint except `GET /v1/auth/check`, which reports the key's own identity and scopes so you can verify a key before using it.\n\n---\n\n## 0.20.22 (2026-10-05)\n\n### Platform (Studio)\n\n- Workflow validation now accepts dynamic child-workflow targets with a runtime-check warning, explains why dynamic inline targets are unsupported, and rejects review selectors that a known schema proves cannot select a scalar field.\n- Downloaded API specs for a single workflow or agent now report that automation's own version instead of the platform release number, so upgrading Studio no longer looks like an API change to generated clients. The platform release is still included in the spec as `x-eigenpal-platform-version`. Self-hosted installs behind a proxy or OpenShift route also get the correct public server URL in the spec, and the spec no longer lists an unreachable server address when the public hostname cannot be determined.\n- Studio picks up the latest security fixes in its web framework.\n\n### Public API\n\n- Run input failures now report specific causes and include the input location and run correlation ID in debug diagnostics, without exposing document contents or storage paths.\n\n### CLI\n\n- Evaluation summaries now distinguish execution success from evaluator verdicts. Existing success-count fields remain available, and online validation warnings no longer cause a failed validation exit.\n\n### Infrastructure & processing\n\n- Child workflows now start only after their input files are available, improving reliability when forwarding files nested inside other inputs. File preparation failures now identify missing files and invalid references more clearly.\n\n---\n\n## 0.20.21 (2026-10-02)\n\n### Platform (Studio)\n\n- Assign dynamic tags to child workflow runs, filter run history by an exact tag, and open matching runs from their tag labels. Retries and reruns retain the original tags. Set tags on the Trigger page and generate tagged REST and SDK examples on Connect.\n\n### Public API\n\n- Workflow and agent run requests accept `tags` as a string or a list of strings. Run responses include tags, and `GET /api/v1/runs?tag=...` finds runs with an exact, case-sensitive tag.\n\n### CLI\n\n- Use `eigenpal runs list --tag &lt;tag&gt;` to find runs with an exact tag, such as a request ID. Start an ad-hoc workflow or agent run with `eigenpal run &lt;target&gt; --tag &lt;tag&gt;`. Repeat `--tag` for multiple tags.\n\n### SDK\n\n- Pass execution tags when starting workflow or agent runs with the TypeScript and Python SDKs, including runs with file inputs. Filter run history by tag using the runs client.\n\n---\n\n## 0.20.20 (2026-10-02)\n\n### Platform (Studio)\n\n- Summary builder: invalid claim registration input now shows a clear error instead of a misleading claim count.\n- Settings: each settings page now shows a loading placeholder shaped like the page itself, instead of a generic one that repeated the settings navigation and title.\n\n### Infrastructure & processing\n\n- Strengthen security protections for document extraction.\n\n---\n\n## 0.20.19 (2026-10-01)\n\n### Platform (Studio)\n\n- The Agents page and agent detail views load faster, especially for organizations with many agents. Opening one agent now reads only that agent instead of the whole organization, and source lookups for one organization no longer slow down other organizations.\n- Dashboard pages respond faster. Every page load and live refresh in EigenPal now does less work before returning data, and pages that hit a permission error show it right away instead of retrying first.\n- Pages and live status updates in EigenPal Studio respond faster, because signed-in requests no longer wait on an account profile lookup every time. A change to your account email still takes effect within a minute, and invitations are always matched against your current verified addresses.\n- Hardened sign-in account linking: signing in with an email address no longer connects you to an existing EigenPal account that belongs to a different sign-in. If your previous sign-in account was deleted, signing up again with the same email still restores access to your existing account.\n- The Workflows and Runs pages load faster, especially in organizations with many workflows or a long run history. The Workflows page now fetches only what its cards and rows show, folder previews load alongside the folder list, and the Runs page stops refreshing in the background while its tab is hidden, then catches up as soon as you return. The \"Triggered by\" filter on the Runs page now lists people who started runs in the last 90 days unless you pick a date range.\n\n### Public API\n\n- `GET /api/v1/agents` responds faster, including single-agent lookups with `?slug=`. The new optional `includeExampleCount=false` query parameter omits `stats.exampleCount` for callers that do not need it.\n- `GET /api/v1/runs` and `GET /api/v1/runs/:id` respond faster when runs belong to large workflows. Responses are unchanged.\n- Rate limits for requests made from a signed-in EigenPal dashboard session now count reads separately from writes, so browsing and live-refreshing pages no longer use up the allowance for starting runs. File downloads, artifact archives, traces, dataset and experiment exports, session transcripts, and run event streams still count toward the shared allowance. Limits for API key requests, including those from the CLI and SDKs, are unchanged.\n- When a signed-in session cannot be connected to an existing EigenPal account, API requests now return `403` with a message explaining how to get help, instead of a generic authentication or server error.\n\n---\n\n## 0.20.18 (2026-10-01)\n\n### Platform (Studio)\n\n- Downloaded API specs for a single workflow or agent now report that automation's own version instead of the platform release number, so upgrading Studio no longer looks like an API change to generated clients. The platform release is still included in the spec as `x-eigenpal-platform-version`. Self-hosted installs behind a proxy or OpenShift route also get the correct public server URL in the spec, and the spec no longer lists an unreachable server address when the public hostname cannot be determined.\n- Strengthen security protections for image generation, document previews, and telemetry transport.\n- Studio pages feel faster. Pages without a code editor or PDF preview load less up front, opening a workflow, agent, template, review queue, or developer page now shows a placeholder shaped like that page, and workflow links open the editor directly. On the Evals page, the side panels appear right away, changing the date range keeps the current results visible until the new ones arrive, and the runs list and overview no longer show each other's data. The agent editor keeps its files and instructions on screen while a conversation resumes, and opening a workflow folder link on a later page keeps that page.\n- Run details open faster. Selecting a run shows its name, status, and actions right away, and each section fills in on its own as it loads instead of the whole pane waiting on a skeleton. Inputs, outputs, and the step trace load side by side, long traces load their pages in parallel, and sections no longer go blank for a moment when a run finishes. Switching between the timeline and the raw trace reuses what is already loaded. Workflows, runs, and agents also start loading their details when you hover over or focus them in a list, so opening one feels quicker.\n- Pages load faster after signing in and when opening a link directly. Your organization is ready as soon as the page appears, so lists, agents, and run details start loading right away instead of waiting a moment first.\n- Usage: a new \"LLM usage by workflow\" table shows the tokens each workflow and agent consumed in the selected range, with run count, average tokens per run, cached input, and share of total, so teams can see which automations drive their LLM spend.\n\n---\n\n## 0.20.17 (2026-09-30)\n\n- Internal improvements.\n\n---\n\n## 0.20.16 (2026-09-29)\n\n### Platform (Studio)\n\n- Run reviews now preview input files with the same document viewer as dataset reviews. Multi-file runs get one-click previous/next switching with a position indicator, PDFs and images get full zoom controls, and the file picker lives in the viewer header instead of a separate bar. Field-evidence highlights and the approval workflow are unchanged.\n\n---\n\n## 0.20.15 (2026-09-29)\n\n- Internal improvements.\n\n---\n\n## 0.20.14 (2026-09-29)\n\n- Internal improvements.\n\n---\n\n## 0.20.13 (2026-09-29)\n\n### Platform (Studio)\n\n- Dataset reviews in Studio: filter the field queue to flagged-only (document order preserved), return to the Datasets list on close without pre-selecting the last automation, show the requester's note read-only above the reviewer note box, remove the approve-all-fields flow (untouched fields are assumed error-free), and rename user-facing Approve labels to Submit.\n- Apply security updates to sign-in, workflow execution and document processing.\n\n### CLI\n\n- Apply security updates to workflow validation dependencies.\n\n### Infrastructure & processing\n\n- Apply security updates to sign-in, workflow execution and document processing.\n\n---\n\n## 0.20.12 (2026-09-28)\n\n- Internal improvements.\n\n---\n\n## 0.20.11 (2026-09-25)\n\n### CLI\n\n- `eigenpal auth login` now opens the dashboard in your browser without routing the URL through a shell, so an unusual server address can never be interpreted as a command.\n\n---\n\n## 0.20.10 (2026-09-24)\n\n### Platform (Studio)\n\n- Studio model picker: add GPT 6 Sol, GPT 6 Luna, and Claude Opus 5.5 as selectable models for workflow steps and agents. The recommended list now surfaces the new generation; Opus 5 and the 5.6 Sol/Terra/Luna models remain available via search.\n- Dataset review: the fields queue now follows the output in document order. Flagged fields keep their highlight where they appear and removed fields stay in place with their removed styling, instead of being sorted to the top or bottom.\n\n---\n\n## 0.20.9 (2026-09-24)\n\n### Platform (Studio)\n\n- Reviews → Datasets: requesting a review is now fast even for many examples with large files — snapshotting downloads input files in parallel and no longer re-downloads them for the response. Reviews can also be cancelled (a frozen state like closed, reopenable back to open), and Studio lets reviewers close a review with undecided examples still in it: closing locks the review and only decided examples count as submitted.\n\n### Public API\n\n- Reviews → Datasets: requesting a review is now fast even for many examples with large files — snapshotting downloads input files in parallel and no longer re-downloads them for the response. Reviews can also be cancelled (a frozen state like closed, reopenable back to open), and Studio lets reviewers close a review with undecided examples still in it: closing locks the review and only decided examples count as submitted.\n\n### CLI\n\n- Reviews → Datasets: dataset review requests gain a `cancelled` lifecycle status. The CLI accepts `update --status cancelled` (and shows it in `list --status` filters), and the TypeScript/Python SDK status enums include the new value.\n\n### SDK\n\n- Reviews → Datasets: dataset review requests gain a `cancelled` lifecycle status. The CLI accepts `update --status cancelled` (and shows it in `list --status` filters), and the TypeScript/Python SDK status enums include the new value.\n\n---\n\n## 0.20.8 (2026-09-24)\n\n- Internal improvements.\n\n---\n\n## 0.20.7 (2026-09-24)\n\n### Platform (Studio)\n\n- Members: on self-hosted deployments with password sign-in, owners and admins can reset a member's password from Settings → Members. The admin sets a temporary password, the member is signed out on every device, and the next time they sign in they have to choose a new password before they can use the app.\n\n---\n\n## 0.20.6 (2026-09-24)\n\n### Platform (Studio)\n\n- Dataset review: add missing fields and line items without leaving the review, confirm object and array values, and approve every unreviewed field at once from the queue. Newly added fields now survive saves and refreshes until confirmed.\n- Reviews → Datasets: reviewers can open the dataset review inbox without workflow access. Studio loads the queue from `GET /api/v1/dataset-review-requests` (gated by `dataset_review:read`) instead of listing automations first, so reviewers see their requests rather than a permission error.\n\n### Public API\n\n- Reviews → Datasets: reviewers can open the dataset review inbox without workflow access. Studio loads the queue from `GET /api/v1/dataset-review-requests` (gated by `dataset_review:read`) instead of listing automations first, so reviewers see their requests rather than a permission error.\n\n### SDK\n\n- Reviews → Datasets: the TypeScript and Python SDKs expose the tenant-wide dataset review inbox as `client.datasetReviewRequests.list()` / `client.dataset_review_requests.list()`, with the same status filter and pagination as the Studio queue.\n\n### Infrastructure & processing\n\n- Document OCR stays up under rapid bursts of complex pages. The GPU inference server now uses smaller recognition batches and leaner memory allocation, so back-to-back multi-region documents no longer risk an out-of-memory restart — and the one-minute engine-failure alert from the last release still watches for any recurrence.\n\n---\n\n## 0.20.5 (2026-09-23)\n\n### Platform (Studio)\n\n- Dataset review now walks you to the finish: deciding an example advances to the next pending one and opens a completion sheet when nothing remains. The header shows an `n/m reviewed` pill that opens the same sheet, with Approved / Removed / Corrected counts, a Close review button (disabled until every example is decided), and the pull command for handing snapshots to an agent. The Resolve button stays green for pending, edited, and approved examples — only removed stays red.\n- Dataset review: text, spreadsheet, and other non-PDF input files now show the same header as PDFs and images, so reviewers can switch back to the other inputs from every file type.\n- Dataset review: clicking a field now reveals it in the Output JSON tree even when it sits inside a collapsed list item, scrolling it into view with its highlight.\n\n### Public API\n\n- Dataset review item decisions now use `removed` instead of `rejected` across progress counts, field/file decisions, and update actions. Callers that previously sent `action: \"reject\"` or `decision: \"rejected\"` should switch to `remove` / `removed`.\n\n### CLI\n\n- `eigenpal auth status` (alias `whoami`) shows the active profile, server URL, and whether the credential validates, with `--json` support for scripting.\n- `--json` output is now safe to pipe: status chatter stays off stderr so `2>&1 | jq` parses, and re-pushing identical YAML with `workflow push --file X --json` reports `\\{ unchanged: true }` instead of an error.\n- `eigenpal reviews` dataset-review actions and decisions now use `remove` / `removed` instead of `reject` / `rejected`, matching the public API rename.\n\n### SDK\n\n- Dataset review SDK types and helpers now expose `removed` instead of `rejected` for item status, progress, field/file decisions, and update actions.\n\n---\n\n## 0.20.4 (2026-09-23)\n\n- Internal improvements.\n\n---\n\n## 0.20.3 (2026-09-23)\n\n### Platform (Studio)\n\n- Expected-output files now review the same way fields do, on the right side of the dataset review panel: preview or edit text, Office, and spreadsheet files in place, upload corrected or brand-new versions, and record per-file approvals with notes. The review queue header lives in the breadcrumb bar with a status filter, so finished requests stay findable.\n\n### Public API\n\n- Dataset review items now cover expected-output files, not just fields: record per-file approve/reject decisions with notes, upload corrected bytes for an existing file or a brand-new one (50MB cap), and download the reviewer-corrected version with `kind=expected` on the item file endpoint. Closing a finished review still never auto-applies — reconcile corrected files into the live dataset by hand.\n- Dataset review file actions now accept the `expected/`-prefixed file path form (for example `expected/report/report.docx`) wherever a per-file decision or correction is recorded. It resolves to the same manifest-relative entry reviewers see, so paths copied from `$file` references in `expected.json` no longer fail with `unknown expected file`.\n\n### CLI\n\n- Expected-output files are first-class reviewable units: `pull --out &lt;dir&gt;` downloads per-example expected files (reviewer-corrected when the item has an overlay entry, else the snapshot) alongside `item.json`; `item --action edit-file` uploads corrected bytes (`--file-path` fixes an existing file, `--new-path` uploads a brand-new one, 50MB cap); `item --action file-decision` records per-file approve/reject with notes (`--comment` alone is a note and needs an existing decision); `get`/`items` show per-file decision summaries. Reconcile corrected files into the live dataset by hand — reviewers can err.\n\n### SDK\n\n- Expected-output files are covered too: items carry `currentExpectedFiles` (null means pristine snapshot) and `fileDecisions`; `getItemFile` / `get_item_file` accept `kind: 'expected'` to download reviewer-corrected bytes (default stays `input`); `recordItemFileDecision` / `record_item_file_decision` records per-file approve/reject or notes (`decision: null` clears); `editItemFile` / `edit_item_file` uploads corrected bytes for an existing path or a brand-new upload (50MB cap).\n\n---\n\n## 0.20.2 (2026-09-23)\n\n### Infrastructure & processing\n\n- Document OCR is now more resilient under heavy load. Back-to-back parsing bursts no longer risk taking the whole OCR fleet offline at once — jobs queue briefly and resume automatically — and monitoring catches GPU inference failures within a minute instead of several.\n\n---\n\n## 0.20.1 (2026-09-23)\n\n### Platform (Studio)\n\n- Credit limits now apply consistently across the product. Agent runs, the workflow builder assistant, and the expression generator are checked against your remaining balance before they start, and the assistant and expression generator now record their usage on your usage page instead of being invisible. A cancelled agent run is billed for the work it actually completed rather than dropping off your usage entirely. Organization creation is capped per account, both by how many you own at once and by how many you create over a rolling window, so one account cannot spin up unlimited free trials. A very long builder conversation is now refused with a message asking you to start a new chat, rather than being sent to the model in full. Deleting an organization now removes its stored files before the organization itself disappears. A large organization can take more than one pass, and the dialog now says accurately what happens: files are removed immediately and clear backups within 7 days.\n\n### Public API\n\n- Starting a run now returns `402 insufficient_credits` when your organization has spent its credit allowance. The check happens before the request body is read, so no files are uploaded and no work begins on a run that cannot be paid for. File uploads return the same status for the same reason, and both are now described in the API reference. The API reference also documents `503`, which endpoints return when request accounting is briefly unavailable. It means the request was not processed and is safe to retry; it is not a rate-limit rejection.\n\n---\n\n## 0.20.0 (2026-09-22)\n\n### Platform (Studio)\n\n- Datasets can now be sent for client review without exporting files. Create a review request from a dataset, highlight the fields that need attention, mark others as not required, and invite client teammates with the new reviewer role. They walk examples from a dropdown, inspect the fields, leave notes, record per-field decisions, and approve or reject each row. Closing a finished review does not auto-apply changes — reconcile expected outputs manually. The Reviews queue keeps finished requests visible with a status filter so old approvals stay findable. Reviewers see the same Studio shell with permission-aware empty states.\n\n### Public API\n\n- New dataset review endpoints under `/api/v1/automations/:id/dataset-review-requests`: create a review from dataset examples with reviewer `instructions`, `focusFields` (paths plus optional reasons), `ignoredFields` for paths reviewers can skip, and optional `itemNotes`. Approve, edit, reject, reopen, comment, or record a `field-decision` on each example (including clearing a decision with `decision: null`), then poll `progress.complete` and close the request with `PATCH` status. Dataset reconciliation stays manual — nothing is deleted by reject. A new `reviewer` organization role can read review queues and submit item decisions but cannot edit workflows.\n\n### CLI\n\n- `eigenpal workflow dataset review-request` (and the `eigenpal agents dataset` mirror) is the agent-friendly review loop: create a request with reviewer instructions, `--focus` / `--focus-reason` paths, `--ignore` paths reviewers can skip, and per-example `--item-note` / `--field-note` comments; `list`/`get`/`events` expose `progress.complete`, `fieldDecisions`, and `inputDrifted`; `item --action` records approve/reject/comment/edit plus per-field `field-decision` (clear with `--clear` / `--decision null`); `update --status closed` finishes the request. There is no auto-apply — pull and reconcile examples manually. Reject is recommendation-only; nothing is deleted.\n\n### SDK\n\n- `client.automations.datasetReviewRequests` (`dataset_review_requests` in Python) covers the full dataset review lifecycle: list and get with `progress`, `focusFields`, `ignoredFields`, `fieldDecisions`, and `inputDrifted`; create with reviewer instructions and per-field notes; update request metadata or close with status; update items including `field-decision` (pass `decision: null` to clear); and the per-user activity trail. Dataset write-back stays manual — there is no lock endpoint.\n\n### Infrastructure & processing\n\n- Replace the eagerly constructed `eigenpalAjv` singleton with a lazy `getEigenpalAjv()` accessor. Ajv compiles schemas with `new Function`, which the Studio Content-Security-Policy forbids — constructing at import time crashed every page whose client bundle transitively imported `@eigenpal/types` validation (including all review surfaces, which never validate client-side). Server-side call sites are unchanged apart from the accessor.\n\n---\n\n## 0.19.1 (2026-09-21)\n\n- Internal improvements.\n\n---\n\n## 0.19.0 (2026-09-21)\n\n### Platform (Studio)\n\n- Agent builder sessions can now be given storage credentials limited to their own session folder instead of the whole storage account. Set a Cloudflare account id and API token, or an AWS role, and each training sandbox receives a short-lived key that can only read and write its own files. Deployments that do not configure this keep working exactly as before and log a warning, and a new setting makes the platform refuse to start a sandbox unless scoped credentials are available.\n- Studio security hardening. Parsed document text shown in run traces and grounding views is now sanitized before rendering, so a crafted document can no longer inject active content into the page. Observability settings now require administrator access to view, and the values of any authorization headers you configure are masked once saved, so they are never sent back to the browser. Saving a renamed header now asks you to retype its value instead of quietly clearing the configuration. Outbound observability destinations are validated to reject internal and unencrypted endpoints on hosted plans. Editor assets are now served from Eigenpal's own domain instead of a public content network. Self-hosted deployments that use password sign-in no longer accept open self-registration. Creating the first account still works, and anyone holding an invitation can still create their account, but an uninvited visitor can no longer join an existing workspace. Set `EIGENPAL_ALLOW_OPEN_SIGNUP=true` to restore the previous behavior. Agent training and email trigger surfaces are now scoped more tightly. Email alias changes are accepted only through the agent that owns the alias, so editing or revoking one from a different agent's page now reports not found. Opening a training session that belongs to a different workspace or a different agent is refused instead of returning a server error. Each agent workspace now runs with credentials valid only for its own session, so a workspace can no longer act on any session but its own. Sign-in and account safety. Changing your password now signs out your other sessions, so a password change ends access from a device you no longer control. Accepting an invitation now requires the invitation link itself rather than just the invited address, so knowing that someone was invited is no longer enough to create an account in their name. Requests that arrive from another site are refused, which closes cross-site request forgery against pages you are signed in to. Set `EIGENPAL_TRUSTED_ORIGINS` if you serve Eigenpal on more than one hostname.\n\n### Public API\n\n- Agent endpoints that accept an agent id now resolve it strictly within the calling organization. Requesting an id belonging to another organization returns not found instead of reading or modifying it. Run and step endpoints apply the same organization check to execution ids. Uploads that omit a declared length are now measured while they stream and return 413 once they exceed the request limit, rather than being read into memory first. Operator source tokens are accepted only on the source and authentication check endpoints they are documented for. Webhook endpoints are now checked when you save them, not only when a delivery is attempted. A destination the platform cannot deliver to is rejected with a validation error at creation and update time, instead of being accepted and then failing silently on every send. Self-hosted deployments that deliver to their own internal network are unaffected. Every endpoint that starts a new run now honours the automation's trigger settings, the same way `POST /api/v1/runs` already did. That covers rerunning a run, starting an experiment, and running a single dataset example, including their streaming variants. An API key calling one of these on an automation whose API trigger is turned off now receives `403 api_trigger_disabled`, and a dashboard session calling one on an API-only automation receives `403 manual_trigger_disabled`. If an existing integration starts returning 403, turn the API trigger back on for that automation.\n- Self-hosted Prometheus scrapes now require the dedicated scrape token in every deployment. An organization API key is no longer enough to read the cluster snapshot. A deployment without `EIGENPAL_METRICS_SCRAPE_TOKEN` returns 404 on the metrics route, so set the token before upgrading if you scrape today with an API key. The headless workflow server no longer serves a network address without an API token. If you set `HOST` yourself, the server now exits at startup unless you also set `HEADLESS_API_TOKEN` or `HEADLESS_ALLOW_UNAUTHENTICATED_BIND=1`. If you never set `HOST`, the bind address changes from `0.0.0.0` to `127.0.0.1`, which inside a container means a published port stops accepting connections while the container still reports healthy. Either set `HEADLESS_API_TOKEN` (16 characters or more) together with `HOST=0.0.0.0`, or set `HEADLESS_ALLOW_UNAUTHENTICATED_BIND=1` to keep the previous behaviour. Members can no longer pull decrypted agent environment secrets. Use an owner or admin key, or decrypt a secret for a specific run.\n\n### Infrastructure & processing\n\n- Self-hosted Prometheus scrapes now require the dedicated scrape token in every deployment. An organization API key is no longer enough to read the cluster snapshot. A deployment without `EIGENPAL_METRICS_SCRAPE_TOKEN` returns 404 on the metrics route, so set the token before upgrading if you scrape today with an API key. The headless workflow server no longer serves a network address without an API token. If you set `HOST` yourself, the server now exits at startup unless you also set `HEADLESS_API_TOKEN` or `HEADLESS_ALLOW_UNAUTHENTICATED_BIND=1`. If you never set `HOST`, the bind address changes from `0.0.0.0` to `127.0.0.1`, which inside a container means a published port stops accepting connections while the container still reports healthy. Either set `HEADLESS_API_TOKEN` (16 characters or more) together with `HOST=0.0.0.0`, or set `HEADLESS_ALLOW_UNAUTHENTICATED_BIND=1` to keep the previous behaviour. Members can no longer pull decrypted agent environment secrets. Use an owner or admin key, or decrypt a secret for a specific run.\n- Document and archive processing is more resilient to malformed or hostile input. Dataset archive imports now apply a limit on entry count and hold far less memory while expanding, so a small archive can no longer exhaust a request. Office documents are checked against their real expanded size rather than the size recorded inside the file, which blocks highly compressed payloads that previously passed inspection. PDF page rendering moved to a newer engine that removes a document driven code execution path. Script transform steps have a shorter maximum run time that is now capped relative to worker health checks, so a long running script cannot stall other work. With stock settings the ceiling drops from 30 seconds to 15 seconds; self-hosted deployments that need more can raise `HEALTH_LIVENESS_STALE_MS`, since the ceiling is half that value. Workflow processing is more resilient to hostile input. Template rendering now has time and memory ceilings, so a crafted template can no longer stall a worker and delay other runs. Deep merges in the combine transform can no longer be steered into altering shared state. External file sources reject addresses that are not plain HTTP endpoints.\n\n---\n\n## 0.18.0 (2026-09-21)\n\n### Platform (Studio)\n\n- Workflows can crop normalized regions from PDFs and images into JPEG artifacts with the new `transform.crop-regions` step — pair it with parse output and script steps to build figure or layout evidence pipelines without a figure-specific step type. Turn on optional **`cache: true`** on **`ai.parse`** to reuse prior parse output for the same file bytes and parse settings across runs (stored in tenant blob storage; no expiry yet).\n\n---\n\n## 0.17.5 (2026-09-21)\n\n### Platform (Studio)\n\n- Summary Agent: spreadsheet uploads now use a hardened parser that prevents crafted workbook content from causing excessive processing or modifying object prototypes.\n\n### CLI\n\n- CLI skill reference documents the new `ai.figure-crops` workflow step for cropping and captioning figures from parsed PDFs.\n\n### SDK\n\n- Python SDK: installs now require `anyio` 4.14.2 or newer. Earlier versions encoded host names with IDNA 2003 when opening a TLS connection, so a crafted host name could be matched against the wrong certificate. The TypeScript SDK is unaffected.\n\n---\n\n## 0.17.4 (2026-09-18)\n\n### Platform (Studio)\n\n- Strengthen organization access controls so role permissions, API-key scopes, and member removal apply consistently across Studio and the API. Webhook configuration and signing secrets are restricted to organization owners and admins. Service credentials cannot exceed member permissions, while members retain file and review editing through the API.\n- Organization owners can invite new users directly as owners. Owner invitations can only be created and managed by existing owners.\n\n### Public API\n\n- Strengthen organization access controls so role permissions, API-key scopes, and member removal apply consistently across Studio and the API. Webhook configuration and signing secrets are restricted to organization owners and admins. Service credentials cannot exceed member permissions, while members retain file and review editing through the API.\n\n### Infrastructure & processing\n\n- Cloud workflow HTTP and website-reader actions now restrict requests to public HTTP/S destinations, verify TLS for HTTPS requests, and reject HTTPS-to-HTTP redirects. Responses are limited to 20 MiB and requests to 120 seconds. Single-tenant installations retain private-network integration support.\n\n---\n\n## 0.17.3 (2026-09-18)\n\n### Public API\n\n- Large PDF parses are now more reliable under parallel load. The OCR service paces concurrent pages per document so multi-page jobs no longer exhaust inference memory and retry, which previously stalled big documents behind repeated restarts.\n\n---\n\n## 0.17.2 (2026-09-17)\n\n### Platform (Studio)\n\n- Settings gains a Data retention section for workspace admins: see how much file storage past and present runs consume, choose how long eval and other runs are kept, preview what falls past the horizon, and delete those runs in capped passes until clear. Runs that are still active are always kept. Enforcement offers two modes: purge input files only (run history and outputs stay, freeing the bulky source documents while keeping the audit trail) or delete full runs. Storage usage splits run inputs from outputs so admins can see what input-only cleanup would free.\n\n### Public API\n\n- Rerunning a run whose input files were removed by data retention now returns a clear `409 inputs-purged` error instead of failing while copying the missing files. Run history and outputs remain available.\n\n---\n\n## 0.17.1 (2026-09-15)\n\n- Internal improvements.\n\n---\n\n## 0.17.0 (2026-09-15)\n\n### Platform (Studio)\n\n- Studio can connect to a live agent inference session even when that session runs in a local sandbox instead of the hosted cloud environment.\n\n### Infrastructure & processing\n\n- Agent inference can now run in a local container sandbox, so on-prem and air-gapped deployments no longer need a cloud sandbox provider.\n- Agent runs can now execute in customer-hosted sandbox environments instead of only the Eigenpal cloud, and local Docker sandboxes connect reliably on plain localhost setups.\n\n---\n\n## 0.16.13 (2026-09-14)\n\n- Internal improvements.\n\n---\n\n## 0.16.12 (2026-09-14)\n\n### Platform (Studio)\n\n- Studio can import large dataset ZIP archives without taking the app down, including archives whose paths use Windows-style backslashes. Opening a long-running workflow no longer pulls every step’s full input and output at once. Run pages stay available, still show the steps timeline when phase data is missing, and keep the last loaded view if a refresh fails — with a retry control instead of a blank error page.\n\n### Public API\n\n- `GET /api/v1/runs/\\{id}?expand=execution` and `GET /api/v1/runs/\\{id}/steps` now return slim step rows (identity, status, timing, and a capped error excerpt) instead of inlining every step’s input and output. Inspect one step’s full payloads with the new `GET /api/v1/runs/\\{id}/steps/\\{stepExecutionId}` endpoint.\n\n### CLI\n\n- `eigenpal runs get` lists slim step rows by default. Pass `--include input,output` or `--step` to fetch full payloads for the steps you care about.\n\n### SDK\n\n- The TypeScript and Python SDKs now include `GET /api/v1/runs/\\{id}/steps/\\{stepExecutionId}` so you can load one step’s full input and output after listing slim run steps.\n\n---\n\n## 0.16.11 (2026-09-11)\n\n### Platform (Studio)\n\n- Studio: organization switching and other labeled menus now open reliably without a client-side error.\n\n---\n\n## 0.16.10 (2026-09-10)\n\n### Infrastructure & processing\n\n- OCR processing now distinguishes temporary host availability issues from true processing timeouts, keeps redundant production capacity warm, and pages only when unfinished work is affected. Short self-healing interruptions remain visible for diagnosis without generating misleading recovery alerts.\n\n---\n\n## 0.16.9 (2026-09-10)\n\n### Platform (Studio)\n\n- Harden web image handling, document image processing, and email delivery against crafted inputs that could cause remote code execution, excessive resource use, or recipient-validation bypasses.\n\n### Infrastructure & processing\n\n- Harden web image handling, document image processing, and email delivery against crafted inputs that could cause remote code execution, excessive resource use, or recipient-validation bypasses.\n\n---\n\n## 0.16.8 (2026-09-10)\n\n### Platform (Studio)\n\n- Files are easier to recognize throughout Studio with refreshed Office logos, dedicated PDF, archive, text, JSON, and code treatments, plus image thumbnails. File inputs now use a clearer rounded drag-and-drop experience with consistent selected-file previews.\n\n---\n\n## 0.16.7 (2026-09-10)\n\n### Platform (Studio)\n\n- File uploads now infer supported document media types from the filename when clients provide an empty or generic content type, allowing original Outlook messages and macro-enabled workbooks to upload without conversion.\n\n### Public API\n\n- File uploads now infer supported document media types from the filename when clients provide an empty or generic content type, allowing original Outlook messages and macro-enabled workbooks to upload without conversion.\n\n### CLI\n\n- The CLI now uploads macro-enabled Excel workbooks with the correct media type, so original `.xlsm` workflow inputs work without manual conversion.\n\n### SDK\n\n- TypeScript SDK file helpers now infer the correct media types for `.xlsm` workbooks and `.msg` Outlook messages.\n\n### Infrastructure & processing\n\n- Document parsing now reads Excel, legacy Excel, and macro-enabled workbooks directly, preserving every non-empty sheet and its cell evidence without executing formulas or macros. Large single-page extractions are also split into bounded AI context windows instead of failing at the model limit.\n\n---\n\n## 0.16.6 (2026-09-09)\n\n### Infrastructure & processing\n\n- Template processing now enforces memory limits when joining large collections, preventing crafted templates from exhausting worker memory.\n\n---\n\n## 0.16.5 (2026-09-08)\n\n### Platform (Studio)\n\n- Human review is now available in production, including workflow authoring and review queues.\n\n### Public API\n\n- Human review API endpoints are now available in every production organization for listing tasks, confirming fields, and completing reviews.\n\n### Infrastructure & processing\n\n- Workflow and agent runs can now request human review in every production organization.\n\n---\n\n## 0.16.4 (2026-09-08)\n\n### Platform (Studio)\n\n- Studio adds List Archive and Extract Archive File steps for ZIP workflow inputs. Enumerate archive contents, wire `\\{\\{ item.path }}` through foreach, and pass extracted files straight into Parse, Vision, or Search Files without leaving the builder.\n- Studio now finishes multi-GB file uploads with resumable multipart transfers, retrying individual parts without restarting the whole file.\n- Studio workflows now include Search Files: ask a question about a ZIP archive and get a cited answer plus the files the step inspected. Scope the search to a folder inside the archive and use the same model and reasoning controls as other AI steps.\n\n### Public API\n\n- Upload ZIP archives as reusable workflow inputs through the Files API. Archives can be much larger than single documents, so teams can pass bundled evidence, exports, or multi-file drops into the same runs that already accept PDFs and Office files.\n- File uploads can now negotiate a resumable multipart session for multi-GB objects, with on-demand part URLs, authoritative resume listing, and safe completion that never overwrites a finished file.\n- Starting a run from a reusable file id now keeps a private run-owned reference to the original bytes instead of duplicating large uploads. Deleting the reusable file leaves past runs readable until those runs themselves are deleted.\n\n### CLI\n\n- Dataset import and export now keep a single `/api/v1` prefix when the CLI base URL already includes `/api/v1`, so those commands reach the dataset API instead of a doubled `/v1/v1` path.\n- The CLI now uploads large run files with resumable, storage-direct transfers, so multi-GB inputs stream from disk instead of loading into memory or a single request.\n- The CLI now recognizes `.zip` files when uploading reusable workflow inputs, so archive uploads get the correct content type without extra flags.\n\n### SDK\n\n[View full release notes →](/releases/0.16.4)\n\n---\n\n## 0.16.3 (2026-09-08)\n\n### Platform (Studio)\n\n- Human review: open pending reviews directly from run details and confirm unchanged fields inline from the field list.\n\n### Public API\n\n- Human review field confirmations now preserve valid JSON `null` values and return clear validation errors when a reviewed value does not match its schema.\n\n---\n\n## 0.16.2 (2026-09-08)\n\n### Platform (Studio)\n\n- Human review: pause workflows and agents only when selected fields need attention, inspect source files beside structured output with spatial citation highlights when lineage is available, correct and confirm values, then approve the same run to continue. Confidence thresholds, explicit field selection, required-field progress, rejection, and cancellation keep exception review focused instead of forcing teams to recheck every field.\n\n### Public API\n\n- Human review APIs now list pending tasks, return review data and source-file references, persist field corrections and confirmations, and approve or reject paused runs with optimistic concurrency protection. Task detail may also include resolved lineage and parsed-document context when an upstream grounded extract produced sidecars.\n\n### CLI\n\n- Workflow authoring now includes human-review guidance and ready-to-use templates for confidence-based exception review and explicit approval of critical fields.\n\n### SDK\n\n- TypeScript and Python SDKs now expose human-review resources for listing and retrieving tasks, confirming corrected fields, downloading attached source files, and approving or rejecting paused runs.\n\n### Infrastructure & processing\n\n- Grounded extraction now runs the same shared algorithm locally when a parse step supplies a valid structured document and your provider supports strict structured output. Step JSON stays schema-shaped with `_grounding` metadata; lineage and the parsed document graph are stored as optional sidecars for review and audit, not mixed into workflow output. Text-only inputs and unsupported providers continue to use the existing text grounding path with clear degraded markers when the shared path is unavailable.\n\n---\n\n## 0.16.1 (2026-09-07)\n\n### Platform (Studio)\n\n- GPT-6 Astra is available across workflows, agents, evaluations, and vision tasks, with configurable reasoning and current token pricing.\n- Self-hosted PaddleOCR models now appear with clear provider identity in Studio model selectors and settings.\n- Archive imports now reject malformed ZIP64 data safely instead of risking an unbounded processing loop.\n\n### CLI\n\n- CLI archive handling now rejects malformed ZIP64 data safely instead of risking an unbounded processing loop.\n\n### Infrastructure & processing\n\n- GPT-6 Astra is available across workflows, agents, evaluations, and vision tasks, with configurable reasoning and current token pricing.\n- Self-hosted deployments can connect directly to PaddleOCR-VL for high-quality document parsing, with bounded concurrency and long-running PDF support built in.\n\n---\n\n## 0.16.0 (2026-09-07)\n\n### Platform (Studio)\n\n- Agent model pickers are now compact, searchable, grouped by provider, and ordered from the most capable model to the least without changing configured defaults.\n- Send Email is now a first-class workflow action. Add Resend or SMTP servers in Settings → Email servers, then pick a stable `ems_…` server on the step — including generated files from the same run as attachments. Cloud and on-prem share this Settings surface; there is no default server. Secrets stay encrypted, and reads never show credentials. Changing an SMTP host, username, or provider asks you to re-enter the password so a stored secret cannot follow a new destination.\n\n### Public API\n\n- The public API now manages organization email servers at `/v1/email-servers`: list, create, inspect, update, delete, and send a connectivity test. Each server is an `ems_…` resource with a Resend or SMTP transport. Secrets are encrypted and never returned; disabled servers reject tests, and names must be unique among live servers. Updating SMTP to a different host or username requires a new password or explicitly clearing authentication — the previous password is never reused against a new destination.\n\n### CLI\n\n- Manage organization email servers with `eigenpal email-servers`: list and inspect `ems_…` servers, create or update Resend and SMTP providers (including an optional SMTP CA PEM), delete servers, and send a live test message with `--to`. Secrets are read from stdin, a file, or a secure prompt — never from command-line flags.\n\n### SDK\n\n- TypeScript and Python SDKs now manage organization email servers: list, create, inspect, update, delete, and send a connectivity test. Stored credentials are never returned.\n\n### Infrastructure & processing\n\n- Send Email delivers through the organization server selected on the step. There is no fallback: a missing, deleted, or disabled server fails the run. Evaluation runs skip delivery, including workflows invoked from an eval. Cancelling a run aborts an in-flight send. Multi-tenant SMTP servers must resolve to public addresses, while single-tenant deployments can use internal relays. Partial SMTP acceptance reports which recipients were delivered or rejected so operators can avoid duplicate reruns. SMTP may still deliver twice if a worker stops after the relay accepts the message; Resend deduplicates the same step attempt.\n\n---\n\n## 0.15.1 (2026-09-04)\n\n### Infrastructure & processing\n\n- OpenParser OCR capacity now recovers cleanly after failed updates, avoiding unnecessary warm resources while preserving active document processing.\n\n---\n\n## 0.15.0 (2026-09-04)\n\n### Platform (Studio)\n\n- Workflow validation now explains when a catalog model belongs in `provider` instead of the raw `model` override, and reruns preserve clean original filenames in generated outputs and citations.\n- Make document inputs uploaded in Studio datasets available to experiment runs, including examples saved by earlier releases.\n\n### Public API\n\n- Experiment result responses and JSON exports now include evaluator-specific structured details, so clients can identify the exact JSON path, expected value, and actual value behind a failed comparison. CSV exports retain their existing stable columns.\n\n### CLI\n\n- Experiment analysis is now built into the CLI for workflows and agents: summarize pass, fail, error, and score totals; filter failures by evaluator; inspect structured discrepancy paths; and compare actual outputs between batches. Run payloads can be projected with `--select`, and repository-level validation discovers nested workflow projects automatically. Polling commands also expose consistent wait limits and reject flag combinations that cannot produce a reliable verdict. Waiting commands now keep human output concise by default; pass `--json` whenever scripts need the terminal payload.\n- `eigenpal docs` now lists, searches, and reads the complete release-matched platform documentation offline, including detailed evaluator syntax, workflow step guides, CLI reference, and the OpenAPI contract.\n- CLI file uploads now send valid content types for Outlook and unknown files, cancellation confirms the asynchronous request clearly, and run comparisons show every repeated workflow step by branch and iteration path.\n\n### Infrastructure & processing\n\n- Make document inputs uploaded in Studio datasets available to experiment runs, including examples saved by earlier releases.\n- Exact-diff evaluators can exclude volatile fields with `ignore: true`, including nested fields inside a selected object or array. This keeps golden outputs readable while scoring only stable business data such as identities, names, and classifications.\n- Script steps now bind inputs by parameter name, so workflows behave consistently after storage even when JSON key order differs from the authored YAML.\n\n[View full release notes →](/releases/0.15.0)\n\n---\n\n## 0.14.3 (2026-09-04)\n\n### Platform (Studio)\n\n- Model selection now includes the GPT 5.6 Sol, Terra, and Luna lineup plus Claude Fable 5, Fable 5.1, Opus 5, and Sonnet 5. Reasoning effort can be configured for supported workflow steps, agent training and runs, workflow-building chat, and LLM judges; existing choices keep their current provider defaults when the setting is omitted.\n\n### CLI\n\n- Workflow YAML can configure model-aware reasoning effort on AI steps and LLM judges. Omit the setting to preserve each model's current default.\n\n### Infrastructure & processing\n\n- AI processing supports the latest GPT and Claude request formats, including reliable structured extraction with Claude Fable 5 and Fable 5.1. Workflow and agent execution can pass an optional model-aware reasoning effort while preserving previous defaults, and agent sandboxes can use GPT 5.6, Claude Fable 5, Fable 5.1, Opus 5, and Sonnet 5.\n\n---\n\n## 0.14.2 (2026-09-02)\n\n### Infrastructure & processing\n\n- Single-node deployments can now upgrade installations with large legacy datasets without startup failures or loss of trigger configuration.\n\n---\n\n## 0.14.1 (2026-09-02)\n\n### Infrastructure & processing\n\n- Single-node deployments can now upgrade installations with legacy run review data without startup failures.\n\n---\n\n## 0.14.0 (2026-09-02)\n\nThis release gives document teams more control over structured-data quality.\nExact-diff evaluators can express field-specific matching rules, PDF parsing can\npreserve visual layout, and spreadsheet conversion can retain the rows, columns,\nand displayed values that matter to downstream workflows.\n\nCLI authoring guidance makes these capabilities easier to discover and safer to\nautomate, with non-interactive commands failing clearly instead of waiting on\nunavailable prompts.\n\n### Platform (Studio)\n\n- `ai.parse` adds `outputFormat: layout` for native PDF extraction. It returns fixed-width plain text that preserves columns, spacing, and line breaks for multi-column forms and tables that lose meaning when flattened. This PDF-only format must be selected explicitly with `parseMode: native` or `parseMode: native-or-ocr`: native mode fails closed if layout extraction cannot complete, while hybrid mode keeps accepted layout pages and substitutes OCR markdown only for suspect or empty pages. Existing formats and defaults are unchanged.\n- Spreadsheet to JSON now handles `.xls` and `.xlsx` workbooks with configurable headerless input or an explicit header row, named or positional column projection, rectangular ranges, and raw or displayed cell values. Displayed values preserve formatted text such as dates, leading zeros, punctuation, diacritics, and embedded newlines. Blank-cell and blank-row policies make sparse sheets predictable, while optional sheet metadata and diagnostics explain the selected range and non-fatal issues. Existing zero-config output remains `rows`, plus `fileId` when CSV output is enabled; zero-config CSV keeps the full selected sheet, and configured CSV follows the same projection. File, row, column, and cell limits reject unsafe workloads before conversion.\n- Exact-diff evaluators add composable per-field rules for extraction outputs. Choose ordered or unordered comparison independently from `items: at-least | at-most | exactly`, set numeric tolerances, and reject unexpected object fields where strict output shapes matter. Ordered arrays retain prefix-compatible matching, while unordered arrays find the best one-to-one structural pairing instead of depending on row order. Unordered object arrays can also use typed `matchBy` identities such as `sku` or `[country, sku]` for predictable single- or composite-key matching. Studio now provides a rule editor with path-aware validation. Grounding metadata is excluded from scoring, oversized comparison workloads fail safely with bounded diagnostics, and existing evaluator configurations keep their historical behavior.\n\n### Public API\n\n- Template creation now accepts reusable file references correctly, restoring CLI template uploads and workflow pushes that use local DOCX or XLSX files.\n\n### CLI\n\n[View full release notes →](/releases/0.14.0)\n\n---\n\n## 0.13.2 (2026-09-01)\n\n### CLI\n\n- CLI installation no longer downloads packages already included in its self-contained executable, reducing install overhead and improving compatibility with restricted enterprise networks.\n\n---\n\n## 0.13.1 (2026-08-31)\n\n### Platform (Studio)\n\n- Workflows can turn JSON rows into a downloadable Excel workbook with a new JSON to XLSX step. Pick ordered columns, map an array of objects, and get a `.xlsx` run output — including multi-sheet workbooks — without filling a template.\n- Studio now uses the shared theme provider, so system / light / dark stays aligned with OpenParser instead of drifting independently.\n- Publishing a workflow that still has a local `template: ./file.xlsx` path now fails with a clear error. Use `eigenpal workflow push` to upload the file, or set `templateId` to a `tmpl_…` id first.\n- Studio template uploads and replacements now create immutable, checksum-backed revisions and discover tokens consistently across DOCX and XLSX files. Deleting a logical template preserves revision content used by pinned workflows.\n- Fill Template (`transform.template`) now documents workspace `tmpl_...` templates separately from Git agent templates, and Studio copy covers DOCX and XLSX. XLSX files use `\\{placeholder}` and `\\{table:array.prop}` in the spreadsheet; `\\{\\{placeholder}}` in an uploaded sheet warns on upload and fails at fill instead of leaving leftover braces. `templateId` must be a workspace `tmpl_...` ID, not a file ID. Filled values that look like formulas stay text; formulas already in the template stay formulas.\n- Studio now blocks crafted HTML from retaining executable content during sanitization.\n\n### Public API\n\n- Workflow push can fully remove a template it uploaded if publishing then fails. Deleting a template that workflows already pin still keeps those revisions runnable.\n- The public API now lists the text, vision, and OCR models configured for your environment. `GET /v1/models` is a cheap catalog inventory for the current tenant: it reports whether each model is configured and which capability it is the default for, without probing live providers or exposing secrets.\n- The public API now supports the full lifecycle for tenant-scoped DOCX and XLSX templates: upload, inspect, list, download, replace, and delete, with direct-upload support for larger files. Every replacement creates a checksum-backed immutable revision; deleting the logical `tmpl_…` resource preserves revisions already pinned by workflows.\n\n### CLI\n\n- `workflow versions create --file` now resolves local `template:` paths the same way as `workflow push`, and `workflow templates smoke --data` help documents the JSON fixture file path.\n- `eigenpal workflow push` keeps local Office templates inside the workflow project, including when a path uses `../` or a symlink. Files outside that directory need `--allow-external-templates`. Push validates the workflow and version before uploading, creates new template resources instead of moving shared `tmpl_…` pointers, and fully removes those unpublished uploads if publish does not succeed.\n- When resolving a workflow by `wf_…` id, connection failures, auth errors, and server outages now surface their normal CLI messages instead of being misreported as \"workflow not found.\"\n\n[View full release notes →](/releases/0.13.1)\n\n---\n\n## 0.13.0 (2026-08-25)\n\n### Platform (Studio)\n\n- API reference for listing dataset examples now documents `include=metadata`, so you can page through example ids, names, and file refs without loading every payload.\n- Local Studio development no longer keeps a growing on-disk compiler cache that can exhaust memory during long `bun dev` sessions.\n- Studio's sidebar theme picker now supports keyboard navigation across system, light, and dark.\n- Studio dashboard sessions continue to authenticate `/api/v1` calls. Token-based `/api/v1` and `/v1` requests still work without a browser login, and the dedicated API hostname keeps its public routing and CORS behavior.\n- Studio save-as-release still publishes a tagged version as the live workflow. Publishing from an existing snapshot creates a new tagged release instead of rewriting the original tag, so earlier releases stay intact. Connect API docs version pickers follow the public version list, so after restore the current untagged version shows as latest while tagged releases stay selectable.\n\n### Public API\n\n- List dataset examples without pulling every payload. `GET /api/v1/automations/:id/examples` now accepts `include=metadata`, which returns ids, names, annotations, and expected file refs while leaving input and expected JSON unloaded. Keep the default `include=full` when you still need the complete example bodies.\n- You can now create, promote, and restore workflow versions through the public API. Create a tagged candidate with `activate: false` to test it without changing live traffic, then promote that exact version after it qualifies. You can also publish from YAML, copy an existing version into a new release without changing its original tag, or restore an earlier snapshot. Name-conflict errors include `conflictingWorkflowId` so you can see which workflow already owns the name.\n\n### CLI\n\n- `eigenpal workflow versions` can now create, promote, and restore YAML workflow versions through the public API. Tag a candidate from a YAML file or an existing snapshot with an explicit semver, keep it off live traffic with `--no-activate`, then promote that exact version when it qualifies. Restoring still rolls a workflow back by copying a snapshot into a new current version — lists now show that untagged HEAD clearly instead of hiding it. `workflow versions list --limit` and `--offset` page that full public list locally. `--json` prints the sliced `\\{ data, total, limit, offset }` envelope (`total` is the unsliced count), not the raw server payload.\n\n### SDK\n\n- TypeScript and Python SDKs can list dataset examples with `include: \"metadata\"`. That returns ids, names, annotations, and expected file refs without loading each example's input and expected JSON. The default remains a full payload, so existing list calls stay unchanged.\n\n[View full release notes →](/releases/0.13.0)\n\n---\n\n## 0.12.2 (2026-08-21)\n\n### Platform (Studio)\n\n- Document editing: the DOCX editor used for templates, run file review, and Office file previews now follows your light or dark theme, and Save (including Cmd/Ctrl+S) writes back to the document you opened instead of downloading a copy. Documents that fail to open now report the reason instead of showing an empty editor. Placeholder highlighting in DOCX templates is temporarily unavailable.\n- Connect: a workflow that wraps another workflow now documents the full response shape. Its OpenAPI spec, Swagger UI preview, and the response examples and generated types on the Connect page show the nested objects and arrays returned by the workflow it calls, instead of leaving those fields untyped.\n\n---\n\n## 0.12.1 (2026-08-19)\n\n### Platform (Studio)\n\n- Connect: download an OpenAPI spec (swagger.json) and preview it in Swagger UI directly from the Connect page. Selecting a workflow or agent produces a spec for just that automation: the five endpoints needed to integrate it (start a run, poll it, cancel it, list and download artifacts), with the request body documenting its exact input fields and file uploads and run responses typed with its actual output schema. With no selection you get the full platform API spec. Swagger UI is bundled with the product, so the preview also works in on-prem installs without internet access.\n\n---\n\n## 0.12.0 (2026-08-18)\n\n### Platform (Studio)\n\n- The workflow builder chat honors the new `disableTemperature: true` model configuration option, so models that reject a sampling temperature work from the first request.\n- Object-typed workflow inputs can now declare a nested schema. In the workflow builder, choosing the Object type (or an array of objects) opens a property editor where you define each field with its type, description, allowed enum values, and required flag, including nested objects and arrays up to five levels deep. Declared fields are enforced when a run starts: missing required fields and type mismatches are rejected with precise field paths. Downstream steps get full autocomplete and type resolution for nested references such as `\\{\\{ input.metadata.vendor.name }}`, and the declared shape appears in the scope browser and in generated API documentation. The builder flags expressions that reference undeclared nested fields, the run form and evaluation input editor pre-fill the declared required fields, and the AI expression generator sees the nested shape when suggesting expressions. The headless execution server now enforces declared inputs with the same validator, so its API documentation and runtime behavior agree.\n- Grounded OpenParser extraction results can now carry complete field lineage through the Eigenpal web runtime, preserving source evidence and confidence metadata for downstream review experiences.\n\n### Public API\n\n- Object-typed workflow inputs can now declare a nested schema. In the workflow builder, choosing the Object type (or an array of objects) opens a property editor where you define each field with its type, description, allowed enum values, and required flag, including nested objects and arrays up to five levels deep. Declared fields are enforced when a run starts: missing required fields and type mismatches are rejected with precise field paths. Downstream steps get full autocomplete and type resolution for nested references such as `\\{\\{ input.metadata.vendor.name }}`, and the declared shape appears in the scope browser and in generated API documentation. The builder flags expressions that reference undeclared nested fields, the run form and evaluation input editor pre-fill the declared required fields, and the AI expression generator sees the nested shape when suggesting expressions. The headless execution server now enforces declared inputs with the same validator, so its API documentation and runtime behavior agree.\n- Listing runs with `sinceLastClosed=true` works again. Once a review had been closed, asking for the runs recorded since then returned an error instead of the runs, so review tooling that polls for new work had no way to ask \"what has arrived since I last signed off\". The filter now returns those runs.\n\n### Infrastructure & processing\n\n- Model entries in the deployment configuration can now set `disableTemperature: true`. Workflow steps then never send a sampling temperature to that model, which lets reasoning models (and gateways in front of them) that reject the parameter run without a first-call retry.\n- Object-typed workflow inputs can now declare a nested schema. In the workflow builder, choosing the Object type (or an array of objects) opens a property editor where you define each field with its type, description, allowed enum values, and required flag, including nested objects and arrays up to five levels deep. Declared fields are enforced when a run starts: missing required fields and type mismatches are rejected with precise field paths. Downstream steps get full autocomplete and type resolution for nested references such as `\\{\\{ input.metadata.vendor.name }}`, and the declared shape appears in the scope browser and in generated API documentation. The builder flags expressions that reference undeclared nested fields, the run form and evaluation input editor pre-fill the declared required fields, and the AI expression generator sees the nested shape when suggesting expressions. The headless execution server now enforces declared inputs with the same validator, so its API documentation and runtime behavior agree.\n\n---\n\n## 0.11.3 (2026-08-13)\n\n### Platform (Studio)\n\n- API reference pages for starting and reading runs now show complete examples, including `output` and `execution.status`.\n\n### Public API\n\n- Run API: completed-run examples now include `type`, `execution.status`, `output`, `files`, and `error`, instead of a shared async/completed union that dropped those fields. Default GET and list responses populate `execution.retry.nextRun` when a retry exists, and `expand=execution` keeps `schemaValid` instead of clearing it. Child invoke-workflow runs document `parentExecutionId` and `childExecutions`.\n\n### SDK\n\n- Generated run types now distinguish a completed run from the async accepted envelope (`RunAccepted`), and include `parentExecutionId` for child invoke-workflow runs.\n\n---\n\n## 0.11.2 (2026-08-07)\n\n- Internal improvements.\n\n---\n\n## 0.11.1 (2026-08-07)\n\n### Platform (Studio)\n\n- Document and image processing now runs on updated imaging components that carry upstream security fixes.\n\n### Infrastructure & processing\n\n- Document and image processing now runs on updated imaging components that carry upstream security fixes.\n\n---\n\n## 0.11.0 (2026-08-06)\n\n### Platform (Studio)\n\n- Workflow builder chat now works with reasoning models served through a self-hosted `openai-compatible` gateway, instead of failing with a \"temperature is not supported\" error. On models that only accept their own default temperature setting, replies can vary between attempts on the same question.\n- Canonical API hostnames now consistently expose only supported API and operational routes, returning a clear 404 for unsupported discovery paths.\n- Agent Builder attachments now negotiate multipart or storage-direct transfer, so large PDFs and archives can reach the active sandbox without crossing cloud payload limits. Large downloads use the same secure dual path. Self-hosted operators can set `deployment.multipartMaxBytes` in `eigenpal.config.yaml`; the supplied on-prem deployments keep files on multipart and streamed downloads by default.\n- Canonical API hostnames now serve API routes and discovery endpoints reliably without Studio sign-in handling intercepting requests.\n\n### Public API\n\n- Upload and download reusable files up to 100 MiB through one negotiated API: files within the deployment body limit use multipart, while larger cloud transfers use verified storage-direct uploads and short-lived authenticated download links. Retry-safe temporary run and Builder files expire after 24 hours. Existing multipart routes and `studio.eigenpal.com/api/v1` remain compatible, and new integrations can use `api.eigenpal.com/v1`.\n\n### CLI\n\n- The CLI now uses `api.eigenpal.com` as the default cloud API origin and automatically pre-uploads run files that exceed the multipart request limit. Self-hosted users can keep custom API origins and set `EIGENPAL_MULTIPART_MAX_BYTES` to their proxy limit, or `none` to keep all files on multipart.\n\n### SDK\n\n- The TypeScript and Python SDKs now transparently upload large run inputs without crossing cloud request limits, follow secure storage-direct downloads, and default cloud calls to `api.eigenpal.com`. Set `multipartMaxBytes` / `multipart_max_bytes`, or `EIGENPAL_MULTIPART_MAX_BYTES`, to match a self-hosted proxy; use `null` / `None` to keep every run file on multipart. Explicit `files.upload` files remain reusable until deleted.\n- TypeScript file uploads now follow the server-negotiated multipart endpoint, improving compatibility across hosted and self-managed route layouts.\n\n[View full release notes →](/releases/0.11.0)\n\n---\n\n## 0.10.56 (2026-08-05)\n\n### Platform (Studio)\n\n- Agent Builder training chat now shows Pierre file diffs for edit/write, a Pierre syntax-highlighted file view for Read file, secure request-secret password cards (encrypted into the draft; the agent only sees configured/skipped), and a quiet timeline note when you release an agent version from the dashboard.\n\n### Infrastructure & processing\n\n- Production releases that do not change document processing finish faster by reusing verified OCR provider checks from the last successful release, while still re-checking providers when processing code or infrastructure changes.\n\n---\n\n## 0.10.55 (2026-08-05)\n\n### Platform (Studio)\n\n- Agent Builder now resumes your latest draft, clearly distinguishes unsaved edits from saved changes that are not live, and provides direct Save and Release actions. Releases show the current and next version and let you choose a patch, minor, or major update. Dashboard save and release actions remain available to the builder as private context, so it can accurately answer what is live without guessing. Starting a separate draft is explicit, attachments remain available when beginning a conversation, stopped sandboxes can be restarted without losing the draft, and test runs reliably receive JSON-only inputs.\n\n### Public API\n\n- Agent Builder releases now complete live automation synchronization reliably, so a successful release is immediately available without a separate recovery step.\n\n### Infrastructure & processing\n\n- OCR and LLM model catalogs keep loading when the service adds new optional fields, so Studio and Eigenpal no longer fall back to stale model lists during catalog updates.\n- Cloud document processing providers that are already available stay online during routine production updates when their identity is unchanged. New or changed providers stay unavailable until they pass live verification, so customers keep working providers instead of a full outage window.\n\n---\n\n## 0.10.54 (2026-08-04)\n\n### Platform (Studio)\n\n- Workflow Studio now shows each OpenParser OCR model with its actual provider logo, keeps narrow step configuration panels contained, and places settings, theme, and sidebar controls together in a cleaner navigation footer.\n\n---\n\n## 0.10.53 (2026-08-04)\n\n### Platform (Studio)\n\n- OpenParser Studio now visualizes the `openparser@1` document graph directly, including typed elements, figures, tables, relationships, and element-level extraction citations.\n\n### Public API\n\n- OpenParser parse responses now return the unified `openparser@1` document graph, with plain text, canonical Markdown, pages, typed elements, relations, annotations, assets, geometry, confidence, and provider provenance in one predictable contract.\n\n---\n\n## 0.10.52 (2026-08-04)\n\n### Platform (Studio)\n\n- Agent Builder: improve connection recovery so interrupted sessions resume reliably, stale environments are replaced safely, and approval prompts remain retryable when delivery fails.\n\n---\n\n## 0.10.51 (2026-08-03)\n\n- Internal improvements.\n\n---\n\n## 0.10.50 (2026-08-03)\n\n### Platform (Studio)\n\n- OpenParser Studio: pipeline creation no longer reports a duplicate-name error after a successful save, and edits now save reliably from the browser.\n\n---\n\n## 0.10.49 (2026-08-03)\n\n- Internal improvements.\n\n---\n\n## 0.10.48 (2026-07-30)\n\n### Platform (Studio)\n\n- OpenParser Studio now displays canonical OpenParser JSON with readable indentation, including large document results.\n\n---\n\n## 0.10.47 (2026-07-30)\n\n### Platform (Studio)\n\n- OpenParser Studio now keeps large document results responsive, renders OCR markdown with clearer structure, and provides consistent copy and download actions for Markdown and JSON output. Documentation links now reliably open the generated API reference.\n\n### Infrastructure & processing\n\n- OpenParser jobs now recover more safely when document processing capacity becomes unavailable. Retryable failures pause new dispatches, retry without duplicate charges, and bound large-document processing so one document cannot overwhelm the service.\n\n---\n\n## 0.10.46 (2026-07-30)\n\n### Platform (Studio)\n\n- Team settings: bring back the invitation link. Creating an invitation now shows its link straight away whenever no invitation email was delivered, and administrators can pull up the link again at any time from the invitations table. This unblocks onboarding on deployments without email delivery, where handing over the link is the only way to get someone into the workspace.\n- Run details: field grounding now labels flagged fields by what the extraction actually reports, showing \"3 with low confidence\" instead of \"3 to review\". The count is a confidence signal, not an assigned task.\n\n---\n\n## 0.10.45 (2026-07-29)\n\n### Platform (Studio)\n\n- Parse Document setup now clearly separates OCR from Vision AI, automatically offers available OpenParser OCR models, shows each model's per-page price, displays only the controls that affect the selected method, and surfaces structured layout data with tables, figures, polygons, and bounding boxes for downstream workflow steps.\n\n### CLI\n\n- The workflow authoring reference now covers explicit OCR and Vision AI parse modes, optional figure-caption models, and structured layout output.\n\n### Infrastructure & processing\n\n- Document parsing now defaults to higher-fidelity OCR, preserves canonical structured layout alongside Markdown, and automatically supports available OCR models with provider-specific per-page pricing. Other OCR providers retain their existing rates.\n\n---\n\n## 0.10.44 (2026-07-28)\n\n- Internal improvements.\n\n---\n\n## 0.10.43 (2026-07-27)\n\n- Internal improvements.\n\n---\n\n## 0.10.42 (2026-07-27)\n\n- Internal improvements.\n\n---\n\n## 0.10.41 (2026-07-27)\n\n### Platform (Studio)\n\n- Run traces now show each attempt of an AI request. A request that timed out and was retried used to appear as a single long bar, so a step that spent three timeouts on one page looked identical to one slow call. The raw trace now has one bar per try, labelled with the try number, and the run timeline marks a retried call with how many times it was sent. Retried requests also record how long they waited for a free slot, which distinguishes a slow model from a queue backed up behind its own in-flight requests. For documents parsed page by page, each split retry records the pages it covered and how deep the split went.\n- Runs and Experiments improvements: - An experiment run now shows the same input and output panels as the main run view, including input file downloads, per-step output files, and inline field-level output review. - Scored runs show their eval score in the runs list and in the run header, so an experiment's results can be compared without opening each run. - A run that came from an experiment or a dataset example now links straight to that run in the Evals view. - The Live and Experiments toggles on Runs are remembered between visits. - Field grounding: a wide document no longer overflows the panel. Wide tables and long unbroken text scroll inside the document card.\n\n---\n\n## 0.10.40 (2026-07-25)\n\n### Infrastructure & processing\n\n- Processing reliability on busy deployments: health checks are now served independently of document processing, so the service stays responsive to them even while working through a heavy document. It is no longer restarted mid-run just because it is under load, so long-running document runs complete more reliably.\n- Document processing is more resilient on CPU- and memory-constrained deployments. Page rasterization for vision and OCR now runs in isolation, so a single large or malformed document can no longer stall the processing service or cause it to restart mid-run. Runs on big scanned documents that previously failed partway through with \"the worker stopped before this attempt recorded a terminal result\" now complete reliably.\n\n---\n\n## 0.10.39 (2026-07-25)\n\n### Platform (Studio)\n\n- Label Pages runs: the page preview now shows the classified document in the full viewer instead of small thumbnails. PDFs render page-by-page with zoom and navigation and each page's labels shown beside it; Word and other Office documents open in their own preview next to a per-page label list. Filter by a label to focus on just the pages that carry it.\n\n---\n\n## 0.10.38 (2026-07-24)\n\n### Platform (Studio)\n\n- OpenParser Studio: manage extraction pipelines from a dedicated workspace — create, edit, run, duplicate, and delete saved configurations. Jobs show the pipeline and version that produced each result, and you can save a new pipeline from job settings.\n- OpenParser Studio: clearer progress while documents upload, parse, and extract, with live elapsed timing at each stage. Job history and the playground share a unified header with breadcrumbs, improved document and Markdown output viewers, and a cleaner parse sidebar. Choose light or dark theme and manage your account from the sidebar; model selectors and in-product copy are simpler throughout the workspace.\n- Members provisioned through SSO are now read-only in workspace member settings. Their role and access come from your identity provider's groups, so admins can no longer change or remove them by hand, and each SSO member is clearly labeled. Accounts created with a username and password stay fully manageable by admins.\n\n### Public API\n\n- **Breaking:** OpenParser API resource identifiers now use consistent prefixed ids. Parse, extract, and batch jobs return `opj_…` ids instead of UUIDs. Saved extraction pipelines use `oppl_…` instead of `oep_…`. New parse output writes figure image ids as `opfig_…` instead of `ocrfig_…`. Existing jobs and pipelines are remapped automatically on upgrade when the OCR queue is idle enough for migration preflight. Prefer the new formats in job URLs, `parse_job_id`, `pipeline_id`, and batch child `job_id` fields. During the transition, previously issued UUID job ids, `oep_…` pipeline ids, and UUID list cursors remain readable; responses continue to return the preferred `opj_…` / `oppl_…` forms. Historical parse artifacts and `result_json` may still embed legacy `ocrfig_…` figure paths; `GET /files/\\{id}` accepts both `opfig_…` and `ocrfig_…`.\n\n### Infrastructure & processing\n\n- Hardened AI-powered document processing against prompt-injection attempts hidden inside uploaded documents. Instructions embedded in a document can no longer steer extraction, classification, or vision results away from the requested schema, or coax the model into disclosing its own configuration.\n- AI vision step results no longer include internal document storage references in their metadata. The step's `_vision` provenance now records only which pages were inspected and how many were merged, keeping internal storage paths out of workflow output.\n\n---\n\n## 0.10.37 (2026-07-24)\n\n### Platform (Studio)\n\n- New **Label Pages** step tags each page of a document with zero or more labels (multi-label) using AI, and groups the results into a label-to-pages map. Unlike section splitting — which produces one contiguous range per section — this collects pages of the same kind wherever they appear, so scattered pages (for example every signature or photo page throughout a report) can be gathered in one place. The page-inspection step can now take an explicit list of page indices, so you can route the pages for a given label straight into a visual inspection without hand-listing them.\n\n---\n\n## 0.10.36 (2026-07-23)\n\n### Platform (Studio)\n\n- OpenParser Job History now reports the real end-to-end duration for completed parse and extraction jobs instead of showing a zero or unavailable measurement.\n- Running OpenParser jobs now show the document scanning animation from the playground while results are being prepared.\n- Parse and Extract now use consistent operation icons across OpenParser Studio and documentation.\n\n---\n\n## 0.10.35 (2026-07-23)\n\n### Platform (Studio)\n\n- OpenParser sign-in and account creation now redirect directly to the branded authentication flow without an intermediate confirmation page.\n- OpenParser parse jobs now retain both `raw` and `openparser@1` results. Retrieve either representation with `GET /jobs/\\{id}/result?format=...`, switch formats in the Studio Output tab, and start extraction from a raw-format parse job without running OCR again.\n\n### Public API\n\n- OpenParser parse jobs now retain both `raw` and `openparser@1` results. Retrieve either representation with `GET /jobs/\\{id}/result?format=...`, switch formats in the Studio Output tab, and start extraction from a raw-format parse job without running OCR again.\n- OpenParser now keeps recognized text aligned with its original bounding box by default. Set `ocr_options.merge_layout_blocks` to `true` per parse, extraction, batch item, or saved pipeline when merged recognition is preferred over one-to-one text geometry.\n\n---\n\n## 0.10.34 (2026-07-23)\n\n### Platform (Studio)\n\n- OpenParser sign-in and account creation now keep OpenParser branding throughout the authentication experience.\n- OpenParser Studio: uploads and sample documents now open their Job History detail immediately, so browser back and forward navigation follows each run naturally while extraction and result review stay in one place.\n- Run detail now shows clean, readable file names for inputs and outputs instead of internal storage identifiers, and long file names no longer overlap the preview and download buttons.\n\n### Public API\n\n- OpenParser parsing now preserves every detected layout region—including empty title, header, and figure boxes—so document overlays remain complete. The obsolete `figure_assets` option is removed because figure regions are now always retained.\n- OpenParser can now process documents beyond 25 pages and admit batches of up to 100 documents, while retaining per-page safety limits.\n- OpenParser jobs can now stream their retained source documents with `GET /jobs/\\{id}/source`, making it easier to build durable review experiences around past runs.\n- `POST /suggest-schema` now returns the suggested schema inline as a convenience response instead of creating a job that clients must poll.\n\n### Infrastructure & processing\n\n- Documents uploaded without a declared file type are now recognized from their contents, so PDFs, RTF, and Office files parse reliably instead of failing with an \"unsupported file type\" error. This most often helped uploads coming from automated integrations that omit the file type.\n\n---\n\n## 0.10.33 (2026-07-22)\n\n### Platform (Studio)\n\n- OpenParser Studio: make Playground the home page, add shareable social previews, clarify job status and pipeline empty states, and tidy the OCR model selector copy.\n\n### Public API\n\n- OpenParser suggested extraction model catalog (`GET /models/llm` in suggested mode) now surfaces up to 20 recommended models instead of 12, so more current options appear before you need to search.\n\n---\n\n## 0.10.32 (2026-07-22)\n\n- Internal improvements.\n\n---\n\n## 0.10.31 (2026-07-22)\n\n### Platform (Studio)\n\n- OpenParser Studio production sign-in no longer auto-redirects to Eigenpal when you are signed out. Choose **Continue to sign in** on the local OpenParser page to authenticate with your Eigenpal account; sign-out stays on OpenParser.\n\n---\n\n## 0.10.30 (2026-07-22)\n\n### Platform (Studio)\n\n- OpenParser production sign-in now shares Eigenpal sessions across its dedicated domain and returns users to their original OpenParser destination after authentication.\n- OpenParser Playground: remove the doubled border and rounded corners around the document workspace.\n\n### Infrastructure & processing\n\n- OpenParser: restore schema suggestions, use GPT-5.6 Terra as the default extraction model with GPT-4.1 Mini as a certified fallback, tighten compatibility checks, and provide clearer failure guidance.\n\n---\n\n## 0.10.29 (2026-07-22)\n\n### Platform (Studio)\n\n- OpenParser Studio sign-in and sign-up now load the shared identity UI correctly for signed-out visitors.\n\n---\n\n## 0.10.28 (2026-07-22)\n\n### Platform (Studio)\n\n- API keys: keep usable credentials in the primary list and move revoked or expired credentials into a collapsed history section for faster scanning.\n- OpenParser Studio sign-in and sign-up now show OpenParser product copy and logo while retaining the shared Eigenpal identity.\n\n### Public API\n\n- OpenParser model discovery (`GET /models/llm`) now refreshes the live compatible catalog on the API service instead of falling back to a short emergency list when the catalog credential is missing from that process.\n\n### Infrastructure & processing\n\n- OpenParser document processing now bounds source downloads and retries transient storage failures, preventing stalled jobs from running indefinitely.\n\n---\n\n## 0.10.27 (2026-07-21)\n\n### Platform (Studio)\n\n- New Inspect Pages (Vision) step lets a workflow look at the actual page images of a document and return structured results, for details that only exist in the pixels rather than the text. Use it to check whether a document is signed, rate embedded photos, or spot stamps and logos. It works on PDFs, images, and Office documents, and you can point it at a specific page range (for example the section found by a Split step) so it only reviews the pages that matter. The run trace shows the pages it inspected next to the results.\n- Parsing can now describe the figures on a page as text. Enable \"describe figures\" on a Parse step and the images on each page (property photos, charts, stamps) are detected and captioned inline, so later steps that work on text, like Split, can find image-only pages. This is especially useful for scanned documents, where the photo pages carry almost no text on their own. You can provide custom instructions for how figures should be described.\n- Split step results are now also available keyed by section name. A later step can point at one section directly, for example `\\{\\{ steps.split.output.sections.photos.page_range }}`, instead of filtering the full list. This makes wiring a Split step into a downstream step much simpler.\n- The Inspect Pages (Vision) step now takes a Page From / Page To range instead of a single page-range expression, and both are optional. Leave them blank to inspect the whole document, which is processed in chunks and the results merged automatically. This makes it much easier to point the step at a range (for example the start and end of a Split section) or to scan an entire document without writing a range expression.\n\n---\n\n## 0.10.26 (2026-07-21)\n\n### Platform (Studio)\n\n- Wildcard API keys can use the OpenParser OCR API consistently with every other platform capability. Keys can also be restricted to the dedicated `ocr:full` scope when OCR-only access is preferred.\n- Run traces now include a Grounding panel for extract steps: every extracted value is highlighted in the input text, tinted by confidence, and clicking a field or a highlight jumps between them. Grounded fields also show inline context previews of the exact source passage, both in the panel and in the expanded step row. Split steps gain the same visual page-range panel the segmenter uses, with page thumbnails and per-section preview. The workflow builder reflects that grounding is on by default and lets you pick any configured provider as the grounding model, and capturing expected output from a run no longer snapshots volatile grounding metadata into evals.\n\n### Public API\n\n- Wildcard API keys can use the OpenParser OCR API consistently with every other platform capability. Keys can also be restricted to the dedicated `ocr:full` scope when OCR-only access is preferred.\n- OpenParser: completed extraction jobs can now be retrieved reliably with their attempt and usage metadata.\n\n### CLI\n\n- The step catalog now documents grounded extraction as the default: extract steps ship per-field confidence and source spans under the `_grounding` output key unless `grounded: false` is set.\n\n### Infrastructure & processing\n\n- Data extraction now verifies itself by default. Every extract step traces each extracted field back to its exact location in the source text and attaches a confidence level (high, medium, or low) plus a needs-review flag under a reserved `_grounding` output key, so downstream steps and evaluators can route uncertain values to a human. The verification pass runs on your workspace model (any configured provider), chunks long documents automatically, and falls back to deterministic text matching instead of failing the run when no model is available. Set `grounded: false` on a step to opt out.\n\n---\n\n## 0.10.25 (2026-07-20)\n\n### Platform (Studio)\n\n- Failed single sign-on attempts now return to the sign-in page with a clear, actionable message (for example, when an account's email domain isn't authorized or the account hasn't been granted access) instead of a blank error page.\n\n---\n\n## 0.10.24 (2026-07-15)\n\n### Platform (Studio)\n\n- Agent runs graded by configured evaluators now record a weighted score and pass/fail result, visible in the runs feed and run detail responses. Previously only workflow runs carried an evaluator verdict.\n- Email addresses for a workflow are unique across your whole organization, not just the workflow you are editing. Picking one that is already taken used to fail with a server error. It now tells you which workflow already receives email at that address, or that the workflow you are editing already has it, so you know what to do next. Duplicate folder names and duplicate workspace invites also report clearly instead of failing.\n- `ai.extract` with `grounded: true` no longer succeeds silently without producing grounding. When the grounding pass cannot run (missing OpenAI credentials on the worker, or a grounding model that is not an OpenAI model) the step now fails with an error that names the exact misconfiguration. When the pass runs but produces no field grounding, the output carries an explicit degraded marker instead of nothing. The grounding model picker in the workflow builder now only offers OpenAI models, matching what the grounding pass supports.\n- Agent training: when a training session fails to open, the dashboard now shows what went wrong instead of a generic error. The message names the setup step that failed, and a session blocked by secrets that cannot be decrypted says so and points at the agent settings. A session whose setup fails partway through no longer opens on an incomplete workspace.\n- Self-hosted deployments can now sign users in through corporate single sign-on services that use a redirect-and-token flow instead of OIDC. The new protocol supports mutual TLS for the server-to-server exchange, maps directory groups to EigenPal roles (admin, member, viewer) on every SSO sign-in so the directory stays the source of truth, and links existing password accounts by email so nobody loses access when SSO is turned on. Startup validation rejects unsafe callback origins and provider identifiers, while malformed or oversized identity responses fail closed.\n\n### Public API\n\n- Syncing an automation immediately after a release no longer fails with HTTP 500 while the new release tag propagates. The sync endpoint now reports a retryable status with a clear message when the Git source is momentarily unavailable.\n- Fixed single-experiment results export returning HTTP 400 whenever the `includeTrace` query flag was omitted. `workflow experiment results` and the auto-pull at the end of `workflow experiment watch` now download per-evaluator results in JSON and CSV again.\n- Creating an email trigger address that is already in use now returns 409 with a message naming the workflow in your organization that already uses it, instead of 500.\n\n### CLI\n\n- Agent example runs now report a real evaluator verdict in the CLI: `eigenpal run agents.&lt;name&gt; --example &lt;name&gt; --wait` waits for the verdict, prints the weighted score and pass/fail result, and `--fail-on-mismatch` exits non-zero when the run fails its evaluators, matching the existing workflow behavior. When no evaluators are configured, the CLI says so instead of silently reporting nothing.\n- `agents secrets` is now one command group with `list`, `set`, `unset`, `import`, and `export` subcommands (`agents secret` remains as an alias). The new `agents secrets list` shows the secret names and descriptions declared in the package without ever printing values. Previously `set` and `unset` lived under a separate singular command and `secrets list` failed with an argument error.\n- `agents sync` retries automatically with a short backoff when the server reports the Git source as temporarily unavailable, so the sync right after `agents release` succeeds without manual retries.\n- `agents dataset validate` now checks the same layout the server accepts on `agents dataset push`: example folders under `examples/`, file inputs referenced from `input.json` with `\\{ \"$file\": \"input/...\" }`, and `expected.json` optional. Previously the local validator demanded a different layout that push would then reject, so no dataset could satisfy both. Validation errors now point at the exact rule that failed, including a hint when example folders sit at the dataset root instead of under `examples/`. When the agent package carries an input schema, each example's full input object is validated against it (required fields, unknown keys, and value types, with `\\{ \"$file\": ... }` references accepted for file fields), so inputs that would fail at run start are caught locally. Failure-expected examples (`expected.json` with `$error`) are rejected for agent datasets, since agent runs are evaluated only when they complete.\n\n[View full release notes →](/releases/0.10.24)\n\n---\n\n## 0.10.23 (2026-07-15)\n\n- Internal improvements.\n\n---\n\n## 0.10.22 (2026-07-14)\n\n### Platform (Studio)\n\n- Organization members can now configure, test, and manage outbound webhooks from Studio.\n\n---\n\n## 0.10.21 (2026-07-14)\n\n### Platform (Studio)\n\n- Webhooks: notify external systems when workflow or agent runs are created or change status, with signed delivery, custom headers, retry history, testing, and manual redelivery from Studio.\n- Webhook signing secrets are now easier to copy securely from endpoint setup and details, with clearer event selection defaults.\n- Webhook setup now keeps failed submissions actionable with clear inline error feedback.\n\n### Public API\n\n- Run creation and rerun requests now publish signed lifecycle webhooks only after inputs are ready, so API-triggered automations never emit events for runs that fail during setup.\n\n### Infrastructure & processing\n\n- Improved staging worker deployment reliability when compute capacity is fully allocated.\n\n---\n\n## 0.10.20 (2026-07-12)\n\n### Platform (Studio)\n\n- Workflows: configure automatic retries from Studio at the workflow level or override them for individual HTTP GET/HEAD and Website Reader steps.\n\n### CLI\n\n- The bundled workflow reference now documents durable retry policies, inheritance, supported step types, and retry safety limits.\n\n### Infrastructure & processing\n\n- Workflow runs can recover replay-safe network steps from transient failures without restarting completed work, using bounded backoff and durable retry state. Retry behavior is now step-scoped. Legacy whole-run retry settings no longer restart a failed workflow; configure durable retries on eligible steps or through the workflow retry default instead.\n\n---\n\n## 0.10.19 (2026-07-09)\n\n### Platform (Studio)\n\n- Workflow composition is unified on `action.invoke-workflow`: use `execution: inline` (default) to run a target workflow's steps inside the parent run, or `execution: child` for a separate child run. Reusable blocks (`control.block`, `kind: block`) are removed — migrate to inline invoke with `workflow: &lt;name-or-id&gt;`.\n\n### Public API\n\n- Workflow run endpoints now preserve inline invoke snapshots across initial runs, reruns, and dataset executions so composed workflows remain reproducible after target workflows change.\n\n### CLI\n\n- Workflow YAML reference docs now describe `action.invoke-workflow` as the single composition primitive, including inline and child execution modes.\n\n---\n\n## 0.10.18 (2026-07-08)\n\n### Infrastructure & processing\n\n- On-prem deployments: improve OpenShift compatibility so migration and processing jobs can start reliably under random-user security policies.\n\n---\n\n## 0.10.17 (2026-07-08)\n\n### Platform (Studio)\n\n- Document parser: vision parsing can now render PDF pages at higher resolution and image quality for documents where small text or compression artifacts hurt OCR accuracy.\n\n### Infrastructure & processing\n\n- Document parser: vision parsing can now render PDF pages at higher resolution and image quality for documents where small text or compression artifacts hurt OCR accuracy.\n\n---\n\n## 0.10.16 (2026-07-07)\n\n### Platform (Studio)\n\n- Workflow experiment results now preserve evaluator error details alongside each per-evaluator score, so example grading views and tools can distinguish failed judges from unknown results instead of treating them as passing.\n\n### CLI\n\n- `eigenpal run &lt;workflow&gt; --example &lt;name&gt;` now actually grades the example instead of printing `PASS` whenever the run merely finished. It runs the workflow's current published version on the server's stored dataset example, so configured evaluators run automatically and the CLI surfaces the real weighted score and per-evaluator pass/fail. Workflows with no evaluators fall back to a structural diff of the output against the example's stored expected output. The summary reports two separate signals: execution health (`ok`/`errored`) and accuracy. Add `--fail-on-mismatch` to exit non-zero when a graded example fails. Because the run uses the server-side example, push your latest dataset and evaluators (`eigenpal workflow dataset push`, `eigenpal workflow evaluators push`) before running `--example`.\n\n---\n\n## 0.10.15 (2026-07-06)\n\n### Platform (Studio)\n\n- Experiments: make result review easier in Studio with trace exports, clickable score bars, calmer live refreshes, developer-view defaults, and clearer separation between below-threshold results and run errors.\n\n### Public API\n\n- Experiment export endpoints now support JSON exports with full run trace details for deeper debugging and audit review.\n\n### SDK\n\n- SDK clients now expose the trace-inclusive experiment export option for deeper debugging and audit review.\n\n---\n\n## 0.10.14 (2026-07-06)\n\n### Platform (Studio)\n\n- Evaluations: expected workflow failures now report cleaner scores when a run is supposed to stop early. Studio marks non-applicable quality judges as skipped, so successful rejection examples can receive a full score from the structured failure checks that actually apply.\n\n---\n\n## 0.10.13 (2026-07-06)\n\n- Internal improvements.\n\n---\n\n## 0.10.12 (2026-07-06)\n\n- Internal improvements.\n\n---\n\n## 0.10.11 (2026-07-03)\n\n- Internal improvements.\n\n---\n\n## 0.10.10 (2026-07-03)\n\n- Internal improvements.\n\n---\n\n## 0.10.9 (2026-07-02)\n\n### Platform (Studio)\n\n- Build document-processing workflows that split, route, and verify a mixed batch: - **Document separation** detects the boundaries and types of the documents inside one large scan, so a single upload can be broken into its individual documents and each sent to its own extraction pipeline — even for batches hundreds of pages long. - **Multi-way routing** sends each detected document to the right branch by its type, and stays readable on the canvas even with many branches. - **Grounded extraction** attaches a confidence level and source location to each extracted field, flagging values that aren't found verbatim in the document so reviewers know where to look. - The run view now lets you open the detected documents and preview their pages, and inspect the OCR layout with bounding boxes drawn over the page (with a toggle to the extracted text) — right from the step timeline.\n\n### CLI\n\n- The workflow step catalog now lists the new document-separation and multi-way routing steps, plus the grounded-extraction options, so authoring and validating workflows from the CLI stays in step with what the platform supports.\n\n### Infrastructure & processing\n\n- Self-hosted (on-prem) deployments can now run official EigenPal release images, with access provisioned per customer. Images are published only after a release ships and are signed so you can verify their authenticity before deploying.\n\n---\n\n## 0.10.8 (2026-07-01)\n\n### Platform (Studio)\n\n- Single-file workflow inputs now display correctly after a dataset import. Previously an input that takes one file could show an empty file slot; imported examples now match each file to the workflow's declared input shape.\n- Evaluator scoring now uses a single pass threshold for the whole workflow. The score-by-example chart's cutoff line and every evaluator's pass/fail are measured against that one threshold, so the chart, the per-evaluator results, and the run gate always agree. Experiment scores are shown in two states — passing (green) or below threshold (amber).\n- The LLM judge evaluator now requires evaluation criteria. Without them the model invents its own scoring rubric, so the editor marks the field required, renames it to \"Evaluation criteria\" with a worked example, and blocks saving until it is filled in.\n- Workflow folders can now be reorganized. A new \"Move to folder\" action in each folder's menu lets you move a folder (and everything inside it) into another folder or back to the top level, so you can restructure your workspace without recreating folders. Destinations that would nest a folder inside itself are blocked, with a tooltip explaining why.\n- Nested sub-workflows now display and resolve correctly across runs, the workflow builder, and the CLI. In the Runs list, a run that invokes a sub-workflow which itself invokes another sub-workflow now nests every level under its parent, instead of stopping at the first level. In the workflow builder, an \"Invoke Workflow\" step that targets a workflow built from other invoked workflows now shows the real output field types instead of \"unknown\", so you can reference those fields with autocomplete; referencing one of those fields no longer triggers a false \"field not found\" warning. The same resolution now applies when validating and publishing workflows (including via the CLI), so deeply nested invoke chains validate against their real output fields. All of this resolves through arbitrarily deep chains with a safety limit that prevents looping on workflows that invoke each other.\n- Runs: add a simplified review mode with developer-view toggle, review status badges, and inline output review for JSON fields and generated files.\n- New debugging and control primitives for runs. You can now cancel an in-progress run through the API, experiment results report when a batch has fully finished, steps skipped by a condition or an empty loop are reported as skipped rather than succeeded, and each step records the exact configuration it ran with so failures are easier to diagnose.\n- Run detail responses are leaner and more explicit: you choose exactly which sections to expand, and the public run schema now exposes the workflow version, cancellation-request time, and trace, retry, and email-trigger details.\n\n### CLI\n\n- `eigenpal workflow validate` now tells you when a workflow contains Invoke Workflow steps that local validation cannot fully check. Because those steps reference other workflows that live on the server, the command prints a short note pointing you to `validate --online` (or push) to verify the invoke targets, input types, and cycles. The skill guidance now shows the `--online` step in the validate-then-push flow as well.\n- The evaluator configuration reference now reflects the single workflow-level pass threshold. A per-evaluator `passThreshold` is documented as legacy — pass/fail is decided by the one workflow-level threshold — and that workflow-level threshold no longer shows a fixed default, since it is derived when omitted.\n\n### SDK\n\n- The Python SDK now requires Python 3.10 or newer. Python 3.9 has reached the end of its support window, and dropping it keeps the SDK on current, actively maintained dependencies. If you are still on Python 3.9, upgrade to 3.10+ to continue receiving SDK updates.\n\n[View full release notes →](/releases/0.10.8)\n\n---\n\n## 0.10.7 (2026-06-30)\n\n### Platform (Studio)\n\n- Faster dashboard navigation. Lists keep their contents on screen while filters and folders refresh instead of flashing a loading state, document and image previews are cached so they no longer re-download on every navigation, and heavy viewers (PDF, charts, rich text) load on demand for a quicker first paint.\n- Workflows that invoke another workflow now pass file inputs through to the sub-workflow, so file-backed sub-workflow runs no longer fail before they start.\n\n### CLI\n\n- `eigenpal --help` now groups `run`, `rerun`, and `runs` under a dedicated \"Run\" section instead of the catch-all \"Other\" bucket, so starting a run and reading its output is easy to find.\n\n---\n\n## 0.10.6 (2026-06-30)\n\nThis release contains maintenance and reliability improvements with no customer-facing changes.\n\n---\n\n## 0.10.5 (2026-06-29)\n\nThis release makes EigenPal's public changelog a reliable product record. Each release now has a dedicated docs page that explains what changed for Studio, the public API, the CLI, SDKs, and document processing in one place.\n\nThat means teams can follow platform improvements without piecing together GitHub activity or package-specific notes. The changelog is organized around customer-facing product areas, so it is easier to see which changes affect app users, API integrations, developer tools, and processing behavior.\n\n### Platform (Studio)\n\n- Invoke Workflow steps are now typed end to end. Pick a target workflow and map each input it declares to a value, then reference the workflow's output fields and any files it generates from downstream steps with autocomplete. Inputs and outputs are checked when you save and when the step runs, so mismatches surface early instead of failing mid-run.\n- Runs that invoke another workflow now appear nested under their parent run in both the runs feed and the run timeline, and link straight to the sub-workflow's own run and trace.\n- You can view a workflow's inferred output schema (the fields and files it returns, typed from its own steps) without running it.\n- File inputs are preserved consistently across runs, reruns, reviewed examples, and dataset experiments, so reused runs and examples no longer lose or mispoint their files.\n- Creating new organizations and other Git-backed source operations stay reliable even during Git provider outages.\n\n### Public API\n\n- Run file inputs now use a consistent artifact model. Callers provide reusable files with `$fileId` or inline files with `$inline`, and EigenPal materializes them into run-owned artifacts before execution, reruns, promotion, and dataset workflows.\n- A new endpoint returns a workflow's inferred output schema without running it, as JSON Schema or as a TypeScript or Python type.\n\n### CLI\n\n- `eigenpal workflow schema <workflow>` prints a workflow's inferred output schema as JSON Schema, or as a TypeScript or Python type with `--format`.\n\n[View full release notes →](/releases/0.10.5)\n\n---\n\n## 0.10.4 (2026-06-25)\n\n### Platform (Studio)\n\n- Unify file list review surfaces\n\n---\n\n## 0.10.3 (2026-06-24)\n\n### SDK\n\n#### Patch Changes\n\n- e48cb81: Remove `fileVerdict` from run review correction types; file correction intent is encoded via `correctedArtifactPath`.\n\n---\n\n## 0.10.2 (2026-06-24)\n\n### CLI\n\n#### Patch Changes\n\n- ca9ae4f: Workflow inputs can declare an external file `source` (single-tenant on-prem). A `type: file` input with `source: &lt;name&gt;` (e.g. `gpfs`) is provided as a plain string id at run time; the worker resolves it to a file artifact via the configured source before the workflow executes.\n\n---\n\n## 0.10.1 (2026-06-23)\n\n### Public API\n\n- Polish reviews pages and group API reference nav\n\n### Infrastructure & processing\n\n- Client-shareable deployment architecture PDFs\n\n---\n\n## 0.10.0 (2026-06-23)\n\n### Platform (Studio)\n\n- Add simple runs review mode\n\n### Infrastructure & processing\n\n- Autogenerate chart architecture diagram from helm template\n- AWS/GCP/Azure Terraform examples with architecture diagrams\n- Helm chart + local kind for single-tenant on-prem\n\n---\n\n## 0.9.0 (2026-06-22)\n\n### CLI\n\n#### Minor Changes\n\n- c35d5d4: Clean up the public runs and evaluation API surface: move workflow eval operations onto automations, expose run scores/artifacts through the unified runs API, and update CLI/SDK helpers to use the canonical routes.\n\n Breaking: `runs.evalResults` and `GET /api/v1/runs/\\{id}/eval-results` are replaced by `runs.scores` and `GET /api/v1/runs/\\{id}/scores`.\n\n#### Patch Changes\n\n- c35d5d4: Clarify `--max-wait` help text so timeout exit behavior reads naturally.\n\n### SDK\n\n#### Minor Changes\n\n- c35d5d4: Clean up the public runs and evaluation API surface: move workflow eval operations onto automations, expose run scores/artifacts through the unified runs API, and update CLI/SDK helpers to use the canonical routes.\n\n Breaking: `runs.evalResults` and `GET /api/v1/runs/\\{id}/eval-results` are replaced by `runs.scores` and `GET /api/v1/runs/\\{id}/scores`.\n\n[View full release notes →](/releases/0.9.0)\n\n---\n\n## 0.8.0 (2026-06-18)\n\n### CLI\n\n#### Minor Changes\n\n- d620a00: Expose the clean public automation API around automations, runs, files/artifacts, datasets, evaluators, experiments, evaluation results, and run promotion. This intentionally breaks the pre-v1 SDK/CLI surface that exposed workflow- and agent-specific top-level resources outside the explicit legacy compatibility routes.\n\n > [!WARNING]\n > **Breaking change (pre-v1).** The workflow- and agent-specific top-level\n > resources have been removed in favor of a single automation-centric surface.\n > These packages are still 0.x, so this breaking redesign ships as a `minor`\n > bump. Update your integration before upgrading.\n\n #### Removed\n - Top-level workflow resources, e.g. `client.workflows.*`, including\n `client.workflows.executions.runAndWait(...)` and the rest of the\n `client.workflows.executions.*` tree.\n - Top-level agent resources, e.g. `client.agents.*` (runs, reviews, traces,\n files, expected artifacts).\n - Top-level source/git resources, e.g. `client.sources.*`.\n\n[View full release notes →](/releases/0.8.0)\n\n---\n\n## 0.7.2 (2026-06-13)\n\n### SDK\n\n#### Minor Changes\n\n- c5a709c: Public workflow list/detail responses include `apiEnabled` and `triggers`; run definition docs note workflow-only scope.\n\n---\n\n## 0.7.1 (2026-06-13)\n\n### SDK\n\n#### Patch Changes\n\n- 9db3f01: Expose `apiEnabled` and `triggers` on `AgentSummary` for runtime trigger projection.\n\n---\n\n## 0.7.0 (2026-06-12)\n\n### CLI\n\n#### Minor Changes\n\n- 963fd6c: Unify run detail on `GET /api/v1/runs/\\{id}`: return the canonical Run object directly (no `\\{ run: ... }` envelope) and merge expanded fields in-place via documented `expand` tokens. Remove the session-only `expand=internal` dashboard escape hatch; SDKs and CLI now use explicit expand lists.\n\n#### Patch Changes\n\n- 963fd6c: Update runs commands for the grouped run API shape and four expand tokens.\n\n### SDK\n\n#### Minor Changes\n\n- 963fd6c: Unify run detail on `GET /api/v1/runs/\\{id}`: return the canonical Run object directly (no `\\{ run: ... }` envelope) and merge expanded fields in-place via documented `expand` tokens. Remove the session-only `expand=internal` dashboard escape hatch; SDKs and CLI now use explicit expand lists.\n\n#### Patch Changes\n\n- 12c00d8: Docs: clearer wording in the file-input and TypeScript-runtime sections. No API or behavior changes.\n\n---\n\n## 0.6.17 (2026-06-12)\n\n### SDK\n\n#### Patch Changes\n\n- 716c3cf: Update the hosted default API base URL and API-key guidance from `app.eigenpal.com` to `studio.eigenpal.com`.\n\n---\n\n## 0.6.16 (2026-06-12)\n\n### CLI\n\n#### Patch Changes\n\n- 75dd64c: Internal refactor: move the skill tool registry into its own module so other tooling can import it. No change to any command, flag, argument, or output.\n\n---\n\n## 0.6.15 (2026-06-10)\n\n### CLI\n\n#### Minor Changes\n\n- ca87265: Unify workflow and agent run starts behind the canonical `/api/v1/run/\\{target}` endpoint, root `eigenpal run` / `eigenpal rerun` commands, and root SDK `client.run()` / `client.rerun()` methods.\n\n The old nested CLI commands and SDK resource methods for starting workflow or agent runs have been removed.\n\n#### Patch Changes\n\n- 5ea0bb5: `workflow dataset pull` gains `--example-id &lt;id&gt;` (repeatable) to export a single example or a selected subset of a dataset, instead of always pulling the whole dataset. The subset ZIP uses the same archive layout as a full pull, so it re-imports into any dataset via `dataset push --mode append`. Requesting an example id that does not exist for the workflow exits non-zero.\n\n### SDK\n\n#### Minor Changes\n\n- ca87265: Unify workflow and agent run starts behind the canonical `/api/v1/run/\\{target}` endpoint, root `eigenpal run` / `eigenpal rerun` commands, and root SDK `client.run()` / `client.rerun()` methods.\n\n The old nested CLI commands and SDK resource methods for starting workflow or agent runs have been removed.\n\n---\n\n## 0.6.10 (2026-06-08)\n\n### CLI\n\n#### Patch Changes\n\n- 99ca1b4: Unify agent and workflow run commands and SDK helpers on the shared `/api/v1/runs` API, including the public `client.runs` facade and regenerated SDK reference docs.\n\n### SDK\n\n#### Patch Changes\n\n- 99ca1b4: Unify agent and workflow run commands and SDK helpers on the shared `/api/v1/runs` API, including the public `client.runs` facade and regenerated SDK reference docs.\n\n---\n\n## 0.6.9 (2026-06-04)\n\n### SDK\n\n#### Minor Changes\n\n- 5e7c051: Add `observability` (phase timeline + structured failure) to workflow execution and agent run status API responses.\n\n---\n\n## 0.6.6 (2026-06-03)\n\n### CLI\n\n#### Patch Changes\n\n- 245f347: Clean up the agent CLI surface by removing obsolete compatibility commands, moving reruns to `agents rerun`, and replacing run pulls with canonical artifact fetching.\n- 5ab00ee: Tighten permissions on `~/.config/eigenpal/credentials.json` and its parent directory to owner-only (0600 / 0700). Previously the file was written 0600 but the parent directory inherited the user's umask (typically 0755), allowing other local users to list the directory and stat the file. The CLI now also re-tightens permissions on every write, so installs created with older versions are corrected on the next `auth login` / `auth use`.\n\n---\n\n## 0.6.4 (2026-06-03)\n\n### CLI\n\n#### Patch Changes\n\n- c3486a5: Fix agent git cutover QA findings: dashboard runs now navigate to the created run, inbound email aliases preserve mixed-case organization qualifiers, sandbox source materializes under `/workspace/agent`, run artifact downloads use direct paths like `/files/eigenpal.lock`, wait-for-completion responses include source provenance, and CLI wait/watch commands exit nonzero for failed or cancelled runs.\n\n### SDK\n\n#### Patch Changes\n\n- c3486a5: Fix agent git cutover QA findings: dashboard runs now navigate to the created run, inbound email aliases preserve mixed-case organization qualifiers, sandbox source materializes under `/workspace/agent`, run artifact downloads use direct paths like `/files/eigenpal.lock`, wait-for-completion responses include source provenance, and CLI wait/watch commands exit nonzero for failed or cancelled runs.\n\n---\n\n## 0.6.2 (2026-06-02)\n\n### CLI\n\n#### Patch Changes\n\n- d2202b6: List all agent runs for unqualified targets, and reserve source-ref filtering for explicit `@ref` targets.\n\n---\n\n## 0.6.0 (2026-06-02)\n\n### CLI\n\n#### Minor Changes\n\n- 2aeeaf2: Add native source `git save` and branch-aware `git release` flows for Git-backed builder workspaces.\n\n#### Patch Changes\n\n- 2aeeaf2: Complete the agent Git cutover with pluralized agent CLI commands, source-ref run support, lockfile metadata, and regenerated SDK/docs surfaces.\n- 2aeeaf2: Expose Git-backed agent source refs and public source automation APIs consistently across CLI docs and SDK facades.\n\n### SDK\n\n#### Patch Changes\n\n- 2aeeaf2: Complete the agent Git cutover with pluralized agent CLI commands, source-ref run support, lockfile metadata, and regenerated SDK/docs surfaces.\n- 2aeeaf2: Expose Git-backed agent source refs and public source automation APIs consistently across CLI docs and SDK facades.\n\n---\n\n## 0.5.12 (2026-06-02)\n\n### CLI\n\n#### Minor Changes\n\n- d3b0768: Add `control.fail` and `ai.classify` step types, plus the `expected/error.json` dataset assertion format.\n - `control.fail` terminates a workflow with a typed status code + message envelope. Optional `condition` template gates the fail. Compose with `ai.classify` to reject documents that match an undesired label.\n - `ai.classify` runs single-label closed-set classification through the existing extract LLM pipeline. Output is `\\{ label, confidence, reason }`, where `label` is constrained to the configured names.\n - `examples/&lt;name&gt;/expected/error.json` (mutually exclusive with `output.json`) lets eval examples assert that a workflow should fail with a specific `\\{ code, messageContains, step }`. The exact-diff evaluator scores 1 on match, 0 otherwise.\n - `eigenpal workflow validate` now catches `expected/error.json` shape issues and per-step config violations (e.g. `ai.classify` with fewer than two labels) at push time instead of deferring to runtime.\n\n Skill reference docs (`step-types.md`, `dataset-format.md`, `evaluators.md`, `workflow-yaml.md`) updated.\n\n#### Patch Changes\n\n- 99cad97: Skill reference (auto-generated from `WorkflowDefinitionSchema`) now documents the new `values` row for enum inputs, alongside the existing `items` row used by array inputs. Output-only doc refresh — no CLI behavior change.\n- d70f697: Document the `control.parallel`, `control.parallel_map`, `control.foreach`, `control.if`, and `control.block` step types in the bundled skill reference. The auto-generated catalog cannot render nested step shapes, so the YAML form, output access paths (e.g. `steps.&lt;parallel&gt;.output.&lt;branch&gt;.&lt;inner&gt;.&lt;field&gt;`), and scoping rules now live as hand-written prose. Also documents the multi-step iteration hazard: only the LAST inner step's output is keyed into each `items[i]` for `parallel_map` / `foreach` — end the body with a `transform.script` if you need to preserve intermediate fields.\n- ed2cde6: Fix `eigenpal workflow pull` writing a 0-byte file. The v1 single-workflow endpoint now returns the current YAML at the top level (`yamlContent`) via a new `WorkflowDetail` response shape, and the CLI throws a clear error instead of silently writing empty output when no version has been published. Also fixes adjacent regressions caused by the same picker: `workflow list` now shows the workflow name and version columns (previously always `-`), `workflow push --bump` reads the server's current version correctly, the \"did you mean?\" suggestion on a slug typo lists candidates again, and `workflow execution list` shows a duration column computed from the run start/end timestamps.\n\n---\n\n## 0.5.11 (2026-05-26)\n\n### CLI\n\n#### Patch Changes\n\n- 2958f4d: Fix Git-backed source smoke-test polish: hidden `git show` and `git sync` now accept bare agent slugs, and workflow scaffolds use the current `triggerMethods` YAML shape.\n\n---\n\n## 0.5.10 (2026-05-26)\n\n### CLI\n\n#### Patch Changes\n\n- aee7e0c: Add hidden Git source commands for editing trigger policy and encrypted secrets.\n\n---\n\n## 0.5.9 (2026-05-26)\n\n### CLI\n\n#### Major Changes\n\n- fadb59b: CLI command tree reorganized around the data model. Top-level surface is now\n `workflow`, `agent` (reserved), and `skill`; everything that operates on a\n workflow lives under `workflow`, grouped by sub-entity.\n\n Renames (clean break — no aliases):\n - `eigenpal exec &lt;slug&gt;` → `eigenpal workflow execution run &lt;slug&gt;`\n - `eigenpal clear` → `eigenpal workflow clear`\n - `eigenpal install-skill` → `eigenpal skill` (same interactive multiselect UX)\n - `eigenpal execution \\{get,list,watch,compare}` → `eigenpal workflow execution \\{…}`\n - `eigenpal workflow set-definition` → `eigenpal workflow push`\n - `eigenpal workflow get-definition` → `eigenpal workflow pull`\n - `eigenpal workflow set-evaluators` / `get-evaluators` → `workflow evaluators \\{push,pull}`\n - `eigenpal workflow set-dataset` / `get-dataset` / `list-examples` → `workflow dataset \\{push,pull,list}`\n - `eigenpal workflow run-experiment` / `get-experiment-status` / `get-experiment-results` /\n `get-eval-results` / `list-executions` → `workflow experiment \\{run,status,results,eval-results,list}`\n - `eigenpal workflow list-versions` / `restore-version` → `workflow version \\{list,restore}`\n\n[View full release notes →](/releases/0.5.9)\n\n{/* GENERATED:CHANGELOG_INDEX END */}\n"
23
+ "content": "---\ntitle: Changelog\ndescription: Production release history for the EigenPal platform.\n---\n\nEigenPal ships on a unified platform version. Each production release updates Studio, the public API, infrastructure, and (when applicable) the CLI and SDKs together.\n\n{/* GENERATED:CHANGELOG_INDEX START */}\n\n## 0.20.59 (2026-10-19)\n\n### Platform (Studio)\n\n- Ship the nine-chapter credit-report prompt pack, including new market summary and peer analysis chapters, shared analyst writing guidance and fictional examples. Add bounded provider retries, resumable source-checked stages, a model merge with one independent review, native Word tables and source figures, and LiteLLM model routing for on-prem deployments. New sessions use the shipped prompts while restored sessions retain their selected version. Follow-up chat can edit the current Word document, preserving analyst changes, and request approved public research. Update DOCX editor packages to 2.31.0 and add sector-specific first-pass research guidance.\n- Keep document editing available consistently across the application and credit-report follow-up chat.\n\n---\n\n## 0.20.58 (2026-10-18)\n\n- Internal improvements.\n\n---\n\n## 0.20.57 (2026-10-18)\n\n- Internal improvements.\n\n---\n\n## 0.20.56 (2026-10-17)\n\n- Internal improvements.\n\n---\n\n## 0.20.55 (2026-10-16)\n\n- Internal improvements.\n\n---\n\n## 0.20.54 (2026-10-16)\n\n### Infrastructure & processing\n\n- Agent definitions now load reliably when starting runs.\n\n---\n\n## 0.20.53 (2026-10-16)\n\n### Platform (Studio)\n\n- Experimental agents now use their TypeScript definitions consistently when running and resuming, with more reliable definition validation and preserved version history.\n\n### Public API\n\n- Agent metadata now follows the released definition consistently across agent listings and runs.\n\n### CLI\n\n- Agent packages now use TypeScript for configuration and schemas. Frozen installs require captured definitions so resumed runs continue using the same version.\n\n---\n\n## 0.20.52 (2026-10-16)\n\n### Platform (Studio)\n\n- Agent validation and run preparation retry once after a temporary timeout.\n\n---\n\n## 0.20.51 (2026-10-16)\n\n### Infrastructure & processing\n\n- Improve OCR update reliability when spare processing capacity is available.\n- OpenParser prioritizes organizations that have purchased credits within regular and batch request queues. Regular requests still precede batches, and long-waiting requests retain protection against starvation.\n\n---\n\n## 0.20.50 (2026-10-16)\n\n- Internal improvements.\n\n---\n\n## 0.20.49 (2026-10-16)\n\n### Platform (Studio)\n\n- Support TypeScript agent definitions in authoring, releases and execution while preserving existing agents and interrupted runs. New agents use typed configuration and schemas.\n\n### Public API\n\n- Agent endpoints support typed agent definitions and validate inputs against the selected release's schemas while preserving existing agent releases.\n\n### CLI\n\n- Create, validate and release agents with typed TypeScript configuration and schemas. Existing agents remain supported, and dataset validation checks the agent's declared schemas.\n\n---\n\n## 0.20.48 (2026-10-15)\n\n### SDK\n\n- Preserve special JSON Schema keys during compilation without changing schema data.\n- The open-source TypeScript authoring SDK provides `createAgent`, typed input/output schemas, and a compiler for agent configuration. Existing agents continue running unchanged; TypeScript source integration follows separately.\n\n---\n\n## 0.20.47 (2026-10-15)\n\n### CLI\n\n- Git authentication keeps working after runtime upgrades when running the CLI from source.\n\n---\n\n## 0.20.46 (2026-10-15)\n\n### Platform (Studio)\n\n- Training conversations show saved messages while the agent prepares in the background. Messages submitted during preparation wait safely until the agent is ready, and connection errors leave conversation history readable.\n\n---\n\n## 0.20.45 (2026-10-14)\n\n### Platform (Studio)\n\n- Human review now displays confidence scores for nested fields even when lineage evidence is unavailable. Run rows also keep review and duration badges from overlapping in narrower lists.\n- Dataset tab in Studio no longer shows \"No runs yet\" for examples that have run. Agent experiment batches now point each example's `latestRunId` at the new run (the workflow path already did), and the examples list falls back to the newest run by example id when that pointer is missing or stale — the same source the example detail pane's Run Activity reads — so the list and detail can no longer disagree about whether an example has ever run.\n- Fix the caret jumping to the end of the \"Note on this example\" field on every keystroke in the dataset-review Resolve panel. The textarea now edits a local draft that stays fresh through React's controlled-state restoration, while still lifting each keystroke to the session draft.\n- Public research now uses the approved company search when its initial query is left blank, avoiding an unnecessary error at the start of research. Model connection failures now include a diagnostic error code when available, helping distinguish timeouts, refused connections and certificate problems.\n- Fix duplicate nested workflow timeline rows and missing start times that leave running leaf-step timers at zero.\n\n### Public API\n\n- Start workflow runs with a bare workflow ID such as `wf_abc` in the `target` field, for JSON and multipart requests. Existing `workflows.&lt;id-or-slug&gt;` targets remain supported.\n\n### CLI\n\n- Clarify how to flag specific dataset review fields and attach field comments with current workflow values. Agent guidance now keeps expected outputs aligned with the full intended workflow output and leaves comparison rules to evaluators.\n\n### Infrastructure & processing\n\n- Grounded extraction now preserves confidence for scalar fields inside nested objects and arrays, so review routing and confidence displays remain complete for structured outputs.\n- Fix duplicate nested workflow timeline rows and missing start times that leave running leaf-step timers at zero.\n\n---\n\n## 0.20.44 (2026-10-14)\n\n- Internal improvements.\n\n---\n\n## 0.20.43 (2026-10-13)\n\n### Platform (Studio)\n\n- GPT-6.1 Sol is available for agents, with lower cached-input pricing than GPT-6 Sol.\n- Organization admins can choose a default runtime model for agents in Model settings. Agents can inherit that choice or select a specific model. Changing the organization default applies to new runs; existing runs keep their selected model.\n- Pro includes 5,000 credits each month. Organization admins can enable optional pay-as-you-go at $1 per 100 additional credits, billed with the monthly subscription. Billing now clearly shows available, used, and reserved credits, the renewal date, and outstanding additional usage.\n\n### Public API\n\n- Agent responses expose their runtime model override. New agent runs resolve an organization default when unpinned and snapshot the model selected from the requested source version and runtime policy.\n\n---\n\n## 0.20.42 (2026-10-13)\n\n### Platform (Studio)\n\n- Apply operating system security updates to application and processing container images.\n- Rerun with changes now preserves the original workflow version and its input fields, including older releases and saved drafts. If that version cannot be loaded, the form shows an error instead of running a newer version.\n- Run details: input values can now be selected and copied, with a copy button on each value. The Rerun menu adds \"Rerun with changes\", which opens the Trigger page pre-filled with the run's inputs and tags so you can edit them before running. Uploaded files need to be added again.\n- Workflow builder: step outputs that are files (such as the merged PDF from Merge Documents) now show as `file` in reference pills and the variable browser, matching file inputs. Start node inputs that come from an external file source show the source name as a badge.\n\n### Public API\n\n- Webhook events now include the run's tags in `data.run.tags`. Tags stay in the event even when a large `output` is omitted, so you can tag a run with your own identifiers in `POST /api/v1/runs` and match every webhook back to your records without an extra API call.\n\n### CLI\n\n- Updated workflow guidance to explain how waiting for child runs frees processing capacity and how to start a child without waiting for its result.\n\n### SDK\n\n- The `tags` option when starting a run now documents that tags are returned in every webhook event as `data.run.tags`, for correlating events with your own records.\n\n### Infrastructure & processing\n\n[View full release notes →](/releases/0.20.42)\n\n---\n\n## 0.20.41 (2026-10-13)\n\n### Platform (Studio)\n\n- Workflow canvas, for large workflows with conditions, switches, loops and parallel steps: - Nested blocks stay inside their branch. - Fork and join lines meet every branch. - Short branches no longer stretch into empty panes. - Containers show their description and can be collapsed to a one-line summary. - Loops say what they repeat over. - \"Fit to screen\" shows the whole workflow. - \"Add step\" buttons appear on hover inside branches and in longer workflows.\n- Workflow editor and Evals fixes: - Undo now takes one step back per change, including the first change after an undo. - Undoing a newly added step also closes its settings panel. - Cmd+S saves from inside a field, including edits you haven't left the field for yet. - Leaving with unsaved changes offers Save & Leave. - The unsaved-changes marker is a labelled \"Unsaved\" status. It no longer appears on Evals right after saving. - New steps describe missing settings by name (\"Input is required\") instead of raw validation text. - The run panel opens the output when a run finishes. - Experiments that no evaluator scored show \"Not scored\" instead of 0%. - Evaluator names are formatted as you type, and save errors read as plain sentences. - A new dataset example opens on its Input tab. - The toast for starting an experiment from Dataset has a View link to the results.\n- Workflow editor and Evals: the canvas is calmer, with Start and End matching the step cards, Run inside the Start card, neutral connectors, quieter step containers and a subtle response on hover and click. Switching between Editor and Evals, and between Experiments, Dataset and Evaluators, now responds the moment you click, and the workflow version stays visible on both views. Experiments are listed by their example count with a short id instead of a long raw id, \"Run all dataset examples\" shows progress while it starts, an empty time range shows a single clear message instead of empty charts, and experiments without evaluators point you to adding one. Workflow Pal always builds with the current Parse Document and explains that the previous version is kept only for existing workflows.\n- Workflow editor: - The canvas has Undo and Redo buttons. - Renaming a step, a workflow input, or a Set Value or Extract Data field updates every reference to it. - The run panel shows the run's status and duration first. - Step types are named as on the canvas (\"Set Value\"). - When a run input is missing, the form highlights the field and moves the cursor to it. Evals: the pass threshold is set in the evaluator config and saved with it, with a single \"Save evaluators\" button.\n- Grafana dashboard: the Deployment target now defaults to All and panels merge targets, so the dashboard keeps working after an app pod restart changes the scrape target's IP instead of showing NO TARGET until someone picks the new one.\n- Workflows: new Merge Documents step combines several uploaded files (PDFs, scans, phone photos, Word, PowerPoint and OpenDocument files) into one PDF, so Parse, Label Pages, Split and Inspect Pages number pages continuously across every file. Its output lists which pages came from which upload, and the run view shows that page map. In the step picker, Parse Document is now the only parser offered for new steps; existing steps on the previous parser show as Parse Document v1 and offer a one-click switch. Run views now preview the right document when a step reads a file produced earlier in the run, and output files show their real names.\n- Prometheus: a new `eigenpal_automation_ocr_pages_total\\{automation_id}` counter reports the OCR pages each workflow processed. The Grafana dashboard now shows total OCR pages for the selected range, an OCR pages by workflow table, and a pages-per-minute chart of the top 10 workflows.\n- SSO: API keys owned by an SSO user no longer stop working 24 hours after the owner's last sign-in when EigenPal cannot re-check them with the identity provider. Scrapers and integrations keep running; keys still stop when the identity provider refuses the owner, the owner is removed or demoted, or the key is revoked. Refused keys now log a reason (`owner_refused_by_directory`, `owner_without_access`) instead of failing silently.\n\n### Public API\n\n- Starting a run with a single file for an input declared as a list of files now works: the file is treated as a one-item list instead of being rejected.\n- `GET /api/v1/runs` accepts `hasExample=true` to return only runs linked to a dataset example, so evaluation views no longer have to page through production runs to find them.\n\n### SDK\n\n- Listing runs accepts a `hasExample` filter (`has_example` in Python) that returns only runs linked to a dataset example.\n\n[View full release notes →](/releases/0.20.41)\n\n---\n\n## 0.20.40 (2026-10-11)\n\n### Platform (Studio)\n\n- Security hardening: people join an organization only by accepting an invite (the direct \"add existing user\" endpoint is gone), only owners can grant the admin role, members can revoke only their own API keys, API keys can no longer manage keys, members, invites, organization settings, sharing or billing, and demoting someone to viewer or reviewer revokes their API keys. Agent training only reads this session's uploads, email triggers accept a sender only when DMARC passes for the From domain or, for domains without DMARC, SPF passes for that domain, and workflow templates cannot read files from the worker.\n\n### Public API\n\n- Listing workflow executions only resolves file names for files in your own organization.\n\n---\n\n## 0.20.39 (2026-10-10)\n\n### Platform (Studio)\n\n- File source connections: a \"Files (multiple)\" input can now use an external source. Callers start the run with a list of file references (for example several GFR documents for one mortgage application), and the platform fetches each one through the connection and hands the workflow the full list of files, in order.\n- Run form: lists are easier to fill in. Execution tags, and inputs that take a list of text or numbers, now use a chip input: type a value and press Enter, or paste a whole column or row at once. A value that doesn't fit, such as text in a number list, is marked before the run starts. Inputs with a fixed set of allowed values show every option as a chip you can toggle.\n\n### CLI\n\n- The workflow reference now documents `source` on file-list inputs (`type: array`, `items: \\{ type: file }`), which take one file reference per file.\n\n### Infrastructure & processing\n\n- Pushes and fetches of workflow source that are in progress during a platform update now finish instead of being cut off.\n\n---\n\n## 0.20.38 (2026-10-09)\n\n- Internal improvements.\n\n---\n\n## 0.20.37 (2026-10-09)\n\n### Platform (Studio)\n\n- Error reports sent from the browser now scrub tokens, secrets and sensitive URL parts before they leave the page, the same way server error reports already did.\n- Runs started from the CLI keep showing a plain \"CLI\" trigger in run details, without an extra SDK badge, now that the CLI identifies itself on API requests.\n- Grafana dashboard: a new \"Worker slots online\" tile shows how many jobs your workers can run at once, next to \"Workers online\". Slot panels and the worker table now say \"worker slots\" so a worker (one process) is never confused with its job slots.\n\n### CLI\n\n- The CLI now identifies itself on every API request with a `User-Agent: eigenpal-cli/&lt;version&gt; (&lt;runtime&gt;; &lt;os&gt;)` header and the same `X-Eigenpal-Sdk-*` headers the SDKs send, so CLI traffic and errors can be told apart from SDK and browser traffic. Runs started from the CLI record the CLI version in their trigger metadata.\n\n### Infrastructure & processing\n\n- When an AI extraction or vision step returns output that does not match its schema, the run now fails as a schema mismatch in the model output instead of a generic platform error, so failure reports and metrics point at the step's schema or model rather than at the platform.\n\n---\n\n## 0.20.36 (2026-10-09)\n\n- Internal improvements.\n\n---\n\n## 0.20.35 (2026-10-09)\n\n### Platform (Studio)\n\n- Monitoring: the Prometheus metrics endpoint now counts failed runs by cause (`eigenpal_execution_failures_total`), so input problems and deliberate workflow rejections no longer look like platform errors. A run stopped by a workflow's `control.fail` step now reports the `workflow_rejected` failure code.\n\n### Infrastructure & processing\n\n- Monitoring: the Prometheus metrics endpoint now counts failed runs by cause (`eigenpal_execution_failures_total`), so input problems and deliberate workflow rejections no longer look like platform errors. A run stopped by a workflow's `control.fail` step now reports the `workflow_rejected` failure code.\n\n---\n\n## 0.20.34 (2026-10-08)\n\n### Platform (Studio)\n\n- Monitoring: the Prometheus metrics endpoint now reports registered organizations and users, organizations active in the last 7 and 30 days, and paying organizations, so operators can follow adoption next to processing health.\n\n---\n\n## 0.20.33 (2026-10-08)\n\n### Platform (Studio)\n\n- Monitoring: our team now tracks run volume, outcomes and timing across EigenPal Cloud in real time, so slowdowns and failures are spotted and fixed sooner.\n\n---\n\n## 0.20.32 (2026-10-08)\n\n### Platform (Studio)\n\n- Billing: our team is now notified as soon as a payment, renewal, failed payment, refund or dispute happens, so billing problems on your account get followed up faster.\n\n---\n\n## 0.20.31 (2026-10-08)\n\n### Platform (Studio)\n\n- Monitoring: the Webhooks section of the EigenPal Grafana dashboard now shows events delivered alongside events not delivered, with a donut of delivery outcomes for the selected range and a per-minute chart of delivered versus not delivered.\n- Summary research now saves valid claims together while identifying only those needing correction. Clearer review guidance and more reliable document access reduce repeated failed attempts before completing financial chapters.\n- Public research claim details now show the full sentence, acceptance status and supporting evidence, including earlier claims that were subsequently revised.\n- Webhooks: endpoints can now be shared like workflows. A Manager of an endpoint (and any owner or admin) shares it with people and groups as Viewer, Editor or Manager, and members can create their own endpoints. An endpoint receives either every run (owners and admins only) or runs of selected workflows, and nobody can point one at runs of a workflow they cannot open. Existing endpoints stay private to owners and admins.\n\n---\n\n## 0.20.30 (2026-10-08)\n\n### Platform (Studio)\n\n- Fixed run cancellation and research approvals being rejected behind HTTPS reverse proxies while retaining browser origin checks. Improved public research with relevant source excerpts, a source-checked driver brief, and an independent editing pass. Chapter agents can investigate material public evidence gaps with human-approved searches and record their research decisions. Source pickers now emphasize filenames with file types underneath.\n\n---\n\n## 0.20.29 (2026-10-08)\n\n### Platform (Studio)\n\n- Settings, File Sources is now a list of named data source connections. **Add data source** opens a side panel where you pick GPFS/GFR, Amazon S3 or Azure Blob Storage, name the connection and fill in its settings, so a deployment can keep, for example, a test and a production registry side by side. Workflow inputs pick a connection by name in the builder, and run forms and API docs show the reference format it expects. Connections defined in the deployment configuration are marked as such and open read-only, with any configuration problems listed. Stored secrets can be removed, and contradictory sign-in settings are refused when saved.\n- Monitoring: the Prometheus metrics endpoint now reports webhook delivery attempts with their outcome and failure reason, events that were never delivered, delivery backlog and the oldest due delivery, and receiver response times. The EigenPal Grafana dashboard has a new \"Webhooks\" section, and the metrics guide includes ready-to-use alert rules for failing receivers, undelivered events and stalled delivery.\n- Webhooks: a new **Delivery settings** panel sets the retry policy, the request timeout and, on self-hosted deployments, whether endpoints may resolve to private network addresses. Settings pinned by the deployment show a lock. Each failed delivery now explains why it failed (for example, blocked private address, TLS handshake failure or connection refused), right in the delivery list, and links to the setting that fixes it. Deliveries waiting to retry show when the next attempt runs, and unsaved endpoint changes collect in a save bar that no longer shifts the page.\n\n### Public API\n\n- Run inputs that fetch a file from a file source connection now accept the reference as two fields as well as one string: `\\{ \"stackId\": \"...\", \"fileId\": \"...\" }` for GPFS/GFR, `\\{ \"bucket\": \"...\", \"key\": \"...\" }` for Amazon S3 and `\\{ \"container\": \"...\", \"blobName\": \"...\" }` for Azure Blob Storage, alongside `stackId/fileId`, `bucket/key` and `container/blobName`. Fields that do not match the connection's type are rejected with a message naming the expected ones.\n\n### CLI\n\n- The bundled webhooks guide and reference now cover delivery settings, the retry schedule, and how to ask for a retry while your receiver is still storing a run.\n- The bundled Prometheus metrics guide now documents webhook delivery metrics and example alert rules.\n\n### Infrastructure & processing\n\n- File source inputs can now fetch documents from Amazon S3 (and S3-compatible storage such as MinIO or Ceph) and from Azure Blob Storage, alongside GPFS/GFR registries. A run passes `stackId/fileId`, `bucket/key` or `container/blobName`; GFR can still take a bare file id, which uses the configured default stack. S3 signs in with an access key or by assuming an AWS role, and Azure with a Microsoft Entra ID service principal or a SAS token. Each connection can be limited to an allow-list of stacks, buckets or containers, and a deployment can have several connections of one type. On-premises deployments can pin file source settings in the Helm chart, where they show as managed and read-only in Settings, File Sources, and can trust an internal certificate authority for outbound connections. All sources honor the standard HTTPS proxy settings. Brief network or storage outages are retried automatically while fetching, while a bad reference, a missing file or denied access fails the run straight away. For existing GFR callers, a file id that contains `/` is now read as `stackId/fileId`.\n- Self-hosted deployments now deliver webhooks to endpoints on the private network by default, matching file sources and telemetry export. Previously these deliveries were refused without sending a request. Loopback, link-local and cloud metadata addresses stay blocked on every deployment, so a webhook can never reach the worker itself or node credentials.\n\n---\n\n## 0.20.28 (2026-10-07)\n\n### Platform (Studio)\n\n- Parse native and scanned documents automatically with the new Parse Document step. It preserves usable native PDF pages, recovers unread content with configured OCR or vision, and reports the source and completeness of each page. Advanced controls let you choose providers, restrict backends, require layout evidence, and tune vision processing. Existing parser steps keep their behavior. New workflows use automatic parsing, and you can review an explicit migration before publishing an updated workflow. The CLI and SDKs also provide a parsing configuration readiness check to help prepare deployments for scanned documents.\n- Preserve workbook-aware XLS/XLSX display formatting, trim empty trailing sheet extent before conversion limits, and expose optional original cell evidence for mixed date/identifier extraction. Forward sheet metadata through workflow execution and document how agents should use source evidence.\n\n### Public API\n\n- Inspect configured document-reading capabilities and provider selection through the authenticated parsing readiness endpoint. The response reports native/OCR/vision configuration and does not claim live endpoint verification.\n\n### CLI\n\n- Review document-parser migrations before publishing them with the new parser migration command. Updated workflow templates and agent guidance use automatic parsing by default. Inspect parsing configuration readiness through the CLI and SDKs to check whether your deployment has providers for scanned documents.\n\n### SDK\n\n- Review document-parser migrations before publishing them with the new parser migration command. Updated workflow templates and agent guidance use automatic parsing by default. Inspect parsing configuration readiness through the CLI and SDKs to check whether your deployment has providers for scanned documents.\n\n---\n\n## 0.20.27 (2026-10-07)\n\n### Platform (Studio)\n\n- Restore the PDF embedding, employment verification, Hacker News digest, and slow pipeline templates in the workflow template picker.\n- Financial summaries now investigate the drivers behind material changes across reporting periods. Other chapters wait for completed financial analysis and use it as additional context; incomplete financial chapters can be retried before the rest of the summary proceeds.\n- Monitoring: the Prometheus metrics endpoint now reports LLM token usage and finished runs for each workflow and agent, and the EigenPal Grafana dashboard has a new \"Usage by workflow\" section showing tokens, share of total, runs, and tokens per run per workflow, plus a chart of the top 10 consumers and a workflow filter.\n- Strengthened document image processing and mathematical expression rendering security.\n- Workflow access control: share workflows and folders with specific people or groups at four levels (Viewer, Runner, Editor, Manager). Access is set on top-level folders, the way a shared drive is run: everything inside a folder has that folder's access, so there is one place to check and change it. Making a folder private limits it to the people and groups you choose. Groups come straight from your identity provider (Keycloak, Entra ID, Okta, or a corporate sign-in service) and stay managed there, or can be created in EigenPal for password users. Each folder says at the top who can open it, with a Manage access button, and right-clicking a folder or workflow offers Manage access too. The access panel shows everyone who can open an item and why, and says who gains or loses access before you save. Moving something into a folder with different access asks first and shows the access before and after. Settings gains an Access control page: check whether a person can open a folder or workflow and see exactly why, see each person's groups and what your identity provider reports for them, and manage groups. A per-person access review sits on each member. Every sharing and group change is recorded in the audit log. Directory changes apply within minutes, and disabling someone at the identity provider signs them out of EigenPal. Admins can make every new top-level folder and workflow start private, and export who can open what as a CSV for access reviews. When an owner or admin opens a private item only their role lets them see, that is recorded too. Run history of a deleted workflow is visible to owners and admins only. Nothing changes for an organization until it makes something private.\n- Faster folder navigation for workflows. A folder tree now sits beside the workflow list: open any folder in one click, keep your place as you move around, and use the arrow keys to browse it. Long folder paths fold their middle into a menu so the path stays readable. Organize by dragging. Drop a workflow or folder onto a folder in the list, in the tree, or in the path above the list to move it there. Folders in the tree open when you hover over them while dragging, so you can move items several levels deep in one go. A preview follows the pointer and names where the item will land, only valid folders light up, and every move can be undone from the confirmation. Top-level folders and workflows show who they are shared with. Hover the avatars to see each person and group with their access level, or click them to manage sharing.\n\n### Public API\n\n- Automations, runs, datasets, experiments, evaluators, versions, folders, files and review endpoints now honor workflow access control. A workflow the caller cannot open answers `404`, exactly like one that does not exist, and is left out of every list. A workflow the caller can open but not change answers `403` for the change. Starting a run needs Runner access. API keys act with the access of the person who created them.\n\n### CLI\n\n- Simplify the bundled Prometheus metrics guide to bearer API key authentication and the metrics reference.\n\n### SDK\n\n- Strengthened Python SDK generation security while preserving Python 3.10 compatibility.\n\n[View full release notes →](/releases/0.20.27)\n\n---\n\n## 0.20.26 (2026-10-06)\n\n### Infrastructure & processing\n\n- Applied security updates to the GPU hosts that run document recognition and to a logging dependency used by the processing services.\n\n---\n\n## 0.20.25 (2026-10-06)\n\n### Platform (Studio)\n\n- Workflow Pal now honors configured authentication and custom headers for private model gateways, matching workflow execution and preventing chat failures on gateways requiring additional credentials.\n\n---\n\n## 0.20.24 (2026-10-06)\n\n### Platform (Studio)\n\n- Workflow and agent Swagger exports now include the run's `execution` object, documenting status and execution details consistently with API responses.\n\n---\n\n## 0.20.23 (2026-10-05)\n\n### Platform (Studio)\n\n- API keys: choose an access level when you create a key. **Full access** works with the API, CLI, and SDKs, as every existing key does. **Observability (read-only)**, available to owners and admins, can only read the Prometheus metrics endpoint, so monitoring systems no longer need a key that can run automations or read your data. On self-hosted deployments the Prometheus endpoint is now on by default and authenticates with an observability key, so monitoring needs no server configuration.\n- Monitoring: the Prometheus metrics endpoint for self-hosted deployments now reports LLM token usage by model, execution throughput and failure counts, execution, queue-wait, step, and LLM call latency histograms, OCR page volume, human-review outcomes, and per-worker process health (memory, CPU, event loop lag, and busy slots) alongside live queue depth. Counters stay accurate across restarts and data retention, a single scrape target covers the whole deployment, and collectors that request OpenMetrics (including Prometheus 3) receive it. Metric names follow Prometheus naming conventions, and the new Prometheus metrics documentation covers every metric. Owners and admins can turn the endpoint off in Settings > Monitoring, which also links to a prefilled form for creating an observability API key.\n\n### Public API\n\n- API keys now have an access level. Every API endpoint requires a **Full access** key, which is what all existing keys have, so existing integrations keep working. An **Observability (read-only)** key is refused with `403` by every endpoint except `GET /v1/auth/check`, which reports the key's own identity and scopes so you can verify a key before using it.\n\n---\n\n## 0.20.22 (2026-10-05)\n\n### Platform (Studio)\n\n- Workflow validation now accepts dynamic child-workflow targets with a runtime-check warning, explains why dynamic inline targets are unsupported, and rejects review selectors that a known schema proves cannot select a scalar field.\n- Downloaded API specs for a single workflow or agent now report that automation's own version instead of the platform release number, so upgrading Studio no longer looks like an API change to generated clients. The platform release is still included in the spec as `x-eigenpal-platform-version`. Self-hosted installs behind a proxy or OpenShift route also get the correct public server URL in the spec, and the spec no longer lists an unreachable server address when the public hostname cannot be determined.\n- Studio picks up the latest security fixes in its web framework.\n\n### Public API\n\n- Run input failures now report specific causes and include the input location and run correlation ID in debug diagnostics, without exposing document contents or storage paths.\n\n### CLI\n\n- Evaluation summaries now distinguish execution success from evaluator verdicts. Existing success-count fields remain available, and online validation warnings no longer cause a failed validation exit.\n\n### Infrastructure & processing\n\n- Child workflows now start only after their input files are available, improving reliability when forwarding files nested inside other inputs. File preparation failures now identify missing files and invalid references more clearly.\n\n---\n\n## 0.20.21 (2026-10-02)\n\n### Platform (Studio)\n\n- Assign dynamic tags to child workflow runs, filter run history by an exact tag, and open matching runs from their tag labels. Retries and reruns retain the original tags. Set tags on the Trigger page and generate tagged REST and SDK examples on Connect.\n\n### Public API\n\n- Workflow and agent run requests accept `tags` as a string or a list of strings. Run responses include tags, and `GET /api/v1/runs?tag=...` finds runs with an exact, case-sensitive tag.\n\n### CLI\n\n- Use `eigenpal runs list --tag &lt;tag&gt;` to find runs with an exact tag, such as a request ID. Start an ad-hoc workflow or agent run with `eigenpal run &lt;target&gt; --tag &lt;tag&gt;`. Repeat `--tag` for multiple tags.\n\n### SDK\n\n- Pass execution tags when starting workflow or agent runs with the TypeScript and Python SDKs, including runs with file inputs. Filter run history by tag using the runs client.\n\n---\n\n## 0.20.20 (2026-10-02)\n\n### Platform (Studio)\n\n- Summary builder: invalid claim registration input now shows a clear error instead of a misleading claim count.\n- Settings: each settings page now shows a loading placeholder shaped like the page itself, instead of a generic one that repeated the settings navigation and title.\n\n### Infrastructure & processing\n\n- Strengthen security protections for document extraction.\n\n---\n\n## 0.20.19 (2026-10-01)\n\n### Platform (Studio)\n\n- The Agents page and agent detail views load faster, especially for organizations with many agents. Opening one agent now reads only that agent instead of the whole organization, and source lookups for one organization no longer slow down other organizations.\n- Dashboard pages respond faster. Every page load and live refresh in EigenPal now does less work before returning data, and pages that hit a permission error show it right away instead of retrying first.\n- Pages and live status updates in EigenPal Studio respond faster, because signed-in requests no longer wait on an account profile lookup every time. A change to your account email still takes effect within a minute, and invitations are always matched against your current verified addresses.\n- Hardened sign-in account linking: signing in with an email address no longer connects you to an existing EigenPal account that belongs to a different sign-in. If your previous sign-in account was deleted, signing up again with the same email still restores access to your existing account.\n- The Workflows and Runs pages load faster, especially in organizations with many workflows or a long run history. The Workflows page now fetches only what its cards and rows show, folder previews load alongside the folder list, and the Runs page stops refreshing in the background while its tab is hidden, then catches up as soon as you return. The \"Triggered by\" filter on the Runs page now lists people who started runs in the last 90 days unless you pick a date range.\n\n### Public API\n\n- `GET /api/v1/agents` responds faster, including single-agent lookups with `?slug=`. The new optional `includeExampleCount=false` query parameter omits `stats.exampleCount` for callers that do not need it.\n- `GET /api/v1/runs` and `GET /api/v1/runs/:id` respond faster when runs belong to large workflows. Responses are unchanged.\n- Rate limits for requests made from a signed-in EigenPal dashboard session now count reads separately from writes, so browsing and live-refreshing pages no longer use up the allowance for starting runs. File downloads, artifact archives, traces, dataset and experiment exports, session transcripts, and run event streams still count toward the shared allowance. Limits for API key requests, including those from the CLI and SDKs, are unchanged.\n- When a signed-in session cannot be connected to an existing EigenPal account, API requests now return `403` with a message explaining how to get help, instead of a generic authentication or server error.\n\n---\n\n## 0.20.18 (2026-10-01)\n\n### Platform (Studio)\n\n- Downloaded API specs for a single workflow or agent now report that automation's own version instead of the platform release number, so upgrading Studio no longer looks like an API change to generated clients. The platform release is still included in the spec as `x-eigenpal-platform-version`. Self-hosted installs behind a proxy or OpenShift route also get the correct public server URL in the spec, and the spec no longer lists an unreachable server address when the public hostname cannot be determined.\n- Strengthen security protections for image generation, document previews, and telemetry transport.\n- Studio pages feel faster. Pages without a code editor or PDF preview load less up front, opening a workflow, agent, template, review queue, or developer page now shows a placeholder shaped like that page, and workflow links open the editor directly. On the Evals page, the side panels appear right away, changing the date range keeps the current results visible until the new ones arrive, and the runs list and overview no longer show each other's data. The agent editor keeps its files and instructions on screen while a conversation resumes, and opening a workflow folder link on a later page keeps that page.\n- Run details open faster. Selecting a run shows its name, status, and actions right away, and each section fills in on its own as it loads instead of the whole pane waiting on a skeleton. Inputs, outputs, and the step trace load side by side, long traces load their pages in parallel, and sections no longer go blank for a moment when a run finishes. Switching between the timeline and the raw trace reuses what is already loaded. Workflows, runs, and agents also start loading their details when you hover over or focus them in a list, so opening one feels quicker.\n- Pages load faster after signing in and when opening a link directly. Your organization is ready as soon as the page appears, so lists, agents, and run details start loading right away instead of waiting a moment first.\n- Usage: a new \"LLM usage by workflow\" table shows the tokens each workflow and agent consumed in the selected range, with run count, average tokens per run, cached input, and share of total, so teams can see which automations drive their LLM spend.\n\n---\n\n## 0.20.17 (2026-09-30)\n\n- Internal improvements.\n\n---\n\n## 0.20.16 (2026-09-29)\n\n### Platform (Studio)\n\n- Run reviews now preview input files with the same document viewer as dataset reviews. Multi-file runs get one-click previous/next switching with a position indicator, PDFs and images get full zoom controls, and the file picker lives in the viewer header instead of a separate bar. Field-evidence highlights and the approval workflow are unchanged.\n\n---\n\n## 0.20.15 (2026-09-29)\n\n- Internal improvements.\n\n---\n\n## 0.20.14 (2026-09-29)\n\n- Internal improvements.\n\n---\n\n## 0.20.13 (2026-09-29)\n\n### Platform (Studio)\n\n- Dataset reviews in Studio: filter the field queue to flagged-only (document order preserved), return to the Datasets list on close without pre-selecting the last automation, show the requester's note read-only above the reviewer note box, remove the approve-all-fields flow (untouched fields are assumed error-free), and rename user-facing Approve labels to Submit.\n- Apply security updates to sign-in, workflow execution and document processing.\n\n### CLI\n\n- Apply security updates to workflow validation dependencies.\n\n### Infrastructure & processing\n\n- Apply security updates to sign-in, workflow execution and document processing.\n\n---\n\n## 0.20.12 (2026-09-28)\n\n- Internal improvements.\n\n---\n\n## 0.20.11 (2026-09-25)\n\n### CLI\n\n- `eigenpal auth login` now opens the dashboard in your browser without routing the URL through a shell, so an unusual server address can never be interpreted as a command.\n\n---\n\n## 0.20.10 (2026-09-24)\n\n### Platform (Studio)\n\n- Studio model picker: add GPT 6 Sol, GPT 6 Luna, and Claude Opus 5.5 as selectable models for workflow steps and agents. The recommended list now surfaces the new generation; Opus 5 and the 5.6 Sol/Terra/Luna models remain available via search.\n- Dataset review: the fields queue now follows the output in document order. Flagged fields keep their highlight where they appear and removed fields stay in place with their removed styling, instead of being sorted to the top or bottom.\n\n---\n\n## 0.20.9 (2026-09-24)\n\n### Platform (Studio)\n\n- Reviews → Datasets: requesting a review is now fast even for many examples with large files — snapshotting downloads input files in parallel and no longer re-downloads them for the response. Reviews can also be cancelled (a frozen state like closed, reopenable back to open), and Studio lets reviewers close a review with undecided examples still in it: closing locks the review and only decided examples count as submitted.\n\n### Public API\n\n- Reviews → Datasets: requesting a review is now fast even for many examples with large files — snapshotting downloads input files in parallel and no longer re-downloads them for the response. Reviews can also be cancelled (a frozen state like closed, reopenable back to open), and Studio lets reviewers close a review with undecided examples still in it: closing locks the review and only decided examples count as submitted.\n\n### CLI\n\n- Reviews → Datasets: dataset review requests gain a `cancelled` lifecycle status. The CLI accepts `update --status cancelled` (and shows it in `list --status` filters), and the TypeScript/Python SDK status enums include the new value.\n\n### SDK\n\n- Reviews → Datasets: dataset review requests gain a `cancelled` lifecycle status. The CLI accepts `update --status cancelled` (and shows it in `list --status` filters), and the TypeScript/Python SDK status enums include the new value.\n\n---\n\n## 0.20.8 (2026-09-24)\n\n- Internal improvements.\n\n---\n\n## 0.20.7 (2026-09-24)\n\n### Platform (Studio)\n\n- Members: on self-hosted deployments with password sign-in, owners and admins can reset a member's password from Settings → Members. The admin sets a temporary password, the member is signed out on every device, and the next time they sign in they have to choose a new password before they can use the app.\n\n---\n\n## 0.20.6 (2026-09-24)\n\n### Platform (Studio)\n\n- Dataset review: add missing fields and line items without leaving the review, confirm object and array values, and approve every unreviewed field at once from the queue. Newly added fields now survive saves and refreshes until confirmed.\n- Reviews → Datasets: reviewers can open the dataset review inbox without workflow access. Studio loads the queue from `GET /api/v1/dataset-review-requests` (gated by `dataset_review:read`) instead of listing automations first, so reviewers see their requests rather than a permission error.\n\n### Public API\n\n- Reviews → Datasets: reviewers can open the dataset review inbox without workflow access. Studio loads the queue from `GET /api/v1/dataset-review-requests` (gated by `dataset_review:read`) instead of listing automations first, so reviewers see their requests rather than a permission error.\n\n### SDK\n\n- Reviews → Datasets: the TypeScript and Python SDKs expose the tenant-wide dataset review inbox as `client.datasetReviewRequests.list()` / `client.dataset_review_requests.list()`, with the same status filter and pagination as the Studio queue.\n\n### Infrastructure & processing\n\n- Document OCR stays up under rapid bursts of complex pages. The GPU inference server now uses smaller recognition batches and leaner memory allocation, so back-to-back multi-region documents no longer risk an out-of-memory restart — and the one-minute engine-failure alert from the last release still watches for any recurrence.\n\n---\n\n## 0.20.5 (2026-09-23)\n\n### Platform (Studio)\n\n- Dataset review now walks you to the finish: deciding an example advances to the next pending one and opens a completion sheet when nothing remains. The header shows an `n/m reviewed` pill that opens the same sheet, with Approved / Removed / Corrected counts, a Close review button (disabled until every example is decided), and the pull command for handing snapshots to an agent. The Resolve button stays green for pending, edited, and approved examples — only removed stays red.\n- Dataset review: text, spreadsheet, and other non-PDF input files now show the same header as PDFs and images, so reviewers can switch back to the other inputs from every file type.\n- Dataset review: clicking a field now reveals it in the Output JSON tree even when it sits inside a collapsed list item, scrolling it into view with its highlight.\n\n### Public API\n\n- Dataset review item decisions now use `removed` instead of `rejected` across progress counts, field/file decisions, and update actions. Callers that previously sent `action: \"reject\"` or `decision: \"rejected\"` should switch to `remove` / `removed`.\n\n### CLI\n\n- `eigenpal auth status` (alias `whoami`) shows the active profile, server URL, and whether the credential validates, with `--json` support for scripting.\n- `--json` output is now safe to pipe: status chatter stays off stderr so `2>&1 | jq` parses, and re-pushing identical YAML with `workflow push --file X --json` reports `\\{ unchanged: true }` instead of an error.\n- `eigenpal reviews` dataset-review actions and decisions now use `remove` / `removed` instead of `reject` / `rejected`, matching the public API rename.\n\n### SDK\n\n- Dataset review SDK types and helpers now expose `removed` instead of `rejected` for item status, progress, field/file decisions, and update actions.\n\n---\n\n## 0.20.4 (2026-09-23)\n\n- Internal improvements.\n\n---\n\n## 0.20.3 (2026-09-23)\n\n### Platform (Studio)\n\n- Expected-output files now review the same way fields do, on the right side of the dataset review panel: preview or edit text, Office, and spreadsheet files in place, upload corrected or brand-new versions, and record per-file approvals with notes. The review queue header lives in the breadcrumb bar with a status filter, so finished requests stay findable.\n\n### Public API\n\n- Dataset review items now cover expected-output files, not just fields: record per-file approve/reject decisions with notes, upload corrected bytes for an existing file or a brand-new one (50MB cap), and download the reviewer-corrected version with `kind=expected` on the item file endpoint. Closing a finished review still never auto-applies — reconcile corrected files into the live dataset by hand.\n- Dataset review file actions now accept the `expected/`-prefixed file path form (for example `expected/report/report.docx`) wherever a per-file decision or correction is recorded. It resolves to the same manifest-relative entry reviewers see, so paths copied from `$file` references in `expected.json` no longer fail with `unknown expected file`.\n\n### CLI\n\n- Expected-output files are first-class reviewable units: `pull --out &lt;dir&gt;` downloads per-example expected files (reviewer-corrected when the item has an overlay entry, else the snapshot) alongside `item.json`; `item --action edit-file` uploads corrected bytes (`--file-path` fixes an existing file, `--new-path` uploads a brand-new one, 50MB cap); `item --action file-decision` records per-file approve/reject with notes (`--comment` alone is a note and needs an existing decision); `get`/`items` show per-file decision summaries. Reconcile corrected files into the live dataset by hand — reviewers can err.\n\n### SDK\n\n- Expected-output files are covered too: items carry `currentExpectedFiles` (null means pristine snapshot) and `fileDecisions`; `getItemFile` / `get_item_file` accept `kind: 'expected'` to download reviewer-corrected bytes (default stays `input`); `recordItemFileDecision` / `record_item_file_decision` records per-file approve/reject or notes (`decision: null` clears); `editItemFile` / `edit_item_file` uploads corrected bytes for an existing path or a brand-new upload (50MB cap).\n\n---\n\n## 0.20.2 (2026-09-23)\n\n### Infrastructure & processing\n\n- Document OCR is now more resilient under heavy load. Back-to-back parsing bursts no longer risk taking the whole OCR fleet offline at once — jobs queue briefly and resume automatically — and monitoring catches GPU inference failures within a minute instead of several.\n\n---\n\n## 0.20.1 (2026-09-23)\n\n### Platform (Studio)\n\n- Credit limits now apply consistently across the product. Agent runs, the workflow builder assistant, and the expression generator are checked against your remaining balance before they start, and the assistant and expression generator now record their usage on your usage page instead of being invisible. A cancelled agent run is billed for the work it actually completed rather than dropping off your usage entirely. Organization creation is capped per account, both by how many you own at once and by how many you create over a rolling window, so one account cannot spin up unlimited free trials. A very long builder conversation is now refused with a message asking you to start a new chat, rather than being sent to the model in full. Deleting an organization now removes its stored files before the organization itself disappears. A large organization can take more than one pass, and the dialog now says accurately what happens: files are removed immediately and clear backups within 7 days.\n\n### Public API\n\n- Starting a run now returns `402 insufficient_credits` when your organization has spent its credit allowance. The check happens before the request body is read, so no files are uploaded and no work begins on a run that cannot be paid for. File uploads return the same status for the same reason, and both are now described in the API reference. The API reference also documents `503`, which endpoints return when request accounting is briefly unavailable. It means the request was not processed and is safe to retry; it is not a rate-limit rejection.\n\n---\n\n## 0.20.0 (2026-09-22)\n\n### Platform (Studio)\n\n- Datasets can now be sent for client review without exporting files. Create a review request from a dataset, highlight the fields that need attention, mark others as not required, and invite client teammates with the new reviewer role. They walk examples from a dropdown, inspect the fields, leave notes, record per-field decisions, and approve or reject each row. Closing a finished review does not auto-apply changes — reconcile expected outputs manually. The Reviews queue keeps finished requests visible with a status filter so old approvals stay findable. Reviewers see the same Studio shell with permission-aware empty states.\n\n### Public API\n\n- New dataset review endpoints under `/api/v1/automations/:id/dataset-review-requests`: create a review from dataset examples with reviewer `instructions`, `focusFields` (paths plus optional reasons), `ignoredFields` for paths reviewers can skip, and optional `itemNotes`. Approve, edit, reject, reopen, comment, or record a `field-decision` on each example (including clearing a decision with `decision: null`), then poll `progress.complete` and close the request with `PATCH` status. Dataset reconciliation stays manual — nothing is deleted by reject. A new `reviewer` organization role can read review queues and submit item decisions but cannot edit workflows.\n\n### CLI\n\n- `eigenpal workflow dataset review-request` (and the `eigenpal agents dataset` mirror) is the agent-friendly review loop: create a request with reviewer instructions, `--focus` / `--focus-reason` paths, `--ignore` paths reviewers can skip, and per-example `--item-note` / `--field-note` comments; `list`/`get`/`events` expose `progress.complete`, `fieldDecisions`, and `inputDrifted`; `item --action` records approve/reject/comment/edit plus per-field `field-decision` (clear with `--clear` / `--decision null`); `update --status closed` finishes the request. There is no auto-apply — pull and reconcile examples manually. Reject is recommendation-only; nothing is deleted.\n\n### SDK\n\n- `client.automations.datasetReviewRequests` (`dataset_review_requests` in Python) covers the full dataset review lifecycle: list and get with `progress`, `focusFields`, `ignoredFields`, `fieldDecisions`, and `inputDrifted`; create with reviewer instructions and per-field notes; update request metadata or close with status; update items including `field-decision` (pass `decision: null` to clear); and the per-user activity trail. Dataset write-back stays manual — there is no lock endpoint.\n\n### Infrastructure & processing\n\n- Replace the eagerly constructed `eigenpalAjv` singleton with a lazy `getEigenpalAjv()` accessor. Ajv compiles schemas with `new Function`, which the Studio Content-Security-Policy forbids — constructing at import time crashed every page whose client bundle transitively imported `@eigenpal/types` validation (including all review surfaces, which never validate client-side). Server-side call sites are unchanged apart from the accessor.\n\n---\n\n## 0.19.1 (2026-09-21)\n\n- Internal improvements.\n\n---\n\n## 0.19.0 (2026-09-21)\n\n### Platform (Studio)\n\n- Agent builder sessions can now be given storage credentials limited to their own session folder instead of the whole storage account. Set a Cloudflare account id and API token, or an AWS role, and each training sandbox receives a short-lived key that can only read and write its own files. Deployments that do not configure this keep working exactly as before and log a warning, and a new setting makes the platform refuse to start a sandbox unless scoped credentials are available.\n- Studio security hardening. Parsed document text shown in run traces and grounding views is now sanitized before rendering, so a crafted document can no longer inject active content into the page. Observability settings now require administrator access to view, and the values of any authorization headers you configure are masked once saved, so they are never sent back to the browser. Saving a renamed header now asks you to retype its value instead of quietly clearing the configuration. Outbound observability destinations are validated to reject internal and unencrypted endpoints on hosted plans. Editor assets are now served from Eigenpal's own domain instead of a public content network. Self-hosted deployments that use password sign-in no longer accept open self-registration. Creating the first account still works, and anyone holding an invitation can still create their account, but an uninvited visitor can no longer join an existing workspace. Set `EIGENPAL_ALLOW_OPEN_SIGNUP=true` to restore the previous behavior. Agent training and email trigger surfaces are now scoped more tightly. Email alias changes are accepted only through the agent that owns the alias, so editing or revoking one from a different agent's page now reports not found. Opening a training session that belongs to a different workspace or a different agent is refused instead of returning a server error. Each agent workspace now runs with credentials valid only for its own session, so a workspace can no longer act on any session but its own. Sign-in and account safety. Changing your password now signs out your other sessions, so a password change ends access from a device you no longer control. Accepting an invitation now requires the invitation link itself rather than just the invited address, so knowing that someone was invited is no longer enough to create an account in their name. Requests that arrive from another site are refused, which closes cross-site request forgery against pages you are signed in to. Set `EIGENPAL_TRUSTED_ORIGINS` if you serve Eigenpal on more than one hostname.\n\n### Public API\n\n- Agent endpoints that accept an agent id now resolve it strictly within the calling organization. Requesting an id belonging to another organization returns not found instead of reading or modifying it. Run and step endpoints apply the same organization check to execution ids. Uploads that omit a declared length are now measured while they stream and return 413 once they exceed the request limit, rather than being read into memory first. Operator source tokens are accepted only on the source and authentication check endpoints they are documented for. Webhook endpoints are now checked when you save them, not only when a delivery is attempted. A destination the platform cannot deliver to is rejected with a validation error at creation and update time, instead of being accepted and then failing silently on every send. Self-hosted deployments that deliver to their own internal network are unaffected. Every endpoint that starts a new run now honours the automation's trigger settings, the same way `POST /api/v1/runs` already did. That covers rerunning a run, starting an experiment, and running a single dataset example, including their streaming variants. An API key calling one of these on an automation whose API trigger is turned off now receives `403 api_trigger_disabled`, and a dashboard session calling one on an API-only automation receives `403 manual_trigger_disabled`. If an existing integration starts returning 403, turn the API trigger back on for that automation.\n- Self-hosted Prometheus scrapes now require the dedicated scrape token in every deployment. An organization API key is no longer enough to read the cluster snapshot. A deployment without `EIGENPAL_METRICS_SCRAPE_TOKEN` returns 404 on the metrics route, so set the token before upgrading if you scrape today with an API key. The headless workflow server no longer serves a network address without an API token. If you set `HOST` yourself, the server now exits at startup unless you also set `HEADLESS_API_TOKEN` or `HEADLESS_ALLOW_UNAUTHENTICATED_BIND=1`. If you never set `HOST`, the bind address changes from `0.0.0.0` to `127.0.0.1`, which inside a container means a published port stops accepting connections while the container still reports healthy. Either set `HEADLESS_API_TOKEN` (16 characters or more) together with `HOST=0.0.0.0`, or set `HEADLESS_ALLOW_UNAUTHENTICATED_BIND=1` to keep the previous behaviour. Members can no longer pull decrypted agent environment secrets. Use an owner or admin key, or decrypt a secret for a specific run.\n\n### Infrastructure & processing\n\n- Self-hosted Prometheus scrapes now require the dedicated scrape token in every deployment. An organization API key is no longer enough to read the cluster snapshot. A deployment without `EIGENPAL_METRICS_SCRAPE_TOKEN` returns 404 on the metrics route, so set the token before upgrading if you scrape today with an API key. The headless workflow server no longer serves a network address without an API token. If you set `HOST` yourself, the server now exits at startup unless you also set `HEADLESS_API_TOKEN` or `HEADLESS_ALLOW_UNAUTHENTICATED_BIND=1`. If you never set `HOST`, the bind address changes from `0.0.0.0` to `127.0.0.1`, which inside a container means a published port stops accepting connections while the container still reports healthy. Either set `HEADLESS_API_TOKEN` (16 characters or more) together with `HOST=0.0.0.0`, or set `HEADLESS_ALLOW_UNAUTHENTICATED_BIND=1` to keep the previous behaviour. Members can no longer pull decrypted agent environment secrets. Use an owner or admin key, or decrypt a secret for a specific run.\n- Document and archive processing is more resilient to malformed or hostile input. Dataset archive imports now apply a limit on entry count and hold far less memory while expanding, so a small archive can no longer exhaust a request. Office documents are checked against their real expanded size rather than the size recorded inside the file, which blocks highly compressed payloads that previously passed inspection. PDF page rendering moved to a newer engine that removes a document driven code execution path. Script transform steps have a shorter maximum run time that is now capped relative to worker health checks, so a long running script cannot stall other work. With stock settings the ceiling drops from 30 seconds to 15 seconds; self-hosted deployments that need more can raise `HEALTH_LIVENESS_STALE_MS`, since the ceiling is half that value. Workflow processing is more resilient to hostile input. Template rendering now has time and memory ceilings, so a crafted template can no longer stall a worker and delay other runs. Deep merges in the combine transform can no longer be steered into altering shared state. External file sources reject addresses that are not plain HTTP endpoints.\n\n---\n\n## 0.18.0 (2026-09-21)\n\n### Platform (Studio)\n\n- Workflows can crop normalized regions from PDFs and images into JPEG artifacts with the new `transform.crop-regions` step — pair it with parse output and script steps to build figure or layout evidence pipelines without a figure-specific step type. Turn on optional **`cache: true`** on **`ai.parse`** to reuse prior parse output for the same file bytes and parse settings across runs (stored in tenant blob storage; no expiry yet).\n\n---\n\n## 0.17.5 (2026-09-21)\n\n### Platform (Studio)\n\n- Summary Agent: spreadsheet uploads now use a hardened parser that prevents crafted workbook content from causing excessive processing or modifying object prototypes.\n\n### CLI\n\n- CLI skill reference documents the new `ai.figure-crops` workflow step for cropping and captioning figures from parsed PDFs.\n\n### SDK\n\n- Python SDK: installs now require `anyio` 4.14.2 or newer. Earlier versions encoded host names with IDNA 2003 when opening a TLS connection, so a crafted host name could be matched against the wrong certificate. The TypeScript SDK is unaffected.\n\n---\n\n## 0.17.4 (2026-09-18)\n\n### Platform (Studio)\n\n- Strengthen organization access controls so role permissions, API-key scopes, and member removal apply consistently across Studio and the API. Webhook configuration and signing secrets are restricted to organization owners and admins. Service credentials cannot exceed member permissions, while members retain file and review editing through the API.\n- Organization owners can invite new users directly as owners. Owner invitations can only be created and managed by existing owners.\n\n### Public API\n\n- Strengthen organization access controls so role permissions, API-key scopes, and member removal apply consistently across Studio and the API. Webhook configuration and signing secrets are restricted to organization owners and admins. Service credentials cannot exceed member permissions, while members retain file and review editing through the API.\n\n### Infrastructure & processing\n\n- Cloud workflow HTTP and website-reader actions now restrict requests to public HTTP/S destinations, verify TLS for HTTPS requests, and reject HTTPS-to-HTTP redirects. Responses are limited to 20 MiB and requests to 120 seconds. Single-tenant installations retain private-network integration support.\n\n---\n\n## 0.17.3 (2026-09-18)\n\n### Public API\n\n- Large PDF parses are now more reliable under parallel load. The OCR service paces concurrent pages per document so multi-page jobs no longer exhaust inference memory and retry, which previously stalled big documents behind repeated restarts.\n\n---\n\n## 0.17.2 (2026-09-17)\n\n### Platform (Studio)\n\n- Settings gains a Data retention section for workspace admins: see how much file storage past and present runs consume, choose how long eval and other runs are kept, preview what falls past the horizon, and delete those runs in capped passes until clear. Runs that are still active are always kept. Enforcement offers two modes: purge input files only (run history and outputs stay, freeing the bulky source documents while keeping the audit trail) or delete full runs. Storage usage splits run inputs from outputs so admins can see what input-only cleanup would free.\n\n### Public API\n\n- Rerunning a run whose input files were removed by data retention now returns a clear `409 inputs-purged` error instead of failing while copying the missing files. Run history and outputs remain available.\n\n---\n\n## 0.17.1 (2026-09-15)\n\n- Internal improvements.\n\n---\n\n## 0.17.0 (2026-09-15)\n\n### Platform (Studio)\n\n- Studio can connect to a live agent inference session even when that session runs in a local sandbox instead of the hosted cloud environment.\n\n### Infrastructure & processing\n\n- Agent inference can now run in a local container sandbox, so on-prem and air-gapped deployments no longer need a cloud sandbox provider.\n- Agent runs can now execute in customer-hosted sandbox environments instead of only the Eigenpal cloud, and local Docker sandboxes connect reliably on plain localhost setups.\n\n---\n\n## 0.16.13 (2026-09-14)\n\n- Internal improvements.\n\n---\n\n## 0.16.12 (2026-09-14)\n\n### Platform (Studio)\n\n- Studio can import large dataset ZIP archives without taking the app down, including archives whose paths use Windows-style backslashes. Opening a long-running workflow no longer pulls every step’s full input and output at once. Run pages stay available, still show the steps timeline when phase data is missing, and keep the last loaded view if a refresh fails — with a retry control instead of a blank error page.\n\n### Public API\n\n- `GET /api/v1/runs/\\{id}?expand=execution` and `GET /api/v1/runs/\\{id}/steps` now return slim step rows (identity, status, timing, and a capped error excerpt) instead of inlining every step’s input and output. Inspect one step’s full payloads with the new `GET /api/v1/runs/\\{id}/steps/\\{stepExecutionId}` endpoint.\n\n### CLI\n\n- `eigenpal runs get` lists slim step rows by default. Pass `--include input,output` or `--step` to fetch full payloads for the steps you care about.\n\n### SDK\n\n- The TypeScript and Python SDKs now include `GET /api/v1/runs/\\{id}/steps/\\{stepExecutionId}` so you can load one step’s full input and output after listing slim run steps.\n\n---\n\n## 0.16.11 (2026-09-11)\n\n### Platform (Studio)\n\n- Studio: organization switching and other labeled menus now open reliably without a client-side error.\n\n---\n\n## 0.16.10 (2026-09-10)\n\n### Infrastructure & processing\n\n- OCR processing now distinguishes temporary host availability issues from true processing timeouts, keeps redundant production capacity warm, and pages only when unfinished work is affected. Short self-healing interruptions remain visible for diagnosis without generating misleading recovery alerts.\n\n---\n\n## 0.16.9 (2026-09-10)\n\n### Platform (Studio)\n\n- Harden web image handling, document image processing, and email delivery against crafted inputs that could cause remote code execution, excessive resource use, or recipient-validation bypasses.\n\n### Infrastructure & processing\n\n- Harden web image handling, document image processing, and email delivery against crafted inputs that could cause remote code execution, excessive resource use, or recipient-validation bypasses.\n\n---\n\n## 0.16.8 (2026-09-10)\n\n### Platform (Studio)\n\n- Files are easier to recognize throughout Studio with refreshed Office logos, dedicated PDF, archive, text, JSON, and code treatments, plus image thumbnails. File inputs now use a clearer rounded drag-and-drop experience with consistent selected-file previews.\n\n---\n\n## 0.16.7 (2026-09-10)\n\n### Platform (Studio)\n\n- File uploads now infer supported document media types from the filename when clients provide an empty or generic content type, allowing original Outlook messages and macro-enabled workbooks to upload without conversion.\n\n### Public API\n\n- File uploads now infer supported document media types from the filename when clients provide an empty or generic content type, allowing original Outlook messages and macro-enabled workbooks to upload without conversion.\n\n### CLI\n\n- The CLI now uploads macro-enabled Excel workbooks with the correct media type, so original `.xlsm` workflow inputs work without manual conversion.\n\n### SDK\n\n- TypeScript SDK file helpers now infer the correct media types for `.xlsm` workbooks and `.msg` Outlook messages.\n\n### Infrastructure & processing\n\n- Document parsing now reads Excel, legacy Excel, and macro-enabled workbooks directly, preserving every non-empty sheet and its cell evidence without executing formulas or macros. Large single-page extractions are also split into bounded AI context windows instead of failing at the model limit.\n\n---\n\n## 0.16.6 (2026-09-09)\n\n### Infrastructure & processing\n\n- Template processing now enforces memory limits when joining large collections, preventing crafted templates from exhausting worker memory.\n\n---\n\n## 0.16.5 (2026-09-08)\n\n### Platform (Studio)\n\n- Human review is now available in production, including workflow authoring and review queues.\n\n### Public API\n\n- Human review API endpoints are now available in every production organization for listing tasks, confirming fields, and completing reviews.\n\n### Infrastructure & processing\n\n- Workflow and agent runs can now request human review in every production organization.\n\n---\n\n## 0.16.4 (2026-09-08)\n\n### Platform (Studio)\n\n- Studio adds List Archive and Extract Archive File steps for ZIP workflow inputs. Enumerate archive contents, wire `\\{\\{ item.path }}` through foreach, and pass extracted files straight into Parse, Vision, or Search Files without leaving the builder.\n- Studio now finishes multi-GB file uploads with resumable multipart transfers, retrying individual parts without restarting the whole file.\n- Studio workflows now include Search Files: ask a question about a ZIP archive and get a cited answer plus the files the step inspected. Scope the search to a folder inside the archive and use the same model and reasoning controls as other AI steps.\n\n### Public API\n\n- Upload ZIP archives as reusable workflow inputs through the Files API. Archives can be much larger than single documents, so teams can pass bundled evidence, exports, or multi-file drops into the same runs that already accept PDFs and Office files.\n- File uploads can now negotiate a resumable multipart session for multi-GB objects, with on-demand part URLs, authoritative resume listing, and safe completion that never overwrites a finished file.\n- Starting a run from a reusable file id now keeps a private run-owned reference to the original bytes instead of duplicating large uploads. Deleting the reusable file leaves past runs readable until those runs themselves are deleted.\n\n### CLI\n\n- Dataset import and export now keep a single `/api/v1` prefix when the CLI base URL already includes `/api/v1`, so those commands reach the dataset API instead of a doubled `/v1/v1` path.\n- The CLI now uploads large run files with resumable, storage-direct transfers, so multi-GB inputs stream from disk instead of loading into memory or a single request.\n- The CLI now recognizes `.zip` files when uploading reusable workflow inputs, so archive uploads get the correct content type without extra flags.\n\n### SDK\n\n[View full release notes →](/releases/0.16.4)\n\n---\n\n## 0.16.3 (2026-09-08)\n\n### Platform (Studio)\n\n- Human review: open pending reviews directly from run details and confirm unchanged fields inline from the field list.\n\n### Public API\n\n- Human review field confirmations now preserve valid JSON `null` values and return clear validation errors when a reviewed value does not match its schema.\n\n---\n\n## 0.16.2 (2026-09-08)\n\n### Platform (Studio)\n\n- Human review: pause workflows and agents only when selected fields need attention, inspect source files beside structured output with spatial citation highlights when lineage is available, correct and confirm values, then approve the same run to continue. Confidence thresholds, explicit field selection, required-field progress, rejection, and cancellation keep exception review focused instead of forcing teams to recheck every field.\n\n### Public API\n\n- Human review APIs now list pending tasks, return review data and source-file references, persist field corrections and confirmations, and approve or reject paused runs with optimistic concurrency protection. Task detail may also include resolved lineage and parsed-document context when an upstream grounded extract produced sidecars.\n\n### CLI\n\n- Workflow authoring now includes human-review guidance and ready-to-use templates for confidence-based exception review and explicit approval of critical fields.\n\n### SDK\n\n- TypeScript and Python SDKs now expose human-review resources for listing and retrieving tasks, confirming corrected fields, downloading attached source files, and approving or rejecting paused runs.\n\n### Infrastructure & processing\n\n- Grounded extraction now runs the same shared algorithm locally when a parse step supplies a valid structured document and your provider supports strict structured output. Step JSON stays schema-shaped with `_grounding` metadata; lineage and the parsed document graph are stored as optional sidecars for review and audit, not mixed into workflow output. Text-only inputs and unsupported providers continue to use the existing text grounding path with clear degraded markers when the shared path is unavailable.\n\n---\n\n## 0.16.1 (2026-09-07)\n\n### Platform (Studio)\n\n- GPT-6 Astra is available across workflows, agents, evaluations, and vision tasks, with configurable reasoning and current token pricing.\n- Self-hosted PaddleOCR models now appear with clear provider identity in Studio model selectors and settings.\n- Archive imports now reject malformed ZIP64 data safely instead of risking an unbounded processing loop.\n\n### CLI\n\n- CLI archive handling now rejects malformed ZIP64 data safely instead of risking an unbounded processing loop.\n\n### Infrastructure & processing\n\n- GPT-6 Astra is available across workflows, agents, evaluations, and vision tasks, with configurable reasoning and current token pricing.\n- Self-hosted deployments can connect directly to PaddleOCR-VL for high-quality document parsing, with bounded concurrency and long-running PDF support built in.\n\n---\n\n## 0.16.0 (2026-09-07)\n\n### Platform (Studio)\n\n- Agent model pickers are now compact, searchable, grouped by provider, and ordered from the most capable model to the least without changing configured defaults.\n- Send Email is now a first-class workflow action. Add Resend or SMTP servers in Settings → Email servers, then pick a stable `ems_…` server on the step — including generated files from the same run as attachments. Cloud and on-prem share this Settings surface; there is no default server. Secrets stay encrypted, and reads never show credentials. Changing an SMTP host, username, or provider asks you to re-enter the password so a stored secret cannot follow a new destination.\n\n### Public API\n\n- The public API now manages organization email servers at `/v1/email-servers`: list, create, inspect, update, delete, and send a connectivity test. Each server is an `ems_…` resource with a Resend or SMTP transport. Secrets are encrypted and never returned; disabled servers reject tests, and names must be unique among live servers. Updating SMTP to a different host or username requires a new password or explicitly clearing authentication — the previous password is never reused against a new destination.\n\n### CLI\n\n- Manage organization email servers with `eigenpal email-servers`: list and inspect `ems_…` servers, create or update Resend and SMTP providers (including an optional SMTP CA PEM), delete servers, and send a live test message with `--to`. Secrets are read from stdin, a file, or a secure prompt — never from command-line flags.\n\n### SDK\n\n- TypeScript and Python SDKs now manage organization email servers: list, create, inspect, update, delete, and send a connectivity test. Stored credentials are never returned.\n\n### Infrastructure & processing\n\n- Send Email delivers through the organization server selected on the step. There is no fallback: a missing, deleted, or disabled server fails the run. Evaluation runs skip delivery, including workflows invoked from an eval. Cancelling a run aborts an in-flight send. Multi-tenant SMTP servers must resolve to public addresses, while single-tenant deployments can use internal relays. Partial SMTP acceptance reports which recipients were delivered or rejected so operators can avoid duplicate reruns. SMTP may still deliver twice if a worker stops after the relay accepts the message; Resend deduplicates the same step attempt.\n\n---\n\n## 0.15.1 (2026-09-04)\n\n### Infrastructure & processing\n\n- OpenParser OCR capacity now recovers cleanly after failed updates, avoiding unnecessary warm resources while preserving active document processing.\n\n---\n\n## 0.15.0 (2026-09-04)\n\n### Platform (Studio)\n\n- Workflow validation now explains when a catalog model belongs in `provider` instead of the raw `model` override, and reruns preserve clean original filenames in generated outputs and citations.\n- Make document inputs uploaded in Studio datasets available to experiment runs, including examples saved by earlier releases.\n\n### Public API\n\n- Experiment result responses and JSON exports now include evaluator-specific structured details, so clients can identify the exact JSON path, expected value, and actual value behind a failed comparison. CSV exports retain their existing stable columns.\n\n### CLI\n\n- Experiment analysis is now built into the CLI for workflows and agents: summarize pass, fail, error, and score totals; filter failures by evaluator; inspect structured discrepancy paths; and compare actual outputs between batches. Run payloads can be projected with `--select`, and repository-level validation discovers nested workflow projects automatically. Polling commands also expose consistent wait limits and reject flag combinations that cannot produce a reliable verdict. Waiting commands now keep human output concise by default; pass `--json` whenever scripts need the terminal payload.\n- `eigenpal docs` now lists, searches, and reads the complete release-matched platform documentation offline, including detailed evaluator syntax, workflow step guides, CLI reference, and the OpenAPI contract.\n- CLI file uploads now send valid content types for Outlook and unknown files, cancellation confirms the asynchronous request clearly, and run comparisons show every repeated workflow step by branch and iteration path.\n\n### Infrastructure & processing\n\n- Make document inputs uploaded in Studio datasets available to experiment runs, including examples saved by earlier releases.\n- Exact-diff evaluators can exclude volatile fields with `ignore: true`, including nested fields inside a selected object or array. This keeps golden outputs readable while scoring only stable business data such as identities, names, and classifications.\n- Script steps now bind inputs by parameter name, so workflows behave consistently after storage even when JSON key order differs from the authored YAML.\n\n[View full release notes →](/releases/0.15.0)\n\n---\n\n## 0.14.3 (2026-09-04)\n\n### Platform (Studio)\n\n- Model selection now includes the GPT 5.6 Sol, Terra, and Luna lineup plus Claude Fable 5, Fable 5.1, Opus 5, and Sonnet 5. Reasoning effort can be configured for supported workflow steps, agent training and runs, workflow-building chat, and LLM judges; existing choices keep their current provider defaults when the setting is omitted.\n\n### CLI\n\n- Workflow YAML can configure model-aware reasoning effort on AI steps and LLM judges. Omit the setting to preserve each model's current default.\n\n### Infrastructure & processing\n\n- AI processing supports the latest GPT and Claude request formats, including reliable structured extraction with Claude Fable 5 and Fable 5.1. Workflow and agent execution can pass an optional model-aware reasoning effort while preserving previous defaults, and agent sandboxes can use GPT 5.6, Claude Fable 5, Fable 5.1, Opus 5, and Sonnet 5.\n\n---\n\n## 0.14.2 (2026-09-02)\n\n### Infrastructure & processing\n\n- Single-node deployments can now upgrade installations with large legacy datasets without startup failures or loss of trigger configuration.\n\n---\n\n## 0.14.1 (2026-09-02)\n\n### Infrastructure & processing\n\n- Single-node deployments can now upgrade installations with legacy run review data without startup failures.\n\n---\n\n## 0.14.0 (2026-09-02)\n\nThis release gives document teams more control over structured-data quality.\nExact-diff evaluators can express field-specific matching rules, PDF parsing can\npreserve visual layout, and spreadsheet conversion can retain the rows, columns,\nand displayed values that matter to downstream workflows.\n\nCLI authoring guidance makes these capabilities easier to discover and safer to\nautomate, with non-interactive commands failing clearly instead of waiting on\nunavailable prompts.\n\n### Platform (Studio)\n\n- `ai.parse` adds `outputFormat: layout` for native PDF extraction. It returns fixed-width plain text that preserves columns, spacing, and line breaks for multi-column forms and tables that lose meaning when flattened. This PDF-only format must be selected explicitly with `parseMode: native` or `parseMode: native-or-ocr`: native mode fails closed if layout extraction cannot complete, while hybrid mode keeps accepted layout pages and substitutes OCR markdown only for suspect or empty pages. Existing formats and defaults are unchanged.\n- Spreadsheet to JSON now handles `.xls` and `.xlsx` workbooks with configurable headerless input or an explicit header row, named or positional column projection, rectangular ranges, and raw or displayed cell values. Displayed values preserve formatted text such as dates, leading zeros, punctuation, diacritics, and embedded newlines. Blank-cell and blank-row policies make sparse sheets predictable, while optional sheet metadata and diagnostics explain the selected range and non-fatal issues. Existing zero-config output remains `rows`, plus `fileId` when CSV output is enabled; zero-config CSV keeps the full selected sheet, and configured CSV follows the same projection. File, row, column, and cell limits reject unsafe workloads before conversion.\n- Exact-diff evaluators add composable per-field rules for extraction outputs. Choose ordered or unordered comparison independently from `items: at-least | at-most | exactly`, set numeric tolerances, and reject unexpected object fields where strict output shapes matter. Ordered arrays retain prefix-compatible matching, while unordered arrays find the best one-to-one structural pairing instead of depending on row order. Unordered object arrays can also use typed `matchBy` identities such as `sku` or `[country, sku]` for predictable single- or composite-key matching. Studio now provides a rule editor with path-aware validation. Grounding metadata is excluded from scoring, oversized comparison workloads fail safely with bounded diagnostics, and existing evaluator configurations keep their historical behavior.\n\n### Public API\n\n- Template creation now accepts reusable file references correctly, restoring CLI template uploads and workflow pushes that use local DOCX or XLSX files.\n\n### CLI\n\n[View full release notes →](/releases/0.14.0)\n\n---\n\n## 0.13.2 (2026-09-01)\n\n### CLI\n\n- CLI installation no longer downloads packages already included in its self-contained executable, reducing install overhead and improving compatibility with restricted enterprise networks.\n\n---\n\n## 0.13.1 (2026-08-31)\n\n### Platform (Studio)\n\n- Workflows can turn JSON rows into a downloadable Excel workbook with a new JSON to XLSX step. Pick ordered columns, map an array of objects, and get a `.xlsx` run output — including multi-sheet workbooks — without filling a template.\n- Studio now uses the shared theme provider, so system / light / dark stays aligned with OpenParser instead of drifting independently.\n- Publishing a workflow that still has a local `template: ./file.xlsx` path now fails with a clear error. Use `eigenpal workflow push` to upload the file, or set `templateId` to a `tmpl_…` id first.\n- Studio template uploads and replacements now create immutable, checksum-backed revisions and discover tokens consistently across DOCX and XLSX files. Deleting a logical template preserves revision content used by pinned workflows.\n- Fill Template (`transform.template`) now documents workspace `tmpl_...` templates separately from Git agent templates, and Studio copy covers DOCX and XLSX. XLSX files use `\\{placeholder}` and `\\{table:array.prop}` in the spreadsheet; `\\{\\{placeholder}}` in an uploaded sheet warns on upload and fails at fill instead of leaving leftover braces. `templateId` must be a workspace `tmpl_...` ID, not a file ID. Filled values that look like formulas stay text; formulas already in the template stay formulas.\n- Studio now blocks crafted HTML from retaining executable content during sanitization.\n\n### Public API\n\n- Workflow push can fully remove a template it uploaded if publishing then fails. Deleting a template that workflows already pin still keeps those revisions runnable.\n- The public API now lists the text, vision, and OCR models configured for your environment. `GET /v1/models` is a cheap catalog inventory for the current tenant: it reports whether each model is configured and which capability it is the default for, without probing live providers or exposing secrets.\n- The public API now supports the full lifecycle for tenant-scoped DOCX and XLSX templates: upload, inspect, list, download, replace, and delete, with direct-upload support for larger files. Every replacement creates a checksum-backed immutable revision; deleting the logical `tmpl_…` resource preserves revisions already pinned by workflows.\n\n### CLI\n\n- `workflow versions create --file` now resolves local `template:` paths the same way as `workflow push`, and `workflow templates smoke --data` help documents the JSON fixture file path.\n- `eigenpal workflow push` keeps local Office templates inside the workflow project, including when a path uses `../` or a symlink. Files outside that directory need `--allow-external-templates`. Push validates the workflow and version before uploading, creates new template resources instead of moving shared `tmpl_…` pointers, and fully removes those unpublished uploads if publish does not succeed.\n- When resolving a workflow by `wf_…` id, connection failures, auth errors, and server outages now surface their normal CLI messages instead of being misreported as \"workflow not found.\"\n\n[View full release notes →](/releases/0.13.1)\n\n---\n\n## 0.13.0 (2026-08-25)\n\n### Platform (Studio)\n\n- API reference for listing dataset examples now documents `include=metadata`, so you can page through example ids, names, and file refs without loading every payload.\n- Local Studio development no longer keeps a growing on-disk compiler cache that can exhaust memory during long `bun dev` sessions.\n- Studio's sidebar theme picker now supports keyboard navigation across system, light, and dark.\n- Studio dashboard sessions continue to authenticate `/api/v1` calls. Token-based `/api/v1` and `/v1` requests still work without a browser login, and the dedicated API hostname keeps its public routing and CORS behavior.\n- Studio save-as-release still publishes a tagged version as the live workflow. Publishing from an existing snapshot creates a new tagged release instead of rewriting the original tag, so earlier releases stay intact. Connect API docs version pickers follow the public version list, so after restore the current untagged version shows as latest while tagged releases stay selectable.\n\n### Public API\n\n- List dataset examples without pulling every payload. `GET /api/v1/automations/:id/examples` now accepts `include=metadata`, which returns ids, names, annotations, and expected file refs while leaving input and expected JSON unloaded. Keep the default `include=full` when you still need the complete example bodies.\n- You can now create, promote, and restore workflow versions through the public API. Create a tagged candidate with `activate: false` to test it without changing live traffic, then promote that exact version after it qualifies. You can also publish from YAML, copy an existing version into a new release without changing its original tag, or restore an earlier snapshot. Name-conflict errors include `conflictingWorkflowId` so you can see which workflow already owns the name.\n\n### CLI\n\n- `eigenpal workflow versions` can now create, promote, and restore YAML workflow versions through the public API. Tag a candidate from a YAML file or an existing snapshot with an explicit semver, keep it off live traffic with `--no-activate`, then promote that exact version when it qualifies. Restoring still rolls a workflow back by copying a snapshot into a new current version — lists now show that untagged HEAD clearly instead of hiding it. `workflow versions list --limit` and `--offset` page that full public list locally. `--json` prints the sliced `\\{ data, total, limit, offset }` envelope (`total` is the unsliced count), not the raw server payload.\n\n### SDK\n\n- TypeScript and Python SDKs can list dataset examples with `include: \"metadata\"`. That returns ids, names, annotations, and expected file refs without loading each example's input and expected JSON. The default remains a full payload, so existing list calls stay unchanged.\n\n[View full release notes →](/releases/0.13.0)\n\n---\n\n## 0.12.2 (2026-08-21)\n\n### Platform (Studio)\n\n- Document editing: the DOCX editor used for templates, run file review, and Office file previews now follows your light or dark theme, and Save (including Cmd/Ctrl+S) writes back to the document you opened instead of downloading a copy. Documents that fail to open now report the reason instead of showing an empty editor. Placeholder highlighting in DOCX templates is temporarily unavailable.\n- Connect: a workflow that wraps another workflow now documents the full response shape. Its OpenAPI spec, Swagger UI preview, and the response examples and generated types on the Connect page show the nested objects and arrays returned by the workflow it calls, instead of leaving those fields untyped.\n\n---\n\n## 0.12.1 (2026-08-19)\n\n### Platform (Studio)\n\n- Connect: download an OpenAPI spec (swagger.json) and preview it in Swagger UI directly from the Connect page. Selecting a workflow or agent produces a spec for just that automation: the five endpoints needed to integrate it (start a run, poll it, cancel it, list and download artifacts), with the request body documenting its exact input fields and file uploads and run responses typed with its actual output schema. With no selection you get the full platform API spec. Swagger UI is bundled with the product, so the preview also works in on-prem installs without internet access.\n\n---\n\n## 0.12.0 (2026-08-18)\n\n### Platform (Studio)\n\n- The workflow builder chat honors the new `disableTemperature: true` model configuration option, so models that reject a sampling temperature work from the first request.\n- Object-typed workflow inputs can now declare a nested schema. In the workflow builder, choosing the Object type (or an array of objects) opens a property editor where you define each field with its type, description, allowed enum values, and required flag, including nested objects and arrays up to five levels deep. Declared fields are enforced when a run starts: missing required fields and type mismatches are rejected with precise field paths. Downstream steps get full autocomplete and type resolution for nested references such as `\\{\\{ input.metadata.vendor.name }}`, and the declared shape appears in the scope browser and in generated API documentation. The builder flags expressions that reference undeclared nested fields, the run form and evaluation input editor pre-fill the declared required fields, and the AI expression generator sees the nested shape when suggesting expressions. The headless execution server now enforces declared inputs with the same validator, so its API documentation and runtime behavior agree.\n- Grounded OpenParser extraction results can now carry complete field lineage through the Eigenpal web runtime, preserving source evidence and confidence metadata for downstream review experiences.\n\n### Public API\n\n- Object-typed workflow inputs can now declare a nested schema. In the workflow builder, choosing the Object type (or an array of objects) opens a property editor where you define each field with its type, description, allowed enum values, and required flag, including nested objects and arrays up to five levels deep. Declared fields are enforced when a run starts: missing required fields and type mismatches are rejected with precise field paths. Downstream steps get full autocomplete and type resolution for nested references such as `\\{\\{ input.metadata.vendor.name }}`, and the declared shape appears in the scope browser and in generated API documentation. The builder flags expressions that reference undeclared nested fields, the run form and evaluation input editor pre-fill the declared required fields, and the AI expression generator sees the nested shape when suggesting expressions. The headless execution server now enforces declared inputs with the same validator, so its API documentation and runtime behavior agree.\n- Listing runs with `sinceLastClosed=true` works again. Once a review had been closed, asking for the runs recorded since then returned an error instead of the runs, so review tooling that polls for new work had no way to ask \"what has arrived since I last signed off\". The filter now returns those runs.\n\n### Infrastructure & processing\n\n- Model entries in the deployment configuration can now set `disableTemperature: true`. Workflow steps then never send a sampling temperature to that model, which lets reasoning models (and gateways in front of them) that reject the parameter run without a first-call retry.\n- Object-typed workflow inputs can now declare a nested schema. In the workflow builder, choosing the Object type (or an array of objects) opens a property editor where you define each field with its type, description, allowed enum values, and required flag, including nested objects and arrays up to five levels deep. Declared fields are enforced when a run starts: missing required fields and type mismatches are rejected with precise field paths. Downstream steps get full autocomplete and type resolution for nested references such as `\\{\\{ input.metadata.vendor.name }}`, and the declared shape appears in the scope browser and in generated API documentation. The builder flags expressions that reference undeclared nested fields, the run form and evaluation input editor pre-fill the declared required fields, and the AI expression generator sees the nested shape when suggesting expressions. The headless execution server now enforces declared inputs with the same validator, so its API documentation and runtime behavior agree.\n\n---\n\n## 0.11.3 (2026-08-13)\n\n### Platform (Studio)\n\n- API reference pages for starting and reading runs now show complete examples, including `output` and `execution.status`.\n\n### Public API\n\n- Run API: completed-run examples now include `type`, `execution.status`, `output`, `files`, and `error`, instead of a shared async/completed union that dropped those fields. Default GET and list responses populate `execution.retry.nextRun` when a retry exists, and `expand=execution` keeps `schemaValid` instead of clearing it. Child invoke-workflow runs document `parentExecutionId` and `childExecutions`.\n\n### SDK\n\n- Generated run types now distinguish a completed run from the async accepted envelope (`RunAccepted`), and include `parentExecutionId` for child invoke-workflow runs.\n\n---\n\n## 0.11.2 (2026-08-07)\n\n- Internal improvements.\n\n---\n\n## 0.11.1 (2026-08-07)\n\n### Platform (Studio)\n\n- Document and image processing now runs on updated imaging components that carry upstream security fixes.\n\n### Infrastructure & processing\n\n- Document and image processing now runs on updated imaging components that carry upstream security fixes.\n\n---\n\n## 0.11.0 (2026-08-06)\n\n### Platform (Studio)\n\n- Workflow builder chat now works with reasoning models served through a self-hosted `openai-compatible` gateway, instead of failing with a \"temperature is not supported\" error. On models that only accept their own default temperature setting, replies can vary between attempts on the same question.\n- Canonical API hostnames now consistently expose only supported API and operational routes, returning a clear 404 for unsupported discovery paths.\n- Agent Builder attachments now negotiate multipart or storage-direct transfer, so large PDFs and archives can reach the active sandbox without crossing cloud payload limits. Large downloads use the same secure dual path. Self-hosted operators can set `deployment.multipartMaxBytes` in `eigenpal.config.yaml`; the supplied on-prem deployments keep files on multipart and streamed downloads by default.\n- Canonical API hostnames now serve API routes and discovery endpoints reliably without Studio sign-in handling intercepting requests.\n\n### Public API\n\n- Upload and download reusable files up to 100 MiB through one negotiated API: files within the deployment body limit use multipart, while larger cloud transfers use verified storage-direct uploads and short-lived authenticated download links. Retry-safe temporary run and Builder files expire after 24 hours. Existing multipart routes and `studio.eigenpal.com/api/v1` remain compatible, and new integrations can use `api.eigenpal.com/v1`.\n\n### CLI\n\n- The CLI now uses `api.eigenpal.com` as the default cloud API origin and automatically pre-uploads run files that exceed the multipart request limit. Self-hosted users can keep custom API origins and set `EIGENPAL_MULTIPART_MAX_BYTES` to their proxy limit, or `none` to keep all files on multipart.\n\n### SDK\n\n- The TypeScript and Python SDKs now transparently upload large run inputs without crossing cloud request limits, follow secure storage-direct downloads, and default cloud calls to `api.eigenpal.com`. Set `multipartMaxBytes` / `multipart_max_bytes`, or `EIGENPAL_MULTIPART_MAX_BYTES`, to match a self-hosted proxy; use `null` / `None` to keep every run file on multipart. Explicit `files.upload` files remain reusable until deleted.\n- TypeScript file uploads now follow the server-negotiated multipart endpoint, improving compatibility across hosted and self-managed route layouts.\n\n[View full release notes →](/releases/0.11.0)\n\n---\n\n## 0.10.56 (2026-08-05)\n\n### Platform (Studio)\n\n- Agent Builder training chat now shows Pierre file diffs for edit/write, a Pierre syntax-highlighted file view for Read file, secure request-secret password cards (encrypted into the draft; the agent only sees configured/skipped), and a quiet timeline note when you release an agent version from the dashboard.\n\n### Infrastructure & processing\n\n- Production releases that do not change document processing finish faster by reusing verified OCR provider checks from the last successful release, while still re-checking providers when processing code or infrastructure changes.\n\n---\n\n## 0.10.55 (2026-08-05)\n\n### Platform (Studio)\n\n- Agent Builder now resumes your latest draft, clearly distinguishes unsaved edits from saved changes that are not live, and provides direct Save and Release actions. Releases show the current and next version and let you choose a patch, minor, or major update. Dashboard save and release actions remain available to the builder as private context, so it can accurately answer what is live without guessing. Starting a separate draft is explicit, attachments remain available when beginning a conversation, stopped sandboxes can be restarted without losing the draft, and test runs reliably receive JSON-only inputs.\n\n### Public API\n\n- Agent Builder releases now complete live automation synchronization reliably, so a successful release is immediately available without a separate recovery step.\n\n### Infrastructure & processing\n\n- OCR and LLM model catalogs keep loading when the service adds new optional fields, so Studio and Eigenpal no longer fall back to stale model lists during catalog updates.\n- Cloud document processing providers that are already available stay online during routine production updates when their identity is unchanged. New or changed providers stay unavailable until they pass live verification, so customers keep working providers instead of a full outage window.\n\n---\n\n## 0.10.54 (2026-08-04)\n\n### Platform (Studio)\n\n- Workflow Studio now shows each OpenParser OCR model with its actual provider logo, keeps narrow step configuration panels contained, and places settings, theme, and sidebar controls together in a cleaner navigation footer.\n\n---\n\n## 0.10.53 (2026-08-04)\n\n### Platform (Studio)\n\n- OpenParser Studio now visualizes the `openparser@1` document graph directly, including typed elements, figures, tables, relationships, and element-level extraction citations.\n\n### Public API\n\n- OpenParser parse responses now return the unified `openparser@1` document graph, with plain text, canonical Markdown, pages, typed elements, relations, annotations, assets, geometry, confidence, and provider provenance in one predictable contract.\n\n---\n\n## 0.10.52 (2026-08-04)\n\n### Platform (Studio)\n\n- Agent Builder: improve connection recovery so interrupted sessions resume reliably, stale environments are replaced safely, and approval prompts remain retryable when delivery fails.\n\n---\n\n## 0.10.51 (2026-08-03)\n\n- Internal improvements.\n\n---\n\n## 0.10.50 (2026-08-03)\n\n### Platform (Studio)\n\n- OpenParser Studio: pipeline creation no longer reports a duplicate-name error after a successful save, and edits now save reliably from the browser.\n\n---\n\n## 0.10.49 (2026-08-03)\n\n- Internal improvements.\n\n---\n\n## 0.10.48 (2026-07-30)\n\n### Platform (Studio)\n\n- OpenParser Studio now displays canonical OpenParser JSON with readable indentation, including large document results.\n\n---\n\n## 0.10.47 (2026-07-30)\n\n### Platform (Studio)\n\n- OpenParser Studio now keeps large document results responsive, renders OCR markdown with clearer structure, and provides consistent copy and download actions for Markdown and JSON output. Documentation links now reliably open the generated API reference.\n\n### Infrastructure & processing\n\n- OpenParser jobs now recover more safely when document processing capacity becomes unavailable. Retryable failures pause new dispatches, retry without duplicate charges, and bound large-document processing so one document cannot overwhelm the service.\n\n---\n\n## 0.10.46 (2026-07-30)\n\n### Platform (Studio)\n\n- Team settings: bring back the invitation link. Creating an invitation now shows its link straight away whenever no invitation email was delivered, and administrators can pull up the link again at any time from the invitations table. This unblocks onboarding on deployments without email delivery, where handing over the link is the only way to get someone into the workspace.\n- Run details: field grounding now labels flagged fields by what the extraction actually reports, showing \"3 with low confidence\" instead of \"3 to review\". The count is a confidence signal, not an assigned task.\n\n---\n\n## 0.10.45 (2026-07-29)\n\n### Platform (Studio)\n\n- Parse Document setup now clearly separates OCR from Vision AI, automatically offers available OpenParser OCR models, shows each model's per-page price, displays only the controls that affect the selected method, and surfaces structured layout data with tables, figures, polygons, and bounding boxes for downstream workflow steps.\n\n### CLI\n\n- The workflow authoring reference now covers explicit OCR and Vision AI parse modes, optional figure-caption models, and structured layout output.\n\n### Infrastructure & processing\n\n- Document parsing now defaults to higher-fidelity OCR, preserves canonical structured layout alongside Markdown, and automatically supports available OCR models with provider-specific per-page pricing. Other OCR providers retain their existing rates.\n\n---\n\n## 0.10.44 (2026-07-28)\n\n- Internal improvements.\n\n---\n\n## 0.10.43 (2026-07-27)\n\n- Internal improvements.\n\n---\n\n## 0.10.42 (2026-07-27)\n\n- Internal improvements.\n\n---\n\n## 0.10.41 (2026-07-27)\n\n### Platform (Studio)\n\n- Run traces now show each attempt of an AI request. A request that timed out and was retried used to appear as a single long bar, so a step that spent three timeouts on one page looked identical to one slow call. The raw trace now has one bar per try, labelled with the try number, and the run timeline marks a retried call with how many times it was sent. Retried requests also record how long they waited for a free slot, which distinguishes a slow model from a queue backed up behind its own in-flight requests. For documents parsed page by page, each split retry records the pages it covered and how deep the split went.\n- Runs and Experiments improvements: - An experiment run now shows the same input and output panels as the main run view, including input file downloads, per-step output files, and inline field-level output review. - Scored runs show their eval score in the runs list and in the run header, so an experiment's results can be compared without opening each run. - A run that came from an experiment or a dataset example now links straight to that run in the Evals view. - The Live and Experiments toggles on Runs are remembered between visits. - Field grounding: a wide document no longer overflows the panel. Wide tables and long unbroken text scroll inside the document card.\n\n---\n\n## 0.10.40 (2026-07-25)\n\n### Infrastructure & processing\n\n- Processing reliability on busy deployments: health checks are now served independently of document processing, so the service stays responsive to them even while working through a heavy document. It is no longer restarted mid-run just because it is under load, so long-running document runs complete more reliably.\n- Document processing is more resilient on CPU- and memory-constrained deployments. Page rasterization for vision and OCR now runs in isolation, so a single large or malformed document can no longer stall the processing service or cause it to restart mid-run. Runs on big scanned documents that previously failed partway through with \"the worker stopped before this attempt recorded a terminal result\" now complete reliably.\n\n---\n\n## 0.10.39 (2026-07-25)\n\n### Platform (Studio)\n\n- Label Pages runs: the page preview now shows the classified document in the full viewer instead of small thumbnails. PDFs render page-by-page with zoom and navigation and each page's labels shown beside it; Word and other Office documents open in their own preview next to a per-page label list. Filter by a label to focus on just the pages that carry it.\n\n---\n\n## 0.10.38 (2026-07-24)\n\n### Platform (Studio)\n\n- OpenParser Studio: manage extraction pipelines from a dedicated workspace — create, edit, run, duplicate, and delete saved configurations. Jobs show the pipeline and version that produced each result, and you can save a new pipeline from job settings.\n- OpenParser Studio: clearer progress while documents upload, parse, and extract, with live elapsed timing at each stage. Job history and the playground share a unified header with breadcrumbs, improved document and Markdown output viewers, and a cleaner parse sidebar. Choose light or dark theme and manage your account from the sidebar; model selectors and in-product copy are simpler throughout the workspace.\n- Members provisioned through SSO are now read-only in workspace member settings. Their role and access come from your identity provider's groups, so admins can no longer change or remove them by hand, and each SSO member is clearly labeled. Accounts created with a username and password stay fully manageable by admins.\n\n### Public API\n\n- **Breaking:** OpenParser API resource identifiers now use consistent prefixed ids. Parse, extract, and batch jobs return `opj_…` ids instead of UUIDs. Saved extraction pipelines use `oppl_…` instead of `oep_…`. New parse output writes figure image ids as `opfig_…` instead of `ocrfig_…`. Existing jobs and pipelines are remapped automatically on upgrade when the OCR queue is idle enough for migration preflight. Prefer the new formats in job URLs, `parse_job_id`, `pipeline_id`, and batch child `job_id` fields. During the transition, previously issued UUID job ids, `oep_…` pipeline ids, and UUID list cursors remain readable; responses continue to return the preferred `opj_…` / `oppl_…` forms. Historical parse artifacts and `result_json` may still embed legacy `ocrfig_…` figure paths; `GET /files/\\{id}` accepts both `opfig_…` and `ocrfig_…`.\n\n### Infrastructure & processing\n\n- Hardened AI-powered document processing against prompt-injection attempts hidden inside uploaded documents. Instructions embedded in a document can no longer steer extraction, classification, or vision results away from the requested schema, or coax the model into disclosing its own configuration.\n- AI vision step results no longer include internal document storage references in their metadata. The step's `_vision` provenance now records only which pages were inspected and how many were merged, keeping internal storage paths out of workflow output.\n\n---\n\n## 0.10.37 (2026-07-24)\n\n### Platform (Studio)\n\n- New **Label Pages** step tags each page of a document with zero or more labels (multi-label) using AI, and groups the results into a label-to-pages map. Unlike section splitting — which produces one contiguous range per section — this collects pages of the same kind wherever they appear, so scattered pages (for example every signature or photo page throughout a report) can be gathered in one place. The page-inspection step can now take an explicit list of page indices, so you can route the pages for a given label straight into a visual inspection without hand-listing them.\n\n---\n\n## 0.10.36 (2026-07-23)\n\n### Platform (Studio)\n\n- OpenParser Job History now reports the real end-to-end duration for completed parse and extraction jobs instead of showing a zero or unavailable measurement.\n- Running OpenParser jobs now show the document scanning animation from the playground while results are being prepared.\n- Parse and Extract now use consistent operation icons across OpenParser Studio and documentation.\n\n---\n\n## 0.10.35 (2026-07-23)\n\n### Platform (Studio)\n\n- OpenParser sign-in and account creation now redirect directly to the branded authentication flow without an intermediate confirmation page.\n- OpenParser parse jobs now retain both `raw` and `openparser@1` results. Retrieve either representation with `GET /jobs/\\{id}/result?format=...`, switch formats in the Studio Output tab, and start extraction from a raw-format parse job without running OCR again.\n\n### Public API\n\n- OpenParser parse jobs now retain both `raw` and `openparser@1` results. Retrieve either representation with `GET /jobs/\\{id}/result?format=...`, switch formats in the Studio Output tab, and start extraction from a raw-format parse job without running OCR again.\n- OpenParser now keeps recognized text aligned with its original bounding box by default. Set `ocr_options.merge_layout_blocks` to `true` per parse, extraction, batch item, or saved pipeline when merged recognition is preferred over one-to-one text geometry.\n\n---\n\n## 0.10.34 (2026-07-23)\n\n### Platform (Studio)\n\n- OpenParser sign-in and account creation now keep OpenParser branding throughout the authentication experience.\n- OpenParser Studio: uploads and sample documents now open their Job History detail immediately, so browser back and forward navigation follows each run naturally while extraction and result review stay in one place.\n- Run detail now shows clean, readable file names for inputs and outputs instead of internal storage identifiers, and long file names no longer overlap the preview and download buttons.\n\n### Public API\n\n- OpenParser parsing now preserves every detected layout region—including empty title, header, and figure boxes—so document overlays remain complete. The obsolete `figure_assets` option is removed because figure regions are now always retained.\n- OpenParser can now process documents beyond 25 pages and admit batches of up to 100 documents, while retaining per-page safety limits.\n- OpenParser jobs can now stream their retained source documents with `GET /jobs/\\{id}/source`, making it easier to build durable review experiences around past runs.\n- `POST /suggest-schema` now returns the suggested schema inline as a convenience response instead of creating a job that clients must poll.\n\n### Infrastructure & processing\n\n- Documents uploaded without a declared file type are now recognized from their contents, so PDFs, RTF, and Office files parse reliably instead of failing with an \"unsupported file type\" error. This most often helped uploads coming from automated integrations that omit the file type.\n\n---\n\n## 0.10.33 (2026-07-22)\n\n### Platform (Studio)\n\n- OpenParser Studio: make Playground the home page, add shareable social previews, clarify job status and pipeline empty states, and tidy the OCR model selector copy.\n\n### Public API\n\n- OpenParser suggested extraction model catalog (`GET /models/llm` in suggested mode) now surfaces up to 20 recommended models instead of 12, so more current options appear before you need to search.\n\n---\n\n## 0.10.32 (2026-07-22)\n\n- Internal improvements.\n\n---\n\n## 0.10.31 (2026-07-22)\n\n### Platform (Studio)\n\n- OpenParser Studio production sign-in no longer auto-redirects to Eigenpal when you are signed out. Choose **Continue to sign in** on the local OpenParser page to authenticate with your Eigenpal account; sign-out stays on OpenParser.\n\n---\n\n## 0.10.30 (2026-07-22)\n\n### Platform (Studio)\n\n- OpenParser production sign-in now shares Eigenpal sessions across its dedicated domain and returns users to their original OpenParser destination after authentication.\n- OpenParser Playground: remove the doubled border and rounded corners around the document workspace.\n\n### Infrastructure & processing\n\n- OpenParser: restore schema suggestions, use GPT-5.6 Terra as the default extraction model with GPT-4.1 Mini as a certified fallback, tighten compatibility checks, and provide clearer failure guidance.\n\n---\n\n## 0.10.29 (2026-07-22)\n\n### Platform (Studio)\n\n- OpenParser Studio sign-in and sign-up now load the shared identity UI correctly for signed-out visitors.\n\n---\n\n## 0.10.28 (2026-07-22)\n\n### Platform (Studio)\n\n- API keys: keep usable credentials in the primary list and move revoked or expired credentials into a collapsed history section for faster scanning.\n- OpenParser Studio sign-in and sign-up now show OpenParser product copy and logo while retaining the shared Eigenpal identity.\n\n### Public API\n\n- OpenParser model discovery (`GET /models/llm`) now refreshes the live compatible catalog on the API service instead of falling back to a short emergency list when the catalog credential is missing from that process.\n\n### Infrastructure & processing\n\n- OpenParser document processing now bounds source downloads and retries transient storage failures, preventing stalled jobs from running indefinitely.\n\n---\n\n## 0.10.27 (2026-07-21)\n\n### Platform (Studio)\n\n- New Inspect Pages (Vision) step lets a workflow look at the actual page images of a document and return structured results, for details that only exist in the pixels rather than the text. Use it to check whether a document is signed, rate embedded photos, or spot stamps and logos. It works on PDFs, images, and Office documents, and you can point it at a specific page range (for example the section found by a Split step) so it only reviews the pages that matter. The run trace shows the pages it inspected next to the results.\n- Parsing can now describe the figures on a page as text. Enable \"describe figures\" on a Parse step and the images on each page (property photos, charts, stamps) are detected and captioned inline, so later steps that work on text, like Split, can find image-only pages. This is especially useful for scanned documents, where the photo pages carry almost no text on their own. You can provide custom instructions for how figures should be described.\n- Split step results are now also available keyed by section name. A later step can point at one section directly, for example `\\{\\{ steps.split.output.sections.photos.page_range }}`, instead of filtering the full list. This makes wiring a Split step into a downstream step much simpler.\n- The Inspect Pages (Vision) step now takes a Page From / Page To range instead of a single page-range expression, and both are optional. Leave them blank to inspect the whole document, which is processed in chunks and the results merged automatically. This makes it much easier to point the step at a range (for example the start and end of a Split section) or to scan an entire document without writing a range expression.\n\n---\n\n## 0.10.26 (2026-07-21)\n\n### Platform (Studio)\n\n- Wildcard API keys can use the OpenParser OCR API consistently with every other platform capability. Keys can also be restricted to the dedicated `ocr:full` scope when OCR-only access is preferred.\n- Run traces now include a Grounding panel for extract steps: every extracted value is highlighted in the input text, tinted by confidence, and clicking a field or a highlight jumps between them. Grounded fields also show inline context previews of the exact source passage, both in the panel and in the expanded step row. Split steps gain the same visual page-range panel the segmenter uses, with page thumbnails and per-section preview. The workflow builder reflects that grounding is on by default and lets you pick any configured provider as the grounding model, and capturing expected output from a run no longer snapshots volatile grounding metadata into evals.\n\n### Public API\n\n- Wildcard API keys can use the OpenParser OCR API consistently with every other platform capability. Keys can also be restricted to the dedicated `ocr:full` scope when OCR-only access is preferred.\n- OpenParser: completed extraction jobs can now be retrieved reliably with their attempt and usage metadata.\n\n### CLI\n\n- The step catalog now documents grounded extraction as the default: extract steps ship per-field confidence and source spans under the `_grounding` output key unless `grounded: false` is set.\n\n### Infrastructure & processing\n\n- Data extraction now verifies itself by default. Every extract step traces each extracted field back to its exact location in the source text and attaches a confidence level (high, medium, or low) plus a needs-review flag under a reserved `_grounding` output key, so downstream steps and evaluators can route uncertain values to a human. The verification pass runs on your workspace model (any configured provider), chunks long documents automatically, and falls back to deterministic text matching instead of failing the run when no model is available. Set `grounded: false` on a step to opt out.\n\n---\n\n## 0.10.25 (2026-07-20)\n\n### Platform (Studio)\n\n- Failed single sign-on attempts now return to the sign-in page with a clear, actionable message (for example, when an account's email domain isn't authorized or the account hasn't been granted access) instead of a blank error page.\n\n---\n\n## 0.10.24 (2026-07-15)\n\n### Platform (Studio)\n\n- Agent runs graded by configured evaluators now record a weighted score and pass/fail result, visible in the runs feed and run detail responses. Previously only workflow runs carried an evaluator verdict.\n- Email addresses for a workflow are unique across your whole organization, not just the workflow you are editing. Picking one that is already taken used to fail with a server error. It now tells you which workflow already receives email at that address, or that the workflow you are editing already has it, so you know what to do next. Duplicate folder names and duplicate workspace invites also report clearly instead of failing.\n- `ai.extract` with `grounded: true` no longer succeeds silently without producing grounding. When the grounding pass cannot run (missing OpenAI credentials on the worker, or a grounding model that is not an OpenAI model) the step now fails with an error that names the exact misconfiguration. When the pass runs but produces no field grounding, the output carries an explicit degraded marker instead of nothing. The grounding model picker in the workflow builder now only offers OpenAI models, matching what the grounding pass supports.\n- Agent training: when a training session fails to open, the dashboard now shows what went wrong instead of a generic error. The message names the setup step that failed, and a session blocked by secrets that cannot be decrypted says so and points at the agent settings. A session whose setup fails partway through no longer opens on an incomplete workspace.\n- Self-hosted deployments can now sign users in through corporate single sign-on services that use a redirect-and-token flow instead of OIDC. The new protocol supports mutual TLS for the server-to-server exchange, maps directory groups to EigenPal roles (admin, member, viewer) on every SSO sign-in so the directory stays the source of truth, and links existing password accounts by email so nobody loses access when SSO is turned on. Startup validation rejects unsafe callback origins and provider identifiers, while malformed or oversized identity responses fail closed.\n\n### Public API\n\n- Syncing an automation immediately after a release no longer fails with HTTP 500 while the new release tag propagates. The sync endpoint now reports a retryable status with a clear message when the Git source is momentarily unavailable.\n- Fixed single-experiment results export returning HTTP 400 whenever the `includeTrace` query flag was omitted. `workflow experiment results` and the auto-pull at the end of `workflow experiment watch` now download per-evaluator results in JSON and CSV again.\n- Creating an email trigger address that is already in use now returns 409 with a message naming the workflow in your organization that already uses it, instead of 500.\n\n### CLI\n\n- Agent example runs now report a real evaluator verdict in the CLI: `eigenpal run agents.&lt;name&gt; --example &lt;name&gt; --wait` waits for the verdict, prints the weighted score and pass/fail result, and `--fail-on-mismatch` exits non-zero when the run fails its evaluators, matching the existing workflow behavior. When no evaluators are configured, the CLI says so instead of silently reporting nothing.\n- `agents secrets` is now one command group with `list`, `set`, `unset`, `import`, and `export` subcommands (`agents secret` remains as an alias). The new `agents secrets list` shows the secret names and descriptions declared in the package without ever printing values. Previously `set` and `unset` lived under a separate singular command and `secrets list` failed with an argument error.\n- `agents sync` retries automatically with a short backoff when the server reports the Git source as temporarily unavailable, so the sync right after `agents release` succeeds without manual retries.\n- `agents dataset validate` now checks the same layout the server accepts on `agents dataset push`: example folders under `examples/`, file inputs referenced from `input.json` with `\\{ \"$file\": \"input/...\" }`, and `expected.json` optional. Previously the local validator demanded a different layout that push would then reject, so no dataset could satisfy both. Validation errors now point at the exact rule that failed, including a hint when example folders sit at the dataset root instead of under `examples/`. When the agent package carries an input schema, each example's full input object is validated against it (required fields, unknown keys, and value types, with `\\{ \"$file\": ... }` references accepted for file fields), so inputs that would fail at run start are caught locally. Failure-expected examples (`expected.json` with `$error`) are rejected for agent datasets, since agent runs are evaluated only when they complete.\n\n[View full release notes →](/releases/0.10.24)\n\n---\n\n## 0.10.23 (2026-07-15)\n\n- Internal improvements.\n\n---\n\n## 0.10.22 (2026-07-14)\n\n### Platform (Studio)\n\n- Organization members can now configure, test, and manage outbound webhooks from Studio.\n\n---\n\n## 0.10.21 (2026-07-14)\n\n### Platform (Studio)\n\n- Webhooks: notify external systems when workflow or agent runs are created or change status, with signed delivery, custom headers, retry history, testing, and manual redelivery from Studio.\n- Webhook signing secrets are now easier to copy securely from endpoint setup and details, with clearer event selection defaults.\n- Webhook setup now keeps failed submissions actionable with clear inline error feedback.\n\n### Public API\n\n- Run creation and rerun requests now publish signed lifecycle webhooks only after inputs are ready, so API-triggered automations never emit events for runs that fail during setup.\n\n### Infrastructure & processing\n\n- Improved staging worker deployment reliability when compute capacity is fully allocated.\n\n---\n\n## 0.10.20 (2026-07-12)\n\n### Platform (Studio)\n\n- Workflows: configure automatic retries from Studio at the workflow level or override them for individual HTTP GET/HEAD and Website Reader steps.\n\n### CLI\n\n- The bundled workflow reference now documents durable retry policies, inheritance, supported step types, and retry safety limits.\n\n### Infrastructure & processing\n\n- Workflow runs can recover replay-safe network steps from transient failures without restarting completed work, using bounded backoff and durable retry state. Retry behavior is now step-scoped. Legacy whole-run retry settings no longer restart a failed workflow; configure durable retries on eligible steps or through the workflow retry default instead.\n\n---\n\n## 0.10.19 (2026-07-09)\n\n### Platform (Studio)\n\n- Workflow composition is unified on `action.invoke-workflow`: use `execution: inline` (default) to run a target workflow's steps inside the parent run, or `execution: child` for a separate child run. Reusable blocks (`control.block`, `kind: block`) are removed — migrate to inline invoke with `workflow: &lt;name-or-id&gt;`.\n\n### Public API\n\n- Workflow run endpoints now preserve inline invoke snapshots across initial runs, reruns, and dataset executions so composed workflows remain reproducible after target workflows change.\n\n### CLI\n\n- Workflow YAML reference docs now describe `action.invoke-workflow` as the single composition primitive, including inline and child execution modes.\n\n---\n\n## 0.10.18 (2026-07-08)\n\n### Infrastructure & processing\n\n- On-prem deployments: improve OpenShift compatibility so migration and processing jobs can start reliably under random-user security policies.\n\n---\n\n## 0.10.17 (2026-07-08)\n\n### Platform (Studio)\n\n- Document parser: vision parsing can now render PDF pages at higher resolution and image quality for documents where small text or compression artifacts hurt OCR accuracy.\n\n### Infrastructure & processing\n\n- Document parser: vision parsing can now render PDF pages at higher resolution and image quality for documents where small text or compression artifacts hurt OCR accuracy.\n\n---\n\n## 0.10.16 (2026-07-07)\n\n### Platform (Studio)\n\n- Workflow experiment results now preserve evaluator error details alongside each per-evaluator score, so example grading views and tools can distinguish failed judges from unknown results instead of treating them as passing.\n\n### CLI\n\n- `eigenpal run &lt;workflow&gt; --example &lt;name&gt;` now actually grades the example instead of printing `PASS` whenever the run merely finished. It runs the workflow's current published version on the server's stored dataset example, so configured evaluators run automatically and the CLI surfaces the real weighted score and per-evaluator pass/fail. Workflows with no evaluators fall back to a structural diff of the output against the example's stored expected output. The summary reports two separate signals: execution health (`ok`/`errored`) and accuracy. Add `--fail-on-mismatch` to exit non-zero when a graded example fails. Because the run uses the server-side example, push your latest dataset and evaluators (`eigenpal workflow dataset push`, `eigenpal workflow evaluators push`) before running `--example`.\n\n---\n\n## 0.10.15 (2026-07-06)\n\n### Platform (Studio)\n\n- Experiments: make result review easier in Studio with trace exports, clickable score bars, calmer live refreshes, developer-view defaults, and clearer separation between below-threshold results and run errors.\n\n### Public API\n\n- Experiment export endpoints now support JSON exports with full run trace details for deeper debugging and audit review.\n\n### SDK\n\n- SDK clients now expose the trace-inclusive experiment export option for deeper debugging and audit review.\n\n---\n\n## 0.10.14 (2026-07-06)\n\n### Platform (Studio)\n\n- Evaluations: expected workflow failures now report cleaner scores when a run is supposed to stop early. Studio marks non-applicable quality judges as skipped, so successful rejection examples can receive a full score from the structured failure checks that actually apply.\n\n---\n\n## 0.10.13 (2026-07-06)\n\n- Internal improvements.\n\n---\n\n## 0.10.12 (2026-07-06)\n\n- Internal improvements.\n\n---\n\n## 0.10.11 (2026-07-03)\n\n- Internal improvements.\n\n---\n\n## 0.10.10 (2026-07-03)\n\n- Internal improvements.\n\n---\n\n## 0.10.9 (2026-07-02)\n\n### Platform (Studio)\n\n- Build document-processing workflows that split, route, and verify a mixed batch: - **Document separation** detects the boundaries and types of the documents inside one large scan, so a single upload can be broken into its individual documents and each sent to its own extraction pipeline — even for batches hundreds of pages long. - **Multi-way routing** sends each detected document to the right branch by its type, and stays readable on the canvas even with many branches. - **Grounded extraction** attaches a confidence level and source location to each extracted field, flagging values that aren't found verbatim in the document so reviewers know where to look. - The run view now lets you open the detected documents and preview their pages, and inspect the OCR layout with bounding boxes drawn over the page (with a toggle to the extracted text) — right from the step timeline.\n\n### CLI\n\n- The workflow step catalog now lists the new document-separation and multi-way routing steps, plus the grounded-extraction options, so authoring and validating workflows from the CLI stays in step with what the platform supports.\n\n### Infrastructure & processing\n\n- Self-hosted (on-prem) deployments can now run official EigenPal release images, with access provisioned per customer. Images are published only after a release ships and are signed so you can verify their authenticity before deploying.\n\n---\n\n## 0.10.8 (2026-07-01)\n\n### Platform (Studio)\n\n- Single-file workflow inputs now display correctly after a dataset import. Previously an input that takes one file could show an empty file slot; imported examples now match each file to the workflow's declared input shape.\n- Evaluator scoring now uses a single pass threshold for the whole workflow. The score-by-example chart's cutoff line and every evaluator's pass/fail are measured against that one threshold, so the chart, the per-evaluator results, and the run gate always agree. Experiment scores are shown in two states — passing (green) or below threshold (amber).\n- The LLM judge evaluator now requires evaluation criteria. Without them the model invents its own scoring rubric, so the editor marks the field required, renames it to \"Evaluation criteria\" with a worked example, and blocks saving until it is filled in.\n- Workflow folders can now be reorganized. A new \"Move to folder\" action in each folder's menu lets you move a folder (and everything inside it) into another folder or back to the top level, so you can restructure your workspace without recreating folders. Destinations that would nest a folder inside itself are blocked, with a tooltip explaining why.\n- Nested sub-workflows now display and resolve correctly across runs, the workflow builder, and the CLI. In the Runs list, a run that invokes a sub-workflow which itself invokes another sub-workflow now nests every level under its parent, instead of stopping at the first level. In the workflow builder, an \"Invoke Workflow\" step that targets a workflow built from other invoked workflows now shows the real output field types instead of \"unknown\", so you can reference those fields with autocomplete; referencing one of those fields no longer triggers a false \"field not found\" warning. The same resolution now applies when validating and publishing workflows (including via the CLI), so deeply nested invoke chains validate against their real output fields. All of this resolves through arbitrarily deep chains with a safety limit that prevents looping on workflows that invoke each other.\n- Runs: add a simplified review mode with developer-view toggle, review status badges, and inline output review for JSON fields and generated files.\n- New debugging and control primitives for runs. You can now cancel an in-progress run through the API, experiment results report when a batch has fully finished, steps skipped by a condition or an empty loop are reported as skipped rather than succeeded, and each step records the exact configuration it ran with so failures are easier to diagnose.\n- Run detail responses are leaner and more explicit: you choose exactly which sections to expand, and the public run schema now exposes the workflow version, cancellation-request time, and trace, retry, and email-trigger details.\n\n### CLI\n\n- `eigenpal workflow validate` now tells you when a workflow contains Invoke Workflow steps that local validation cannot fully check. Because those steps reference other workflows that live on the server, the command prints a short note pointing you to `validate --online` (or push) to verify the invoke targets, input types, and cycles. The skill guidance now shows the `--online` step in the validate-then-push flow as well.\n- The evaluator configuration reference now reflects the single workflow-level pass threshold. A per-evaluator `passThreshold` is documented as legacy — pass/fail is decided by the one workflow-level threshold — and that workflow-level threshold no longer shows a fixed default, since it is derived when omitted.\n\n### SDK\n\n- The Python SDK now requires Python 3.10 or newer. Python 3.9 has reached the end of its support window, and dropping it keeps the SDK on current, actively maintained dependencies. If you are still on Python 3.9, upgrade to 3.10+ to continue receiving SDK updates.\n\n[View full release notes →](/releases/0.10.8)\n\n---\n\n## 0.10.7 (2026-06-30)\n\n### Platform (Studio)\n\n- Faster dashboard navigation. Lists keep their contents on screen while filters and folders refresh instead of flashing a loading state, document and image previews are cached so they no longer re-download on every navigation, and heavy viewers (PDF, charts, rich text) load on demand for a quicker first paint.\n- Workflows that invoke another workflow now pass file inputs through to the sub-workflow, so file-backed sub-workflow runs no longer fail before they start.\n\n### CLI\n\n- `eigenpal --help` now groups `run`, `rerun`, and `runs` under a dedicated \"Run\" section instead of the catch-all \"Other\" bucket, so starting a run and reading its output is easy to find.\n\n---\n\n## 0.10.6 (2026-06-30)\n\nThis release contains maintenance and reliability improvements with no customer-facing changes.\n\n---\n\n## 0.10.5 (2026-06-29)\n\nThis release makes EigenPal's public changelog a reliable product record. Each release now has a dedicated docs page that explains what changed for Studio, the public API, the CLI, SDKs, and document processing in one place.\n\nThat means teams can follow platform improvements without piecing together GitHub activity or package-specific notes. The changelog is organized around customer-facing product areas, so it is easier to see which changes affect app users, API integrations, developer tools, and processing behavior.\n\n### Platform (Studio)\n\n- Invoke Workflow steps are now typed end to end. Pick a target workflow and map each input it declares to a value, then reference the workflow's output fields and any files it generates from downstream steps with autocomplete. Inputs and outputs are checked when you save and when the step runs, so mismatches surface early instead of failing mid-run.\n- Runs that invoke another workflow now appear nested under their parent run in both the runs feed and the run timeline, and link straight to the sub-workflow's own run and trace.\n- You can view a workflow's inferred output schema (the fields and files it returns, typed from its own steps) without running it.\n- File inputs are preserved consistently across runs, reruns, reviewed examples, and dataset experiments, so reused runs and examples no longer lose or mispoint their files.\n- Creating new organizations and other Git-backed source operations stay reliable even during Git provider outages.\n\n### Public API\n\n- Run file inputs now use a consistent artifact model. Callers provide reusable files with `$fileId` or inline files with `$inline`, and EigenPal materializes them into run-owned artifacts before execution, reruns, promotion, and dataset workflows.\n- A new endpoint returns a workflow's inferred output schema without running it, as JSON Schema or as a TypeScript or Python type.\n\n### CLI\n\n- `eigenpal workflow schema <workflow>` prints a workflow's inferred output schema as JSON Schema, or as a TypeScript or Python type with `--format`.\n\n[View full release notes →](/releases/0.10.5)\n\n---\n\n## 0.10.4 (2026-06-25)\n\n### Platform (Studio)\n\n- Unify file list review surfaces\n\n---\n\n## 0.10.3 (2026-06-24)\n\n### SDK\n\n#### Patch Changes\n\n- e48cb81: Remove `fileVerdict` from run review correction types; file correction intent is encoded via `correctedArtifactPath`.\n\n---\n\n## 0.10.2 (2026-06-24)\n\n### CLI\n\n#### Patch Changes\n\n- ca9ae4f: Workflow inputs can declare an external file `source` (single-tenant on-prem). A `type: file` input with `source: &lt;name&gt;` (e.g. `gpfs`) is provided as a plain string id at run time; the worker resolves it to a file artifact via the configured source before the workflow executes.\n\n---\n\n## 0.10.1 (2026-06-23)\n\n### Public API\n\n- Polish reviews pages and group API reference nav\n\n### Infrastructure & processing\n\n- Client-shareable deployment architecture PDFs\n\n---\n\n## 0.10.0 (2026-06-23)\n\n### Platform (Studio)\n\n- Add simple runs review mode\n\n### Infrastructure & processing\n\n- Autogenerate chart architecture diagram from helm template\n- AWS/GCP/Azure Terraform examples with architecture diagrams\n- Helm chart + local kind for single-tenant on-prem\n\n---\n\n## 0.9.0 (2026-06-22)\n\n### CLI\n\n#### Minor Changes\n\n- c35d5d4: Clean up the public runs and evaluation API surface: move workflow eval operations onto automations, expose run scores/artifacts through the unified runs API, and update CLI/SDK helpers to use the canonical routes.\n\n Breaking: `runs.evalResults` and `GET /api/v1/runs/\\{id}/eval-results` are replaced by `runs.scores` and `GET /api/v1/runs/\\{id}/scores`.\n\n#### Patch Changes\n\n- c35d5d4: Clarify `--max-wait` help text so timeout exit behavior reads naturally.\n\n### SDK\n\n#### Minor Changes\n\n- c35d5d4: Clean up the public runs and evaluation API surface: move workflow eval operations onto automations, expose run scores/artifacts through the unified runs API, and update CLI/SDK helpers to use the canonical routes.\n\n Breaking: `runs.evalResults` and `GET /api/v1/runs/\\{id}/eval-results` are replaced by `runs.scores` and `GET /api/v1/runs/\\{id}/scores`.\n\n[View full release notes →](/releases/0.9.0)\n\n---\n\n## 0.8.0 (2026-06-18)\n\n### CLI\n\n#### Minor Changes\n\n- d620a00: Expose the clean public automation API around automations, runs, files/artifacts, datasets, evaluators, experiments, evaluation results, and run promotion. This intentionally breaks the pre-v1 SDK/CLI surface that exposed workflow- and agent-specific top-level resources outside the explicit legacy compatibility routes.\n\n > [!WARNING]\n > **Breaking change (pre-v1).** The workflow- and agent-specific top-level\n > resources have been removed in favor of a single automation-centric surface.\n > These packages are still 0.x, so this breaking redesign ships as a `minor`\n > bump. Update your integration before upgrading.\n\n #### Removed\n - Top-level workflow resources, e.g. `client.workflows.*`, including\n `client.workflows.executions.runAndWait(...)` and the rest of the\n `client.workflows.executions.*` tree.\n - Top-level agent resources, e.g. `client.agents.*` (runs, reviews, traces,\n files, expected artifacts).\n - Top-level source/git resources, e.g. `client.sources.*`.\n\n[View full release notes →](/releases/0.8.0)\n\n---\n\n## 0.7.2 (2026-06-13)\n\n### SDK\n\n#### Minor Changes\n\n- c5a709c: Public workflow list/detail responses include `apiEnabled` and `triggers`; run definition docs note workflow-only scope.\n\n---\n\n## 0.7.1 (2026-06-13)\n\n### SDK\n\n#### Patch Changes\n\n- 9db3f01: Expose `apiEnabled` and `triggers` on `AgentSummary` for runtime trigger projection.\n\n---\n\n## 0.7.0 (2026-06-12)\n\n### CLI\n\n#### Minor Changes\n\n- 963fd6c: Unify run detail on `GET /api/v1/runs/\\{id}`: return the canonical Run object directly (no `\\{ run: ... }` envelope) and merge expanded fields in-place via documented `expand` tokens. Remove the session-only `expand=internal` dashboard escape hatch; SDKs and CLI now use explicit expand lists.\n\n#### Patch Changes\n\n- 963fd6c: Update runs commands for the grouped run API shape and four expand tokens.\n\n### SDK\n\n#### Minor Changes\n\n- 963fd6c: Unify run detail on `GET /api/v1/runs/\\{id}`: return the canonical Run object directly (no `\\{ run: ... }` envelope) and merge expanded fields in-place via documented `expand` tokens. Remove the session-only `expand=internal` dashboard escape hatch; SDKs and CLI now use explicit expand lists.\n\n#### Patch Changes\n\n- 12c00d8: Docs: clearer wording in the file-input and TypeScript-runtime sections. No API or behavior changes.\n\n---\n\n## 0.6.17 (2026-06-12)\n\n### SDK\n\n#### Patch Changes\n\n- 716c3cf: Update the hosted default API base URL and API-key guidance from `app.eigenpal.com` to `studio.eigenpal.com`.\n\n---\n\n## 0.6.16 (2026-06-12)\n\n### CLI\n\n#### Patch Changes\n\n- 75dd64c: Internal refactor: move the skill tool registry into its own module so other tooling can import it. No change to any command, flag, argument, or output.\n\n---\n\n## 0.6.15 (2026-06-10)\n\n### CLI\n\n#### Minor Changes\n\n- ca87265: Unify workflow and agent run starts behind the canonical `/api/v1/run/\\{target}` endpoint, root `eigenpal run` / `eigenpal rerun` commands, and root SDK `client.run()` / `client.rerun()` methods.\n\n The old nested CLI commands and SDK resource methods for starting workflow or agent runs have been removed.\n\n#### Patch Changes\n\n- 5ea0bb5: `workflow dataset pull` gains `--example-id &lt;id&gt;` (repeatable) to export a single example or a selected subset of a dataset, instead of always pulling the whole dataset. The subset ZIP uses the same archive layout as a full pull, so it re-imports into any dataset via `dataset push --mode append`. Requesting an example id that does not exist for the workflow exits non-zero.\n\n### SDK\n\n#### Minor Changes\n\n- ca87265: Unify workflow and agent run starts behind the canonical `/api/v1/run/\\{target}` endpoint, root `eigenpal run` / `eigenpal rerun` commands, and root SDK `client.run()` / `client.rerun()` methods.\n\n The old nested CLI commands and SDK resource methods for starting workflow or agent runs have been removed.\n\n---\n\n## 0.6.10 (2026-06-08)\n\n### CLI\n\n#### Patch Changes\n\n- 99ca1b4: Unify agent and workflow run commands and SDK helpers on the shared `/api/v1/runs` API, including the public `client.runs` facade and regenerated SDK reference docs.\n\n### SDK\n\n#### Patch Changes\n\n- 99ca1b4: Unify agent and workflow run commands and SDK helpers on the shared `/api/v1/runs` API, including the public `client.runs` facade and regenerated SDK reference docs.\n\n---\n\n## 0.6.9 (2026-06-04)\n\n### SDK\n\n#### Minor Changes\n\n- 5e7c051: Add `observability` (phase timeline + structured failure) to workflow execution and agent run status API responses.\n\n---\n\n## 0.6.6 (2026-06-03)\n\n### CLI\n\n#### Patch Changes\n\n- 245f347: Clean up the agent CLI surface by removing obsolete compatibility commands, moving reruns to `agents rerun`, and replacing run pulls with canonical artifact fetching.\n- 5ab00ee: Tighten permissions on `~/.config/eigenpal/credentials.json` and its parent directory to owner-only (0600 / 0700). Previously the file was written 0600 but the parent directory inherited the user's umask (typically 0755), allowing other local users to list the directory and stat the file. The CLI now also re-tightens permissions on every write, so installs created with older versions are corrected on the next `auth login` / `auth use`.\n\n---\n\n## 0.6.4 (2026-06-03)\n\n### CLI\n\n#### Patch Changes\n\n- c3486a5: Fix agent git cutover QA findings: dashboard runs now navigate to the created run, inbound email aliases preserve mixed-case organization qualifiers, sandbox source materializes under `/workspace/agent`, run artifact downloads use direct paths like `/files/eigenpal.lock`, wait-for-completion responses include source provenance, and CLI wait/watch commands exit nonzero for failed or cancelled runs.\n\n### SDK\n\n#### Patch Changes\n\n- c3486a5: Fix agent git cutover QA findings: dashboard runs now navigate to the created run, inbound email aliases preserve mixed-case organization qualifiers, sandbox source materializes under `/workspace/agent`, run artifact downloads use direct paths like `/files/eigenpal.lock`, wait-for-completion responses include source provenance, and CLI wait/watch commands exit nonzero for failed or cancelled runs.\n\n---\n\n## 0.6.2 (2026-06-02)\n\n### CLI\n\n#### Patch Changes\n\n- d2202b6: List all agent runs for unqualified targets, and reserve source-ref filtering for explicit `@ref` targets.\n\n---\n\n## 0.6.0 (2026-06-02)\n\n### CLI\n\n#### Minor Changes\n\n- 2aeeaf2: Add native source `git save` and branch-aware `git release` flows for Git-backed builder workspaces.\n\n#### Patch Changes\n\n- 2aeeaf2: Complete the agent Git cutover with pluralized agent CLI commands, source-ref run support, lockfile metadata, and regenerated SDK/docs surfaces.\n- 2aeeaf2: Expose Git-backed agent source refs and public source automation APIs consistently across CLI docs and SDK facades.\n\n### SDK\n\n#### Patch Changes\n\n- 2aeeaf2: Complete the agent Git cutover with pluralized agent CLI commands, source-ref run support, lockfile metadata, and regenerated SDK/docs surfaces.\n- 2aeeaf2: Expose Git-backed agent source refs and public source automation APIs consistently across CLI docs and SDK facades.\n\n---\n\n## 0.5.12 (2026-06-02)\n\n### CLI\n\n#### Minor Changes\n\n- d3b0768: Add `control.fail` and `ai.classify` step types, plus the `expected/error.json` dataset assertion format.\n - `control.fail` terminates a workflow with a typed status code + message envelope. Optional `condition` template gates the fail. Compose with `ai.classify` to reject documents that match an undesired label.\n - `ai.classify` runs single-label closed-set classification through the existing extract LLM pipeline. Output is `\\{ label, confidence, reason }`, where `label` is constrained to the configured names.\n - `examples/&lt;name&gt;/expected/error.json` (mutually exclusive with `output.json`) lets eval examples assert that a workflow should fail with a specific `\\{ code, messageContains, step }`. The exact-diff evaluator scores 1 on match, 0 otherwise.\n - `eigenpal workflow validate` now catches `expected/error.json` shape issues and per-step config violations (e.g. `ai.classify` with fewer than two labels) at push time instead of deferring to runtime.\n\n Skill reference docs (`step-types.md`, `dataset-format.md`, `evaluators.md`, `workflow-yaml.md`) updated.\n\n#### Patch Changes\n\n- 99cad97: Skill reference (auto-generated from `WorkflowDefinitionSchema`) now documents the new `values` row for enum inputs, alongside the existing `items` row used by array inputs. Output-only doc refresh — no CLI behavior change.\n- d70f697: Document the `control.parallel`, `control.parallel_map`, `control.foreach`, `control.if`, and `control.block` step types in the bundled skill reference. The auto-generated catalog cannot render nested step shapes, so the YAML form, output access paths (e.g. `steps.&lt;parallel&gt;.output.&lt;branch&gt;.&lt;inner&gt;.&lt;field&gt;`), and scoping rules now live as hand-written prose. Also documents the multi-step iteration hazard: only the LAST inner step's output is keyed into each `items[i]` for `parallel_map` / `foreach` — end the body with a `transform.script` if you need to preserve intermediate fields.\n- ed2cde6: Fix `eigenpal workflow pull` writing a 0-byte file. The v1 single-workflow endpoint now returns the current YAML at the top level (`yamlContent`) via a new `WorkflowDetail` response shape, and the CLI throws a clear error instead of silently writing empty output when no version has been published. Also fixes adjacent regressions caused by the same picker: `workflow list` now shows the workflow name and version columns (previously always `-`), `workflow push --bump` reads the server's current version correctly, the \"did you mean?\" suggestion on a slug typo lists candidates again, and `workflow execution list` shows a duration column computed from the run start/end timestamps.\n\n---\n\n## 0.5.11 (2026-05-26)\n\n### CLI\n\n#### Patch Changes\n\n- 2958f4d: Fix Git-backed source smoke-test polish: hidden `git show` and `git sync` now accept bare agent slugs, and workflow scaffolds use the current `triggerMethods` YAML shape.\n\n---\n\n## 0.5.10 (2026-05-26)\n\n### CLI\n\n#### Patch Changes\n\n- aee7e0c: Add hidden Git source commands for editing trigger policy and encrypted secrets.\n\n---\n\n## 0.5.9 (2026-05-26)\n\n### CLI\n\n#### Major Changes\n\n- fadb59b: CLI command tree reorganized around the data model. Top-level surface is now\n `workflow`, `agent` (reserved), and `skill`; everything that operates on a\n workflow lives under `workflow`, grouped by sub-entity.\n\n Renames (clean break — no aliases):\n - `eigenpal exec &lt;slug&gt;` → `eigenpal workflow execution run &lt;slug&gt;`\n - `eigenpal clear` → `eigenpal workflow clear`\n - `eigenpal install-skill` → `eigenpal skill` (same interactive multiselect UX)\n - `eigenpal execution \\{get,list,watch,compare}` → `eigenpal workflow execution \\{…}`\n - `eigenpal workflow set-definition` → `eigenpal workflow push`\n - `eigenpal workflow get-definition` → `eigenpal workflow pull`\n - `eigenpal workflow set-evaluators` / `get-evaluators` → `workflow evaluators \\{push,pull}`\n - `eigenpal workflow set-dataset` / `get-dataset` / `list-examples` → `workflow dataset \\{push,pull,list}`\n - `eigenpal workflow run-experiment` / `get-experiment-status` / `get-experiment-results` /\n `get-eval-results` / `list-executions` → `workflow experiment \\{run,status,results,eval-results,list}`\n - `eigenpal workflow list-versions` / `restore-version` → `workflow version \\{list,restore}`\n\n[View full release notes →](/releases/0.5.9)\n\n{/* GENERATED:CHANGELOG_INDEX END */}\n"
24
24
  },
25
25
  {
26
26
  "topic": "cli/agents",
@@ -1492,6 +1492,20 @@
1492
1492
  "source": "public",
1493
1493
  "content": "---\ntitle: '0.20.57'\nversion: '0.20.57'\ndate: '2026-10-18'\ncommit: 'f5ed9261f2328e95787e647271780c5c27901ffe'\ndescription: 'EigenPal platform release 0.20.57'\n---\n\n- Internal improvements.\n"
1494
1494
  },
1495
+ {
1496
+ "topic": "releases/0.20.58",
1497
+ "title": "0.20.58",
1498
+ "description": "EigenPal platform release 0.20.58",
1499
+ "source": "public",
1500
+ "content": "---\ntitle: '0.20.58'\nversion: '0.20.58'\ndate: '2026-10-18'\ncommit: '690c382841c0e49c20cb8805250903b095a82320'\ndescription: 'EigenPal platform release 0.20.58'\n---\n\n- Internal improvements.\n"
1501
+ },
1502
+ {
1503
+ "topic": "releases/0.20.59",
1504
+ "title": "0.20.59",
1505
+ "description": "EigenPal platform release 0.20.59",
1506
+ "source": "public",
1507
+ "content": "---\ntitle: '0.20.59'\nversion: '0.20.59'\ndate: '2026-10-19'\ncommit: 'd8cf9335a6d7e4b11f87a265f3446922916050f9'\ndescription: 'EigenPal platform release 0.20.59'\n---\n\n## Platform (Studio)\n\n- Ship the nine-chapter credit-report prompt pack, including new market summary and peer analysis chapters, shared analyst writing guidance and fictional examples. Add bounded provider retries, resumable source-checked stages, a model merge with one independent review, native Word tables and source figures, and LiteLLM model routing for on-prem deployments. New sessions use the shipped prompts while restored sessions retain their selected version. Follow-up chat can edit the current Word document, preserving analyst changes, and request approved public research. Update DOCX editor packages to 2.31.0 and add sector-specific first-pass research guidance.\n- Keep document editing available consistently across the application and credit-report follow-up chat.\n"
1508
+ },
1495
1509
  {
1496
1510
  "topic": "releases/0.20.6",
1497
1511
  "title": "0.20.6",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eigenpal/cli",
3
- "version": "0.20.57",
3
+ "version": "0.20.59",
4
4
  "description": "Eigenpal CLI — author and run document workflows from your terminal. Agent-ready.",
5
5
  "keywords": [
6
6
  "eigenpal",