ops-social-planner — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited ops-social-planner (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.
Read-only dashboard of every scheduled post and ad, grouped identity/project → channel → time, regardless of posting engine. Personal/founder identity and project brands stay strictly separated (see /ops-socials identity rules). See SPEC.md for the full design.
bin/ops-social-planner collect reads $PREFS_PATH/preferences.json(marketing.social_identities.personal.* + marketing.projects.*.social), dispatches a per-engine fetcher keyed on social.engine.primary, normalizes to one schema, and writes $OPS_DATA_DIR/social-planner/state.json (owner data — never committed, Rule 0).
ui/) on localhost and opens the browser.engine.primary | Source | Status |
|---|---|---|
typefully | GET /v2/social-sets/{id}/drafts (Bearer; key from ~/.config/typefully/config.json) | ✅ wired |
upload-post | GET /api/uploadposts/schedule (Apikey; key from engine.upload_post.api_key_ref) | ✅ wired |
meta-graph / meta-ads | Graph Ads API per project BM/token | 🔌 hook (UI shows "pending") |
google-ads | GAQL per project customer id | 🔌 hook |
null / unprovisioned | — | shown fail-closed (0 items) |
Adding an engine = adding one fetch<Engine>() in bin/ops-social-planner + a dispatch branch. No UI change.
"${CLAUDE_PLUGIN_ROOT}/bin/ops-social-planner" # collect → serve → open
"${CLAUDE_PLUGIN_ROOT}/bin/ops-social-planner" collect # regenerate state.json only
"${CLAUDE_PLUGIN_ROOT}/bin/ops-social-planner" serve --port 7937 # serve existing stateThe UI renders ui/state.sample.json (synthetic, PII-free) when no live state exists, so it works with zero credentials — useful for the PR preview.
The headless collector covers posts on wired engines. When richer output is wanted, the agent can:
mcp__meta__*, Google Ads) per project and merge kind:"ad" items into state.json.rationale with an LLM-written one (slot + sequence + channel intent).serve to refresh.Do not publish or edit from here — routing/mutation belongs to /ops-socials + /ops-marketing.
127.0.0.1 only.ui/ + bin/ + SPEC.md + the synthetic fixture.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.