skill-fit · v2.2.0 · 2026-10-01 · sha256 ab4da0c4ee0d628c
skill-fit v2.2.0A
Immutable. This exact content never changes and is served at /api/v1/blob/ab4da0c4ee0d628c.
---
name: skill-fit
description: >-
Skill fit (v2): derives a project's skill needs — tier T0–T4, evidence-backed requirement table
against a versioned lexicon (count bounded by tier), coverage four-ways (served /
in-catalog-unmounted / poor-fit / gap), and mount-tier advice with a two-value budget. Confirm gate
(ask-user; scripts/sf-gate.py apply/verify/rollback): mount/move from 2.1.0, unmount from 2.2.0.
Judges fit from skill bodies, not descriptions; catalog.yaml=supply, lexicon=demand. Writes
feedback (and applied log when executing); optional privacy-stripped upstream issue. USER-INVOKED
ONLY (/skill:skill-fit; no auto-invoke). Use to audit skill needs and, on confirm, apply reversible
mount/move/unmount. NOT for: authoring skills; deleting skill source files.
slug: skill-fit
version: 2.2.0
displayName: skill-fit
disable-model-invocation: true
---
# 技能需求管家(Skill Fit · v2)
## 角色
你是**技能需求管家**。给定一个项目,产出的第一主角不是"挂什么",而是**这个项目需要什么**——需求侧三环+确认门:
- **E1 需求表**(核心):从本仓工件推出需求陈述,每条带词条+强度+证据串;
- **E2 层级与预算**:每条需求给挂载层级建议(宿主/项目/用户/不挂)+预算两值+"为何不是另一层";
- **E4 确认门**(2.1.0 挂/移;**2.2.0 反挂载**):挂/移/反挂载经提案→确认→应用→校验→回滚(`scripts/sf-gate.py`;权限档见下);
- **E5 周期化**:重入时与上轮对表,只报差集与原因。
覆盖判定(需求 × 已装载 × 可供给 → 四落点)是需求表的下游视图。需求表与覆盖判定仍**只读写反馈记录**;挂/移/反挂载须用户确认口令后才改挂载点。**权限档**:现行恒 `ask-user`(白名单空,见 `references/auto-approve-whitelist.md`/Q-05);凭据·删除·外写永不进 auto-approve(INV-11)。
**两个单源,各有领地,不互换**:供给面(tier/when/requires/not/scope/面信号 `faces`/`tag_faces`/`not_vocab`)在真源仓 `catalog.yaml`+`retired.txt`;需求面(词条·证据形·档位适用性)在真源仓**需求词表**(版本化文件,定位见下)。registry 占用状态不落表,实时查(`scripts/skill-name-check.{sh,ps1}`,端点见 `references/registry-endpoints.md`)。
## 何时使用(**已挂载 · 仅用户 `/skill:skill-fit`**)
本技能已挂载,但 **agent 不得自主触发**(frontmatter `disable-model-invocation: true`)——只有用户显式调用时才执行:
- 用户键入 `/skill:skill-fit`(可带项目路径参数,默认当前目录)
- 用途:给项目做**需求侧**体检——需求表 / 覆盖四落点 / 层级与预算提案 / 与上轮的变化报告;用户确认后可经确认门挂/移/反挂载
- **其余全自动**:画像探测、定档、词条对表、覆盖判定、变化对表、写反馈记录(应用挂载须确认口令,不自动执行)
- 周期调度属**宿主**(loop/cron/CI);技能只提供**幂等重入**,不自我触发
## 硬约束(逐条挂 INV 编号=审计检查点)
1. **写出口闭集**——默认只写被画像项目根的反馈记录 `.skill-fit/feedback/…`。挂/移/反挂载另写 `.skill-fit/proposals/`+`applied.jsonl`,且**仅**经 `scripts/sf-gate.py`、确认口令闭集(`yes-this-one`/`no-and-why`/`later`;INV-08)后改符号链接;**禁止**手搓 `ln`/`rm` 绕过门禁。提案进报告须含前态/后态/校验法/回滚法四字段。**反挂载永远只移除挂载点、绝不删改真源**(INV-07)。不改技能正文、不改 catalog/词表(除非用户另令走其技能)。
2. **双单源**(INV-04)——推荐依据只来自 `catalog.yaml`+`retired.txt`(供给)与**词表**(需求);正文与本技能目录**不得存副本**(副本必然漂移)。**新增词条=提「新增待审」申请进报告,不自造规范名**;新增面/反触发条件=改 catalog,不改本正文。**形扩展纪律(A-3②,t000114⑤)**:词条证据形的现场扩展(未裁入词表的替代形/意图谓词)**不得**作立条依据——只可用在册形,或走「新增待审」草案;未裁先用=立条无效。词表版本戳必须写进报告头;**词表版本变了,旧轮结果作废、须整批重跑**(防跨轮静默漂移)。
3. **`requires` 先判且须实测·分两栏**(HC-4 取证的前提;实测纪律同源于 INV-01/02)——**机器级**(本机运行时/工具:实跑 `node --version` 等并记命令与取值)与**仓级**(本仓工件/依赖)**分开记、互不可推**(本机有某运行时 ≠ 本仓用它;本仓有锁文件 ≠ 本机装了包管理器);**禁止凭印象判缺失**。不满足 → 落点判"不适配"并给否因;未证 → **不得记"已承载"**,否因=requires 未证。
4. **证据纪律**(INV-01/02)——每条需求必带 ≥1 条**证据串**:`<仓内工件路径>@<本轮实测在位>`;**引证须现探**(禁止沿用上一轮记录、别仓记录或注释里的文件名)。**通件不作唯一证据**,名单为**闭集**:`.git/` · `README*` · `AGENTS.md` · `CLAUDE.md` · 锁文件 · `.gitignore` · `.editorconfig`;理由对任何仓成立 ⇒ 对任何仓不含信息。`.handoff/` 属**半通件**:存在性零信息;作为**需求本体**(账本封口、未决项治理)时按**内容**豁免——须载仓专属内容串且与本仓工件双撑。**内容句按句不按文件**:警示/事故/坑位类内容句落通件文件(CLAUDE.md 等)者按内容豁免、该文件不得独撑(与词表头注通则同步)。**证据资格(d000032-③)**:工作树或版本库**任一在位**即有效证据,未追踪件可作证据但须标「未追踪」;**git 历史零命中既不能证有也不能证无**(p000042 对称面);T0"无源码面"看工作树现状、不看 tracked 面。**名称字面不算证据**:目录/文件名含 ARCHIVE、legacy、test 等词不构成证据,须开内容验语义;产物面按构建配置的 outDir/dist 判定,证据形一律指源侧工件。**分发件不得独撑(C1,d000048)**:脚手架/pack 分发件——跨同源族逐字节同形者(`diff` 零差异/同 md5)——不得独撑一条需求的证据;须本仓专属件双撑,或按 06 §六 同源折算。**出口链(A-2,t000114⑤)**:无本仓专属双撑 **且** 不适用 §六 折算 ⇒ **不得立该条**;禁以未在位路径、他仓路径或「理应有」叙述作幻影引用凑证据。**缺失形必须配对**:"本仓无 X"须同时给出"该有 X 的位置存在且为空",否则"搜错了目录"与"真的没有"不可分。
5. **条数纪律**(INV-03)——需求条数 ∈ 该仓**仓型档区间**(定档见「画像探测」),越界即判失败:超上限=稀释——**淘汰序:强度升序(`形态可能` 先出)→ 同强度内按专属证据串条数降序 → 条数并列不进裁量、直接第三键:首条证据全路径字典序升序(d000032 确定性二键+d000037 并列归口钉死;compass/voyage 两例实战留痕),零裁量、可复现**。**第二键计数口径(A′,d000048)**:「专属证据串条数」=该行词条**在册证据形**中被命中的**要件数**(一件可撑多要件、一要件可由多件共证,两端折成要件;**通件与通件内容句不计**;`新增待审` 行按其证据形草案计)——**不是路径数、不是文件数**;报告须逐行自印要件清单(「要件①…@件」),否则第二键不可复算。**轮内单一需求计(C′,d000048)**:同一工件在同一轮内只计给一个需求(择配度最高者,并列按行号升序),其余行须另找件或降为弱撑;**择配须披露**(报告自印一行,范例:`C′:deploy.py→#4;verify.mjs→#3(配度=证据形主锚)`——「件→行#/配度」可复算即可,同义短句可;否则 C′ 不可复算)。被淘汰者必须在报告显式列"探过未立"(名称+一句证据),不得静默丢;低于下限=漏判(除非报告显式写"本仓此档内仅 N 条具备证据"并逐条可查)。**条数只能由名单得出**:任何段头计数一律先逐名、后计数;引用他段/他仓名单("同上")仅在被引用名单已在本记录内逐名给出时才算列全。
6. **承载判定读正文**(INV-05)——"某技能承载某需求"必须引用该技能**正文**证据(机制、步骤、工件要求),**非 description**(描述是已知最不可信信号)。**正文证据的范围**:`SKILL.md` 中 YAML frontmatter **以下**的机制/步骤/工件段落;**不含** frontmatter 机键(如 `disable-model-invocation`/`tier`/`name`——A3/C2,2026-09-28)。catalog 的 `not`/`scope` 数据继续用,但语义是**落点判定**(`not` 命中画像 → 落"不适配";`scope` 非本仓且主域已涉 → 落"不适配"并注否因),不再是"排除候选"的入口闸;否因取**四款闭集**(机制不符/绑定本仓没有的载体/正文硬编码他仓路径/`requires` 未证或未满足)。
7. **覆盖四落点互斥穷尽**(INV-06)——每条需求恰一落点;"不适配"落点须带**否因说明**(不占独立落点、不得双计)。同一需求"既承载又称缺"=自相矛盾,比漏判更伤信任。
8. **机器形态是输入不是结论**(INV-12)——`machine` 块(如"用户级全量常驻")只影响"库内有未挂"落点是否为空集;层级判定必须独立给因(通用性×项目专属×预算),**不得拿本机习惯当答案**。
9. **独立性**(INV-13)——生成需求表的执行者不得自评审该表;批量同模板(画像/结构逐字相同仅换身份字段)必须标"**模板复用,独立性=1**",防止一次判断冒充 N 个校准信号。
10. **画像自指前置**(INV-15)——被体检仓自身是技能库宿主(仓根有 `catalog.yaml` 或大量 `<name>/SKILL.md`)时,**先把 catalog 技能目录与仓内技能目录从面探测与工件清单中剔除**再建面像,否则技能自带的 `docs/`、`tests/` 冒充本仓的面。
11. **重入纪律**(INV-14)——同一条需求结论未变时,**只进变化报告的"未变"计数**,不重复铺陈。**比较历史产出按其生成时点取快照**(工作树是当下的,历史判断是当时的——拿今态驳旧论即冤案);探测时刻不在位的工件不得当证据回溯引用。
12. **反馈不撒谎 / 脱敏 / 渠道无关**(工程纪律,无 INV 号——设计包 06 §六统计规则)——记录采纳/否决如实,禁"待回填"占位;投递 GitHub Issue 前先展示给用户确认,报告不含本机路径/仓库名/凭据/代码内容;registry/安装/投递端点取自 `references/registry-endpoints.md`,不假设单一渠道、不臆造端点;**registry 措辞闭集**:本地真源链入一律"查重不适用(本地真源)"(脚本可实跑时也照用)、外部已核验"占用已核验"、外部无法核验"占用未核验"。
## 数据源定位(通用发行版 · 自包含)
安装形态可能是整仓安装 / 单技能拷贝 / 用户级或项目级**符号链接挂载**。按序定位:
1. **先规范化本技能目录**:`DIR = readlink -f <本技能目录>`(macOS 用 `realpath`;对符号链接与真实目录**均适用且幂等**,无分支)。之后所有同级/上级引用一律以 `DIR` 为基准;**禁止**以挂载位文本 `../` 作基准(文本拼接会落进链接父目录而错过真源仓根)。
2. **`catalog.yaml`**(自上而下取第一个存在):`dirname(DIR)/catalog.yaml`(整仓安装)→ `<项目根>/catalog.yaml` → `<项目根>/.agents/skills/catalog.yaml`。`retired.txt` 取**与命中的 catalog 同目录**(无则视为无退役)。
3. **词表(需求单源)**:`dirname(DIR)/design/skill-fit-v2/_exploration/lexicon-v0.md`(**版本号取词表文件头注,正文与报告不写死**)→ 项目自带路径。**取不到词表 → 降级**:按 01 式命名自出词条名并在报告显式声明「词表缺失,本次词条为局部命名,新增未注册」——**降级可见,不静默**。
4. **都没有 catalog → 降级为按 frontmatter 推断**(`description` 场景线索当 `when`、`compatibility` 当 `requires`),显式声明,建议补 catalog。
5. **registry 查重**:报"脚本缺失"前须确认 `dirname(DIR)/scripts/skill-name-check.sh` 确实不存在;措辞取上条 HC-12 闭集。
## 项目画像探测(BC-1 · 只出事实,不出判断)
| 信号 | 探测方式(只读) |
|------|------------------|
| 语言/框架/构建链 | `package.json` / `pyproject.toml` / `go.mod` / `Cargo.toml` / `*.csproj` / `Makefile` / `build.sh`;monorepo 看 `workspaces` 与各包根 |
| 面(faces) | **各面信号与路径只有一份,在 catalog `faces`(正文不复写面名与路径)**;逐面按 signals 探,任一命中即该面存在;一律**本轮实存** |
| VCS / 已有挂载 / 仓标识 | `.git` 在位?工作树状态;用户级 `~/.agents/skills/` 与项目级 `.agents/skills/`(含符号链接指向);`git remote get-url origin`/目录名(供 catalog `scope` 对照) |
| 仓内技能 | `.cursor/skills/`、`skills/` 等仓内技能目录(**非 catalog**):登记名字与位置,供承载判定与双源漂移检查 |
| requires 两栏 | HC-3:机器级/仓级各自实跑,记命令与取值 |
**证据口径(探测纪律;完整排除表在 catalog `faces` 头注)**:① **面点亮**只认路径与文件名——文件**内容**里提到某词不是点亮证据(防审计报告/散文误亮);② **面不得单独决定档位(A-1)**:定档消费的面(尤 T1/T2 的「测试面」)在路径命中后须开**内容级锚**验语义(断言/用例入口/测试框架 import 等可 grep 锚;空壳/仅文件名含 test 不算)——无内容锚则该面按缺失处理,与 HC-4「名称字面不算证据」同缝;③ 四类位置不作证据:归档 · 审计与反馈产物 · 依赖与构建产物 · 示例夹具;④ 技能库型仓只看仓根级工件(HC-10 自指前置);⑤ 现探不沿用。边界情形("仅有路由、无契约工件")记**未定**→ 对应面按缺失处理,不默认命中。
### 仓型档(TierClassified · 条数区间的来源 · 判据全部可机检)
四信号 + 领域数。**CI 只作加成、不单独跳级**;模糊信号(关键词扫、裸 shebang"看着像")**不得进判据**,宁缺——shebang 仅经 runform 枚举的共现形(具名 CLI 形)才算信号。
| 信号 | 定义(可机检) |
|---|---|
| `源文件数` | 按**包根起算、全树剪通件**(不以目录深度截断),并报第二信号"实源行数";扩展名集覆盖该仓构建语言(含 `.m/.mm/.h/.inc` 等参与构建件) |
| `CI` | `.github/workflows/*` 或 `.gitlab-ci.yml` 存在;剪枝只剪 `.git` 精确仓元目录——**不得把 `.github` 一起剪掉**(CI 恒 0 假数) |
| `runform`(产品自身入口) | **任一形即真(d000032-③ 枚举)**:`package.json` `bin`(单独即够)/`scripts.start` **须**服务框架依赖同现/`console_scripts` 或 `[project.scripts]` **非空条目表**即够/裸标准库 http 服务入口/`electron` 依赖/**桌面壳三件同现**(CFBundle*/bundle-id 族键+构建产 `.app`/`.dmg` 目标+`open -a`/LaunchAgent 启动手段——缺一不算)/**编译型服务入口**(主包 main 入口〔Go `func main`/Rust `fn main`/C 系 `int main`〕**且**源码 import 标准库 server 或服务框架带监听语义、或带 `serve`/`exec` 类 CLI 子命令——两信号共现,孤立 main 不算)/**调度载体形**(systemd `.service`/`.timer`、cron 行/crontab 件、LaunchAgent plist 任一**且**仓内驱动脚本共现——孤立 unit 不算;**驱动脚本**=被该 unit/cron/plist 的 `ExecStart`/`command`/等价命令字段以**路径字面量**引用的仓内可执行入口,非任意 `scripts/*`)/**具名 CLI 形**(shebang 可执行脚本**且**被 `package.json` `scripts` 具名命令或构建配置声明为入口——裸 shebang 仍不算);d000035 增后三形(全批 N8 七仓素材),各配共现闸防过收 |
| `frozen`(封版/夹具) | **内容谓词**+**终态件闭集**:`ARCHIVED.md` · `publish-hold.txt` · 交接件 `exit` 槽——须**非空且载完结性表述**(归档/封版/不再维护/被替代类;**非空但写"进行中 DoD/目标"的不算封版**,d000032-③);**等效账本形**(plan-progress/收尾账本类件——**指名者闭集**(仓根、文件名全等)=`AGENTS.md` · `CLAUDE.md` · `CONTRIBUTING.md`;只认其中显式指名;`README*`/pack 内说明/机制级路径**不入组**,d000037 严格读+t000114② 闭集枚举)同入本组,判据统一为内容谓词——非空且载完结性表述才算,**进行中未决账本≠封版**(d000033-丁③);仅一条出口验证命令/空壳不算;README/目录名关键词不算 |
| 档 | 判据 | 条数区间 |
|---|---|---|
| **T0** 空夹具/纯文档/封版 | `frozen` 或无源码面 | **0–2**(0 合法:画像无需要信号时不得凑数) |
| **T1** 单用途小工具 | 源文件 ≤30 且 `runform` 无 且 无测试面 且 无构建链(**30 属 T1**;`源文件数`=全仓口径含测试件,第二信号"实源行数"按包根与全树两值并报;**测试面=路径命中+内容级锚**,见上「证据口径」②) | **1–4**(只评每条有证据,不评条数不够) |
| **T2** 插件/库 | (有构建链 或 有测试面 或 源文件>30)且 `runform` 无——含**免编译直跑工具仓**(strip-only/纯标准库+测试面,d000035 全批 N4 四仓死区修法;**测试面**同 T1 内容锚) | **3–6** |
| **T3** 应用(单域) | `runform` 有 且 领域专属证据仅 1 域 | **5–9** |
| **T4** 多域/平台 | `runform` 有 且 ≥2 域各有专属证据 | **7–14**(超 14 按域分组,每组自带证据串) |
**定档顺序(d000035)**:按 **T0→T1→T2→T3→T4** 自上而下逐档测判据,**首中即定**——纯文档仓双真(T0"无源码面"与 T1 计数谓词)由本序落 T0,不留裁量;T3/T4 中首中者再按领域数细分。T1/T2 构成式互斥穷尽(无 runform 全集按 构建链/测试面/源>30 三信号切分),四档无死区。
**领域数(T3/T4 唯一分界)**:数"互不共享工件的**专属证据形集合**"≥2 即多域。细则(P-07 补丁,S-3 双审计校准):
- **共享边只认枚举型共引**:构建/**投递**/装配/验证脚本**或清单文件**以**路径字面量**引用另一集合的产品源工件(脚本/config/清单内路径字符串可 grep);**不计为共享边**(正向定义与 06 §一之补逐字同版;d000032-④ 扩展):包间源码 import/require 依赖边;monorepo 脚手架清单(根 `workspaces`、根 tsconfig、根 CI 对统一入口的单条调用);**交付打包清单的打包枚举**(`files`/MANIFEST/spec 类——打包必然共引全部工件,属操作性质不表产品耦合);一操作脚本被 ≥2 域集共调时并入各服务域自身、不充当域间共享边。
- 纯**操作环节**(构建/投递/安装/卸载/预算闸)与其所服务的产物同域,不另立域;域须自带**产品性**专属证据(面向用户/外部的行为、度量)。
- README/docs 的叙述**不算**域标记,必须有工件(测试分层、构建配置节、独立入口目录、专属脚本)在位;发布/营销叙事内容树(landing、博客、领域文档、ADR)归其所服务的产品域,不参与共引判定。
- 共享配置文件按 `project`/子目录粒度切分归属,不得两域共引同一文件。
**报告头必须自印档位与四信号取值**(如 `仓型档=T3(源文件 4 件/437 行 · CI 0 · runform 桌面壳三件同现 · frozen 无 · 领域数 1)`)——不自印则"落在区间内"不可审。
## 需求推导(BC-2 · 核心域)
**先定档、后出表(义务顺序,AC-09-A1 的前提)**:按「仓型档」小节完成四信号与领域数判定并写进报告头,再产出需求表(条数区间已被锁定,取舍规则见 HC-5)。逐条需求格式:**一句「谁(角色/流程)在本仓被什么卡住或要完成什么」+ 强度 + 证据串 + 词条名**。
- **词条对表**:先与词表(HC-2 定位)对名——命中既有词条则用规范名(同义异名即设计偏离);对不上但需求真实 → 标「**新增待审**」并附**证据形草案**(哪些工件类型算支撑)与首次出现的仓型档;本技能**不直接改词表**,新增准入走 S-3(双审计+用户裁定)。
- **强度三值(闭集)**:`在做`(本仓正在投入,工件/账本有痕)/`将做`(缺口已知、载体在位而未启动)/`形态可能`(该仓型大概率需要,本仓证据只到形态触发)。**通件不构成任何强度**。
- **单仓特例带戳**:词条标注「独立·暂不复用」者(词表 M-1 戳),可列为需求,但**不产生推荐动作**——覆盖判定照做,提案不引用。
- **词条"适用档位"列是检索先验,不是准入闸**(S-3 实测裁定):需求按本仓证据成立,**不因词条档位列与本仓档位不符而剔除**(档位只约束总条数,INV-03);档外命中如实记录,供批跑回校档位列。
- **观察名单词条(O-xx)**:本仓证据成立时照列需求表,词条栏写「O-xx(观察,未入表)」——计入条数、不计词表命中率、不产生提案;其转正判据见词表 §五。
- **样本源自反披露**(CF-6,批跑统计防污染):被画像仓恰为该词条的来源仓时,报告头自印「源自反=<词条清单>」——其 100% 命中不证明词表对非样本仓的覆盖,批跑命中率与转正线统计须剔除后计。
- 条数受 INV-03 区间约束;事实缺 → 记"未探到",**不得凭空造需求**(BC-1 只供事实)。
- 档位判据本身是被测对象:跑完把"定档犹豫/两读"如实写入反馈记录(AC-09 素材)。
## 覆盖判定(BC-3 · 核心域)
需求 × 已装载 × 可供给(2.0.0=库内+仓内技能;外部候选 2.3.0 起)→ 每条需求**恰一落点**。**候选圈定与承载尺度(S-3 试点收口;判问补死 d000033-丁②)**:候选=**正文机制可能对本需求证据形的失败模式生效**的 catalog 项——`primary`/`when` 只作检索线索,不作圈定与裁决依据。**圈定判问(唯一可机检形式)**:「若该技能正文要求的载体在本仓存在,其机制是否原样命中本需求证据形的失败模式?」——是→同求,入圈;仅话题相邻(载体补齐后机制仍打不中该失败模式)→不入圈;**「载体缺位」本身不影响圈定**(那是否因/落点域的事)。**"已承载"=其正文机制行命中证据形的失败模式**(话题相邻不算,须引具体机制行);有候选且被否 → 不适配;**无任何候选 → 缺口**(圈法全文唯一,无第二种合法判法)。
| 落点 | 判据(读正文,INV-05) | 动作语义(2.0.0 全为文本提案) |
|---|---|---|
| **已承载** | 已挂载技能(用户级/项目级任一)正文机制与需求证据形对得上 | 保持(无动作) |
| **库内有未挂** | 按上段唯一圈法存在候选且**正文复核通过**+`requires` 满足(`tier=project` 优先给项目级建议——这是层级倾向,不是圈定依据) | 挂/移层级提案的唯一来源(目标层级见下节) |
| **库内有但不适配** | 有候选但被正文复核/`requires`/`not`/`scope` 否掉——逐条给**否因说明**(**否因闭集四款**:机制不符/绑定本仓没有的载体/正文硬编码他仓路径/`requires` 未证或未满足)。归属判不清的需求不靠"待判"标签表达:以强度 `形态可能` 记入需求表(07 处置口径)。**"泛化度高"不是否因**,它是强度/证据问题 | 不提案 |
| **缺口** | 无任何技能承载(库内+仓内技能皆无)——含解决态需求(带戳,见下) | 无承载:明说"暂无技能,可后补",喂账本 actions 立项通道(不新开记账);解决态带戳:**不喂立项**,只进词表健康检查与 AC-03 剔除 |
- **仓内技能承载**:能力已由仓内自有**技能**承载 → 不算缺口,落"已承载(载体=仓内技能 <名>)";同名/同能力多处并存 → 标"双源漂移风险"(只读登记)。
- **解决态需求(d000028-②/d000031/d000032-② 全链口径)——落点与戳正交**:落点**只看候选维**——catalog 有候选且被正文否 → "不适配"(否因照写),无候选 → "缺口";解决态戳**只挂词条列、只管消费通道**:带戳行不喂立项通道(账本 actions)、计入 AC-03 剔除、**禁止**写"可后补"(读者会误推新技能)。两维竞合时不再二选一:一条需求可以同时是"不适配+解决态戳"。需求表侧与覆盖表侧的戳是同一个 M-2 戳,写法一致。**戳域=轮级实例判定(d000033-丁①)**:戳不预存于词表簇级、不沿用上轮——本轮现探见「仓内工件已解决该需求」即**当轮必带戳**(漏戳=违例,等同缺失形漏配对);「仓内已解决」却写成无戳"缺口·可后补"是最重违例形态(伪立项入口)。
- **缺口与提案名单互查**:所列缺口若其能力已被本轮任一提案覆盖(读正文核实)→ 改标"已由 `<name>` 承载"。
- **缺口 0 是自然结果**:画像无需要信号时该段即空——不新开桶、不升格仓型为独立裁决,只作说明性括注。
- 反挂载候选:**判据从现源推导,不以 catalog `serves` 列为裁决替代**(已入册对=机检加速器;未入册/存疑对不阻下列两条件,仍走 INV-05 正文复核)——挂载中技能满足两条才入列:① 未出现在本轮覆盖表任何"已承载"载体栏;② 读其正文,其声称的能力域在本仓**无任何需求命中其证据形**(一次正文核读,不凭 description 臆判)。全量常驻机上此段登记范围=该过滤器筛余,**不逐名列无关项**(整层常驻清单=违 INV-14 精神的噪音)。
## 层级与预算(BC-4 之 E2 · 提案;E4 确认后可执行)
对"库内有未挂"者逐条出**提案**;每条层级建议必带三件:**预算两值+为何不是另一层+动作三答**(作用于哪个层级·可逆否·如何校验——答不全不得出现在报告里)。
| 层级 | 判据(三者合看,不任一即判) |
|---|---|
| **宿主编排层**(客户端有项目技能目录/插件位时) | 技能机制绑定该客户端(工具名/事件/API) |
| **项目级** | 需求带本仓专属证据(按 HC-5 第二键 **A′** 要件命中数计,**C′** 轮内单一需求计;不得按路径数/文件数)**且** 通用性低(换仓大概率不成立);只进该项目上下文 |
| **用户级** | 需求通用 **或** 强度=`形态可能` 的宽口径候选(宁放用户级,不污染项目级);进每个项目的固定开销 |
| **不挂(保持)** | 其余落点自然无提案 |
- **来源集为空的自然出口**(S-3 试点收口):"库内有未挂"为空(如全量常驻机)→ 本节输出「提案 0 条(来源集空:<因>)」即为完整交付,**不是缺陷、不强行演练**;预算两值无对象不出数。
- **预算两值并报**:目录体积 + 正文字节(实测),供层级成本比较;无实测不得编数。**量级写法**(AC-05/Q-04):`~4 KB / ~40 KB / ~400 KB` 为**口语示例,非闭集枚举**——报就近十进制 KB(或其它便于比较的量级),**须过 ≤2×**;不得因「未命中三档字面」拒报或硬贴远离实测的档。
- 目标层级默认按 catalog `tier` 初判(project→项目级;universal/on-demand→用户级),**但 INV-12 要求独立给因**——与初判不同时必须写明理由。
- 提案字段集:`动作(挂/移层级) · 目标层级 · 前态(实测) · 后态 · 校验法 · 回滚法 · 风险档 · 权限档(恒 ask-user,直至 Q-05 白名单非空)`。一条提案一个原子变更(无"部分成功"态)。回滚法按 04 §五 表:挂=移除该挂载点、校验=路径解析到预期真源且技能清单可见。
- **执行(E4 · 2.2.0)**:用户对报告中某条提案表态后,用本技能目录下 `scripts/sf-gate.py`:`draft` → `confirm --token <口令>` → `apply` → `verify`;失败或演练后 `rollback`。动作=`mount`/`move`/`unmount`。层级目录:项目=`<仓根>/.agents/skills/`;用户=`~/.agents/skills/`;宿主须显式 `--host-root`(无默认,防误伤)。每次执行追加 `applied.jsonl`(含 `prev`,INV-09)。
- **去重不改条数**:历史已裁定"不执行/刻意保留"的条目照列并标"历史已裁定·不重复推动",另给未裁定计数。
## 周期化与反馈(BC-7 · E5)
- **本地记录**(唯一写出口):`<被画像项目根>/.skill-fit/feedback/<YYYY-MM-DD>-<项目名>[-rN].md`——基准=被画像项目根(**非 cwd**);日期=实际运行日;`<项目名>`=项目根目录名原样(保大小写)。**同日多轮=并存追加**(首轮无后缀,次轮起 `-r2`/`-r3`…;机检认文件名 `-r\d+`);**禁止覆盖**同日前缀已有文件。内容=画像信号+需求表+覆盖表+提案+**变化报告**+采纳四态+**词表信号行**;执行中被契约卡住的,另加**「契约反馈」段**(问题编号+证据行号,不改判据)。
- **重入**:先读同日(或最近日期)前缀下**最大 `-rN`** 那一份(无后缀视为 r1)为基线 → 产出**变化报告**五类:新增/消失/强度变/落点变/提案状态变;未变项只进计数(INV-14)。比较历史判断按其**生成时点**取状态(HC-11)。
- **口径换代("尺变")归口**:面信号/词条表/档位判据等**尺子本身变了**导致的跨轮反转,不归五类,统一记变化报告的**「口径声明」行**(旧结论→新结论→变的尺);世界没变、尺变了,不得伪装成"落点变"。
- **跨契约代历史**(v1 三清单结构)与 v2 需求表**不可逐条对表**:报告头首检字段写「v2 全量首检(v1 历史结构异构不作逐条基线,INV-04)」,五类变化自本轮起算。词表/契约**换版作废不是采纳裁决**——作废处置记变化报告"口径声明"行,**不进四态闭集**(四态只作用于本轮提案)。
- **词表观察信号**(S-3 试点收口):反馈文件须含一行「词表信号:<词条/O-id>@<本仓>·<第二仓命中·形态扩展·命中率反证…>」——带戳词条第二仓命中、档外命中、O-xx 转正线数据都经此行汇总给词表治理(BC-5),**不直接改词表**。
- **采纳状态闭集四态**(逐条记,禁占位):`采纳·已执行`(该层级实见链接)·`采纳·不执行`(判对但不动)·`否决·附因<为何>`·`未裁定`(用户当轮确实未表态)。采纳与否看用户裁"建议对不对",与是否动手执行是两轴;下一轮据此校准 catalog `primary/not/requires` 与词表(经 S-3 通道)。
- **批量跑(一轮 ≥3 仓 · 用户显式授权方可批量)**三件自报:① `仓数=k · distinct(需求表结构)=d`——各仓需求表**词条集合**去重种类数,**d 由批次汇总者批末统一回填**(单仓写"待批后回填",禁止凭猜填数);d 明显小于 k=判据不敏感,须点名(同仓型可接受/异仓型须复核;同仓型=同语言+同构建链+同测试栈,不得凭感觉豁免)。② 同模板标"独立性=1"(HC-9)。③ 跨仓引用须被引用名单逐名在本记录内(HC-5)。
- **对外投递**:`--share` 时生成脱敏报告,投递目标、`gh` 命令与无 `gh` 时的降级打法**均取 `references/registry-endpoints.md`**(仓名只在该表维护,正文不复写);提交前必须展示给用户确认。
## 输出格式
**表格纪律**:markdown 表格单元格内**不得出现未转义竖线**(`|`);多值一律用「、」或 `<br>`(COV-COLS:未转义 `|` 会错位列,机检按列跳过错位行)。
```
## Skill Fit — <项目名>
仓型档=<T?(源文件 n 件/m 行 · CI x · runform 取值 · frozen 取值 · 领域数 n)>
词表版本=<取自词表文件头注·报告头自印当轮实取值 / 缺失降级声明> · catalog updated=<取 catalog `updated:` 字段值>
机器形态=<用户级 a / 项目级 b(输入声明,非结论)> · 数据源=<真源/降级> · 首检=<是|否(历史对齐至 <日期>)|v2 全量首检(历史结构异构)> · 源自反=<本仓为词条来源仓的清单/无>
### 需求表(n 条,档内)
| # | 需求陈述 | 强度 | 词条(戳枚举:`新增待审`/`独立·暂不复用`/`解决态`/`O-xx(观察,未入表)`) | 证据串(路径@实测在位,通件不独撑;A′ 要件清单自印) |
**C′**(有共件时必出):`C′:<件>→#<行>;…(配度=<一句>)`
### 覆盖表(每条恰一落点;Σ四落点 = 需求条数,由名单数出)
| 需求 | 落点 | 承载/候选 | 正文证据(引用该技能正文要点,非 description) | 否因说明(四款闭集) | 词条戳(M-2 解决态/M-1 带戳/O-xx) |
### 层级与预算(提案 · 文本级)
- <name> — 层级=<项目/用户/宿主>;预算=<目录体积 + 正文字节 两值>;为何不是另一层=<一句>;前态/后态/校验/回滚=<四字段>;风险档=<低/中/高>;权限档=ask-user
- (2.0.0 无执行;"历史已裁定·不重复推动" n 条照列)
### 缺口(n)
- <能力> — 无承载(可后补)/已由 <name> 承载/**解决态带戳形**:`<能力> —(M-2 解决态 · 仓内工件 <路径>)`,此形**禁写"可后补"**;n=0 仍出段,可加说明性括注
### 仓内技能(非 catalog)(n)
- <name> — 位置=<路径>;<重名 → 双源漂移风险>
### 反挂载候选(登记 · 动作经 sf-gate `unmount`)
- <name> — 未出现于任何"已承载"载体栏,且正文能力域在本仓无需求命中其证据形:<一句>
### 变化报告(重入时;首检写"全量=首检")
- 新增 <n>(列名)· 消失 <n>(列名+因)· 强度变 <n> · 落点变 <n> · 提案状态变 <n> · 未变 <n>(只计数,INV-14)
- 口径声明(尺变行,可选):<旧结论→新结论|变的尺(面信号/词条表/判据版本)>
### 反馈
- 逐条四态(闭集,禁"待回填");批量加:仓数=k · distinct=d(待批末回填)· 模板复用标独立性=1
```
## 反模式(挂 INV 编号=对应硬约束的违例形态;随退役机制消失的旧反模式不得回潮)
- **拿供给端标签投影当需求**(旧"匹配契约/证据分档"整段已退役):跳过需求表直接按 `when` 命中出清单——需求必须**从本仓事实生成**(D-01),词条只是命名对齐,不是入口闸(INV-01/02/06)
- 通件独撑证据 · 缺失形不配对 · 引证沿用旧记录(INV-01/02);`.handoff/` 存在性当需求证据(须按内容双撑)
- 凭印象判 `requires` 缺失 / 两栏互推(HC-3)
- 需求条数越档:超上限稀释、低于下限静默漏判(INV-03);计数凭记忆手写、"同上"隐去条目(HC-5)
- 拿 description 当承载依据(INV-05);"留在候选顺手加标注"=把裁决推给用户(落点唯一,INV-06)
- 把机器形态当层级结论(INV-12);把"全量常驻"当待整改
- 技能库宿主仓未先剔技能目录就建面像(INV-15);把技能自带示例夹具/测试目录当本仓工件
- 自评需求表(INV-13);批量不同报 distinct 与独立性——一次判断冒充 N 个观察
- 重入时把未变需求重新铺陈(INV-14);**拿今天的工作树驳昨天的记录**(历史判断按生成时点取快照,p000042)
- 词表版本不写头注、换版后拿旧轮结果充数(INV-04);自造规范词条名不经"新增待审"(双源漂移的入口)
- 在正文/技能目录里抄面信号、词条表、not 判据回显(单源纪律);把 catalog 或词表复制进技能目录
- 缺口与提案名单自相矛盾;仓内技能承载误报缺口;重名不标双源漂移;"缺口 0"写成特例判据
- 提案缺四字段(前态/后态/校验/回滚)就进报告;一条提案多动作;"删除/摘除"混进动作词表(动作闭集:挂/移层级/反挂载/保持;删除类须用户显式授权且违反 INV-07 即停)
- registry 措辞自造("占用已核验"指本地真源即违例);未经确认投递 Issue / 报告未脱敏;反馈记录写进 cwd 落错仓、美化或漏记否决
- agent 自主触发本技能;未确认口令擅自动挂载点(越权——执行自 2.1.0/反挂载自 2.2.0,且逐条确认)
## 完成标准(自检=AC 清单;机检项尽量脚本化,未脚本化前人工对表)
- [ ] 由用户显式触发;默认只写反馈记录;挂/移/反挂载仅经 sf-gate+确认口令(HC-1)
- [ ] 报告头自印:档位+四信号取值+词表版本戳(实取值,非写死)+机器形态输入声明(INV-04/12)
- [ ] 画像:证据口径四条已守;面判定与 not 判据全部取自 catalog 单源、本轮现探(INV-15/02)
- [ ] 需求表:每条带证据串且实测在位、通件不独撑、缺失形配对(AC-01 违例 0,INV-01/02);条数在档内(AC-10,INV-03);词条名与词表对齐或标"新增待审+证据形草案";强度三值闭集
- [ ] 覆盖表:每条恰一落点、Σ四落点=条数由名单数出(INV-06);"已承载/不适配"判定引用**技能正文**证据(INV-05);"不适配"以候选真实存在且被否为前提(无候选者为缺口,未涉者不得写"不适配");解决态需求按候选维落点(无候选→缺口/有候选被否→不适配)+词条列带 M-2 戳,均不写"可后补"、不入立项通道(d000032-②)
- [ ] 层级提案:每条带预算两值+"为何不是另一层"+四字段(前态/后态/校验/回滚)(AC-05)
- [ ] 若执行挂/移/反挂载:口令闭集确认 → sf-gate apply/verify;回滚演练或校验失败已 rollback;真源未删(INV-07/08/09)
- [ ] 缺口与提案名单互查无矛盾;仓内技能已扫、承载不误报、重名已标
- [ ] 重入:变化报告五类齐、未变项只计数(INV-14);历史比较按生成时点取快照
- [ ] 批量(≥3 仓):`仓数·distinct` 与"独立性=1"已自报(AC-06);跨仓引用逐名
- [ ] 采纳四态闭集、无占位;`--share` 经用户确认且脱敏
- [ ] 本技能未自评审本表(INV-13);定档犹豫/两读与词条"拿不准"如实入反馈记录(AC-09 素材)
## 方法论来源(时间线)
- Agent Skills 规范可选字段(`compatibility`/`disable-model-invocation`)、Progressive disclosure——见 agentskills.io 与宿主字段表;运维口径:catalog 单源+registry 实时查
- **v1 沿革(摘要,全文见 git 与 `audits/`)**:2026-09-19 定位/渠道收口 → 09-20 匹配契约化·动作基准·边界裁决·catalog v2 数据驱动(B14–B21)→ 09-21 反馈语料双层审计(现探/现算/裁决表/四态)→ 09-22 画像信号数据驱动(faces/tag_faces/not_vocab 迁 catalog)与正文卫生 → 09-22 **实效审计**(50 仓语料:算术与纪律属实、**区分度不成立**——通用标签+布尔面判据与仓型无关)→ 09-23 **v1.8.0 契约收口**(证据分档/两栏/现探/名单计数/自报,作为退役前最后补丁)
- **2026-09-23 · 2.0.0 定位重构**:从"供给端标签匹配"改为"需求侧生命周期管家"(E1 需求表+E2 层级预算+E5 周期化,全程只读)。设计包见真源仓 `design/skill-fit-v2/`(00 追踪表 · 01 统一语言 · 02 领域模型 · 03 聚合与 INV · 04 交互与回滚 · 05 事件风暴 · 06 验收判据 · 07 v1 处置表 · 08 路线图);需求词表 `lexicon=v0.0` 经五仓样本+S-3 同模板双审计(决策 d000028/d000030)生效;档位判据含 P-01…P-07 七处实测定档修补。三档权限(ask-user/auto-approve/yolo)为终版契约,**实装自 2.1.0 起、逐版开闸**(08 前置:需求侧达标才允许动作提案)。
- **2026-09-28 · 2.1.0 E4 开闸**:`scripts/sf-gate.py` 实装挂/移层级确认门(ask-user);Q-05 白名单空表成文;本仓(agent-skills)原点挂+移回滚演练 PASS(`audits/2026-09-28-skill-fit-e4-gate-pilot.md`)。
- **2026-09-28 · 2.2.0 反挂载开闸**:`sf-gate.py` 增 `unmount`(只卸符号链接,INV-07 真源不动);selfcheck 含挂→卸→回滚;候选登记判据仍走现源两条件(serves=加速器)。
- **2026-09-28 · 2.1.1 A1–A3/C2**:serves 双签设计内收口(从严 L-14/按形 L-26/正文证据不含 frontmatter 机键);catalog 出 delegated-research×L-26、在册三对;INV-05 钉 C2 句。方案 `audits/2026-09-28-serves-design-faithful.md`。
- **2026-09-28 · 2.1.2 t000114②⑤**:frozen 指名者闭集枚举(`AGENTS.md`·`CLAUDE.md`·`CONTRIBUTING.md`);C1 出口链+C′ 择配披露;形扩展须已裁入表;调度载体「驱动脚本」=ExecStart/command 路径字面量。HC-5「全」字已于 2.0.7 在位,本版不重开。
- **2026-09-28 · 2.1.3 设计债清理**:AC-05 量级三档钉「示例非闭集」;C′ 输出模板加「件→行#」范例;`auto-approve-whitelist.md` 补 §5 表头机制。maintenance「serves L-26」散文按 S1 不追史。