4.0.21 2026 08 04
Release Notes - STML Version 4.0.19
Release Date: August 2026
Highlights
Odoo sync engine: real timeouts, duplicate-safe writes, faster o2m (platform/odoo 0.1.28 → 0.1.30). Three releases in one arc:
- 0.1.28 cuts RPC overhead on one2many updates: child reads are batched per parent set instead of per row, and nested relationships are prefetched.
- 0.1.29 makes x2many diffing honest: a new _is_x2m_commands helper and tightened _values_equal logic stop command-valued fields from diffing as "always changed", refining m2o/m2m/o2m reconciliation (with regression tests for m2m reloads).
- 0.1.30 fixes a timeout hole that had been there all along: the legacy jsonrpc transport (every Odoo ≤ 18 connection) passed no timeout to httpx, so its 5-second default ruled every RPC — far shorter than a routine batch create, and the module's DEFAULT_TIMEOUT patch targeted a variable the pinned odoolib never reads. Surfaced in production as a 1,000-row product import crawling at 2 rows/s with ~800 false "barcode already assigned" errors. The transport is now re-wired per connection with phase-split timeouts: 10 s connect (dead servers fail fast), 30 s for idempotent read RPCs (the engine retries those), and the full author-set timeout (default 120 s) for creates/writes/arbitrary execute calls — on a write the client must outlast the server, because a timed-out create is not a failed create. Which is the second half of the fix: timed-out batch creates are never blindly re-sent; the engine re-matches by key and counts rows that already landed instead of duplicating them, and xml_id-keyed plans (unverifiable before ir.model.data registration) record explicit "outcome unknown" errors rather than gambling.
Dependency management no longer breaks for consumers outside the issuer org. Two production-observed failures in PUT /apps/{id}/dependencies (the Add dependency dialog replays the app's full dependency set through it): (1) a version yanked after an app pinned it blocked every later dependency edit — yank now follows the standard contract (blocks new pins, carry-forwards pass with a warning in the response); (2) issuer resolution did a direct organizations select, which org RLS hides from non-members — for any consumer org pinning e.g. an stml/… library this raised out of .single() as an unhandled 500 (reaching browsers as a CORS-less "NetworkError"). Resolution now goes through the same accessible_library_issuer_slugs SECDEF map the MCP tool path already used, and zero-row lookups return clean 400s.
App updates survive a flow module move. perform_update matched existing flow rows to the new manifest by entrypoint only, so a library version that moved a flow's module while keeping its name crashed the whole update on the flows_name_per_app constraint. Matching is now two-pass — entrypoint first across the full set, then a name fallback against unclaimed rows, updated in place including the new entrypoint — so the flow's id and slug are preserved and configurations, triggers, and sessions follow the move. Regression-tested for the move and the rename+move swap.
The Prefect worker no longer eats its own disk. Every flow run extracts its bundle into a per-run /tmp/stml4-run-* dir whose cleanup was registered via atexit — which multiprocessing children never run (they exit via os._exit()). One leaked bundle dir per run filled the infra host's disk twice in five days, taking flow execution down each time. Ownership is inverted: the worker parent creates the dir, passes it to the child, and deletes it after the child exits — covering crashes and SIGKILLed (wall-clock/rlimit) children — with a startup sweep of stale dirs as self-healing after a worker crash.
stml pull returns the complete source of attached apps (stml CLI 0.1.8). Pulling an attached app now merges the un-forked base library files (marked from_base) with the overlay — overlay wins per path — so the folder on disk is the app's real effective source, not just its fork delta. Pull also refreshes the stored manifest's exports block from the live flow rows, preserving authored content around it.
- platform/report 0.1.5 — a row's final status now prioritizes write actions over validation severity, fixing a regression where incremental re-runs with warnings discolored rows that were in fact written; covered by new status-scenario tests.
- runtime 0.12.3 — input-node halting refactored around _awaiting_input, distinguishing absent from empty submissions.
- Session views track task states across runs — AppFlowView switches to the new useSessionTaskStates composable, aggregating live task states session-wide instead of per single run.
- Uploads up to 100 MiB — the Supabase service-wide file size limit is raised to match the largest bucket limit (app-files), so large uploads are no longer silently rejected below the bucket's own cap.
- BACKEND_URL is injected into the Scaleway environment and the infra compose now fails fast on a missing .env.
- Assistant instructions require plain literals for declared lists/mappings so input panes render correctly.
- Implementation plan committed for the stml_sync Odoo companion module (Phase B) and sync-engine throughput work.
- Pytest configuration and automation refreshed across projects.
- Frontend and dashboard versions bumped to 4.0.21.
Changed
Under the hood
Release Date: August 4th, 2026
4.0.19 2026 07 27
Release Notes - STML Version 4.0.19
Release Date: July 2026
Highlights
stml_report — a composable Excel report toolbox. New platform library (platform/report, import stml_report) that supersedes the report builders baked into stml_pipeline (0.3.4 keeps them as frozen shims for existing flows — new and customised reports depend on report directly). Three layers: blocks that take their data at construction and their environment at render, pages assembled with page(name, [blocks]) → save_workbook(target, pages) (target may be a path or io.BytesIO — no temp files), and the standard two-tab data-quality report as a recipe (dq_report). Customising means copying the recipe and editing the copy — there are deliberately no insert/replace/move methods and no post-processing of a written xlsx. Iterated to 0.1.4 within this window: a quality view that breaks down the validation results of excluded rows (0.1.3), and a coverage metric per attribute row with blank keys excluded from distinct counts and percentages (0.1.4).
The Odoo connector now works for restricted users on Odoo 19 (platform/odoo 0.1.27). The json2 protocol proxy mapped positional arguments to named parameters via the server's /doc-bearer introspection document — which stock Odoo 19 serves 403 to non-admin users (and which omits deprecated methods entirely). Net effect: every positional call failed for exactly the locked-down integration users the platform recommends. _Model and OdooClient now call kwargs-only (with ids= as the record-ids key; jsonrpc forwards kwargs to execute_kw unchanged, so one shape serves both protocols), backed by exhaustive protocol tests covering both jsonrpc and json2 behaviour.
Undeployed changes are now impossible to miss. An overlay write (set_app_source_file / set_flow_source / delete) is inert until deploy_flow — runs keep executing the previously deployed bundle while the Code view already shows the new source, the single most misleading state in app editing ("I added the rule but runs ignore it"). The frontend now detects it (new useUndeployedChanges composable) and shows an inline banner on the code view plus a sidebar badge on the app; MCP/chat tool responses append an explicit "not live until deploy" note to every source write, and the assistant's instructions require ending an editing session with a deploy or saying it deliberately didn't. Only page/ files are exempt — the app page serves live.
stml pull now always returns a publishable folder (stml CLI 0.1.7). A scratch app (and an attached app, whose manifest lives in the base library files rather than the overlay) has no pyproject.toml row, so its pulled folder couldn't go back through stml publish → install. The backend now synthesizes one from the platform's live state — provenance name/version/description when the app has a library origin, a scaffold from the display name otherwise — and the CLI labels generated manifests in its output. Pull → edit → publish now round-trips for every app shape.
- platform/nmbrs 0.3.0 — journal entries from fetch_recent_journal_entries now carry run_date (the calendar date of the Nmbrs RunAt timestamp, or None — new parse_run_date helper, never guessed) alongside the period-end date. This lets consumer apps book payroll entries on the run date instead of the period end. Verified against the SOAP WSDL that Nmbrs provides no period dates at all (RunInfo's PeriodStart/PeriodEnd are period numbers), so the period-end computation stays — unchanged — and no period-start mode was added. The lib also gained its first unit tests (period math for monthly / 4-weekly / weekly, RunAt parsing).
- stml init scaffolds a new library: src/ layout with a runnable example flow, tests, and a ready-to-publish pyproject.toml.
- stml push no longer ships tests/ — test directories are excluded from the overlay like other local-only artifacts, matching what stml publish packaging already did.
- Visual documentation added under docs/diagrams/: migration-app role-based access control and client-driven migration data flows.
- uv.lock files are now committed (starting with cli/); virtual-env directories added to .gitignore.
- The production demo Odoo compose mounts the OCA product_dimension module (parity with the demo images that gained it in 4.0.18).
- Frontend and dashboard versions bumped to 4.0.19.
Changed
Under the hood
Release Date: July 27th, 2026
4.0.18 2026 07 24
Release Notes - STML Version 4.0.18
Release Date: July 2026
Highlights
Failures now lead with the message, not the noise. Persisted step, node, and run errors used to be head-clipped at 2000 characters — and a long (often chained) Python traceback puts the one line that matters, the exception message, at the end. A flow's carefully worded guardrail error could be entirely invisible in the UI, which showed three screens of frame noise cut off mid-line. The runtime (0.12.2) now clips the other way: the stored error opens with the exception message, followed by the traceback's tail (the deepest, relevant frames). Every surface benefits — session status, the wizard's task pane, and app pages — whether it shows the head or the last line of the stored error.
App pages can show real run history. New sessions.list bridge RPC in the page SDK: an app page can list its app's recent sessions — flow name, run number, status, timestamp, and the error's first line — under the same app-scoped, RLS-gated trust model as connections.list (ids never leave the parent; fields are display-safe). This replaces per-visit run logs that vanished on reload — and unlike a "flow writes a summary record" approach, it includes crashed runs, which never reach the step that would have written the record.
The CLI now refuses a backend it isn't logged in to. A cached stml session is minted by ONE backend; sending its token elsewhere yielded bare "Internal Server Error" responses — while stml whoami --backend … happily decoded the cached token and claimed a login that wasn't valid there. The CLI (0.1.6) now calls the mismatch out on every command with the exact login command to run. One session file means logging into another backend replaces the current session — the message says so.
App updates no longer trip over overlay residue, and keep your renames. Two fixes to the update path:
- Overlay rows that are byte-identical to a shipped version's file are residue, not customisation — after an update they would silently pin the outgoing version's code over the new release. Update now detects them (sha-matched against both the outgoing and incoming tarballs, tolerant of the flat ↔ src/-wrapped layout ambiguity) and cleans them up, so a fork-then-update app actually gets the new code.
- Flow display names follow a refresh-if-untouched policy on update: a row still carrying its default (the row name, or the previous manifest's title) picks up the new manifest title; a name you set yourself in flow settings is preserved — the manifest never clobbers a user rename.
- App page & asset routes accept the app slug. The page-URL and static asset endpoints matched the app strictly by UUID; a slug — the identifier every external caller naturally holds — blew up in the id cast and surfaced as a 500. A shape-aware resolver now routes UUIDs and slugs alike (404 when neither matches), with bucket paths and page tokens always keyed on the canonical UUID.
- Sessions sidebar shows the date. Session timestamps in the flow view rendered time-only, which made older sessions indistinguishable; they now include day and month.
- Runtime 0.12.1 was a broken intermediate build (a mis-scoped helper left StatusWriter without its report methods — every run failed at startup); 0.12.2 supersedes it. Don't pin 0.12.1.
- Demo Odoo images gain the OCA product_dimension module.
- CLI build artifacts ignored in cli/; a generic migration-process diagram added under docs/diagrams/.
- Frontend and dashboard versions bumped to 4.0.18.
Changed
Under the hood
Release Date: July 24th, 2026
4.0.17 2026 07 19
Release Notes - STML Version 4.0.17
Release Date: July 2026
Highlights
XAF → Odoo: mapping an administration is now a round-trip, not a one-shot. A new collect flow reads the chosen administration's chart of accounts and journals plus the source chart from the auditfile, and matches accounts in three passes — exact code, exact description, and AI only for the genuine remainder (the AI one-shot caps its list, so obvious matches never depend on it). The mapping grid, the saved configuration, and the import flow now agree end to end:
- Your saved configuration is authoritative. Re-analyzing a saved administration restores every saved mapping untouched — AI suggestions only fill accounts the configuration doesn't cover, and accounts you already mapped are skipped by the matching passes entirely (including the slow AI call, so re-analysis is much faster).
- Typed codes always save. Mapping an account to a code that doesn't exist in Odoo yet is a deliberate choice: it saves under your code and becomes a will-create account (red will create badge), instead of being silently dropped or replaced by a derived code.
- Journal default accounts persist. The per-type default accounts (sales / purchase / bank) are stored in the configuration itself, so they survive the historical journals coming into existence — previously they vanished from the config after the first live run.
- Your chosen configuration stays chosen. Opening a configuration to edit it no longer gets swapped for another configuration that happens to target the same company.
Dropped files survive the page. A file dropped on an app page now uploads into the app's file card immediately (a new version per drop) — nothing runs until you press Run, but the file is no longer lost when you navigate away (for example the connector-wizard round-trip, which destroys the page's browser memory). Coming back, the page restores the dropzone from the uploaded version and runs or analyzes against it — no re-drop needed.
- Honest dropzone copy. The XAF import page now says the file uploads right away and survives navigation — the old "held in your browser" promise was exactly what made the connector round-trip lose it.
- Mapping grid badges. Red rows now distinguish a deliberate will create mapping (code filled in, account created on import) from a truly unmapped one; rows stay red as long as the account doesn't exist in Odoo yet.
- Pages can read their app's files. New app.files.list() in the page SDK (backed by a files.list bridge RPC): the app's file cards with latest-version metadata — never bytes — under the same app-scoped, RLS-gated trust model as connections.list. This is what powers the dropzone restore; degrade is graceful on older platforms.
- The collect flow's analyze step takes a known_map (the configuration's account_map) and excludes those accounts from every matching pass; the import flow's configure step gains a journal_default_accounts field so the new config key round-trips, with a legacy fallback for configurations saved before this release.
- XAF library records/mappings reworked for the consolidated historical journals + account-map translation, with the test suite extended to match.
- Frontend and dashboard versions bumped to 4.0.17.
Changed
Under the hood
Release Date: July 20th, 2026
4.0.16 2026 07 18
Release Notes - STML Version 4.0.16
Release Date: July 2026
The stml partner CLI. You can now work on apps from your own machine with a command-line tool. stml pull <app> downloads an app's source into a folder, you edit it in your own editor, and stml push sends it back and redeploys. stml publish releases a library, stml init scaffolds a new one, and stml login signs you in through the browser — no API keys to hand around. Install it with pipx install stml-cli; it defaults to production and talks to the platform over the same JWT-authenticated endpoints the assistant uses. stml list shows every app you can reach — with its organization, workspace, mode, and the exact URL you pull/push by — so two apps with the same name are easy to tell apart.
Apps now have a lifecycle: attached · detached · scratch. Every app has a mode. An app installed from a library is attached — pinned to a version, deploying the library plus your overlay, and able to take library updates. stml detach (or the platform) forks it into a detached, self-contained copy you fully own: the whole source is materialised and the library pin dropped. stml revert goes the other way — it discards your changes and restores the clean library version, or re-attaches a detached app to the version it forked from. Reverting is destructive, so it names the target and confirms first. Apps built from nothing are scratch. stml status and stml list show the mode.
Yuki: inbound purchase-invoice & payment testing. New tooling to exercise inbound payment workflows end to end — generate test bank slips, sync open invoices, and simulate partial payments — with PurchaseInvoices.xsd validation and explicit precision handling. The Yuki connector also moved into a shared platform/yuki-api library, so the Odoo app and its test flows run off a single implementation.
Changed
- The App Store leads with apps. An organization's App Store now defaults to browsing apps rather than connectors.
- Save a configuration from a page. App pages can persist or update a flow's configuration directly through the page SDK (configurations.save).
- Activity ledger. Adds a CSV export and shows the most recent 10 entries.
- Odoo 19 demo image. A custom image bundling python3-xmlsec so NL accounting (l10n_nl_reports) works on the demo servers.
Under the hood
- App detach/revert lifecycle (035) ships with full test coverage, backed by a new in-memory Supabase fake that exercises the attached → detached → attached state transitions.
- CLI distribution. stml-cli publishes to PyPI through a manual, keyboard-only flow (npm run cli:release); the PyPI token lives in the macOS keychain (npm run cli:login), the package version derives from a single __version__, and npm run cli:update upgrades a local install. stml pull now also fetches binary assets and enforces the packaged src/ layout.
- scripts/stml_lib.py retired — the stml CLI (stml_cli.packaging) is now the single implementation for building library tarballs.
- New architecture diagram documenting the app-authoring model (stores, operations, actors) under docs/diagrams/.
- Frontend and dashboard versions bumped to 4.0.16.
Release Date: July 18th, 2026
4.0.15 2026 07 17
Release Notes - STML Version 4.0.15
Release Date: July 2026
Highlights
Safer destructive assistant tools. Deleting things through the assistant is now guarded. delete_organization no longer deletes at all — organization removal isn't offered through the assistant; the tool just resolves the org and hands back the archive link (Organization → Settings), a password-gated soft-delete with a 30-day grace window. delete_flow and delete_configuration are clearly marked destructive and irreversible: the assistant must name the exact target and confirm first, and will never delete something inferred from an ambiguous request. (Deleting a flow keeps its source file in app_source_files, so it can be recreated — delete that file separately for a fully clean tree.)
The chat follows the conversation. The assistant panel now sticky-scrolls while a reply streams in: if you're at the bottom it keeps new content in view, but if you've scrolled up to read it no longer yanks you back down. Reloading or reopening the panel lands you on the newest message.
Changed
- delete_flow / delete_configuration descriptions now spell out the irreversibility, the confirm-and-name-the-target requirement, and (for flows) that the retained source file must be removed separately for a fully clean tree. Configuration deletes note that pinned sessions lose their pin but keep their copied inputs.
- delete_organization is advisory only — it never mutates; calling it returns archive guidance the assistant can relay directly. Assistant instructions were updated to match.
Under the hood
- New test_tool_schemas coverage asserts the delete tools signal their destructiveness (tool descriptions + input-schema wording), so the safety framing can't silently regress.
- Frontend and dashboard versions bumped to 4.0.15.
Release Date: July 17th, 2026
4.0.14 2026 07 16
Release Notes - STML Version 4.0.14
Release Date: July 2026
Highlights
CPQ configurator for Odoo. A new stml/cpq-odoo library turns Odoo into a guided quote configurator. A catalog step expands a product catalogue with brand/chassis compatibility, discount tiers and product-specific overrides; an interactive configurator front page walks a salesperson through the options with live business-rule validation; and a create-quote flow writes the result back into Odoo as a sale order. Ships with seed / prepare / create-quote flows and a full rules test suite. (User story docs/user-stories/solution/010-cpq-configurator-for-odoo.md.)
app.output.read — uncapped bulk outputs on the page. Task output and the records ledger stay capped (64 KB / 500 rows) so the live feed stays cheap. A flow that produces a large dataset now writes it to a named output file (app.output(slug).put(...)), and a front page reads the whole thing with await app.output.read('catalog') — parsed JSON by default, or { as: 'text' } for raw. Every read is authenticated and audit-logged, and a page can only reach its own app's outputs. This is what lets the CPQ page load a full product catalogue client-side.
Connections are app-scoped. Connection management moved from workspace scope to app scope — list_connections, test_connection, edit_connection, delete_connection and friends now take app_name instead of workspace_name, so each app owns and manages its own connections. Assistant instructions and tool input schemas were updated to match.
The assistant builds interactive front pages for real. The agent now knows the app-page SDK (import { app } from '/sdk/v1.js'): it wires a page's buttons to actually run flows (app.session.create / run), stream live per-step output (app.on('update')) and show run activity — including background/webhook runs (app.on('activity')) — instead of treating pages as render-only and simulating a run. It also has clearer guidance on filling flow inputs by node/field rather than misusing listeners.
Added
- Yuki connection testing + auto-discovery. A dedicated Yuki connection-test flow validates credentials from the UI and auto-discovers the administration during setup, and invoice XML is now validated against a bundled SalesInvoices.xsd schema. Flow records switched from data to payload. Libraries stml/yuki-odoo and stml/yuki-api updated.
- Fan-out field mappings. Odoo mappings accept a list-of-pairs fields form so one source column can populate several non-key targets, with stricter validation that rejects multiple identifying targets and ambiguous explicit keys.
- Short-ID conversation lookup on /mcp/admin. Admin conversation search and retrieval now accept an 8-character ID prefix alongside a full UUID or slug, with disambiguation when prefixes overlap (migration 20260714000000_admin_conversation_short_id).
- Redis health in the detailed health endpoint, so a degraded Redis (Streams / assistant worker) shows up in diagnostics instead of surfacing only as a downstream failure.
Changed
- Connection tool signatures take app_name, not workspace_name (see Highlights) — the one breaking change for anything driving the connection tools directly.
- Stricter App runtime validation. Invalid @app.step / interface usage fails fast with clearer error hints, backed by new flow-lint and tool-schema tests.
Fixed
- Background runs could fail with a name-resolution error. PREFECT_API_URL is now set explicitly in the compose files for the scheduler and agent-worker. Without it, schedule- and webhook-fired runs (and the agent's deploy_flow / run-status calls) fell back to the dev orb.local default and failed to resolve the Prefect API. Service dependencies were also tightened for startup stability.
Under the hood
- New tests across the board: runtime app interface, flow linting, connection step resolution, publish layout, connector test-flow export/pairing, and shared-source-column mappings.
- _exports_toml_from_flows now recognises connector helper flows, so test/introspect pairing and flow recreation on install stay accurate.
- 2BA UniFeed pricing/end-dating framing clarified (gross-only pricing; in-app net price calculation deferred) for the OCS demo.
- Frontend and dashboard versions bumped to 4.0.14.
Release Date: July 16th, 2026
4.0.13 2026 07 15
Release Notes - STML Version 4.0.13
Release Date: July 2026
Changes since 4.0.12 (the 4.0.13 version bump was internal and is folded in here).
Release Date: July 15th, 2026
4.0.12 2026 07 13
Release Notes - STML Version 4.0.12
Release Date: July 2026
Highlights
Yuki ↔ Odoo, end to end. A new stml/yuki client library speaks Yuki's SOAP API (WSDL-based session handling against api.yukiworks.nl), and a reusable stml4 app ships flows for invoices and payments. A one-shot setup flow provisions the whole integration in a single run: default configurations, the x_yuki_* custom fields on the Odoo side, triggers, schedules and an automation rule. Documented as a user story (docs/user-stories), built for VDH.
Scheduling moved to its own always-on worker. Cron ticks no longer depend on a scale-to-zero backend happening to be awake: a dedicated scheduler container fires schedules reliably, single-instance, with at-most-once execution — the inline scheduler is gone. Schedule-fired and webhook-fired runs now also resolve their configuration mode identically, via a shared _fire_trigger_with_config_mode helper, so the same trigger behaves the same regardless of what fired it.
Worker dependencies are baked, not pulled. Deploy-time pip install is removed everywhere; every third-party package a flow needs ships pre-baked in the worker image (lxml and requests joined for SOAP support). Deploys get faster and deterministic, and a flow can no longer crash mid-run on a module the image never had.
Redeploying a flow resets its stale sessions — everywhere. public.flows is now published over Supabase Realtime, so the flow view auto-resets open sessions the moment a new version deploys. The assistant path does the same (stale sessions cleared, deployed_at stamped), so neither chat nor UI can keep driving a wizard from a version that no longer exists.
Added
- 2BA imports you can watch. Every imported record and image now carries a detailed status, a live activity feed shows progress on the app page, and a finalize step closes out the run. The importer also feature-detects the per-supplier UoM field across Odoo generations (product_uom ≤16, product_uom_id 17/18, gone in 19) so a write never references a column the target lacks. Library stml/2ba 0.3.5.
- Triggers are editable in place. The app triggers view reuses the create dialog for updates — no more delete-and-recreate to change a trigger.
- A first-class Connection handle in the runtime. app.connection(slug) returns an opaque, dict-compatible handle carrying the connection's stable identity (slug, connector) alongside the decrypted parameters, with slug-based caching and a repr that redacts secret-looking values so logging a connection can't leak an API key. Fully covered by new tests.
- Sessions idle out after 8 hours by default, with warning limits derived from the timeout — plus a dev-only override to disable idle logout locally.
- deploy:agent commands — scoped agent-worker redeploys that stay aligned with the backend image tag.
Changed
- Odoo helpers no longer accept a bare slug string. read_odoo, sync_odoo and friends require the resolved object from app.connection(slug); passing a slug now fails fast with a message that says exactly that, instead of failing obscurely downstream.
Fixed
- 2BA supplier creation on Odoo 19. New suppliers are created with is_company: true instead of the computed company_type field, which Odoo 19's JSON-2 endpoint rejects (older endpoints tolerated the indirection). Same end state on every supported Odoo version.
Under the hood
- Prefect worker requirements gained lxml and requests (SOAP transport) under the bake-only dependency policy.
- Frontend and dashboard versions bumped to 4.0.12.
Release Date: July 13th, 2026
4.0.11 2026 07 11
Release Notes - STML Version 4.0.11
Release Date: July 2026
Highlights
From "read the platform" to "find the pain" — client friction analysis. The Admin Analytics MCP (/mcp/admin) grows a whole insight layer on top of last release's read tools. Every conversation is distilled into a conversation_insight row, and the ones where the interaction met resistance — a failed flow, a tool error, friction language, or the user trailing off unanswered — are flagged with the verbatim failed tool return as evidence, so the fix is usually visible without opening the transcript. admin_client_friction rolls this up per client (organization) with a transparent, weighted score and each org's most-recurring errors; admin_list_friction_conversations is the conversation-level shortlist. All heuristic for now (no LLM), and every signal is explainable. Operator guide: docs/runbooks/admin-analytics-mcp.md.
Assistant turns now run on a dedicated async worker. The in-browser assistant no longer executes its turn inline on the request path. A dedicated agent loop and worker process turns off a Redis queue, with tool-result caching, usage logging, resource-cap enforcement and mid-turn cancellation checks. The visible payoff is a chat that stays responsive on long, many-tool turns instead of stalling.
Added
- admin_find_user — resolve a person from a UUID, email, or display-name fragment. Emails are unique; display names are not, so it returns all candidates ranked by match quality and never silently picks one. Every curated result now also carries user_email / user_display_name next to the raw user_id.
- Sharper conversation reads. admin_get_conversation is now lean by default (tool-call names only, per-message character cap, paging) so a transcript no longer costs a token flood, and admin_search_messages adds full-text search across message content — the needle-finder that skips downloading whole transcripts.
- Insights refresh themselves. A turn-end lifecycle trigger recomputes a conversation's insight automatically, so the friction view keeps up with live chat instead of waiting for a manual recompute pass.
- 2BA UniFeed — daily supplier-price refresh. A new flow refreshes 2BA supplier prices on a schedule, with unit-of-measure resolution, WP4 import logic, a template identity key and fallback tagging — plus test coverage for unit resolution, pricing rules and import idempotency.
- Org admins can self-manage workspace access. From the organization members screen, an owner/admin can grant a member access to any workspace and revoke it from the workspace pills — including on their own row. Workspace names (not slugs) now show in the members list.
- OAuth-powered trigger redirects. A new /redirect handler returns a 302 into an authenticated destination, backed by the get_trigger_redirect_context lookup. Runtime bumped to 0.12.0.
- File new tickets from the ticket skill. A create command drafts a ticket (review before send), with tags, customer linking and team priority.
Changed
- Workspace access is less rigid for org admins. The "no self-add" rule and the "can't remove the last admin" guard are both waived for org owners/admins — they hold authority over every workspace in their org and can re-appoint an admin at any time, so the guards were friction, not protection. Both rules stay in force for plain workspace admins.
- "Copy link" works in Chrome on custom app pages. Sandboxed app-page iframes are now granted clipboard-write.
Fixed
- Stale-migration collision in the e2e reset. The isolated e2e stack now prunes its migration folder before refreshing it, so a migration renamed or renumbered in the repo can no longer leave a duplicate behind and make migration up re-apply an applied version.
Under the hood
- The insight layer runs as a dedicated insights_rw role via gated, SECURITY-DEFINER RPCs; friction vocabulary replaced the earlier "attention" naming across schema, RPCs and tools; cross-client error-pattern views back the triage tools. All behind the same platform-admin gate and audit trail as the rest of /mcp/admin.
- supabase.sh migrate:up accepts extra pass-through arguments for local migrations.
- New infra:agent:rebuild script stages legal docs and rebuilds the agent-worker container.
- Frontend and dashboard versions bumped to 4.0.11.
Release Date: July 11th, 2026
4.0.10 2026 07 09
Release Notes - STML Version 4.0.10
Release Date: July 2026
Highlights
- Admin Analytics MCP. Platform operators can now point Claude (or any MCP client) at a dedicated admin surface — /mcp/admin — and analyse the live platform in plain language: search any user's assistant conversations, read a transcript, inspect a run or session, list runs stuck past a threshold, or ask the long-tail question with one ad-hoc read-only SQL statement. The surface is read-only by construction: queries execute as a dedicated database role with an explicit SELECT allow-list, so writes, DDL and credential columns fail with a permission error rather than a policy promise. Only accounts with the platform-admin role get in (403 for everyone else, checked again inside every RPC), and every call — including each SQL statement verbatim — lands in the admin audit log under the operator's identity. Operator guide: docs/runbooks/admin-analytics-mcp.md.
Added
- The consent screen now says which surface you're authorizing. The admin endpoint advertises its own OAuth resource, so the authorize page shows a platform-admin banner (cross-tenant read access, everything audited) instead of the generic prompt, plus a Surface row with the exact URL — a built-in check against confusing environments or elevations. A non-admin authorizing the admin URL is told up front their account lacks the role: they may still approve, and the connection starts working automatically if the role is granted later.
Changed
- Smoother wizard inputs. Submitting a step now gives immediate feedback — a spinner, dimmed fields and disabled controls while the run is in flight — and the Run button distinguishes a fresh start from a resume.
Fixed
- Wizard focus no longer bounces. Input nodes queue as pending instead of being marked completed, so focus stays where it belongs while a run advances.
- SUPABASE_URL fallback now uses the configured constant instead of a hardcoded localhost URL.
Under the hood
- Dev reset tooling: per-database module lists, Accounting app seeding moved into reset_db, clearer logging.
- Two new migrations back the admin surface: curated analytics RPCs and the admin_analytics_ro role + admin_sql function.
- Frontend and dashboard versions bumped to 4.0.10.
Release Date: July 9th, 2026
4.0.9 2026 07 08
Release Notes - STML Version 4.0.9
Release Date: July 2026
Highlights
- XAF → Odoo import, revamped. The auditfile import gets a guided front page: pick an existing Odoo connection (or create one) from a dropdown, then drop the XAF into a live drop zone that shows upload and per-stage progress as the six import stages light up. Imports are tied to the connection you choose, so one app can target different Odoo instances.
Changed
- Auditfile lines no longer merge. Each transaction line is imported as its own journal line (via a per-line sequence), so lines within a single account.move entry stay distinct instead of collapsing together.
Fixed
- Multi-flow apps resolve the right default configuration. The default lookup is now scoped by flow, so an app with several flows no longer picks an arbitrary flow's default — and webhook triggers resolve the correct one.
- Concurrent deploys no longer race. Worker run directories are isolated per run, preventing races when several deployments run at once.
Under the hood
- Reader-facing release notes for 4.0.1–4.0.8 added under docs/release-notes/.
- Platform library version bump: xaf-to-odoo 0.1.6.
- Frontend and dashboard versions bumped to 4.0.9.
Release Date: July 8th, 2026
4.0.8 2026 07 08
Release Notes - STML Version 4.0.8
Release Date: July 2026
Highlights
XAF auditfile → Odoo import. A new solution app imports a Dutch XAF 3.2 auditfile — plain or compressed (.xac zip / .gz) — into Odoo across nine steps: chart of accounts, VAT codes & journals, customers & suppliers, the opening balance, and every transaction, posted as balanced account.move entries. It proves the file balances (debit = credit) and that its references resolve before it writes anything, ships a hero front page with a drop zone and live per-entity progress, and produces a downloadable Excel report. Composed from a new stml/xaf reader library plus stml/pipeline and stml/odoo.
on_match write policy for the Odoo sync engine. A mapping can now say what happens when a source row matches an existing record — on_match: update | skip | error — on top of the existing mode. {"mode": "insert", "on_match": "skip"} is INSERT … ON CONFLICT DO NOTHING: create new rows, quietly skip existing ones, for idempotent create-once loads (e.g. immutable posted journal entries). insert on its own still errors on a duplicate.
App-level live records feed. Apps gain a real-time ledger — a records API, an export endpoint, and activity subscriptions — so a custom front page can stream synced items as they happen and download the full history as CSV.
Added
- stml/xaf — a pure, streaming, dependency-free reader for Dutch XAF 3.2 auditfiles (auto-detecting plain / gzip / .xac zip) plus the structural integrity checks XAF guarantees (balanced transactions, matching totals, referential integrity, dates within the year).
- Yuki ↔ Odoo demo — a front page with a live sync log and CSV export, with the Yuki mock added to the production demo stack.
- Nmbrs → Odoo — invoice date stamping, with refined journal and account language handling.
Changed
- CSV exports are capped at 50,000 rows and warn when the range is truncated.
- App page content is centered by default inside the iframe.
- Nmbrs 0.2.0 — strict fiscal-period validation with clearer error handling and logging for undated financial periods.
- Payroll sync scrolls the progress card into view so live steps stay visible.
- The help-tour beacon uses a limited "ping" instead of an infinite pulse (accessibility).
Under the hood
- Platform library version bumps: odoo 0.1.26 (on_match), xaf 0.1.0 (new), xaf-to-odoo 0.1.2, nmbrs 0.2.0, runtime 0.11.0 (live records).
- Frontend and dashboard versions bumped to 4.0.8.
Release Date: July 8th, 2026
4.0.7 2026 07 06
Release Notes - STML Version 4.0.7
Release Date: July 2026
Highlights
- Centraal Boekhuis → Odoo integration. A new stml/cb connector library and demo import book data from Centraal Boekhuis into Odoo, backed by a cb-mock service that stands in for the real webservice. The cb-import flow publishes inline per-book results as it runs and produces a downloadable Excel summary.
- Hardened Odoo connector. API-key authentication, conditional field visibility (visible_if) with auto-advance, richer input validation and field descriptions, and whitespace trimming on entered values to stop copy-paste artifacts from breaking logins. Non-sensitive fields are now surfaced in step outputs.
- Odoo Helpdesk ticket skill. Triage, reply to, and manage support tickets directly from the assistant.
Added
- stml/cb — Centraal Boekhuis connector library + Odoo demo, with a cb-mock stand-in service for the CB webservice.
- Downloadable Excel report step for the cb-import flow, plus inline per-book results published during the import.
- API-key authentication for the Odoo connector.
- visible_if conditional field visibility and auto-advance in the task pane.
- allow_custom and placeholder passthrough in the flow parser and renderer.
- Odoo Helpdesk ticket skill for triaging, replying, and managing tickets.
- Wall-clock as a configurable per-run resource cap.
- External-user proof-of-concept for Odoo portal integration.
- Smoketest scenarios and documentation for platform validation.
Changed
- The Odoo connector trims whitespace from username / password (and guidance now emphasizes trimming all user-entered values) to prevent copy-paste login failures.
- Non-sensitive Odoo fields are surfaced in task step outputs (security review).
- The task pane uses a generic tone in place of the domain-specific severity.
- Simplified the flow-level declares structure.
- Reachability fallback for containerized workers, with unit tests.
- The dashboard /users view navigates via SPA routing.
- Custom app pages: the active bridge is enabled in production for the flowers-to-odoo pilot (behind VITE_APP_PAGE_ACTIVE_BRIDGE).
- More robust CSV parsing in the spreadsheet library.
Under the hood
- Platform library version bumps: odoo 0.1.25 (API key, visible_if), spreadsheet 0.1.2, parts-onboarding 0.2.0, pipeline 0.3.3.
- Frontend and dashboard versions bumped to 4.0.7.
Release Date: July 6th, 2026
4.0.6 2026 07 02
Release Notes - STML Version 4.0.6
Release Date: July 2026
Highlights
- Nmbrs → Odoo payroll sync. A new nmbrs connector (Nmbrs SOAP API) plus a nmbrs-to-odoo app that syncs payroll journals into Odoo automatically.
- AI-assisted field mapping. Mapping fields can now draw from dynamic sources and suggest defaults via AI, backed by new AI-matching endpoints with token metering — so a flow can propose account / analytic matches without an API key in the flow itself.
- set-images flow. Fetches and updates product main images in Odoo, with live result publishing surfaced in the frontend.
Added
- nmbrs — connector library for the Nmbrs SOAP API (v3).
- nmbrs-to-odoo — app for automated payroll journal syncing into Odoo.
- set-images flow — fetch and update product main images in Odoo, with live result publishing and frontend integration.
- AI-matching endpoints for runtime use, with token metering.
- Mapping fields with dynamic sources and AI-based default suggestions.
- Connector filtering, and flow-name resolution by ID.
Fixed
- Platform connector publishing — RLS policies updated to support platform-admin authentication.
Under the hood
- Runtime bumped to 0.9.0.
- Frontend and dashboard versions bumped to 4.0.6.
Release Date: July 2nd, 2026
4.0.5 2026 07 02
Release Notes - STML Version 4.0.5
Release Date: July 2026
Maintenance release.
- Maintenance release. Frontend and dashboard versions bumped to 4.0.5, tagged shortly after 4.0.4 — no functional changes.
Release Date: July 2nd, 2026
4.0.4 2026 06 30
Release Notes - STML Version 4.0.4
Release Date: June 2026
Fixed
- Multi-flow apps can now be run from the AI assistant. create_session, session_step, session_run, and session_rerun accept a flow_name; when an app has several flows and none is given, the assistant returns a clear "specify which flow" message instead of a cryptic Tool error: 'session_number'.
- Reject broken Python library tarballs missing the src/ layout at publish time.
- More informative error reporting for edge/block errors in the admin users list.
Added
- Partner Data Quality app — a graded spreadsheet workflow.
- Admin conversations view — browse assistant conversations from the dashboard, with a backend API.
- Centralized auth-error handling for API calls.
- Enterprise mode for the Odoo 19 production demo.
Changed
- Clarified the signup-confirmation email copy (states its purpose; "ignore if it wasn't you").
- Webhook URLs resolve via public_backend_url (retired the PUBLIC_BACKEND_URL alias).
- License views hide libraries that have no installable versions.
- Removed the "forked" provenance chip from the workspace apps view.
- Raised the Scaleway chat-agent container timeout 60s → 300s (interim, pending the durable worker).
- Platform library version bumps: flowers-to-odoo, partner-data-quality, invoices-to-odoo, spreadsheet 0.1.1, pipeline 0.3.2.
Removed
- Retired the deprecated 2BA and excel-to-odoo libraries (added a new 2BA setup page + assets).
Internal
- New technical user stories: durable chat-agent worker architecture, deployment latency improvements.
- AGENTS.md documentation for the platform libraries.
Release Date: june 30th, 2026
4.0.3 2026 06 28
Release Notes - STML Version 4.0.3
Release Date: June 2026
Highlights
- Admin yank / un-yank of published library versions (RPC + tool + UI), plus a "Show yanked" toggle.
- New invoices-to-odoo flow (import + transform spreadsheets into Odoo) with a data-quality report download.
- Live connection schema introspection (inspect_connection_schema) with Redis-backed caching and prefetch on connection-test success.
- Richer Odoo sync: one2many / many2many with configurable on_extra policies and nested-relation auto-create.
- Block now revokes the user's session immediately (cascade auth.sessions delete from the is_blocked trigger).
- Custom app pages: VITE_APP_PAGE_ACTIVE_BRIDGE enabled in prod for the flowers-to-odoo pilot.
Release Date: june 28th, 2026
4.0.2 2026 06 25
Release Notes - STML Version 4.0.2
Release Date: June 2026
Highlights
- Custom app front pages rendered in a sandboxed iframe, with the active-bridge phases (page → session/files hand-off) and the "Flowers → Odoo" reference page + assets.
- Guided product tours and a help beacon.
- Library tarballs split into lean code vs binary assets; license library bundles made mutable post-mint.
- Responsive sidebar and a floating menu button for mobile navigation.
- Larger chat token budgets (16K streaming / 32K non-streaming) to prevent truncation.
Release Date: june 25th, 2026
4.0.1 2026 06 23
Release Notes - STML Version 4.0.1
Release Date: June 2026
The first release of the STML4 4.x line, and the starting point for these release notes.
What's New
Agenetic loop
Generate with AI instead of hand coding
MCP
Bring your own AI, want to use self hosted, self procured LLM's as long as your LLm of choice supports the MCP we are good to go.
App based
Phone style App's where you can do almost all on a single attractive screen. Our wizards will guide you through the setup steps of your connections and absolve you from the difficult configuration work. Get results quickly and robustly!
App Store
Look for a solution, install, configure and run. sounds easy, now it is.
Want to publish a app you build to share or sell it to the world, you can.
Supported Integrations
- Odoo (15.x, 19.x) — full read/write with metadata discovery
- Nmbrs — payroll data synchronization
- Generic REST APIs — via configurable connection profiles
- Custom systems — write Python tasks, push to Git, and they appear in the task library
Domain-specific packs available for 2BA, Tuindeco, Twinfield, Valbo, HiveCPQ, and BigQuery, Exact, Yuki.
Release Date: April 2nd, 2026