Documentation Index
Fetch the complete documentation index at: https://developer.kodexa.ai/llms.txt
Use this file to discover all available pages before exploring further.
Post-2026.4.1 patches — copy rules, source badges, multi-instance attribute paths
The week after the 2026.4.1 cut shipped a batch of reviewer-workflow polish, new V2 data-form components for promoting candidate values into canonical slots, and the under-the-hood refactor that finally derivesDataAttribute.path from parent + tag everywhere (closing out ENGG-5214). A handful of script-API and formula fixes ride along.Studio reviewer workflow:- Open Task is a primary button that opens a new tab — The activity-status dialog’s “Open Task” affordance was a small text link that closed the dialog on click. It’s now a primary
open-in-newbutton, opens the task route in a new browser tab viawindow.open, and leaves the activity dialog mounted so reviewers keep their context. - Activity dialog auto-zooms to the active step — Opening the plan tab no longer fits the whole graph; it focuses the running step (or the last terminal step on completed plans), falling back to
fitViewonly when there’s no anchor. A one-shot watcher covers the race where the dialog mounts before the layout finishes. - Attribute source badge: per-document-type instance numbering — The badge now shows “Bill of Lading #1, #2, #3…” independent of how many Invoices or other classified pages interleave between them, instead of the preprocessor’s global group sequence (which made every BoL in a doc read as the same number). Also fixes an off-by-one between
node.getPage()(0-based) and the resolver’s 1-based classification map that was making attributes anchored to page 2 read as page 1. - Filter in ag-grid column kebab menu — Column header menus on all ag-grid surfaces now expose ag-grid’s
columnFilteritem alongside sort/pin/etc, gated oncolumn.isFilterAllowed(). - Page-size selector no longer steals focus into row 0 (ENGG-5252) — Clicking the grid’s page-size selector previously opened the first row’s first-column dropdown on top of the page-size popup. The grid’s focus-redirect logic now ignores clicks landing in the pagination chrome.
v2:attributeCopyButton.relatedCopies(new) — The copy button now accepts an optionalrelatedCopies: [{sourceTagPath, targetTagPath}, ...]prop. After the primary copy lands, each related pair runs through the same copy logic, so promoting a weight from a candidate-weights grid intoshipments/shipweightcan carry the matching UOM intoshipments/shipweightuomin the same click.v2:attributeRowDeleteButton+v2:gridDeleteBySource(new) — Per-row inline delete cell + a sibling toolbar component that surfaces “Remove all<source>rows” buttons (one per detected source document) with a confirm dialog before bulk delete. Both share the same(document_type, group)resolver the source badge uses.v2:attributeSourceBadgeonv2:grid(new) —v2:gridgained acolumnsprop that mounts arbitrary V2 components as per-row cell renderers, alongside the existing taxon-driven columns. The newv2:attributeSourceBadgerenderer shows one colored pill per distinct(document_type, group)tuple of source attributes; click dispatchesworkspace.focusTagfor in-viewer navigation.v2:gridheightprop honored even with parent data object — Previouslyv2:grid’sheightwas silently dropped on any grid running under a parent scope (i.e. every form grid), forcing a row-count-based auto-calculation. An explicitheightnow always wins.- Form-level
copyRuleson DataFormV2 —DataFormV2now accepts a top-levelcopyRules?: TaxonCopyRule[]. Cards merge form-level rules with their own per-card rules (card-level wins onsourceTaxonconflict). Replaces having to repeat the same copy block on every source panel in forms with many source-document instances. - Formula-driven
stampAttributeson copy rules —CopyBehaviorOptionsgainedstampAttributes?: Record<string, string>for stamping derived audit/provenance attributes onto the copy destination. Values can be literal strings or${source.idString}/${source.parent.blnumber}/${source.parent.uuid}templates. Distinct fromcopyAttributes(which clones existing source attributes with content-tag preservation),stampAttributesinjects new derived fields with no content backing — useful for stampingsourceDocumentRef,sourceBolNumber,sourceDocumentTypeonto rows promoted into a canonical grid.
setAttributeroutes numeric taxon types toDecimalValue—setAttributewas only matchingDECIMAL, so writes againstNUMBER,INTEGER,CURRENCY, andPERCENTAGEtaxons fell through and stored the value inStringValue. The form’s numeric editor then read the typed slot and rendered empty even though.valueshowed the right string. The switch now covers every numeric taxon type the data model acknowledges, and routesSELECTION/URL/EMAIL/PHONE/SECTION/DERIVEDinto theSTRINGcase explicitly.addAttributeauto-resolves type from the taxon —addAttribute’sTypeAtCreationresolution now follows the same precedence assetAttribute:opts.typewins, then runtimeTaxonResolver, then the document’s cached taxonomies, then inference from the supplied typed-value field. Previously scripts callingaddAttribute({tag:"chargecode", stringValue:"DSC"})logged “filled” but the resulting attribute couldn’t bind to formSELECTIONdropdowns, the formula evaluator, or conditional-format rules. Choice betweenaddAttributeandsetAttributeis now about find-or-create semantics, not type safety.pathopt onaddAttributeis ignored with a warning — Paths have been derived fromparent + tagsince ENGG-5214; thepathopt was silently dropped before, nowlog.warns so callers can see they should drop it.SPEC.gono longer listspathas a valid option.- Script dirty tracking across nested data objects —
ScriptDataObjecttraversal now propagatesparentDocso attribute changes made on a nested object correctly mark the document dirty for downstream persistence.
- Empty group refs return an empty list (ENGG-5227) — Formulas like
sum({Accessorials/ChargeAmount})evaluated against a parent whose child group had no instances (e.g. all accessorial rows deleted) previously returned a"reference could not be found"error, and the recalculator skipped the write — leaving the previously computed Sum of Line Items on screen instead of zeroing it. The path resolver now returns[]for the empty-group case (matching the sibling branch’s existing semantics thatsum/min/max/avgrely on), and the formula explain panel stops surfacing “Reference X/Y could not be found” for empty groups. - Missing-reference errors null out the stored value (ENGG-5227) — When
EvaluateFormulareturns a newMissingReferenceError(distinct from syntax/runtime errors), the recalculator now nulls the attribute’s stored value fields and persists. Transient evaluation failures still preserve the previous value so they don’t blank legitimate output. DataAttribute.pathis derived everywhere (ENGG-5214 close-out) — Thepathcolumn has been dropped fromkddb_data_attributes; every read now routes throughGetPath()which composesparent.path + "/" + tagon the fly. Extraction, move, copy, formula reactivity, and the WASM serializer have all been migrated. External consumers reading attribute path from the JSON envelope are unaffected — the field is still emitted with the same value, just computed instead of stored. (The GoDataAttribute.Pathfield andpathOverrideargument onCopyDataAttributehave been removed.)
- Knowledge feature search hits
extendedPropertiesand numeric values — The “Filter by feature” popup’s?query=search runs against thesearch_textcolumn, which previously only indexed slug + string-valuedProperties. Human-readable labels stored inExtendedProperties.namewere never matched, and numeric scalars (e.g.shipperCode: 1540) were silently dropped — typing “JSP” returned zero matches even though chips render the full “JSP International - Legacy” name.BuildSearchTextnow walks bothPropertiesandExtendedPropertiesrecursively, stringifying every string/number/bool scalar; a companion migration rebuildssearch_textfor every existing row so environments don’t have to re-save each feature.
loadTaxonomyreads structured metadata, not staleyaml_source— The script-engine adapter was readingkdxa_taxonomies.yaml_sourceand re-parsing YAML.yaml_sourceis a round-trip snapshot that drifts behind the structuredmetadatacolumn whenever a client (kdx sync push, platform PUT) updates the taxonomy without rewriting the YAML. Scripts then validated taxon paths against the stale text, surfacing as"taxon path X does not exist in taxonomy Y"in plans that referenced recently added taxons. The adapter now readsmetadata::textand parses the JSON viayaml.v3(which handles JSON as YAML 1.2).
Release 2026.4.1
Rollup of every customer-facing change between 2026.4 and 2026.4.1. The largest items: a new CDC Data Lake that mirrors every metadata change and document delta into S3, a Page Groups picker in the document viewer that lets reviewers jump straight to each classified section of a multi-document PDF, declarative keyboard shortcuts in V2 data forms, and a reshaped Take Next API that finally distinguishes “nothing to do” from “filtered out by team” from “lost the race.” A long tail of validation, formula, and extraction fixes ride along.Already documented separately: activity-plan scripts can spawn follow-up Activities (the 2026-05-26 entry — it’s also part of this release).Studio reviewer workflow:- Page Groups picker on the document viewer — A new
file-multiple-outlinebutton in the spatial toolbar opens a popover listing each classified physical document on the open file (e.g.Invoice — Pages 1–3,Delivery Receipt — Pages 4–6), with a taxon-colored swatch and click-to-navigate to the start of each group. Built on top of the preprocessor’s per-page classifications + group UUIDs (below) and the existingtagMetadataMapso the labels and colors match what the rest of the UI shows. - Spatial toolbar cleanup — The Show Advanced (
wrench), Developer Info (i), and Page Groups buttons now sit before the find-text input so narrow document panels don’t wrap them onto a second line. - Kiosk: step-out confirm before fetching next work — Reviewers leaving a kiosk task now get a confirm prompt before the next task is auto-claimed, preventing the accidental “I just finished but the next one already opened” race.
- Require a comment on task-template actions (new) — Task-template actions can now declare
requireComment: true(with an optionalcommentPromptstring). When the reviewer clicks the action, a shadcn dialog opens for a mandatory comment before the action runs; cancelling aborts the action with no partial state. The comment rides the existing/api/batch-updatepayload astask.completedActionCommentand is persisted server-side as aCOMMENTtask activity tagged with the action’s UUID so the timeline can link the comment back to the action that produced it. See Requiring comments on actions for the full recipe. - Take Next API: EMPTY envelope replaces 204 (ENGG-5208) —
POST /api/tasks/assign-nextpreviously returned a bare 204 in three distinct situations: nothing queued, filtered out by team, or claim race. The endpoint now always returns 200 with a typed envelope and a reason code (EMPTY,FILTERED_OUT,CLAIM_LOST) so the UI and external integrations can react appropriately. TheprojectIdparameter is also now required and the team filter is enforced for platform admins (ENGG-5209). Integrators that relied on the old 204 will need to update. - Task lock decoupled from document family lock — A task’s lock no longer takes out the entire document family. Multiple reviewers can now work different tasks against the same document concurrently when the task-status policy permits. Existing locking behaviour is preserved for status types that explicitly opt into
lockDocumentFamily. - Faceted filtering across grids — Tasks, Task Groups, Activities, and other primary grids now support faceted filtering by document-family feature + the family itself, surfaced through a shared
KodexaGridFacetBarcomponent. Saved filter state survives navigation. - Activities grid: file-name filter clears on task completion — Completing a task no longer leaves a stale file-name filter on the activities grid.
- Team slug surfaced in grids and forms (ENGG-5185) — Team slugs are now visible in team listings and editable in create/edit forms, matching the slug-everywhere convention used by other resources.
-
Declarative keyboard shortcuts (ENGG-5244, new) — V2 forms can now declare a
shortcuts:array at the top level. Each entry binds a key combination to a named script and is registered under a per-form scope, so a form resets all of its shortcuts every time it mounts with no manual cleanup. See Keyboard Shortcuts for the schema, lifecycle semantics, and worked examples. -
Bridge navigation actions (ENGG-5244) —
kodexa.navigation(the bridge namespace shortcut scripts call) now has realsetPage(page, documentFamilyId?),getCurrentPage(...), andgetPageCount(...)methods alongside the existingfocusAttribute(...). Spatial methods are 1-based externally and route to the document viewer for the form’s first document family by default. See Bridge API & External Services → kodexa.navigation. -
Markdown editor scroll restored — Internal scroll is back on the markdown editor, capped at 1.5×
--editor-heightso the editor no longer takes over the page on long content.
- Preprocessor: canonical taxon-path tagging (ENGG-5240) — When the preprocessor is configured with a
taxonomy:option, the LLM-returneddocument_typelabels (e.g. “Bill of Lading”) are translated to canonical taxon paths (billoflading) before pages are tagged. This makes the preprocessor’s page tags match what downstreamkodexa/llm-taxonomy-modelwrites, eliminating the duplicateInvoice+invoicetag instances that were appearing in reviewer-facing UI. The original LLM-returned label is still kept as apreprocessor.document_typefeature. Existing plans withouttaxonomy:set are unchanged. - Preprocessor: multi-page group on the tag — Page tags now carry
groupUUID(deterministic persource_page.group) andvalue(the sequence within the group), so consumers reading tags alone can reconstruct which pages belong to the same physical document. The existingpreprocessor.groupandpreprocessor.sequencefeatures are kept for backward compatibility. - Spatial copy: cluster by line before sort (ENGG-5205) — Multi-line copies from the spatial viewer were occasionally returning words in the wrong order when lines overlapped on the Y axis. The spatial sort now clusters by line first so copied text reads in natural order.
- Default copied attribute path (ENGG-5214) — Copying an attribute to a different parent now defaults the new path / tag to the destination object’s own path, instead of carrying the source’s path forward.
- Formula reactivity scoped to lineage owners (ENGG-5195) — Conditional-format and formula reactivity now routes to the lineage-scoped owner instead of fanning out across the document, which removes the perceived “everything recomputes” lag on edits in deep tag hierarchies.
- Conditional formats batched per owner —
EvaluateAllConditionalFormatsBatchis now gated on the conditional-format owner set, fixing intermittent integration-test timeouts and reducing wasted work in kodexa-ui. - Reactive validation group rules + auto-derived exception path — Group-level validation rules now re-evaluate reactively when their inputs change, and exception paths are derived automatically so authors don’t have to maintain them by hand.
- Knowledge-feature taxon refs use canonical ExternalName chain (ENGG-5221, ENGG-5222, ENGG-5223) — Several long-standing inconsistencies between the path used to look up a taxon and the path stored on dependency graphs / init-paths / refresh validation have been aligned to the canonical
ExternalNamechain. Symptoms that should now stop: stale validation results after a tag refresh, formulas resolving to the wrong taxon when org slugs were nested, init paths failing to find selection options after an external-name change. The WASM attribute-value bridge also now returns type-aware values (numeric, boolean, date) instead of always-string. - Absolute formula refs require leading slash (ENGG-5221) — Formula references intended as absolute (across taxonomies) must now start with
/. Existing absolute refs that already had the leading slash are unchanged; ambiguous refs that worked accidentally before will now be treated as relative.
STORAGE_LAKE_BUCKET configuration.- Envelopes under
entities/mirror everykdxa_metadata_auditwrite (an audit row is created for every create/update/delete of AbstractMetadata-managed resources — task templates, knowledge sets, activity plans, etc.). - Activity envelopes under
activities/mirror every activity status transition, with rolled-up step errors and deferred publish until the originating database transaction commits (ENGG-5231) so no half-applied state leaks to the lake. - Step / step-document envelopes carry full
errorDetails(ENGG-5235), so analytics dashboards can surface the actual exception message and stack from a failed step without re-querying the source database. - Content-objects under
content-objects/are populated from the KDDB projection onCONTENT_CREATED, giving the lake the post-Apply view of every data object the orchestrator persisted. - Batch context ships task-template ref + work-session context on every batch envelope (ENGG-5202 phases 1–3), so audit / analytics consumers can correlate every change back to the user session that produced it.
- The schema is intentionally append-only; rebuild scripts and a
CHANGELOG.mdunderkodexa-cdc-lake/document the supported event shapes and projection logic.
- AbstractMetadata audit log (ENGG-5150) — A
kdxa_metadata_audittable now records every create/update/delete on AbstractMetadata-managed resources (task templates, knowledge sets, knowledge items, knowledge item types, knowledge feature types, knowledge features, activity plans, prompts, data forms, data definitions). Each row carries the actor, source IP, work-session ID, and a JSON snapshot of the change. Append-only enforced at the DB level. - Generic slug auto-generation + uniqueness — Any AbstractMetadata resource created without a slug now gets one auto-generated from its name, and a
UNIQUE (organization_id, slug)index is enforced on ten audited tables. Nested org refs are resolved on every create/update so manifests can reference an org by ID, slug, or full URI. - Knowledge create/update polish — Knowledge Item creates now populate
slugandknowledge_set_slugcorrectly. Duplicate-key responses now return a clear 409 with the conflicting field instead of a 500 (PX-10).name↔set_nameandtype↔set_typeare mirrored inBeforeCreate/BeforeUpdateso legacy clients writing one form see consistent reads on the other.
- Document-family features in tasks / groups / links datasets — The
tasks,task_groups, andtask_group_linksdatasets exposed via the analytics view now include each row’s owning document family features (knowledge features attached to the family), so reports can group / pivot by feature without joining a separate feed.
- Email extraction from non-standard claims (ENGG-5203 phase A / A.1) — Login no longer fails for users whose ID token lacks a standard
emailclaim. We now check standard OIDC claims, namespaced Auth0 claims, and finally fall back tokdxa_userslookup by sub. - Work-session start time on /api/batch-update (ENGG-5203 phase B) — The UI now sends
userWorkSession.startedAt(the actual session start) instead of the deadtransactionStartfield that defaulted to the current time. Audit rows that previously showed every change as starting “now” now carry the correct session boundary.
- Pop-out keeps main tab as WASM owner — Opening a document in a pop-out window no longer transfers WASM ownership; the main tab stays authoritative and the pop-out reads through.
- Sidecar heartbeat tightened — Heartbeat now counts only actual ping responses, not noise from other event types, so disconnect detection is more reliable on slow networks.
Activity-plan scripts can spawn follow-up Activities
A SCRIPT step’s return value can now include anextActivity block that asks the platform to start another Activity Plan when the current Activity completes. Use this to chain related workflows — intake → extraction, classification → enrichment, validation → posting — without an external orchestrator.-
Return shape: alongside
actionand the existingfeaturesarray, scripts can now return: -
Deferred spawn: the new Activity starts when the current Activity reaches
COMPLETED, not at the moment the script returns. Multiple SCRIPT steps in one plan may each emit their ownnextActivityand they fan out at completion in step insertion order. -
Same-project only for v1. The target plan must already be bound to the current project via
project_resources. Cross-project spawns are rejected. -
Inheritance: when
documentFamilyIdsis omitted, the spawned Activity inherits the source Activity’s document families. Server-controlledtriggerMetadata(sourceActivityId,sourceStepId,sourceActionUuid,sourceProjectId) is always merged in last so the audit trail can’t be spoofed; the spawned Activity’striggerKindisACTIVITY_COMPLETED. -
Soft failure: spawn errors (missing plan, FGAC denial, input validation failure) leave the source Activity completed and record the reason in
script_result.nextActivityError. On success,script_result.nextActivityIdpoints back to the new Activity. -
Feature attachments:
nextActivity.featuresis applied to the named document families immediately, before the spawn fires, so the new plan’s templates and scripts see them via the existing template context.
Task Groups, the New Activity experience, and knowledge in scripts
This release rounds out the Activity-centered workflow model. Reviewers can now batch related work into Task Groups; the New Activity surface replaces the old New Task entry points; activity plans get a richer editor; and activity-plan scripts gain a first-classknowledge global.Task Groups (new):- Bundle tasks into a single assignment unit — Select related tasks from any Tasks tab and use Create task group to wrap them under one name, description, priority, status, assignee, and team. Members work the group as a unit instead of picking off individual tasks.
- Groups tab and kiosk Take-Next — Each project and organization now has an always-on Groups tab. Reviewers can claim the next eligible group from the kiosk widget without manual selection, and the workspace opens a guided drawer with auto-advance between member tasks and a completion summary.
- Slide-over detail panel — Clicking a row opens a side panel that manages status, assignee, member tasks, history, and delete in one place. The Tasks grid now shows a clickable group chip on grouped rows so you can jump straight to the panel.
- Permission-gated — The Groups tab and Take-Next kiosk action appear only when the viewer’s role permits them.
- New Activity is the primary CTA — Workflow org-home and project-home Activities tabs now lead with New Activity (replacing the old “New Task” button). Project Home adds a split-button so you can start an Activity or kick off a Job Run from the same control.
- Two-step Activity wizard — Pick a project, pick an activity plan, then fill in title, description, priority, and documents on the same form. Document upload is inline; AI naming proposes a title from document content when enabled.
- Activity Plan editor — Visual editor with tabs, schema-driven properties panel, manual layout with persisted positions, slug shown under each step’s name, action-qualified edges, badges auto-generated from module refs, and per-step Cancel and Reprocess actions. Plans get a delete action consistent with task templates.
- Document Families on Activities — Activities own their document families directly. The new
GET /api/activities/{id}/steps/{stepId}/document-familiesendpoint returns the documents touched by a step. CREATE_TASK steps automatically copy the activity’s document families onto the task they materialize, so review surfaces always have the right context.PATCH /api/activities/{id}/steps/{stepId}is also available for step updates. - Activity steps in the API —
GET /api/activities/{id}now embeds the full step list in the response.
knowledgeglobal in script runtime — Activity-plan SCRIPT steps and routing scripts now expose aknowledgeobject scoped to the script’s permitted document families:knowledge.getFeatures(familyId)andknowledge.getItems(familyId)return the raw feature and item instances on a familyknowledge.featuresByType(familyId, featureTypeRef)andknowledge.itemsByType(familyId, itemTypeRef)filter by type- When the script operates on a single family,
knowledge.features/knowledge.itemsreturn that family’s data directly - Features and items are enriched with their full type definitions and frozen, so scripts can read everything they need without separate lookups and can’t accidentally mutate the source data
- See the Scripting — Knowledge bindings guide for usage patterns.
- Knowledge Sets, Knowledge Items, Knowledge Item Types, Knowledge Feature Types, and Knowledge Features can now be created, updated, and referenced by
orgSlug+slug(oritemTypeRef/featureTypeRef) on every create and PUT path. Manifests no longer need internal UUIDs to round-trip. - The resource resolver supports a new
knowledge-item://URI scheme. /api/knowledge-features?query=now actually searches feature name, type name, and description (previously narrowed the result set incorrectly).
- Step dots on document family cards — Document family cards now show a row of dots indicating each activity step’s state for that document. Hover for the step name and status; click an activity to open it. The same display appears in document grids via the activity cell renderer.
- Per-document activity data is batch-fetched, so even large document lists open without per-row API churn.
- Workstreams tab removed — Project navigation no longer shows the legacy Workstreams tab.
- Resources panel — The Studio resources panel now surfaces task templates and activity plans alongside other project metadata.
- Org-level activities — Activities filter by
lifecycleStateinstead of the removedstatusfield; the old org-home Activities tab variant has been retired in favor of the unified grid.
- Feature palette includes a search box and caps at 30 visible items at a time, so palettes with many feature types stay usable.
- The Applications tab shows a document family + content object inspector so you can drill into the source content behind a knowledge feature.
- Knowledge Features get a reworked card layout and detail overview, with feature properties and
extendedPropertiesexposed to AI naming templates.
- Clearing a SELECT now nulls the value — Clearing a selection-type attribute properly clears its underlying value (not just the display string), so dependent formulas, conditional formats, and validators react correctly.
- “Edited Value” indicator on clears — When you clear an AI-extracted value, the form now marks the cell as user-edited so the next extraction pass won’t silently overwrite it.
- Better grid editing feedback — Invalid Number cells show a focus ring while focused; grid Add no longer freezes the row gate; autocomplete dropdowns match by substring (not just prefix); SELECT popovers stay open across ag-grid cell destroy/recreate.
- Formulas re-evaluate when the data-object cache refreshes, so derived values follow upstream edits without a manual refresh.
- Faster project load — Project resources are now fetched in bulk with deduplicated module wiring, and a no-op assistant-connections endpoint has been removed from the load path.
- Channel-scoped workspace blob store keeps chat attachments and drafts per channel.
- Conversations continue across sessions via SessionStore continuation, so picking a chat back up doesn’t reset context.
- Task-scoped chats now see the task’s document store refs.
- Module refs can use a
{org}placeholder so plans are portable across organizations.
- Activity lifecycle now lives on
Activity.lifecycleState(DRAFT,RUNNING,PAUSED,COMPLETED,CANCELLED,FAILED). The previousActivity.Statusfield has been retired; existing data is migrated automatically. Update integrations that read the old field. - Activity step
kindis nowtypeacross the database, API, and UI (EXECUTION,SCRIPT,BRIDGE_CALL,CREATE_TASK,APPROVAL,LLM,AGENT). Existing rows are migrated; new activity-plan YAML should usetype. /api/planshas been retired now that the UI runs entirely on/api/activities. The OpenAPI spec has been regenerated with 20 previously-undocumented routes added — point external integrations at/api/activitiesand refresh generated SDKs.
Activity-centered workflows, reactive validation, and richer operations tooling
This release continues Kodexa’s move to an Activity-centered model for document-heavy business processes. Activities represent the business process run. Tasks represent the human review, correction, approval, or exception work that happens inside that run.New Features and Improvements:- Activities as first-class workflow runs — Activity Plans, Activity runs, and Activity steps are now the primary model for orchestrating automated work, human review, integrations, and audit history. Activity detail APIs now include step data so user interfaces and integrations can show the run and its materialized work together.
- First-class Service Bridge steps — Activity Plans can call configured Service Bridges as workflow steps. Request method, URL, body, response body, and result details are captured with the step so teams can review and troubleshoot external system calls without leaving the workflow.
- Activity authoring improvements — The flow editor now supports manual layout, persisted node positions, connection labels, context menus, compact step palettes, Service Bridge nodes, schema-driven configuration, and project/intake bindings.
- Per-document execution visibility — Execution details now surface at the document-family and step level, including active or failed steps, logs, execution IDs, and error details for faster operational review.
- Reactive Data Definition validation — Changes to data definitions, selection options, conditional formats, validation rules, and document data now trigger scoped revalidation. Matching exceptions are created, closed, or reopened as the document moves in and out of compliance.
- Richer exception review in Data Forms — Review surfaces now show more complete exception detail, filter open exceptions consistently, support override metadata and support article references, and can scope actions to specific exception paths.
- Knowledge snapshot review — Knowledge Sets now include snapshot panels, feature chips, and visual diffs so teams can review knowledge changes before and after updates.
- CLI and GitOps improvements —
kdx syncnow preserves project-resource links more reliably, records sync state for task templates, annotates manifest project keys with readable names, sorts legacy associations deterministically, and supports pre-packagemetadata.buildhooks. A newkdx secretcommand adds organization secret management from the CLI. - Document handling improvements — Preprocessing can correct document rotation and summarize documents. The document viewer now handles processed PDFs and rotated spatial overlays more consistently.
- Operational observability — Platform errors, upload failures, subscription failures, and Activity/execution status changes now emit sanitized structured events for better monitoring without exposing sensitive request data.
metadata.moduleRuntimeParameters. Update any module YAML still using modelRuntimeParameters.Script API consolidation, document-resident taxonomies, and shared script helpers
Three related changes ship together. The first is breaking; the rest are additive and unlock smaller, more maintainable scripts.1. Script API consolidation (breaking change)The JavaScript API for intake scripts, planner script steps, taxonomy event subscriptions (browser and Python contexts), and module scripts has been modernized onto a single canonical surface. Scripts written against the legacy API need updating.- Method names are now camelCase.
currentObject.GetFirstAttributeValue("foo")→currentObject.getFirstAttributeValue("foo"). Same rule for every method oncurrentObject,document, attributes, and content nodes. Scripts using PascalCase fail withTypeError: Object has no member 'GetFirstAttributeValue'. bridge.data.*is removed.bridge.data.setAttribute(currentObject.GetID(), name, value)collapses tocurrentObject.setAttribute(name, value).bridge.data.getAttribute(...)collapses tocurrentObject.getFirstAttributeValue(name). Calling the removed surface throwsbridge.data is undefined.log()is now structured. Replacelog("info", "msg: " + x)withlog.info("msg:", x).log.warn,log.error, andlog.debugfollow the same variadic shape (args joined with spaces, likeconsole.log). Callinglog()positionally throwslog is not a function.getType()on content nodes is renamed togetNodeType(). Scripts iterating selector results and reading the node type need a one-word find/replace.serviceBridge.list()is removed. Discovery now lives in the platform admin surface; scripts reference bridges by known"orgSlug/bridgeSlug"refs.
doc.getOrCreate(path)/obj.getOrCreateChild(path)— find-or-create idempotent. Replaces thefindFirst → if null createpattern.obj.setAttribute(name, value)— find-or-create on an attribute and write a typed value in one call.obj.payload({ key: "attrName", ... })— extract a JS object suitable forserviceBridge.callpayloads. Missing attributes default to"".taxon.optionLabel("taxonName", value)— look up the human label for a selection-option value. Replaces hardcoded label maps in event scripts.- Default
pathandownerUri— write methods (addAttribute,copyAttributeFrom, etc.) derivepathfromparent.path + "/" + tagandownerUrifrom the runtime’s script context. Specify only when overriding.
setAttribute(name, value) now resolves the attribute’s type from the document’s cached taxonomies — scripts no longer need to declare type: "SELECTION" (or any other type) on writes. The resolution chain is: VM-supplied resolver → document’s cached taxonomies (loaded by extraction) → fallback inferred from the JS value’s runtime type."orgSlug/moduleSlug" form. Module declarations (loaded as functions/vars) land on the global scope and behave like any other helper in the main script.4. CLI: metadata.scriptPath for module YAMLModule YAML can now reference an external .js file via metadata.scriptPath; kdx sync push reads the file and inlines it into metadata.script at deploy time:contents: block — kdx skips the implementation zip-and-upload path entirely and logs 📜 Module {slug} is inline-script only — skipping implementation upload.Existing modules with inline metadata.script or a populated contents: block are unaffected.Platform Updates — Mid April 2026
New Features:- Markdown Image Paste — Markdown editors now support Cmd/Ctrl+V image pasting and drag-and-drop. When editing knowledge items, pasted images are automatically uploaded as knowledge set attachments and referenced via portable
attachment://URLs. In standalone contexts, images are base64-encoded inline. - Selection Option Formulas — Data definitions now support formula-driven selection options with a formula mode toggle and extended fields, enabling dynamic dropdown values computed from other attribute values in the document.
- Exception Override — Data forms now support overriding validation exceptions directly from the workspace with WASM persistence and a form-scoped exception details panel.
- Tab Key Grid Navigation — Tab key now navigates between input fields in grid cells for faster data entry.
- Filterable Knowledge Tables — Markdown tables rendered in knowledge sections now include a search bar for filtering rows.
- Service Bridge Status Override —
postReplyScriptcan now override the HTTP response status code returned by a service bridge endpoint. - Intake and Label URI Schemes — The API resolver now supports
intake://andlabel://URI schemes for resource resolution.
- YAML Round-Trip Preservation —
kdx sync pullnow preserves YAML comments and formatting using a newyamlpatchengine. Pushed resources include the original YAML source for lossless round-trips. - Smart Discover Merge —
kdx sync pull --discoverintelligently merges newly discovered resources into existing YAML files, preserving comments and manual edits. - Attachment Download —
kdx sync pullnow downloads knowledge set attachments alongside metadata. - Discover Directory Flag — New
--discover-dirflag sets themetadata_dirin the generated manifest during discovery. - Conflict Detection — Sync state tracking detects when remote resources have changed since the last pull, with a
--forceflag to override conflicts. - Cross-Org Push —
kdx sync pushrewrites organization slug references in YAML values when pushing to a different organization. - Dependency-Aware Push — Resources are pushed in dependency order to avoid reference errors during deployment.
- Parallel Pull/Push — Sync operations now run in parallel for faster execution.
- Legacy Server Compatibility — Improved compatibility with older Kodexa servers including paginated API responses, case-insensitive slug matching, and fallback resource fetching.
- Optimistic Locking — Tasks, document families, and batch updates now use change-sequence-based optimistic locking to prevent concurrent modification conflicts.
- Service Bridge Observability — Service bridge proxy calls now emit Datadog events with request and response body details.
- Selection Formula Scoping — Selection formula evaluation is now scoped to ancestor data objects for more predictable results.
- Auto-Select Single Option — Dropdown fields with a single available option are automatically selected when the field is empty.
- Attribute Editor Consistency — Attribute editors now emit updates on blur rather than on every keystroke, reducing unnecessary saves.
- Readonly Field Styling — Readonly form fields are now visually distinguished with a border and muted background.
- WASM Binary Size — The WASM binary has been reduced by 20.8% by removing unused expression engine dependencies.
- Detached Sidecar Toolbar — The detached sidecar window now includes the full document toolbar and page navigation.
- Fixed service bridge calls not re-firing when dependency values changed.
- Fixed selection options formula toggle not responding to clicks.
- Fixed missing formula attribute references causing errors instead of resolving to nil.
- Fixed document store table view checkbox selection and row click behavior.
- Fixed chat session loading failing when reopening an existing conversation.
- Fixed LLM JSON response preprocessing to handle truncated or malformed responses.
- Fixed task locking and auto-lock behavior in plan advancement.
- Fixed form freeze, dropdown UX glitches, and validation timing issues in data forms.
- Fixed inline grid editing focus loss when attribute data updates arrived.
- Fixed extracted selection values being accepted even when not in the dropdown options list.
- Fixed GoJA script runtime not persisting
AddChild,SetTaxonomy,SetPath, and attribute mutations to the document.
Platform Updates — Early April 2026
Improvements:- Scoped Document Reprocessing —
POST /api/document-families/{id}/reprocessnow accepts an optionalassistantIdsrequest body. When omitted, the platform auto-detects prior assistant contributions and reprocesses the family asynchronously. - Document Family Feature Filters — Document families can now be filtered through attached knowledge-feature relationships such as
features.id=='...'andfeatures.slug=='...'. - Module Package Selection — Python runtimes now honor
metadata.moduleRuntimeParameters.modulewhen a module archive contains multiple packages, ensuring the intended package is imported before execution. - Completion Event Chaining — Applying an execution’s
completeLabelnow emits a follow-upCONTENT_CREATEDevent so downstream subscriptions can react to the finalized content.
Platform Updates — Late March 2026
New Features:- Intake API Tokens — Intakes now support scoped API tokens for machine-to-machine authentication. Create tokens on the new API Tokens tab; each token authenticates directly against a specific intake endpoint without requiring user credentials. Tokens are hashed at rest with SHA-256.
- Detachable Sidecar — Pop out the sidecar document viewer into a separate browser window using the detach button. The inline sidecar collapses while the external window is open and automatically restores when the external tab is closed.
- Smart Grid Filters — All grid views (tasks, projects, document families, etc.) now include a unified search bar with recent query history, structured filter mode with metadata-aware autocomplete, and AI-powered natural language filter generation.
- Script Step Log Viewer — Script step logs are now captured in CloudWatch and viewable directly from Activity step details. Each script execution automatically records start/end entries and all
log()calls. See Script Steps. - Knowledge Expression Trees — Knowledge sets now support expression-based feature matching using AND, OR, and NOT operators, replacing the previous clause-based system. This enables more flexible conditional logic for knowledge assessment. See Knowledge System.
- UNO Document Converter — New module runtime for converting Office documents (Word, Excel, PowerPoint) via LibreOffice/UNO. Available as
kodexa/uno-runtime. See Module Runtimes. - LLM Model Manager — New Python SDK
ModelManagerclass provides unified access to all LLM models through the Kodexa AI Gateway. Supports text completion, function calling, streaming, thinking mode, and multimodal input. Replaces direct provider SDKs with a single gateway client. See LLM & Model Manager. - AI Grid Extraction — Data forms using
v2:gridlayout now support AI-powered grid extraction with word-level node tagging for more accurate table data capture. See Data Forms Extraction. - Direct Extract — New
allowDirectExtractoption on data form attribute editors lets users copy values directly from the document text without an AI call. See Data Forms Extraction.
- CLI Re-Authentication — The CLI now automatically prompts for re-authentication when it encounters a 401 response, instead of failing. See CLI Authentication.
- Access Token Security — API access tokens are now hashed at rest using SHA-256. The profile access tokens UI has been redesigned with confirmation dialogs before deletion and tokens scoped to the current user.
- Module Ref Rename — The bridge script parameters
model_storeandmodel_optionshave been renamed tomodule_refandmodule_optionsfor consistency. See Module Runtimes. - Datadog Observability — New instrumentation events for agent runtimes, agent instances, and LLM calls in the AI Gateway for Datadog monitoring.
- Execution Cancel — The execution cancel button in the UI is now wired to the API endpoint.
- Taxonomy → Data Definition — The UI label “Taxonomy” has been renamed to “Data Definition” across resource badges and labels for consistency with the platform terminology.
Platform Updates — March 2026
New Features:- Agentic Assistants — A new assistant role that delegates processing to AI agents. Configure an agent runtime, module references, and a natural language prompt to let the agent autonomously decide how to process documents. See Assistants.
- Intake Enhancements — Intakes now support JavaScript scripting for file validation and metadata enrichment, task template integration for auto-creating tasks on upload, multi-file uploads, knowledge feature assignment, and processing metadata.
- Activity Workflow Enhancements — New SCRIPT and AGENT step types. SCRIPT steps run inline JavaScript for conditional routing. AGENT steps spawn AI agents in workflow execution. Action-qualified dependencies enable conditional branching (e.g., proceed only on “Approve”). Activity runs display as interactive DAG flow visualizations with automatic deadlock detection.
- AI Task Naming — Task templates can configure LLM-powered naming so tasks receive descriptive titles based on document content.
- Notification Sounds — Toggle audio notifications for error/warning toasts and new channel messages from your profile preferences.
- Document Native Download — New
GET /api/document-families/{id}/nativeendpoint returns the original uploaded file. See Download original native file. - Execution Log Viewer — Restyled with syntax highlighting, auto-scroll, copy and download buttons, and dark theme enforcement.
- Progress Toasts — Consolidated progress notifications for document uploads and batch reprocessing operations.
- Secrets API — Secrets are now managed through organization-scoped endpoints (
/api/organizations/{orgId}/secrets) with secure encrypted storage. - Resource Resolver — Three new project-scoped schemes:
task-status,task-template, andassistant. See Components and Structure. - CLI Resource Resolution —
kdx applynow resolves project-scoped resources (task statuses, task templates, assistants) with thescheme://org/project/slugURI format. - AI Gateway — Extended model metadata with pricing, description, and classification fields. Cloud models now proxy through the AI gateway.
- Store Reprocessing — Reprocess documents within a store with assistant selection and filtering.
- Document Groups — New
hardMaxPagesfield to enforce a hard page count limit at upload time.
KDX CLI v2026.3.0 (Pre-release)
This version is currently available as a pre-release. Install via
brew install kodexa-ai/tap/kdx-dev to try it out.- Apply Ordering Fix: Fixed an issue where
kdx applyfor modules would overwrite metadata changes. Implementation uploads now happen before metadata PUT, ensuring inference options and other metadata updates are preserved. - OpenAPI Resource Discovery: Manual resource definitions now properly override OpenAPI-discovered resources, preventing bogus CRUD paths from being generated for document-stores and other hyphenated resource types.
- Hyphenated Resource Types: Fixed resource discovery for
data-store,data-definition, anddocument-storeby normalizing hyphens and underscores in resource lookup. - Deploy Failure Reporting: Deployment failures are now properly surfaced with error counts and non-zero exit codes, instead of silently reporting success.
- ID Stripping on Create: The CLI now strips
idand_idfields from CREATE payloads since IDs are server-generated, preventing conflicts during resource creation.
- E2E Test Suite: Added comprehensive end-to-end tests covering document family reprocessing, knowledge-set CRUD and resolution, module upload/download, and CLI-to-API integration.
- Filter Syntax: Updated to SpringFilter DSL syntax for resource filtering, with syntax reference added to
kdx get --help. - Sort Parameters: Standardized sort parameter format across all commands.
- Module metadata (inference options, configuration) is now reliably preserved during
kdx applyoperations kdx sync deploynow correctly reports failures and returns non-zero exit codes for CI/CD pipelines- Resource operations for hyphenated types (data-store, document-store, data-definition) work reliably
brew install kodexa-ai/tap/kdx-devKDX CLI v2026.2.1
Bug fixes for project-scoped resource syncing and OpenAPI spec parsing:Bug Fixes:- Project-Scoped Resource Sync: Fixed an issue where syncing project-scoped resources (e.g., task templates) would fail with “TaskTemplate must have a project” errors. The PUT payload now correctly includes the project reference for project-scoped resources, mirroring the existing pattern for organization-scoped resources.
- OpenAPI Schema Parsing: The CLI now gracefully handles missing
$refschema references in the server’s OpenAPI specification. When broken references are encountered (e.g., a missingValidationFailedResponse), the CLI patches in empty object stubs and retries parsing instead of failing.
- Task template and other project-scoped resource syncing now works correctly with
kdx sync pushandkdx sync deploy - CLI operations no longer fail when the platform’s OpenAPI spec contains missing schema definitions
brew upgrade kdxKDX CLI v2026.2.0
Document Command Overhaul, Knowledge Management & Module Downloads:Version Scheme Change: The CLI version now aligns with the platform release cycle (2026.2.x), replacing the previous 0.x/8.x numbering.Document Command Rewrite: Allkdx document commands have been rewritten to use the native kodexa-document Go library via a new DocumentAdapter, providing significantly improved performance and richer output including node IDs and type information.New Document Subcommands:kdx document stats- Document statistics summarykdx document schema- Display document schemakdx document tags- List and inspect tagskdx document features- List and inspect featureskdx document node- Inspect individual nodeskdx document text- Extract text contentkdx document page- Page-level operationskdx document find- Multi-criteria search across nodeskdx document spatial find- Spatial search by coordinateskdx document spatial bbox- Bounding box querieskdx document data objects- List data objectskdx document data attributes- List data attributeskdx document data exceptions- List data exceptionskdx document audit- View audit trail entries
kdx knowledge attach- Attach files to knowledge setskdx knowledge download- Download knowledge set itemsattachmentPathsupport inkdx syncfor knowledge items
kdx get module <slug> --download- Download module implementation packages directly
- Project-scoped resources with auto-pull for task templates
- Graceful handling of missing files in pull operations
brew upgrade kdxKDX CLI v0.6.0
Content Object Access & Extended Store Commands:New Features:-
Document Family Content Commands: New
kdx document-family contentsubcommand for direct access to content objects (kddb files) within document families:kdx document-family content list- List all content objects with IDs, timestamps, and labelskdx document-family content download- Download kddb files directly, bypassing DFM export timeouts--latestflag - Automatically select the most recent content object--outputflag - Specify custom output filename
-
Store Upload & Watch Commands: New commands for document upload and processing workflows:
kdx store upload- Upload files (PDF, images, documents) to document storeskdx store watch- Monitor document processing progress with real-time status updates--labelflag - Wait for specific processing labels (PREPARED, FIRST-PASS, LABELED, PROCESSED)--timeoutflag - Configure wait timeout for long-running processing
- Project Create Organization Lookup: Fixed organization resolution when creating projects from templates
- Dynamic API Flags: Improved handling of dynamic flags for
kdx runoperations - Document Family Data Export: Fixed data export to always use latest content object
brew upgrade kdxv8 Documentation Preview
Pre-release documentation for upcoming v8 CLI and SDK releases:CLI v8 - Document Commands (Preview):Newkdx document command suite for working with local KDDB files without requiring a platform connection:kdx document info- Display document summary with metadata and statisticskdx document print- Pretty print document structure as an ASCII tree with depth limiting and feature displaykdx document select- Query nodes by type using selector syntaxkdx document natives list/extract- List and extract embedded files (PDFs, images, etc.)kdx document external list/get/set/delete- Manage key-value external data storekdx document metadata get/set- View and modify document metadata
- Native Documents: Store and retrieve binary files within KDDB documents
- External Data: Flexible key-value store for custom data and processing results
- Metadata: Document properties including UUID, version, and custom fields
- Content Nodes: Hierarchical document structure with types and content
- Selectors: XPath-like query syntax for finding nodes
These features are in preview and will be included in the upcoming v8 release of the KDX CLI and Kodexa Document SDKs.
Kodexa Document SDK v8.0.0
New SDK Documentation & Version 8 Libraries:New Documentation:- SDK Documentation Tab: Added a dedicated SDK section to the developer portal with comprehensive guides for Python and TypeScript
- Python Getting Started: Complete guide covering installation, document creation, node manipulation, selectors, features, tags, and saving
- TypeScript Getting Started: Full guide including WASM initialization, async patterns, memory management, and browser/Node.js setup
- High-performance document processing via Go backend with CFFI bindings
- ~100x faster in-memory mode for processing pipelines
- Full support for KDDB format, hierarchical nodes, features, tags, and XPath-like selectors
- Context manager support for automatic resource cleanup
- WebAssembly-powered SDK for Node.js and modern browsers
- ~5x faster than pure JavaScript implementations
- Full async API with TypeScript type safety
- Works with both file-based and in-browser SQLite
- Create, load, and save KDDB documents
- Hierarchical ContentNode tree structure
- XPath-like selector queries
- Features (key-value metadata) and Tags (annotations with confidence)
- JSON and binary export formats
KDX CLI v0.5.2
Stability & User Experience Improvements:Bug Fixes:- Increased Client Timeout: Extended HTTP client timeout from 60 seconds to 10 minutes (600s) to prevent premature failures during long-running deployment operations, particularly beneficial for large manifest deployments, multiple resource/module deployments, and deployments to slow or distant environments
- Improved Branch Mapping Error Handling: Changed behavior when no branch mapping is found - now displays informational message and exits gracefully instead of returning error, providing better UX when working on unmapped branches
- Better CI/CD Integration: Non-disruptive behavior when working on unmapped branches doesn’t fail pipelines unnecessarily
- Clearer User Feedback: Informational messages clearly distinguish between configuration issues and actual errors
- Enhanced Reliability: Deployments that previously failed due to timeout will now complete successfully
- Prevents deployment timeouts for operations with large manifests or multiple resources
- Better user experience when working with selective branch mapping configurations
- More reliable long-running deployment operations
Kodexa Sync Action v2.2.0
Built-in Slack Notifications & GitHub Job Summary:New Features:- Slack Notifications: Send rich deployment summaries to Slack automatically with
slack-channel-idandslack-tokeninputs - GitHub Job Summary: Add deployment summary to workflow run with
annotate-summary: true - Renamed Input:
workers→threadsto match kdx-cli flag naming
- 🚀 Deployment status (or 🔍 for dry runs)
- Repository and branch information
- Resource counts (created, updated, unchanged)
- Direct link to the GitHub Actions run
KDX CLI v0.5.0
Tag-Based Deployments & Enhanced GitOps:Major Features:- Tag-Based Deployment Mappings: Deploy using git tags in addition to branches, enabling release-driven workflows with
tag_mappingsconfiguration supporting semantic versions, release candidates, and preview tags - Manual Deployment Overrides: New
--branchand--tagflags provide explicit control over deployment routing without requiring git operations, perfect for CI/CD, testing, and rollback scenarios - JSON Deployment Reports: Generate structured JSON reports of deployment actions with
--json-report <path>for CI/CD integration - Parallel Resource Deployment: New
--threads <n>flag for configuring parallel threads during resource deployment - significantly faster for large deployments - Resource Filtering: Filter resources during deployment with
--filter <pattern>for selective deployments
- Enhanced Error Messages: Clear, actionable error messages with hints when mappings are not found
- Better User Feedback: Deployment mode indicators showing whether using branch detection, tag detection, or manual override
- Improved Mapping Resolution: Support for multiple overlapping mappings, enabling sophisticated multi-environment deployment strategies
KDX CLI v0.4.1
Enhanced Debugging, Error Handling & Sync Improvements:New Features:- Enhanced Client Debugging: Added detailed API request/response logging when debug mode is enabled, providing comprehensive information for troubleshooting
- Improved Module Syncing: Updated module syncing to build and display full slugs with organization prefixes, improving clarity in logs and progress reporting
- Enhanced Deployment Output: Deployment command now includes the environment URL in planned deployment messages, providing clearer context for users
- Alternate Extension Support: Added support for both
.yamland.ymlextensions when reading resource files, with improved error hints showing all attempted file paths
- Better Error Messages: Error messages now reference full slugs with organization prefixes, making it easier to identify and debug issues
- Improved Error Handling: Enhanced deployment error handling to capture and report errors without terminating the process immediately
- Robust Payload Handling: New utility function to safely extract string values from interface types
- Debug Mode Formatting: Conditionally display full response bodies based on debug mode for cleaner output in normal operation
- Fixed gofmt formatting in
resource_types_test.go
KDX CLI v0.3.0
Knowledge Sets & Immutable Resources:New Features:- Knowledge Set Support: New
knowledgesetresource type with full CRUD operations, including example configurations for financial knowledge sets and full support in metadata API and sync operations - Immutable Resource Types: Added support for immutable resources (
featuretypeandfeatureinstance) that cannot be modified once created, maintaining database integrity. Sync operations automatically skip updates for immutable resources with appropriate warnings
