Problem
When casehub-engine assigns work to a worker via WorkBroker → WorkerScheduleEvent, it calls WorkerProvisioner.provision() and CaseChannelProvider.open() — but it does not send a Qhorus COMMAND on the channel.
The channel is opened. The worker is provisioned. But no normative commitment is created.
This means the entire Qhorus obligation lifecycle (ACKNOWLEDGED, FULFILLED, FAILED, DELEGATED, EXPIRED, stalled detection, list_stalled_obligations, trust score feedback) is bypassed for every CaseHub-orchestrated work unit. Only spontaneous agent-to-agent messages outside of CaseHub go through the normative layer.
The architecture already supports this — ClaudonyCaseChannelProvider opens a Qhorus channel and exposes postMessage(). The missing step is sending a COMMAND after provisioning.
Proposed fix
In CaseContextChangedEventHandler (choreography) and WorkOrchestrator.submit() (orchestration), after provision() and open():
channelProvider.postMessage(channel, Message.builder()
.type(MessageType.COMMAND)
.sender("casehub-engine:orchestrator@v1")
.content(buildWorkSpec(worker, context))
.correlationId(workUnit.id().toString())
.build());
The worker's DONE/FAILURE response then:
- Updates the
CommitmentState in Qhorus (existing mechanism)
- Writes a
LedgerAttestation (once qhorus-issue-123 is done)
- Feeds the trust score for the worker persona
This closes the prescriptive→normative→evaluative chain for all CaseHub-orchestrated work.
Requires
Part of
casehubio/parent#4 (platform coherence audit — finding #31, highest architectural priority)
Problem
When
casehub-engineassigns work to a worker viaWorkBroker→WorkerScheduleEvent, it callsWorkerProvisioner.provision()andCaseChannelProvider.open()— but it does not send a Qhorus COMMAND on the channel.The channel is opened. The worker is provisioned. But no normative commitment is created.
This means the entire Qhorus obligation lifecycle (ACKNOWLEDGED, FULFILLED, FAILED, DELEGATED, EXPIRED, stalled detection,
list_stalled_obligations, trust score feedback) is bypassed for every CaseHub-orchestrated work unit. Only spontaneous agent-to-agent messages outside of CaseHub go through the normative layer.The architecture already supports this —
ClaudonyCaseChannelProvideropens a Qhorus channel and exposespostMessage(). The missing step is sending a COMMAND after provisioning.Proposed fix
In
CaseContextChangedEventHandler(choreography) andWorkOrchestrator.submit()(orchestration), afterprovision()andopen():The worker's DONE/FAILURE response then:
CommitmentStatein Qhorus (existing mechanism)LedgerAttestation(once qhorus-issue-123 is done)This closes the prescriptive→normative→evaluative chain for all CaseHub-orchestrated work.
Requires
CaseChannelProvider.postMessage()to be added to the SPI (currently onlyopen(),close(),send())WorkerResponseHandlerin casehub-engine that maps a DONE Qhorus message back to case lifecycle (WORK_COMPLETEDevent)Part of
casehubio/parent#4 (platform coherence audit — finding #31, highest architectural priority)