A telecommand declared hazardous in the catalogue never leaves without a human confirmation,
where the environment asks for one. The procedure marks the point of confirmation
(ask operator); the environment decides who confirms: nobody on a simulator or a flatsat in
AIT, the operator in IVV, an operator then a supervisor in orbit. The text of the procedure is the
same everywhere.
Human orchestration#
Identity, confirmations, supervisor validation and mandatory planning form one block of the
environment, human_orchestration:
environments:
AIT:
allow_draft: true
human_orchestration: off
IVV:
allow_draft: false
human_orchestration:
identity: declared
hazardous_confirmation: [operator]
in_orbit:
allow_draft: false
human_orchestration:
identity: jwt
hazardous_confirmation: [operator, supervisor]
hazardous_requires_plan: true| Key | Meaning |
|---|---|
human_orchestration: off | None of these rules applies: no identity required, confirmations acknowledged automatically and traced as such, manual runs free |
identity | jwt (default): verified OIDC tokens only; declared: a declared identity (--as, --role) is accepted too |
hazardous_confirmation | The roles that confirm a hazardous telecommand, in order; it starts with operator, the supervisor can only come second |
hazardous_requires_plan | A run that sends a hazardous telecommand must be scheduled on a pass |
See Environments and Policies.
In the procedure#
Each send of a hazardous telecommand follows, in the same step, its own ask operator "…"
confirmation, or the compiler refuses the step (procedure::unconfirmed-hazardous):
procedure "Blank firing"
uses sat: platform-v3
input tcu: tcu_id
step "Fire the blank"
ask operator "Fire the blank on the TCU?"
send blank_firing to sat.tcu[tcu]See Safety Rules.
The confirmation flow#
In a step that sends a hazardous telecommand, an ask operator without typed answer is a
confirmation. Each role of hazardous_confirmation answers it in turn:
sequenceDiagram
participant E as Executor
participant O as Operator
participant S as Supervisor
E->>E: asked (role: operator)
O->>E: stellar answer <run> yes
E->>E: answered (by: alice, role: operator)
E->>E: asked (role: supervisor)
S->>E: stellar answer <run> yes
E->>E: answered (by: carol, role: supervisor)
E->>E: send the hazardous telecommand-
The executor logs
askedwith the role awaited;stellar statusandGET /v1/runs/{id}show it (pending.role), andstellar watchprintsask « … », confirmation of the operator. -
An answer is taken only from a person who has the role awaited and has not confirmed the step yet: the operator and the supervisor are two distinct people.
-
With
identity: jwt, the executor checks the token again itself: its signature, its expiry, its subject equal to the author of the answer, and the roles it carries. Withidentity: declared, the declared roles suffice. -
An answer that does not qualify is logged as
answer_refused, with its author and the reason, and the wait goes on:text answer of alice not taken: `alice` already confirmed this step answer of bob not taken: `bob` is not supervisor -
An explicit refusal (
stellar answer <run> no) fails the step: the telecommand is not sent.
The report and the log show every confirmation with its role, its author and its time, and every answer refused.
# The operator
stellar answer <run> yes --token "$OPERATOR_TOKEN"
# The supervisor, from their own session
stellar answer <run> yes --token "$SUPERVISOR_TOKEN"Where declared identities are accepted (identity: declared), --as and --role identify the
person: stellar answer <run> yes --as carol --role supervisor. They are refused where the
environment requires tokens, such as in_orbit.
Without human orchestration, the confirmation is acknowledged automatically (answered without
author) and the run does not stop.
How long a confirmation waits#
- For a run bound to a pass (
plan), the wait ends at the LOS of the pass minusscheduler.margin. Past it, the step fails cleanly, without sending the telecommand: "no answer before … (end of the pass minus the margin): nothing sent". - A manual run waits without limit, until an answer, a suspension or an abort.
Mandatory planning#
With hazardous_requires_plan: true, a run whose procedure sends a hazardous telecommand,
directly or through its calls, cannot be launched by hand:
- without
plan, the request is refused at resolution (422 run::plan-required); - with a
plantoo (422 run::must-be-scheduled): it starts only from a schedule, which the scheduler submits itself at its time (POST /v1/schedules,stellar schedules add).
In in_orbit, the pass must also be booked. See Scheduling.
Two validations: the plan, then the step#
The supervisor validates twice, because the state of the satellite may change between the planning and the pass:
- The plan, beforehand. A schedule whose run sends a hazardous telecommand, in an
environment where the supervisor confirms, is marked
needs_validationwhen it is created. It staysat_risk("awaiting the validation of the plan by a supervisor") and does not start until a validation holds. - The telecommand, live, during the pass, as above.
STELLAR_TOKEN="$SUPERVISOR_TOKEN" stellar schedules validate sch-0142POST /v1/schedules/{id}/validate is reserved to an identity with the role supervisor
(403 schedule::not-supervisor otherwise), allowed by the environment of the schedule. It records
the validation: who, when, the pass, its AOS and LOS, and the hash of the resolved run, which
covers the procedure, the inputs and the targets.
Any change of what was validated makes the validation fall, for good: at each evaluation, the
scheduler compares it with the schedule and its pass (same resolved run, same pass, same AOS and
LOS). At the first difference, the validation is dropped ("the validation of carol fell: the
window of pass … changed") and the schedule is at_risk again, until a new validation.
Replacing the schedule drops it too. A schedule still without a valid validation at its time is
missed: nothing is sent.
Identity everywhere#
The identity rules of the environment apply to the launch, to the answers, to the commands of a run (suspend, resume, abort), and to the creation and the validation of a schedule. See Identity and Roles.