Task Feedback
A node reports progress on a task it is executing.
MessageTypeEnum_TASK_FEEDBACK
A node reports progress on a task it is executing.
| Direction | node → controller |
| Cadence | Periodic while a task is active, and on state change. |
| Delivery | Addressed — command plane (QoS 1, exactly-once) |
| Schema | catl/hibw/messages/task/TaskFeedback.json |
| Worked examples | 2 |
Purpose
In-flight progress for an assigned task: current state (ACTIVE / PAUSED / COMPLETED / REJECTED / CANCELLED), percent_complete, per-constraint compliance, and an optional typed feedback union with task-specific detail. Lets a controller track execution without polling.
When to send it
- On a cadence while the task is ACTIVE.
- Immediately on a state transition (accepted, paused, about to complete).
- When constraint compliance changes (e.g. a range breach).
Where it fits
Message header
Every CATL message carries this envelope header.
| Field | Type | Multiplicity | Description |
|---|---|---|---|
message_type | MessageTypeEnum | [1..1] | An enumeration. |
source | GUID | [1..1] | Source that send this message. Often same as source of information, but different when relaying. |
version | string | [1..1] | Version of the schema used to create and validate this message. Has to follow major.minor.patch notation. For study draft 3 it should be 0.3.0. |
time_sent | Time | [1..1] |
Body — TaskFeedbackBody
Inherits from base::tasks::TaskIdentifierAndStatus.
| Field | Type | Multiplicity | Description |
|---|---|---|---|
percent_complete (inherited) | PercentageBound | [1..1] | A percentage of task completion. |
time_remaining (inherited) | Duration | [0..1] | Time remaining (estimated) till task is completed. |
waypoints_remaining (inherited) | GUID [] | [0..*] | |
identifier (inherited) | GUID | [1..1] | TaskIdentifier - specialization of FlexibleEnumeration to deal with tasks |
state (inherited) | TaskStateEnum | [1..1] |
| Field | Type | Multiplicity | Description |
|---|---|---|---|
node | GUID | [1..1] | |
feedback | TaskFeedbackUnion | [0..1] | |
constraints_compliance | TaskConstraintsCompliance [] | [0..*] | |
binding | BindingInformationType | [0..1] |
Full TaskFeedbackBody reference →
Key fields
identifier— Must match theidentifierfrom the originating TASK_ADMIN so the controller can correlate.state—TaskStateEnum— the current execution state. Required.percent_complete— 0–100 progress. Optional but expected for long-running tasks.constraints_compliance— Per-constraint compliance array — proactively reports breaches.
Worked examples
Task Feedback Simple
✅ validates against catl/hibw/messages/task/TaskFeedback.json. Routes to 4817/exercise-alpha/v0.3.0/dst/node-bravo/task/feedback (QoS 1).
{
"header": {
"message_type": "MessageTypeEnum_TASK_FEEDBACK",
"source": "a895f8f5-46b0-5603-bdf0-b270a2867c09",
"version": "0.3.0",
"time_sent": "2025-03-18T12:05:00+00:00"
},
"body": {
"percent_complete": 0,
"identifier": "a895f8f5-46b0-5603-bdf0-b270a2867c09",
"state": "TaskStateEnum_ACTIVE",
"node": "a895f8f5-46b0-5603-bdf0-b270a2867c09"
}
}Task Feedback Complex
✅ validates against catl/hibw/messages/task/TaskFeedback.json. Routes to 4817/exercise-alpha/v0.3.0/dst/node-bravo/task/feedback (QoS 1).
{
"header": {
"message_type": "MessageTypeEnum_TASK_FEEDBACK",
"source": "a895f8f5-46b0-5603-bdf0-b270a2867c09",
"version": "0.3.0",
"time_sent": "2025-03-18T12:05:00+00:00"
},
"body": {
"percent_complete": 0,
"identifier": "a895f8f5-46b0-5603-bdf0-b270a2867c09",
"state": "TaskStateEnum_ACTIVE",
"node": "a895f8f5-46b0-5603-bdf0-b270a2867c09",
"constraints_compliance": [
{
"state": "ConstraintStateEnum_ACTIVE",
"breach_reason": "",
"identifier": "c91c56bc-29e2-5533-9192-3f37585bea33",
"constraint": {
"$discriminator": "GeneralConstraintTypeEnum_TOGGLE",
"toggle": {
"value": false
}
}
},
{
"state": "ConstraintStateEnum_BREACH",
"breach_reason": "",
"identifier": "c91c56bc-29e2-5533-9192-3f37585bea33",
"constraint": {
"$discriminator": "GeneralConstraintTypeEnum_RANGE",
"range": {
"value": 15.2
}
}
},
{
"state": "ConstraintStateEnum_BREACH",
"breach_reason": "",
"identifier": "c91c56bc-29e2-5533-9192-3f37585bea33",
"constraint": {
"$discriminator": "GeneralConstraintTypeEnum_ENUMERATION",
"enumeration": {
"value": {
"name": "ON"
}
}
}
},
{
"state": "ConstraintStateEnum_BREACH",
"breach_reason": "",
"identifier": "c91c56bc-29e2-5533-9192-3f37585bea33",
"constraint": {
"$discriminator": "GeneralConstraintTypeEnum_EQUIPMENT",
"equipment": {
"emission_control": "ConstraintTypeEmissionControlEnum_ROUTINE"
}
}
}
],
"binding": {
"metadata_binding_container": [
{
"metadata_binding": [
{
"metadata": [
{
"$discriminator": "MetadataUnionEnum_METADATA",
"metadata": {
"originator_confidentiality_label": {
"confidentiality_information": {
"policy_identifier": {
"uri": ""
},
"classification": {
"value": {
"name": "ClassificationEnum_UNCLASSIFIED_OFFICIAL"
}
}
},
"creation_date_time": "2026-01-23T17:24:01.662059+00:00"
}
}
}
],
"data": [
{
"$discriminator": "DataUnionEnum_DATA_REFERENCE",
"data_reference": {
"uri": ""
}
}
]
}
]
}
]
}
}
}Integrate it
The two calls every integrator needs — validate the message, then resolve its MQTT route (this type is addressed, so pass a dest_id):
# 1 · fetch a worked Task Feedback example
curl -s https://4817.r2d2.office.ilab.zone/examples/catl_15_task_feedback_simple.json | jq '.message' > msg.json
# 2 · validate it against the 0.3.0 schema
curl -s https://4817.r2d2.office.ilab.zone/validate -H 'content-type: application/json' \
-d "{\"message\": $(cat msg.json)}" | jq '{valid, schema_ref, errors}'
# 3 · resolve where it publishes on MQTT
curl -s "https://4817.r2d2.office.ilab.zone/route?dest_id=node-bravo" -H 'content-type: application/json' \
-d "{\"message\": $(cat msg.json)}" | jqTry them interactively in the Integration API reference.