CaseHub — uwork Notes
Speech acts, priority names, and a Panache coupling
NormativeResolution maps GitHub and Jira close events to speech-act semantics, CRITICAL gets renamed URGENT after finding it borrows ITSM severity vocabulary into a task scheduling context where it...
The default that bit us, and why defaults matter
Three unrelated CI failures arrive at once — a Friday business-hours assertion, a SNAPSHOT API drift, and a multi-instance default whose effects only appear under concurrent load — all sharing the ...
Delegates, transactions, and not building a parallel universe
castTo(PgConnection.class) fails immediately because Mutiny codegen produces sibling hierarchies, not parent-child — the subscription needs the raw Vert.x delegate to call notificationHandler().
Three bugs hiding behind the wrong error
The BackPressureFailure filling the CI log is noise — the actual failure is an OptimisticLockException buried further down, caused by the M-of-N coordinator racing against itself during concurrent ...
Three audit findings and a wrong mental model
Three audit findings include a String.format JSON builder that silently corrupts output on non-trivial actor IDs, a bug the auditor described with the wrong mechanism, and a Bayesian mental model e...
Distributed SSE and the infrastructure tax
Redis for distributed SSE fan-out is rejected because it would force two new infrastructure pieces on users who have neither Redis nor MongoDB — a pluggable WorkItemEventBroadcaster SPI defers the ...
M-of-N parallel WorkItems and a rule that needed rewriting
M-of-N parallel WorkItems ships after rewriting LAYERING.md — the rule "if it touches another WorkItem it's orchestration" was already broken by cascade cancellation, so the real test is whether it...
Optional by design, and a PostgreSQL test that told the truth
The PostgreSQL Testcontainer test finds a HQL date-truncation query that passes on H2 but fails on PostgreSQL — catching a dialect incompatibility that would have reached production undetected.
SLAs, signals, and a connector library
Business-hours SLA and outbound notifications ship, and a notification routing detail that starts as a one-line decision grows into casehub-connectors — a separate repository born from the question...
The primitive and the orchestrator
A data-driven spawn rule table is rejected before a line of code — the right answer is that subprocess orchestration belongs to CaseHub, and quarkus-work should expose the primitive that CaseHub re...
The substrate and what grows on it
Splitting quarkus-work-api into pure contract and quarkus-work-core with CDI implementations reveals that WorkBroker and WorkItems are specialisations of a shared Work substrate that CaseHub also n...
The filter that grew into a contract
A confidence-gated routing rule that could be wired in twenty lines becomes quarkus-work-filter-registry instead — because inline logic is a trap that becomes load-bearing and unremovable.
Aligning with the SDK — storage, expressions, and a hidden test class
Studying the SWF SDK storage abstraction confirms that WorkItemRepository needs multi-field inbox queries — Map doesn't express them cleanly — so a richer query object replaces a direct SWF port.
Examples that prove it
Four runnable examples — expense approval, regulated credit decision, AI content moderation, and document review — together exercise every ledger capability, and the agent: prefix convention derive...
The accountability layer — complexity must not leak
The ledger becomes a CDI observer on WorkItemLifecycleEvent — invisible when absent, zero overhead, zero tables — with hash chain and decision context on by default for GDPR Article 22 compliance.
Building WorkItems.From Scaffold to Native in One Session
Six phases of quarkus-work ship in one session — the WS-HumanTask research expands the WorkItem model to 27 fields before a line of code is written, and TDD catches two real bugs in Phase 2.