Repository navigation
Releases: winterop-com/dirigent-integration
Releases · winterop-com/dirigent-integration
Release list
v0.23.3
Released 2026-10-07. Every package in the workspace moves to 0.23.3 together, and so do
dirigent-dhis2 and dirigent-integration. Nothing in this repository changes; the release
exists for the two siblings.
- The DHIS2 examples point at a play demo that answers.
stable-2-43-1is gone from
play.im.dhis2.org andstable-2-43-2lists no organisation units, so the example pipelines
dirigent-dhis2ships in its wheel, its tutorial, and the pipelines in
dirigent-integrationmove tostable-2-42-6. On 2.42.6 a rehearsed import reports what it
would import as well as update, since the demo does not hold the values 2.43.1 did; a dry
run still writes nothing.
v0.23.2
Released 2026-10-07. Every package in the workspace moves to 0.23.2 together, and so do
dirigent-dhis2 and dirigent-integration.
- SQLAlchemy 2.1.
dirigent-coreanddirigent-block-sqlrequiresqlalchemy>=2.1.3, so
an environment holding SQLAlchemy 2.0 beside dirigent no longer resolves. Nothing about the
schema or the queries changes; the claim, the run report and the drift check are typed to
2.1's genericSelectandTable. - A request is one span, dirigent's. FastAPI 0.142 instruments itself whenever a tracer
provider is installed, which put a second server span between dirigent's request span and the
run it created, and would have added exporters from the environment and logged exception
messages besideconfigure_telemetry. The server turns FastAPI's own telemetry off, and
dirigent-serverrequiresfastapi>=0.142.2. - The dependencies move. FastAPI 0.142, Starlette 1.7, Uvicorn 0.54, OpenTelemetry 1.45,
cryptography 50.0.2 and DuckDB 1.5.6 among the Python ones; React Flow 12.12, Vite 8.3.3 and
oxlint 1.87 in the UI. - The dashboard's chart ends when its runs were read. It took the hour of every render, so
the axis could move under rows that had not been read again; it now takes the moment the
day's runs answered. dirigent-dhis2reads DHIS2 2.44. It requiresdhis2w-client>=1.31.1, a release
that recognises a 2.44 instance, as a preview, rather than refusing it as unsupported.
v0.23.1
Released 2026-10-01. Every package in the workspace moves to 0.23.1 together, and so do
dirigent-dhis2 and dirigent-integration.
- The pipelines naming a stored schema are a count that opens. They were a list under the
Schema label, so a schema ten pipelines named pushed Save and Delete off the screen; the row
above the body now states the number at every count and the names are one press away. The body
pane is shorter for it, and the window still draws the whole shape.
v0.23.0
Released 2026-10-01. Every package in the workspace moves to 0.23.0 together, and so do
dirigent-dhis2 and dirigent-integration.
- A run holds the shapes it started with. When a run is created it reads the body of every
schema its document names and keeps those bodies on the run, the way it keeps its resolved
parameters, its priority and its worker tags. Every attempt, every later step and every retry
check against those bodies rather than the table, so an edit reaches the next run of a pipeline
naming the code and never one already under way. A${...}in a step'sschemais refused when
the document is applied: a code that is not a code until the run is under way is one nothing else
can see either, neither therequirespreflight nor the dependants a delete is refused for. - A schema in use is not changed blind. Deleting a schema a current pipeline names is refused;
editing one never is, because a code is fixed once minted and refusing the edit would freeze an
in-use schema for good. The dependants are read from the documents themselves, which already
declare them, so nothing has to be kept in step. - A stored schema is corrected where it is read. The Schemas screen edits name, description and
body; the apply dialog'sdiffersrow offers the same correction in place; anddg schema update
does it from a shell, taking a body the waycreatedoes. A label given empty is cleared and one
left out is left alone -- whichdgcould not express before, so seeding quietly wiped the title
and description of every schema it replaced. - A missing connection is minted in the row that says so. The apply dialog's offer opens the
connection form under the row rather than sending the reader to another screen and losing the
document they had typed. - A label says only what is known. Messages that asserted what the code could not tell --
that a password was unchanged when the request never answered, that parameters were a JSON object
at the moment they were not -- now say what is true. Every counted sentence carries both its forms,
so nothing renders "1 items"; every noun the CLI and the UI both say is held to one word by a test;
and a lane fails documentation that quotes a label the catalogue no longer has. - A form is not hidden under its own cap. Three dialogs capped an inner block and hid the form
inside it, two of them standing taller than the window with nothing to scroll. A surface caps and
its body scrolls; only a read-only preview takes a height of its own, and that height belongs to
the block rather than its callers. - An unread catalog is not an empty one. The step menu answered "No block matches that." while
it was still reading the catalog, so a reader who typed quickly was told the block they wanted did
not exist and their Enter placed nothing.
v0.22.0
Released 2026-09-29. Every package in the workspace moves to 0.22.0 together, and so do
dirigent-dhis2 and dirigent-integration.
- Every word the UI says has a code.
lib/labels.tsholds them all, one nested object
whose path is the code, built the waydirigent_common.messagesis built: a catalogue per
area, a duplicate refused by the compiler rather than at import, and a sentence with a value
in it written as a function with named parameters. A translation is a second table,
const nb: typeof LABELS, and the compiler fails a missing code, a stray one, or a sentence
taking different parameters.scripts/check_ui_labels.pyruns inmake staticand fails a
user-visible literal outside the catalogue, or a label nothing reads. - A refusal renders in the language of the surface that draws it. The wire carries the code
and the params; each surface renders its own sentence. The browser readsdetailonly as the
fallback for a code it does not know.RunOut,ItemOut,StepReport,RunReport,
LogEntryOut,AlertMessageandRunSnapshotcarry what a renderer needs, and a log entry
holds its code in a column rather than insidefields. - A pack contributes the wording its codes are rendered from.
labelsis the seventh
Contributionsurface, a list of catalogues gathered by the host and served from
GET /labels, so a pack's refusal reaches a browser in the browser's language. The nine
in-tree families contribute 152 codes. The field defaults to empty, so a pack that does not
set it loads unchanged. - A refusal a person reads is written for that person. An uncaught block error no longer
reaches the run view as a Python class name: the sentence says the block failed and points at
the step's log, which carries what it raised. Six messages that told a browser user to type a
command say what is wrong instead, and a test walking every catalogue fails a new one.
Eleven cancellations that were bare English now carry codes. - One word per concept. A schedule's firing was spelled nine ways,
queuedfour; a column
and the fact beside it disagreed on case in seven places. Each is one entry now, with its
surface forms under it.test_shared_words.pyfails the CLI and the UI drifting apart on a
word they both say. - A pack can check its own wording.
dirigent_testing.check_pack_messagesreports a refusal
raised under no code, a message nothing reads, and a code two catalogues both define. It is
opted into with one line, like the package's other assertions. - The mono face is JetBrains Mono, self-hosted, with the same advance as what it replaces.
- One inset per surface. 16px, stated once and spent everywhere; a listing row that fills
the panel takes it back when pressed again; a dialog draws one control that dismisses it.