fill-sheet — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited fill-sheet (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
The sheet-filler server manages objects (rows) with fields (columns). It prevents overwriting existing values, making it safe for incremental data collection.
#### Authenticate to Google Sheets
If not authenticated, use the device code flow:
# 1. Check status
filler_google_auth({ action: "status" })
→ { status: "Not authenticated. Use start_auth to begin authentication." }
# 2. Start auth
filler_google_auth({ action: "start_auth" })
→ { verification_url: "https://www.google.com/device", user_code: "ABCD-EFGH", device_code: "xyz123", instructions: "Visit ... and enter code: ABCD-EFGH" }
# 3. Tell user to visit URL and enter code, wait for confirmation
# 4. Complete auth
filler_google_auth({ action: "complete_auth", device_code: "xyz123" })
→ { status: "Authenticated to Google Sheets" }#### Initialize a New Sheet
If the spreadsheet doesn't have data and fields tabs yet, create them:
filler_init()
→ { success: true, fieldsTab: "fields", dataTab: "data", keyField: "name" }This creates both tabs with their header rows. Errors if either tab already exists.
#### Switch to a Different Sheet
To work with a different Google Sheet:
filler_use_sheet_id({ sheet_id: "1ABC...xyz" })
# or with full URL:
filler_use_sheet_id({ sheet_id: "https://docs.google.com/spreadsheets/d/1ABC...xyz/edit" })#### 1. Understand the Schema
First, get the field definitions to understand what data to collect: filler_list_fields().
Fields with auto: true are candidates for auto-filling. Each field has:
name - field identifiertype - validation type (string, number, date, url, email, json, enum:...)instructions - how to collect this valueexample - example value#### 2. Get an Object
Two options for retrieving objects:
Option A: Get the next object with missing fields
filler_get_next_missing_fields_objects({ limit: 1 })Returns objects with missing auto fields (default limit 1). If found: false, all objects are complete.
Pass skip_filled_fields: true to omit already-filled values from object.values, reducing response size for sheets with many columns.
Option B: Get specific objects by name
filler_get_objects_by_name({ names: ["Acme Corp"] })Returns objects with their missing auto fields. Useful when you know which objects to work on.
Option A returns { found, objects, count, remain }. Option B returns { objects: [{ found, object, missing }] }. Both provide object data and fields that need filling.
#### 3. Collect Values
For each missing field, follow the instructions to collect the value. Ensure values match the field type:
| Type | Format | ||
|---|---|---|---|
string | Any text | ||
number | Numeric value | ||
date | YYYY-MM-DD | ||
datetime | ISO-8601 | ||
url | Full URL with protocol | ||
email | Valid email address | ||
json | Valid JSON string | ||
| `enum:a\ | b\ | c` | One of the listed values |
#### 4. Save Values
Save collected values (won't overwrite existing data):
filler_save_objects_no_overwrite({
objects: [{
name: "Acme Corp",
values: {
"website": "https://acme.com",
"founded": "1990"
}
}]
})Check the result for each field:
saved - value was storedskipped_already_set - field already has a value (not overwritten)rejected_unknown_field - field not in schemarejected_invalid_type - value failed type validation#### 5. Repeat
Continue with step 2 until no missing auto fields remain.
filler_add_fields({
fields: [{
name: "revenue",
description: "Annual revenue",
type: "number",
auto: true,
instructions: "Find the company's annual revenue in USD",
example: "1000000"
}]
})filler_add_objects_by_name({ names: ["New Company"] })# 1. Check schema
filler_list_fields()
→ fields: [name, website (auto), email (auto), founded]
# 2. Get object
filler_get_next_missing_fields_objects({ limit: 1 })
→ { found: true, objects: [{ object: { name: "Acme Corp" }, missing: [{ name: "website", type: "url", instructions: "Find official website" }] }], count: 1, remain: 0 }
# 2b. Or get a specific object
filler_get_objects_by_name({ names: ["Acme Corp"] })
→ { objects: [{ found: true, object: { name: "Acme Corp" }, missing: [{ name: "website", ... }] }] }
# 3. Collect and save
filler_save_objects_no_overwrite({ objects: [{ name: "Acme Corp", values: { website: "https://acme.com" } }] })
→ result: { website: "saved" }
## Key Rules
1. **Never guess values** - only save data you have verified
2. **Check field types** - ensure values match the expected format before saving
3. **Trust the no-overwrite** - the server protects existing data, but don't rely on this as a crutch
4. **Follow instructions** - each field's `instructions` describe how to collect that specific value
5. **Handle rejections** - if a value is rejected, check the type and fix accordingly~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.