---
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 不追史。
