11 KiB
Reporting Governance Capability Descriptor
Purpose
This document defines the capability descriptor for the reporting-governance plugin.
It turns runtime support from implied prose into a machine-readable contract that can be:
- validated before deployment
- checked against deployment profiles
- attached to audit bundles
- used by the next implementation stage for evaluator / decision-runner wiring
This spec is intentionally the next step after:
docs/specs/reporting-governance-adapter-interface.mddocs/specs/reporting-governance-deployment-model.mdschemas/reporting-governance/adapter-capabilities.schema.json
The adapter-interface spec defines what adapters must be able to describe. This capability-descriptor spec defines how one concrete runtime publishes that description as a package artifact.
Why this exists now
The current mainline already has:
- canonical event / evidence / decision / policy-pack contracts
- deployment profiles
- a validated watchdog reference runtime composition
But the plugin still lacks one package-level truth source answering:
- which runtime surfaces exist in this deployment
- which enforcement actions are actually available
- whether the runtime can only queue, can bridge, or can truly ack final delivery
- which storage and receipt guarantees are real
Without a capability descriptor, the next evaluator / decision-runner stage would still have to guess runtime powers from docs and scripts.
Scope
This spec defines:
- the package role of a capability descriptor
- the minimum descriptor shape
- the OpenClaw reference descriptor for the watchdog composition
- package-boundary implications for
core/,adapters/,storage/,artifacts/, and reference implementations - how evaluator / decision-runner should consume descriptor data next
This spec does not define:
- the policy evaluator itself
- the deployment-profile schema
- one mandatory programming language API
- the full audit export manifest format
Mainline decision
The reporting-governance plugin now uses this package distinction:
- schema: validation contract for descriptor shape
- capability descriptor: one concrete runtime claim validated by that schema
- deployment profile: requested operating posture
- adapter modules: implementation surfaces that may satisfy some or all requested posture
In short:
- profiles express desired behavior
- capability descriptors express actual runtime power
- evaluator / decision-runner must operate from the intersection of both
Package location
Capability descriptors belong under the plugin package boundary:
plugins/reporting-governance/
capabilities/
openclaw-watchdog-reference.json
examples/
openclaw-watchdog-reference.descriptor.example.json
The canonical validation schema remains under:
schemas/reporting-governance/capability-descriptor.schema.json
This keeps the split clear:
schemas/= canonical validation contractsplugins/reporting-governance/capabilities/= package-owned runtime declarations;runtime.entrypoint: "scripts/..."is resolved relative to the package rootplugins/reporting-governance/examples/= copyable reference inputs using the same package-root-relativescripts/...semantics
Descriptor responsibilities
A capability descriptor must answer five questions.
1. What runtime is this?
Examples:
openclaw- future host runtimes
- future embedded or CI-only runtimes
2. Which adapter surfaces are present?
Examples:
watchdogqueuedispatcherbridgesender_bindingorchestrator
3. Which governance actions are truly available?
Examples:
- block transition
- rewrite message
- annotate placeholder
- force checkpoint
- request review
- downgrade status
- escalate
4. What notification truth model is supported?
At minimum, whether the runtime distinguishes:
preparedqueueddispatchedpending_external_sendackedblocked
5. What persistence and audit guarantees exist?
Examples:
- can events be persisted?
- can receipts be written?
- can original attempted messages be preserved?
- can decision outputs be stored yet, or is that still pending the next phase?
Descriptor shape
The canonical descriptor shape is validated by:
schemas/reporting-governance/capability-descriptor.schema.json
The schema reuses the same top-level resource model already established for adapter capabilities:
apiVersionkindmetadataruntimecompatibilitycapabilities- optional
defaults - optional
notes
OpenClaw reference descriptor
The first package-mainline descriptor is the OpenClaw watchdog reference composition.
Descriptor identity:
- runtime:
openclaw - mode:
hybrid - runtime
entrypoint:scripts/watchdog_auto_notify_orchestrator.mjsresolved fromplugins/reporting-governance/package root - surfaces:
watchdogqueuedispatcherbridgesender_bindingorchestratorschedulerstorage
What it must claim
This reference descriptor should claim support for:
- watchdog overdue observation
- canonical watchdog event generation
- queue-backed operator notices
- spool/handoff dispatch
- bridge-supervised sender invocation
- truthful
acked | blocked | pending_external_sendoutcomes - persistence of events, evidence, queue items, spool artifacts, and receipts
What it should not overclaim
At this stage, the reference descriptor should not overclaim:
- full inline hook interception as complete
- final delivery proof in every deployment
- fully packaged decision persistence if the evaluator / decision runner is not extracted yet
- all completion-claim governance paths
This is why some support levels remain partial rather than full.
Package boundary decisions
This spec fixes the package skeleton boundaries needed for the next implementation round.
src/core/
core/ contains runtime-agnostic governance logic.
It should own:
- canonical event normalization
- evidence building / evidence-reference shaping
- policy evaluation
- decision execution planning
- capability/profile compatibility checks
It should not own:
- cron installation
- filesystem-specific queue scanning loops
- OpenClaw sender invocations
- repo-local wrapper scripts
Minimum package direction:
src/core/
capability-profile-compatibility.mjs
decision-runner.mjs
evidence-builder.mjs
event-normalizer.mjs
policy-evaluator.mjs
src/adapters/
adapters/ contains runtime-facing integration modules.
It should own:
- OpenClaw watchdog adapter wrapper
- queue / dispatcher adapter wrapper
- bridge adapter wrapper
- sender-binding adapter wrapper
- orchestrator adapter wrapper
It may initially wrap existing repo scripts while package extraction is still in progress.
It should not absorb canonical policy semantics that belong in core/.
Minimum package direction:
src/adapters/
bridge-adapter.mjs
dispatcher-adapter.mjs
orchestrator-adapter.mjs
sender-binding-adapter.mjs
watchdog-adapter.mjs
src/storage/
storage/ contains package-level readers/writers for durable governance artifacts.
It should own contracts for:
- event store
- evidence store
- receipt store
- queue-item store
- spool-artifact store
- future decision store
- future audit export manifest support
It should not define governance meaning; it only persists governed artifacts.
Minimum package direction:
src/storage/
decision-store.mjs
event-store.mjs
evidence-store.mjs
queue-store.mjs
receipt-store.mjs
spool-store.mjs
artifacts/ boundary
The plugin package does not need a required checked-in artifacts/ source directory yet.
Instead, artifacts are the runtime outputs produced by storage contracts and runtime bindings.
For current OpenClaw reference behavior, the artifact classes are still represented by runtime directories such as:
state/long-task-watchdog/state/long-task-watchdog-events/state/operator-notify-queue/state/operator-notify-dispatch-spool/state/operator-notify-bridge-receipts/state/operator-notify-sender-attempts/
Mainline interpretation:
- these are runtime artifact locations
- package
src/storage/should become the code boundary that reads/writes them - future audit export bundles should consume these classes through storage abstractions rather than raw script coupling
Reference implementations boundary
Reference implementations are executable, runtime-specific realizations of the package contracts.
For this MVP stage, the main reference implementation is the watchdog chain described in:
CODER_WATCHDOG_REPORT.md
Within the package skeleton, it belongs under:
plugins/reporting-governance/src/reference/openclaw-watchdog-chain.md
and is represented in code-adjacent terms by:
src/adapters/watchdog-adapter.mjssrc/adapters/dispatcher-adapter.mjssrc/adapters/bridge-adapter.mjssrc/adapters/sender-binding-adapter.mjssrc/adapters/orchestrator-adapter.mjs
This means the watchdog reference runtime composition is categorized as a reference implementation, not as plugin core.
That is the key boundary that keeps the next evaluator / decision-runner work clean.
Consumption by evaluator / decision runner
The next implementation stage should use the capability descriptor in two places.
1. Preflight compatibility
Before executing a policy action, the runtime should compare:
- requested profile behavior
- policy-required action
- actual adapter capability support
Examples:
- if
force_checkpointis requested but only queue/bridge notice is available, downgrade to honest deferred notice + receipt - if direct send is requested but only
pending_external_sendis supportable, preserve the weaker truthful state
2. Action planning
The decision runner should use capability support to choose execution paths such as:
- inline block
- queue-only notice
- bridge-mediated send
- status downgrade + review request
- blocked-with-gap receipt
This keeps the evaluator portable and avoids encoding OpenClaw-specific assumptions inside core/.
Verification expectations
Capability descriptor work should be verified at minimum by:
- schema validation of the descriptor JSON
- package skeleton presence checks
- consistency review against:
- adapter-interface spec
- deployment model
- roadmap lane terminology
Minimal synchronization with roadmap and deployment model
This capability-descriptor step advances:
- roadmap lane 3: package extraction
- roadmap lane 4: capability/profile/deployment binding
The deployment model does not need redesign. It only needs to recognize that the first concrete package artifact for this lane is now:
- a package-owned OpenClaw capability descriptor
- plus the minimal package skeleton that gives it a stable home
Summary
This spec establishes the reporting-governance capability descriptor as the package-level truth contract between:
- runtime-specific adapter power
- deployment-profile intent
- future evaluator / decision-runner behavior
It also fixes the package boundaries needed for the next phase:
core/= runtime-agnostic governance logicadapters/= runtime integration surfacesstorage/= durable artifact I/O contracts- runtime
artifacts/= produced outputs, not core source - watchdog chain = reference implementation housed under the package skeleton, not plugin core