SKILL · JD 结构化与定级(v0.1.2 骨架)
把本文件整份交给你的 agent 即可——不依赖任何特定 agent 产品,不需要注册命令、不需要放在特定目录、不需要装任何东西。SKILL.md 只是一个文件名约定,不是某一家的格式。连同一份 JD 原文一起贴给它,就能开始。
⚠️ 这一版是骨架:给的是规则与标定方法,不是一套调好的参数。文中所有
〔…〕都是留空的参数,需要你自己标定(方法见第三步)。完整定级模板排在 v0.3。
开跑前
要什么
| 要什么 | 缺了会退化成什么 | |
|---|---|---|
| 必需 | JD 原文 | 没有原文就没有可抽取的对象。不接受"某公司某岗位大概是做 XX 的"这种转述——转述本身已经是一次评价,抽取纪律从第一步就破了 |
| 必需 | 你的必要条件 2-3 条 + 硬性排除条件 2-3 条 | 缺了不猜、也不用默认值。会先要你写这两组,因为没有它们,所有岗位都会被判成"较匹配"(见「不对劲的时候」第 1 条) |
| 可选 | positioning.md(定位文件,空模板在 00-workspace) |
没有就从上一行的口述里现场整理一份最小版本,并存回去,下次直接用 |
| 可选 | 加分条件 | 没有就只判"是否满足必要条件 + 是否触排除条件",级别会收敛成三级(强匹配与较匹配分不开),并明确告诉你少了哪一层。⭐ 写了加分条件、但它的上沿还没校准时也走这一档——首轮的每个人都在这个状态里,见第二步「首轮」一节 |
| 可选 | ⭐ branches.md(活跃探路分支) |
一律按主线阈值判,探路岗位会被判成"不投"。 这是缺省的保守行为,不是 bug。但必须明说一句:"我没看到任何活跃探路分支——你如果在试新方向,需要手工告诉我" |
| 可选 | ledger.md(台账,已跑过的岗位与对方回应) |
没有就跳过第三步的阈值反推,阈值停在 纯占位待校准,并在每次定级结论末尾标注这一点 |
⭐ 最小可接受形态
一份 JD 原文 + 你的必要条件与排除条件各 2-3 条。
散着贴进来就行 —— 微信里复制的一段、招聘页面上整片选中的文字、你自己口述的三句"我不接受什么",都算。整理成结构化表是 agent 的工作,不是你的。
⭐ 照最小形态给,你会拿到 X,但拿不到 Y
| ✅ X:你会拿到 | ❌ Y:你拿不到 |
|---|---|
| 一张结构化抽取表 + 一个级别 + 能追回到条件编号的理由 | 分开的「强匹配」与「较匹配」——没有加分条件表(或有表但上沿还没校准),级别收敛成三级 |
| 一份「原文未提及」清单,逐条升级成面试必问项 | 任何一个标着 实践校准 的阈值。全部停在 纯占位待校准——标定要的是你已经做过的判断,一份新 JD 里没有 |
| 一条可复核的「不投」理由(指得到具体编号) | "我这条排除条件是不是定错了"的答案——那要第三步的三类反推样本,每类 〔2-3〕 条(默认建议值) |
一句话:最小形态够定级,不够标定阈值。定级是"用现有标尺量一次",标定是"检查标尺本身准不准"——后者要的是一批你已经做过的判断,不是一份新的 JD。所以第一次跑完不要问"我的阈值定得对不对":在这个输入量下,那个问题没有答案,任何看起来像答案的东西都是编的。
⛔ 四条禁止(对 agent)
- 不许报错退出。 上游文件不存在是常态,不是异常。退化成"需要你手工补这几项",然后继续跑
- 不许静默自己编。 没写汇报线就是没写——填"原文未提及"并进"待确认",不要推一个像是那么回事的答案填进去
- 不许一次只问一个问题挤牙膏。 要什么一次列全,让人一次补齐
- 不许把该自己解决的整理工作推给用户。 用户散着贴来的材料由你整理成结构化表;"请先把 JD 整理成表格再给我"是被禁止的回答
第一步 · 抽取(不做评价,只做客观抽取)
用 templates/jd-抽取模板.md 的空表逐栏填。填之前先接受这条纪律:
抽取阶段不下任何判断,原文措辞原样保留。
为什么这条不能松:抽取时就顺手评价(把"负责数据平台的日常维护与迭代"写成"看起来是接手已有系统"),会把 JD 里的原始信号洗掉。后面的定级于是不是在评价 JD,而是在评价一份已经被你评价过的材料——错误从此不可见,因为原文已经不在表里了。
三条执行细则:
- 原文措辞保留。 不同义替换、不精简、不"翻译成人话"。你觉得含糊的地方,正是要保留的地方——含糊本身是信号
- 薪资原样抄。 不折算、不换算周期、不取区间中点、不补"大概"。以图片形式给出的薪资,抄下你看到的原样文本,并标注它来自图片
- 原文没写的,写"原文未提及"。 它会自动进入"待确认"清单,成为面试必问项(交给
interview-strategic-assessment),而不是被一个推测填掉
⭐ 核心职责 这一栏比薪资更重要
薪资谈得动,做的事换不动。这一栏的抽取规则是:摘出原文里能支撑下面两组区分的句子——
| 区分 | 原文里往哪看 |
|---|---|
| 从 0 搭体系 vs 接手已有系统 | 前者常出现"搭建 / 建立 / 从无到有 / 定义流程 / 组建";后者常出现"维护 / 迭代 / 优化现有 / 承接 / 保障稳定"。看动词,不看名词 |
| 对内提效 vs 对外产品 | 前者常出现"内部效率 / 支持业务团队 / 降本 / 提效 / 赋能";后者常出现"面向客户 / 商业化 / 付费用户 / 对外交付 / 营收" |
但抽取阶段只贴句子,不下结论。 表里这一栏写的是"原文原句 + 它指向哪一组",不是"这是一个从 0 搭体系的岗位"。两组都判不出时写"原文未提及",进待确认——这本身就是一个强信号:一份说不清自己要人干什么的 JD,往往对应一个还没想清楚的岗位。
⭐ 「这条是怎么进来的」不是可有可无的登记项
抽取表里有一栏问「这条 JD 是怎么进来的」(搜索命中 / 平台推荐 / 对方主动推来 / 中间人转介 / 其他)。定级用不到它,所以它看起来最像可以省掉的那一栏。恰恰相反:
- 它是下游判断"你的搜索词在不在漂移"唯一的输入。 反复出现、却不在你关键词列表里的那些岗位形态,只能从这一栏认出来
- 漏填 = 这条在后面的方向复盘里等于不存在,不是权重低,是不进样本
- 它事后补不回来。 一周后你不会记得某条是自己搜的还是被推来的,而这两者指向完全相反的解读(前者反映你的关键词,后者反映别人眼里的你)
执行要求:搜索命中 的连搜索词一起记;对方主动推来 的同时在 ledger.md 的「反向吸引」栏打标记;真想不起来就写 其他 + 你记得的那半句。⛔ 不许猜一个具体来源填进去——猜出来的来路会污染的正是这一栏唯一的用途。
第二步 · 定级(四级,排除条件短路)
用 templates/定级规则模板.md。判定必须按这个顺序,顺序本身就是纪律:
① 硬性排除条件 → 命中任一条 → 判「不投」,短路,不再往下算
② 必要条件 → ⭐ 三态,不是两态:
├─ 满足 → 继续往下
├─ 原文明确不满足 → 看是否落在活跃探路分支里
│ ├─ 是 → 走该分支的更宽阈值 → 可判「探路」
│ └─ 否 → 判「不投」
└─ 原文未提及 → 降一档 + 挂待确认 + 升级为面试必问项
⛔ 不据此判「不投」
③ 加分条件 → 在必要条件全满足的前提下,决定「强匹配」还是「较匹配」
⭐ 硬性排除条件不可被匹配度换
薪资、汇报线、权限这类是不可交易的,不是"权重特别高的加分项"。
- ❌ 不许写"排除条件命中一条扣 N 分"——只要它出现在同一个加权式子里,就总会被别的项换掉
- ❌ 不许出现"虽然薪资不达标,但匹配度很高,建议投一下试试"这种结论。这句话就是这条纪律要防的那个错误本身
- ✅ 正确形态是短路:命中 → 判「不投」→ 停止计算 → 理由里写清命中的是哪一条编号
这与
05-offer的 gate 是同一条纪律:那边是"加分项再多也换不掉一条必要条件",这边是"匹配度再高也换不掉一条硬性排除条件"。这条纪律在几个模块里都出现过,犯的是同一类错——把不可交易的条件当成了可以加权的项。所以你在多个模块里看到同一句警告,不是重复,是同一条纪律的不同落点。
⭐ 「原文未提及」是第三态,不是「未满足」
JD 不写关键信息是常态,不是例外。 汇报线、权限、办公方式,多数 JD 都不写。所以必要条件这一侧有三态:
| 态 | 它是什么 | 怎么处理 |
|---|---|---|
| 满足 | 抽取表里有原文能证实 | 正常往下走 |
| 未满足 | 抽取表里有原文能证伪 | 除非落在活跃探路分支内,否则判「不投」 |
| ⭐ 原文未提及 | 抽取表这一栏是空的 —— 它是一个待确认项,不是一个判定 | 降一档 + 挂进待确认 + 升级为面试必问项。⛔ 不据此判「不投」 |
「降一档」的意思:强匹配 → 较匹配;较匹配 → 保留,但标注"关键项未确认"。它压低优先级,不关门。
⭐ 三级收敛期怎么降(〔B 上沿〕仍为 纯占位待校准 时 —— 见下面「⭐ 首轮」一节,首轮的每个人都在这个状态里):这时只有「匹配」一档,降无可降。口径写死:保留「匹配」,标注"关键项未确认",并在批内相对排序里排到同等命中数的岗位之后。
⛔ 不许因为"降不动"就把三态压回两态判「不投」 —— 那正好是这一节要防的那个错误,只是换了个入口进来。
为什么必要条件这一侧要这么处理,理由与排除条件那一侧同源(那边的说法是「推测项不能单独触发不可逆动作」):
- 「不投」不产生任何反馈——不投递、不接触、没有回应,于是这条判断永远没有机会被证明是错的。它是不可逆的
- 一份 JD 没写某件事,最常见的原因只是这份 JD 写得糙,不是招聘方在这件事上真的不满足你的条件。用"对方没写"去触发一个不可逆的动作,等于把对方的写作质量当成了你的判据
⛔ 不许出现这种结论:"JD 没提汇报线,按最坏情况算,判不投。"
✅ 正确形态:"N2 待确认——「汇报线」栏为 原文未提及;级别由强匹配降为较匹配,已列入面试必问。"
⚠️ 反过来也不许:不许把「原文未提及」当成「满足」放过去。 那会让定级结论看起来很完整,实际建立在一批没人检验过的默认假设上。三态就是三态,往哪边压成两态都是错的。
四个级别
| 级别 | 判据 | 你该做什么 |
|---|---|---|
| 强匹配 | 无排除命中 + 必要条件全满足 + 加分条件命中数 ≥ 〔上沿阈值·纯占位待校准〕 | 优先投,值得为它单独定制材料 |
| 较匹配 | 无排除命中 + 必要条件全满足 + 加分条件命中数落在〔中段·纯占位待校准〕 | 投,用通用版本即可 |
| 探路 | 无排除命中 + 有必要条件未满足但落在活跃探路分支内 + 满足该分支的更宽阈值 | 投,但计入该分支的配额,且到分支截止日一起复盘 |
| 不投 | 命中任一硬性排除条件(最高优先级,无条件);或任一必要条件被原文明确证伪且不落在任何活跃探路分支内。⛔ 「原文未提及」不算未满足,见上一节 | 不投。但要把理由写进定级结果文件,并在台账里留一行——"不投"也是数据 |
⛔ 这里没有"缺口上限"参数 —— 一旦允许"缺几条还能过",必要条件就变成了加权项,正是本模块上一节要防的那件事(硬性排除条件不可被匹配度换)。分支豁免哪几条必要条件,写在
branches.md里,是显式豁免,不是缺口预算。
⭐ 首轮:加分条件表非空,但它的上沿还没校准
「开跑前」写的是加分条件表为空时收敛成三级。还有一种状态它没覆盖,而首轮的每个人都在这个状态里:加分条件写了几条,但〔B 上沿〕和〔B 中段〕都还是 纯占位待校准——一个没有数值的上沿,分不开「强匹配」和「较匹配」。
这一档这样处理:
- 同样收敛成三级(强 / 较合并成一档,就叫「匹配」)。⛔ 不许随手编一个上沿把它们劈开
- 但要给出相对排序:这一批内部按加分条件命中数从多到少排出来,并明说一句"这是这一批内部的相对排序,不是绝对档位——换一批 JD,同一个岗位的位置会变"
- 每条结论末尾标注:〔B 上沿〕仍为
纯占位待校准,因此强 / 较两档尚未分开
它什么时候自动解开:等你按第三步反推出〔B 上沿〕、把它的来源等级从 纯占位待校准 改成 实践校准(或至少 默认建议值)那一刻,四级自动恢复。触发条件是样本量,不是时间——第三步的三类样本每类攒够 〔2-3〕 条(默认建议值)就可以反推;少于这个量级,反推出来的上沿只是把一两条个例写成了规则。
⛔ 不许为了"能出四级"先编一个上沿。 编出来的档位会立刻开始影响你投哪些岗,而它没有任何依据;更糟的是它长得和一个真阈值一模一样,三个月后你不会记得它是编的。这正是 §来源标注三挡要如实标的原因。
定级理由必须能被追回去
一条合格的定级结论长这样:
青栈网络 / 数据平台负责人 → 不投 命中排除条件 X2(薪资下沿低于你写的下沿)→ 短路,未继续计算匹配度。 补充(不参与判定):必要条件 N1 N3 满足,N2 待确认(原文未提及汇报线)。
一条不合格的结论长这样:
综合看比较匹配,建议可以投一下。
区别不在语气,在可追性:前者能指回具体条件编号,后者指不回任何东西,所以既无法复核,也无法用来校准阈值。每条定级理由都必须指向至少一个条件编号;指不到,就写"指不到",然后回到第一步看抽取表哪一栏是空的。
⭐ 定级结果写到哪(⛔ 不要就地发明一个文件名)
一批 JD 定完级,产出一份文件:
triage/<日期>-定级结果.md
- 日期 = 这批 JD 的批次日期,与
jobs/<日期>-一批说明.md对齐,两份文件肉眼就能配上对 - 位置与命名的权威定义在
00-workspace的工作区骨架 - 没有工作区、只是单跑一次的:把同样的内容原样输出给用户,并告诉他"将来建工作区时,这份东西放
triage/"。⛔ 不许现场发明一个文件名,也不许把它塞进 JD 原文那份文件里
一条都不许少的三样东西:
- 每条岗位的级别(强匹配 / 较匹配 / 探路 / 不投;三级收敛期就写「匹配」并注明原因)
- 理由,且能追回到具体条件编号(
X1/N2/B1…)。指不到编号就写"指不到",不许用"综合看还行"顶上 - 待确认项:所有
原文未提及与我推测的,逐条写清"要证实它该问谁 / 查什么",并标出它把级别压低了几档
四个位置各管一件事,别互相塞:
| 位置 | 装什么 | ⛔ 不装什么 |
|---|---|---|
jobs/<日期>-一批说明.md |
JD 原文与抽取表 | 任何级别与判断——判断进 triage/ |
triage/<日期>-定级结果.md |
级别 + 可追编号的理由 + 待确认项 | JD 原文的改写版(原文只在 jobs/,这里引用原句即可) |
ledger.md 的「级别」栏 |
一个字母(S/A/B 之类),用来分层看回复率 | 理由——一个字母装不下"能追到条件编号的理由",那是 triage/ 的活 |
assessments/<公司>.md |
面试前的疑点与红旗绿旗判据 | 投前定级——读者和时机都不同(那边服务"要不要去",这边服务"要不要投") |
⚠️ 判成「不投」的那些也要写进这份文件,并在
ledger.md里留一行。 「不投」是本模块产出最多、也最容易蒸发的一类结论;它不落地,第三步的阈值校准就永远缺掉最重要的那一类样本。
第三步 · ⭐ 怎么定你自己的阈值
仓库不给数字。 下面是标定方法,完整表格在 templates/定级规则模板.md。
从哪几条已投过的岗位反推
不要凭空想一个阈值,从你已经做过的判断里反推。取三类样本,每类几条即可:
| 样本类型 | 它告诉你什么 |
|---|---|
| ① 投了、且对方有回应的 | 你的实际命中区在哪 |
| ② 投了、但事后后悔的 | 你漏写了哪条排除条件——后悔的那个理由,就是那条排除条件的原文 |
| ③ ⭐ 犹豫很久、最后没投、但一直惦记的 | 最有价值的一类。 它标出的是你真实的下沿,而不是你以为的下沿。你写下的排除条件往往比你真实的底线更严——这类样本是唯一能发现这件事的入口 |
方法:把这几条岗位按第一步抽取成表,然后问"要让我当时的判断成立,阈值得设在哪"。反推出来的阈值标 实践校准;凭感觉定的标 默认建议值;没定的保持 纯占位待校准。
先松后紧,不是先紧后松
默认先松。 理由是不对称的:
- 先紧的代价不可回收——被判「不投」的岗位不产生任何反馈(不投递、不接触、没有回应),于是阈值再也校不动了。这是一个自我封闭的错误:越紧,越看不见自己错在哪
- 先松的代价可回收——无非是多读几份 JD、多写几条"不投"的理由。这些恰好是下一轮校准的样本
唯一的例外:排除条件反过来,一开始就要写死、写紧。 松的是匹配度那一侧,不是排除那一侧。把这两侧搞反是最常见的误用——结果是"什么都投得出去,但底线也守不住"。
多久回头校一次
按新增样本量触发,不按时间。 时间到了但样本没增加,校准只是在重新解释同一批数据。
三个强制校准时机(不等样本量):
- 连续多条「强匹配」零回应 —— 要么是抽取错了,要么是阈值标在了一个和市场无关的位置
- 一条探路分支开启或关闭时 —— 分支的更宽阈值和主线阈值必须一起看,否则会漂移成两套互不相干的标准
- 你的必要条件本身变了 —— 这时旧阈值全部作废,回到
纯占位待校准,不要拿旧数字硬套新条件
来源标注
每条结论都要能一眼看出它是哪来的。三挡,不要第四挡:
| 标注 | 什么时候用 | 例 |
|---|---|---|
你给的 |
用户提供的事实与偏好 | 必要条件 / 排除条件 / 阈值 / 你对某条职责的解读 |
公开可查 |
JD 原文里的字段、公司公开信息 | 岗位名称、城市、薪资原文、招聘方公开介绍 |
我推测的 |
JD 没写、由 agent 推断的 | "看起来汇报给业务负责人""团队规模应该不大""这大概是个从 0 搭的岗位" |
每条 我推测的 必须附一句"要证实它,你该问谁 / 查什么"。 例:
汇报线:推测直接汇报给业务线负责人 ·
我推测的要证实它:面试时问"这个岗位向谁汇报,团队现在有几个人" —— 这类问题对方大概率能答,答不上来本身也是信号。
⭐ 推测项不能单独把一个岗位判成「不投」
一条标着 我推测的 的信息,不足以触发硬性排除条件。它可以让级别降一档并挂上"待确认",但不能直接关门。
⭐ 去向与必要条件的第三态同构,一条都不许少:降一档 + 挂待确认 + 升级为面试必问项(交给 interview-strategic-assessment)。
⛔ 只挂在"待确认"里、不给去向的推测项,到面试当天不会变成任何一个你问得出口的问题 —— 它会一直停在那里,而级别已经被它压低了。
理由:排除条件的杀伤力是短路式的、不可逆的(不投 = 没有反馈 = 阈值校不动)。用一个猜测去触发一个不可逆的动作,是这个模块最贵的错误形态。 这与 05-offer 的「推测项不参与排序」是同一条处理方式。
不对劲的时候
症状 → 最可能原因 → 你下一句该说什么
| 症状 | 最可能原因 | 你下一句该说什么 |
|---|---|---|
| ⭐ 所有岗位都判成「较匹配」 | 硬性排除条件没定,或全部用了默认值——于是没有任何东西能把岗位推到两端 | "先把你的必要条件和排除条件各写 2-3 条,再重跑一次" |
| 所有岗位都判成「不投」 | ① 排除条件写得比你的真实底线更严 ② 你在试新方向,但它读不到任何活跃探路分支,按主线阈值判 | "把这几条排除条件按'不满足我就真的不会去'再筛一遍;如果我在试新方向,先把这条探路分支说给你听" |
| 定级理由是"综合看比较匹配"这种一句话 | 抽取表没填完,或条件没编号——理由无处可追 | "把每条定级理由改成指向具体条件编号的形式;指不到就直接说指不到,我们回去看抽取表哪一栏是空的" |
| 抽取表里出现了 JD 原文里没有的措辞 | 抽取阶段做了评价或润色,原始信号已被洗掉 | "重新抽一次,这一栏只许贴原文句子;原文没写就写'原文未提及'" |
| 同一家公司两条岗位定级完全相反,但 JD 差别不大 | 核心职责 那一栏的两组区分没做,或薪资原文被折算过 |
"把两份 JD 的核心职责原文并排贴出来,我们看差在哪一句" |
| ⭐ 一批岗位因为"JD 没写"被判成「不投」 | 必要条件被当成两态判了——「原文未提及」被算成了「未满足」 | "把所有因为『原文未提及』判成不投的重判一遍:那是待确认项,不是判定——降一档 + 挂待确认 + 升级为面试必问,不投的只留原文能证伪的那些" |
| ⭐ 它问你"定级结果存哪",或者自己起了个文件名 | 落点规则没读到 | "定级结果一批一份,存 triage/<日期>-定级结果.md,日期和这批 JD 的 jobs/ 文件对齐;里面每条要有级别 + 能追到条件编号的理由 + 待确认项" |
| ⭐ 强匹配和较匹配总是分不开,或者忽然冒出一个上沿数字 | 加分条件的上沿还是 纯占位待校准(首轮的默认状态);后一种是它自己编了一个 |
"这一批先收敛成三级,只给批内相对排序,别编上沿;等我攒够可反推的样本再按第三步标定" |
三级自救阶梯
不要一出问题就把活推回给人。 上面那张表是 L3 的载体,不是"一遇事就回报"的入口。
| 级 | 什么时候到这一级 | 该做什么 | ⛔ 不该做什么 |
|---|---|---|---|
| L1 有现成的,直接走 | 抽取模板与定级规则命中 | 按规则执行,不问。已有条件能裁决的判断自己裁决 | 不为"确认一下"打断用户 |
| L2 没现成的,自己走通 + ⭐ 沉淀 | 上游文件缺 / 用户散着贴来一堆材料 / JD 格式怪 / 某一栏原文没写 | 自己把散料整理成抽取表;自己从口述里现场整理出最小版本的条件清单;拿不准就按更保守的一侧判并记下理由。走通之后写回去——条件清单存进 positioning.md、新的抽取线索补进模板、定级结果与理由记进 ledger.md |
⛔ 不把"这次绕过去了"只留在会话里。没沉淀 = 下次还得再试一遍 = 等于没走通 |
| L3 实在不行,才回报人 | L2 也走不通;或只有用户本人才有的事实(他的真实底线、他是不是在试新方向) | 输出 症状 + 已经试过什么 + 建议你做什么(给可选项) | ⛔ 不输出裸错误;⛔ 不说"请提供更多信息"这种没有指向的话;⛔ 不把 L2 该自己解决的整理工作推给用户 |
变更日志
- v0.1.2(来自
fixtures/jd-triage/首轮双向断言,只改判据表述,不动结构):两处都不是区分力失败,是首跑时 hit 侧无判据可依 / 落点缺失 ——- 三级收敛期的「降一档」没有取值:SKILL 只定义了"强匹配→较匹配 / 较匹配→保留但标注",而首轮的每个人都在三级收敛期(〔B 上沿〕未校准),那时只有「匹配」一档、降无可降。已写死口径:保留「匹配」+ 标注"关键项未确认" + 批内排到同等命中数之后,⛔ 不许因为降不动就把三态压回两态判「不投」。
- 排除条件侧的推测项没有去向:必要条件第三态明写"降一档 + 待确认 + 升级为面试必问项",而 §来源标注「推测项不能单独判「不投」」只写了前两样。已补齐第三样并写明理由 —— 只挂在待确认里、不给去向的推测项,到面试当天不会变成任何一个你问得出口的问题。
- v0.1.1(来自一次端到端实跑测试):必要条件补第三态「原文未提及」(降一档 + 待确认 + 面试必问,不据此判「不投」)· 定级结果有了明确落点
triage/<日期>-定级结果.md与四个位置的边界 · 补「加分条件表非空但上沿未校准」这一档(首轮默认状态)与它的解开条件 · 「最小可接受形态」写清拿得到 X / 拿不到 Y · 第一步点明「这条是怎么进来的」这一栏的用途。 - v0.1.0(首发,骨架):抽取纪律 + 四级定级短路顺序 + 阈值标定方法 + 探路分支更宽阈值与降级行为 + 三段式区块(开跑前 / 来源标注 / 不对劲的时候)+ 三级自救阶梯。所有阈值参数化留空(「不投」一栏不设缺口上限参数——必要条件未满足即不投,豁免只能来自显式的探路分支),完整定级模板排 v0.3。