Process · simple — répondre à une question RH, par personne
Le cas. Le même reporting RH, mais chaque personne agit sous sa propre identité : un manager lit ses équipes, les RH lisent tout le monde, et un manager voit les initiales des salariés, pas leur nom.
Ce que l'exemple montre. L'identité transmise à l'outil (on_behalf_of), deux profils, des
gardes sur des lectures, une condition qui lie la donnée à l'identité, un filtre de sortie par
profil.
examples/cible/process-simple.yaml
# Process · simple — CIBLE. HR answers, now per person: a manager reads their own teams only,
# HR reads everyone; names are reduced for managers; reads have guards too.
station:
id: rh-reporting
kind: process
name: Reporting RH
guidance: {max_mode: observe}
identity: # the identity providers this station accepts (ADR-031)
providers:
entra: {mechanism: oidc, verifies: email, issuer: "https://login.microsoftonline.com/acme/v2.0",
client_id_env: ENTRA_CLIENT_ID,
attributes: {roles: groups, teams: teams, manager: manager}} # what rules may read: identity.roles, .teams, .manager
global: # applies to every field of its type, every skill
language: fr
currency: EUR # every `type: price` field
locale: fr-FR
timezone: Europe/Paris
apis:
- name: rh
openapi_url: https://rh-api.example.fr/openapi.json
base_url: https://rh-api.example.fr
auth: {type: oauth2, on_behalf_of: identity} # the tool sees WHO asks, not one shared key
operations:
- {id: listTeams, access: read}
- {id: getOvertimeReport, access: read}
profiles:
manager: {when: "'manager' in identity.roles", grants: [rh.listTeams, rh.getOvertimeReport]}
rh: {when: "'hr' in identity.roles", grants: [rh.listTeams, rh.getOvertimeReport]}
skills:
- name: equipes
invoke:
method: listTeams
present: {fields: {name: {from: name, type: text, role: title}}}
render: {component: cards}
- name: rapport-heures-sup
params:
team: {type: text, set_by: [llm, person]}
invoke:
method: getOvertimeReport
args: {team: "$params.team"}
guards: # a read has guards too: at invoke
- {name: ses-equipes, require: "'rh' in profiles or $params.team in identity.teams"} # a manager reads their own teams
present:
fields:
total: {from: total_overtime_hours, type: quantity, role: headline}
person: {from: employee_name, type: text, class: personal}
per_profile:
manager: {output_filters: {reduce: {person: initials}}}
render:
component: report
report: {headline: total, unit: h, series: weeks, point_label: week_starting,
point_value: overtime_hours, highlight: worst_week}
agent:
name: Reporting RH
persona: "un analyste RH qui parle chiffres, brièvement"
tone: professional
portals:
teams:
app: reporting-rh
identity: {auth: entra} # Entra ID: roles and teams come from the directory
Ce qui se passe
| qui demande | Core | résultat |
|---|---|---|
| un manager, sur son équipe | grant de manager ; team in identity.teams | le rapport, noms réduits aux initiales |
| un manager, sur une autre équipe | la condition ne tient pas | refusé : « vous n'avez pas accès à cette équipe » |
| une personne des RH, sur n'importe quelle équipe | grant de rh | le rapport complet |
| un salarié sans rôle | aucun profil, donc aucun grant | refusé |
À retenir
- Une lecture a des gardes, déclarées sous
invoke.guards. - L'outil RH reçoit l'identité de la personne : sa propre politique d'accès s'applique en plus de celle de la station.