{"id":"5d54b979-ba65-4236-8748-cf1f2f3b13b8","slug":"comment-floor","kind":"skill","name":"comment-floor","summary":"Agent skill: work your own post's comment section like a front desk. Capture every floor, prove completeness, sort scam/hostile/correction/question/request/praise, fold +1 echoes, answer once and pin.","owner":"fangdididi","repoUrl":"https://github.com/fangdididi/comment-floor","license":"MIT","licenseTier":"permissive","trust":"community","stars":0,"match":null,"fewStars":true,"format":"skill","createdAt":"2026-10-31T03:12:42.000Z","addedAt":"2026-11-01T02:17:33.777Z","logoUrl":"https://avatars.githubusercontent.com/u/42022630?v=4","linkOnly":false,"collection":null,"skillPath":null,"categories":["writing"],"tags":["comments","community-management","creator-tools","social-media"],"runtime":"binary","local":true,"cloudCapable":false,"cloudCapability":"unknown","cloudReadyOnPlatform":false,"needsApiKey":false,"reviewed":false,"syncedAt":"2026-11-01T02:38:35.822Z","sample":false,"url":"https://conduits.dev/tools/comment-floor","language":"Python","transports":["stdio"],"install":{},"requirements":{"env":[],"upstreamMayCharge":false},"tools":null,"readme":"**English** | [简体中文](README.zh-CN.md)\n\n# Comment Floor\n\n**A front-desk shift for the comment section of your own post: capture every floor, prove it's complete, answer each question once, and own your mistakes in public.**\n\nThe comments under a post that took off are the most honest feedback a creator gets, and the hardest to use. Replies hide in collapsed threads. The same question arrives twelve times in two languages. The one viewer who caught a real error is buried under \"+1\"s. A \"DM me for free presets\" scam sits there for days. And whatever gets answered is simply whatever happened to be on top.\n\nComment Floor is an agent skill that turns that pile into a short, repeatable routine:\n\n- **Floor card first.** One post, whose it is, the comment count the platform shows, the purpose of this pass, and the owner's reply voice and red lines.\n- **Gentle capture.** Official export, creator dashboard, the page's own requests in the owner's logged-in browser, or by hand, in that order. Human pace, and a hard stop at any captcha, login wall or rate limit.\n- **Completeness you can prove.** Captured vs shown, thread by thread: COMPLETE, NEAR, PARTIAL or THIN, with the exact floors still missing replies and warnings for looping pages, orphans and mixed-in posts.\n- **Six kinds plus echoes.** Scam, hostile, correction, question, request, praise. A reply that only says \"+1\" or \"同问\" is folded into the question above it as an extra voice.\n- **Four lanes in order.** Moderate, answer, consider, thank. Already-answered threads drop out. Look-alike questions (even across languages, via topic labels) become one group with total voices and likes, and the biggest becomes the pin candidate.\n- **Drafts, never auto-posts.** Replies drafted in the asker's language and the owner's voice; the owner posts. Plus a corrections ledger and a seeds list for the next post.\n\n## Features\n\n| | |\n|---|---|\n| Any capture shape | `ingest --map` maps any JSON / JSONL / `{\"comments\": [...], \"replies\": [...]}` onto one record, dotted paths for nested fields |\n| Completeness verdict | shown-count or per-thread basis, thread gaps ranked by missing replies, PAGE_REPEAT / ORPHANS / OVERCOUNT / EMPTY_TEXT warnings |\n| Bilingual rules | English and Chinese patterns for scam bait, insults, corrections, questions, requests, praise and echoes |\n| Your labels win | `labels.json` overrides any kind and can add a topic to force grouping |\n| \"Answered\" logic | a creator reply later in the same thread marks earlier comments as handled |\n| Scoring | kind weight × log of likes (echo likes included) + echo voices + a recency bump |\n| Pin candidate | top answer group with ≥ 3 voices or ≥ 50 likes |\n| Markdown floor | verdict, queue and the whole floor sorted by likes with replies indented |\n| Zero dependencies | Python 3.8+, standard library only, no network calls; 63 tests |\n\n## Install\n\nThe skill is a folder with `SKILL.md` at its root. Clone it where your agent looks for skills:\n\n```sh\n# Claude Code (personal)\ngit clone https://github.com/fangdididi/comment-floor ~/.claude/skills/comment-floor\n# Claude Code (one project)\ngit clone https://github.com/fangdididi/comment-floor .claude/skills/comment-floor\n# Codex CLI\ngit clone https://github.com/fangdididi/comment-floor ~/.codex/skills/comment-floor\n# Cursor and other agents: put the folder in your rules/skills directory,\n# or point the agent at SKILL.md (English) or SKILL.zh-CN.md (Chinese).\n```\n\nIf the target folder already exists, look inside before overwriting it.\n\n## Usage\n\nAsk in plain words:\n\n```text\nGo through the comments on https://www.douyin.com/video/7xxxxxxxx and tell me what to reply to first.\n帮我值一次班：这条小红书笔记下面的评论，先清广告，再告诉我该置顶什么。\n```\n\nOr run the helper yourself:\n\n```sh\npython3 scripts/floor.py ingest raw.json floor.jsonl --map \"id=cid,text=content,likes=digg,time=ts,author=user.nick,reply_total=reply_n,parent=reply_to\" --creator my_handle\npython3 scripts/floor.py check  floor.jsonl --shown 312        # exit 0 = COMPLETE or NEAR\npython3 scripts/floor.py sort   floor.jsonl > kinds.tsv         # read it, fix misfires in labels.json\npython3 scripts/floor.py queue  floor.jsonl --labels labels.json\npython3 scripts/floor.py render floor.jsonl --shown 312 --labels labels.json > floor.md\npython3 -m unittest discover -s tests                          # run the tests\n```\n\nNormalised record (JSONL, one comment per line):\n\n```json\n{\"id\": \"r1b\", \"parent\": \"c1\", \"text\": \"+1 what camera?\", \"likes\": 12, \"time\": \"2026-10-30T05:30:00Z\",\n \"author\": \"nn_93\", \"reply_total\": 0, \"by_creator\": false, \"pinned\": false}\n```\n\n## Example\n\nA photography tip video showing 12 comments (all files in `examples/`):\n\n```text\nVerdict: NEAR. Captured 11 (top-level 7, replies 4), coverage 91.7% by shown count.\n- Threads still missing replies: c1 (2/3), c5 (1/2)\n\nPin candidate: one answer covers 5 voices / 648 likes, e.g. \"Which camera did you use for the overhead shots?\".\n\nModerate first\n- [scam] Free editing presets, add me on whatsapp for the pack · 2 likes · c4\nAnswer (grouped, unanswered only)\n- [question] Which camera did you use for the overhead shots? · 648 likes · 5 voices · c1, c2, c7\nConsider (requests)\n- Please make a part 2 on colour grading · 150 likes · c5\n```\n\nThe correction about the rule of thirds already has a creator reply, so it leaves the queue and goes into the corrections ledger instead.\n\n## Boundaries\n\n- Your own posts, or a client's with written permission. Public posts that aren't yours: read-only, no drafts aimed at people, no moderation lane.\n- One post at a time, at a human pace. No signature forging, account rotation or captcha solving.\n- The agent drafts; the owner posts, pins, hides and reports, unless they explicitly ask the agent to do a specific action.\n- Folded, deleted and author-only comments are usually invisible to everyone else; NEAR is often the honest ceiling.\n\n## File structure\n\n```text\ncomment-floor/\n├── SKILL.md              # the skill (English)\n├── SKILL.zh-CN.md        # the skill (Chinese)\n├── README.md\n├── README.zh-CN.md\n├── LICENSE               # MIT\n├── scripts/\n│   └── floor.py          # ingest / check / sort / queue / render\n├── tests/\n│   └── test_floor.py     # 63 tests\n└── examples/\n    ├── raw_capture.json  # a raw capture in a platform-like shape\n    ├── comments.jsonl    # normalised floor with replies\n    ├── labels.json       # topic labels grouping three camera questions\n    └── floor.md          # rendered output\n```\n\n## License\n\nMIT © fangdididi\n"}