# What does google_drive.file.content_stored prove?

> Prove that Drive holds the content of the file, and that the bytes match. Version 1.0.0, certification Provisional.

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

**Prove that Drive holds the content of the file, and that the bytes match. A file resource that exists is not a file whose content arrived. This level compares the size and the checksum that Drive publishes.**

*Contract identity.*

| Fact | Value |
| --- | --- |
| Contract id | `google_drive.file.content_stored` |
| Version | `1.0.0` |
| Hash | `a06dbef40106e525` |
| Completion level | `content_stored` |
| Publisher | Built and signed by Provely. |
| Certification | Provisional |
| Skill | [Google Drive API 0.1.0](/verify/google_drive) |
| Valid for provider API versions | `v3.20260901` |

## What is the intent?

Upload the content of the file into the folder without a change.

## What is the subject and the action?

| Member | Value |
| --- | --- |
| Subject type | `google_drive.file` |
| Subject identity | file_id = `$action.result.id` |
| Canonical effect | `storage.file_upload` |
| Provider operation | `POST /drive/v3/files` |
| Idempotency | none, retry is not safe |

## How does the evidence correlate with this operation?

| Strategy | Assurance | Keys | Required |
| --- | --- | --- | --- |
| `resource_id` | strong | file_id from `$action.result.id` | no |
| `resource_id` | weak | parent_id from `$input.parent_id` | no |
| `fingerprint` | weak | name from `$input.name`; parent_id from `$input.parent_id` | no |

## Which evidence does the contract require?

Minimum evidence level `E2`. An independent channel is required. Minimum channels: 1.

| Channel | Level | Independence | Verifier | Description |
| --- | --- | --- | --- | --- |
| `file_readback` | E2 | provider readback | `http` | Read the file from the provider. A condition path is $observed.file_readback.md5Checksum. Drive writes size as a string with the format int64, so a condition compares a string. |
| `folder_child_events` | E3 | provider event | `webhook` | The notifications of a channel that watches the parent folder, since the operation started. The webhook verifier returns {events, count, latest, earliest, types, duplicates_dropped}. A Drive notification carries an empty body, so a count states how many times the child list changed. |

## Which conditions must all hold for VERIFIED?

| Condition | Meaning | Path | Operator | Expected | Evidence |
| --- | --- | --- | --- | --- | --- |
| `file_present` | The provider holds the file with the identifier of the upload answer. | `$observed.file_readback.id` | `eq` | `$action.result.id` | `file_readback` |
| `file_name_matches` | The name of the file equals the requested name. | `$observed.file_readback.name` | `eq` | `$input.name` | `file_readback` |
| `file_in_requested_parent` | The first parent of the file equals the requested folder. Drive states that a file has one parent folder only. | `$observed.file_readback.parents[0]` | `eq` | `$input.parent_id` | `file_readback` |
| `file_created_in_window` | The provider created the file after the operation started. | `$observed.file_readback.createdTime` | `time_after` | `$operation.created_at` | `file_readback` |
| `folder_gained_a_child` | At least one notification says that the child list of the parent folder changed since the operation started. The duplicate guard reads the same channel, so a workspace with no notification channel cannot verify and cannot miss a second upload either. | `$observed.folder_child_events.count` | `gte` | `1` | `folder_child_events` |
| `file_size_matches` | The size that Drive publishes equals the number of bytes that the agent sent. Drive writes size as a string with the format int64, so the condition compares a string and normalizes nothing. | `$observed.file_readback.size` | `eq` | `$input.size_bytes` | `file_readback` |
| `file_checksum_matches` | The MD5 checksum that Drive publishes equals the checksum of the content that the agent sent. Drive publishes the member for a file with binary content only. | `$observed.file_readback.md5Checksum` | `eq` | `$input.md5_checksum` | `file_readback` |

## Which conditions give CONTRADICTED?

| Condition | Class | Reason | Path | Operator | Expected |
| --- | --- | --- | --- | --- | --- |
| `file_in_wrong_parent` | wrong subject | The file sits in a different folder than the intent named. | `$observed.file_readback.parents[0]` | `ne` | `$input.parent_id` |
| `file_name_differs` | wrong subject | The file carries a different name than the intent named. | `$observed.file_readback.name` | `ne` | `$input.name` |
| `file_predates_operation` | pre existing state | The file is older than the operation. It proves nothing. | `$observed.file_readback.createdTime` | `time_before` | `$operation.created_at` |
| `file_moved_to_trash` | other | The file is in the trash. Ask a person before you act again. | `$observed.file_readback.trashed` | `eq` | `true` |
| `duplicate_file_in_folder` | duplicate side effect | The child list of the folder changed more than once since the operation started. Do not retry the upload. | `$observed.folder_child_events.count` | `gt` | `1` |
| `file_size_differs` | partial completion | Drive holds fewer bytes than the agent sent, or more. Do not upload again before a person reads the file. | `$observed.file_readback.size` | `ne` | `$input.size_bytes` |

## Which observed states map to a verdict before completion?

| Rule | Match | Verdict | Reason |
| --- | --- | --- | --- |
| `converted_to_editor_file` | `$observed.file_readback.mimeType` regex `"^application/vnd\\.google-apps\\."` | CONTRADICTED | Drive imported the content into an editor file. Drive publishes no checksum for such a file, so no read can prove the bytes. |
| `content_differs` | (`$observed.file_readback.md5Checksum` exists `undefined`) and (`$observed.file_readback.md5Checksum` ne `"$input.md5_checksum"`) | CONTRADICTED | Drive holds other bytes than the agent sent. Ask a person before you upload again. |
| `checksum_not_published_yet` | `$observed.file_readback.md5Checksum` absent `undefined` | PENDING | Drive publishes no checksum for the file yet. The runtime observes again later. |

## How long does the runtime observe?

| Timing member | Value |
| --- | --- |
| Initial delay | 1000 ms |
| Poll interval | 5000 ms |
| Backoff | exponential factor 2, max 60000 ms |
| Maximum attempts | 40 |
| Timeout | 3600000 ms |
| Stale read window | 20000 ms |
| On timeout | UNVERIFIABLE (`evidence_unavailable_before_timeout`), escalated to a person |

## Where do these rules come from?

- `google_drive.openapi#/components/schemas/File/properties/size`: [google_drive.openapi](https://www.googleapis.com/discovery/v1/apis/drive/v3/rest), retrieved 2026-09-09
- `google_drive.openapi#/components/schemas/File/properties/md5Checksum`: [google_drive.openapi](https://www.googleapis.com/discovery/v1/apis/drive/v3/rest), retrieved 2026-09-09
- `google_drive.docs.uploads#upload-file-data/upload-the-content`: [google_drive.docs.uploads](https://developers.google.com/workspace/drive/api/guides/manage-uploads), retrieved 2026-09-09
- `google_drive.docs.uploads#upload-file-data/resume-an-upload-that-broke`: [google_drive.docs.uploads](https://developers.google.com/workspace/drive/api/guides/manage-uploads), retrieved 2026-09-09
- `google_drive.openapi#/components/schemas/File/properties/id`: [google_drive.openapi](https://www.googleapis.com/discovery/v1/apis/drive/v3/rest), retrieved 2026-09-09
- `google_drive.openapi#/paths/~1drive~1v3~1files~1{fileId}/get/responses/200`: [google_drive.openapi](https://www.googleapis.com/discovery/v1/apis/drive/v3/rest), retrieved 2026-09-09
- `google_drive.openapi#/components/schemas/File/properties/name`: [google_drive.openapi](https://www.googleapis.com/discovery/v1/apis/drive/v3/rest), retrieved 2026-09-09
- `google_drive.openapi#/paths/~1drive~1v3~1files/post/requestBody`: [google_drive.openapi](https://www.googleapis.com/discovery/v1/apis/drive/v3/rest), retrieved 2026-09-09
- `google_drive.openapi#/components/schemas/File/properties/parents`: [google_drive.openapi](https://www.googleapis.com/discovery/v1/apis/drive/v3/rest), retrieved 2026-09-09
- `google_drive.openapi#/components/schemas/File/properties/createdTime`: [google_drive.openapi](https://www.googleapis.com/discovery/v1/apis/drive/v3/rest), retrieved 2026-09-09
- `google_drive.events#/events/drive.file.update.children`: [google_drive.events](https://developers.google.com/workspace/drive/api/guides/push), retrieved 2026-09-09
- `google_drive.docs.push#push-notifications/the-changed-members`: [google_drive.docs.push](https://developers.google.com/workspace/drive/api/guides/push), retrieved 2026-09-09
- `google_drive.openapi#/paths/~1drive~1v3~1files~1{fileId}~1watch/post`: [google_drive.openapi](https://www.googleapis.com/discovery/v1/apis/drive/v3/rest), retrieved 2026-09-09
- `google_drive.docs.uploads#upload-file-data/what-a-caller-cannot-read-from-these-pages`: [google_drive.docs.uploads](https://developers.google.com/workspace/drive/api/guides/manage-uploads), retrieved 2026-09-09

### Can google_drive.file.content_stored return VERIFIED from the action response alone?

No. The minimum evidence level is E2. The action response is E1. The completion conditions read `file_readback` and `folder_child_events`.

### What happens after the timeout?

The verdict is UNVERIFIABLE with the reason `evidence_unavailable_before_timeout`. The operation goes to a person for review.

## Read next

- [Read the Google Drive API verification page](https://provely.sh/verify/google_drive)
- [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 what a completion contract contains](https://provely.sh/contracts)
- [Read what a receipt proves](https://provely.sh/docs/receipts)
