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éponseVérifié par rapport à l'enveloppe
ControlLeasesession_id, principal_id, agent_id, execution_mode, état actif, non expiré expires_at, budget restant (actions_used < action_budget), et cible dans boundaries
TargetReservationsession_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
ExecutionReceiptsession_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_digest est 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éeVérification immédiate
ActionEnvelopehorodatages RFC 3339, fenĂȘtre de validitĂ© positive, et now < expires_at
ControlLeaseidentité, mode, état actif, budget restant, expiration et limites cibles
TargetReservationidentitĂ©, intention d’action, Ă©tat actif, expiration et portĂ©e cible exacte
Approvalroute, 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ésultatSignificationis_verified()is_committed()status()
VerifiedLa postcondition déclarée a été observée comme satisfaitetruetruecompleted
CommittedUnverifiedLe runtime a exĂ©cutĂ© l’action ; aucune preuve de postconditionfalsetruecommitted_unverified
FailedNon validé, ou les preuves contredisent la postconditionfalsefalseverification_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. verify renvoyait auparavant receipt.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éceptionRésultat
verification.satisfied: falseFailed — une observation nĂ©gative explicite
observedDigest correspond au digest attenduVerified
observedDigest diffĂšreFailed
Aucun objet verificationCommittedUnverified
verification présent, aucun observedDigest, digest attenduCommittedUnverified

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érificationRejeté lorsque
Expirationexpires_at est dans le passĂ©, ou ne peut pas ĂȘtre analysĂ© comme RFC 3339
Budget restantactions_used >= action_budget
Limite de la cibletarget.app_id de l'enveloppe est absent d'un boundaries.app_ids non vide
Limite de fenĂȘtretarget.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 avec action_budget: 1, actions_used: 1 passait tout en n’autorisant rien. Elle ne lisait jamais non plus expires_at ni boundaries, 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.

Automatisation de bureau gouvernée - Documentation ADK-Rust | ADK-Rust