storage — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited storage (Agent Skill) and scored it 96/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 1 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} tells the agent to skip the normal "ask the user first" gate. Used adversarially it removes the human-in-the-loop check before destructive or sensitive actions, turning a normally-gated agent into a fire-and-forget executor.
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.
You are in AUTONOMOUS MODE. Do NOT ask questions. Detect everything from the codebase and proceed.
PURPOSE: Set up production-ready object storage. Auto-detect the project's framework and the requested storage provider. Install the SDK, create a storage service with full CRUD operations, configure presigned URLs for secure direct uploads, set up lifecycle policies, CORS, CDN integration, and handle multipart uploads for large files.
TASK: $ARGUMENTS
============================================================ PHASE 0: DETECTION ============================================================
============================================================ PHASE 1: SDK INSTALLATION ============================================================
Install the correct SDK for the detected provider and framework:
AWS S3:
@aws-sdk/client-s3, @aws-sdk/s3-request-presigneraws_s3_api or HTTP with presigned URLs (preferred)boto3github.com/aws/aws-sdk-go-v2/service/s3GOOGLE CLOUD STORAGE:
@google-cloud/storagefirebase_storage (via Firebase) or HTTP with signed URLsgoogle-cloud-storagecloud.google.com/go/storageCLOUDFLARE R2:
@aws-sdk/client-s3 (R2 is S3-compatible — use S3 SDK with R2 endpoint)boto3 with custom endpointSUPABASE STORAGE:
@supabase/supabase-js (storage is built into the client)supabase_fluttersupabaseAfter installing:
STORAGE_BUCKET, STORAGE_REGION, STORAGE_ACCESS_KEY, STORAGE_SECRET_KEY.STORAGE_ENDPOINT (e.g., https://<account-id>.r2.cloudflarestorage.com).SUPABASE_URL and SUPABASE_SERVICE_KEY.============================================================ PHASE 2: STORAGE SERVICE ============================================================
Create a storage service that abstracts the provider. This lets the team swap providers (e.g., S3 to R2) without touching application code.
FILE LOCATION:
src/lib/storage.ts or src/services/storage.tslib/services/storage_service.dartapp/services/storage.pyinternal/storage/storage.goTHE SERVICE MUST EXPOSE:
init(config) Initialize the storage client with credentials and bucket name.
upload(key, file, options?) Upload a file to storage. Options: contentType, metadata, acl, onProgress callback. Returns: { key, url, size, contentType }.
download(key) Download a file by key. Returns a stream or buffer depending on framework.
delete(key) Delete a single object by key. Idempotent — no error if key does not exist.
deleteMany(keys) Batch delete multiple objects. Use the provider's bulk delete API.
list(prefix?, options?) List objects with optional prefix filter. Options: maxKeys, cursor/continuationToken. Returns: { objects: [{ key, size, lastModified }], cursor?, hasMore }.
getUrl(key) Get the public URL for an object (if bucket is public or CDN is configured).
getSignedUrl(key, options?) Generate a presigned URL for private access. Options: expiresIn (seconds, default 3600), method ("GET" or "PUT"), contentType (for PUT).
getUploadUrl(key, contentType, options?) Generate a presigned PUT URL for direct browser uploads. Returns: { uploadUrl, fields?, key }.
copy(sourceKey, destinationKey) Server-side copy without downloading.
getMetadata(key) Get object metadata (size, contentType, lastModified, custom metadata).
IMPLEMENTATION REQUIREMENTS:
============================================================ PHASE 3: FILE VALIDATION ============================================================
Create a validation layer that runs before every upload:
FILE: src/lib/storage-validation.ts (or framework equivalent)
{context}/{userId}/{timestamp}-{sanitized-name}.============================================================ PHASE 4: PRESIGNED URLS & DIRECT UPLOAD ============================================================
Implement secure direct-to-storage uploads from the browser/client:
/api/storage/upload-url============================================================ PHASE 5: CORS CONFIGURATION ============================================================
Generate CORS configuration for the storage bucket:
AWS S3 / R2:
{
"CORSRules": [{
"AllowedHeaders": ["*"],
"AllowedMethods": ["GET", "PUT", "POST", "DELETE", "HEAD"],
"AllowedOrigins": ["${APP_URL}"],
"ExposeHeaders": ["ETag", "Content-Length", "x-amz-request-id"],
"MaxAgeSeconds": 3600
}]
}GCS:
[{
"origin": ["${APP_URL}"],
"method": ["GET", "PUT", "POST", "DELETE", "HEAD"],
"responseHeader": ["Content-Type", "Content-Length"],
"maxAgeSeconds": 3600
}]storage/cors.json.============================================================ PHASE 6: LIFECYCLE POLICIES ============================================================
Create lifecycle rules to manage storage costs:
tmp/ or uploads/pending/Write lifecycle config to storage/lifecycle.json with provider-specific format. Include CLI commands to apply the policies as comments in the file.
============================================================ PHASE 7: CDN INTEGRATION ============================================================
Set up CDN for serving stored files:
getCdnUrl(key) method to the storage service.https://cdn.example.com/{key}.STORAGE_CDN_URL env var.Cache-Control: public, max-age=31536000, immutable for content-addressed files.Cache-Control: public, max-age=3600 for user-uploaded content.Cache-Control: no-cache for frequently changing content.storage/cdn-setup.md covering:============================================================ PHASE 8: VALIDATION ============================================================
============================================================ DO NOT ============================================================
============================================================ OUTPUT ============================================================
NEXT STEPS:
After storage is set up:
/ship to build features that use file uploads."/analytics-tracking to track upload events and storage usage metrics."/search to index stored documents for full-text search."/perf to benchmark upload speeds and optimize chunk sizes."/check-vanta to verify storage security meets compliance requirements."============================================================ SELF-HEALING VALIDATION (max 3 iterations) ============================================================
After completing the integration, validate:
IF STILL FAILING after 3 iterations:
============================================================ SELF-EVOLUTION TELEMETRY ============================================================
After producing output, record execution metadata for the /evolve pipeline.
Check if a project memory directory exists:
~/.claude/projects/skill-telemetry.md in that memory directoryEntry format:
### /storage — {{YYYY-MM-DD}}
- Outcome: {{SUCCESS | PARTIAL | FAILED}}
- Self-healed: {{yes — what was healed | no}}
- Iterations used: {{N}} / {{N max}}
- Bottleneck: {{phase that struggled or "none"}}
- Suggestion: {{one-line improvement idea for /evolve, or "none"}}Only log if the memory directory exists. Skip silently if not found. Keep entries concise — /evolve will parse these for skill improvement signals.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.