-
-
Notifications
You must be signed in to change notification settings - Fork 0
0.32.0
Hussein Jarrar edited this page Sep 12, 2026
·
2 revisions
34 changes · 9 Bugfixes, 6 New Features, 19 Chores · 31 points.
-
RADD-1049 Two AI-registry tests fail instead of skipping without the localembed extra — the CI gate's first catch
The new CI test gate (RADD-1037) runsuv run pytestafteruv sync --locked— deliberately WITHOUT thelocalembedextra (fastembed/ONNX is heavy; the workflow comment states the localembed tests "self-skip on a plain server, mirroring a contributor's laptop"). But…
aicitesting· 1 pts ·a04efd8f -
RADD-1046 settings-cleanup proof cannot tell "no fixture" from "regression" — skip loudly on an empty instance
(audit finding G1).web/scripts/settings-cleanup-proof.mjsneeds an existing team — "a team row actually expanded" and the Role-grants-section check depend on one. On the RADD-1025 clean stack (zero teams) it fails 2/N, and nothing distinguishes that from a real regression. It fails loudly rather than vacuously (the…
proofsweb· 1 pts ·883b4523 -
RADD-1031 Holidays do not pause SLA clocks — the RADD-932 claim is false in code
The RADD-932 commit message says holidays "feed both the timesheet's away cells and business-day SLA resolution." The second half is false:slas/timers.pyis pure work-week-days + business-hours-window; the wholemodules/slas/package contains zero references toleaveor holidays, and no server module imports…
leaveslas· 3 pts ·12216d01 -
RADD-983 Every sender rides the transport: digest, CSAT and send_email leave the env relay
(audit findings #5, #8)
automationscsatmailintakenotify·27c58534 -
RADD-1034 Every stranger who emails the desk becomes a pickable person in every people picker
_sender_userprovisions an activeUserSource.EMAILaccount for any inbound address — correct, it is what makes requesters addressable (RADD-828). Butauth/service.list_usersapplies no source filter, and/users/directory— the endpoint behind every people picker (RADD-769/938) — serves those accounts to every…
authmailintake· 2 pts ·743b84b2 -
RADD-1040 RBAC residue: the kernel entity host silently drops query-gated relations, and a dead ProjectMember type survives
(2026-08-11 week audit, findings A3 + A5). 1.relation_holds_row(sync) treats a relation with no pureholdspredicate as not held — correctly fail-closed for today's registrations (comment/worklog/attachment are all pure), but the kernel entity host uses the sync form for generated plugin-entity CRUD…
authkernel· 1 pts ·ea995897 -
RADD-1030 Participant-shared items are invisible in search: the index mirror never learned @participant
search/service.py:101mirrors only("own", "assigned", "team")onto the search index (d841searchreladdedreporter_id/assignee_id/team_id— nothing for participants). In_relation_index_clause, a project where the actor holdsitem.read@participantcompiles afalse()arm for that relation, so…
access-controlparticipantssearch· 2 pts ·24ae9454 -
RADD-1029 Fix the fixable findings from the first trivy scan
The first trivy run over v0.31.1 (RADD-1028) found 253 image findings and 3 web findings. Almost everything is unfixed-in-Debian noise (16 CRITICALs are four perl CVEs × four perl packages — perl is only present becausepostgresql-client-17depends on it), but five things have fixes published, and all five are…
23067fba -
RADD-1010 CLAUDE.md names the attachment entity key as doc_page; the value is page
The CLAUDE.md preamble described the spec-102 polymorphic attachment parents as "docs registersdoc_page". Both halves are stale:
docs· 1 pts ·236bd6b8
-
RADD-1045 The acknowledgement email becomes editable: a settings-backed template through the canned renderer
(audit finding F4).ACK_BODYand friends are module constants inradd/mailrender.py. Settings → Email configures transport thoroughly and content not at all — IT wanting the ack to carry desk hours and the emergencies phone number is a PR and a release.
cannedmailintakesettings· 2 pts ·a37b54a0 -
RADD-1041 Related projects in the rail become a display choice — without touching the security model
(audit finding A4). The Baseline role'sitem.read@own/@participantsimultaneously (a) makes "related" projects appear in the rail (RADD-937'svisible_projects) and (b) lets a requester see the ticket they filed. One lever, two concerns: emptying the Baseline to tidy the rail also blinds every requester, and…
authprojectsshell· 3 pts ·2648f52e -
RADD-1044 Assign next from team: a round-robin automation action, away-aware
(audit finding F3). Triage is fully manual: no round-robin, no load-based assignment anywhere. Automation graphs canset_assigneeto one fixed person — and the LLM classifier node can pick a route — but nothing distributes. Three IT techs, every mail-born ticket unassigned, whoever looks first self-assigns, the rota…
automationsleaveteams· 3 pts ·a1a572ee -
RADD-1043 SLA policies can match issue types, so "password reset" and "new starter" stop sharing one clock
(audit finding F2). SLA policies match on project + priority only (service.matched_policy, first-match by position). Issue types (spec 51) exist per project but policies cannot see them; queues are saved views with no policy attachment. An IT project carrying both "password reset" (target 4 business hours) and "new…
itemtypesslas· 2 pts ·1b879779 -
RADD-1028 Trivy vulnerability scan in the release pipeline, next to the SBOMs
RADD-1026 gave every release its inventory; nothing yet reads that inventory for known vulnerabilities. A release should ship with a vulnerability report produced the same way the SBOMs are — automatically, per tag, by the pipeline that built the image.
6a2af219 -
RADD-1026 Per-release CycloneDX SBOMs, attached to the Forgejo release
Radd publishes no SBOM at all. The deployable artifact isgit.radd-hq.com/radd/radd:<version>, and anyone consuming it (vulnerability scanning, procurement, a future CRA-style ask) has to reverse-engineer what's inside. An SBOM should exist for every shipped version, produced by the same pipeline that ships it.
07e1d0ad
-
RADD-1038 The documentation of record is stale: modules.md mis-describes the service desk, CLAUDE.md is ten minors behind
(2026-08-11 week audit;docs/modules.mdis the file PLAN.md twice names as the source of truth): - The spec-30 "known simplifications" bullets claim: no business-hours calendar, no first-match SLA resolution, SLA chips on the detail rail only, email-to-issue deferred, no dedicated queue UI. All five are built (specs…
docs· 2 pts ·63d8058b -
RADD-1032 Mail intake trusts From: end to end — read sender-auth verdicts and narrow the subject-key gate
There is no SPF/DKIM/DMARC/Authentication-Resultshandling anywhere in the codebase. The design is honest about it ("attribution is not authorisation" —intake._reply_commentroutes throughcreate_commentso nothing is granted by a header), but the consequences compose into an impersonation primitive: a forged…
mailintakesecurity· 5 pts ·6f615e0f -
RADD-1037 CI never runs the tests: a tag ships whatever the commit contains
.forgejo/workflows/publish.yamlresolves the version, builds, pushes, publishes the changelog, attaches SBOMs and scans CVEs — and never runspytest,ruff, ortsc. Every quality gate is a local habit. This week alone shipped three bugs of exactly the class a gate catches: RADD-936 (500 on a filter…
ci· 3 pts ·557ffb1f -
RADD-1025 Two one-command local stacks: your data, or a clean one
One command to run the instance you have been building against, and one to run an empty instance — toggleable, with neither able to destroy the other.
d8923d15 -
RADD-1025 Two one-command local stacks: your data, or a clean one
One command to run the instance you have been building against, and one to run an empty instance — toggleable, with neither able to destroy the other.
f42a186c -
RADD-1024 Mermaid diagrams in the wiki
Diagrams in wiki pages, written as text.
dcb119d8 -
RADD-1023 A code fence written with a file extension highlights nothing
982462c8 -
RADD-1022 The importer meets a real Confluence: five failures a fixture could not produce
What was wrong. The first use against the live instance (confluence.mtl.ad.cinesite.com, space PIP, 6099+ pages) failed two ways: choosing "specific pages" showed an empty tree with no error, and "whole space" reported a bare failed with no reason. Every test passed, because every test was built from hand-written…
c7bb7eac -
RADD-1022 The importer meets a real Confluence: five failures a fixture could not produce
What was wrong. The first use against the live instance (confluence.mtl.ad.cinesite.com, space PIP, 6099+ pages) failed two ways: choosing "specific pages" showed an empty tree with no error, and "whole space" reported a bare failed with no reason. Every test passed, because every test was built from hand-written…
c49992ef -
RADD-1022 The importer meets a real Confluence: five failures a fixture could not produce
What was wrong. The first use against the live instance (confluence.mtl.ad.cinesite.com, space PIP, 6099+ pages) failed two ways: choosing "specific pages" showed an empty tree with no error, and "whole space" reported a bare failed with no reason. Every test passed, because every test was built from hand-written…
a0512a6b -
RADD-1022 The importer meets a real Confluence: five failures a fixture could not produce
What was wrong. The first use against the live instance (confluence.mtl.ad.cinesite.com, space PIP, 6099+ pages) failed two ways: choosing "specific pages" showed an empty tree with no error, and "whole space" reported a bare failed with no reason. Every test passed, because every test was built from hand-written…
0a4b68b4 -
RADD-1022 The importer meets a real Confluence: five failures a fixture could not produce
What was wrong. The first use against the live instance (confluence.mtl.ad.cinesite.com, space PIP, 6099+ pages) failed two ways: choosing "specific pages" showed an empty tree with no error, and "whole space" reported a bare failed with no reason. Every test passed, because every test was built from hand-written…
d472576d -
RADD-1022 The importer meets a real Confluence: five failures a fixture could not produce
What was wrong. The first use against the live instance (confluence.mtl.ad.cinesite.com, space PIP, 6099+ pages) failed two ways: choosing "specific pages" showed an empty tree with no error, and "whole space" reported a bare failed with no reason. Every test passed, because every test was built from hand-written…
df7d2f0d -
RADD-1021 The import wizard UI
/settings/confluence-import— the surface that makes the four phases operable.
8a9b5071 -
RADD-1014 Snapshot: one scope for spaces, subtrees and page sets, downloaded once
Cache-first, as spec 100 established: a selection is downloaded once intoconfluence_snapshot_pages, and every later step — profiling, the macro census, planning, dry runs, the real run, re-runs after a mapping fix — reads that cache. Nothing after this phase touches the network.
6f7ee1e9 -
RADD-1019 Three new page extensions: unsupported-macro, expand, and items
Threeradd:*extensions the importer needs and the wiki gains permanently. Each ships its declaration and its renderer in the same commit —tests/test_page_extensions.pycompares the TypeScript registration list to the kernel's in both directions, so a name declared without a renderer fails the build. That test is…
1281f88b -
RADD-1015 Storage format to markdown: the converter
Confluence storage format — the XHTML dialect withac:/ri:elements — converted to the markdownpages.bodystores. Pure, unit-tested, no DB and no network, so it can be run over the snapshot cache repeatedly as mappings change.
dc2a9c16 -
RADD-1013 Confluence connections and a Server/DC client
The bottom of the importer: DB-row connections and a client that can actually talk to Confluence Server/DC.
12cf7617 -
RADD-1012 Pages gain an external identity and the import seams a faithful import needs
Four seamspagesdoes not have, all of which spec 117 needs before a single Confluence page can be written. Three of themcommentsalready closed years ago withCommentCreate.author_id+created_at; the fourth is new.
9aecb329
Changes from v0.31.1 to v0.32.0.
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.
-
Developer guide
- Architecture: the kernel and plugins
- Develop, test and deploy
- Events and consumers
- Permissions and access control
- The MCP server
- The query language for developers
- The REST API and authentication
- Write a backend plugin
- Write a page editor extension
- Write a plugin user interface
- Write an automation node
-
Release notes
- 0.36.4
- 0.36.3
- 0.36.2
- 0.36.1
- 0.36.0
- 0.35.0
- 0.34.0
- 0.33.0
- 0.32.0
- 0.31.1
- 0.31.0
- 0.30.0
- 0.29.0
- 0.28.0
- 0.27.0
- 0.26.0
- 0.25.1
- 0.25.0
- 0.24.1
- 0.24.0
- 0.23.1
- 0.23.0
- 0.22.0
- 0.21.0
- 0.20.0
- 0.19.0
- 0.18.1
- 0.18.0
- 0.17.2
- 0.17.1
- 0.17.0
- 0.16.0
- 0.15.0
- 0.14.1
- 0.14.0
- 0.13.1
- 0.13.0
- 0.12.0
- 0.11.0
- 0.10.0
- 0.9.2
- 0.9.1
- 0.9.0
- 0.8.1
- 0.8.0
- 0.7.1
- 0.7.0
- 0.6.6
- 0.6.5
- 0.6.4
- 0.6.3
- 0.6.2
- 0.6.1
- 0.6.0
- 0.5.0
- 0.4.1
- 0.4.0
- 0.3.2
- 0.3.0
- 0.2.0
- 0.1.0
-
User guide
- AI features
- Attachments
- Automations
- Cycles and releases
- Instance settings
- Intake forms and the portal
- Notifications and the inbox
- Personal settings
- Project settings
- Projects
- Reports and dashboards
- Search and the query language
- Start here
- The application window
- The card designer
- The roadmap
- The service desk
- The wiki
- Time logging and the timesheet
- Views
- Work items