· intuitem · News  · 7 min read

What's New in CISO Assistant — Week 35, 2026 (v3.21.3)

The workflow engine learns to write: an update action with a hard-coded integrity line, date-aware scheduling, and bulk edits that finally emit events. Plus the UNESCO AI Maturity Framework, a feature-flag cache, and a long run of fixes across exports, search, permissions and the framework builder.

The workflow engine learns to write: an update action with a hard-coded integrity line, date-aware scheduling, and bulk edits that finally emit events. Plus the UNESCO AI Maturity Framework, a feature-flag cache, and a long run of fixes across exports, search, permissions and the framework builder.

A single patch this week — v3.21.3, released on August 26 — but a dense one. Most of it is the second act of the workflow engine that landed in v3.21.0: the visual builder shipped able to create and notify, and not much else. This release gives it hands.

Workflow Engine

  • The engine can now writeupdate_object arrives with a registry of updatable models covering 14 of the 16 readable ones, each carrying two whitelists: which fields may be written, and which values are acceptable on the fields that are mostly off limits. Relation writes take add | remove | set. Targets must sit inside the workflow’s own subtree and be changeable by the identity the run executes as, so automation can never write a row the API would refuse that same user (PR #4683). Thanks to @ab-smith.

    The integrity line is enforced by the registry rather than by convention, and it is worth stating plainly: automation may record that time passed and may attach work, but it may not render the judgment. Never RequirementAssessment.result or score, never RiskScenario.treatment; evidence and security-exception statuses are fenced to expiry, findings to everything but dismissed, and no entry may rewrite an object’s name. Risk acceptances and validation flows are absent from the registry entirely — their state moves through a transition table and a flow history, not through a column write.

  • Date-aware runs{{now}} and {{today}} are seeded once at run start, in the schedule’s own timezone when a schedule fired the run, and a new date_offset action covers arbitrary windows. The template grammar itself stays frozen, as the workflow schema promises.

  • Bulk edits emit eventsbulk_update skips Django’s post_save, so bulk changes logged nothing and no workflow ever fired on them. A logging-aware bulk update now writes the entries a per-object save would, applied to the two paths that change an audit someone already holds. Because one merge can now start hundreds of runs, a trigger is coalesced to at most one run per correlation id inside a five-minute window.

  • Wider reads — Workflows could read twelve models but nothing from the requirements, risk or validation families, which blocked the recurring-sweep use cases: overdue requirements, expiring acceptances, stale validations. Requirement assessments, risk scenarios, risk acceptances and validation flows join the readable registry, along with the missing expiry_date on applied controls. Rows read like API responses — same keys, same shapes, enum fields rendering display labels — so nobody has to learn a second vocabulary. Sweeps can target one audit or one risk assessment instead of matching every assessment in the subtree (PR #4655). Thanks to @nas-tabchiche.

  • send_email no longer lies about delivery — The action enqueued mail through a fire-and-forget task and always reported success: no consumer running, SMTP down, or mailer unconfigured all produced a clean ACTION_EXECUTED log while nothing was sent. Delivery now runs in a dedicated task outside the engine transaction, and hands the result back: a failure fails the node and feeds the per-node retry policy, while static config errors fail immediately instead of burning the retry schedule. Delivery is best-effort across recipients, so one dead address no longer starves the rest (PR #4654). Thanks to @nas-tabchiche.

New Features

  • Filter an audit tree by coverage — The audit tree gained filters for requirements with or without applied controls, and with or without evidence, alongside coverage indicators that count direct evidence, evidence inherited through applied controls, or both. Requirement counts and tree visibility update as the filters change, and selections persist while you work through an assessment (PR #4702). Thanks to @ab-smith.

Framework & Library Updates

  • UNESCO AI Maturity Framework — Six maturity pillars, 29 assessment categories and four maturity levels, bringing the shipped library count past 200 (PR #4690). Thanks to @ab-smith.
  • CyFun 2023 correction on RS.MI-1.1 — The French mitigation guidance for containing and resolving incidents was rewritten, an outdated requirement removed, and the cross-framework mappings re-pointed at the corrected requirement. Marked breaking, since the library version changes and the mapping shifts underneath existing audits (PR #4678). Thanks to @ab-smith.

Performance

  • Feature flags are cached — Flag lookups hit the database on nearly every request. Flags are now cached with invalidation on settings change, enterprise flags are no longer evaluated in Community, and the analytics page stops calling incident routes when the incidents flag is off (PR #4661). Thanks to @eric-intuitem.
  • Toolchain refresh — Vite 8 with Rolldown, ESLint 10 with a green lint, Paraglide moved to locale modules, and the RPM build on Node 24 (PR #4692). Thanks to @ab-smith.

Bug Fixes

  • Free-text questions no longer block the computed result — On question-driven audits, an unanswered free-text question kept the requirement at Not assessed until someone typed filler text. Text questions are now excluded from result computation, in the backend and in the frontend mirror used by the edit page and flash mode. Progress is unchanged: an empty text question still counts as unanswered there (PR #4700). Thanks to @Axxiar.
  • Splash screens stay non-assessable — The framework builder left assessable: true behind when an existing requirement was switched to splash mode, and hid the checkbox, so the stale flag was invisible and frameworks published that way rendered splash nodes as ordinary requirements. The builder now clears the flag, the loader forces it at import, and a data migration heals frameworks already loaded. Two knock-on fixes ride along: the assignments page filtered splash nodes out with their entire subtree — on frameworks that nest requirements under splash screens, the tree lost every requirement — and the auditee dashboard listed assignments the user could not actually open, so “continue assessment” 404’d (PR #4698). Thanks to @nas-tabchiche.
  • XLSX exports survive control characters — The action-plan export and two sibling paths crashed with an unhandled openpyxl error whenever a field carried an ASCII control character — most often a vertical tab pasted in from Word or Outlook. The backend returned 500 and the frontend masked it as a generic fetch error. String values are now sanitised at export time, so no data migration is needed (PR #4699). Thanks to @tchoumi313.
  • AI chat works with strict chat templates — The message array could carry more than one system message: the main prompt first, retrieved context appended later. Strict templates such as Qwen’s reject that outright, and the failure surfaced after a successful tool call, when the follow-up generation ran. System messages are now normalised into a single message at position zero — history and context merged in, user and assistant ordering preserved — consistently across regular generation, Ollama tool calls and OpenAI-compatible tool calls (PR #4680). Thanks to @jurkodj.
  • Server-side search in the remote object picker — The Jira and ServiceNow picker fetched only the first page from the remote — 50 issues, 100 records — and filtered it in the browser, so older issues simply could not be found. Typing now searches server-side, with JQL summary and issue-key matching for Jira and encoded-query branches for ServiceNow. Projects with 50 or fewer candidates keep the eager list (PR #4674). Thanks to @nas-tabchiche.
  • Search filter handles non-Latin scripts — The normalisation regexp behind entity search dropped Cyrillic and other non-Latin letters, so filtering silently failed on them (PR #4681). Thanks to @Punkoivan.
  • Custom roles stop provisioning stray IAM groups — Enterprise custom-role creation provisioned a user group and role assignment for every domain, including domains with IAM group creation disabled. A migration removes the stray built-in groups, unless somebody is already relying on one — in which case it re-enables IAM group creation for that domain rather than revoking their access (PR #4615). Thanks to @tchoumi313.
  • Stale permissions cleaned up — A migration prunes permissions left behind by four historical model renames: security functions to reference controls, security measures to applied controls, libraries to loaded libraries, and projects to perimeters (PR #4691). Thanks to @tchoumi313.
  • Permission inconsistencies — Readers, approvers and analysts can now view organisation objectives and issues; readers can see library filtering labels; and global settings expose consistent defaults across risk, notifications, language, MFA, retention and features (PR #4693). Thanks to @monsieurswag.
  • Flash mode counter — A regression left the processed-items counter stale while navigating between assessments (PR #4682). Thanks to @ab-smith.

Welcome to new contributor @jurkodj, who made their first contribution in this release. For full details, check out the v3.21.3 release notes on GitHub.

Back to Blog

Related Posts

View All Posts »
What's New in CISO Assistant — Week 36, 2026 (v3.21.4 – v4.0.1)

What's New in CISO Assistant — Week 36, 2026 (v3.21.4 – v4.0.1)

CISO Assistant reaches 4.0. The headline is a large findings and third-party risk epic — binders, commitments, campaigns, external ratings — landing alongside JIT SSO provisioning, a reworked tasks and evidence module, and a pagination contract that API consumers will want to read before upgrading.

What's New in CISO Assistant — Week 34, 2026 (v3.21.1 – v3.21.2)

What's New in CISO Assistant — Week 34, 2026 (v3.21.1 – v3.21.2)

A SCIM account-takeover chain closed, the IAM permission engine rewritten on querysets to lift a hard scaling ceiling, a new aggregated MCP architecture with HTTP transport, and a streamlined approval management interface. Plus manual score overrides, per-template email toggles, and the ISO 27701:2025 outline.

What's New in CISO Assistant — Week 32, 2026 (v3.20.5 – v3.21.0)

What's New in CISO Assistant — Week 32, 2026 (v3.20.5 – v3.21.0)

A big week: threat modeling with TTP catalogs and MITRE ATLAS, a full workflow engine with a visual builder, customizable asset classes rendered as a tree, and service accounts for machine-to-machine API access. Plus a breaking change on implementation groups, evidence previews for a dozen file types, and four new libraries.

What's New in CISO Assistant — Week 31, 2026 (v3.20.3 – v3.20.4)

What's New in CISO Assistant — Week 31, 2026 (v3.20.3 – v3.20.4)

A native Power BI connector ships as a signed, standalone artifact, third-party risk management joins domain export/import, posture management gains observations and attachments, and the AI chat learns to import spreadsheets. Plus the TISAX v2027 and ENISA SME cyber resilience frameworks, Slovenian localization, and an IAM hardening fix.