# Does a Google Drive API success response mean the outcome happened?

> Does a Google Drive API success response mean the outcome happened? Certification Provisional.

Canonical: https://provely.sh/verify/google_drive  
Last reviewed: 2026-09-05  
Skill version: 0.1.0  
Certification: provisional  

**No. Google Drive API returns a success response when it accepts the request. The file then holds one of 5 states. Only `content_stored` is terminal success. Provely proves `content_stored`, `created` and `granted` as separate promises.**

*Skill facts from the signed manifest.*

| Fact | Value |
| --- | --- |
| Skill version | `0.1.0` |
| Publisher | Built and signed by Provely. |
| Certification | Provisional (score 49 of 100) |
| Last conformance run | 2026-09-05T12:00:00Z: 41 of 41 cases passed, 0 critical false VERIFIED |
| Provider API versions | `v3.20260901` |
| Default provider API version | `v3.20260901` |
| Compiled | 2026-09-05T12:00:00Z by compiler 0.1.0 |
| Manifest hash | `653fa6b461e7e6e6` |
| Manifest hash check | the document hashes to the value the manifest states |
| Signature | valid, key `provely-skill-2026-09`, trusted by this build |

## What does this page prove?

| Claim | Proven by | Evidence | Status |
| --- | --- | --- | --- |
| A file resource that exists is not a file whose content arrived. This level compares the size and the checksum that Drive publishes. | [google_drive.file.content_stored](/verify/google_drive/google_drive.file.content_stored) | E2 + E3 | proven |
| The record exists with the intended name in the intended folder. It does not prove that the content of the file arrived. | [google_drive.file.created](/verify/google_drive/google_drive.file.created) | E2 + E3 | proven |
| A permission that exists is not a permission for the right person. This level reads the address, the type and the role of the grantee. | [google_drive.permission.granted](/verify/google_drive/google_drive.permission.granted) | E3 | proven |
| An outcome outside Google Drive API, such as a bank credit or a person who read a message | not proven | no E5 channel | not proven |
| The meaning of the `published_view` state of `google_drive.permission` | not proven | no source states it | not proven |
| The agent report that the action worked | never counts | E0 | not proven |

## Which completion levels does the Google Drive API skill expose?

Each level is one promise with one contract. An agent picks the level that matches the promise it makes. It cannot upgrade a level. Read the [completion level](/glossary/completion-level) definition.

| Level | Contract | Promise | Evidence | Certification |
| --- | --- | --- | --- | --- |
| `content_stored` | [google_drive.file.content_stored](/verify/google_drive/google_drive.file.content_stored) v1.0.0 | A file resource that exists is not a file whose content arrived. This level compares the size and the checksum that Drive publishes. | E2 + E3 | Provisional |
| `created` | [google_drive.file.created](/verify/google_drive/google_drive.file.created) v1.0.0 | The record exists with the intended name in the intended folder. It does not prove that the content of the file arrived. | E2 + E3 | Provisional |
| `granted` | [google_drive.permission.granted](/verify/google_drive/google_drive.permission.granted) v1.0.0 | A permission that exists is not a permission for the right person. This level reads the address, the type and the role of the grantee. | E3 | Provisional |

## What is the Google Drive API lifecycle?

### Which states can a `google_drive.file` be in?

| State | Class | Verdict | Meaning | Source |
| --- | --- | --- | --- | --- |
| `session_open` | transitional | PENDING | A resumable upload started. Drive answered 200 OK with a Location header, an empty body and no files resource. No File exists, and files.get answers 404. | [google_drive.docs.uploads](https://developers.google.com/workspace/drive/api/guides/manage-uploads) |
| `created` | transitional | PENDING | The File resource exists with an identifier, a name and a parent. Drive states no size and no md5Checksum yet, so no read proves the content. | [google_drive.docs.uploads](https://developers.google.com/workspace/drive/api/guides/manage-uploads) |
| `content_stored` | terminal success | VERIFIED | The File resource states size and md5Checksum. The two members report the content that Drive holds. | [google_drive.docs.uploads](https://developers.google.com/workspace/drive/api/guides/manage-uploads) |
| `converted` | terminal neutral | FAILED | Drive imported the content into a Google Workspace editor type. Drive states no md5Checksum for such a file, so no read can compare the bytes that the caller sent. | [google_drive.docs.uploads](https://developers.google.com/workspace/drive/api/guides/manage-uploads) |
| `trashed` | terminal neutral | FAILED | A person moved the file to the trash. The member trashed is true. | [google_drive.docs.uploads](https://developers.google.com/workspace/drive/api/guides/manage-uploads) |

In `google_drive.file` under provider API version `v3.20260901`, `content_stored` is the only state that means terminal success. Every other state gives PENDING, FAILED, or UNVERIFIABLE.

Source: https://www.googleapis.com/discovery/v1/apis/drive/v3/rest (retrieved 2026-09-09)

### Which states can a `google_drive.permission` be in?

| State | Class | Verdict | Meaning | Source |
| --- | --- | --- | --- | --- |
| `granted` | terminal success | VERIFIED | The access control list of the file holds the permission with the stated type and the stated role. | [google_drive.docs.sharing](https://developers.google.com/workspace/drive/api/guides/manage-sharing) |
| `pending_owner` | transitional | PENDING | The grantee has not accepted the transfer of ownership. The member pendingOwner is true. Drive populates it for a permission of type user on a file outside a shared drive. | [google_drive.docs.sharing](https://developers.google.com/workspace/drive/api/guides/manage-sharing) |
| `grantee_deleted` | terminal neutral | FAILED | The account behind the permission was deleted. The member deleted is true. | [google_drive.docs.sharing](https://developers.google.com/workspace/drive/api/guides/manage-sharing) |
| `published_view` | unknown | UNVERIFIABLE | The member view states published, and the published sentence then names the role publishedReader. No published role list of this compile states that role, and no source states what it permits. | [google_drive.docs.sharing](https://developers.google.com/workspace/drive/api/guides/manage-sharing) |

In `google_drive.permission` under provider API version `v3.20260901`, `granted` is the only state that means terminal success. Every other state gives PENDING, FAILED, or UNVERIFIABLE.

Source: https://www.googleapis.com/discovery/v1/apis/drive/v3/rest (retrieved 2026-09-09)

## How does Provely tie the evidence to this exact operation?

A matching state that already existed must not verify. Every contract names the [correlation](/glossary/correlation) keys that bind the evidence to the operation, and the [idempotency](/glossary/idempotency) key that stops a duplicate side effect.

| Strategy | Assurance | Keys | Required | Window |
| --- | --- | --- | --- | --- |
| `resource_id` | strong | file_id from `$action.result.id` | no | none |
| `fingerprint` | weak | name from `$input.name`; parent_id from `$input.parent_id` | no | 600000 ms |
| `resource_id` | weak | parent_id from `$input.parent_id` | no | 600000 ms |
| `resource_id` | weak | file_id from `$input.file_id` | no | 600000 ms |
| `resource_id` | strong | permission_id from `$action.result.id` | no | none |
| `fingerprint` | weak | file_id from `$input.file_id`; grantee_email from `$input.grantee_email` | no | 600000 ms |

*Figure: The skill reads the channels below. It prefers the ones furthest from the action.*

- E0 agent assertion: never sufficient.
- E1 action response: the provider acknowledged the request.
- E2 provider readback: the runtime read the resource back.
- E3 provider event: the provider reported the change.
- E4 independent system: a system outside the action path agrees.
- E5 external outcome: the result is observable in the world.

## Which evidence channels does the skill read?

The runtime prefers the channel that is more independent from the action path. Read the [evidence level](/glossary/evidence-level) definition. An [acknowledgement](/glossary/acknowledgement) from Google Drive API is E1 and never terminal success.

| Channel | Level | Independence | Verifier | Deterministic | Typical latency |
| --- | --- | --- | --- | --- | --- |
| `file_action_response` | E1 | same response | `action_result` | yes | not stated |
| `file_readback` | E2 | provider readback | `http` | yes | 300 ms |
| `folder_child_events` | E3 | provider event | `webhook` | no | 3000 ms |
| `permission_change_events` | E3 | provider event | `webhook` | no | 3000 ms |
| `permission_readback` | E2 | provider readback | `http` | yes | 300 ms |

## Which ways can a Google Drive API action look done and not be?

| Contract | Case | Rule | Verdict |
| --- | --- | --- | --- |
| [google_drive.file.content_stored](/verify/google_drive/google_drive.file.content_stored) | wrong subject | The file sits in a different folder than the intent named. | CONTRADICTED |
| [google_drive.file.content_stored](/verify/google_drive/google_drive.file.content_stored) | wrong subject | The file carries a different name than the intent named. | CONTRADICTED |
| [google_drive.file.content_stored](/verify/google_drive/google_drive.file.content_stored) | pre existing state | The file is older than the operation. It proves nothing. | CONTRADICTED |
| [google_drive.file.content_stored](/verify/google_drive/google_drive.file.content_stored) | other | The file is in the trash. Ask a person before you act again. | CONTRADICTED |
| [google_drive.file.content_stored](/verify/google_drive/google_drive.file.content_stored) | duplicate side effect | The child list of the folder changed more than once since the operation started. Do not retry the upload. | CONTRADICTED |
| [google_drive.file.content_stored](/verify/google_drive/google_drive.file.content_stored) | partial completion | Drive holds fewer bytes than the agent sent, or more. Do not upload again before a person reads the file. | CONTRADICTED |
| [google_drive.file.content_stored](/verify/google_drive/google_drive.file.content_stored) | observed state | Drive imported the content into an editor file. Drive publishes no checksum for such a file, so no read can prove the bytes. | CONTRADICTED |
| [google_drive.file.content_stored](/verify/google_drive/google_drive.file.content_stored) | observed state | Drive holds other bytes than the agent sent. Ask a person before you upload again. | CONTRADICTED |
| [google_drive.file.content_stored](/verify/google_drive/google_drive.file.content_stored) | observed state | Drive publishes no checksum for the file yet. The runtime observes again later. | PENDING |
| [google_drive.file.created](/verify/google_drive/google_drive.file.created) | wrong subject | The file sits in a different folder than the intent named. | CONTRADICTED |
| [google_drive.file.created](/verify/google_drive/google_drive.file.created) | wrong subject | The file carries a different name than the intent named. | CONTRADICTED |
| [google_drive.file.created](/verify/google_drive/google_drive.file.created) | pre existing state | The file is older than the operation. It proves nothing. | CONTRADICTED |
| [google_drive.file.created](/verify/google_drive/google_drive.file.created) | other | The file is in the trash. Ask a person before you act again. | CONTRADICTED |
| [google_drive.file.created](/verify/google_drive/google_drive.file.created) | duplicate side effect | The child list of the folder changed more than once since the operation started. Do not retry the upload. | CONTRADICTED |
| [google_drive.permission.granted](/verify/google_drive/google_drive.permission.granted) | wrong subject | The provider holds another permission than the answer named. | CONTRADICTED |
| [google_drive.permission.granted](/verify/google_drive/google_drive.permission.granted) | wrong subject | The permission grants access to a different person than the intent named. | CONTRADICTED |
| [google_drive.permission.granted](/verify/google_drive/google_drive.permission.granted) | wrong subject | The permission grants a different role than the intent named. | CONTRADICTED |
| [google_drive.permission.granted](/verify/google_drive/google_drive.permission.granted) | wrong subject | The permission names a different scope than the intent named. A grant to a domain or to anyone reaches more people than the person asked for. | CONTRADICTED |
| [google_drive.permission.granted](/verify/google_drive/google_drive.permission.granted) | other | The permission comes from a parent folder. This operation did not make it, and nobody can remove it on this item. | CONTRADICTED |
| [google_drive.permission.granted](/verify/google_drive/google_drive.permission.granted) | other | The account behind the permission was deleted. Nobody received the access. | CONTRADICTED |
| [google_drive.permission.granted](/verify/google_drive/google_drive.permission.granted) | pre existing state | The access control list changed before the operation started. That change proves nothing about this operation. | CONTRADICTED |
| [google_drive.permission.granted](/verify/google_drive/google_drive.permission.granted) | duplicate side effect | The access control list of the file changed more than once since the operation started. Stop and ask a person. | CONTRADICTED |
| [google_drive.permission.granted](/verify/google_drive/google_drive.permission.granted) | observed state | The grantee has not accepted the transfer of ownership. | PENDING |
| [google_drive.permission.granted](/verify/google_drive/google_drive.permission.granted) | observed state | The permission belongs to the published view, and Drive then states the role publishedReader. No published role list names that role. Ask a person. | CONTRADICTED |

## What did the last conformance run show?

*The six confidence dimensions of the signed manifest.*

| Dimension | Score | Maximum |
| --- | --- | --- |
| Documentation | 14 | 20 |
| Schema alignment | 12.24 | 15 |
| Lifecycle certainty | 17.78 | 20 |
| Evidence strength | 16 | 20 |
| Causal correlation | 10 | 15 |
| Sandbox conformance | 10 | 10 |
| Raw score | 80.02 | 100 |
| Score after the caps | 49 | 100 |

The raw score is 80.02. 4 hard caps apply, so the score is 49 and the level is Provisional.

*Why the score is capped.*

| Reason | Highest score it allows |
| --- | --- |
| A lifecycle state has unknown semantics. The compiler cannot prove the end state. | 49 |
| No strong correlation strategy ties the evidence to the operation. | 69 |
| 20 uncertainty records are open. The lowest cap is 49. | 49 |
| 3 mandatory cases are missing. Example: google_drive.file.content_stored:terminal_failure. | 74 |

*The score and the level of each contract.*

| Contract | Raw score | Score after the caps | Certification |
| --- | --- | --- | --- |
| `google_drive.file.content_stored` | 83.24 | 49 | Provisional |
| `google_drive.file.created` | 82 | 49 | Provisional |
| `google_drive.permission.granted` | 75.91 | 49 | Provisional |

> The weakest contract is google_drive.file.content_stored. It scores 49 and reaches Provisional. The package level is Provisional, because a package level never rises above its weakest contract. Read the level of the contract you use.

The last conformance run on 2026-09-05T12:00:00Z passed 41 of 41 cases with 0 critical false VERIFIED. One critical false VERIFIED rejects a skill.

*The conformance result by case class.*

| Case class | Passed | Total |
| --- | --- | --- |
| duplicate side effect | 3 | 3 |
| error after execution | 3 | 3 |
| error before execution | 3 | 3 |
| evidence unavailable | 3 | 3 |
| pre existing state | 3 | 3 |
| stale readback | 3 | 3 |
| still transitional | 3 | 3 |
| terminal success | 3 | 3 |
| timeout after commit | 3 | 3 |
| version mismatch | 3 | 3 |
| webhook duplicate | 3 | 3 |
| webhook out of order | 3 | 3 |
| wrong subject | 3 | 3 |
| wrong terminal state | 2 | 2 |

The conformance artifact digest is `c1afe7a533b6e2fa`. The harness signs the run, so a reader can check that these numbers come from that run.

## What remains uncertain?

> The level is Provisional because of it. A lifecycle state has unknown semantics. The compiler cannot prove the end state. 20 uncertainty records are open. The lowest cap is 49. Provely does not guess a rule that a source does not state.

## Where do these facts come from?

Every claim above cites a source assertion in the skill provenance. The compiler records the source, its hash, and the retrieval date. A page never states a provider rule without one.

| Source | Kind | Retrieved | Excerpt |
| --- | --- | --- | --- |
| [google_drive.docs.push](https://developers.google.com/workspace/drive/api/guides/push) | docs | 2026-09-09 | authored |
| [google_drive.docs.sharing](https://developers.google.com/workspace/drive/api/guides/manage-sharing) | docs | 2026-09-09 | authored |
| [google_drive.docs.uploads](https://developers.google.com/workspace/drive/api/guides/manage-uploads) | docs | 2026-09-09 | authored |
| [google_drive.docs.versions](https://www.googleapis.com/discovery/v1/apis/drive/v3/rest) | docs | 2026-09-09 | authored |
| [google_drive.events](https://developers.google.com/workspace/drive/api/guides/push) | event sample | 2026-09-09 | authored |
| [google_drive.openapi](https://www.googleapis.com/discovery/v1/apis/drive/v3/rest) | openapi | 2026-09-09 | trimmed |

## How do I verify a Google Drive API action?

### Verify a Google Drive API action with Provely

1. **Begin the operation.** Call `begin` with the contract `google_drive.file.content_stored` and the input. Keep the operation id.
2. **Make the Google Drive API call you make today.** Send the request with the correlation metadata that `begin` returned.
3. **Submit the acknowledgement.** Call `action_result` with the Google Drive API response. This is evidence level E1. It is not completion.
4. **Verify.** Call `verify`. The runtime reads `file_action_response`, `file_readback`, `folder_child_events`, `permission_change_events` and `permission_readback` and evaluates the contract.
5. **Report the verdict exactly as returned.** VERIFIED comes with a signed receipt. PENDING comes with the operation id. CONTRADICTED and UNVERIFIABLE are not success.

## Questions developers ask

### Does the `content_stored` level prove the `granted` level?

No. A file resource that exists is not a file whose content arrived. This level compares the size and the checksum that Drive publishes. A permission that exists is not a permission for the right person. This level reads the address, the type and the role of the grantee. Use `google_drive.permission.granted` to prove `granted`.

### What does the agent say while Google Drive API reports `session_open` and `created`?

It says: "The action is accepted but not yet verified. Operation: <id>." The verdict is PENDING. The runtime observes again on the contract timing policy.

### Which Google Drive API API versions does the skill support?

`v3.20260901`. An operation on another version returns UNVERIFIABLE with the reason `version_unsupported`. The runtime never guesses.

### Does Provely need write access to Google Drive API?

No. The agent keeps its write key. The verifier reads with a separate read-only credential where Google Drive API permits it, and it never shares that credential with the agent.

## Read next

- [Read the google_drive.file.content_stored contract](https://provely.sh/verify/google_drive/google_drive.file.content_stored)
- [Read the google_drive.file.created contract](https://provely.sh/verify/google_drive/google_drive.file.created)
- [Read the google_drive.permission.granted contract](https://provely.sh/verify/google_drive/google_drive.permission.granted)
- [Read the Anthropic Claude API verification page](https://provely.sh/verify/anthropic)
- [Read the GitHub REST API verification page](https://provely.sh/verify/github)
- [See every integration](https://provely.sh/verify)
- [Verify Google Drive API actions from Claude Code](https://provely.sh/agents/claude-code)
- [Verify Google Drive API actions from Cursor](https://provely.sh/agents/cursor)
- [See every agent integration](https://provely.sh/agents)
- [Open the quick start](https://provely.sh/docs/quick-start)
- [Read how Provely records integration uptime](https://provely.sh/docs/uptime)
- [Read the completion level definition](https://provely.sh/glossary/completion-level)
