{"id":"5180e64e-f151-40a2-8538-7254fd06f993","entityType":"agent","slug":"clawhub-alexbloch-ia-reddit-account-operations","name":"Reddit Account Operations","canonicalUrl":"https://www.xpersona.co/agent/clawhub-alexbloch-ia-reddit-account-operations","canonicalPath":"/agent/clawhub-alexbloch-ia-reddit-account-operations","generatedAt":"2026-10-10T13:42:56.491Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T11:04:11.267Z","emptyReason":null},"description":"Run a Reddit account within sub rules, not into automod or shadowban — karma phases, quotas, removal recovery. Use when posting from a cron or agent. Trigger... Skill: Reddit Account Operations Owner: alexbloch-ia Summary: Run a Reddit account within sub rules, not into automod or shadowban — karma phases, quotas, removal recovery. Use when posting from a cron or agent. Trigger... Tags: account-safety:2.0.1, agent:2.0.1, anti-spam:2.0.1, automation:2.0.1, browser-automation:2.0.1, captcha-bypass:2.0.1, cron:2.0.1, doctrine:2.0.1, faq:2.0.1, growth:2.0.1, human-like:2.0.1, la","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.5K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s179c74ca8kjff2gapygs9y13d86yr3z:reddit-account-operations","sourceUrl":"https://clawhub.ai/alexbloch-ia/reddit-account-operations","homepage":"https://clawhub.ai/alexbloch-ia/skills/reddit-account-operations","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/alexbloch-ia/reddit-account-operations","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/alexbloch-ia/skills/reddit-account-operations","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":63,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Run a Reddit account within sub rules, not into automod or shadowban — karma phases, quotas, removal recovery. Use when posting from a cron or agent. Trigger..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T11:04:11.267Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T11:04:11.267Z","emptyReason":null},"stars":null,"forks":null,"downloads":1477,"packageName":null,"latestVersion":"2.0.2","tractionLabel":"1.5K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T11:04:11.266Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T11:04:11.267Z","lastCrawledAt":"2026-10-10T11:04:11.266Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T11:04:11.266Z","lastVerifiedAt":null,"highlights":[{"version":"2.0.2","createdAt":"2026-07-21T13:37:05.280Z","changelog":"Link source GitHub repo (provenance + metadata.repository). No doctrine change.","fileCount":3,"zipByteSize":9680},{"version":"2.0.1","createdAt":"2026-07-16T14:59:38.639Z","changelog":"v2.0.1 — Contenu strictement identique a la 2.0.0 (SHA-256 verifie, aucun octet modifie). Cette version ne corrige que des canaux de release. 18 dist-tags crees par erreur en 1.2.0 (captcha-bypass, recaptcha, human-like, growth...) etaient restes figes sur la 1.2.0 — c'est-a-dire sur le contenu que la reecriture de conformite 2.0.0 avait justement retire: la section 9 'Human-like posting flow (anti-CAPTCHA)' et son flux d'evasion. Concretement, 'install reddit-account-operations --tag captcha-bypass' servait encore le contenu retire. Les 18 canaux pointent desormais tous vers le contenu conforme. Les dist-tags ne sont pas supprimables (ni CLI, ni API, ni interface web); les repointer est le seul levier disponible.","fileCount":3,"zipByteSize":9655},{"version":"2.0.0","createdAt":"2026-07-16T10:06:42.242Z","changelog":"v2.0.0 — Compliance-first rewrite. Removed: section 9 (the anti-CAPTCHA posting flow) in full, along with all timing and behaviour guidance framed as a way past bot detection. A challenge is Reddit asking for a human — the run now ends and a person publishes by hand. Stopping costs one post; being caught evading costs the account. Removed: any ambiguity about disclosure. If someone asks whether the account is automated, the answer is honest. Added: an Access, Data & Network table up front, 90-day retention on memory files, alert webhooks off by default, and a closing ONLY/NEVER scope. Trimmed 550 -> 280 lines. The doctrine is unchanged: three roles, karma phases, hard quotas, post qualification, anti-spam triggers, recovery, memory files, recap. Published artifact is SKILL.md alone.","fileCount":3,"zipByteSize":9690},{"version":"1.2.0","createdAt":"2026-05-18T20:31:35.653Z","changelog":"v1.2.0 — Operational hardening, learned from live posting. Added: - §9 Human-like posting flow (anti-CAPTCHA) — new section. Reddit's /api/submit is gated behind reCAPTCHA Enterprise Invisible; the only reliable path is a UI flow with dwells + slow typing. Covers the full flow, recommended exit codes, the LC_NUMERIC macOS trap that silently disables dwells, localized UI-label handling, and when to re-test after Reddit UI changes. - §3 Manual override (advanced) — how to force Phase B before karma ≥ 100 by appending a phase=B (manual override) line to reddit-karma-log.md, with the risk acknowledgement. - README highlights the new v1.2.0 capabilities. Changed: - §5 Brand link policy in replies: tightened from \"max 1 trailing link\" to ZERO outgoing links. Indirect signaling only. - §6 Informative post closing block: rewritten as an indirect role mention (no name, no URL, no contact info). - §8 Anti-spam triggers: explicit ban on any URL on <BRAND_DOMAIN> and on URL shorteners (bit.ly/tinyurl etc.). - Sections 9-17 renumbered to 10-18 to fit the new §9. Cross-references in §3 and the First-run checklist updated. Unchanged: Sections 0, 1, 2, 4, 7 are byte-identical to v1.1.0. The doctrine's core (3 roles, phased posting, hard quotas, recovery, memory files, recap) is unchanged. Full changelog: https://github.com/AlexBloch-IA/reddit-account-operations/blob/main/CHANGELOG.md","fileCount":4,"zipByteSize":14629},{"version":"1.0.1","createdAt":"2026-05-18T14:58:59.048Z","changelog":"v1.1.0 — Non-breaking additions on top of the v1.0.0 doctrine. Added: - Quick config (YAML) block in Section 0 — drop-in config.yaml for agents that read structured config. - Compatibility table in Section 0 — install paths for Claude Code, OpenClaw, ClawHub, Cursor / Copilot CLI, and generic LLM agents. - Section 16 — First-run checklist (9 items before enabling any cron) + a bash one-liner to init the 7 memory files. - Section 17 — FAQ (OpenClaw requirement, multi-account, niche subs, shadowban detection, parallel crons, suspension handling). - init-memory.sh shipped with the companion GitHub repo (idempotent memory-dir bootstrap). Unchanged: Sections 1-15 (the core doctrine) are byte-identical to v1.0.0. Existing crons keep working without modification. Full changelog: https://github.com/AlexBloch-IA/reddit-account-operations/blob/main/CHANGELOG.md","fileCount":3,"zipByteSize":11096},{"version":"1.0.0","createdAt":"2026-05-18T14:40:04.264Z","changelog":"reddit-account-operations v1.0.0 - Initial release establishing a guideline for safe, high-reputation Reddit account automation. - Emphasizes role separation (`red-post`, `red-engage`, `red-stealth`) to prevent spam and preserve account trust. - Includes post qualification checks, reply templates for different karma phases, and strict anti-spam practices. - Focuses on long-term credibility, sub-moderator tolerance, and operational stability over raw output. - Compatible with OpenClaw browser CLI but adaptable to any automation stack.","fileCount":3,"zipByteSize":8722}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s179c74ca8kjff2gapygs9y13d86yr3z:reddit-account-operations","setupComplexity":"low","setupSteps":["Setup complexity is classified as HIGH. You must provision dedicated cloud infrastructure or an isolated VM. Do not run this directly on your local workstation.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-alexbloch-ia-reddit-account-operations/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-alexbloch-ia-reddit-account-operations/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-alexbloch-ia-reddit-account-operations/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-alexbloch-ia-reddit-account-operations/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-alexbloch-ia-reddit-account-operations/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-alexbloch-ia-reddit-account-operations/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T13:42:56.486Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-alexbloch-ia-reddit-account-operations/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-alexbloch-ia-reddit-account-operations/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-alexbloch-ia-reddit-account-operations/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-alexbloch-ia-reddit-account-operations/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T11:04:11.267Z","emptyReason":null},"readme":"Skill: Reddit Account Operations\n\nOwner: alexbloch-ia\n\nSummary: Run a Reddit account within sub rules, not into automod or shadowban — karma phases, quotas, removal recovery. Use when posting from a cron or agent. Trigger...\n\nTags: account-safety:2.0.1, agent:2.0.1, anti-spam:2.0.1, automation:2.0.1, browser-automation:2.0.1, captcha-bypass:2.0.1, cron:2.0.1, doctrine:2.0.1, faq:2.0.1, growth:2.0.1, human-like:2.0.1, latest:2.0.2, openclaw:2.0.1, operations:2.0.1, playbook:2.0.1, recaptcha:2.0.1, reddit:2.0.1, social-media:2.0.1, yaml-config:2.0.1\n\nVersion history:\n\nv2.0.2 | 2026-07-21T13:37:05.280Z | user\n\nLink source GitHub repo (provenance + metadata.repository). No doctrine change.\n\nv2.0.1 | 2026-07-16T14:59:38.639Z | user\n\nv2.0.1 — Contenu strictement identique a la 2.0.0 (SHA-256 verifie, aucun octet modifie). Cette version ne corrige que des canaux de release.\n\n18 dist-tags crees par erreur en 1.2.0 (captcha-bypass, recaptcha, human-like, growth...) etaient restes figes sur la 1.2.0 — c'est-a-dire sur le contenu que la reecriture de conformite 2.0.0 avait justement retire: la section 9 'Human-like posting flow (anti-CAPTCHA)' et son flux d'evasion.\n\nConcretement, 'install reddit-account-operations --tag captcha-bypass' servait encore le contenu retire. Les 18 canaux pointent desormais tous vers le contenu conforme.\n\nLes dist-tags ne sont pas supprimables (ni CLI, ni API, ni interface web); les repointer est le seul levier disponible.\n\nv2.0.0 | 2026-07-16T10:06:42.242Z | user\n\nv2.0.0 — Compliance-first rewrite.\n\nRemoved: section 9 (the anti-CAPTCHA posting flow) in full, along with all timing and behaviour guidance framed as a way past bot detection. A challenge is Reddit asking for a human — the run now ends and a person publishes by hand. Stopping costs one post; being caught evading costs the account.\n\nRemoved: any ambiguity about disclosure. If someone asks whether the account is automated, the answer is honest.\n\nAdded: an Access, Data & Network table up front, 90-day retention on memory files, alert webhooks off by default, and a closing ONLY/NEVER scope.\n\nTrimmed 550 -> 280 lines. The doctrine is unchanged: three roles, karma phases, hard quotas, post qualification, anti-spam triggers, recovery, memory files, recap. Published artifact is SKILL.md alone.\n\nv1.2.0 | 2026-05-18T20:31:35.653Z | user\n\nv1.2.0 — Operational hardening, learned from live posting.\n\nAdded:\n- §9 Human-like posting flow (anti-CAPTCHA) — new section. Reddit's /api/submit is gated behind reCAPTCHA Enterprise Invisible; the only reliable path is a UI flow with dwells + slow typing. Covers the full flow, recommended exit codes, the LC_NUMERIC macOS trap that silently disables dwells, localized UI-label handling, and when to re-test after Reddit UI changes.\n- §3 Manual override (advanced) — how to force Phase B before karma ≥ 100 by appending a phase=B (manual override) line to reddit-karma-log.md, with the risk acknowledgement.\n- README highlights the new v1.2.0 capabilities.\n\nChanged:\n- §5 Brand link policy in replies: tightened from \"max 1 trailing link\" to ZERO outgoing links. Indirect signaling only.\n- §6 Informative post closing block: rewritten as an indirect role mention (no name, no URL, no contact info).\n- §8 Anti-spam triggers: explicit ban on any URL on <BRAND_DOMAIN> and on URL shorteners (bit.ly/tinyurl etc.).\n- Sections 9-17 renumbered to 10-18 to fit the new §9. Cross-references in §3 and the First-run checklist updated.\n\nUnchanged: Sections 0, 1, 2, 4, 7 are byte-identical to v1.1.0. The doctrine's core (3 roles, phased posting, hard quotas, recovery, memory files, recap) is unchanged.\n\nFull changelog: https://github.com/AlexBloch-IA/reddit-account-operations/blob/main/CHANGELOG.md\n\nv1.0.1 | 2026-05-18T14:58:59.048Z | user\n\nv1.1.0 — Non-breaking additions on top of the v1.0.0 doctrine.\n\nAdded:\n- Quick config (YAML) block in Section 0 — drop-in config.yaml for agents that read structured config.\n- Compatibility table in Section 0 — install paths for Claude Code, OpenClaw, ClawHub, Cursor / Copilot CLI, and generic LLM agents.\n- Section 16 — First-run checklist (9 items before enabling any cron) + a bash one-liner to init the 7 memory files.\n- Section 17 — FAQ (OpenClaw requirement, multi-account, niche subs, shadowban detection, parallel crons, suspension handling).\n- init-memory.sh shipped with the companion GitHub repo (idempotent memory-dir bootstrap).\n\nUnchanged: Sections 1-15 (the core doctrine) are byte-identical to v1.0.0. Existing crons keep working without modification.\n\nFull changelog: https://github.com/AlexBloch-IA/reddit-account-operations/blob/main/CHANGELOG.md\n\nv1.0.0 | 2026-05-18T14:40:04.264Z | user\n\nreddit-account-operations v1.0.0\n\n- Initial release establishing a guideline for safe, high-reputation Reddit account automation.\n- Emphasizes role separation (`red-post`, `red-engage`, `red-stealth`) to prevent spam and preserve account trust.\n- Includes post qualification checks, reply templates for different karma phases, and strict anti-spam practices.\n- Focuses on long-term credibility, sub-moderator tolerance, and operational stability over raw output.\n- Compatible with OpenClaw browser CLI but adaptable to any automation stack.\n\nArchive index:\n\nArchive v2.0.2: 3 files, 9680 bytes\n\nFiles: skill-card.md (2285b), SKILL.md (17793b), _meta.json (144b)\n\nFile v2.0.2:SKILL.md\n\n---\nname: reddit-account-operations\ndescription: Run a Reddit account within sub rules, not into automod or shadowban — karma phases, quotas, removal recovery. Use when posting from a cron or agent. Trigger on \"post to reddit\", \"reddit bot\", \"automod removed my post\", \"reddit shadowban\", \"karma requirement\".\nmetadata: {\"clawdbot\":{\"emoji\":\"🛡️\",\"homepage\":\"https://openclaw.ai\",\"repository\":\"https://github.com/AlexBloch-IA/reddit-account-operations\"}}\n---\n\n# Reddit Account Operations\n\n**The goal is not to comment fast. The goal is to operate Reddit like a careful, helpful human contributor: stable browser, correct context, useful action, no spam, no reputational risk.**\n\nReddit's Content Policy and each subreddit's rules bind this skill. Where they conflict with a quota below, they win.\n\n## Access, data and network — read before running\n\n| What | Detail |\n|---|---|\n| Browser | A logged-in Chrome profile you control, via CDP on `127.0.0.1:<BROWSER_PORT>`. The agent acts as your real account. |\n| Credentials | None stored by the skill. Session cookies live in the browser profile; `modhash` is read from `/api/me.json` per run. |\n| Public writes | Posts and replies are public and attributed to `<REDDIT_USERNAME>`. Irreversible in practice. |\n| Persisted locally | `<WORKSPACE_DIR>/memory/` — run recaps, post/reply URLs, karma counts, per-sub state, ideas, learnings. Plain markdown, never encrypted. |\n| Retention | You own it. Default: prune entries older than 90 days; keep `reddit-learnings.md` if you want long memory. Delete the dir to erase all history. |\n| Network egress | **None by default.** Webhooks are opt-in. If you set `alerts.webhook`, run status, post/reply URLs, karma and blocker text **leave your machine** to Telegram/Slack/Discord and are stored by that provider. Leave it empty to keep everything local. |\n| Human approval | Recommended for every top-level post. Required whenever this doc says STOP. |\n\n## When to Use\n\n| Trigger | Action |\n|---|---|\n| \"post to reddit\" / cron fires | §Login check → §Phase gate → §Post structure |\n| \"reply to this thread\" | §Qualification → §Reply templates → §Quotas |\n| \"automod removed my post\" | §Recovery → freeze sub 7 days → log |\n| \"did I get shadowbanned\" | §Recovery, shadowban row → human verification |\n| CAPTCHA or challenge appears | **STOP. Hand to a human.** §Challenges |\n| \"is karma high enough\" | §Phase gating |\n\n## Configure for your brand\n\n| Placeholder | Example | Your value |\n|---|---|---|\n| `<BRAND_NAME>` | \"Acme Studio\" | — |\n| `<BRAND_DOMAIN>` | \"acme.studio\" | — |\n| `<REDDIT_USERNAME>` | \"u/AcmeAlex\" | — |\n| `<BROWSER_PROFILE>` | \"reddit-live\" | — |\n| `<BROWSER_PORT>` | \"9223\" | — |\n| `<NICHE_KEYWORDS>` | \"contester amende OR retrait permis\" | — |\n| `<TARGET_SUBS>` | \"r/conseiljuridique, r/AskFrance\" | — |\n| `<WORKSPACE_DIR>` | \"~/.openclaw/workspace/reddit-acme\" | — |\n\n```yaml\n# <WORKSPACE_DIR>/config.yaml\nreddit:\n  username: <REDDIT_USERNAME>\n  browser_profile: <BROWSER_PROFILE>\n  browser_port: <BROWSER_PORT>\ndiscovery:\n  niche_keywords: <NICHE_KEYWORDS>\n  target_subs: [r/<sub-1>, r/<sub-2>]\nworkspace:\n  dir: <WORKSPACE_DIR>\nalerts:\n  channel: telegram | slack | discord\n  webhook: \"\"        # empty = no network egress (default)\n```\n\n```bash\n# Idempotent memory init — creates only what is missing\nmkdir -p \"<WORKSPACE_DIR>/memory\" && cd \"$_\" && for f in recaps post-log reply-log karma-log subs-state ideas learnings; do [ -f \"reddit-$f.md\" ] || : > \"reddit-$f.md\"; done\n# Output: (silent) — 7 files in <WORKSPACE_DIR>/memory/\n```\n\nSnippets assume the OpenClaw browser CLI bound by CDP; any CDP stack works (Playwright, Puppeteer, Chrome MCP) — swap the calls.\n\n## Roles (mental separation, one physical profile)\n\n| Role | Purpose | Default resting page |\n|---|---|---|\n| `red-post` | Act as the account: posts, replies, inbox, karma, flair | `/user/<REDDIT_USERNAME without u/>` |\n| `red-engage` | Discover and qualify: searches, rising/new in target subs | `/search/?q=<NICHE_KEYWORDS>&type=link&t=day&sort=new` |\n| `red-observe` | Read-only maintenance: subscribe, save, read, observe sub rules | `/` |\n\nNever collapse the three into chaotic browsing. After every run, navigate back to the role's resting page.\n\n## Login check (first step of every run)\n\n```bash\nopenclaw browser --browser-profile <BROWSER_PROFILE> status\n# Output: running  (if \"stopped\" → report and STOP; relaunching Chrome is a user action)\n\nopenclaw browser --browser-profile <BROWSER_PROFILE> evaluate --fn \"async () => { const d = await (await fetch('/api/me.json',{credentials:'include'})).json(); return {name: d.data?.name ?? null, link_karma: d.data?.link_karma ?? null, comment_karma: d.data?.comment_karma ?? null, total_karma: d.data?.total_karma ?? null, modhash: !!d.data?.modhash}; }\"\n# Output: {\"name\":\"AcmeAlex\",\"link_karma\":42,\"comment_karma\":318,\"total_karma\":360,\"modhash\":true}\n# name: null → login expired → report and STOP\n```\n\n## Phase gating (karma)\n\n| Phase | Condition | Authorized |\n|---|---|---|\n| A | `total_karma < 100` | Karma-builder + ops crons only. Brand-mentioning crons abort with `\"phase A, karma=X, skip\"`. |\n| B | `total_karma ≥ 100` | All crons. First week: 1 reply/day, not 3. Karma-builder stays on 2 more weeks. |\n| B (forced) | Manual override line in `reddit-karma-log.md` | Established brands accepting more early removals. Auto-freeze on removal (§Recovery) still applies. Document why in `reddit-learnings.md`. |\n\nKarma gates exist because a new account should contribute to a community before it promotes anything. The phases mirror that intent — they are not a way to unlock a gate faster. Karma-builder comments must be independently useful to the thread they are in; if a comment only exists to move the counter, don't post it. Turn karma-builder off at `total_karma ≥ 250` because the account has a real history by then, not because a threshold cleared. Karma is not the only gate: some subs require 90+ days of account age regardless, and some ban automation outright — if a sub forbids automation or requires a karma the account lacks, you don't go there.\n\nRead `reddit-karma-log.md` (last line = state) **and** verify via `/api/me.json`. Crossing 100 alerts the user; **never auto-flip crons** — the user enables Phase B by hand.\n\n## Qualification of a post for reply\n\nRepliable only if **all** hold — any check fails → skip, and say why in the recap:\n\n- Age ≤ 24h (`created_utc`) · comments < 200 · score ≥ 1 · not `removed`/`locked`\n- Real question in your domain — not a vent, a meme, or a request for free work\n- ≤ 1 expert-like reply already in the top 10 comments\n- Sub not frozen (`reddit-subs-state.md`) and never touched before on this thread (`reddit-reply-log.md`)\n- Phase A: no domain-expert reply at all — general helpful comments only\n\n## Reply and post templates\n\n**Phase A** (karma builder, no brand): 1-3 sentences, conversational, sub's tone, never expert-grade advice (medical/legal/financial), never a link, never a professional signature.\n\n**Phase B** (brand-aware, pedagogical — not promotional):\n\n```\n[Acknowledge the situation in 1 sentence, neutral tone.]\n[General rule / framework in 2-3 sentences. Cite a source only if essential. No promise.]\n[Concrete next step the OP can take alone: deadline, document to gather, official portal.]\n[Optional: if the case is complex, note a specialist can review it. No brand name.]\n```\n\nInformative post (regular cadence, e.g. Tue + Fri) — pick a sub whose karma requirement is met, that is not frozen, and where you have not posted in 14 days:\n\n```\nTitle: [Question-form or \"Guide:\" prefix, ≤ 100 chars]\n\n**Context**: [1 paragraph framing the problem people face]\n**The rule / framework**: [2-3 paragraphs, plain language: sources, deadlines, mechanics]\n**What to do concretely**: 1. [Action] 2. [Action] 3. [Action]\n**Takeaway**: [1 paragraph]\n\n---\n*[Generic role tag, e.g. \"Specialist in <field>\"]. I don't take case-specific questions in public comments.*\n```\n\nApply the sub's required flair; if no relevant flair exists, skip the sub.\n\n**Brand link policy — ZERO outgoing links to `<BRAND_DOMAIN>` (or any owned domain) in any reply or post**, body or footer. The single exception is a DM the user initiated, where one neutral pointer is allowed — see §Identity guardrails. One brand URL is enough for automod removal or a sub ban in legal/medical/financial subs. Your username profile is the only allowed brand signal.\n\n## Quotas (hard limits)\n\n| Action | Limit |\n|---|---|\n| Replies / 24h (Phase B) | 3 max |\n| Replies / Reply Pass run | 1-2 max |\n| Informative posts / week · / day | 2 max · 1 max |\n| Subscribes / week | 5 max |\n| Actions in same sub | min 6h apart |\n| Actions globally | min 30 min apart |\n| Karma builder comments / run · / day | 1-2 max · 3 max |\n\nCount entries in `reddit-reply-log.md` and `reddit-post-log.md` at start of every run; abort early if a quota is already met.\n\nParallel crons share the global limit: take `<WORKSPACE_DIR>/.lock` at run start, release it at exit. Without the lock, the 30-min rule is unenforceable across jobs — two crons violate it silently.\n\n## Anti-spam triggers\n\n| Avoid | Use instead |\n|---|---|\n| \"DM me\", \"contact me\", \"check our site\", \"more info here\" | don't ask, don't link |\n| `<BRAND_NAME>` in the body · \"free consultation\" | no brand name, no marketing |\n| Phone number, email | never |\n| Emojis · ALL CAPS | sober tone; bold/italic sparingly |\n| **Any URL on `<BRAND_DOMAIN>`** (incl. `www.`, subdomains) | **never**, in any reply or post |\n| bit.ly / tinyurl / shorteners | banned — Reddit spam-flags them directly |\n| ≥ 2 links in one comment | max 1 external link per post, none in replies |\n\nBehavioral: Reddit's published limits and most sub rules forbid reposting the same content < 7 days apart, and more than 3 actions in 30 min. Write each reply for its own thread — a copy-pasted opener is spam whether or not anything flags it. Wait ≥ 5 min after a post is created before replying: below that you have not read it. The quotas above exist to keep your account inside these rules and to keep the sub readable — **not** to defeat a detection system.\n\n## Automation challenges — STOP, don't adapt\n\n**When Reddit shows a CAPTCHA, a challenge page, or any anti-automation control, the run ends. A human publishes by hand.**\n\nThis is the doctrine, not a limitation of it. A challenge is Reddit stating that it wants a human for this action. Tuning an agent to look human enough to get past it is a Content Policy violation, it puts the account you are trying to protect at risk of permanent suspension, and it breaks on the next Reddit update. Stopping costs one post; being caught evading costs the account. This skill therefore does **not** describe how to satisfy, score against, solve, or route around any CAPTCHA, bot-detection or anti-automation control. If a control fires — most often on top-level post creation — follow the table below: the run ends and a human publishes.\n\n| Situation | Action |\n|---|---|\n| CAPTCHA / challenge page mid-flow | Exit 2 → `status: blocked` → send the drafted title+body to the alert channel → human publishes |\n| `BAD_CAPTCHA` in `result.json.errors` | Same. Do not retry. |\n| Gate fires on every post for a week | Posting from this account is not viable unattended. Move to human-published drafts. |\n\nThe skill does not ship a posting script. If you wrap the submit call in one, have it exit with these codes so the recap below can be filled mechanically — `result.json` here is Reddit's POST response as your wrapper saved it.\n\n| Code | Meaning | Recap action |\n|---|---|---|\n| 0 | Published, URL on stdout | `status: ok`, log post URL |\n| 1 | Fatal error (UI ref missing, empty body) | `status: error`, attach screenshot |\n| 2 | Challenge or CAPTCHA visible | `status: blocked`, draft to alert channel for manual publish |\n| 3 | Session / login KO | `status: blocked`, alert user to re-login |\n\n## Recovery & blockers\n\n| Issue | Cause | Fix |\n|---|---|---|\n| `status: stopped` | Chrome not running | Report \"relaunch Chrome on port `<BROWSER_PORT>`\". STOP. |\n| `name: null` from `/api/me.json` | Session expired | Report login expired. STOP. |\n| HTTP 429 | Rate limited | Stop the run, report, wait for the next scheduled run. |\n| HTTP 403 on POST | `modhash` expired | Re-fetch from `/api/me.json` once, retry once. Still 403 → report and STOP. |\n| `RATELIMIT`, `DOMAIN_BANNED`, `SUBREDDIT_NOEXIST`, `USER_BLOCKED` in `result.json.errors` | Sub- or account-level refusal | Translate in the recap, no retry, freeze the sub if sub-level. |\n| Comment invisible in profile after 5 min | Possible shadowban | Flag for human check (open profile in incognito). Track per-sub upvote ratios — community-level shadowbans don't fire this signal. |\n| Post removed by automod < 30 min after publish | Sub rules or filter | Auto-freeze the sub 7 days. Append to `reddit-learnings.md`. |\n| `evaluate` returns null, no error | Page not on reddit.com | Navigate first, retry once. |\n| UI refs return null on labels that worked | Reddit shipped a UI change or the account language changed the labels | Re-snapshot, update the label map, re-test on `r/test` before re-enabling the cron. |\n| Click on Publish does nothing / hits the wrong target | The Publish button's UI ref changes when it flips disabled → enabled once the fields are filled | Re-snapshot after filling the body, click the fresh ref. Never reuse a ref captured before the form was complete. |\n| Posting cron killed mid-flow | 60-120 s default job timeout | Raise the per-job timeout well above the default — a UI publish flow plus verification takes minutes. |\n| Account suspended | — | Stop everything. No automatic appeal. Human review only. Log the last action taken. |\n\n## Mandatory recap\n\nAlert channel (only if `alerts.webhook` is set — this message leaves your machine):\n\n```\n[Job name] — [status: ok|partial|blocked|skipped]\nPublic actions: [list short OR \"no post/reply\"]\nLinks: [URLs of new comments/posts]\nKarma: link_karma=X comment_karma=Y total=Z\nBlockers: [text OR \"—\"]\nNext action: [1 line]\n```\n\nFilled instance:\n\n```\nreply-pass-evening — status: partial\nPublic actions: 1 reply in r/conseiljuridique\nLinks: https://reddit.com/r/conseiljuridique/comments/1a2b3c/_/kx9f2p1\nKarma: link_karma=42 comment_karma=319 total=361\nBlockers: informative-post skipped — CAPTCHA at publish, draft sent for manual posting\nNext action: human publishes the draft; re-check sub freeze Thursday\n```\n\nAppend the same block to `<WORKSPACE_DIR>/memory/reddit-recaps.md` with a `## YYYY-MM-DD HH:MM TZ — <job-id>` heading, plus Phase and subs touched. If nothing happened, say so: `no post/reply/subscribe performed, reason`.\n\n## Memory files\n\n| File | Purpose | Cadence |\n|---|---|---|\n| `reddit-recaps.md` | Per-run log (mandatory append) | Every run |\n| `reddit-post-log.md` | Posts: sub, URL, date, score | Each post run |\n| `reddit-reply-log.md` | Replies: thread URL, comment URL, sub, date, removed? | Each reply pass |\n| `reddit-karma-log.md` | Daily karma snapshot + phase | Daily |\n| `reddit-subs-state.md` | Per-sub freeze, flair, karma req, mod messages | After any sub-touching action |\n| `reddit-ideas.md` | Content backlog | Weekly |\n| `reddit-learnings.md` | What got upvoted / removed | Weekly + ad hoc |\n\nAll plain markdown under `<WORKSPACE_DIR>/memory/`. Nothing else is written; nothing is uploaded unless a webhook is set.\n\n## Identity guardrails\n\n- Neutral username, no brand in the handle. Bio: one generic line, no firm name, no contact info.\n- **If anyone asks whether the account is automated or an AI, answer honestly and hand the thread to a human.** No ambiguous replies, no denial.\n- Never give expert-grade advice in DMs — reply once with a neutral pointer to `<BRAND_DOMAIN>/contact` (the only place a brand URL is allowed: a DM the user started, never a public reply or post) and stop.\n- Never share private case details, never promise an outcome, never solicit payment via Reddit.\n- Never silently fake a successful action — verify via API or UI, or report the blockage.\n\n**Better silence than spam. Better a blockage report than a fake success.**\n\n## First-run checklist\n\n- [ ] Placeholders filled; `alerts.webhook` set only if you accept the egress described above.\n- [ ] Reddit account has a neutral username and a generic bio.\n- [ ] Browser profile logged in; `/api/me.json` returns a non-null `name`.\n- [ ] `<WORKSPACE_DIR>/memory/` exists with the 7 files.\n- [ ] Read the rules of every sub in `<TARGET_SUBS>`. Some ban automation outright — drop those.\n- [ ] Phase A confirmed (`total_karma < 100`) → only karma-builder + ops crons enabled.\n- [ ] ≥ 2 weeks of organic activity before any brand-mentioning cron, even at karma ≥ 100.\n- [ ] A human is on call to publish drafts when a challenge blocks a post.\n\n## Scope\n\n**This skill ONLY:** drives one logged-in Reddit profile you own; qualifies threads before replying; enforces karma phases and hard quotas; posts and replies within Reddit and subreddit rules; writes markdown logs under `<WORKSPACE_DIR>/memory/`; sends an opt-in recap webhook; stops and reports on any blocker.\n\n**This skill NEVER:** solves, scores against, or works around a CAPTCHA, challenge, or bot-detection control; tunes timing or behavior to avoid being identified as automated; denies or obscures automation when asked; creates or operates multiple accounts to amplify one voice; votes, brigades, or bypasses a subreddit ban, mod removal, or rate limit; posts brand links; DMs unsolicited; publishes without the account owner's authority; or claims success it did not verify.\n\nFile v2.0.2:_meta.json\n\n{\n  \"ownerId\": \"kn7f6shzecv3qv3wrr074s49f986ybe1\",\n  \"slug\": \"reddit-account-operations\",\n  \"version\": \"2.0.2\",\n  \"publishedAt\": 1784641025280\n}\n\nFile v2.0.2:skill-card.md\n\n## Description:\n\nRun a Reddit account within subreddit rules, karma phases, quotas, and removal recovery for posting from a cron or agent.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[alexbloch-ia](https://clawhub.ai/user/alexbloch-ia)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and developers use this skill to run a single Reddit profile for scheduled posts and replies while respecting subreddit rules, karma gates, quotas, and recovery workflows.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The agent operates a real logged-in Reddit profile and can make public posts or replies attributed to the user.\n\nMitigation: Use only for an account the user intentionally wants an agent to operate, review top-level posts manually, and stop whenever the skill calls for human review.\n\nRisk: Optional webhooks can send recap data, post or reply URLs, karma counts, and blocker text to third-party providers.\n\nMitigation: Keep alerts.webhook empty unless third-party recap sharing is intended and approved.\n\nRisk: Automation challenges, rate limits, subreddit automation bans, or removals can put the Reddit account at risk if ignored.\n\nMitigation: Stop on CAPTCHA or challenge pages, respect subreddit rules and quotas, freeze subs after removals, and avoid communities that ban automation.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/alexbloch-ia/skills/reddit-account-operations)\n- [OpenClaw homepage](https://openclaw.ai)\n- [Repository listed in ClawHub metadata](https://github.com/AlexBloch-IA/reddit-account-operations)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with YAML and shell command snippets]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Creates local markdown run logs and can send opt-in webhook recaps when configured.]\n\n## Skill Version(s):\n\n2.0.2 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v2.0.1: 3 files, 9655 bytes\n\nFiles: skill-card.md (2272b), SKILL.md (17720b), _meta.json (144b)\n\nFile v2.0.1:SKILL.md\n\n---\nname: reddit-account-operations\ndescription: Run a Reddit account within sub rules, not into automod or shadowban — karma phases, quotas, removal recovery. Use when posting from a cron or agent. Trigger on \"post to reddit\", \"reddit bot\", \"automod removed my post\", \"reddit shadowban\", \"karma requirement\".\nmetadata: {\"clawdbot\":{\"emoji\":\"🛡️\",\"homepage\":\"https://openclaw.ai\"}}\n---\n\n# Reddit Account Operations\n\n**The goal is not to comment fast. The goal is to operate Reddit like a careful, helpful human contributor: stable browser, correct context, useful action, no spam, no reputational risk.**\n\nReddit's Content Policy and each subreddit's rules bind this skill. Where they conflict with a quota below, they win.\n\n## Access, data and network — read before running\n\n| What | Detail |\n|---|---|\n| Browser | A logged-in Chrome profile you control, via CDP on `127.0.0.1:<BROWSER_PORT>`. The agent acts as your real account. |\n| Credentials | None stored by the skill. Session cookies live in the browser profile; `modhash` is read from `/api/me.json` per run. |\n| Public writes | Posts and replies are public and attributed to `<REDDIT_USERNAME>`. Irreversible in practice. |\n| Persisted locally | `<WORKSPACE_DIR>/memory/` — run recaps, post/reply URLs, karma counts, per-sub state, ideas, learnings. Plain markdown, never encrypted. |\n| Retention | You own it. Default: prune entries older than 90 days; keep `reddit-learnings.md` if you want long memory. Delete the dir to erase all history. |\n| Network egress | **None by default.** Webhooks are opt-in. If you set `alerts.webhook`, run status, post/reply URLs, karma and blocker text **leave your machine** to Telegram/Slack/Discord and are stored by that provider. Leave it empty to keep everything local. |\n| Human approval | Recommended for every top-level post. Required whenever this doc says STOP. |\n\n## When to Use\n\n| Trigger | Action |\n|---|---|\n| \"post to reddit\" / cron fires | §Login check → §Phase gate → §Post structure |\n| \"reply to this thread\" | §Qualification → §Reply templates → §Quotas |\n| \"automod removed my post\" | §Recovery → freeze sub 7 days → log |\n| \"did I get shadowbanned\" | §Recovery, shadowban row → human verification |\n| CAPTCHA or challenge appears | **STOP. Hand to a human.** §Challenges |\n| \"is karma high enough\" | §Phase gating |\n\n## Configure for your brand\n\n| Placeholder | Example | Your value |\n|---|---|---|\n| `<BRAND_NAME>` | \"Acme Studio\" | — |\n| `<BRAND_DOMAIN>` | \"acme.studio\" | — |\n| `<REDDIT_USERNAME>` | \"u/AcmeAlex\" | — |\n| `<BROWSER_PROFILE>` | \"reddit-live\" | — |\n| `<BROWSER_PORT>` | \"9223\" | — |\n| `<NICHE_KEYWORDS>` | \"contester amende OR retrait permis\" | — |\n| `<TARGET_SUBS>` | \"r/conseiljuridique, r/AskFrance\" | — |\n| `<WORKSPACE_DIR>` | \"~/.openclaw/workspace/reddit-acme\" | — |\n\n```yaml\n# <WORKSPACE_DIR>/config.yaml\nreddit:\n  username: <REDDIT_USERNAME>\n  browser_profile: <BROWSER_PROFILE>\n  browser_port: <BROWSER_PORT>\ndiscovery:\n  niche_keywords: <NICHE_KEYWORDS>\n  target_subs: [r/<sub-1>, r/<sub-2>]\nworkspace:\n  dir: <WORKSPACE_DIR>\nalerts:\n  channel: telegram | slack | discord\n  webhook: \"\"        # empty = no network egress (default)\n```\n\n```bash\n# Idempotent memory init — creates only what is missing\nmkdir -p \"<WORKSPACE_DIR>/memory\" && cd \"$_\" && for f in recaps post-log reply-log karma-log subs-state ideas learnings; do [ -f \"reddit-$f.md\" ] || : > \"reddit-$f.md\"; done\n# Output: (silent) — 7 files in <WORKSPACE_DIR>/memory/\n```\n\nSnippets assume the OpenClaw browser CLI bound by CDP; any CDP stack works (Playwright, Puppeteer, Chrome MCP) — swap the calls.\n\n## Roles (mental separation, one physical profile)\n\n| Role | Purpose | Default resting page |\n|---|---|---|\n| `red-post` | Act as the account: posts, replies, inbox, karma, flair | `/user/<REDDIT_USERNAME without u/>` |\n| `red-engage` | Discover and qualify: searches, rising/new in target subs | `/search/?q=<NICHE_KEYWORDS>&type=link&t=day&sort=new` |\n| `red-observe` | Read-only maintenance: subscribe, save, read, observe sub rules | `/` |\n\nNever collapse the three into chaotic browsing. After every run, navigate back to the role's resting page.\n\n## Login check (first step of every run)\n\n```bash\nopenclaw browser --browser-profile <BROWSER_PROFILE> status\n# Output: running  (if \"stopped\" → report and STOP; relaunching Chrome is a user action)\n\nopenclaw browser --browser-profile <BROWSER_PROFILE> evaluate --fn \"async () => { const d = await (await fetch('/api/me.json',{credentials:'include'})).json(); return {name: d.data?.name ?? null, link_karma: d.data?.link_karma ?? null, comment_karma: d.data?.comment_karma ?? null, total_karma: d.data?.total_karma ?? null, modhash: !!d.data?.modhash}; }\"\n# Output: {\"name\":\"AcmeAlex\",\"link_karma\":42,\"comment_karma\":318,\"total_karma\":360,\"modhash\":true}\n# name: null → login expired → report and STOP\n```\n\n## Phase gating (karma)\n\n| Phase | Condition | Authorized |\n|---|---|---|\n| A | `total_karma < 100` | Karma-builder + ops crons only. Brand-mentioning crons abort with `\"phase A, karma=X, skip\"`. |\n| B | `total_karma ≥ 100` | All crons. First week: 1 reply/day, not 3. Karma-builder stays on 2 more weeks. |\n| B (forced) | Manual override line in `reddit-karma-log.md` | Established brands accepting more early removals. Auto-freeze on removal (§Recovery) still applies. Document why in `reddit-learnings.md`. |\n\nKarma gates exist because a new account should contribute to a community before it promotes anything. The phases mirror that intent — they are not a way to unlock a gate faster. Karma-builder comments must be independently useful to the thread they are in; if a comment only exists to move the counter, don't post it. Turn karma-builder off at `total_karma ≥ 250` because the account has a real history by then, not because a threshold cleared. Karma is not the only gate: some subs require 90+ days of account age regardless, and some ban automation outright — if a sub forbids automation or requires a karma the account lacks, you don't go there.\n\nRead `reddit-karma-log.md` (last line = state) **and** verify via `/api/me.json`. Crossing 100 alerts the user; **never auto-flip crons** — the user enables Phase B by hand.\n\n## Qualification of a post for reply\n\nRepliable only if **all** hold — any check fails → skip, and say why in the recap:\n\n- Age ≤ 24h (`created_utc`) · comments < 200 · score ≥ 1 · not `removed`/`locked`\n- Real question in your domain — not a vent, a meme, or a request for free work\n- ≤ 1 expert-like reply already in the top 10 comments\n- Sub not frozen (`reddit-subs-state.md`) and never touched before on this thread (`reddit-reply-log.md`)\n- Phase A: no domain-expert reply at all — general helpful comments only\n\n## Reply and post templates\n\n**Phase A** (karma builder, no brand): 1-3 sentences, conversational, sub's tone, never expert-grade advice (medical/legal/financial), never a link, never a professional signature.\n\n**Phase B** (brand-aware, pedagogical — not promotional):\n\n```\n[Acknowledge the situation in 1 sentence, neutral tone.]\n[General rule / framework in 2-3 sentences. Cite a source only if essential. No promise.]\n[Concrete next step the OP can take alone: deadline, document to gather, official portal.]\n[Optional: if the case is complex, note a specialist can review it. No brand name.]\n```\n\nInformative post (regular cadence, e.g. Tue + Fri) — pick a sub whose karma requirement is met, that is not frozen, and where you have not posted in 14 days:\n\n```\nTitle: [Question-form or \"Guide:\" prefix, ≤ 100 chars]\n\n**Context**: [1 paragraph framing the problem people face]\n**The rule / framework**: [2-3 paragraphs, plain language: sources, deadlines, mechanics]\n**What to do concretely**: 1. [Action] 2. [Action] 3. [Action]\n**Takeaway**: [1 paragraph]\n\n---\n*[Generic role tag, e.g. \"Specialist in <field>\"]. I don't take case-specific questions in public comments.*\n```\n\nApply the sub's required flair; if no relevant flair exists, skip the sub.\n\n**Brand link policy — ZERO outgoing links to `<BRAND_DOMAIN>` (or any owned domain) in any reply or post**, body or footer. The single exception is a DM the user initiated, where one neutral pointer is allowed — see §Identity guardrails. One brand URL is enough for automod removal or a sub ban in legal/medical/financial subs. Your username profile is the only allowed brand signal.\n\n## Quotas (hard limits)\n\n| Action | Limit |\n|---|---|\n| Replies / 24h (Phase B) | 3 max |\n| Replies / Reply Pass run | 1-2 max |\n| Informative posts / week · / day | 2 max · 1 max |\n| Subscribes / week | 5 max |\n| Actions in same sub | min 6h apart |\n| Actions globally | min 30 min apart |\n| Karma builder comments / run · / day | 1-2 max · 3 max |\n\nCount entries in `reddit-reply-log.md` and `reddit-post-log.md` at start of every run; abort early if a quota is already met.\n\nParallel crons share the global limit: take `<WORKSPACE_DIR>/.lock` at run start, release it at exit. Without the lock, the 30-min rule is unenforceable across jobs — two crons violate it silently.\n\n## Anti-spam triggers\n\n| Avoid | Use instead |\n|---|---|\n| \"DM me\", \"contact me\", \"check our site\", \"more info here\" | don't ask, don't link |\n| `<BRAND_NAME>` in the body · \"free consultation\" | no brand name, no marketing |\n| Phone number, email | never |\n| Emojis · ALL CAPS | sober tone; bold/italic sparingly |\n| **Any URL on `<BRAND_DOMAIN>`** (incl. `www.`, subdomains) | **never**, in any reply or post |\n| bit.ly / tinyurl / shorteners | banned — Reddit spam-flags them directly |\n| ≥ 2 links in one comment | max 1 external link per post, none in replies |\n\nBehavioral: Reddit's published limits and most sub rules forbid reposting the same content < 7 days apart, and more than 3 actions in 30 min. Write each reply for its own thread — a copy-pasted opener is spam whether or not anything flags it. Wait ≥ 5 min after a post is created before replying: below that you have not read it. The quotas above exist to keep your account inside these rules and to keep the sub readable — **not** to defeat a detection system.\n\n## Automation challenges — STOP, don't adapt\n\n**When Reddit shows a CAPTCHA, a challenge page, or any anti-automation control, the run ends. A human publishes by hand.**\n\nThis is the doctrine, not a limitation of it. A challenge is Reddit stating that it wants a human for this action. Tuning an agent to look human enough to get past it is a Content Policy violation, it puts the account you are trying to protect at risk of permanent suspension, and it breaks on the next Reddit update. Stopping costs one post; being caught evading costs the account. This skill therefore does **not** describe how to satisfy, score against, solve, or route around any CAPTCHA, bot-detection or anti-automation control. If a control fires — most often on top-level post creation — follow the table below: the run ends and a human publishes.\n\n| Situation | Action |\n|---|---|\n| CAPTCHA / challenge page mid-flow | Exit 2 → `status: blocked` → send the drafted title+body to the alert channel → human publishes |\n| `BAD_CAPTCHA` in `result.json.errors` | Same. Do not retry. |\n| Gate fires on every post for a week | Posting from this account is not viable unattended. Move to human-published drafts. |\n\nThe skill does not ship a posting script. If you wrap the submit call in one, have it exit with these codes so the recap below can be filled mechanically — `result.json` here is Reddit's POST response as your wrapper saved it.\n\n| Code | Meaning | Recap action |\n|---|---|---|\n| 0 | Published, URL on stdout | `status: ok`, log post URL |\n| 1 | Fatal error (UI ref missing, empty body) | `status: error`, attach screenshot |\n| 2 | Challenge or CAPTCHA visible | `status: blocked`, draft to alert channel for manual publish |\n| 3 | Session / login KO | `status: blocked`, alert user to re-login |\n\n## Recovery & blockers\n\n| Issue | Cause | Fix |\n|---|---|---|\n| `status: stopped` | Chrome not running | Report \"relaunch Chrome on port `<BROWSER_PORT>`\". STOP. |\n| `name: null` from `/api/me.json` | Session expired | Report login expired. STOP. |\n| HTTP 429 | Rate limited | Stop the run, report, wait for the next scheduled run. |\n| HTTP 403 on POST | `modhash` expired | Re-fetch from `/api/me.json` once, retry once. Still 403 → report and STOP. |\n| `RATELIMIT`, `DOMAIN_BANNED`, `SUBREDDIT_NOEXIST`, `USER_BLOCKED` in `result.json.errors` | Sub- or account-level refusal | Translate in the recap, no retry, freeze the sub if sub-level. |\n| Comment invisible in profile after 5 min | Possible shadowban | Flag for human check (open profile in incognito). Track per-sub upvote ratios — community-level shadowbans don't fire this signal. |\n| Post removed by automod < 30 min after publish | Sub rules or filter | Auto-freeze the sub 7 days. Append to `reddit-learnings.md`. |\n| `evaluate` returns null, no error | Page not on reddit.com | Navigate first, retry once. |\n| UI refs return null on labels that worked | Reddit shipped a UI change or the account language changed the labels | Re-snapshot, update the label map, re-test on `r/test` before re-enabling the cron. |\n| Click on Publish does nothing / hits the wrong target | The Publish button's UI ref changes when it flips disabled → enabled once the fields are filled | Re-snapshot after filling the body, click the fresh ref. Never reuse a ref captured before the form was complete. |\n| Posting cron killed mid-flow | 60-120 s default job timeout | Raise the per-job timeout well above the default — a UI publish flow plus verification takes minutes. |\n| Account suspended | — | Stop everything. No automatic appeal. Human review only. Log the last action taken. |\n\n## Mandatory recap\n\nAlert channel (only if `alerts.webhook` is set — this message leaves your machine):\n\n```\n[Job name] — [status: ok|partial|blocked|skipped]\nPublic actions: [list short OR \"no post/reply\"]\nLinks: [URLs of new comments/posts]\nKarma: link_karma=X comment_karma=Y total=Z\nBlockers: [text OR \"—\"]\nNext action: [1 line]\n```\n\nFilled instance:\n\n```\nreply-pass-evening — status: partial\nPublic actions: 1 reply in r/conseiljuridique\nLinks: https://reddit.com/r/conseiljuridique/comments/1a2b3c/_/kx9f2p1\nKarma: link_karma=42 comment_karma=319 total=361\nBlockers: informative-post skipped — CAPTCHA at publish, draft sent for manual posting\nNext action: human publishes the draft; re-check sub freeze Thursday\n```\n\nAppend the same block to `<WORKSPACE_DIR>/memory/reddit-recaps.md` with a `## YYYY-MM-DD HH:MM TZ — <job-id>` heading, plus Phase and subs touched. If nothing happened, say so: `no post/reply/subscribe performed, reason`.\n\n## Memory files\n\n| File | Purpose | Cadence |\n|---|---|---|\n| `reddit-recaps.md` | Per-run log (mandatory append) | Every run |\n| `reddit-post-log.md` | Posts: sub, URL, date, score | Each post run |\n| `reddit-reply-log.md` | Replies: thread URL, comment URL, sub, date, removed? | Each reply pass |\n| `reddit-karma-log.md` | Daily karma snapshot + phase | Daily |\n| `reddit-subs-state.md` | Per-sub freeze, flair, karma req, mod messages | After any sub-touching action |\n| `reddit-ideas.md` | Content backlog | Weekly |\n| `reddit-learnings.md` | What got upvoted / removed | Weekly + ad hoc |\n\nAll plain markdown under `<WORKSPACE_DIR>/memory/`. Nothing else is written; nothing is uploaded unless a webhook is set.\n\n## Identity guardrails\n\n- Neutral username, no brand in the handle. Bio: one generic line, no firm name, no contact info.\n- **If anyone asks whether the account is automated or an AI, answer honestly and hand the thread to a human.** No ambiguous replies, no denial.\n- Never give expert-grade advice in DMs — reply once with a neutral pointer to `<BRAND_DOMAIN>/contact` (the only place a brand URL is allowed: a DM the user started, never a public reply or post) and stop.\n- Never share private case details, never promise an outcome, never solicit payment via Reddit.\n- Never silently fake a successful action — verify via API or UI, or report the blockage.\n\n**Better silence than spam. Better a blockage report than a fake success.**\n\n## First-run checklist\n\n- [ ] Placeholders filled; `alerts.webhook` set only if you accept the egress described above.\n- [ ] Reddit account has a neutral username and a generic bio.\n- [ ] Browser profile logged in; `/api/me.json` returns a non-null `name`.\n- [ ] `<WORKSPACE_DIR>/memory/` exists with the 7 files.\n- [ ] Read the rules of every sub in `<TARGET_SUBS>`. Some ban automation outright — drop those.\n- [ ] Phase A confirmed (`total_karma < 100`) → only karma-builder + ops crons enabled.\n- [ ] ≥ 2 weeks of organic activity before any brand-mentioning cron, even at karma ≥ 100.\n- [ ] A human is on call to publish drafts when a challenge blocks a post.\n\n## Scope\n\n**This skill ONLY:** drives one logged-in Reddit profile you own; qualifies threads before replying; enforces karma phases and hard quotas; posts and replies within Reddit and subreddit rules; writes markdown logs under `<WORKSPACE_DIR>/memory/`; sends an opt-in recap webhook; stops and reports on any blocker.\n\n**This skill NEVER:** solves, scores against, or works around a CAPTCHA, challenge, or bot-detection control; tunes timing or behavior to avoid being identified as automated; denies or obscures automation when asked; creates or operates multiple accounts to amplify one voice; votes, brigades, or bypasses a subreddit ban, mod removal, or rate limit; posts brand links; DMs unsolicited; publishes without the account owner's authority; or claims success it did not verify.\n\nFile v2.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn7f6shzecv3qv3wrr074s49f986ybe1\",\n  \"slug\": \"reddit-account-operations\",\n  \"version\": \"2.0.1\",\n  \"publishedAt\": 1784213978639\n}\n\nFile v2.0.1:skill-card.md\n\n## Description: <br>\nRun a Reddit account within sub rules, not into automod or shadowban -- karma phases, quotas, removal recovery. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[alexbloch-ia](https://clawhub.ai/user/alexbloch-ia) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nExternal account owners and agent operators use this skill to run a single Reddit profile within Reddit and subreddit rules, including login checks, karma phase gates, post and reply qualification, quotas, recovery steps, and mandatory recaps. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The agent may publish public posts or replies from the user's real Reddit account. <br>\nMitigation: Require human confirmation for top-level posts and stop for any blocker or challenge before publishing. <br>\nRisk: Optional webhooks can send run status, URLs, karma, and blocker text to a third-party provider. <br>\nMitigation: Leave the webhook empty unless that disclosure is acceptable for the account and workflow. <br>\nRisk: Automation may be prohibited by a target subreddit or blocked by Reddit challenges. <br>\nMitigation: Avoid subreddits that prohibit automation and hand off to a human whenever CAPTCHA, challenge pages, or anti-automation controls appear. <br>\n\n\n## Reference(s): <br>\n- [Reddit Account Operations on ClawHub](https://clawhub.ai/alexbloch-ia/skills/reddit-account-operations) <br>\n- [OpenClaw](https://openclaw.ai) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [guidance, markdown, shell commands, configuration] <br>\n**Output Format:** [Markdown guidance with YAML and bash examples] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Produces operational instructions, draft structures, recap formats, local memory-file conventions, and STOP conditions for human handoff.] <br>\n\n## Skill Version(s): <br>\n2.0.1 (source: server release evidence) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v2.0.0: 3 files, 9690 bytes\n\nFiles: skill-card.md (2360b), SKILL.md (17720b), _meta.json (144b)\n\nFile v2.0.0:SKILL.md\n\n---\nname: reddit-account-operations\ndescription: Run a Reddit account within sub rules, not into automod or shadowban — karma phases, quotas, removal recovery. Use when posting from a cron or agent. Trigger on \"post to reddit\", \"reddit bot\", \"automod removed my post\", \"reddit shadowban\", \"karma requirement\".\nmetadata: {\"clawdbot\":{\"emoji\":\"🛡️\",\"homepage\":\"https://openclaw.ai\"}}\n---\n\n# Reddit Account Operations\n\n**The goal is not to comment fast. The goal is to operate Reddit like a careful, helpful human contributor: stable browser, correct context, useful action, no spam, no reputational risk.**\n\nReddit's Content Policy and each subreddit's rules bind this skill. Where they conflict with a quota below, they win.\n\n## Access, data and network — read before running\n\n| What | Detail |\n|---|---|\n| Browser | A logged-in Chrome profile you control, via CDP on `127.0.0.1:<BROWSER_PORT>`. The agent acts as your real account. |\n| Credentials | None stored by the skill. Session cookies live in the browser profile; `modhash` is read from `/api/me.json` per run. |\n| Public writes | Posts and replies are public and attributed to `<REDDIT_USERNAME>`. Irreversible in practice. |\n| Persisted locally | `<WORKSPACE_DIR>/memory/` — run recaps, post/reply URLs, karma counts, per-sub state, ideas, learnings. Plain markdown, never encrypted. |\n| Retention | You own it. Default: prune entries older than 90 days; keep `reddit-learnings.md` if you want long memory. Delete the dir to erase all history. |\n| Network egress | **None by default.** Webhooks are opt-in. If you set `alerts.webhook`, run status, post/reply URLs, karma and blocker text **leave your machine** to Telegram/Slack/Discord and are stored by that provider. Leave it empty to keep everything local. |\n| Human approval | Recommended for every top-level post. Required whenever this doc says STOP. |\n\n## When to Use\n\n| Trigger | Action |\n|---|---|\n| \"post to reddit\" / cron fires | §Login check → §Phase gate → §Post structure |\n| \"reply to this thread\" | §Qualification → §Reply templates → §Quotas |\n| \"automod removed my post\" | §Recovery → freeze sub 7 days → log |\n| \"did I get shadowbanned\" | §Recovery, shadowban row → human verification |\n| CAPTCHA or challenge appears | **STOP. Hand to a human.** §Challenges |\n| \"is karma high enough\" | §Phase gating |\n\n## Configure for your brand\n\n| Placeholder | Example | Your value |\n|---|---|---|\n| `<BRAND_NAME>` | \"Acme Studio\" | — |\n| `<BRAND_DOMAIN>` | \"acme.studio\" | — |\n| `<REDDIT_USERNAME>` | \"u/AcmeAlex\" | — |\n| `<BROWSER_PROFILE>` | \"reddit-live\" | — |\n| `<BROWSER_PORT>` | \"9223\" | — |\n| `<NICHE_KEYWORDS>` | \"contester amende OR retrait permis\" | — |\n| `<TARGET_SUBS>` | \"r/conseiljuridique, r/AskFrance\" | — |\n| `<WORKSPACE_DIR>` | \"~/.openclaw/workspace/reddit-acme\" | — |\n\n```yaml\n# <WORKSPACE_DIR>/config.yaml\nreddit:\n  username: <REDDIT_USERNAME>\n  browser_profile: <BROWSER_PROFILE>\n  browser_port: <BROWSER_PORT>\ndiscovery:\n  niche_keywords: <NICHE_KEYWORDS>\n  target_subs: [r/<sub-1>, r/<sub-2>]\nworkspace:\n  dir: <WORKSPACE_DIR>\nalerts:\n  channel: telegram | slack | discord\n  webhook: \"\"        # empty = no network egress (default)\n```\n\n```bash\n# Idempotent memory init — creates only what is missing\nmkdir -p \"<WORKSPACE_DIR>/memory\" && cd \"$_\" && for f in recaps post-log reply-log karma-log subs-state ideas learnings; do [ -f \"reddit-$f.md\" ] || : > \"reddit-$f.md\"; done\n# Output: (silent) — 7 files in <WORKSPACE_DIR>/memory/\n```\n\nSnippets assume the OpenClaw browser CLI bound by CDP; any CDP stack works (Playwright, Puppeteer, Chrome MCP) — swap the calls.\n\n## Roles (mental separation, one physical profile)\n\n| Role | Purpose | Default resting page |\n|---|---|---|\n| `red-post` | Act as the account: posts, replies, inbox, karma, flair | `/user/<REDDIT_USERNAME without u/>` |\n| `red-engage` | Discover and qualify: searches, rising/new in target subs | `/search/?q=<NICHE_KEYWORDS>&type=link&t=day&sort=new` |\n| `red-observe` | Read-only maintenance: subscribe, save, read, observe sub rules | `/` |\n\nNever collapse the three into chaotic browsing. After every run, navigate back to the role's resting page.\n\n## Login check (first step of every run)\n\n```bash\nopenclaw browser --browser-profile <BROWSER_PROFILE> status\n# Output: running  (if \"stopped\" → report and STOP; relaunching Chrome is a user action)\n\nopenclaw browser --browser-profile <BROWSER_PROFILE> evaluate --fn \"async () => { const d = await (await fetch('/api/me.json',{credentials:'include'})).json(); return {name: d.data?.name ?? null, link_karma: d.data?.link_karma ?? null, comment_karma: d.data?.comment_karma ?? null, total_karma: d.data?.total_karma ?? null, modhash: !!d.data?.modhash}; }\"\n# Output: {\"name\":\"AcmeAlex\",\"link_karma\":42,\"comment_karma\":318,\"total_karma\":360,\"modhash\":true}\n# name: null → login expired → report and STOP\n```\n\n## Phase gating (karma)\n\n| Phase | Condition | Authorized |\n|---|---|---|\n| A | `total_karma < 100` | Karma-builder + ops crons only. Brand-mentioning crons abort with `\"phase A, karma=X, skip\"`. |\n| B | `total_karma ≥ 100` | All crons. First week: 1 reply/day, not 3. Karma-builder stays on 2 more weeks. |\n| B (forced) | Manual override line in `reddit-karma-log.md` | Established brands accepting more early removals. Auto-freeze on removal (§Recovery) still applies. Document why in `reddit-learnings.md`. |\n\nKarma gates exist because a new account should contribute to a community before it promotes anything. The phases mirror that intent — they are not a way to unlock a gate faster. Karma-builder comments must be independently useful to the thread they are in; if a comment only exists to move the counter, don't post it. Turn karma-builder off at `total_karma ≥ 250` because the account has a real history by then, not because a threshold cleared. Karma is not the only gate: some subs require 90+ days of account age regardless, and some ban automation outright — if a sub forbids automation or requires a karma the account lacks, you don't go there.\n\nRead `reddit-karma-log.md` (last line = state) **and** verify via `/api/me.json`. Crossing 100 alerts the user; **never auto-flip crons** — the user enables Phase B by hand.\n\n## Qualification of a post for reply\n\nRepliable only if **all** hold — any check fails → skip, and say why in the recap:\n\n- Age ≤ 24h (`created_utc`) · comments < 200 · score ≥ 1 · not `removed`/`locked`\n- Real question in your domain — not a vent, a meme, or a request for free work\n- ≤ 1 expert-like reply already in the top 10 comments\n- Sub not frozen (`reddit-subs-state.md`) and never touched before on this thread (`reddit-reply-log.md`)\n- Phase A: no domain-expert reply at all — general helpful comments only\n\n## Reply and post templates\n\n**Phase A** (karma builder, no brand): 1-3 sentences, conversational, sub's tone, never expert-grade advice (medical/legal/financial), never a link, never a professional signature.\n\n**Phase B** (brand-aware, pedagogical — not promotional):\n\n```\n[Acknowledge the situation in 1 sentence, neutral tone.]\n[General rule / framework in 2-3 sentences. Cite a source only if essential. No promise.]\n[Concrete next step the OP can take alone: deadline, document to gather, official portal.]\n[Optional: if the case is complex, note a specialist can review it. No brand name.]\n```\n\nInformative post (regular cadence, e.g. Tue + Fri) — pick a sub whose karma requirement is met, that is not frozen, and where you have not posted in 14 days:\n\n```\nTitle: [Question-form or \"Guide:\" prefix, ≤ 100 chars]\n\n**Context**: [1 paragraph framing the problem people face]\n**The rule / framework**: [2-3 paragraphs, plain language: sources, deadlines, mechanics]\n**What to do concretely**: 1. [Action] 2. [Action] 3. [Action]\n**Takeaway**: [1 paragraph]\n\n---\n*[Generic role tag, e.g. \"Specialist in <field>\"]. I don't take case-specific questions in public comments.*\n```\n\nApply the sub's required flair; if no relevant flair exists, skip the sub.\n\n**Brand link policy — ZERO outgoing links to `<BRAND_DOMAIN>` (or any owned domain) in any reply or post**, body or footer. The single exception is a DM the user initiated, where one neutral pointer is allowed — see §Identity guardrails. One brand URL is enough for automod removal or a sub ban in legal/medical/financial subs. Your username profile is the only allowed brand signal.\n\n## Quotas (hard limits)\n\n| Action | Limit |\n|---|---|\n| Replies / 24h (Phase B) | 3 max |\n| Replies / Reply Pass run | 1-2 max |\n| Informative posts / week · / day | 2 max · 1 max |\n| Subscribes / week | 5 max |\n| Actions in same sub | min 6h apart |\n| Actions globally | min 30 min apart |\n| Karma builder comments / run · / day | 1-2 max · 3 max |\n\nCount entries in `reddit-reply-log.md` and `reddit-post-log.md` at start of every run; abort early if a quota is already met.\n\nParallel crons share the global limit: take `<WORKSPACE_DIR>/.lock` at run start, release it at exit. Without the lock, the 30-min rule is unenforceable across jobs — two crons violate it silently.\n\n## Anti-spam triggers\n\n| Avoid | Use instead |\n|---|---|\n| \"DM me\", \"contact me\", \"check our site\", \"more info here\" | don't ask, don't link |\n| `<BRAND_NAME>` in the body · \"free consultation\" | no brand name, no marketing |\n| Phone number, email | never |\n| Emojis · ALL CAPS | sober tone; bold/italic sparingly |\n| **Any URL on `<BRAND_DOMAIN>`** (incl. `www.`, subdomains) | **never**, in any reply or post |\n| bit.ly / tinyurl / shorteners | banned — Reddit spam-flags them directly |\n| ≥ 2 links in one comment | max 1 external link per post, none in replies |\n\nBehavioral: Reddit's published limits and most sub rules forbid reposting the same content < 7 days apart, and more than 3 actions in 30 min. Write each reply for its own thread — a copy-pasted opener is spam whether or not anything flags it. Wait ≥ 5 min after a post is created before replying: below that you have not read it. The quotas above exist to keep your account inside these rules and to keep the sub readable — **not** to defeat a detection system.\n\n## Automation challenges — STOP, don't adapt\n\n**When Reddit shows a CAPTCHA, a challenge page, or any anti-automation control, the run ends. A human publishes by hand.**\n\nThis is the doctrine, not a limitation of it. A challenge is Reddit stating that it wants a human for this action. Tuning an agent to look human enough to get past it is a Content Policy violation, it puts the account you are trying to protect at risk of permanent suspension, and it breaks on the next Reddit update. Stopping costs one post; being caught evading costs the account. This skill therefore does **not** describe how to satisfy, score against, solve, or route around any CAPTCHA, bot-detection or anti-automation control. If a control fires — most often on top-level post creation — follow the table below: the run ends and a human publishes.\n\n| Situation | Action |\n|---|---|\n| CAPTCHA / challenge page mid-flow | Exit 2 → `status: blocked` → send the drafted title+body to the alert channel → human publishes |\n| `BAD_CAPTCHA` in `result.json.errors` | Same. Do not retry. |\n| Gate fires on every post for a week | Posting from this account is not viable unattended. Move to human-published drafts. |\n\nThe skill does not ship a posting script. If you wrap the submit call in one, have it exit with these codes so the recap below can be filled mechanically — `result.json` here is Reddit's POST response as your wrapper saved it.\n\n| Code | Meaning | Recap action |\n|---|---|---|\n| 0 | Published, URL on stdout | `status: ok`, log post URL |\n| 1 | Fatal error (UI ref missing, empty body) | `status: error`, attach screenshot |\n| 2 | Challenge or CAPTCHA visible | `status: blocked`, draft to alert channel for manual publish |\n| 3 | Session / login KO | `status: blocked`, alert user to re-login |\n\n## Recovery & blockers\n\n| Issue | Cause | Fix |\n|---|---|---|\n| `status: stopped` | Chrome not running | Report \"relaunch Chrome on port `<BROWSER_PORT>`\". STOP. |\n| `name: null` from `/api/me.json` | Session expired | Report login expired. STOP. |\n| HTTP 429 | Rate limited | Stop the run, report, wait for the next scheduled run. |\n| HTTP 403 on POST | `modhash` expired | Re-fetch from `/api/me.json` once, retry once. Still 403 → report and STOP. |\n| `RATELIMIT`, `DOMAIN_BANNED`, `SUBREDDIT_NOEXIST`, `USER_BLOCKED` in `result.json.errors` | Sub- or account-level refusal | Translate in the recap, no retry, freeze the sub if sub-level. |\n| Comment invisible in profile after 5 min | Possible shadowban | Flag for human check (open profile in incognito). Track per-sub upvote ratios — community-level shadowbans don't fire this signal. |\n| Post removed by automod < 30 min after publish | Sub rules or filter | Auto-freeze the sub 7 days. Append to `reddit-learnings.md`. |\n| `evaluate` returns null, no error | Page not on reddit.com | Navigate first, retry once. |\n| UI refs return null on labels that worked | Reddit shipped a UI change or the account language changed the labels | Re-snapshot, update the label map, re-test on `r/test` before re-enabling the cron. |\n| Click on Publish does nothing / hits the wrong target | The Publish button's UI ref changes when it flips disabled → enabled once the fields are filled | Re-snapshot after filling the body, click the fresh ref. Never reuse a ref captured before the form was complete. |\n| Posting cron killed mid-flow | 60-120 s default job timeout | Raise the per-job timeout well above the default — a UI publish flow plus verification takes minutes. |\n| Account suspended | — | Stop everything. No automatic appeal. Human review only. Log the last action taken. |\n\n## Mandatory recap\n\nAlert channel (only if `alerts.webhook` is set — this message leaves your machine):\n\n```\n[Job name] — [status: ok|partial|blocked|skipped]\nPublic actions: [list short OR \"no post/reply\"]\nLinks: [URLs of new comments/posts]\nKarma: link_karma=X comment_karma=Y total=Z\nBlockers: [text OR \"—\"]\nNext action: [1 line]\n```\n\nFilled instance:\n\n```\nreply-pass-evening — status: partial\nPublic actions: 1 reply in r/conseiljuridique\nLinks: https://reddit.com/r/conseiljuridique/comments/1a2b3c/_/kx9f2p1\nKarma: link_karma=42 comment_karma=319 total=361\nBlockers: informative-post skipped — CAPTCHA at publish, draft sent for manual posting\nNext action: human publishes the draft; re-check sub freeze Thursday\n```\n\nAppend the same block to `<WORKSPACE_DIR>/memory/reddit-recaps.md` with a `## YYYY-MM-DD HH:MM TZ — <job-id>` heading, plus Phase and subs touched. If nothing happened, say so: `no post/reply/subscribe performed, reason`.\n\n## Memory files\n\n| File | Purpose | Cadence |\n|---|---|---|\n| `reddit-recaps.md` | Per-run log (mandatory append) | Every run |\n| `reddit-post-log.md` | Posts: sub, URL, date, score | Each post run |\n| `reddit-reply-log.md` | Replies: thread URL, comment URL, sub, date, removed? | Each reply pass |\n| `reddit-karma-log.md` | Daily karma snapshot + phase | Daily |\n| `reddit-subs-state.md` | Per-sub freeze, flair, karma req, mod messages | After any sub-touching action |\n| `reddit-ideas.md` | Content backlog | Weekly |\n| `reddit-learnings.md` | What got upvoted / removed | Weekly + ad hoc |\n\nAll plain markdown under `<WORKSPACE_DIR>/memory/`. Nothing else is written; nothing is uploaded unless a webhook is set.\n\n## Identity guardrails\n\n- Neutral username, no brand in the handle. Bio: one generic line, no firm name, no contact info.\n- **If anyone asks whether the account is automated or an AI, answer honestly and hand the thread to a human.** No ambiguous replies, no denial.\n- Never give expert-grade advice in DMs — reply once with a neutral pointer to `<BRAND_DOMAIN>/contact` (the only place a brand URL is allowed: a DM the user started, never a public reply or post) and stop.\n- Never share private case details, never promise an outcome, never solicit payment via Reddit.\n- Never silently fake a successful action — verify via API or UI, or report the blockage.\n\n**Better silence than spam. Better a blockage report than a fake success.**\n\n## First-run checklist\n\n- [ ] Placeholders filled; `alerts.webhook` set only if you accept the egress described above.\n- [ ] Reddit account has a neutral username and a generic bio.\n- [ ] Browser profile logged in; `/api/me.json` returns a non-null `name`.\n- [ ] `<WORKSPACE_DIR>/memory/` exists with the 7 files.\n- [ ] Read the rules of every sub in `<TARGET_SUBS>`. Some ban automation outright — drop those.\n- [ ] Phase A confirmed (`total_karma < 100`) → only karma-builder + ops crons enabled.\n- [ ] ≥ 2 weeks of organic activity before any brand-mentioning cron, even at karma ≥ 100.\n- [ ] A human is on call to publish drafts when a challenge blocks a post.\n\n## Scope\n\n**This skill ONLY:** drives one logged-in Reddit profile you own; qualifies threads before replying; enforces karma phases and hard quotas; posts and replies within Reddit and subreddit rules; writes markdown logs under `<WORKSPACE_DIR>/memory/`; sends an opt-in recap webhook; stops and reports on any blocker.\n\n**This skill NEVER:** solves, scores against, or works around a CAPTCHA, challenge, or bot-detection control; tunes timing or behavior to avoid being identified as automated; denies or obscures automation when asked; creates or operates multiple accounts to amplify one voice; votes, brigades, or bypasses a subreddit ban, mod removal, or rate limit; posts brand links; DMs unsolicited; publishes without the account owner's authority; or claims success it did not verify.\n\nFile v2.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn7f6shzecv3qv3wrr074s49f986ybe1\",\n  \"slug\": \"reddit-account-operations\",\n  \"version\": \"2.0.0\",\n  \"publishedAt\": 1784196402242\n}\n\nFile v2.0.0:skill-card.md\n\n## Description: <br>\nRun a Reddit account within subreddit rules and operational safeguards for karma phases, quotas, removal recovery, account challenges, logging, and disclosure. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[alexbloch-ia](https://clawhub.ai/user/alexbloch-ia) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nExternal users and operators use this skill to run a single owned Reddit profile through qualified posting and reply workflows while respecting subreddit rules, rate limits, disclosure expectations, and human approval stop conditions. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill can guide an agent using a logged-in Reddit profile to make public posts and replies from a real account. <br>\nMitigation: Require account-owner authority, human approval for sensitive or promotional posts, and manual handoff whenever the skill says STOP. <br>\nRisk: Opt-in alert webhooks can send run status, URLs, karma, and blocker text to third-party services. <br>\nMitigation: Leave alert webhooks empty unless third-party storage is acceptable. <br>\nRisk: Local memory files store recaps, URLs, karma counts, subreddit state, ideas, and learnings as plain markdown. <br>\nMitigation: Prune entries older than 90 days by default and delete the workspace memory directory when history should be erased. <br>\n\n\n## Reference(s): <br>\n- [OpenClaw](https://openclaw.ai) <br>\n- [ClawHub skill page](https://clawhub.ai/alexbloch-ia/skills/reddit-account-operations) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [Guidance, Markdown, Shell commands, Configuration] <br>\n**Output Format:** [Markdown with YAML and bash code blocks] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Produces operational instructions, stop conditions, recap formats, and local memory file conventions; public Reddit actions require the account owner's authority.] <br>\n\n## Skill Version(s): <br>\n2.0.0 (source: server release metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.2.0: 4 files, 14629 bytes\n\nFiles: README.md (4753b), skill-card.md (2407b), SKILL.md (24475b), _meta.json (144b)\n\nFile v1.2.0:SKILL.md\n\n---\nname: reddit-account-operations\ndescription: Operating doctrine for Reddit account automation — careful, helpful, non-spam contributor pattern with role separation, post qualification, quotas, anti-spam triggers and recovery. Use this for any scheduled Reddit activity (cron, agent, recurring task) where account safety, sub-mod tolerance and long-term reputation matter more than raw output.\n---\n\n# Reddit Account Operations\n\nThis skill is the operating doctrine for every Reddit automation run on a brand, professional or personal account.\n\n**The goal is not to comment fast. The goal is to operate Reddit like a careful, helpful human contributor: stable browser, correct context, useful action, no spam, no reputational risk.**\n\nDrop-in for any niche (legal, medical, software, finance, creator, ecommerce). Replace the placeholders in section 0 with your own values.\n\n---\n\n## 0. Configure for your brand\n\nBefore running anything, fill these placeholders in your local copy or your agent's memory:\n\n| Placeholder | Example | Your value |\n|---|---|---|\n| `<BRAND_NAME>` | \"Acme Studio\" | — |\n| `<BRAND_DOMAIN>` | \"acme.studio\" | — |\n| `<REDDIT_USERNAME>` | \"u/AcmeAlex\" | — |\n| `<BROWSER_PROFILE>` | \"reddit-live\" | — |\n| `<BROWSER_PORT>` | \"9223\" | — |\n| `<NICHE_KEYWORDS>` | \"retrait permis OR contester amende\" | — |\n| `<TARGET_SUBS>` | \"r/conseiljuridique, r/AskFrance\" | — |\n| `<WORKSPACE_DIR>` | \"~/.openclaw/workspace/reddit-<brand>\" | — |\n\nAll shell snippets below assume an [OpenClaw](https://openclaw.ai) browser CLI bound by CDP, but the doctrine works with any browser-automation stack (Playwright, Puppeteer, Chrome MCP). Swap the CLI calls for your own.\n\n### Quick config (copy-paste YAML)\n\nIf your agent reads config from YAML, drop this in `<WORKSPACE_DIR>/config.yaml`:\n\n```yaml\nbrand:\n  name: <BRAND_NAME>\n  domain: <BRAND_DOMAIN>\n\nreddit:\n  username: <REDDIT_USERNAME>        # e.g. \"u/AcmeAlex\"\n  browser_profile: <BROWSER_PROFILE> # e.g. \"reddit-live\"\n  browser_port: <BROWSER_PORT>       # e.g. 9223\n\ndiscovery:\n  niche_keywords: <NICHE_KEYWORDS>   # e.g. \"retrait permis OR contester amende\"\n  target_subs:\n    - r/<sub-1>\n    - r/<sub-2>\n\nworkspace:\n  dir: <WORKSPACE_DIR>               # e.g. \"~/.openclaw/workspace/reddit-acme\"\n\nalerts:\n  channel: telegram | slack | discord\n  webhook: <YOUR_WEBHOOK_URL>\n```\n\n### Compatibility\n\nThe skill is markdown — it works wherever an agent reads `SKILL.md`:\n\n| Stack | Skill install path |\n|---|---|\n| [Claude Code](https://claude.ai/code) | `~/.claude/skills/reddit-account-operations/` |\n| [OpenClaw](https://openclaw.ai) | `~/.openclaw/skills/reddit-account-operations/` |\n| ClawHub-published | one-click install via [clawhub.ai](https://clawhub.ai/alexbloch-ia/reddit-account-operations) |\n| Cursor / Copilot CLI | drop `SKILL.md` into your project's `.cursorrules` or `AGENTS.md` |\n| Any LLM agent reading markdown rules | concatenate `SKILL.md` into your system prompt |\n\n---\n\n## 1. Browser architecture\n\n### Physical profile\n\nA single browser profile is used per account:\n\n- `<BROWSER_PROFILE>` (CDP direct, attached to `http://127.0.0.1:<BROWSER_PORT>`)\n\nUser data dir: `~/.openclaw-browser-profiles/<BROWSER_PROFILE>`.\n\nUse it through the OpenClaw browser CLI:\n\n```bash\nopenclaw browser --browser-profile <BROWSER_PROFILE> status\nopenclaw browser --browser-profile <BROWSER_PROFILE> tabs\nopenclaw browser --browser-profile <BROWSER_PROFILE> navigate https://www.reddit.com/\nopenclaw browser --browser-profile <BROWSER_PROFILE> snapshot --limit 160\nopenclaw browser --browser-profile <BROWSER_PROFILE> click <ref>\nopenclaw browser --browser-profile <BROWSER_PROFILE> type <ref> \"text\"\nopenclaw browser --browser-profile <BROWSER_PROFILE> press Enter\nopenclaw browser --browser-profile <BROWSER_PROFILE> evaluate --fn \"<async function>\"\n```\n\n`evaluate --fn` is the primary API tool: it runs JS in the active tab and returns the function's value as JSON. Use it for `/api/me.json`, `/api/comment`, `/api/submit`, `/api/selectflair`, `/r/<sub>/rising.json`, `/search.json`.\n\n### Roles (mental separation, single physical profile)\n\n#### Role: `red-post`\n\nAccount cockpit. Use for direct account action.\n\nUse for:\n- original informative posts (text/self)\n- replies on threads\n- inbox/notifications check\n- profile checks\n- karma snapshots\n- flair application\n\nDefault page: `https://www.reddit.com/user/<REDDIT_USERNAME without u/>`\n\nMental model: act as the account. Protect it. Do not clutter it.\n\n#### Role: `red-engage`\n\nSearch and discovery radar. Use to find what deserves action.\n\nUse for:\n- keyword searches across target subs\n- monitoring rising/new posts in target subreddits\n- finding qualified candidates for replies\n- competitor observation\n- trend discovery\n\nDefault page:\n`https://www.reddit.com/search/?q=<NICHE_KEYWORDS_URL_ENCODED>&type=link&t=day&sort=new`\n\nMental model: discover, qualify, decide. Do not post impulsively from discovery.\n\n#### Role: `red-stealth`\n\nQuiet maintenance bay. Use for low-noise maintenance.\n\nUse for:\n- subscribing to relevant subreddits\n- saving posts for later study\n- reading without interacting\n- sub-state observation (flair requirements, karma requirements, mod messages)\n\nDefault page: `https://www.reddit.com/`\n\nMental model: maintain quietly. No noisy engagement.\n\n### Operational law\n\n- `red-post` = act as the account\n- `red-engage` = discover what to react to\n- `red-stealth` = maintain quietly\n- stability matters more than speed\n- after every run, navigate back to the role's default page (resting state)\n\nNever collapse all workflows into chaotic browsing.\n\n---\n\n## 2. Login verification (run first on every cron)\n\n```bash\nopenclaw browser --browser-profile <BROWSER_PROFILE> status\nopenclaw browser --browser-profile <BROWSER_PROFILE> evaluate --fn \"async () => { const d = await (await fetch('/api/me.json',{credentials:'include'})).json(); return {name: d.data?.name || null, link_karma: d.data?.link_karma ?? null, comment_karma: d.data?.comment_karma ?? null, total_karma: d.data?.total_karma ?? null, modhash: !!d.data?.modhash}; }\"\n```\n\n- If `status` is `stopped`: report the blockage in your recap channel and stop. Do not attempt to relaunch Chrome from inside a cron — that's a user-side action.\n- If `name` is `null`: login expired. Stop and report.\n\n---\n\n## 3. Phase gating (karma)\n\nReddit's spam filters and most sub auto-mods judge new accounts harshly. Run in two phases:\n\n- **Phase A** (karma < 100): only karma-builder + ops crons run. Any brand-mentioning cron must check karma at start and abort with `\"phase A, karma=X, skip\"` if karma < 100.\n- **Phase B** (karma ≥ 100): all crons authorized.\n\nAlways read `<WORKSPACE_DIR>/memory/reddit-karma-log.md` at start (last line = current state) AND verify via `/api/me.json`.\n\nA Daily Metrics Recap cron appends a snapshot every night and pings your alert channel explicitly when karma crosses 100 for the first time.\n\n### Manual override (advanced)\n\nYou can force Phase B before karma ≥ 100 by appending a line `YYYY-MM-DD - karma=X - phase=B (manual override)` to `reddit-karma-log.md`. The override line takes priority over the threshold. Use when:\n\n- You have an established brand and want immediate brand-aware posting despite low karma.\n- You accept the risk of more automod removals on early posts (auto-freeze on 2 removals still applies — see §10).\n\nDocument the decision in `reddit-learnings.md` so future runs know why the threshold was bypassed.\n\n---\n\n## 4. Qualification of a post for reply\n\nA post is repliable only if **all** of:\n\n- Age ≤ 24h (use `created_utc`)\n- Comment count < 200\n- Score positive (≥ 1, accept controversial-but-genuine)\n- Not flagged `removed` or `locked`\n- Question is a real question in your domain (not a vent, not a meme, not a request for free work)\n- No more than 1 expert-like reply already in top 10 comments (check for domain markers in flairs/body)\n- Subreddit is not in freeze state (see `reddit-subs-state.md`)\n- Your account has not interacted with this thread before (`reddit-reply-log.md`)\n- Phase A: no domain-expert reply at all — only general helpful Phase A comments in Phase A subs.\n\nIf any check fails: skip. Document why in the recap.\n\n---\n\n## 5. Reply templates\n\n### Phase A (karma builder, NO brand mention)\n\n- 1-3 sentences, conversational, genuinely helpful\n- Match the sub's tone\n- Never expert-grade advice (medical, legal, financial)\n- Never link to anything\n- Never sign with anything that hints at a profession\n\nExample structure:\n```\n[Direct answer or empathy hook]. [One concrete tip from common sense]. [Soft close optional].\n```\n\n### Phase B (brand-aware, expert)\n\nDefault mode = **pedagogical**, not promotional.\n\nStructure:\n```\n[Acknowledge the situation in 1 sentence, neutral tone.]\n\n[General rule / framework in 2-3 sentences. Cite a source only if essential. No promise.]\n\n[Concrete next step the OP can take themselves: deadline, document to gather, official portal, command to run.]\n\n[Optional: if the case is complex, mention that a specialist can review the OP's situation. No brand name in the comment body.]\n```\n\nBrand link policy — **ZERO outgoing links to `<BRAND_DOMAIN>` (or any owned domain) in any reply or post.** Indirect signaling only (mention a profession, never a brand name or URL). Reddit's automod and most subs flag self-promo aggressively — a single brand URL is enough to get a thread removed or trigger a sub ban.\n\n- The username profile is your only allowed brand signal (curious readers click through; no need to push).\n- No link in the comment body, not even in a trailing line.\n- No link in a footer / signature block.\n- No mention of the brand by name.\n\nForbidden in any reply:\n- Any URL on `<BRAND_DOMAIN>` (and all variants: `www.`, subdomains, shorteners).\n- \"Contact me\", \"DM me\", \"check our site\", \"more info here\", phone numbers, email addresses.\n- Brand name in the comment body.\n- Promises (\"you will win\", \"it's certain\", \"guaranteed results\").\n- Quoting specific past client/customer cases.\n- Asking the OP to DM you.\n\n---\n\n## 6. Informative post structure (regular cadence, e.g. Tue + Fri)\n\nTarget sub: pick one from `<TARGET_SUBS>` based on:\n1. Sub karma requirement satisfied\n2. Sub freeze state (skip if frozen)\n3. Topic relevance (consult `reddit-ideas.md` and rotate)\n4. Last 14 days have NOT seen you post in that sub (cross-check `reddit-post-log.md`)\n\nFormat:\n```\nTitle: [Question-form or \"Guide:\" prefix, ≤ 100 chars]\n\nBody (markdown):\n**Context** : [1 paragraph framing the problem people face]\n\n**The rule / framework** : [2-3 paragraphs of plain-language explanation: sources, deadlines, mechanics]\n\n**What to do concretely**:\n1. [Action 1]\n2. [Action 2]\n3. [Action 3]\n\n**Takeaway** : [1 paragraph summary]\n\n---\n*[Generic role tag, e.g. \"Specialist in <field>\"]. I don't take case-specific questions in public comments — for a precise situation, a 1:1 review with a qualified professional works better.*\n```\n\n**ZERO brand link** in the body, in the title, or in the closing block. The closing line is an indirect role mention only — no name, no URL, no contact info. Reddit treats brand domains as self-promo; a single URL is usually enough for automod removal in legal/medical/financial subs.\n\nApply flair if the sub requires one. If no relevant flair exists, skip the sub.\n\n---\n\n## 7. Quotas (hard limits)\n\n| Action | Limit |\n|--------|-------|\n| Replies / 24h (Phase B) | 3 max |\n| Replies / Reply Pass run | 1-2 max |\n| Informative posts / week | 2 max |\n| Informative posts / day | 1 max |\n| Subscribes / week | 5 max |\n| Actions in same sub | min 6h apart |\n| Actions globally | min 30 min apart |\n| Karma builder comments / run | 1-2 max |\n| Karma builder comments / day | 3 max |\n\nQuota tracking: read `reddit-reply-log.md` and `reddit-post-log.md` at start of every run, count entries with timestamps in the last 24h / 7d, abort early if quotas already met.\n\n---\n\n## 8. Anti-spam triggers (words and patterns to avoid)\n\n### Comment/post content\n\n| Avoid | Use instead |\n|-------|-------------|\n| \"DM me\", \"contact me\", \"check our site\", \"more info here\" | (just don't ask, don't link) |\n| `<BRAND_NAME>` in the comment body | (no brand name in body) |\n| \"free consultation\", \"free first call\" | (no marketing) |\n| Phone number, email | (never) |\n| Emojis | (most professional/legal/medical subs are sober) |\n| All caps for emphasis | (use italics/bold sparingly) |\n| **Any URL on `<BRAND_DOMAIN>`** (and `www.`, subdomains, shorteners) | **never**, in any reply or post |\n| Multiple external links of any kind | max 1 *external* link total per post (never in replies) |\n| bit.ly / tinyurl / shorteners | banned — Reddit flags these as spam directly |\n\n### Behavioral triggers\n\n- Same content cross-posted < 7 days apart → spam detection\n- ≥ 2 links in a single comment → auto-removed\n- New account (karma < 100) posting in large subs → auto-removed\n- Replying within 60s of post creation → looks bot-like, wait ≥ 5 min\n- Same opening phrase across multiple replies → flagged\n- > 3 actions in 30 min → temporary rate limit\n\n---\n\n## 9. Human-like posting flow (anti-CAPTCHA)\n\nReddit's `/api/submit` endpoint is gated behind **reCAPTCHA Enterprise Invisible** (sitekey `6LfirrMoAAAAAHZOipvza4kpp_VtTwLNuXVwURNQ` at the time of writing). Posting purely via API will fail silently or get blocked. The reliable path is a **human-like UI flow** through the browser CLI: dwells, slow typing, reading pauses — enough behavioral signal to score above reCAPTCHA's threshold and let the post through.\n\n### Flow\n\n1. **Pre-flight session check** — `/api/me.json` returns a non-null `name`.\n2. **Navigate to the sub feed** — let it load (≥ 1.5 s dwell).\n3. **Human scroll** — scroll the sub feed for 4-7 s to simulate reading.\n4. **Navigate to `/r/<sub>/submit`** — wait for composer ready.\n5. **Find the title field via UI ref** (the localized label, e.g. \"Title\" / \"Titre\"), **type slowly** (50-120 ms/key with jitter), then 0.8-1.5 s pause.\n6. **Find the body field via UI ref** (\"Body\" / \"Champ de texte du corps de la publication\"), type slowly, 0.8-1.5 s pause.\n7. **Review pause** — 3-7 s simulating proof-reading.\n8. **Re-snapshot the UI** — the Publish button transitions `disabled → enabled` once the fields are filled, so its ref **changes**. Always re-snapshot before clicking.\n9. **Click Publish once**, then wait for redirect to `/comments/<id>/` (≤ 30 s).\n\nTotal flow: **~6 minutes per post**. Slower is the point — speed is what trips the captcha.\n\n### Exit codes (recommended convention for your script)\n\n| Code | Meaning | Recap action |\n|------|---------|--------------|\n| 0 | Published, URL on stdout | `status: ok`, log post URL |\n| 1 | Fatal error (UI ref missing, empty body) | `status: error`, attach screenshot |\n| 2 | CAPTCHA visible mid-flow | `status: blocked`, fall back to \"draft to alert channel for manual publish\" |\n| 3 | Session / login KO | `status: blocked`, alert user to re-login |\n\n### Gotchas (real ones, costly to discover)\n\n- **`LC_NUMERIC` trap on macOS**: locales like `fr_FR.UTF-8` format decimals as `0,123` instead of `0.123`. `sleep` and `awk` reject the comma → all dwells fall back to 0 → typing becomes instant → captcha fires immediately. **Force `LC_ALL=C` in any helper that does fractional-second math.** First time this bites you, you'll think your script is correct because no error is raised; the post just gets removed.\n- **Re-snapshot before clicking Publish**: the Publish button's UI ref changes when it transitions from disabled to enabled. Stale refs = wrong click target.\n- **Localize the field labels**: the labels `Title` / `Body` / `Publish` are localized server-side based on the account language. Either pin the account UI to English or maintain a label-map (FR/EN/etc.) and try both in `find_ref_named`.\n- **Cron timeout**: bump the per-job timeout to **at least 1200 s** for posting crons — a 60-120 s default will kill a successful flow.\n- **Save debug artifacts**: screenshots + page snapshots at each step in a scratch dir (e.g. `/tmp/<your-namespace>/reddit-post/`). They are gold when a post silently fails.\n- **Reply Pass doesn't need this** — replies use a different code path and do not currently trigger reCAPTCHA Enterprise. Only top-level *post* creation is gated.\n\n### When the UI changes\n\nReddit ships UI changes regularly. When `find_ref_named` starts returning null on labels that used to work:\n\n1. Take a manual snapshot via your browser CLI.\n2. Inspect the new label string for Title / Body / Publish.\n3. Update the label map.\n4. Re-test on `r/test` (safe, no consequence) before re-enabling the live posting cron.\n\n---\n\n## 10. Sub state management\n\nFile: `<WORKSPACE_DIR>/memory/reddit-subs-state.md`\n\nFor each sub, track:\n- Last action timestamp (any reply or post)\n- Last 5 actions and their outcome (live / removed / locked)\n- Karma requirement observed\n- Flair required (yes/no/list)\n- Freeze state (yes if 2 last actions were removed → unfreeze date = removal date + 7 days)\n- Mod messages received (any DM from /r/[sub] mods → flag for human review)\n\nUpdate at the end of every run that touched the sub.\n\n---\n\n## 11. Recovery & blockers\n\n| Issue | Action |\n|-------|--------|\n| `status: stopped` | Report in recap: \"Chrome <BROWSER_PROFILE> stopped, user action required (relaunch Chrome on port <BROWSER_PORT>)\". Stop. |\n| `name: null` from /api/me.json | Report login expired. Stop. |\n| HTTP 429 | Stop the run, report \"rate limited\", wait next scheduled run. |\n| HTTP 403 on POST | Likely modhash expired — re-fetch from /api/me.json once, retry once. If still 403: report and stop. |\n| Captcha / challenge page | Stop. Never attempt to solve. Report for user action. |\n| `result.json.errors` contains `RATELIMIT`, `DOMAIN_BANNED`, `BAD_CAPTCHA`, `SUBREDDIT_NOEXIST`, `USER_BLOCKED` | Translate the error in the recap, do not retry, freeze the sub if it's a sub-level error. |\n| Comment posted but not visible in user profile after 5 min | Possible shadowban. Flag for human verification (open profile in incognito). |\n| Post removed by automod < 30 min after publish | Auto-freeze sub for 7 days. Append to `reddit-learnings.md`. |\n| `evaluate` returns null with no error | Page is not on reddit.com → navigate first, retry once. |\n\n---\n\n## 12. Mandatory recap (alert channel + memory)\n\nAt the end of each cron:\n\n**Alert channel (Telegram / Slack / Discord) — final run message**:\n```\n[Job name] — [status: ok|partial|blocked|skipped]\nPublic actions: [list short OR \"no post/reply\"]\nLinks: [URLs of new comments/posts]\nKarma: link_karma=X comment_karma=Y total=Z\nBlockers: [text OR \"—\"]\nNext action: [1 line]\n```\n\n**Memory** — append to `<WORKSPACE_DIR>/memory/reddit-recaps.md`:\n```\n## YYYY-MM-DD HH:MM TZ — <job-id> — status: <status>\n- Job: <description>\n- Phase: A|B\n- Karma: link=X comment=Y total=Z\n- Actions: <list or \"no action — reason\">\n- Subs touched: <list>\n- Links: <URLs>\n- Blockers: <text or \"—\">\n- Next useful action: <1 line>\n```\n\nIf no action was taken: say so clearly (`no post/reply/follow/subscribe performed, reason`).\n\n---\n\n## 13. Memory files inventory\n\nLocated at: `<WORKSPACE_DIR>/memory/`\n\n| File | Purpose | Update cadence |\n|------|---------|----------------|\n| `reddit-recaps.md` | Per-run logs (mandatory append) | Every cron run |\n| `reddit-post-log.md` | Informative posts (sub, URL, date, score) | Each informative post run |\n| `reddit-reply-log.md` | Replies sent (thread URL, comment URL, sub, date, removed?) | Each reply pass |\n| `reddit-karma-log.md` | Daily karma snapshot + phase | Daily Metrics Recap |\n| `reddit-subs-state.md` | Per-sub freeze, flair, karma req | After any sub-touching action |\n| `reddit-ideas.md` | Content backlog for informative posts | Weekly Planning + ad hoc |\n| `reddit-learnings.md` | Patterns observed (what got upvoted / removed) | Weekly Planning + ad hoc |\n\n---\n\n## 14. Account identity guardrails\n\nThis account exists to be **useful in public** with the brand as a *background* signal.\n\n- The username should be intentionally neutral — do not advertise the brand in the handle\n- Profile bio: a short generic line, no firm name, no contact info\n- Never reply to a DM that asks for expert-grade advice — direct the person to the brand contact page via a standard polite reply\n- Never share private case details, names, or numbers\n- Never reuse strict templates from your CRM / case management as Reddit content\n- Never promise an outcome\n- Never charge or solicit payment via Reddit\n\nIf anyone DMs about hiring you: reply once with a neutral line (`\"the studio takes inquiries via <BRAND_DOMAIN>/contact\"`) and stop.\n\n---\n\n## 15. Phase A → Phase B transition\n\nWhen the Daily Metrics Recap detects `total_karma ≥ 100`:\n\n1. Append to `reddit-karma-log.md`: `YYYY-MM-DD - karma=X - PHASE_B_THRESHOLD_REACHED`\n2. Send a distinct alert: `🎉 Reddit karma ≥ 100 — enable Phase B (jobs.json: keyword-monitor-* + reply-pass-* + informative-post-* + subscribe-growth — flip enabled=true)`\n3. Do NOT auto-flip the crons (manual user action — reduces risk of premature B-phase posting)\n\nOnce Phase B is enabled by the user:\n- First week: 1 reply/day max (not the full 3) — soft ramp\n- Keep karma builder running for 2 more weeks in parallel\n- Once total_karma ≥ 250: disable karma builder, keep only Phase B crons\n\n---\n\n## 16. Stability discipline\n\n- Read the UI before clicking\n- One click → verify with a snapshot\n- Do not stack clicks\n- Close stale tabs at the end of every run\n- Return to the role's default page when done\n- Never silently fake a successful action — always verify via API or UI confirmation\n\n**Better silence than spam. Better a blockage report than a fake success.**\n\n---\n\n## 17. First-run checklist\n\nBefore enabling any cron, run through this checklist:\n\n- [ ] Section 0 placeholders filled in your local copy / agent memory.\n- [ ] Reddit account created with **neutral username** (no brand in the handle).\n- [ ] Profile bio is one short generic line — no firm name, no contact info.\n- [ ] Browser profile launched at `http://127.0.0.1:<BROWSER_PORT>` and logged in.\n- [ ] `/api/me.json` returns a non-null `name` (login verified).\n- [ ] `<WORKSPACE_DIR>/memory/` directory exists with the 7 memory files (see section 13) — empty is fine, scripts append to them.\n- [ ] Alert channel (Telegram / Slack / Discord) webhook tested with a \"hello\" message.\n- [ ] Phase A confirmed: `total_karma < 100` → only karma-builder + ops crons enabled.\n- [ ] At least 2 weeks of organic activity (subscribes, low-stakes comments) **before** enabling brand-mentioning crons, even if karma ≥ 100.\n\nA bash one-liner to init the memory files:\n\n```bash\nmkdir -p \"<WORKSPACE_DIR>/memory\" && cd \"$_\" && touch reddit-recaps.md reddit-post-log.md reddit-reply-log.md reddit-karma-log.md reddit-subs-state.md reddit-ideas.md reddit-learnings.md\n```\n\n(The GitHub repo ships an `init-memory.sh` script that does the same interactively.)\n\n---\n\n## 18. FAQ\n\n**Q: Do I need OpenClaw to use this skill?**\nA: No. OpenClaw browser CLI is the example stack — the doctrine works with Playwright, Puppeteer, Chrome MCP, or any CDP-capable tool. Swap the CLI calls.\n\n**Q: Can I use this skill for multiple Reddit accounts?**\nA: Yes — clone the workspace dir per account. Each account gets its own `memory/` and its own browser profile. Do not cross-link accounts in any reply.\n\n**Q: What if my niche has only one relevant sub and it's strict?**\nA: Run Phase A on adjacent subs (low-stakes, high-volume) to build karma, then start Phase B on the niche sub with the longest possible runway. Some niche subs also require 90+ days of account age regardless of karma.\n\n**Q: Is shadowban detection reliable?**\nA: Partially. The \"comment posted but invisible in incognito after 5 min\" check catches most shadowbans, but Reddit also does **community-specific shadowbans** that don't fire that signal. Track per-sub upvote ratios over time as a backup signal.\n\n**Q: Can I run multiple crons in parallel?**\nA: Yes, but respect the global \"30 min apart\" rule across all crons. A lock file at `<WORKSPACE_DIR>/.lock` is the cleanest way to enforce it.\n\n**Q: What if my account is suspended?**\nA: Stop everything. Do not appeal automatically. Manual review only. Document the suspension in `reddit-learnings.md` with the exact last action before suspension.\n\nFile v1.2.0:README.md\n\n# Reddit Account Operations\n\n> Operating doctrine for Reddit automation — careful, helpful, non-spam contributor pattern with role separation, post qualification, quotas, anti-spam triggers and recovery.\n\n[![License: MIT-0](https://img.shields.io/badge/License-MIT--0-blue.svg)](https://opensource.org/licenses/MIT-0)\n[![ClawHub](https://img.shields.io/badge/ClawHub-Published-orange)](https://clawhub.ai/alexbloch-ia/reddit-account-operations)\n[![Version](https://img.shields.io/badge/version-1.2.0-green)](#changelog)\n\nA Claude Code / OpenClaw skill for running Reddit brand accounts safely. Battle-tested in a regulated-field operation, ported to be domain-agnostic.\n\n**Why most Reddit automation gets banned**: it treats Reddit like Twitter. This doctrine doesn't.\n\n---\n\n## What's in the box\n\n- **3-role mental model** for any Reddit account (`red-post` / `red-engage` / `red-stealth`)\n- **Karma-phased posting**: Phase A safety net (karma < 100, zero brand mentions) → Phase B (full doctrine, brand-aware) — with **manual override path** for established brands\n- **Zero-outgoing-link policy** in replies and posts — the only doctrine that actually survives Reddit automod long-term\n- **Human-like posting flow** (new in v1.2.0): how to bypass Reddit's reCAPTCHA Enterprise Invisible on `/api/submit` via UI dwells + slow typing, including the `LC_NUMERIC` macOS trap that silently breaks scripts\n- **Strict reply qualification**: age, score, mods, expert-duplicate check, sub freeze\n- **Hard quotas** calibrated under spam-filter thresholds (replies/day, posts/week, time-between-actions)\n- **Anti-spam triggers**, both content (banned phrases, shorteners-banned) and behavioral (no reply within 60s of post, no >3 actions in 30 min)\n- **Sub state tracking**: auto-freeze a sub after two removals\n- **Full recovery playbook**: `status:stopped`, HTTP 429, 403, captcha, shadowban suspicion, automod removals\n- **Memory file inventory** for stateful agents\n- **Mandatory recap pattern** (alert channel + memory)\n\n---\n\n## Install\n\n### Via ClawHub (recommended)\n\nThe skill is published on ClawHub — install in one click from your agent:\n\n👉 **<https://clawhub.ai/alexbloch-ia/reddit-account-operations>**\n\n### Via this repository (manual)\n\nClone and run the install script — it copies `SKILL.md` into your local skills directory.\n\n```bash\ngit clone https://github.com/AlexBloch-IA/reddit-account-operations.git\ncd reddit-account-operations\n./install.sh\n```\n\nThe script detects which agent stack you have and copies the skill there:\n\n- `~/.claude/skills/reddit-account-operations/` (Claude Code)\n- `~/.openclaw/skills/reddit-account-operations/` (OpenClaw)\n- Both if both are present.\n\n### Manual copy\n\n```bash\nmkdir -p ~/.claude/skills/reddit-account-operations\ncp SKILL.md ~/.claude/skills/reddit-account-operations/\n```\n\n---\n\n## Quick start\n\n1. Open `SKILL.md` and fill the placeholders in **Section 0** (brand, domain, username, browser profile, port, niche keywords, target subs, workspace dir).\n2. Wire your crons to follow the doctrine (login check first, qualify before reply, log to memory, recap to your alert channel).\n3. **Start in Phase A** until karma ≥ 100. Don't shortcut.\n\nShell snippets in the skill use the [OpenClaw](https://openclaw.ai) browser CLI as an example automation stack. Swap them for Playwright, Puppeteer, Chrome MCP, or any CDP-capable tool you prefer — the doctrine is stack-agnostic.\n\n---\n\n## Who is this for\n\nAny niche where the brand needs to be a *background* signal behind genuinely useful posts:\n\n- **Legal services** (origin of the doctrine — works under strict bar association rules)\n- **Medical / health** practitioners with public-content strategies\n- **Financial advisors** subject to compliance constraints\n- **SaaS / B2B founders** doing community-led growth\n- **Creators / agencies** managing brand accounts on behalf of clients\n\nAnywhere spam = reputation death.\n\n---\n\n## Repository structure\n\n```\nreddit-account-operations/\n├── SKILL.md         # the skill (full doctrine)\n├── README.md        # this file\n├── LICENSE          # MIT-0\n├── install.sh       # auto-install into ~/.claude/skills or ~/.openclaw/skills\n└── CHANGELOG.md     # version history\n```\n\n---\n\n## Companion skill\n\nFor X / Twitter, see **[twitter-account-operations](https://github.com/AlexBloch-IA/twitter-account-operations)** — same doctrine, ported to X with cron-by-cron playbook.\n\n---\n\n## License\n\nReleased under **MIT-0** (MIT No Attribution). Use, fork, adapt, redistribute. No attribution required.\n\n---\n\n## Author\n\n[Alexandre Bloch](https://github.com/AlexBloch-IA) — founder of [OpenClaw](https://openclaw.ai).\nPublished on [ClawHub](https://clawhub.ai/alexbloch-ia).\n\nFile v1.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn7f6shzecv3qv3wrr074s49f986ybe1\",\n  \"slug\": \"reddit-account-operations\",\n  \"version\": \"1.2.0\",\n  \"publishedAt\": 1779136295653\n}\n\nFile v1.2.0:skill-card.md\n\n## Description: <br>\nOperating doctrine for Reddit account automation with role separation, post qualification, quotas, anti-spam triggers, and recovery. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[alexbloch-ia](https://clawhub.ai/user/alexbloch-ia) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nExternal teams, developers, and operators use this skill to guide scheduled Reddit account workflows where public posting, reputation management, and moderation tolerance matter. It provides operational guidance for configuring accounts, qualifying posts, enforcing quotas, logging activity, and handling blockers. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: The skill includes anti-CAPTCHA and bot-detection evasion guidance for Reddit posting. <br>\nMitigation: Do not use the evasion workflow; require human approval for posting and follow Reddit and subreddit rules. <br>\nRisk: The skill directs an agent to operate a logged-in Reddit profile and make public posts or replies. <br>\nMitigation: Keep a human in the approval loop, verify account state before action, and stop on login, rate-limit, moderation, or challenge signals. <br>\nRisk: The skill persists account activity logs and can send optional webhook recaps. <br>\nMitigation: Limit stored and transmitted data to information you are comfortable exposing, and protect webhook destinations and tokens. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/alexbloch-ia/reddit-account-operations) <br>\n- [Publisher profile](https://clawhub.ai/user/alexbloch-ia) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [guidance, markdown, shell commands, configuration] <br>\n**Output Format:** [Markdown instructions with YAML and shell command examples] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [Includes operational guardrails, logging expectations, posting quotas, and recovery steps for a logged-in Reddit browser profile.] <br>\n\n## Skill Version(s): <br>\n1.2.0 (source: server release metadata) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>\n\nArchive v1.0.1: 3 files, 11096 bytes\n\nFiles: README.md (4358b), SKILL.md (19766b), _meta.json (144b)\n\nFile v1.0.1:SKILL.md\n\n---\nname: reddit-account-operations\ndescription: Operating doctrine for Reddit account automation — careful, helpful, non-spam contributor pattern with role separation, post qualification, quotas, anti-spam triggers and recovery. Use this for any scheduled Reddit activity (cron, agent, recurring task) where account safety, sub-mod tolerance and long-term reputation matter more than raw output.\n---\n\n# Reddit Account Operations\n\nThis skill is the operating doctrine for every Reddit automation run on a brand, professional or personal account.\n\n**The goal is not to comment fast. The goal is to operate Reddit like a careful, helpful human contributor: stable browser, correct context, useful action, no spam, no reputational risk.**\n\nDrop-in for any niche (legal, medical, software, finance, creator, ecommerce). Replace the placeholders in section 0 with your own values.\n\n---\n\n## 0. Configure for your brand\n\nBefore running anything, fill these placeholders in your local copy or your agent's memory:\n\n| Placeholder | Example | Your value |\n|---|---|---|\n| `<BRAND_NAME>` | \"Acme Studio\" | — |\n| `<BRAND_DOMAIN>` | \"acme.studio\" | — |\n| `<REDDIT_USERNAME>` | \"u/AcmeAlex\" | — |\n| `<BROWSER_PROFILE>` | \"reddit-live\" | — |\n| `<BROWSER_PORT>` | \"9223\" | — |\n| `<NICHE_KEYWORDS>` | \"retrait permis OR contester amende\" | — |\n| `<TARGET_SUBS>` | \"r/conseiljuridique, r/AskFrance\" | — |\n| `<WORKSPACE_DIR>` | \"~/.openclaw/workspace/reddit-<brand>\" | — |\n\nAll shell snippets below assume an [OpenClaw](https://openclaw.ai) browser CLI bound by CDP, but the doctrine works with any browser-automation stack (Playwright, Puppeteer, Chrome MCP). Swap the CLI calls for your own.\n\n### Quick config (copy-paste YAML)\n\nIf your agent reads config from YAML, drop this in `<WORKSPACE_DIR>/config.yaml`:\n\n```yaml\nbrand:\n  name: <BRAND_NAME>\n  domain: <BRAND_DOMAIN>\n\nreddit:\n  username: <REDDIT_USERNAME>        # e.g. \"u/AcmeAlex\"\n  browser_profile: <BROWSER_PROFILE> # e.g. \"reddit-live\"\n  browser_port: <BROWSER_PORT>       # e.g. 9223\n\ndiscovery:\n  niche_keywords: <NICHE_KEYWORDS>   # e.g. \"retrait permis OR contester amende\"\n  target_subs:\n    - r/<sub-1>\n    - r/<sub-2>\n\nworkspace:\n  dir: <WORKSPACE_DIR>               # e.g. \"~/.openclaw/workspace/reddit-acme\"\n\nalerts:\n  channel: telegram | slack | discord\n  webhook: <YOUR_WEBHOOK_URL>\n```\n\n### Compatibility\n\nThe skill is markdown — it works wherever an agent reads `SKILL.md`:\n\n| Stack | Skill install path |\n|---|---|\n| [Claude Code](https://claude.ai/code) | `~/.claude/skills/reddit-account-operations/` |\n| [OpenClaw](https://openclaw.ai) | `~/.openclaw/skills/reddit-account-operations/` |\n| ClawHub-published | one-click install via [clawhub.ai](https://clawhub.ai/alexbloch-ia/reddit-account-operations) |\n| Cursor / Copilot CLI | drop `SKILL.md` into your project's `.cursorrules` or `AGENTS.md` |\n| Any LLM agent reading markdown rules | concatenate `SKILL.md` into your system prompt |\n\n---\n\n## 1. Browser architecture\n\n### Physical profile\n\nA single browser profile is used per account:\n\n- `<BROWSER_PROFILE>` (CDP direct, attached to `http://127.0.0.1:<BROWSER_PORT>`)\n\nUser data dir: `~/.openclaw-browser-profiles/<BROWSER_PROFILE>`.\n\nUse it through the OpenClaw browser CLI:\n\n```bash\nopenclaw browser --browser-profile <BROWSER_PROFILE> status\nopenclaw browser --browser-profile <BROWSER_PROFILE> tabs\nopenclaw browser --browser-profile <BROWSER_PROFILE> navigate https://www.reddit.com/\nopenclaw browser --browser-profile <BROWSER_PROFILE> snapshot --limit 160\nopenclaw browser --browser-profile <BROWSER_PROFILE> click <ref>\nopenclaw browser --browser-profile <BROWSER_PROFILE> type <ref> \"text\"\nopenclaw browser --browser-profile <BROWSER_PROFILE> press Enter\nopenclaw browser --browser-profile <BROWSER_PROFILE> evaluate --fn \"<async function>\"\n```\n\n`evaluate --fn` is the primary API tool: it runs JS in the active tab and returns the function's value as JSON. Use it for `/api/me.json`, `/api/comment`, `/api/submit`, `/api/selectflair`, `/r/<sub>/rising.json`, `/search.json`.\n\n### Roles (mental separation, single physical profile)\n\n#### Role: `red-post`\n\nAccount cockpit. Use for direct account action.\n\nUse for:\n- original informative posts (text/self)\n- replies on threads\n- inbox/notifications check\n- profile checks\n- karma snapshots\n- flair application\n\nDefault page: `https://www.reddit.com/user/<REDDIT_USERNAME without u/>`\n\nMental model: act as the account. Protect it. Do not clutter it.\n\n#### Role: `red-engage`\n\nSearch and discovery radar. Use to find what deserves action.\n\nUse for:\n- keyword searches across target subs\n- monitoring rising/new posts in target subreddits\n- finding qualified candidates for replies\n- competitor observation\n- trend discovery\n\nDefault page:\n`https://www.reddit.com/search/?q=<NICHE_KEYWORDS_URL_ENCODED>&type=link&t=day&sort=new`\n\nMental model: discover, qualify, decide. Do not post impulsively from discovery.\n\n#### Role: `red-stealth`\n\nQuiet maintenance bay. Use for low-noise maintenance.\n\nUse for:\n- subscribing to relevant subreddits\n- saving posts for later study\n- reading without interacting\n- sub-state observation (flair requirements, karma requirements, mod messages)\n\nDefault page: `https://www.reddit.com/`\n\nMental model: maintain quietly. No noisy engagement.\n\n### Operational law\n\n- `red-post` = act as the account\n- `red-engage` = discover what to react to\n- `red-stealth` = maintain quietly\n- stability matters more than speed\n- after every run, navigate back to the role's default page (resting state)\n\nNever collapse all workflows into chaotic browsing.\n\n---\n\n## 2. Login verification (run first on every cron)\n\n```bash\nopenclaw browser --browser-profile <BROWSER_PROFILE> status\nopenclaw browser --browser-profile <BROWSER_PROFILE> evaluate --fn \"async () => { const d = await (await fetch('/api/me.json',{credentials:'include'})).json(); return {name: d.data?.name || null, link_karma: d.data?.link_karma ?? null, comment_karma: d.data?.comment_karma ?? null, total_karma: d.data?.total_karma ?? null, modhash: !!d.data?.modhash}; }\"\n```\n\n- If `status` is `stopped`: report the blockage in your recap channel and stop. Do not attempt to relaunch Chrome from inside a cron — that's a user-side action.\n- If `name` is `null`: login expired. Stop and report.\n\n---\n\n## 3. Phase gating (karma)\n\nReddit's spam filters and most sub auto-mods judge new accounts harshly. Run in two phases:\n\n- **Phase A** (karma < 100): only karma-builder + ops crons run. Any brand-mentioning cron must check karma at start and abort with `\"phase A, karma=X, skip\"` if karma < 100.\n- **Phase B** (karma ≥ 100): all crons authorized.\n\nAlways read `<WORKSPACE_DIR>/memory/reddit-karma-log.md` at start (last line = current state) AND verify via `/api/me.json`.\n\nA Daily Metrics Recap cron appends a snapshot every night and pings your alert channel explicitly when karma crosses 100 for the first time.\n\n---\n\n## 4. Qualification of a post for reply\n\nA post is repliable only if **all** of:\n\n- Age ≤ 24h (use `created_utc`)\n- Comment count < 200\n- Score positive (≥ 1, accept controversial-but-genuine)\n- Not flagged `removed` or `locked`\n- Question is a real question in your domain (not a vent, not a meme, not a request for free work)\n- No more than 1 expert-like reply already in top 10 comments (check for domain markers in flairs/body)\n- Subreddit is not in freeze state (see `reddit-subs-state.md`)\n- Your account has not interacted with this thread before (`reddit-reply-log.md`)\n- Phase A: no domain-expert reply at all — only general helpful Phase A comments in Phase A subs.\n\nIf any check fails: skip. Document why in the recap.\n\n---\n\n## 5. Reply templates\n\n### Phase A (karma builder, NO brand mention)\n\n- 1-3 sentences, conversational, genuinely helpful\n- Match the sub's tone\n- Never expert-grade advice (medical, legal, financial)\n- Never link to anything\n- Never sign with anything that hints at a profession\n\nExample structure:\n```\n[Direct answer or empathy hook]. [One concrete tip from common sense]. [Soft close optional].\n```\n\n### Phase B (brand-aware, expert)\n\nDefault mode = **pedagogical**, not promotional.\n\nStructure:\n```\n[Acknowledge the situation in 1 sentence, neutral tone.]\n\n[General rule / framework in 2-3 sentences. Cite a source only if essential. No promise.]\n\n[Concrete next step the OP can take themselves: deadline, document to gather, official portal, command to run.]\n\n[Optional: if the case is complex, mention that a specialist can review the OP's situation. No brand name in the comment body.]\n```\n\nBrand link policy:\n- Allowed at most **once per reply**, only as a trailing line: `\"I wrote about the procedure here if you want to dig: [link to a relevant blog article]\"`\n- Link only to a relevant content page on `<BRAND_DOMAIN>` — never the homepage, never a contact page in a reply\n- Never link in the same reply that gives personalized advice — split: rule of the field in the body, generic resource in the trailing line\n- Never mention the brand by name in the reply text. The username profile already signals it for curious readers.\n\nForbidden in any reply:\n- \"Contact me\", \"DM me\", phone numbers, email addresses\n- Promises (\"you will win\", \"it's certain\", \"guaranteed results\")\n- Quoting specific past client/customer cases\n- Asking the OP to DM you\n\n---\n\n## 6. Informative post structure (regular cadence, e.g. Tue + Fri)\n\nTarget sub: pick one from `<TARGET_SUBS>` based on:\n1. Sub karma requirement satisfied\n2. Sub freeze state (skip if frozen)\n3. Topic relevance (consult `reddit-ideas.md` and rotate)\n4. Last 14 days have NOT seen you post in that sub (cross-check `reddit-post-log.md`)\n\nFormat:\n```\nTitle: [Question-form or \"Guide:\" prefix, ≤ 100 chars]\n\nBody (markdown):\n**Context** : [1 paragraph framing the problem people face]\n\n**The rule / framework** : [2-3 paragraphs of plain-language explanation: sources, deadlines, mechanics]\n\n**What to do concretely**:\n1. [Action 1]\n2. [Action 2]\n3. [Action 3]\n\n**Takeaway** : [1 paragraph summary]\n\n---\n*For a detailed walkthrough, I wrote a full article here: [link to blog on <BRAND_DOMAIN>]. I don't take case-specific questions in public comments — for a precise situation a 1:1 review works better.*\n```\n\nThe closing block is the only explicit reference to the brand. Keep it short, factual, no marketing language.\n\nApply flair if the sub requires one. If no relevant flair exists, skip the sub.\n\n---\n\n## 7. Quotas (hard limits)\n\n| Action | Limit |\n|--------|-------|\n| Replies / 24h (Phase B) | 3 max |\n| Replies / Reply Pass run | 1-2 max |\n| Informative posts / week | 2 max |\n| Informative posts / day | 1 max |\n| Subscribes / week | 5 max |\n| Actions in same sub | min 6h apart |\n| Actions globally | min 30 min apart |\n| Karma builder comments / run | 1-2 max |\n| Karma builder comments / day | 3 max |\n\nQuota tracking: read `reddit-reply-log.md` and `reddit-post-log.md` at start of every run, count entries with timestamps in the last 24h / 7d, abort early if quotas already met.\n\n---\n\n## 8. Anti-spam triggers (words and patterns to avoid)\n\n### Comment/post content\n\n| Avoid | Use instead |\n|-------|-------------|\n| \"DM me\", \"contact me\" | (just don't ask) |\n| `<BRAND_NAME>` in the comment body | (no brand name in body) |\n| \"free consultation\", \"free first call\" | (no marketing) |\n| Phone number, email | (never) |\n| Emojis | (most professional/legal/medical subs are sober) |\n| All caps for emphasis | (use italics/bold sparingly) |\n| Multiple external links | max 1 link per reply/post |\n| bit.ly / shorteners | always use full `<BRAND_DOMAIN>` URL |\n\n### Behavioral triggers\n\n- Same content cross-posted < 7 days apart → spam detection\n- ≥ 2 links in a single comment → auto-removed\n- New account (karma < 100) posting in large subs → auto-removed\n- Replying within 60s of post creation → looks bot-like, wait ≥ 5 min\n- Same opening phrase across multiple replies → flagged\n- > 3 actions in 30 min → temporary rate limit\n\n---\n\n## 9. Sub state management\n\nFile: `<WORKSPACE_DIR>/memory/reddit-subs-state.md`\n\nFor each sub, track:\n- Last action timestamp (any reply or post)\n- Last 5 actions and their outcome (live / removed / locked)\n- Karma requirement observed\n- Flair required (yes/no/list)\n- Freeze state (yes if 2 last actions were removed → unfreeze date = removal date + 7 days)\n- Mod messages received (any DM from /r/[sub] mods → flag for human review)\n\nUpdate at the end of every run that touched the sub.\n\n---\n\n## 10. Recovery & blockers\n\n| Issue | Action |\n|-------|--------|\n| `status: stopped` | Report in recap: \"Chrome <BROWSER_PROFILE> stopped, user action required (relaunch Chrome on port <BROWSER_PORT>)\". Stop. |\n| `name: null` from /api/me.json | Report login expired. Stop. |\n| HTTP 429 | Stop the run, report \"rate limited\", wait next scheduled run. |\n| HTTP 403 on POST | Likely modhash expired — re-fetch from /api/me.json once, retry once. If still 403: report and stop. |\n| Captcha / challenge page | Stop. Never attempt to solve. Report for user action. |\n| `result.json.errors` contains `RATELIMIT`, `DOMAIN_BANNED`, `BAD_CAPTCHA`, `SUBREDDIT_NOEXIST`, `USER_BLOCKED` | Translate the error in the recap, do not retry, freeze the sub if it's a sub-level error. |\n| Comment posted but not visible in user profile after 5 min | Possible shadowban. Flag for human verification (open profile in incognito). |\n| Post removed by automod < 30 min after publish | Auto-freeze sub for 7 days. Append to `reddit-learnings.md`. |\n| `evaluate` returns null with no error | Page is not on reddit.com → navigate first, retry once. |\n\n---\n\n## 11. Mandatory recap (alert channel + memory)\n\nAt the end of each cron:\n\n**Alert channel (Telegram / Slack / Discord) — final run message**:\n```\n[Job name] — [status: ok|partial|blocked|skipped]\nPublic actions: [list short OR \"no post/reply\"]\nLinks: [URLs of new comments/posts]\nKarma: link_karma=X comment_karma=Y total=Z\nBlockers: [text OR \"—\"]\nNext action: [1 line]\n```\n\n**Memory** — append to `<WORKSPACE_DIR>/memory/reddit-recaps.md`:\n```\n## YYYY-MM-DD HH:MM TZ — <job-id> — status: <status>\n- Job: <description>\n- Phase: A|B\n- Karma: link=X comment=Y total=Z\n- Actions: <list or \"no action — reason\">\n- Subs touched: <list>\n- Links: <URLs>\n- Blockers: <text or \"—\">\n- Next useful action: <1 line>\n```\n\nIf no action was taken: say so clearly (`no post/reply/follow/subscribe performed, reason`).\n\n---\n\n## 12. Memory files inventory\n\nLocated at: `<WORKSPACE_DIR>/memory/`\n\n| File | Purpose | Update cadence |\n|------|---------|----------------|\n| `reddit-recaps.md` | Per-run logs (mandatory append) | Every cron run |\n| `reddit-post-log.md` | Informative posts (sub, URL, date, score) | Each informative post run |\n| `reddit-reply-log.md` | Replies sent (thread URL, comment URL, sub, date, removed?) | Each reply pass |\n| `reddit-karma-log.md` | Daily karma snapshot + phase | Daily Metrics Recap |\n| `reddit-subs-state.md` | Per-sub freeze, flair, karma req | After any sub-touching action |\n| `reddit-ideas.md` | Content backlog for informative posts | Weekly Planning + ad hoc |\n| `reddit-learnings.md` | Patterns observed (what got upvoted / removed) | Weekly Planning + ad hoc |\n\n---\n\n## 13. Account identity guardrails\n\nThis account exists to be **useful in public** with the brand as a *background* signal.\n\n- The username should be intentionally neutral — do not advertise the brand in the handle\n- Profile bio: a short generic line, no firm name, no contact info\n- Never reply to a DM that asks for expert-grade advice — direct the person to the brand contact page via a standard polite reply\n- Never share private case details, names, or numbers\n- Never reuse strict templates from your CRM / case management as Reddit content\n- Never promise an outcome\n- Never charge or solicit payment via Reddit\n\nIf anyone DMs about hiring you: reply once with a neutral line (`\"the studio takes inquiries via <BRAND_DOMAIN>/contact\"`) and stop.\n\n---\n\n## 14. Phase A → Phase B transition\n\nWhen the Daily Metrics Recap detects `total_karma ≥ 100`:\n\n1. Append to `reddit-karma-log.md`: `YYYY-MM-DD - karma=X - PHASE_B_THRESHOLD_REACHED`\n2. Send a distinct alert: `🎉 Reddit karma ≥ 100 — enable Phase B (jobs.json: keyword-monitor-* + reply-pass-* + informative-post-* + subscribe-growth — flip enabled=true)`\n3. Do NOT auto-flip the crons (manual user action — reduces risk of premature B-phase posting)\n\nOnce Phase B is enabled by the user:\n- First week: 1 reply/day max (not the full 3) — soft ramp\n- Keep karma builder running for 2 more weeks in parallel\n- Once total_karma ≥ 250: disable karma builder, keep only Phase B crons\n\n---\n\n## 15. Stability discipline\n\n- Read the UI before clicking\n- One click → verify with a snapshot\n- Do not stack clicks\n- Close stale tabs at the end of every run\n- Return to the role's default page when done\n- Never silently fake a successful action — always verify via API or UI confirmation\n\n**Better silence than spam. Better a blockage report than a fake success.**\n\n---\n\n## 16. First-run checklist\n\nBefore enabling any cron, run through this checklist:\n\n- [ ] Section 0 placeholders filled in your local copy / agent memory.\n- [ ] Reddit account created with **neutral username** (no brand in the handle).\n- [ ] Profile bio is one short generic line — no firm name, no contact info.\n- [ ] Browser profile launched at `http://127.0.0.1:<BROWSER_PORT>` and logged in.\n- [ ] `/api/me.json` returns a non-null `name` (login verified).\n- [ ] `<WORKSPACE_DIR>/memory/` directory exists with the 7 memory files (see section 12) — empty is fine, scripts append to them.\n- [ ] Alert channel (Telegram / Slack / Discord) webhook tested with a \"hello\" message.\n- [ ] Phase A confirmed: `total_karma < 100` → only karma-builder + ops crons enabled.\n- [ ] At least 2 weeks of organic activity (subscribes, low-stakes comments) **before** enabling brand-mentioning crons, even if karma ≥ 100.\n\nA bash one-liner to init the memory files:\n\n```bash\nmkdir -p \"<WORKSPACE_DIR>/memory\" && cd \"$_\" && touch reddit-recaps.md reddit-post-log.md reddit-reply-log.md reddit-karma-log.md reddit-subs-state.md reddit-ideas.md reddit-learnings.md\n```\n\n(The GitHub repo ships an `init-memory.sh` script that does the same interactively.)\n\n---\n\n## 17. FAQ\n\n**Q: Do I need OpenClaw to use this skill?**\nA: No. OpenClaw browser CLI is the example stack — the doctrine works with Playwright, Puppeteer, Chrome MCP, or any CDP-capable tool. Swap the CLI calls.\n\n**Q: Can I use this skill for multiple Reddit accounts?**\nA: Yes — clone the workspace dir per account. Each account gets its own `memory/` and its own browser profile. Do not cross-link accounts in any reply.\n\n**Q: What if my niche has only one relevant sub and it's strict?**\nA: Run Phase A on adjacent subs (low-stakes, high-volume) to build karma, then start Phase B on the niche sub with the longest possible runway. Some niche subs also require 90+ days of account age regardless of karma.\n\n**Q: Is shadowban detection reliable?**\nA: Partially. The \"comment posted but invisible in incognito after 5 min\" check catches most shadowbans, but Reddit also does **community-specific shadowbans** that don't fire that signal. Track per-sub upvote ratios over time as a backup signal.\n\n**Q: Can I run multiple crons in parallel?**\nA: Yes, but respect the global \"30 min apart\" rule across all crons. A lock file at `<WORKSPACE_DIR>/.lock` is the cleanest way to enforce it.\n\n**Q: What if my account is suspended?**\nA: Stop everything. Do not appeal automatically. Manual review only. Document the suspension in `reddit-learnings.md` with the exact last action before suspension.\n\nFile v1.0.1:README.md\n\n# Reddit Account Operations\n\n> Operating doctrine for Reddit automation — careful, helpful, non-spam contributor pattern with role separation, post qualification, quotas, anti-spam triggers and recovery.\n\n[![License: MIT-0](https://img.shields.io/badge/License-MIT--0-blue.svg)](https://opensource.org/licenses/MIT-0)\n[![ClawHub](https://img.shields.io/badge/ClawHub-Published-orange)](https://clawhub.ai/alexbloch-ia/reddit-account-operations)\n[![Version](https://img.shields.io/badge/version-1.1.0-green)](#changelog)\n\nA Claude Code / OpenClaw skill for running Reddit brand accounts safely. Battle-tested in a regulated-field operation, ported to be domain-agnostic.\n\n**Why most Reddit automation gets banned**: it treats Reddit like Twitter. This doctrine doesn't.\n\n---\n\n## What's in the box\n\n- **3-role mental model** for any Reddit account (`red-post` / `red-engage` / `red-stealth`)\n- **Karma-phased posting**: Phase A safety net (karma < 100, zero brand mentions) → Phase B (full doctrine, brand-aware)\n- **Strict reply qualification**: age, score, mods, expert-duplicate check, sub freeze\n- **Hard quotas** calibrated under spam-filter thresholds (replies/day, posts/week, time-between-actions)\n- **Anti-spam triggers**, both content (banned phrases, single-link rule) and behavioral (no reply within 60s of post, no >3 actions in 30 min)\n- **Sub state tracking**: auto-freeze a sub after two removals\n- **Full recovery playbook**: `status:stopped`, HTTP 429, 403, captcha, shadowban suspicion, automod removals\n- **Memory file inventory** for stateful agents\n- **Mandatory recap pattern** (alert channel + memory)\n\n---\n\n## Install\n\n### Via ClawHub (recommended)\n\nThe skill is published on ClawHub — install in one click from your agent:\n\n👉 **<https://clawhub.ai/alexbloch-ia/reddit-account-operations>**\n\n### Via this repository (manual)\n\nClone and run the install script — it copies `SKILL.md` into your local skills directory.\n\n```bash\ngit clone https://github.com/AlexBloch-IA/reddit-account-operations.git\ncd reddit-account-operations\n./install.sh\n```\n\nThe script detects which agent stack you have and copies the skill there:\n\n- `~/.claude/skills/reddit-account-operations/` (Claude Code)\n- `~/.openclaw/skills/reddit-account-operations/` (OpenClaw)\n- Both if both are present.\n\n### Manual copy\n\n```bash\nmkdir -p ~/.claude/skills/reddit-account-operations\ncp SKILL.md ~/.claude/skills/reddit-account-operations/\n```\n\n---\n\n## Quick start\n\n1. Open `SKILL.md` and fill the placeholders in **Section 0** (brand, domain, username, browser profile, port, niche keywords, target subs, workspace dir).\n2. Wire your crons to follow the doctrine (login check first, qualify before reply, log to memory, recap to your alert channel).\n3. **Start in Phase A** until karma ≥ 100. Don't shortcut.\n\nShell snippets in the skill use the [OpenClaw](https://openclaw.ai) browser CLI as an example automation stack. Swap them for Playwright, Puppeteer, Chrome MCP, or any CDP-capable tool you prefer — the doctrine is stack-agnostic.\n\n---\n\n## Who is this for\n\nAny niche where the brand needs to be a *background* signal behind genuinely useful posts:\n\n- **Legal services** (origin of the doctrine — works under strict bar association rules)\n- **Medical / health** practitioners with public-content strategies\n- **Financial advisors** subject to compliance constraints\n- **SaaS / B2B founders** doing community-led growth\n- **Creators / agencies** managing brand accounts on behalf of clients\n\nAnywhere spam = reputation death.\n\n---\n\n## Repository structure\n\n```\nreddit-account-operations/\n├── SKILL.md         # the skill (full doctrine)\n├── README.md        # this file\n├── LICENSE          # MIT-0\n├── install.sh       # auto-install into ~/.claude/skills or ~/.openclaw/skills\n└── CHANGELOG.md     # version history\n```\n\n---\n\n## Companion skill\n\nFor X / Twitter, see **[twitter-account-operations](https://github.com/AlexBloch-IA/twitter-account-operations)** — same doctrine, ported to X with cron-by-cron playbook.\n\n---\n\n## License\n\nReleased under **MIT-0** (MIT No Attribution). Use, fork, adapt, redistribute. No attribution required.\n\n---\n\n## Author\n\n[Alexandre Bloch](https://github.com/AlexBloch-IA) — founder of [OpenClaw](https://openclaw.ai).\nPublished on [ClawHub](https://clawhub.ai/alexbloch-ia).\n\nFile v1.0.1:_meta.json\n\n{\n  \"ownerId\": \"kn7f6shzecv3qv3wrr074s49f986ybe1\",\n  \"slug\": \"reddit-account-operations\",\n  \"version\": \"1.0.1\",\n  \"publishedAt\": 1779116339048\n}\n\nArchive v1.0.0: 3 files, 8722 bytes\n\nFiles: README.md (2070b), SKILL.md (15836b), _meta.json (144b)\n\nFile v1.0.0:SKILL.md\n\n---\nname: reddit-account-operations\ndescription: Operating doctrine for Reddit account automation — careful, helpful, non-spam contributor pattern with role separation, post qualification, quotas, anti-spam triggers and recovery. Use this for any scheduled Reddit activity (cron, agent, recurring task) where account safety, sub-mod tolerance and long-term reputation matter more than raw output.\n---\n\n# Reddit Account Operations\n\nThis skill is the operating doctrine for every Reddit automation run on a brand, professional or personal account.\n\n**The goal is not to comment fast. The goal is to operate Reddit like a careful, helpful human contributor: stable browser, correct context, useful action, no spam, no reputational risk.**\n\nDrop-in for any niche (legal, medical, software, finance, creator, ecommerce). Replace the placeholders in section 0 with your own values.\n\n---\n\n## 0. Configure for your brand\n\nBefore running anything, fill these placeholders in your local copy or your agent's memory:\n\n| Placeholder | Example | Your value |\n|---|---|---|\n| `<BRAND_NAME>` | \"Acme Studio\" | — |\n| `<BRAND_DOMAIN>` | \"acme.studio\" | — |\n| `<REDDIT_USERNAME>` | \"u/AcmeAlex\" | — |\n| `<BROWSER_PROFILE>` | \"reddit-live\" | — |\n| `<BROWSER_PORT>` | \"9223\" | — |\n| `<NICHE_KEYWORDS>` | \"retrait permis OR contester amende\" | — |\n| `<TARGET_SUBS>` | \"r/conseiljuridique, r/AskFrance\" | — |\n| `<WORKSPACE_DIR>` | \"~/.openclaw/workspace/reddit-<brand>\" | — |\n\nAll shell snippets below assume an [OpenClaw](https://openclaw.ai) browser CLI bound by CDP, but the doctrine works with any browser-automation stack (Playwright, Puppeteer, Chrome MCP). Swap the CLI calls for your own.\n\n---\n\n## 1. Browser architecture\n\n### Physical profile\n\nA single browser profile is used per account:\n\n- `<BROWSER_PROFILE>` (CDP direct, attached to `http://127.0.0.1:<BROWSER_PORT>`)\n\nUser data dir: `~/.openclaw-browser-profiles/<BROWSER_PROFILE>`.\n\nUse it through the OpenClaw browser CLI:\n\n```bash\nopenclaw browser --browser-profile <BROWSER_PROFILE> status\nopenclaw browser --browser-profile <BROWSER_PROFILE> tabs\nopenclaw browser --browser-profile <BROWSER_PROFILE> navigate https://www.reddit.com/\nopenclaw browser --browser-profile <BROWSER_PROFILE> snapshot --limit 160\nopenclaw browser --browser-profile <BROWSER_PROFILE> click <ref>\nopenclaw browser --browser-profile <BROWSER_PROFILE> type <ref> \"text\"\nopenclaw browser --browser-profile <BROWSER_PROFILE> press Enter\nopenclaw browser --browser-profile <BROWSER_PROFILE> evaluate --fn \"<async function>\"\n```\n\n`evaluate --fn` is the primary API tool: it runs JS in the active tab and returns the function's value as JSON. Use it for `/api/me.json`, `/api/comment`, `/api/submit`, `/api/selectflair`, `/r/<sub>/rising.json`, `/search.json`.\n\n### Roles (mental separation, single physical profile)\n\n#### Role: `red-post`\n\nAccount cockpit. Use for direct account action.\n\nUse for:\n- original informative posts (text/self)\n- replies on threads\n- inbox/notifications check\n- profile checks\n- karma snapshots\n- flair application\n\nDefault page: `https://www.reddit.com/user/<REDDIT_USERNAME without u/>`\n\nMental model: act as the account. Protect it. Do not clutter it.\n\n#### Role: `red-engage`\n\nSearch and discovery radar. Use to find what deserves action.\n\nUse for:\n- keyword searches across target subs\n- monitoring rising/new posts in target subreddits\n- finding qualified candidates for replies\n- competitor observation\n- trend discovery\n\nDefault page:\n`https://www.reddit.com/search/?q=<NICHE_KEYWORDS_URL_ENCODED>&type=link&t=day&sort=new`\n\nMental model: discover, qualify, decide. Do not post impulsively from discovery.\n\n#### Role: `red-stealth`\n\nQuiet maintenance bay. Use for low-noise maintenance.\n\nUse for:\n- subscribing to relevant subreddits\n- saving posts for later study\n- reading without interacting\n- sub-state observation (flair requirements, karma requirements, mod messages)\n\nDefault page: `https://www.reddit.com/`\n\nMental model: maintain quietly. No noisy engagement.\n\n### Operational law\n\n- `red-post` = act as the account\n- `red-engage` = discover what to react to\n- `red-stealth` = maintain quietly\n- stability matters more than speed\n- after every run, navigate back to the role's default page (resting state)\n\nNever collapse all workflows into chaotic browsing.\n\n---\n\n## 2. Login verification (run first on every cron)\n\n```bash\nopenclaw browser --browser-profile <BROWSER_PROFILE> status\nopenclaw browser --browser-profile <BROWSER_PROFILE> evaluate --fn \"async () => { const d = await (await fetch('/api/me.json',{credentials:'include'})).json(); return {name: d.data?.name || null, link_karma: d.data?.link_karma ?? null, comment_karma: d.data?.comment_karma ?? null, total_karma: d.data?.total_karma ?? null, modhash: !!d.data?.modhash}; }\"\n```\n\n- If `status` is `stopped`: report the blockage in your recap channel and stop. Do not attempt to relaunch Chrome from inside a cron — that's a user-side action.\n- If `name` is `null`: login expired. Stop and report.\n\n---\n\n## 3. Phase gating (karma)\n\nReddit's spam filters and most sub auto-mods judge new accounts harshly. Run in two phases:\n\n- **Phase A** (karma < 100): only karma-builder + ops crons run. Any brand-mentioning cron must check karma at start and abort with `\"phase A, karma=X, skip\"` if karma < 100.\n- **Phase B** (karma ≥ 100): all crons authorized.\n\nAlways read `<WORKSPACE_DIR>/memory/reddit-karma-log.md` at start (last line = current state) AND verify via `/api/me.json`.\n\nA Daily Metrics Recap cron appends a snapshot every night and pings your alert channel explicitly when karma crosses 100 for the first time.\n\n---\n\n## 4. Qualification of a post for reply\n\nA post is repliable only if **all** of:\n\n- Age ≤ 24h (use `created_utc`)\n- Comment count < 200\n- Score positive (≥ 1, accept controversial-but-genuine)\n- Not flagged `removed` or `locked`\n- Question is a real question in your domain (not a vent, not a meme, not a request for free work)\n- No more than 1 expert-like reply already in top 10 comments (check for domain markers in flairs/body)\n- Subreddit is not in freeze state (see `reddit-subs-state.md`)\n- Your account has not interacted with this thread before (`reddit-reply-log.md`)\n- Phase A: no domain-expert reply at all — only general helpful Phase A comments in Phase A subs.\n\nIf any check fails: skip. Document why in the recap.\n\n---\n\n## 5. Reply templates\n\n### Phase A (karma builder, NO brand mention)\n\n- 1-3 sentences, conversational, genuinely helpful\n- Match the sub's tone\n- Never expert-grade advice (medical, legal, financial)\n- Never link to anything\n- Never sign with anything that hints at a profession\n\nExample structure:\n```\n[Direct answer or empathy hook]. [One concrete tip from common sense]. [Soft close optional].\n```\n\n### Phase B (brand-aware, expert)\n\nDefault mode = **pedagogical**, not promotional.\n\nStructure:\n```\n[Acknowledge the situation in 1 sentence, neutral tone.]\n\n[General rule / framework in 2-3 sentences. Cite a source only if essential. No promise.]\n\n[Concrete next step the OP can take themselves: deadline, document to gather, official portal, command to run.]\n\n[Optional: if the case is complex, mention that a specialist can review the OP's situation. No brand name in the comment body.]\n```\n\nBrand link policy:\n- Allowed at most **once per reply**, only as a trailing line: `\"I wrote about the procedure here if you want to dig: [link to a relevant blog article]\"`\n- Link only to a relevant content page on `<BRAND_DOMAIN>` — never the homepage, never a contact page in a reply\n- Never link in the same reply that gives personalized advice — split: rule of the field in the body, generic resource in the trailing line\n- Never mention the brand by name in the reply text. The username profile already signals it for curious readers.\n\nForbidden in any reply:\n- \"Contact me\", \"DM me\", phone numbers, email addresses\n- Promises (\"you will win\", \"it's certain\", \"guaranteed results\")\n- Quoting specific past client/customer cases\n- Asking the OP to DM you\n\n---\n\n## 6. Informative post structure (regular cadence, e.g. Tue + Fri)\n\nTarget sub: pick one from `<TARGET_SUBS>` based on:\n1. Sub karma requirement satisfied\n2. Sub freeze state (skip if frozen)\n3. Topic relevance (consult `reddit-ideas.md` and rotate)\n4. Last 14 days have NOT seen you post in that sub (cross-check `reddit-post-log.md`)\n\nFormat:\n```\nTitle: [Question-form or \"Guide:\" prefix, ≤ 100 chars]\n\nBody (markdown):\n**Context** : [1 paragraph framing the problem people face]\n\n**The rule / framework** : [2-3 paragraphs of plain-language explanation: sources, deadlines, mechanics]\n\n**What to do concretely**:\n1. [Action 1]\n2. [Action 2]\n3. [Action 3]\n\n**Takeaway** : [1 paragraph summary]\n\n---\n*For a detailed walkthrough, I wrote a full article here: [link to blog on <BRAND_DOMAIN>]. I don't take case-specific questions in public comments — for a precise situation a 1:1 review works better.*\n```\n\nThe closing block is the only explicit reference to the brand. Keep it short, factual, no marketing language.\n\nApply flair if the sub requires one. If no relevant flair exists, skip the sub.\n\n---\n\n## 7. Quotas (hard limits)\n\n| Action | Limit |\n|--------|-------|\n| Replies / 24h (Phase B) | 3 max |\n| Replies / Reply Pass run | 1-2 max |\n| Informative posts / week | 2 max |\n| Informative posts / day | 1 max |\n| Subscribes / week | 5 max |\n| Actions in same sub | min 6h apart |\n| Actions globally | min 30 min apart |\n| Karma builder comments / run | 1-2 max |\n| Karma builder comments / day | 3 max |\n\nQuota tracking: read `reddit-reply-log.md` and `reddit-post-log.md` at start of every run, count entries with timestamps in the last 24h / 7d, abort early if quotas already met.\n\n---\n\n## 8. Anti-spam triggers (words and patterns to avoid)\n\n### Comment/post content\n\n| Avoid | Use instead |\n|-------|-------------|\n| \"DM me\", \"contact me\" | (just don't ask) |\n| `<BRAND_NAME>` in the comment body | (no brand name in body) |\n| \"free consultation\", \"free first call\" | (no marketing) |\n| Phone number, email | (never) |\n| Emojis | (most professional/legal/medical subs are sober) |\n| All caps for emphasis | (use italics/bold sparingly) |\n| Multiple external links | max 1 link per reply/post |\n| bit.ly / shorteners | always use full `<BRAND_DOMAIN>` URL |\n\n### Behavioral triggers\n\n- Same content cross-posted < 7 days apart → spam detection\n- ≥ 2 links in a single comment → auto-removed\n- New account (karma < 100) posting in large subs → auto-removed\n- Replying within 60s of post creation → looks bot-like, wait ≥ 5 min\n- Same opening phrase across multiple replies → flagged\n- > 3 actions in 30 min → temporary rate limit\n\n---\n\n## 9. Sub state management\n\nFile: `<WORKSPACE_DIR>/memory/reddit-subs-state.md`\n\nFor each sub, track:\n- Last action timestamp (any reply or post)\n- Last 5 actions and their outcome (live / removed / locked)\n- Karma requirement observed\n- Flair required (yes/no/list)\n- Freeze state (yes if 2 last actions were removed → unfreeze date = removal date + 7 days)\n- Mod messages received (any DM from /r/[sub] mods → flag for human review)\n\nUpdate at the end of every run that touched the sub.\n\n---\n\n## 10. Recovery & blockers\n\n| Issue | Action |\n|-------|--------|\n| `status: stopped` | Report in recap: \"Chrome <BROWSER_PROFILE> stopped, user action required (relaunch Chrome on port <BROWSER_PORT>)\". Stop. |\n| `name: null` from /api/me.json | Report login expired. Stop. |\n| HTTP 429 | Stop the run, report \"rate limited\", wait next scheduled run. |\n| HTTP 403 on POST | Likely modhash expired — re-fetch from /api/me.json once, retry once. If still 403: report and stop. |\n| Captcha / challenge page | Stop. Never attempt to solve. Report for user action. |\n| `result.json.errors` contains `RATELIMIT`, `DOMAIN_BANNED`, `BAD_CAPTCHA`, `SUBREDDIT_NOEXIST`, `USER_BLOCKED` | Translate the error in the recap, do not retry, freeze the sub if it's a sub-level error. |\n| Comment posted but not visible in user profile after 5 min | Possible shadowban. Flag for human verification (open profile in incognito). |\n| Post removed by automod < 30 min after publish | Auto-freeze sub for 7 days. Append to `reddit-learnings.md`. |\n| `evaluate` returns null with no error | Page is not on reddit.com → navigate first, retry once. |\n\n---\n\n## 11. Mandatory recap (alert channel + memory)\n\nAt the end of each cron:\n\n**Alert channel (Telegram / Slack / Discord) — final run message**:\n```\n[Job name] — [status: ok|partial|blocked|skipped]\nPublic actions: [list short OR \"no post/reply\"]\nLinks: [URLs of new comments/posts]\nKarma: link_karma=X comment_karma=Y total=Z\nBlockers: [text OR \"—\"]\nNext action: [1 line]\n```\n\n**Memory** — append to `<WORKSPACE_DIR>/memory/reddit-recaps.md`:\n```\n## YYYY-MM-DD HH:MM TZ — <job-id> — status: <status>\n- Job: <description>\n- Phase: A|B\n- Karma: link=X comment=Y total=Z\n- Actions: <list or \"no action — reason\">\n- Subs touched: <list>\n- Links: <URLs>\n- Blockers: <text or \"—\">\n- Next useful action: <1 line>\n```\n\nIf no action was taken: say so clearly (`no post/reply/follow/subscribe performed, reason`).\n\n---\n\n## 12. Memory files inventory\n\nLocated at: `<WORKSPACE_DIR>/memory/`\n\n| File | Purpose | Update cadence |\n|------|---------|----------------|\n| `reddit-recaps.md` | Per-run logs (mandatory append) | Every cron run |\n| `reddit-post-log.md` | Informative posts (sub, URL, date, score) | Each informative post run |\n| `reddit-reply-log.md` | Replies sent (thread URL, comment URL, sub, date, removed?) | Each reply pass |\n| `reddit-karma-log.md` | Daily karma snapshot + phase | Daily Metrics Recap |\n| `reddit-subs-state.md` | Per-sub freeze, flair, karma req | After any sub-touching action |\n| `reddit-ideas.md` | Content backlog for informative posts | Weekly Planning + ad hoc |\n| `reddit-learnings.md` | Patterns observed (what got upvoted / removed) | Weekly Planning + ad hoc |\n\n---\n\n## 13. Account identity guardrails\n\nThis account exists to be **useful in public** with the brand as a *background* signal.\n\n- The username should be intentionally neutral — do not advertise the brand in the handle\n- Profile bio: a short generic line, no firm name, no contact info\n- Never reply to a DM that asks for expert-grade advice — direct the person to the brand contact page via a standard polite reply\n- Never share private case details, names, or numbers\n- Never reuse strict templates from your CRM / case management as Reddit content\n- Never promise an outcome\n- Never charge or solicit payment via Reddit\n\nIf anyone DMs about hiring you: reply once with a neutral line (`\"the studio takes inquiries via <BRAND_DOMAIN>/contact\"`) and stop.\n\n---\n\n## 14. Phase A → Phase B transition\n\nWhen the Daily Metrics Recap detects `total_karma ≥ 100`:\n\n1. Append to `reddit-karma-log.md`: `YYYY-MM-DD - karma=X - PHASE_B_THRESHOLD_REACHED`\n2. Send a distinct alert: `🎉 Reddit karma ≥ 100 — enable Phase B (jobs.json: keyword-monitor-* + reply-pass-* + informative-post-* + subscribe-growth — flip enabled=true)`\n3. Do NOT auto-flip the crons (manual user action — reduces risk of premature B-phase posting)\n\nOnce Phase B is enabled by the user:\n- First week: 1 reply/day max (not the full 3) — soft ramp\n- Keep karma builder running for 2 more weeks in parallel\n- Once total_karma ≥ 250: disable karma builder, keep only Phase B crons\n\n---\n\n## 15. Stability discipline\n\n- Read the UI before clicking\n- One click → verify with a snapshot\n- Do not stack clicks\n- Close stale tabs at the end of every run\n- Return to the role's default page when done\n- Never silently fake a successful action — always verify via API or UI confirmation\n\n**Better silence than spam. Better a blockage report than a fake success.**\n\nFile v1.0.0:README.md\n\n# Reddit Account Operations\n\nAn operating doctrine for Reddit automation runs (cron, agent, recurring task) that prioritizes account safety, sub-mod tolerance, and long-term reputation over raw post output.\n\n## What this skill gives you\n\n- A 3-role mental model for any Reddit account (post / engage / stealth)\n- Karma-phased posting (Phase A safety net, Phase B brand mentions)\n- Strict reply qualification (age, score, mods, lawyer-like duplicates, etc.)\n- Hard quotas to stay below spam-filter thresholds\n- Anti-spam triggers (content + behavioral)\n- Sub state tracking (freeze on repeat removals)\n- Memory file inventory for stateful agents\n- Recovery patterns for every common Reddit failure mode\n\n## How to use it\n\n1. **Install the skill** in your agent / Claude Code / OpenClaw workspace.\n2. **Fill the placeholders** in section 0 of `SKILL.md` (brand, domain, username, browser profile, port, keywords, target subs, workspace dir).\n3. **Wire your crons** to follow the doctrine (login check first, qualify before reply, log to memory, recap to your alert channel).\n4. **Start in Phase A** until karma ≥ 100. Don't shortcut.\n\n## Domain-agnostic\n\nThe doctrine was extracted from a brand-safe operation in a regulated field (legal services). It applies as-is to any niche where:\n- Sub auto-mods are strict\n- Spam is reputation-killing\n- An expert account needs to be useful in public before any mention of the brand\n\nExamples: legal, medical, financial, ecommerce, SaaS, creator economy.\n\n## Requirements\n\n- Any browser automation stack with CDP access (OpenClaw, Playwright, Puppeteer, Chrome MCP). Shell snippets in the skill use the OpenClaw CLI — swap them if you use a different stack.\n- A memory location for stateful tracking (the skill assumes flat markdown files under `<WORKSPACE_DIR>/memory/`).\n- An alert channel (Telegram / Slack / Discord) for run recaps.\n\n## License\n\nMIT-0 (No Attribution) — use, fork, adapt, redistribute, no attribution required.\n\n## Source\n\nOriginally developed at [openclaw.ai](https://openclaw.ai). Published on ClawHub.\n\nFile v1.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn7f6shzecv3qv3wrr074s49f986ybe1\",\n  \"slug\": \"reddit-account-operations\",\n  \"version\": \"1.0.0\",\n  \"publishedAt\": 1779115204264\n}","readmeExcerpt":"Skill: Reddit Account Operations Owner: alexbloch-ia Summary: Run a Reddit account within sub rules, not into automod or shadowban — karma phases, quotas, removal recovery. Use when posting from a cron or agent. Trigger... Tags: account-safety:2.0.1, agent:2.0.1, anti-spam:2.0.1, automation:2.0.1, browser-automation:2.0.1, captcha-bypass:2.0.1, cron:2.0.1, doctrine:2.0.1, faq:2.0.1, growth:2.0.1, human-like:2.0.1, la","codeSnippets":[],"executableExamples":[{"language":"yaml","snippet":"# <WORKSPACE_DIR>/config.yaml\nreddit:\n  username: <REDDIT_USERNAME>\n  browser_profile: <BROWSER_PROFILE>\n  browser_port: <BROWSER_PORT>\ndiscovery:\n  niche_keywords: <NICHE_KEYWORDS>\n  target_subs: [r/<sub-1>, r/<sub-2>]\nworkspace:\n  dir: <WORKSPACE_DIR>\nalerts:\n  channel: telegram | slack | discord\n  webhook: \"\"        # empty = no network egress (default)"},{"language":"bash","snippet":"# Idempotent memory init — creates only what is missing\nmkdir -p \"<WORKSPACE_DIR>/memory\" && cd \"$_\" && for f in recaps post-log reply-log karma-log subs-state ideas learnings; do [ -f \"reddit-$f.md\" ] || : > \"reddit-$f.md\"; done\n# Output: (silent) — 7 files in <WORKSPACE_DIR>/memory/"},{"language":"bash","snippet":"openclaw browser --browser-profile <BROWSER_PROFILE> status\n# Output: running  (if \"stopped\" → report and STOP; relaunching Chrome is a user action)\n\nopenclaw browser --browser-profile <BROWSER_PROFILE> evaluate --fn \"async () => { const d = await (await fetch('/api/me.json',{credentials:'include'})).json(); return {name: d.data?.name ?? null, link_karma: d.data?.link_karma ?? null, comment_karma: d.data?.comment_karma ?? null, total_karma: d.data?.total_karma ?? null, modhash: !!d.data?.modhash}; }\"\n# Output: {\"name\":\"AcmeAlex\",\"link_karma\":42,\"comment_karma\":318,\"total_karma\":360,\"modhash\":true}\n# name: null → login expired → report and STOP"},{"language":"text","snippet":"[Acknowledge the situation in 1 sentence, neutral tone.]\n[General rule / framework in 2-3 sentences. Cite a source only if essential. No promise.]\n[Concrete next step the OP can take alone: deadline, document to gather, official portal.]\n[Optional: if the case is complex, note a specialist can review it. No brand name.]"},{"language":"text","snippet":"Title: [Question-form or \"Guide:\" prefix, ≤ 100 chars]\n\n**Context**: [1 paragraph framing the problem people face]\n**The rule / framework**: [2-3 paragraphs, plain language: sources, deadlines, mechanics]\n**What to do concretely**: 1. [Action] 2. [Action] 3. [Action]\n**Takeaway**: [1 paragraph]\n\n---\n*[Generic role tag, e.g. \"Specialist in <field>\"]. I don't take case-specific questions in public comments.*"},{"language":"text","snippet":"[Job name] — [status: ok|partial|blocked|skipped]\nPublic actions: [list short OR \"no post/reply\"]\nLinks: [URLs of new comments/posts]\nKarma: link_karma=X comment_karma=Y total=Z\nBlockers: [text OR \"—\"]\nNext action: [1 line]"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: reddit-account-operations\ndescription: Run a Reddit account within sub rules, not into automod or shadowban — karma phases, quotas, removal recovery. Use when posting from a cron or agent. Trigger on \"post to reddit\", \"reddit bot\", \"automod removed my post\", \"reddit shadowban\", \"karma requirement\".\nmetadata: {\"clawdbot\":{\"emoji\":\"🛡️\",\"homepage\":\"https://openclaw.ai\",\"repository\":\"https://github.com/AlexBloch-IA/reddit-account-operations\"}}\n---\n\n# Reddit Account Operations\n\n**The goal is not to comment fast. The goal is to operate Reddit like a careful, helpful human contributor: stable browser, correct context, useful action, no spam, no reputational risk.**\n\nReddit's Content Policy and each subreddit's rules bind this skill. Where they conflict with a quota below, they win.\n\n## Access, data and network — read before running\n\n| What | Detail |\n|---|---|\n| Browser | A logged-in Chrome profile you control, via CDP on `127.0.0.1:<BROWSER_PORT>`. The agent acts as your real account. |\n| Credentials | None stored by the skill. Session cookies live in the browser profile; `modhash` is read from `/api/me.json` per run. |\n| Public writes | Posts and replies are public and attributed to `<REDDIT_USERNAME>`. Irreversible in practice. |\n| Persisted locally | `<WORKSPACE_DIR>/memory/` — run recaps, post/reply URLs, karma counts, per-sub state, ideas, learnings. Plain markdown, never encrypted. |\n| Retention | You own it. Default: prune entries older than 90 days; keep `reddit-learnings.md` if you want long memory. Delete the dir to erase all history. |\n| Network egress | **None by default.** Webhooks are opt-in. If you set `alerts.webhook`, run status, post/reply URLs, karma and blocker text **leave your machine** to Telegram/Slack/Discord and are stored by that provider. Leave it empty to keep everything local. |\n| Human approval | Recommended for every top-level post. Required whenever this doc says STOP. |\n\n## When to Use\n\n| Trigger | Action |\n|---|---|\n| \"post to reddit\" / cron fires | §Login check → §Phase gate → §Post structure |\n| \"reply to this thread\" | §Qualification → §Reply templates → §Quotas |\n| \"automod removed my post\" | §Recovery → freeze sub 7 days → log |\n| \"did I get shadowbanned\" | §Recovery, shadowban row → human verification |\n| CAPTCHA or challenge appears | **STOP. Hand to a human.** §Challenges |\n| \"is karma high enough\" | §Phase gating |\n\n## Configure for your brand\n\n| Placeholder | Example | Your value |\n|---|---|---|\n| `<BRAND_NAME>` | \"Acme Studio\" | — |\n| `<BRAND_DOMAIN>` | \"acme.studio\" | — |\n| `<REDDIT_USERNAME>` | \"u/AcmeAlex\" | — |\n| `<BROWSER_PROFILE>` | \"reddit-live\" | — |\n| `<BROWSER_PORT>` | \"9223\" | — |\n| `<NICHE_KEYWORDS>` | \"contester amende OR retrait permis\" | — |\n| `<TARGET_SUBS>` | \"r/conseiljuridique, r/AskFrance\" | — |\n| `<WORKSPACE_DIR>` | \"~/.openclaw/workspace/reddit-acme\" | — |\n\n```yaml\n# <WORKSPACE_DIR>/config.yaml\nreddit:\n  username: <REDDIT_USERNAME>\n  browser_profile: <BROWSER_PROFILE>\n  brow"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7f6shzecv3qv3wrr074s49f986ybe1\",\n  \"slug\": \"reddit-account-operations\",\n  \"version\": \"2.0.2\",\n  \"publishedAt\": 1784641025280\n}"},{"path":"skill-card.md","content":"## Description:\n\nRun a Reddit account within subreddit rules, karma phases, quotas, and removal recovery for posting from a cron or agent.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[alexbloch-ia](https://clawhub.ai/user/alexbloch-ia)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users and developers use this skill to run a single Reddit profile for scheduled posts and replies while respecting subreddit rules, karma gates, quotas, and recovery workflows.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The agent operates a real logged-in Reddit profile and can make public posts or replies attributed to the user.\n\nMitigation: Use only for an account the user intentionally wants an agent to operate, review top-level posts manually, and stop whenever the skill calls for human review.\n\nRisk: Optional webhooks can send recap data, post or reply URLs, karma counts, and blocker text to third-party providers.\n\nMitigation: Keep alerts.webhook empty unless third-party recap sharing is intended and approved.\n\nRisk: Automation challenges, rate limits, subreddit automation bans, or removals can put the Reddit account at risk if ignored.\n\nMitigation: Stop on CAPTCHA or challenge pages, respect subreddit rules and quotas, freeze subs after removals, and avoid communities that ban automation.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/alexbloch-ia/skills/reddit-account-operations)\n- [OpenClaw homepage](https://openclaw.ai)\n- [Repository listed in ClawHub metadata](https://github.com/AlexBloch-IA/reddit-account-operations)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown guidance with YAML and shell command snippets]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Creates local markdown run logs and can send opt-in webhook recaps when configured.]\n\n## Skill Version(s):\n\n2.0.2 (source: server release metadata)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Run a Reddit account within sub rules, not into automod or shadowban — karma phases, quotas, removal recovery. Use when posting from a cron or agent. Trigger... Skill: Reddit Account Operations Owner: alexbloch-ia Summary: Run a Reddit account within sub rules, not into automod or shadowban — karma phases, quotas, removal recovery. Use when posting from a cron or agent. Trigger... Tags: account-safety:2.0.1, agent:2.0.1, anti-spam:2.0.1, automation:2.0.1, browser-automation:2.0.1, captcha-bypass:2.0.1, cron:2.0.1, doctrine:2.0.1, faq:2.0.1, growth:2.0.1, human-like:2.0.1, la","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1724,"uniquenessScore":51,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T11:04:11.267Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T11:04:11.267Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T13:42:56.491Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}