Post-redaction step: upload redacted images to Google Drive, append structured proof log rows to the sheet, move files to done folder, update URL index. Input: redacted images + proof data from skool-redact-images.
How this skill is triggered — by the user, by Claude, or both
Slash command
/career-systems-internal:skool-update-proof-logThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
**Step 2 of redaction workflow.** Takes redacted images and proof data from `skool-redact-images`, uploads files to Google Drive, appends proof log rows to the sheet, and archives files.
Step 2 of redaction workflow. Takes redacted images and proof data from skool-redact-images, uploads files to Google Drive, appends proof log rows to the sheet, and archives files.
Input: Redacted PNG, SVG, and proof data from previous step.
Output: Drive URLs, sheet row added, files moved to done folder.
cat ~/.config/skool-automations/proof-log.json 2>/dev/null || echo "NOT FOUND"
Required keys (same as redaction step):
{
"inboxDir": "/path/to/to-redact",
"doneDir": "/path/to/completed",
"driveFolderIdOriginal": "<Google Drive folder ID for original images>",
"driveFolderIdRedacted": "<Google Drive folder ID for redacted images>",
"sheetId": "<Google Sheet ID>"
}
Legacy config (driveFolderId) is still supported for backward compatibility — both original and redacted files will use the same folder.
For each redacted image result, upload 3 files using the friendly title (sanitized):
# Original (unredacted) — to driveFolderIdOriginal
doppler run -- python3 SKILL_DIR/scripts/upload_to_drive.py \
IMAGE_PATH "<title>.png" DRIVE_FOLDER_ID_ORIGINAL
# → ORIGINAL_URL
# Redacted PNG — to driveFolderIdRedacted
doppler run -- python3 SKILL_DIR/scripts/upload_to_drive.py \
OUTPUT_DIR/redacted-redacted.png "<title>-redacted.png" DRIVE_FOLDER_ID_REDACTED
# → PNG_URL
# Editable SVG — to driveFolderIdRedacted
doppler run -- python3 SKILL_DIR/scripts/upload_to_drive.py \
OUTPUT_DIR/redacted-editable.svg "<title>-editable.svg" DRIVE_FOLDER_ID_REDACTED
# → SVG_URL
If proof fields are missing, run:
PROOF_JSON=$(doppler run -- python3 SKILL_DIR/scripts/extract_proof_data.py "$POST_TEXT")
This returns: area, level, function, status, main_objection, trigger, behavior, outcome, friction_surprise, artifact_candidate
For each image, run:
doppler run -- python3 <skill-dir>/scripts/append_sheet_row.py \
"<sheetId>" \
'<JSON with all proof fields + png_url + svg_url + original_url + date>'
The JSON must include:
date (MM/DD/YYYY), post_url, title, original_filename, png_filename, svg_filename, area, level, function, status, main_objection, trigger, behavior, outcome, friction_surprise, artifact_candidate, post_text, original_url, png_url, svg_url
The script reads the actual header row and matches columns by name (order doesn't matter).
python3 << 'EOF'
import os, shutil, json
cfg = json.load(open(os.path.expanduser('~/.config/skool-automations/proof-log.json')))
inbox = cfg['inboxDir']
done = cfg['doneDir']
idx_path = os.path.join(inbox, 'url_index.json')
# results = list of dicts from redaction step
results = <results from skool-redact-images>
if os.path.exists(idx_path):
idx = json.load(open(idx_path))
screenshots = idx.get('screenshots', [])
else:
idx = {'screenshots': []}
screenshots = []
for r in results:
src = os.path.join(inbox, r['source_filename'])
dest = os.path.join(done, r['original_filename'])
if os.path.exists(src):
shutil.move(src, dest)
print(f"Moved: {r['source_filename']} → {r['original_filename']}")
# Update index entry
for entry in screenshots:
if entry.get('filename') == r['source_filename']:
entry['filename'] = r['original_filename']
break
with open(idx_path, 'w') as f:
json.dump(idx, f, indent=2)
print("url_index.json updated")
EOF
Print a summary table showing upload status and any issues:
✅ Outreach Win - Rosh → all 3 files uploaded, sheet row added
⚠️ Mindset Win - Day → PNG/SVG uploaded, Drive 404 on original
❌ screenshot_xyz.png → Drive upload failed
List any items needing user action (missing fields, failed uploads, etc.).
Creates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.
npx claudepluginhub blaze212/cs-internal-skills --plugin career-systems-internal