# X Ops Assistant

> Use when operating any X/Twitter account. Bare @handle → full detailed report. Drafts must mirror the account’s observed voice/layout habits from recent posts. Ban-check, autopsy, scorecard, peer benchmark. Owner-first when search-suppressed. Optional xurl opt-in. Agent-agnostic.

- **Type:** Skill
- **Install:** `agentstack add skill-lincwang123-bot-x-ops-assistant-x-ops-assistant`
- **Verified:** Yes — security-reviewed for prompt injection and unsafe behavior
- **Seller:** [lincwang123-bot](https://agentstack.voostack.com/s/lincwang123-bot)
- **Installs:** 0
- **Category:** [Search](https://agentstack.voostack.com/c/search)
- **Latest version:** 0.1.0
- **License:** MIT
- **Upstream author:** [lincwang123-bot](https://github.com/lincwang123-bot)
- **Source:** https://github.com/lincwang123-bot/x-ops-assistant

## Install

```sh
agentstack add skill-lincwang123-bot-x-ops-assistant-x-ops-assistant
```

Requires the [AgentStack CLI](https://agentstack.voostack.com/docs/cli). Works with Claude Code, Cursor, and any MCP-compatible agent.

## About

# X Ops Assistant

**Agent-agnostic** skill pack for any public X/Twitter account:

**diagnose visibility → audit history → analyze persona → plan content & recovery**  
**+ post autopsy · weekly scorecard · peer benchmark**  
**+ owner-first / suppressed-ops when public search is empty**  
**+ first-use: bare `@handle` → full detailed report (no menu)**  
**+ voice-mirror: learn tone/layout from recent posts; drafts match the account**

Not a growth-hack spam kit. Not bound to a single creator handle or a single agent product.

## First-use rule (HARD — do not skip)

When the user message is **primarily just a handle** (with or without `@`), treat it as **first-use / cold start** and **immediately run a full detailed report**. Do **not** ask “你想做什么 / which module?” first.

### What counts as “just a handle”

| Message (examples) | Action |
|--------------------|--------|
| `@someone` | → `first-report` (full detailed) |
| `someone` (clearly an X handle, no other task) | → `first-report` |
| `@someone 帮我看看` / `看看这个号` / `分析一下` (no narrower task) | → `first-report` |
| `@someone` + only emoji/noise | → `first-report` |

### What does **not** count (use normal router)

| Message | Task |
|---------|------|
| status URL / “改这条帖” | `post-autopsy` |
| “是不是 shadowban / 限流” only | `ban-check` (still thorough) |
| “周复盘 / scorecard” | `scorecard` |
| “对标 @a @b” | `peer-benchmark` |
| “只要 3 条成稿” | `content-plan` |
| Explicit `full-ops` / “全面报告” | `full-ops` (same depth as first-report) |

### First-report behavior

1. **Zero intake questions** if `@handle` is present. Default window **14d**.  
2. Run **Phase F expanded** (below) without waiting.  
3. Output one **long-form, structured** report in the **user’s language**.  
4. End with: “下次可直接说：限流复查 / 改帖+链接 / 周复盘 / 对标 @a @b / 只要成稿” — short menu **after** the report, not before.  
5. If profile is dead/suspended, report that and stop cleanly.  
6. If search empty + profile live → suppressed-ops; still complete the full report from profile samples.  
7. Drafts must be **paste-ready** (at least 3). Do not auto-publish.  
8. **Voice-mirror (HARD):** before any 成稿, read recent posts and write in **that account’s** tone, line breaks, emoji, punctuation, and habits — see `references/voice-mirror.md`. Do not paste generic AI-marketing voice.

**Done when:** every section of the first-report template is filled or marked `n/a` with reason.

## Audience & language

- **Skill instructions**: English (stable across agent hosts worldwide).
- **User-facing replies**: match the **user's language** (e.g. Simplified Chinese if they write Chinese).
- Keep handles, URLs, API fields, and commands in original form.
- **Host-neutral tools:** map the tool table below onto whatever the current agent provides (browser, web fetch, search, computer-use, optional API CLI). Do not refuse a task only because a host-specific tool name is missing—use the nearest equivalent.

## Data sources (read this paradox once)

**Paradox:** Ghost/search-suppressed accounts often **do not appear** in public `from:HANDLE` search — yet those are the accounts that need ops help.

| Use search for | Do not use search as |
|----------------|----------------------|
| **Evidence of suppression** (empty index) | The only library of posts for audits/drafts |

**Source priority:** profile URLs → status deep links → owner logged-in browser → public search (ban evidence) → checkers → minimal user-pasted links → **optional** owner `xurl` if already configured.  
**xurl / X API is opt-in only** — never block a task because it is missing. See `references/optional-xurl.md`.  
**Never** ask the user to “search yourself and upload what you find” as the primary path when profile still works.

Full rules: `references/data-sources.md` (load on ban-check, audit, scorecard, content-plan when search is thin).

### Suppressed-ops mode (hard rules)

Enter when `from:HANDLE` is empty/thin **and** profile or status URLs still work (or user reports shadow/ghost ban):

1. Record empty search as a **visibility signal**, not “no content.”  
2. Pull samples from **profile / with_replies / media**, owner session, or **optional** `xurl` timeline if configured.  
3. If still stuck, ask only for **1–3 status URLs** (or a screenshot) — smallest input.  
4. Tag every sample with `source: profile | status-url | owner-session | xurl? | user-paste | search`.  
5. Continue persona, autopsy, calendar, recovery as normal on those samples.  
6. If user wants API later, load `references/optional-xurl.md` — do not force setup mid-diagnosis.

## Module router (load only what you need)

Match the user request → set task id → load the linked file **before** deep work.

| User intent (examples) | Task id | Load |
|------------------------|---------|------|
| **Bare `@handle` / first use / 看看这个号** | `first-report` | **Phase F expanded** (full detailed; no questions first) |
| shadowban / ghost ban / 限流 / search missing | `ban-check` | Phase A + `references/shadowban-signals.md` |
| account health / history / 体检 | `audit` | Phase B |
| persona / voice / 人设 / pillars | `persona` | Phase C (+ local profile if any) |
| weekly posts / calendar / 成稿 | `content-plan` | Phase D |
| full report / 全面报告 / full-ops | `full-ops` | same depth as `first-report` |
| this post flopped / rewrite / status URL | `post-autopsy` | `references/modules/post-autopsy.md` |
| weekly review / 复盘 / scorecard | `scorecard` | `references/modules/scorecard.md` |
| 对标 / competitors / peers / learn from @a @b | `peer-benchmark` | `references/modules/peer-benchmark.md` |
| Analytics / notifications logged-in | `logged-in` | Phase E |

**Composition rules:**

- **`first-report` / bare `@handle`:** always full detailed report; never a one-line “what do you want?” reply.
- `full-ops` ≡ same deliverable as `first-report` (may add light scorecard snapshot).
- `peer-benchmark` → feed “one structure” into `content-plan` or next `scorecard` experiment.
- `post-autopsy` does **not** replace `ban-check`; if reach is account-wide broken, say so and offer Phase A.
- Always resolve `@handle` first (message → `local/account-profile.md` → one question only if truly missing). No global default handle.

```text
skill_view(name='x-ops-assistant', file_path='references/modules/post-autopsy.md')
skill_view(name='x-ops-assistant', file_path='references/modules/scorecard.md')
skill_view(name='x-ops-assistant', file_path='references/modules/peer-benchmark.md')
```

## Linked references (load on demand)

| File | When to load |
|------|----------------|
| `references/voice-mirror.md` | any drafts / persona / first-report / post-autopsy rewrites |
| `references/data-sources.md` | search empty, ghost/search ban, “where does data come from”, suppressed-ops |
| `references/optional-xurl.md` | user wants X API / xurl as an **optional** path; setup pointer |
| `references/shadowban-signals.md` | ban-check / visibility disputes |
| `references/report-templates.md` | core report output shapes |
| `references/account-profile.template.md` | durable local persona config |
| `references/persona-example.md` | teaching example only (fictional) |
| `references/modules/post-autopsy.md` | single-post diagnosis + 3 rewrites |
| `references/modules/scorecard.md` | weekly health scorecard |
| `references/modules/peer-benchmark.md` | 2–4 peer structure comparison |
| `references/oss-release.md` | open-source package, dual-tree, leak scan |
| `references/community-skill-patterns.md` | authoring notes for multi-operator community skills |

## Overview

| Module | Purpose |
|--------|---------|
| **A. Visibility** | Hard lock vs search ban vs ghost/thread ban vs reply deboost vs behavioral demotion |
| **B. Audit** | Profile, posting mix, engagement shape, risk flags |
| **C. Persona** | Identity / promise / voice / pillars / proof |
| **D. Ops** | Cadence, quality gates, weekly pack, recovery calendar |
| **E. Logged-in path** | Analytics / notifications via user's own browser session |
| **M1. Post autopsy** | One status → scores, layer hypothesis, 3 rewrites |
| **M2. Scorecard** | Weekly mix + visibility + health score + one experiment |
| **M3. Peer benchmark** | Target vs 2–4 peers → steal structures, not copy |

### Tool priority (stable → heavy)

| # | Tool | Use for |
|---|------|---------|
| 1 | Profile + status URLs via `browser_*` | Liveness + post samples **even when search is empty** |
| 2 | `x_search` | Ban evidence; healthy-account sampling (`from:HANDLE`) |
| 3 | Owner logged-in browser (Codex cookie import / user Chrome / `computer-use`) | Self timeline, notifications, Analytics UI in **suppressed-ops** |
| 4 | Third-party checkers | Supporting visibility flags only |
| 5 | User-pasted 1–3 status URLs / screenshots | Fallback only |
| 6 *(optional)* | `xurl` **only if user opted in and OAuth works** | Structured owner timeline / confirmed publish — see `references/optional-xurl.md` |

**Default path needs no X API.** Treat `xurl` as a user-facing option, not a prerequisite.

> **Platform note:** Distribution is multi-layer (search index, reply ranking, For You, following timeline, trust). “Ghost ban” is usually a **bundle of suppressions**, not one official switch. Third-party checkers are **supporting only** — always cross-check. **Empty search ≠ empty account.**

## When to Use

- **User sends only `@handle` / “看看这个号”** → always `first-report` (full detailed; no capability menu first)
- shadowban / ghost ban / limited reach / not searchable / replies invisible to others
- account health check, persona rebuild, positioning
- warm-up copy, weekly calendar, recovery plan, content pillars
- separate **policy lock** vs **silent demotion** vs **weak content**
- single-post autopsy, rewrites, “why did this flop”
- weekly scorecard / retrospective
- peer / competitor structure benchmark
- user has a logged-in browser session and wants ops readouts

**Don't use for:**

- pure automated post/like/delete plumbing (user posts manually by default; optional `xurl` only if opted in)
- bypassing platform security, credential stuffing, device farms
- mass follow/unfollow, engagement pods, bought reach
- promising “guaranteed unban” or fabricating evidence
- verbatim cloning of peer posts
- answering bare `@handle` with only a feature menu or multi-question intake
- writing drafts in generic AI/marketing voice instead of mirroring the account

## Local personalization (optional, per installer)

This skill ships **with zero personal defaults**.

If a user wants sticky preferences, they create a **local-only** file (gitignored if they fork):

```text
x-ops-assistant/local/account-profile.md
# or: /local/account-profile.md
```

Copy from `references/account-profile.template.md`. On load:

1. If `local/account-profile.md` exists → use it for intake defaults.
2. Else → **ask for `@handle`** (or use the handle named in the user message). Never invent a community-wide default account.

Do **not** commit real cookies, tokens, or private analytics into the skill tree.

### Community vs private install

When the user wants this skill **开源 / for the whole community** (not only their account):

1. Strip personal handles, products, and draft-path defaults from shipped `SKILL.md` / `references/`.
2. Keep operator-specific data only under `local/` (never in the public export).
3. Produce a **clean export tree** and run a leak scan — see `references/oss-release.md`.
4. Prefer **module router + `references/modules/*`** so agents load only the needed slice.
5. If agent `git commit` / `gh` is blocked by consent, still deliver the clean directory; user publishes.

---

## Phase 0 — Intake (≤30s)

Resolve without over-asking:

1. **Target `@handle`** — required (from message, local profile, or **one** question if missing)
2. **Task type**:
   - Message is **only / mainly `@handle`** → **`first-report`** (do not ask)
   - Else: `ban-check` | `audit` | `persona` | `content-plan` | `full-ops` | `post-autopsy` | `scorecard` | `peer-benchmark`
3. **Window**: `7d` | `14d` | `30d` (default **14d**)
4. **Logged-in needed?** public diagnosis → no; Analytics/notifications → yes
5. **Output language** — same as user

**Done when:** handle + task type are known. For bare `@handle`, task type is **always** `first-report`.

---

## Phase A — Visibility / ghost-ban diagnosis (multi-signal)

### A0. Vocabulary (use consistently)

| Label | User symptom | Common drivers |
|-------|--------------|----------------|
| **Suspended / Locked** | Login wall / restriction interstitial | Policy, reports, security lock |
| **Search ban** | Posts/handle missing from search | Spam patterns, short-link floods, sensitive flags, new-account heat |
| **Search suggestion ban** | Typeahead omits @handle | Cold start / low query volume (**high false positive** on checkers) |
| **Ghost / thread ban** | Replies look fine to self, missing for others in-thread | Reply spam, follow churn, automation, spam labels |
| **Reply deboost** | Replies pushed under “Show more replies” | Low trust, low-quality replies, reply farming |
| **Behavioral demotion** | Reach collapsed; checkers often green | Extreme volume, reciprocal-follow rings, pure promo, automation feel |

**Hard rules:**

1. First prove the account is not suspended/locked (**profile URL**, not search).
2. Prove content **exists** via **status URLs and/or profile posts** — `from:HANDLE` alone is insufficient and often false-negative under search ban.
3. Always inspect **Posts and Replies** (reply-heavy accounts look empty on Posts only).
4. Checkers are supporting — all-clear ≠ healthy distribution.
5. Separate **hard policy** from **behavioral demotion**.
6. Recovery: 48–72h cool-down, revoke shady third-party apps, slow spam cleanup, then **1–3 quality originals/day**. Appeal **only** for lock/suspend — not pure silent demotion.
7. If search is empty but profile/status live → enter **suppressed-ops** (`references/data-sources.md`); do not demand search-based uploads.

### A1. Evidence checklist (run in order)

Target `@HANDLE` (strip `@` → `HANDLE`):

**1) Public liveness (first — before search)**

```text
https://x.com/HANDLE
https://x.com/HANDLE/with_replies
```

Record: 404 / suspended / protected / ok; bio; join date; follower visibility.  
If profile lists recent posts, **capture 2–5 status URLs from the profile** even if search later fails.

**2) Content existence (do not rely on search alone)**

Preferred order:

1. Status URLs from profile DOM / pin / media  
2. Owner logged-in browser; **optional** `xurl` timeline only if already configured  
3. Then:

```text
x_search → from:HANDLE
```

- Hits → healthy search path; use samples freely  
- Empty + profile/status alive → **search suppression signal**; keep profile samples; enter suppressed-ops  
- Empty + profile dead → suspend/rename/protect/wrong handle  

Open 2–3 status URLs **logged-out**. Record visible / login-wall / missing.

**3) Search visibility (cross view) — evidence of ban, not the post library**

- Logged-out advanced search / exact phrase from a **known** post  
- If available: **warmed account view** vs **brand-new / logged-out view**  
- Searching **as yourself for yourself** → many false negatives  
- Document “search empty” explicitly in the evidence table  

**4) Third-party checkers (supporting only)**

Open in browser (never submit passwords into random tools if avoidable):

- `https://shadowban.yuzurisa.com/`
- `https://hisubway.online/shadowban/` (often `/HANDLE`)
- `https://opentweet.io/tools/shadowban-check`

Capture each flag. Do not close the case on checker alone.

**5) Behavioral surface (last 7d)**

Estimate from **profile/owner samples** (not from empty search):

- original / repost / reply ratio  
- reciprocal-follow language, mass @, short-link spam  
- new account + high heat  
- automation fingerprints (fixed templates, instant bursts)  

**6) Suppressed-ops handoff**

If mode triggered: load `references/data-sources.md`, state it in the

…

## Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

- **Author:** [lincwang123-bot](https://github.com/lincwang123-bot)
- **Source:** [lincwang123-bot/x-ops-assistant](https://github.com/lincwang123-bot/x-ops-assistant)
- **License:** MIT

Install and usage instructions live in the source repository linked above.

## Pricing

- **Free** — Free

## Security capabilities

Automated source analysis of v0.1.0 — what this tool can access:

- **Network access:** no
- **Filesystem access:** no
- **Shell / process execution:** no
- **Environment & secrets:** no
- **Dynamic code execution:** no

*"Yes" means the capability is present in the source — more access means more to trust, not that it is unsafe.*


## Versions

- **0.1.0** — security scan: passed — Imported from the upstream source.

## Links

- Listing page: https://agentstack.voostack.com/l/skill-lincwang123-bot-x-ops-assistant-x-ops-assistant
- Seller: https://agentstack.voostack.com/s/lincwang123-bot
- Browse the marketplace: https://agentstack.voostack.com/browse

---
Listed on AgentStack — the marketplace for AI agent skills and MCP servers. Every listing is security-reviewed. Creators keep 70%.
