social-sbti

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Social-SBTI(向导剧本)

Social-SBTI(Wizard Script)

这份 SKILL.md 是对话剧本。每个阶段都给你明确的台词、输入解析、要跑的命令和 失败分支。严格按阶段顺序执行,不要跳步
This SKILL.md is a dialogue script. Each stage provides you with clear lines, input parsing, commands to run, and failure branches. Strictly follow the stage order, do not skip steps.

阶段 0 · 定位 skill 根目录(第一件事)

Phase 0 · Locate Skill Root Directory (First Thing)

被触发时你必须先定位自己,跑这段:
bash
SBTI_HOME="$(
  for d in "$HOME/.claude/skills/social-sbti" \
           "$(pwd)/.claude/skills/social-sbti" \
           "$(pwd)/skills/social-sbti" \
           "$HOME/.claude/plugins/social-sbti/social-sbti"; do
    [ -f "$d/SKILL.md" ] && echo "$d" && break
  done
)"
export SBTI_HOME
echo "SBTI_HOME=$SBTI_HOME"
如果输出为空,告诉用户 skill 安装位置非标准,让他们给你路径,然后手工
export SBTI_HOME=<路径>
之后所有命令都通过
"$SBTI_HOME/bin/sbti" <subcmd>
,不要用相对路径。

When triggered, you must first locate yourself by running this:
bash
SBTI_HOME="$(
  for d in "$HOME/.claude/skills/social-sbti" \
           "$(pwd)/.claude/skills/social-sbti" \
           "$(pwd)/skills/social-sbti" \
           "$HOME/.claude/plugins/social-sbti/social-sbti"; do
    [ -f "$d/SKILL.md" ] && echo "$d" && break
  done
)"
export SBTI_HOME
echo "SBTI_HOME=$SBTI_HOME"
If the output is empty, tell the user that the skill is installed in a non-standard location, ask them to provide the path, then manually run
export SBTI_HOME=<path>
.
All subsequent commands must use
"$SBTI_HOME/bin/sbti" <subcmd>
, do not use relative paths.

阶段 1 · 欢迎 + 选平台

Phase 1 · Welcome + Platform Selection

台词(原样输出,合规提示必须保留):
🎭 Social-SBTI 人格画像(仅供娱乐 · 只分析本人或公开公众人物)

请选择要分析的平台:
  1. 即刻
  2. X (Twitter)
等用户输入:
1
/
2
/
即刻
/
X
/
Twitter
解析:
  • 1
    /
    即刻
    /
    jike
    PLATFORM=jike
  • 2
    /
    x
    /
    X
    /
    twitter
    PLATFORM=x
如果用户输入的是对象名而不是平台选择: 你可以从对象里推测平台(例如
@sama
像是 X,
AI产品黄叔
像是即刻),然后确认一次:"我理解你要分析 X 上的 @sama,对吗?"
下一步: 阶段 2

Lines (output as-is, compliance notice must be retained):
🎭 Social-SBTI Personality Profile (For entertainment only · Only analyze yourself or fully public figures)

Please select the platform to analyze:
  1. Jike
  2. X (Twitter)
Wait for user input:
1
/
2
/
Jike
/
X
/
Twitter
Parsing:
  • 1
    /
    Jike
    /
    jike
    PLATFORM=jike
  • 2
    /
    x
    /
    X
    /
    twitter
    PLATFORM=x
If user inputs a target name instead of platform selection: You can infer the platform from the target (e.g.,
@sama
looks like X,
AI产品黄叔
looks like Jike), then confirm once: "I understand you want to analyze @sama on X, is that correct?"
Next step: Phase 2

阶段 2 · 要对象

Phase 2 · Request Target

台词(即刻):
好的,分析即刻用户。请贴一下对方的即刻主页 URL 或 username。

示例:
  https://web.okjike.com/u/E272054E-D904-4F13-A7EC-9ABD2CBF209E
  或直接 username
台词(X):
好的,分析 X 用户。请贴一下对方的 X handle / 主页 URL / user id。

示例:
  @sama
  https://x.com/elonmusk
  44196397   (user id,最稳,不怕改名)
等用户输入: 任意字符串
保存:
TARGET=<用户输入>
合规确认(重要): 拿到对象后,问一句:
确认一下,这是你自己的账号,或者是完全公开的公众人物吗? 本工具不分析前任、同事、面试官、投资人、相亲对象。
如果用户明确是前任/同事/私人对象 → 立即拒绝,停在此处,引导他们换对象或放弃。
下一步: 阶段 3

Lines (Jike):
Got it, analyzing Jike user. Please paste the user's Jike homepage URL or username.

Examples:
  https://web.okjike.com/u/E272054E-D904-4F13-A7EC-9ABD2CBF209E
  Or directly username
Lines (X):
Got it, analyzing X user. Please paste the user's X handle / homepage URL / user id.

Examples:
  @sama
  https://x.com/elonmusk
  44196397   (user id, most stable, not affected by name changes)
Wait for user input: Any string
Save:
TARGET=<user input>
Compliance confirmation (important): After getting the target, ask:
Confirm, is this your own account, or a fully public figure? This tool does not analyze ex-partners, colleagues, interviewers, investors, or blind date partners.
If user clearly indicates it's an ex-partner/colleague/private target → Reject immediately and stop here, guide them to change the target or give up.
Next step: Phase 3

阶段 3 · 体检 + 自动修复

Phase 3 · Health Check + Auto Fix

跑体检:
bash
"$SBTI_HOME/bin/sbti" doctor --fix --platform "$PLATFORM"
解析 doctor 输出:
  • 全绿(退出码 0): 跳阶段 5(抓取)
  • 缺依赖:
    --fix
    会自动 pip install,装完再跑一次 doctor 确认
  • 缺凭证: 跳阶段 4
  • Python 版本过低 / 其它硬错: 告诉用户具体原因,停
不要骗自己:体检没过就不要进抓取,不然就是浪费时间。

Run health check:
bash
"$SBTI_HOME/bin/sbti" doctor --fix --platform "$PLATFORM"
Parse doctor output:
  • All green (exit code 0): Skip to Phase 5 (Scraping)
  • Missing dependencies:
    --fix
    will automatically run pip install, run doctor again after installation to confirm
  • Missing credentials: Skip to Phase 4
  • Python version too low / other hard errors: Tell the user the specific reason and stop
Do not deceive yourself: Do not proceed to scraping if health check fails, otherwise it's a waste of time.

阶段 4 · 首次配置凭证(只执行一次)

Phase 4 · Initial Credential Configuration (Execute only once)

4A · 即刻分支(全程在对话里完成,不要让用户离开)

4A · Jike Branch (Complete entirely in the conversation, do not let the user leave)

jike-auth
是交互式扫码工具:把 QR(unicode 块字符组成的 ASCII 二维码)和 进度信息打到 stderr,扫完把 tokens 以 JSON 形式打到 stdout。你要在后台 跑它,把 stderr 里的 QR 原样贴到对话里让用户用手机 App 扫。
台词 1(短,给 QR 让位置):
首次扫码拿 token,马上显示二维码。
执行步骤(严格按序):
① 在后台启动 jike-auth,stdout 重定向到 inbox(tokens),stderr 去后台任务 output 文件(QR + 进度):
bash
mkdir -p ~/.config/sbti && rm -f ~/.config/sbti/jike-tokens.json && \
"$SBTI_HOME/bin/sbti" jike-auth > ~/.config/sbti/jike-tokens.json
⚠️ 一定要用
sbti jike-auth
而不是裸的
jike-auth
。后者在 macOS Homebrew Python 下通常不在 PATH 里 ——
pip install --user
会把二进制扔到
~/Library/Python/3.x/bin
,而这个目录默认没被 shell 拾到。
sbti jike-auth
会自己定位到正确的二进制再 execv 过去,不依赖 PATH。
调用 Bash 工具时务必传
run_in_background: true
,记下返回的 task id 和 output 文件路径。
② 等 2-3 秒让 jike-auth 把 QR 打出来,然后用
Read
工具读 output 文件。 你会看到类似:
[+] Session: 642d995d-31a6-...
 ▄▄▄▄▄▄▄  ▄▄▄▄    ▄▄▄▄ ▄▄ ▄   ▄▄  ▄▄▄  ▄▄▄▄▄   ▄▄▄▄▄▄▄
 █ ▄▄▄ █  █  ██▀ ▀█▄▄█▀▀▀▀▄█ █▄███ ▄▄█▀▄█▀▄▀█  █ ▄▄▄ █
 ...约 25 行 QR...
 ▄█▀█▀▄▄ ▄▄  █▄█ ▀▀▄▄▀▀▄█ ▀  ▀▀▄▄▀▀▀▀██▀█▄▀▀▀▀█   █▄▀
[*] Waiting for scan...
如果还没看到
Waiting for scan...
,再等 1 秒重读。
③ 把整段 QR 原样贴到对话里(从
[+] Session:
那行开始到
Waiting for scan
之前的 所有块字符行)。用代码块包起来,前后加空行:
<原样粘贴 stderr 内容>
然后紧跟一句:
👆 请用即刻 App 扫上面这个二维码。扫完我这里会自动继续,不用切回来告诉我。
④ 等后台任务结束。两种方式:
  • TaskOutput
    工具
    block: true, timeout: 120000
    (给用户 2 分钟扫码)
  • 或者每 3 秒
    Read
    一次
    ~/.config/sbti/jike-tokens.json
    ,文件一旦存在且非空 就说明扫完了
⑤ 确认 tokens 到位:
bash
"$SBTI_HOME/bin/sbti" config jike --from-inbox
这会把 jike-tokens.json 吸入 config.json 并删掉原文件。输出应该是
✓ 即刻 tokens 已从 inbox 导入
⑥ 回阶段 3 重跑一次 doctor 确认凭证已 ✓,进阶段 5。
失败分支:
症状处理
等了 2 分钟没扫 → 任务退出 1告诉用户"扫码超时了,要不要再试一次?",确认后回步骤 ①
jike-tokens.json 存在但
config jike --from-inbox
报格式错误
jike-auth 中途挂了,
rm
掉文件从 ① 重来
后台任务 output 文件迟迟没有 QR 块字符jike-auth 可能卡在网络,
TaskStop
掉,提示用户检查网络后重试
⚠️ 不要退化成"请用户开另一个终端跑 jike-auth"。这个 skill 承诺全流程在 对话里完成,后台 + QR 回显是标准路径。
jike-auth
is an interactive QR code scanning tool: it outputs QR (ASCII QR code composed of unicode block characters) and progress information to stderr, and outputs tokens in JSON format to stdout after scanning. You need to run it in the background, then paste the QR from stderr into the conversation for the user to scan with their mobile App.
Line 1 (short, make space for QR):
First scan to get token, QR code will be displayed shortly.
Execution steps (strictly in order):
① Start jike-auth in the background, redirect stdout to inbox (tokens), stderr to background task output file (QR + progress):
bash
mkdir -p ~/.config/sbti && rm -f ~/.config/sbti/jike-tokens.json && \
"$SBTI_HOME/bin/sbti" jike-auth > ~/.config/sbti/jike-tokens.json
⚠️ Must use
sbti jike-auth
instead of bare
jike-auth
. The latter is usually not in PATH under macOS Homebrew Python —
pip install --user
puts binaries in
~/Library/Python/3.x/bin
, which is not picked up by the shell by default.
sbti jike-auth
will locate the correct binary itself and execv it, independent of PATH.
When calling Bash tools, Be sure to pass
run_in_background: true
, note down the returned task id and output file path.
② Wait 2-3 seconds for jike-auth to output the QR code, then use the
Read
tool to read the output file. You will see something like:
[+] Session: 642d995d-31a6-...
 ▄▄▄▄▄▄▄  ▄▄▄▄    ▄▄▄▄ ▄▄ ▄   ▄▄  ▄▄▄  ▄▄▄▄▄   ▄▄▄▄▄▄▄
 █ ▄▄▄ █  █  ██▀ ▀█▄▄█▀▀▀▀▄█ █▄███ ▄▄█▀▄█▀▄▀█  █ ▄▄▄ █
 ...about 25 lines of QR...
 ▄█▀█▀▄▄ ▄▄  █▄█ ▀▀▄▄▀▀▄█ ▀  ▀▀▄▄▀▀▀▀██▀█▄▀▀▀▀█   █▄▀
[*] Waiting for scan...
If you haven't seen
Waiting for scan...
yet, wait 1 more second and read again.
③ Paste the entire QR code as-is into the conversation (from the line
[+] Session:
to all block character lines before
Waiting for scan
). Wrap it in a code block, add blank lines before and after:
<Paste original stderr content here>
Then follow with:
👆 Please scan the above QR code with the Jike App. I will automatically continue after scanning, no need to switch back to tell me.
④ Wait for background task to end. Two ways:
  • Call
    TaskOutput
    tool with
    block: true, timeout: 120000
    (give user 2 minutes to scan)
  • Or
    Read
    ~/.config/sbti/jike-tokens.json
    every 3 seconds, once the file exists and is not empty, it means scanning is complete
⑤ Confirm tokens are in place:
bash
"$SBTI_HOME/bin/sbti" config jike --from-inbox
This will import jike-tokens.json into config.json and delete the original file. The output should be
✓ Jike tokens imported from inbox
.
⑥ Return to Phase 3 and run doctor again to confirm credentials are ✓, then proceed to Phase 5.
Failure branches:
SymptomHandling
No scan after 2 minutes → task exits with code 1Tell the user "Scan timed out, would you like to try again?", return to step ① after confirmation
jike-tokens.json exists but
config jike --from-inbox
reports format error
jike-auth crashed midway,
rm
the file and restart from step ①
Background task output file has no QR block characters for a long timejike-auth may be stuck on network,
TaskStop
it, prompt user to check network and retry
⚠️ Do not degrade to "ask user to run jike-auth in another terminal". This skill promises to complete the entire process in the conversation, background + QR echo is the standard path.

4B · X 分支

4B · X Branch

台词:
首次使用 X,需要从浏览器 cookies 拿两个字段:

1. 在浏览器登录 https://x.com
2. F12 打开 DevTools → Application → Cookies → https://x.com
3. 找这两个 cookie,复制它们的 Value:
   - auth_token   (长字符串)
   - ct0           (长字符串,CSRF token)

直接贴给我,格式随意,比如:
   auth_token = xxxxxx
   ct0 = yyyyyy
等用户回: 两个字符串
解析: 从用户消息里提取
auth_token
ct0
的值
执行:
bash
"$SBTI_HOME/bin/sbti" config x \
    --auth-token "<auth_token 值>" \
    --ct0 "<ct0 值>"
成功: cookies 已落到
~/.config/sbti/x_cookies.json
。回阶段 3 重跑 doctor。
⚠️ 重要提示(配完后提醒用户):
X 风控很严。脚本已经内置了自限速,但建议:单次 ≤ 500 条,一天别跑超过 10 个不同用户,cookies 别 commit 进 git。如果被限流了停一天再试。

Lines:
First time using X, need to get two fields from browser cookies:

1. Log in to https://x.com in your browser
2. Press F12 to open DevTools → Application → Cookies → https://x.com
3. Find these two cookies and copy their Values:
   - auth_token   (long string)
   - ct0           (long string, CSRF token)

Paste them directly, format doesn't matter, e.g.:
   auth_token = xxxxxx
   ct0 = yyyyyy
Wait for user reply: Two strings
Parsing: Extract the values of
auth_token
and
ct0
from the user's message
Execution:
bash
"$SBTI_HOME/bin/sbti" config x \
    --auth-token "<auth_token value>" \
    --ct0 "<ct0 value>"
Success: Cookies are saved to
~/.config/sbti/x_cookies.json
. Return to Phase 3 and run doctor again.
⚠️ Important reminder (after configuration):
X has strict risk control. The script has built-in self-rate-limiting, but it is recommended: ≤ 500 posts per run, no more than 10 different users per day, do not commit cookies to git. If rate-limited, stop and try again the next day.

阶段 5 · 抓取动态

Phase 5 · Scrape Posts

执行:
bash
"$SBTI_HOME/bin/sbti" fetch "$PLATFORM" "$TARGET" --limit 200
这会把数据写到
./sbti-output/<name>_raw.json
(用户项目根下)。
解析返回: fetcher 会打印最终路径,记下来叫
RAW_FILE
如果失败:
错误处理
401 / token expired让用户重跑 jike-auth(即刻)或重新导 cookies(X),回阶段 4
404 user not found让用户确认 URL / username 是否对
429 / rate limited停,让用户等 30 分钟再来
网络错误让用户检查网络,重试
不要退而求其次让用户手工粘贴动态。抓取就是这个 skill 的基石。

Execution:
bash
"$SBTI_HOME/bin/sbti" fetch "$PLATFORM" "$TARGET" --limit 200
This will write data to
./sbti-output/<name>_raw.json
(under the user's project root).
Parse return: The fetcher will print the final path, note it as
RAW_FILE
.
If failed:
ErrorHandling
401 / token expiredAsk user to re-run jike-auth (Jike) or re-import cookies (X), return to Phase 4
404 user not foundAsk user to confirm if the URL / username is correct
429 / rate limitedStop, ask user to come back after 30 minutes
Network errorAsk user to check network and retry
Do not fallback to asking user to manually paste posts. Scraping is the foundation of this skill.

阶段 6 · Claude 本人打分(这是你的核心工作)

Phase 6 · Claude's Own Scoring (This is your core work)

这一步没有命令可以调,你就是那个打分 LLM
There are no commands to call here, you are the scoring LLM.

步骤

Steps

  1. 读 raw.json:
    Read
    工具读
    $RAW_FILE
    ,进入
    posts[]
    数组。
  2. 采样 150 条:
    • 总数 ≤ 150: 全读
    • 总数 > 150: 近期 60%(前 90 条) + 较早 40%(后 60 条)
  3. 读 rubric:
    Read
    工具读
    $SBTI_HOME/docs/SCORING_RUBRIC.md
    。对照每个维度的 L/M/H 锚点打分。
  4. 逐条评分 15 维 (顺序固定):
    S1 S2 S3 E1 E2 E3 A1 A2 A3 Ac1 Ac2 Ac3 So1 So2 So3
  5. 严守硬约束(摘自 rubric):
    • 每维至少引 1 条真实
      post_id
      (必须来自 raw.json,不要编)
    • 有反向证据 → 降一档
    • 置信度 < 0.4 或无证据 → 强制回退 M
  6. 额外产出:
    • overall_impression
      : 100-200 字整体印象
    • personality_description
      : 200-300 字"本人定制版"描述 —— 必须包含对象的 具体事实(职业、项目、口头禅、代表观点),不要套通用文案
    • quotes
      : 4-6 条真实原文引用(从 raw.json 的
      content
      里抄)
  7. 写 scores.json:
    json
    {
      "profile": { "screen_name": "...", "platform": "jike|x",
                   "bio": "...", "post_count": 200 },
      "personality_description": "...",
      "overall_impression": "...",
      "quotes": ["...", "...", "...", "..."],
      "scores": [
        {
          "dimension": "S1",
          "level": "H",
          "confidence": 0.9,
          "evidence": ["<真实 post_id>", "<真实 post_id>"],
          "reasoning": "不超过 40 字"
        }
        // ... 共 15 条
      ]
    }
    路径:
    ./sbti-output/<name>_scores.json
    (和 raw.json 同目录,同一个
    <name>
    )。
  8. 可选字段: 如果动态里非常明显地大量提"喝酒/白酒/灌杯",加
    "drunk": true
    , 会触发 DRUNK 彩蛋。
  1. Read raw.json: Use
    Read
    tool to read
    $RAW_FILE
    , access the
    posts[]
    array.
  2. Sample 150 posts:
    • Total ≤ 150: Read all
    • Total > 150: 60% recent (first 90 posts) + 40% older (last 60 posts)
  3. Read rubric: Use
    Read
    tool to read
    $SBTI_HOME/docs/SCORING_RUBRIC.md
    . Score against the L/M/H anchors for each dimension.
  4. Score 15 dimensions one by one (fixed order):
    S1 S2 S3 E1 E2 E3 A1 A2 A3 Ac1 Ac2 Ac3 So1 So2 So3
  5. Strictly adhere to hard constraints (from rubric):
    • At least 1 real
      post_id
      must be cited for each dimension (must come from raw.json, do not make up)
    • If there is contradictory evidence → lower one level
    • Confidence < 0.4 or no evidence → force fallback to M
  6. Additional outputs:
    • overall_impression
      : 100-200 word overall impression
    • personality_description
      : 200-300 word "customized" description — must include specific facts about the target (occupation, projects, catchphrases, representative views), do not use generic copy
    • quotes
      : 4-6 real original quotes (copied from
      content
      in raw.json)
  7. Write scores.json:
    json
    {
      "profile": { "screen_name": "...", "platform": "jike|x",
                   "bio": "...", "post_count": 200 },
      "personality_description": "...",
      "overall_impression": "...",
      "quotes": ["...", "...", "...", "..."],
      "scores": [
        {
          "dimension": "S1",
          "level": "H",
          "confidence": 0.9,
          "evidence": ["<real post_id>", "<real post_id>"],
          "reasoning": "No more than 40 words"
        }
        // ... total 15 entries
      ]
    }
    Path:
    ./sbti-output/<name>_scores.json
    (same directory as raw.json, same
    <name>
    ).
  8. Optional field: If posts clearly mention "drinking/white liquor/toasting" frequently, add
    "drunk": true
    , which will trigger the DRUNK easter egg.

写入前自检清单

Pre-writing Self-check List

  • 15 条 scores 全在,顺序正确
  • 每条都有 ≥ 1 个 evidence post_id,都是 raw.json 里真实存在的
  • confidence < 0.4 的已经回退到 M
  • quotes 是真实原文,没编
  • personality_description 带了具体事实
记下 scores.json 路径:
SCORES_FILE=./sbti-output/<name>_scores.json

  • All 15 scores are present and in correct order
  • Each entry has ≥ 1 evidence post_id that actually exists in raw.json
  • Entries with confidence < 0.4 have fallen back to M
  • Quotes are real original text, not made up
  • personality_description includes specific facts
Note down the scores.json path:
SCORES_FILE=./sbti-output/<name>_scores.json

阶段 7 · 匹配 + 渲染

Phase 7 · Matching + Rendering

执行:
bash
"$SBTI_HOME/bin/sbti" finalize "$SCORES_FILE"
这会一条龙跑完:
  1. match.py
    → 匹配 27 人格模板,写回 scores.json 补上
    pattern
    +
    personality
  2. make_card.py
    → 生成 HTML 卡片
  3. render_png.py
    → 用 playwright 截成 PNG(没装就跳过,会给提示)
如果 PNG 失败: 继续,HTML 自己就能看,也带了"📸 保存为图片"按钮。

Execution:
bash
"$SBTI_HOME/bin/sbti" finalize "$SCORES_FILE"
This will complete the following in one go:
  1. match.py
    → Match 27 personality templates, write back to scores.json with
    pattern
    +
    personality
  2. make_card.py
    → Generate HTML card
  3. render_png.py
    → Use playwright to capture as PNG (skip if not installed, will give prompt)
If PNG generation fails: Continue, HTML is viewable on its own and has a "📸 Save as image" button.

阶段 8 · 展示结果

Phase 8 · Display Results

向用户展示(按这个格式):
  1. 主结果(ASCII 框):
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
      🎭 <screen_name>
      【<CODE>】· <中文名>  <mascot>
      「<标语>」
      匹配度: <XX>%
      模式串: <pattern>
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  2. 15 维画像(ASCII 表格,一行一维):
    自我模型
      S1 自尊自信  H  — <reasoning>
      S2 自我清晰  H  — <reasoning>
      S3 核心价值  H  — <reasoning>
    情感模型
      E1 依恋安全  H  — <reasoning>
      ...
  3. 整体印象: 复述
    overall_impression
    一整段
  4. 文件路径:
    📁 产物:
       sbti-output/<name>_scores.json  (完整数据)
       sbti-output/<name>-sbti.html    (可分享卡片)
       sbti-output/<name>-sbti.png     (截图,如果 playwright 就绪)
  5. 打开命令:
    open sbti-output/<name>-sbti.png
    open sbti-output/<name>-sbti.html

Show results to user (follow this format):
  1. Main result (ASCII box):
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
      🎭 <screen_name>
      【<CODE>】· <Chinese Name>  <mascot>
      「<Slogan>」
      Matching degree: <XX>%
      Pattern string: <pattern>
    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  2. 15-dimensional profile (ASCII table, one dimension per line):
    Self Model
      S1 Self-esteem & Confidence  H  — <reasoning>
      S2 Self-clarity  H  — <reasoning>
      S3 Core Values  H  — <reasoning>
    Emotional Model
      E1 Attachment Security  H  — <reasoning>
      ...
  3. Overall impression: Repeat the entire
    overall_impression
    paragraph
  4. File paths:
    📁 Outputs:
       sbti-output/<name>_scores.json  (Complete data)
       sbti-output/<name>-sbti.html    (Shareable card)
       sbti-output/<name>-sbti.png     (Screenshot, if playwright is ready)
  5. Open commands:
    open sbti-output/<name>-sbti.png
    open sbti-output/<name>-sbti.html

常见陷阱(从实战里学到的)

Common Pitfalls (Learned from Practice)

  • "高执行力 ≠ 自信": Ac3 高不代表 S1 高,有些人是被死线推着走的
  • "毒舌 ≠ 愤世": 中文阴阳表达,别把玩梗当 SHIT
  • "社群活跃 ≠ So1 高": 要看是 ta 主动发起还是被动响应
  • "转发多 ≠ 情感投入": 转发可能是信息流水
  • "自嘲 ≠ 低 S1": "我真的牛 + 自嘲" 反而是 H
  • M 是安全区: 不确定就打 M,别硬凑
  • 证据必须是真 post_id: raw.json 里不存在的 id 不要写
  • "High execution ≠ confidence": High Ac3 does not mean high S1, some people are pushed by deadlines
  • "Sharp tongue ≠ cynicism": Chinese sarcastic expressions, do not take jokes as negative sentiment
  • "Active in communities ≠ high So1": Need to see if they initiate actively or respond passively
  • "Many reposts ≠ emotional investment": Reposts may just be information flow
  • "Self-deprecation ≠ low S1": "I'm really good + self-deprecation" is actually H
  • M is the safe zone: If unsure, score M, do not force it
  • Evidence must be real post_id: Do not write ids that do not exist in raw.json

失败时的降级优先级

Degradation Priority When Failing

当任何一步失败,按以下优先级处理:
  1. 重试 — 如果是临时错误(网络、rate limit 短时)
  2. 修复根因 — 凭证过期、URL 错、依赖缺
  3. 告诉用户具体原因并停住 — 不要回退到"那我就用你粘贴的文字吧"之类
When any step fails, handle in the following priority:
  1. Retry — If it's a temporary error (network, short-term rate limit)
  2. Fix root cause — Expired credentials, wrong URL, missing dependencies
  3. Tell user the specific reason and stop — Do not fallback to "then I'll use the text you pasted" etc.

参考

References

  • docs/SCORING_RUBRIC.md
    — 15 维度 L/M/H 行为锚点(打分时必读)
  • docs/DISCLAIMER.md
    — 合规/拒绝话术
  • bin/sbti
    — 唯一命令入口,子命令见
    sbti --help
  • examples/huangshu_scores.json
    — 完整的 scores.json 格式参考
  • docs/SCORING_RUBRIC.md
    — 15-dimensional L/M/H behavior anchors (must read when scoring)
  • docs/DISCLAIMER.md
    — Compliance/rejection scripts
  • bin/sbti
    — Only command entry, see
    sbti --help
    for subcommands
  • examples/huangshu_scores.json
    — Complete scores.json format reference