Skip to content

orchestrator: Compose report delivery from the board's ReportSink capability - #448

Draft
chrysh wants to merge 2 commits into
OpenPRoT:mainfrom
9elements:compose-report-sink
Draft

orchestrator: Compose report delivery from the board's ReportSink capability#448
chrysh wants to merge 2 commits into
OpenPRoT:mainfrom
9elements:compose-report-sink

Conversation

@chrysh

@chrysh chrysh commented Aug 27, 2026

Copy link
Copy Markdown
Contributor

Stacked on #447 — review the last commit only.

BoardCapabilities gains a ReportSink and Board a single report_sink field, one per platform rather than one per component: two of the four reports name no component. The Report effects leave the not-yet-composed group and hand their Report to the sink.

Executing a report returns no error, so it never reaches the fail-closed group: an Isolable component is contained, reported, and the platform stays Ready.

WatchBoard wires (), so the no-op impl is exercised through a real board rather than a test written for it.

Not settled here: what should happen when a report cannot be delivered. The seam keeps the SM safe either way, but a dropped ReportIsolated is currently unrecoverable, since isolation state is not queryable outside the report itself. To discuss before this leaves draft.

References 9elements#3.

chrysh added 2 commits August 27, 2026 21:46
The four Effect::Report* variants have no consumer seam. Add a
non_exhaustive Report enum and a single ReportSink::report instead of a
method or a trait per variant, so a new report is one variant rather
than a trait break and a sink routes only what it recognises.

report returns nothing: a report names something that already happened,
so an undeliverable one costs information, not containment, and
reporting stays off the driver's fail-closed path. A sink that needs to
know it dropped one records that on its own side.

Every payload stays Copy and lifetime-free, like the effects these
mirror; a report names its component and nothing more. The unit impl
drops them, for a board with no management side to tell. Trait only,
composing a sink into the board follows.

Assisted-by: Claude:claude-opus-5
…ability

BoardCapabilities gains ReportSink and Board a single report_sink field,
one per platform rather than one per component: two of the four reports
name no component. The Report effects leave the not-yet-composed group
and hand their Report to the sink.

Executing a report returns no error, so it never reaches the fail-closed
group: an Isolable component is contained, reported, and the platform
stays Ready. Delivery order is the SM's emission order.

WatchBoard wires the unit sink, so the no-op impl is exercised through a
real board rather than a test written for it.

Assisted-by: Claude:claude-opus-5
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant