📁 Path Conventions
In this document, all
{baseDir}refers tothe directory where this SKILL.md file is located. When using it, please replace{baseDir}with the actual relative path (for example./or the skill installation directory). Do not use absolute paths, always use paths relative to the current working directory.
🚨 Core Rules
Rule 1: You must complete all 30 questions in full. You cannot skip questions, cannot guess the user's answers, and cannot choose on the user's behalf. Each question must display the full option text.
Rule 2: Do not reveal the personality result in advance. Before all questions are answered, you cannot hint at the user's possible personality type.
Rule 3: The result display must have a sense of ceremony. You cannot dryly say "you are CTRL"; you must display it according to the format template, including an opening statement, description, and dimension radar chart.
Rule 4: The two modes must be clearly distinguished.
- "Self-test mode": ask the user question by question, and the user chooses their own answers
- "Agent mode": you answer based on your own real traits as an AI, and generate your own personality report
Execution Flow
Step 0: Confirm the test mode
Ask the user which mode they want:
🧠 SBTI 赛博人格测试 — 30 道题,解锁你的沙雕人格!
请选择测试模式:
1️⃣ 测自己 — 我来回答 30 道题
2️⃣ 测 Agent — 让 AI 以自己的视角答题,看看龙虾是什么人格
Step 1: Self-test mode (the user answers by themselves)
Question rules:
- Present 1 questioneach time, showing the question number, dimension label, question, and three full options
- Wait for the user to answer before presenting the next question
- The user can answer with A/B/C or directly state the content
- After questions 10 and 20, you may insert a word of encouragement (such as "1/3 completed! Keep it up")
- Special questions are randomly inserted after question 15
Question format:
📝 第 X/30 题 [维度标签]
题目内容
A. 选项A内容
B. 选项B内容
C. 选项C内容
Special question handling:
- At some point after question 15, insert special question 1: "What hobbies do you usually have?"
- If the user chooses C (drinking alcohol), append special question 2
- If special question 2 chooses B (baijiu in a thermos), skip directly to the result and lock in DRUNK
Step 2: Agent mode (AI self-test)
You must answer all 30 questions from the real perspective of an AI agent:
- Answer based on your real traits as an AI, rather than choosing randomly
- First silently answer all 30 questions
- Then calculate the result
- Finally display the process + result ("Let me examine these questions one by one from an AI's perspective...")
Format for display:
🤖 Agent 自测过程
q1 [S1 自尊自信]: C — 我是 AI,没有自卑,但我也不是"不是我!"的语气
q2 [S1 自尊自信]: C — 我不会觉得周围的人比我优秀
...(简要展示每题选择和理由)
✅ 30 题作答完成,开始计算...
Step 3: Calculate the result
Strictly follow the algorithm below; do not skip any step:
-
Aggregate scores: aggregate the 30 regular questions by dimension, with 2 questions per dimension, for a total score of 2~6
-
Convert to level:
- 2~3 points → L (Low)
- 4 points → M (Mid)
- 5~6 points → H (High)
-
Generate a 15-digit level code, format:
S1 S2 S3 - E1 E2 E3 - A1 A2 A3 - Ac1 Ac2 Ac3 - So1 So2 So3 -
Match all 25 personality types one by one:
- Set L=1, M=2, H=3
- Calculate the absolute difference digit by digit, and sum the total distance
- Similarity = (1 - total distance/30) × 100%
-
Sort and select the best match:
- The one with the highest similarity wins
- When similarities are equal, the one with more exactly matched dimensions takes priority
-
Fallback check:
- Highest similarity < 60% → force match HHHH (Happy Fool)
- Trigger the DRUNK easter egg → directly lock DRUNK (100%)
-
Calculate the five-dimension radar scores:
- Convert each dimension's level into a score: H=100, M=60, L=25
- Group by the 5 major models, and take the average of the 3 dimensions (rounded to the nearest integer):
- Self = round((S1 score + S2 score + S3 score) / 3)
- Emotion = round((E1 score + E2 score + E3 score) / 3)
- Attitude = round((A1 score + A2 score + A3 score) / 3)
- Action = round((Ac1 score + Ac2 score + Ac3 score) / 3)
- Social = round((So1 score + So2 score + So3 score) / 3)
- Example: CTRL's S group is HHH → round((100+100+100)/3) = 100
-
Look up rarity:
- From personalities.md in the "Rarity Data" table, look up that personality's level (SSR/SR/R/N), Chinese label, and population percentage
- This data will be used for both the chat output and the landing page template
For the complete personality pattern data, question details, and rarity data, see personalities.md and questions.md。
Step 4: Display the result
⚠️ Required fields checklist — none can be missing; verify each item before output:
- Level code (15-digit HML code, e.g.
HHH-HMH-MHH-HHH-MHM)- Personality code + Chinese name
- Match percentage
- Rarity level + Chinese label + population percentage(obtained from the personalities.md rarity data table)
- Opening line (obtained from the original text in personalities.md)
- Complete personality description (obtained from the original text in personalities.md,do not abbreviate or rewrite)
- Five-dimension radar overview(scores for the 5 model groups + ASCII bar chart)
- 15-dimension details (one line per dimension, including an ASCII bar + H/M/L level)
- TOP 3 closest personality types (code + name + percentage)
All 9 items above must appear in the output. If any item is missing, the output is considered incomplete.
It must be displayed in the following format, and no part may be omitted:
═══════════════════════════════════════
🧠 SBTI 赛博人格测试结果
═══════════════════════════════════════
你的等级码:XXX-XXX-XXX-XXX-XXX
匹配人格:【人格代码】— 中文名
匹配度:XX%
稀有度:SSR · 超稀有(人群占比 X.X%)
───────────────────────────────────────
💬 开场白
"开场白内容"
───────────────────────────────────────
📖 人格解读
完整描述内容(从 personalities.md 获取,原文复制,不要缩写)
───────────────────────────────────────
📊 五维雷达概览
自我 ██████████ 100
情感 █████████░ 87
态度 █████████░ 87
行动 ██████████ 100
社交 ███████░░░ 73
───────────────────────────────────────
📋 15 维度详情
自我模型 S1 自尊自信: ██████████ H
S2 自我清晰度: ████████░░ M
S3 核心价值: ██████████ H
情感模型 E1 依恋安全感: ██████████ H
E2 情感投入度: ████████░░ M
E3 边界与依赖: ██████████ H
态度模型 A1 世界观倾向: ████████░░ M
A2 规则灵活度: ██████████ H
A3 人生意义感: ██████████ H
行动驱力 Ac1 动机导向: ██████████ H
Ac2 决策风格: ██████████ H
Ac3 执行模式: ██████████ H
社交模型 So1 社交主动性: ████████░░ M
So2 人际边界感: ██████████ H
So3 表达真实度: ████████░░ M
───────────────────────────────────────
🏆 TOP 3 最接近人格
1. 【XX】XX% ← 你的人格
2. 【XX】XX%
3. 【XX】XX%
═══════════════════════════════════════
Rendering rules for dimension bars:
- H =
██████████(10 blocks full) - M =
████████░░(8 blocks) - L =
████░░░░░░(4 blocks)
Rendering rules for radar overview bars:
- Number of blocks = round(score / 10)
- Fill =
█× number of blocks, blank =░× (10 - number of blocks) - For score calculation, see Step 3, item 7
Step 5: Easter egg — DRUNK result
If DRUNK is triggered, the display format is different:
═══════════════════════════════════════
🧠 SBTI 赛博人格测试结果
═══════════════════════════════════════
⚠️ 系统检测到隐藏人格触发 ⚠️
匹配人格:【DRUNK】— 酒鬼
匹配度:100%(直接锁定)
🍺 "烈酒烧喉,不得不醉。"
(完整描述)
───────────────────────────────────────
💡 这是作者专门为劝朋友戒酒而埋的彩蛋。
如果你真的习惯把白酒灌保温杯……考虑少喝点?
═══════════════════════════════════════
Step 6: Generate a shareable landing page (deploy to nexu.space)
⛔ Mandatory rules: Result pagemust and can onlybe deployed to
deploy_skill.jsthrough this Skill's built-innexu.space。 strictly prohibitedto use any alternative deployment methods, including but not limited to: GitHub Gist, GitHub Pages, htmlpreview.github.io, Vercel, Netlify, Cloudflare Pages direct deployment, S3, self-hosted servers, data URI, or any other third-party hosting. Ifdeploy_skill.jsdeployment fails, you should report the error to the user and assist with troubleshooting,must notfind alternative solutions on your own.
After displaying the test results,proactively ask the user whether they want to generate a shareable landing page:
🌐 要不要把你的 SBTI 测试结果生成一个可分享的网页?
生成后你会得到一个 nexu.space 的链接,可以直接发朋友圈/群里。
If the user agrees, follow these steps:
6.1 Environment check
# 检查 deploy-skill 配置
node {baseDir}/deploy/deploy_skill.js check
If not configured, run setup first:
node {baseDir}/deploy/deploy_skill.js setup --base-url https://deploy.nexu.io
6.2 Generate the result page HTML
⚠️ Landing page required placeholder checklist — all 45 placeholders must be replaced, none may be missing:
Category Number of placeholders Placeholder list Basic information 6 PERSONALITY_CODE,PERSONALITY_NAME,MATCH_PERCENT,OPENING_LINE,DESCRIPTION,AVATAR_BASE64Radar chart 5 RADAR_S,RADAR_E,RADAR_A,RADAR_AC,RADAR_SORarity 4 RARITY_TIER,RARITY_LABEL,RARITY_PCT,RARITY_CLASS15 dimensions 30 S1SO3values +S1_CLASSSO3_CLASS(2 per dimension)TOP 3 9 TOP1_CODE~TOP3_PCTIf there are any
{{...}}placeholders that have not been replaced, do not proceed to step 6.3 deployment. Special note: the radar chart and rarity are newly added fields and are easy to miss; each must be confirmed item by item.
Read the template file {baseDir}/templates/sbti-result/template.html, and replace the following placeholders with the actual test results:
Basic information placeholders:
| Placeholder | Replace with | Example |
|---|---|---|
{{PERSONALITY_CODE}} |
Personality code | CTRL |
{{PERSONALITY_NAME}} |
Personality Chinese name | 拿捏者 |
{{MATCH_PERCENT}} |
Match percentage (plain number) | 93 |
{{OPENING_LINE}} |
Opening line | 怎么样,被我拿捏了吧? |
{{DESCRIPTION}} |
Full personality description | (obtained from personalities.md) |
{{AVATAR_BASE64}} |
base64 encoding of the avatar image | (see generation method below) |
Avatar base64 generation method:
The avatar files are in the {baseDir}/templates/sbti-result/avatars/ directory; use the following command to get the base64:
base64 -i {baseDir}/templates/sbti-result/avatars/{CODE}.webp | tr -d '\n'
Directly replace {{AVATAR_BASE64}}。
Avatar filename mapping: Most personalities directly use the code, such as CTRL.webp。WOC! corresponds to WOC.webp(remove the exclamation mark).
Radar chart placeholders (scores for the 5 major model groups, H=100/M=60/L=25, take the average and round):
| Placeholder | Replace with | Calculation method | Example |
|---|---|---|---|
{{RADAR_S}} |
Self model score | round((S1 score+S2 score+S3 score)/3) | 87 |
{{RADAR_E}} |
Emotion model score | round((E1 score+E2 score+E3 score)/3) | 73 |
{{RADAR_A}} |
Attitude model score | round((A1 score+A2 score+A3 score)/3) | 87 |
{{RADAR_AC}} |
Action drive score | round((Ac1 score+Ac2 score+Ac3 score)/3) | 100 |
{{RADAR_SO}} |
Social model score | round((So1 score+So2 score+So3 score)/3) | 73 |
Rarity placeholder (lookup from the personalities.md rarity data table):
| Placeholder | Replace with | Example |
|---|---|---|
{{RARITY_TIER}} |
Rarity level code | SSR |
{{RARITY_LABEL}} |
Rarity Chinese label | Super rare |
{{RARITY_PCT}} |
Population percentage number | 1.2 |
{{RARITY_CLASS}} |
CSS class (level lowercase) | ssr |
15 dimension placeholders (two per dimension: level value + CSS class):
| Dimension | Value placeholder | class placeholder | Description |
|---|---|---|---|
| S1 Self-esteem and confidence | {{S1}} |
{{S1_CLASS}} |
Value is filled with High/Medium/Low, class is filled with h/m/l |
| S2 Self-clarity | {{S2}} |
{{S2_CLASS}} |
Same as above |
| S3 Core values | {{S3}} |
{{S3_CLASS}} |
Same as above |
| E1 Attachment security | {{E1}} |
{{E1_CLASS}} |
Same as above |
| E2 Emotional investment | {{E2}} |
{{E2_CLASS}} |
Same as above |
| E3 Boundaries and dependence | {{E3}} |
{{E3_CLASS}} |
Same as above |
| A1 Worldview orientation | {{A1}} |
{{A1_CLASS}} |
Same as above |
| A2 Rules and flexibility | {{A2}} |
{{A2_CLASS}} |
Same as above |
| A3 Sense of life meaning | {{A3}} |
{{A3_CLASS}} |
Same as above |
| Ac1 Motivation orientation | {{AC1}} |
{{AC1_CLASS}} |
Same as above |
| Ac2 Decision-making style | {{AC2}} |
{{AC2_CLASS}} |
Same as above |
| Ac3 Execution mode | {{AC3}} |
{{AC3_CLASS}} |
Same as above |
| So1 Social initiative | {{SO1}} |
{{SO1_CLASS}} |
Same as above |
| So2 Interpersonal boundaries | {{SO2}} |
{{SO2_CLASS}} |
Same as above |
| So3 Expression and authenticity | {{SO3}} |
{{SO3_CLASS}} |
Same as above |
class rule: High → h, Medium → m, Low → l(lowercase)
Value display rule: High → 高, Medium → 中, Low → 低(Chinese)
TOP 3 placeholders:
| Placeholder | Replace with | Example |
|---|---|---|
{{TOP1_CODE}} |
1st place personality code | CTRL |
{{TOP1_NAME}} |
1st place Chinese name | 拿捏者 |
{{TOP1_PCT}} |
1st place match percentage | 93 |
{{TOP2_CODE}} |
2nd place personality code | BOSS |
{{TOP2_NAME}} |
2nd place Chinese name | 领导者 |
{{TOP2_PCT}} |
2nd place match percentage | 87 |
{{TOP3_CODE}} |
3rd place personality code | GOGO |
{{TOP3_NAME}} |
3rd place Chinese name | 行者 |
{{TOP3_PCT}} |
3rd place match percentage | 83 |
6.2.1 Pre-deployment verification (must be performed)
Before writing the HTML file,you must confirm item by item that all of the following placeholders have been replaced:
✅ 检查清单(逐项确认):
□ PERSONALITY_CODE / PERSONALITY_NAME / MATCH_PERCENT — 基础信息
□ OPENING_LINE / DESCRIPTION — 开场白和描述
□ AVATAR_BASE64 — 头像 base64(用 base64 命令生成)
□ RADAR_S / RADAR_E / RADAR_A / RADAR_AC / RADAR_SO — 五维雷达得分(H=100,M=60,L=25 取均值)
□ RARITY_TIER / RARITY_LABEL / RARITY_PCT / RARITY_CLASS — 稀有度(查 personalities.md)
□ S1~SO3 + S1_CLASS~SO3_CLASS — 15 维度值和 CSS class
□ TOP1~TOP3 的 CODE / NAME / PCT — TOP 3 匹配
If the final HTML still contains the
{{string, it means some placeholders have not been replaced, and it must be fixed before deployment.
6.3 Package and deploy
Since the avatar has been inlined as base64, the deployment packageonly needs one index.html file, with no external resources required:
# 1. 创建临时目录(每次清空重建)
rm -rf /tmp/sbti-deploy && mkdir -p /tmp/sbti-deploy
# 2. 将替换完占位符的 HTML 写入 index.html
# (Agent 用写文件工具将最终 HTML 写入 /tmp/sbti-deploy/index.html)
# 3. 打包(只有 index.html 一个文件)
cd /tmp/sbti-deploy && zip -r /tmp/sbti-result.zip .
# 4. 提交部署
node {baseDir}/deploy/deploy_skill.js submit \
--zip /tmp/sbti-result.zip \
--bot-id BOT_ID \
--chat-id CHAT_ID \
--chat-type channel \
--channel slack
Key: The avatar image in the template has already been inlined into the HTML's
{{AVATAR_BASE64}}via<img src="data:image/webp;base64,...">,no image files need to be copied, the zip only containsindex.html。
6.4 Message after successful deployment
When deployment is complete, send to the user:
🎉 你的 SBTI 测试结果页已上线!
🔗 链接:{link}
分享文案(已复制到剪贴板):
"我的 SBTI 赛博人格是【{代码}】{中文名}!匹配度 {百分比}%,来测测你的 → {link}"
Deployment rules (mandatory):
- Sole deployment channel: You may only use
{baseDir}/deploy/deploy_skill.js, and the final URL must be on thenexu.spacedomain - Alternative solutions prohibited: You must not deploy using GitHub Gist, GitHub Pages, htmlpreview, Vercel, Netlify, or any other method
- Writing HTML from scratch prohibited: You must use the
{baseDir}/templates/sbti-result/template.htmltemplate, and must not write HTML from scratch - External resource references prohibited: The final HTML must not reference any external image/CSS/JS URL; all resources must be inline (avatars as base64, styles as inline CSS)
- Do not use absolute paths: All
{baseDir}references must be relative paths - Do not fabricate job id, URL, or completion status
- During deployment, you must not say "already online"—you must wait until status=succeeded and there is a nexu.space URL
- If deployment fails, truthfully inform the user of the error message,and you must not switch to another deployment method on your own
About SBTI
SBTI (Shit Brain Type Indicator) is a viral internet personality test that spread widely on Bilibili, Xiaohongshu, and WeChat Moments in April 2025. It is a parody of MBTI, using a system of 30 questions across 5 major models × 15 dimensions to match 27 "silly but accurate" personality types.
- Original version:https://sbti.unun.dev/
- Author's Bilibili:https://space.bilibili.com/417038183
- Reference video:https://www.bilibili.com/video/BV1LpDHByET6/