Automatisation de bureau gouvernée
adk-computer-use est une couche de gouvernance au-dessus du serveur dâautomatisation de bureau computer-use-mcp. Elle nâeffectue aucune action elle-mĂȘme : elle ordonne lâobservation, lâapprobation, la mutation et la vĂ©rification sous forme de graphe dĂ©terministe, et vĂ©rifie ce que renvoie le runtime externe.
Liaison des réponses
Le runtime externe fait autoritĂ©, mais ses rĂ©ponses sont vĂ©rifiĂ©es localement avant dâentrer dans lâĂ©tat du graphe. Les vĂ©rifications sâexĂ©cutent dans le graphe de rĂ©fĂ©rence pour chaque implĂ©mentation ComputerUseRuntime, et lâadaptateur MCP les rĂ©pĂšte Ă sa frontiĂšre dâappel direct. La dĂ©sĂ©rialisation typĂ©e prouve la forme, pas la provenance â ControlLease, TargetReservation et ExecutionReceipt nâont pas de constructeur imposant des invariants, donc un objet bien formĂ© appartenant Ă une autre session se parse correctement.
Chaque rĂ©ponse est rattachĂ©e Ă la requĂȘte qui lâa produite :
| Réponse | Vérifié par rapport à l'enveloppe |
|---|---|
ControlLease | session_id, principal_id, agent_id, execution_mode, état actif, non expiré expires_at, budget restant (actions_used < action_budget), et cible dans boundaries |
TargetReservation | session_id, principal_id, agent_id, execution_group_id, intent_id == action_id, Ă©tat actif, non expirĂ© expires_at, et portĂ©e cible exacte de l'application/de la fenĂȘtre |
ExecutionReceipt | session_id, action_id et action_digest par rapport Ă args_digest de l'enveloppe |
Une divergence produit ComputerUseError::IdentityMismatch en nommant le champ, et la réponse est rejetée plutÎt que stockée.
use adk_computer_use::runtime::binding::validate_lease;
// Refuses a lease that is well-formed but belongs to another session.
validate_lease(&lease, &envelope)?;
Note : le digest est la liaison la plus forte disponible.
args_digestest ce qui a reçu lâapprobation, donc un reçu portant un digest diffĂ©rent dĂ©crit un travail diffĂ©rent mĂȘme lorsque tous les identifiants correspondent.
Un champ optionnel qui revient absent est traité comme une sous-spécification, et non comme une contradiction ; un champ qui est présent et différent constitue une divergence.
RĂ©validation au moment de lâexĂ©cution
Lâaperçu nâest pas une autoritĂ© de mutation. Le graphe de rĂ©fĂ©rence rĂ©valide toutes les entrĂ©es de mutation dans le nĆud execute juste avant dâappeler execute_action :
| Entrée | Vérification immédiate |
|---|---|
ActionEnvelope | horodatages RFC 3339, fenĂȘtre de validitĂ© positive, et now < expires_at |
ControlLease | identité, mode, état actif, budget restant, expiration et limites cibles |
TargetReservation | identitĂ©, intention dâaction, Ă©tat actif, expiration et portĂ©e cible exacte |
| Approval | route, rĂ©sumĂ© dâaction, rĂ©sumĂ© de politique et exactement une source dâautoritĂ© (grantId ou approbation dĂ©tenue Ă lâexĂ©cution) |
La vĂ©rification de lâenveloppe sâexĂ©cute aussi au retour de lâaperçu, de sorte quâun aperçu dĂ©jĂ expirĂ© nâatteint jamais la rĂ©servation ni lâapprobation. Elle sâexĂ©cute Ă nouveau lors de lâexĂ©cution, car une interruption dâapprobation, une rĂ©servation de cible ou lâacquisition dâun bail peuvent consommer la fenĂȘtre de validitĂ© restante.
ComputerUseMcpRuntime conserve lâenveloppe exacte renvoyĂ©e par preview_action. Un appel direct Ă
execute_action est rejetĂ© si un champ de lâenveloppe change aprĂšs lâaperçu, mĂȘme lorsque lâID
de lâaction correspond toujours.
Pour la reprise Ă partir dâun point de contrĂŽle, le graphe stocke lâaperçu dâexĂ©cution dans un canal dâĂ©tat en ajout uniquement. Lâapprobation et lâexĂ©cution exigent que ce canal contienne exactement un aperçu correspondant Ă lâaperçu actif. LâentrĂ©e de reprise peut ajouter de lâĂ©tat mais ne peut pas remplacer la valeur mise en point de contrĂŽle : une tentative de remplacement crĂ©e une deuxiĂšme entrĂ©e et Ă©choue avant la rĂ©servation ou la mutation.
Nettoyage de la réservation
Une fois une réservation acceptée, chaque chemin terminal tente de la libérer :
- Ă©checs de lâacquisition de bail, de lâautorisation, de la validation, de lâexĂ©cution, du reçu et de la vĂ©rification ;
- vérification réussie ; et
- échecs de validation ou de sérialisation de la réservation lorsque le runtime a renvoyé une réservation.
LâĂ©chec principal reste principal lorsque le nettoyage rĂ©ussit. Si le nettoyage Ă©choue aussi, le graphe renvoie une erreur dĂ©terministe contenant les deux Ă©checs. Un Ă©chec de nettoyage aprĂšs une vĂ©rification par ailleurs rĂ©ussie est renvoyĂ© comme une erreur plutĂŽt que masquĂ©.
La vĂ©rification nâest pas lâengagement
ComputerUseRuntime::verify renvoie un VerificationOutcome, pas un booléen :
| Résultat | Signification | is_verified() | is_committed() | status() |
|---|---|---|---|---|
Verified | La postcondition déclarée a été observée comme satisfaite | true | true | completed |
CommittedUnverified | Le runtime a exĂ©cutĂ© lâaction ; aucune preuve de postcondition | false | true | committed_unverified |
Failed | Non validé, ou les preuves contredisent la postcondition | false | false | verification_failed |
Le nĆud verify du graphe Ă©crit verified, committed et un result.verificationDetail
expliquant tout ce qui est inférieur à Verified.
Important : un reçu engagĂ© est une reconnaissance que lâaction a Ă©tĂ© acceptĂ©e et exĂ©cutĂ©e. Ce nâest pas une preuve que lâeffet attendu sâest produit.
verifyrenvoyait auparavantreceipt.status == Committed, qui signalait quâune action engagĂ©e mais inefficace Ă©tait terminĂ©e â Ă partir dâun nĆud intitulĂ© « verify ».
Ce qui compte comme preuve
Pour une postcondition déclarant un digest (valueDigest, contentDigest), la vérification nécessite
un verification.observedDigest sur le résultat du reçu qui correspond à celui-ci. Pour une postcondition
dĂ©clarant uniquement lâexistence, une verification.satisfied: true explicite est requise.
| Preuve de réception | Résultat |
|---|---|
verification.satisfied: false | Failed â une observation nĂ©gative explicite |
observedDigest correspond au digest attendu | Verified |
observedDigest diffĂšre | Failed |
Aucun objet verification | CommittedUnverified |
verification présent, aucun observedDigest, digest attendu | CommittedUnverified |
Lâabsence de preuve nâest jamais considĂ©rĂ©e comme une preuve de succĂšs. Si computer-use-mcp vĂ©rifie
avant dâĂ©mettre un reçu, câest son contrat ; cet adaptateur ne le prĂ©sume pas.
Limites du bail
Un bail est refusé sauf si toutes les conditions suivantes sont remplies :
| Vérification | Rejeté lorsque |
|---|---|
| Expiration | expires_at est dans le passĂ©, ou ne peut pas ĂȘtre analysĂ© comme RFC 3339 |
| Budget restant | actions_used >= action_budget |
| Limite de la cible | target.app_id de l'enveloppe est absent d'un boundaries.app_ids non vide |
| Limite de fenĂȘtre | target.window_id de l'enveloppe est absent d'un boundaries.window_ids non vide |
Des bornes vides signifient « non dĂ©limitĂ© » et autorisent toute cible â lâabsence de restriction nâest pas une restriction Ă rien.
Important : la premiÚre version de ce validateur vérifiait
action_budget == 0, qui est le budget total, donc un bail avecaction_budget: 1, actions_used: 1passait tout en nâautorisant rien. Elle ne lisait jamais non plusexpires_atniboundaries, de sorte quâun bail expirĂ© et un bail limitĂ© Ă une application diffĂ©rente Ă©taient tous deux acceptĂ©s. Une expiration impossible Ă analyser est rejetĂ©e plutĂŽt quâignorĂ©e : un bail dont la validitĂ© ne peut pas ĂȘtre Ă©tablie nâest pas valide.