筛选"自我定义型"身份品牌公司 —— Workflow 操作手册
本文档是给全新 agent 看的可执行手册:从零开始,读完即可独立完成"从 iFind 选股 CSV 中筛选出塑造自我、定义品类/世界的身份品牌公司"这项任务。 内容包含:判别标准、数据清洗、三层漏斗(subagent 编排)、可复用的 prompt 与 JSON Schema、输出格式、以及历次执行踩过的坑与必须遵守的规则。
一、任务是什么
用户提供一份同花顺 iFind 选股导出的美股 CSV(一般已带财务过滤:市值≥50亿美元、毛利率≥50%、ROIC≥15%),要求从其中筛出符合以下投资哲学的公司:
"从竞争的角度,没有什么是竞争优势——你做了什么,其他人也能做。唯有你自己是无法复制的。" 所以只找那些定义了自己、创造了一个世界/品类的公司,而不是"更便宜的 XX"或"更好的 XX"。 例:魔爪(酷、暗的极限运动能量)≠ 便宜的红牛;拉夫劳伦(美国梦绅士世界)≠ 高级衬衫。
判别核心一句话:它是"它自己",不是"定位"出来的替代品。 定位可以被模仿,身份无法被复制。
二、判别标准:10 项文化身份信号
对每家公司打分时使用以下信号清单(命中越多分越高):
| # | 信号 | 说明/例子 |
|---|---|---|
| 1 | 语言测试 | 品牌成为动词/名词/梗:"Google一下"、"Netflix and chill"、"Zoom会议" |
| 2 | 纹身测试 | 有人把品牌 logo 纹在身上(哈雷、迪士尼、耐克、魔爪) |
| 3 | 转售测试 | 二手/转售价格高于零售价(Air Jordan、YETI、Birkin、法拉利配额) |
| 4 | 黑粉测试 | 既有死忠也有黑粉,两极分化(Crocs、Tesla、魔爪) |
| 5 | 自发社群测试 | 用户自发组织社群/俱乐部(HOG俱乐部、Reddit社区、跑团) |
| 6 | CEO语言测试 | 股东信/发布会讲"我定义了 XX 品类/世界"而非"我抢了 X% 份额" |
| 7 | 定价纪律 | 从不打折、提价不掉量、不参与价格战 |
| 8 | 品类创造 | 创造或独占一个新品类/子品类(魔爪=酷暗能量、lululemon=瑜伽生活方式、Yeti=高端冰桶) |
| 9 | 身份≠定位 | 它是"它自己",不是"更便宜的 XX"或"更好的 XX" |
| 10 | 造世界 | 品牌创造了一个可沉浸的世界观(迪士尼=魔法、拉夫劳伦=美国梦、Rockstar=GTA世界) |
评分锚点:
- 9-10:造世界型身份品牌(且经济上已验证)
- 7-8:强身份品牌/品类定义者
- 6:有明确身份倾向,弱于上述
- 3-5:有品牌知名度,但本质是运营/技术/渠道/规模优势(如 AutoZone、O'Reilly、半导体设备商)
- 0-2:无品牌身份(矿业、油气、B2B 组件、医院、保险等)
纪律:不得因"有名/市值大/技术强"给高分;不熟悉的公司给低分并注明"不熟悉"。
三、第0层:数据清洗(务必先做)
3.1 读取
- 用
glob找 CSV(可能叫"美股选股.csv"之类),用read工具读取(它有行号)。
- 表头是多行的(iFind 导出格式:
代码,名称,"销售毛利率\n[报告期]...),真正数据从第 ~12 行开始,末行可能是"数据来源:同花顺iFinD"。
3.2 清洗(用 python csv 模块,不要手工切分)
import csv, json
out, seen = [], set()
with open('美股选股.csv', encoding='utf-8-sig') as f:
rows = list(csv.reader(f))
for row in rows:
if len(row) < 5: continue
t = row[0].strip()
if not t or t == '代码' or '数据来源' in row[0]: continue
if t in seen: continue # 去重
seen.add(t)
# 数值列可能带千分位逗号("1,167.7935"),必须 replace(',','') 再 float
out.append([t, row[1].strip()])
print(json.dumps(out, ensure_ascii=False))
规则:
- 数值列去掉千分位逗号再转 float(否则 IBRX.O 这类 ROIC=1167.7935% 的行会解析失败被静默跳过——本次就差点漏掉它)。
- 同一公司多股票代码去重:如 GOOG.O / GOOGL.O 保留一个。
- 清洗后用 bash 校验
wc -l与解析出的条数是否对得上,防止漏行。
3.3 已知数据陷阱(本次踩过,务必人工复核)
| 陷阱 | 说明 | 处理 |
|---|---|---|
| MICC.N 中文名"梦龙" | 实为 Millicom(非洲电信公司),不是梦龙冰淇淋(Magnum)!中文名误导 subagent 给出 6 分 | 人工纠偏,按真实公司打分(电信=0-2分) |
| IBRX.O ROIC=1167% | 负权益导致的失真值,不是亮点 | 不影响身份打分,但别被数字带偏 |
| GOOG.O/GOOGL.O | 同一家 Alphabet | 去重 |
| 金融/保险类 100% 毛利率 | 会计口径(如 V/MA 手续费收入),毛利率高≠有品牌身份 | 身份打分照常,别因 100% 加分 |
四、三层漏斗(subagent 编排总览)
CSV 全部公司(如 188 家)
│ 第2层:文化信号批量筛选(每批 ≤16 家,每批 1 个 subagent)
▼
≥6 分晋级(如 25 家)→ 取前 12 名
│ 第3层:身份深挖(每家 1 个 subagent)
▼
12 家深挖结果 → 按 identity_score 排序取前 6 家
│ 第4层:反向证伪(每家 1 个 subagent,只找空头证据)
▼
决赛圈最终分级 A/B/C + watch_items → 汇总报告
为什么必须开多个 subagent 而不是单 agent 走到底:188 家逐一深挖会撑爆上下文;且第4层"只找缺点"的立场与第2/3层"找优点"相反,必须换 fresh 视角。本次实际用 30 + 12 + 1 = 43 次 agent 调用(第2层 13 个、第3层 12 个、第4层 7 个、补跑 1 个)。
五、第2层:文化信号筛选(批量打分)
5.1 编排
- 把公司列表切成批次,每批 ≤16 家(多了打分质量下降)。
- 每批一个 subagent,并行跑(并发 5-6 个即可)。
- 给每个 agent 提供:完整 10 信号清单 + 评分锚点 + 本批公司清单 + 强制输出 schema。
5.2 Prompt 模板(可直接复用)
你是美股品牌身份研究员。判断标准是"公司定义了自己、创造了世界/品类",而不是"份额大、技术强、名气大"。
【文化身份信号清单】
1. 语言测试:品牌成为动词/名词/梗(如"Google一下""Netflix and chill""Zoom会议")
2. 纹身测试:有人把品牌logo纹在身上(哈雷、迪士尼、耐克)
3. 转售测试:二手/转售价格高于零售价(Air Jordan、YETI、Birkin、法拉利配额)
4. 黑粉测试:既有死忠也有黑粉,两极分化(Crocs、Tesla、魔爪)
5. 自发社群测试:用户自发组织社群/俱乐部(HOG俱乐部、Reddit社区、跑团)
6. CEO语言测试:股东信/发布会讲"我定义了XX品类/世界"而非"我抢了X%份额"
7. 定价纪律:从不打折、提价不掉量、不参与价格战
8. 品类创造:创造或独占一个新品类/子品类(魔爪=酷暗能量、lululemon=瑜伽生活方式、Yeti=高端冰桶)
9. 身份≠定位:它是"它自己",不是"更便宜的XX"或"更好的XX"
10. 造世界:品牌创造了一个可沉浸的世界观(迪士尼=魔法、拉夫劳伦=美国梦绅士世界、Rockstar=GTA世界)
【分数锚点】
- 9-10:造世界型身份品牌(且经济上已验证)
- 7-8:强身份品牌/品类定义者
- 6:有明确身份倾向,弱于上述
- 3-5:有品牌知名度,但本质是运营/技术/渠道/规模优势(如AZO汽车地带、ORLY奥莱利、半导体设备商)
- 0-2:无品牌身份(矿业、油气、B2B组件、医院、保险等)
【纪律】
- 每家公司都必须打分,不得遗漏;不熟悉的公司给低分并在evidence注明"不熟悉"。
- 不要因为公司有名就给高分,身份必须来自上述具体信号。
- signals填命中的信号编号(如"信号4、信号8"),最多3个;evidence一句话;confidence填低/中/高。
【本批次公司清单】
1. TICKER 名称
2. ...
【输出】JSON对象:{"results":[{"ticker":"代码","score":分数,"signals":["信号编号"],"evidence":"一句话证据","confidence":"低|中|高"}]},必须覆盖本批次所有公司。
5.3 输出 Schema(workflow 工具用)
{
"type": "object",
"properties": {
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"ticker": {"type": "string"},
"score": {"type": "number"},
"signals": {"type": "array", "items": {"type": "string"}},
"evidence": {"type": "string"},
"confidence": {"type": "string", "enum": ["低", "中", "高"]}
},
"required": ["ticker", "score", "signals", "evidence", "confidence"],
"additionalProperties": false
}
}
},
"required": ["results"],
"additionalProperties": false
}
5.4 收尾校验
- 按 ticker 汇总所有批次结果,核对覆盖度:缺失的公司单独补跑一个小批次(不要整层重跑)。
- 晋级线:score ≥ 6;若晋级数 >12,取分数前 12 名进第3层。
六、第3层:身份深挖(逐家)
每家 1 个 subagent(可并行 5-6 个),输入第2层得分与证据,输出结构化深挖。
6.1 Prompt 模板
你是品牌战略研究员。TICKER(名称)已通过第2层文化信号筛选(得分X,证据:...)。请基于你的知识做身份深挖:
1. identity_statement:用一句话写出这家公司"定义自己是谁"(例:魔爪="酷、暗、极限运动的能量";拉夫劳伦="美国梦的绅士世界")。
2. world:它创造了什么可沉浸的世界/世界观?产品之外的世界是什么?
3. language_evidence(1-3条):它的股东信/CEO语言是"品类定义"还是"份额竞争"?引用你记得的CEO名言或风格。
4. pricing_evidence(1-3条):定价权证据(溢价、从不打折、提价不掉量、转售溢价、配额制)。
5. community_evidence(1-3条):粉丝文化、自发社群、两极分化、纹身/转售/动词化证据。
6. degradation_risk:身份变质风险(潮流退去、变成"妈妈品牌"、模仿者稀释、创始人离去、文化丑闻)。
7. identity_score(0-10):身份强度最终评分。
8. tier:A=身份与经济双强且可持续;B=身份强但有明显风险或经济兑现不足;C=身份在减弱或经济无法兑现。
只输出JSON。
6.2 Schema
{
"type": "object",
"properties": {
"ticker": {"type": "string"},
"identity_score": {"type": "number"},
"identity_statement": {"type": "string"},
"world": {"type": "string"},
"language_evidence": {"type": "array", "items": {"type": "string"}},
"pricing_evidence": {"type": "array", "items": {"type": "string"}},
"community_evidence": {"type": "array", "items": {"type": "string"}},
"degradation_risk": {"type": "string"},
"tier": {"type": "string", "enum": ["A", "B", "C"]}
},
"required": ["ticker", "identity_score", "identity_statement", "world", "language_evidence", "pricing_evidence", "community_evidence", "degradation_risk", "tier"],
"additionalProperties": false
}
6.3 决赛圈
按 identity_score 降序取前 6 名进第4层。
七、第4层:反向证伪(空头压力测试)
这是最值钱的一层:只找缺点。本次实例:魔爪 MNST 在第1-3层都是 A,第4层发现"Celsius 用另一套身份抢走了它的货架份额"——身份没有转化为不可复制的定价权,被降为 B。如果只做"找优点"就会漏掉这种裂缝。
每家 1 个 subagent,prompt 注入身份评分/暂定 tier/身份陈述。
7.1 Prompt 模板
你是美股空头研究员(反向证伪)。TICKER(名称)已通过前两层(身份评分X,暂定tier,身份陈述:...)。请站在最挑剔的空头立场输出:
1. bear_cases(2-3条):最强的做空/看空逻辑,每条含risk(风险)+evidence(证据/论据)。
2. identity_economics:这个身份是否真正转化为单位经济学(定价权→毛利→自由现金流→股东回报)?还是"有身份没生意"或"有生意没身份"?
3. final_tier:最终分级(A/B/C)。
4. watch_items(1-3条):未来12-24个月需要跟踪的证伪信号。
只输出JSON。
7.2 Schema
{
"type": "object",
"properties": {
"ticker": {"type": "string"},
"bear_cases": {
"type": "array",
"items": {
"type": "object",
"properties": {
"risk": {"type": "string"},
"evidence": {"type": "string"}
},
"required": ["risk", "evidence"],
"additionalProperties": false
}
},
"identity_economics": {"type": "string"},
"final_tier": {"type": "string", "enum": ["A", "B", "C"]},
"watch_items": {"type": "array", "items": {"type": "string"}}
},
"required": ["ticker", "bear_cases", "identity_economics", "final_tier", "watch_items"],
"additionalProperties": false
}
八、输出与报告
- 聊天回复:给出三层漏斗各层结果、最终 A/B 分级、每家的身份陈述一句话 + 关键风险 + 跟踪信号。
- Markdown 报告:写入当前目录,命名如
美股身份品牌筛选报告.md,结构: - 数据与方法(家数、subagent 数量、判别标准)
- 第2层晋级名单(分数表)
- 第3层身份陈述表(身份分/tier)
- 第4层最终分级 + 空头要点
- 观察名单
- 数据陷阱与局限性说明
- 权限:所有
.md文件写完后立即chmod 644(本项目规则:Web 服务要读,600 会 404)。
九、执行经验与铁律(历次踩坑总结,务必遵守)
9.1 结果落盘与读取(最重要的教训)
- spill 文件用
read工具读,绝不用 bash:workflow 返回体超过阈值会被截断,工具会提示"Full formatted result stored at: /tmp/dsh-spill-/session-/xxxx-workflow.txt"。这个路径宿主文件系统上真实存在,read工具能读到完整结果(第一行是 "workflow ... completed",后面是完整 return value)。bash 沙箱的 /tmp 是隔离私有挂载,ls /tmp、wc都看不到宿主文件——用 bash 找 = 误判"文件不存在",本次就因此误判导致补跑浪费。
- 每层返回后立刻落盘到工作区:把 workflow 返回的 JSON/Markdown 立即写入工作区
tmp/目录(工作区可写;.md记着 chmod 644)。即使后续被截断,也有中间产物。
- 紧凑返回:schema 字段限长(evidence/statement 每条 ≤100 字、数组 ≤3 条),必要时脚本里
slice截断后再 return;分层单独跑,单次返回控制在 ~8KB 以内,从源头减少截断。
- 校验清单:核对"返回条目数 == 预期条目数";缺失的少量条目用单个 subagent 补跑,绝不整层重跑。
9.2 编排纪律
- 用
workflow工具(可编排多阶段 + schema 校验 + 进度 phase),或分批subagent后台并行;不要一个 agent 走到底。
- 并发 5-6 个足够;总 agent 数会受部署上限约束,预算好:第2层批次数 + 第3层晋级数 + 第4层决赛数。
- agent 失败返回 null 要
.filter(Boolean)兜底,并补跑缺失项。
9.3 数据与认知陷阱
- 见 §3.3:中文名误导(MICC"梦龙"实为 Millicom)、千分位逗号、同公司多代码去重、金融业 100% 毛利率。
- subagent 基于训练知识,估值与最新季度数据必须人工用财报/电话会复核;报告注明"非投资建议"。
9.4 权限与沙箱(如需更大权限时)
- 当前会话默认
workspace-write:只能写工作区根目录 + 平台临时区。
- 单次全盘权限:bash 命令被拒后,用
sandbox_permissions: "danger-full-access"重试同一条命令并附 justification,GUI 会弹审批,用户批准后该命令以全盘权限执行。
- 会话级 yolo:用户在 GUI 权限预设选择器切到
danger-full-access(或/permissionPresets danger-full-access),切回用workspace-write;该切换写入会话日志、重启保留。
- 沙箱不限制网络与进程可见性,只限制文件影响。
9.5 汇报口径
- 明确报告 subagent 使用数量(如"共 43 次 agent 调用:第2层 13、第3层 12、第4层 7、补跑 1"),用户关心"不是单 agent 走到底"。
十、workflow 脚本骨架(JS,可直接改)
const stocks = args.stocks; // [[ticker, name], ...]
async function runPool(items, limit, fn) {
const results = new Array(items.length);
let i = 0;
async function worker() {
while (i < items.length) { const idx = i++; results[idx] = await fn(items[idx], idx); }
}
await Promise.all(Array.from({ length: Math.min(limit, items.length) }, worker));
return results;
}
// ---- 第2层 ----
phase('第2层:文化信号筛选');
const BATCH = 16; const batches = [];
for (let i = 0; i < stocks.length; i += BATCH) batches.push(stocks.slice(i, i + BATCH));
const l2raw = await runPool(batches, 6, (batch, idx) =>
agent(`【身份信号清单见 §5.2】...\n本批次:\n${batch.map((s,j)=>`${j+1}. ${s[0]} ${s[1]}`).join('\n')}\n输出JSON。`,
{ schema: L2_SCHEMA, label: `第2层·批次${idx+1}`, phase: '第2层:文化信号筛选' }));
// 合并、查缺补漏、晋级取前12(见 §5.4)
// ---- 第3层 ----
phase('第3层:身份深挖');
const deep = await runPool(survivors, 6, (s, idx) =>
agent(`【深挖模板见 §6.1】...`, { schema: L3_SCHEMA, label: `第3层·${s.ticker}`, phase: '第3层:身份深挖' }));
const finalists = deep.filter(Boolean).sort((a,b)=>b.identity_score-a.identity_score).slice(0, 6);
// ---- 第4层 ----
phase('第4层:反向证伪');
const adv = await runPool(finalists, 6, (s, idx) =>
agent(`【证伪模板见 §7.1】...`, { schema: L4_SCHEMA, label: `第4层·${s.ticker}`, phase: '第4层:反向证伪' }));
return { layer2: 全部打分, survivors, deep, adversarial: adv.filter(Boolean) };
// 返回后立即把 return 值写入工作区 tmp/ 落盘(见 §9.1.2)
要点:
meta.phases里的 phase 标题必须与脚本中phase('...')字符串逐字一致;
- schema 只允许
type/properties/required/additionalProperties/items/enum/const/oneOf,不要用 pattern/format;
- workflow 脚本内无文件系统/网络 API,落盘必须在 workflow 返回后由主 agent 做。
十一、验收清单(跑完自查)
- [ ] 清洗后条数 = CSV 数据行数 - 去重数,数值无解析失败
- [ ] 第2层覆盖度 100%(缺失项已补跑)
- [ ] 第3层 ≥6 分前 12 名全部深挖完成
- [ ] 第4层决赛圈 6 家全部有 final_tier + watch_items
- [ ] 每层结果已落盘到工作区 tmp/(.md 为 644)
- [ ] 报告含:数据与方法、各层结果、A/B 分级、身份陈述、风险与跟踪信号、数据陷阱说明、非投资建议声明