Skip to content
Hussein Jarrar edited this page Sep 12, 2026 · 2 revisions

v0.33.0

22 changes · 1 Bugfix, 21 New Features.

Bugfix

  • RADD-1064 ai.validate is unusable from the builder: generic TRUE/FALSE ports and a text box where the context checkboxes should be
    Symptom (found by Hussein building his first validation rule, 2026-08-12): the ai.validate node renders TRUE/FALSE output handles on the canvas, and its "What the model sees" parameter renders as a free-text input — which invites template tokens like {{title}} and stores a string where the server schema requires an…
    f1212435

New Feature

  • RADD-1065 The SBOM becomes a wiki document: a child page of each version's release notes
    Wanted (Hussein, 2026-08-12): the per-release SBOM published as a readable document on Radd when we release, the way release notes are — as a child of the version's page.
    9f19abb0
  • RADD-1063 Notification settings: describe when each kind fires and what each scope column means
    the new /settings/notifications page shows 13 kind rows and three scope columns with bare labels — a user can't tell what "Updated" covers vs "State changed", that "Mine" reaches them even unwatched, or what a team subscription follows. Asked by Hussein while trying the wave out, 2026-08-12.
    a2d60aa3
  • RADD-1057 Validate trigger + binding index + a findings-collecting walk mode
    a trigger.validate sentinel trigger (joins manual/schedule — not in the event catalog). Its node params carry the binding: form ids, issue-type ids, optional project scope + condition, and mode (advisory | required). Bindings sync to an index table automation_validations on every rule write, mirroring…
    7a8a6b12
  • RADD-1060 Intake UX: Validate button, field highlights, create-anyway + builder support
    intake surfaces learn validation. A read endpoint (GET /items/validation-context?project&form&type) tells the client whether bindings govern the draft and the strictest mode; IntakeSubmitShell (both form pages) and NewItemModal render Validate instead of Submit when governed. Click → POST .../validate with…
    a073c9eb
  • RADD-1060 Intake UX: Validate button, field highlights, create-anyway + builder support
    intake surfaces learn validation. A read endpoint (GET /items/validation-context?project&form&type) tells the client whether bindings govern the draft and the strictest mode; IntakeSubmitShell (both form pages) and NewItemModal render Validate instead of Submit when governed. Click → POST .../validate with…
    1669c5ce
  • RADD-1059 ai.validate: an AI judgment node returning structured, field-targeted findings
    a sibling of ai.classify (ai/automation_node.py is the north star): node ai.validate, gate-kind, ports pass / fail / unavailable. Params: prompt (the admin's quality bar, e.g. "an IT report needs the affected system, what they tried, and when it started"), the include context toggles, max_findings,…
    800f6df1
  • RADD-1058 Savepoint validate-and-create + hook-inverted enforcement in create_item
    validation runs against a REAL row, briefly: begin_nested → items.service.create_item (events row included — it rolls back too) → resolve applicable bindings → validation walks → on pass, release the savepoint (item stands, one round trip, auto-create-on-pass); on fail, roll back and return findings. New endpoint…
    e135d78a
  • RADD-1057 Validate trigger + binding index + a findings-collecting walk mode
    a trigger.validate sentinel trigger (joins manual/schedule — not in the event catalog). Its node params carry the binding: form ids, issue-type ids, optional project scope + condition, and mode (advisory | required). Bindings sync to an index table automation_validations on every rule write, mirroring…
    ac8624b8
  • RADD-1060 Intake UX: Validate button, field highlights, create-anyway + builder support
    intake surfaces learn validation. A read endpoint (GET /items/validation-context?project&form&type) tells the client whether bindings govern the draft and the strictest mode; IntakeSubmitShell (both form pages) and NewItemModal render Validate instead of Submit when governed. Click → POST .../validate with…
    12e59eac
  • RADD-1059 ai.validate: an AI judgment node returning structured, field-targeted findings
    a sibling of ai.classify (ai/automation_node.py is the north star): node ai.validate, gate-kind, ports pass / fail / unavailable. Params: prompt (the admin's quality bar, e.g. "an IT report needs the affected system, what they tried, and when it started"), the include context toggles, max_findings,…
    335b8321
  • RADD-1058 Savepoint validate-and-create + hook-inverted enforcement in create_item
    validation runs against a REAL row, briefly: begin_nested → items.service.create_item (events row included — it rolls back too) → resolve applicable bindings → validation walks → on pass, release the savepoint (item stands, one round trip, auto-create-on-pass); on fail, roll back and return findings. New endpoint…
    9ebae11a
  • RADD-1057 Validate trigger + binding index + a findings-collecting walk mode
    a trigger.validate sentinel trigger (joins manual/schedule — not in the event catalog). Its node params carry the binding: form ids, issue-type ids, optional project scope + condition, and mode (advisory | required). Bindings sync to an index table automation_validations on every rule write, mirroring…
    3a9801e7
  • RADD-1055 Settings → Notifications: the matrix + subscriptions page
    the 10×2 checkbox grid in NotificationPrefsPanel (mounted on /settings/profile) becomes a dedicated /settings/notifications page: a defaults matrix — rows = event kinds, columns = own / participating / my teams — each cell a compact 4-state control (off / inbox / email / both), plus a subscriptions section: add a…
    b5793640
  • RADD-1054 Channel-aware delivery: channel decided at write time, mailer/digest read the row
    the resolver's verdict is stamped on the notification row at creation — inbox bool + email bool (replacing the mailer's per-user Python filter against email_types_by_user and the mute check in create_notification). Email-only is now expressible: the row exists as the delivery log but GET /notifications and…
    9c5d871b
  • RADD-1053 Fan-out widening: subscribers join the recipient set; pages move into the consumer
    notify/consumer.recipient_ids unions a third source: subscribers — notification_rules rows where (scope=project ∧ scope_id=item's project) ∨ (scope=team ∧ scope_id=item's team) ∨ (scope=space ∧ scope_id=page's space), indexed on (scope, scope_id). New handled kinds: item.created (ambient, for subscribers), generic…
    e0caf8bb
  • RADD-1052 Notification rules model + pure channel resolver
    a notification_rules table — (user_id, scope, scope_id NULL, channels JSONB) where scope ∈ own | participating | teams | project | space | team, scope_id set only for the last three, and channels is a sparse map of event kind → off/inbox/email/both. A pure resolver (planner-style, unit-tested like…
    d7cfd0f4
  • RADD-1053 Fan-out widening: subscribers join the recipient set; pages move into the consumer
    notify/consumer.recipient_ids unions a third source: subscribers — notification_rules rows where (scope=project ∧ scope_id=item's project) ∨ (scope=team ∧ scope_id=item's team) ∨ (scope=space ∧ scope_id=page's space), indexed on (scope, scope_id). New handled kinds: item.created (ambient, for subscribers), generic…
    53ab895c
  • RADD-1055 Settings → Notifications: the matrix + subscriptions page
    the 10×2 checkbox grid in NotificationPrefsPanel (mounted on /settings/profile) becomes a dedicated /settings/notifications page: a defaults matrix — rows = event kinds, columns = own / participating / my teams — each cell a compact 4-state control (off / inbox / email / both), plus a subscriptions section: add a…
    547e0917
  • RADD-1054 Channel-aware delivery: channel decided at write time, mailer/digest read the row
    the resolver's verdict is stamped on the notification row at creation — inbox bool + email bool (replacing the mailer's per-user Python filter against email_types_by_user and the mute check in create_notification). Email-only is now expressible: the row exists as the delivery log but GET /notifications and…
    a873475e
  • RADD-1053 Fan-out widening: subscribers join the recipient set; pages move into the consumer
    notify/consumer.recipient_ids unions a third source: subscribers — notification_rules rows where (scope=project ∧ scope_id=item's project) ∨ (scope=team ∧ scope_id=item's team) ∨ (scope=space ∧ scope_id=page's space), indexed on (scope, scope_id). New handled kinds: item.created (ambient, for subscribers), generic…
    15a66780
  • RADD-1052 Notification rules model + pure channel resolver
    a notification_rules table — (user_id, scope, scope_id NULL, channels JSONB) where scope ∈ own | participating | teams | project | space | team, scope_id set only for the last three, and channels is a sparse map of event kind → off/inbox/email/both. A pure resolver (planner-style, unit-tested like…
    39884423

Changes from v0.32.0 to v0.33.0.

Pages


Mirrored from project.radd-hq.com on 2026-09-12. Documentation is written there; this copy is regenerated by scripts/publish_wiki.py and hand edits do not survive it.

Clone this wiki locally