In divviup/janus@aacea12, part of divviup/janus#4684, we're preparing the task's validity interval (task_start + task_duration) to become part of the HPKE-AAD TaskConfiguration. Once that lands, the interval must be immutable -- mutating it would change the AAD and break already-uploaded reports.
As a result, the aggregator's PATCH /tasks/{task_id} endpoint will change:
- The old
task_end field (which recomputed the validity interval's duration) goes away.
- It's replaced by
deactivate_at, an Janus-specific field that is not part of the TaskConfiguration/AAD, so it can be changed freely at any time.
- Once the aggregator's clock reaches
deactivate_at, the task stops accepting report uploads (and helper aggregation), which is the "disable/expire this task" behavior.
deactivate_at is an ISO 8601 timestamp (e.g. "2026-07-01T00:00:00Z").
We need to:
- Update the aggregator client's task-patch request to send
deactivate_at instead of task_end.
- Map the control-plane "disable/expire task" action onto
deactivate_at rather than task_expiration. Since both aggregators are provisioned from a single ProvisionableTask, send the same value to leader and helper.
- Confirm nothing else relies on PATCHing the task's validity interval: that interval is now fixed at creation and no longer mutable!
In divviup/janus@aacea12, part of divviup/janus#4684, we're preparing the task's validity interval (task_start + task_duration) to become part of the HPKE-AAD TaskConfiguration. Once that lands, the interval must be immutable -- mutating it would change the AAD and break already-uploaded reports.
As a result, the aggregator's
PATCH /tasks/{task_id}endpoint will change:task_endfield (which recomputed the validity interval's duration) goes away.deactivate_at, an Janus-specific field that is not part of the TaskConfiguration/AAD, so it can be changed freely at any time.deactivate_at, the task stops accepting report uploads (and helper aggregation), which is the "disable/expire this task" behavior.deactivate_atis an ISO 8601 timestamp (e.g. "2026-07-01T00:00:00Z").We need to:
deactivate_atinstead oftask_end.deactivate_atrather thantask_expiration. Since both aggregators are provisioned from a single ProvisionableTask, send the same value to leader and helper.