{
  "subject": "tvu-ds",
  "repoPath": "~/Documents/AICoding/VS_Code/tvu-design-system",
  "pinnedSha": "c1db57b8759faaf3bf89ef89d1eb21caec369680",
  "pinnedShaShort": "c1db57b8",
  "pinnedAt": "2026-08-26",
  "readOnlyWorktree": "~/.ai-ds-lab/pins/tvu-ds-c1db57b8",
  "note": "lab 永不写 DS 真源（spec §8）。下面这些 worktree 是 --detach 的只读快照。⚠️ 刻意放在 DS 工作树之外：仓内 worktree 会被 DS 自己的 glob 算成重影（勘误 E3；DS 侧 410cd11b 同类），并行时是污染源。",
  "pinHistory": [
    {
      "sha": "71ac2711f7f18ac1eba521bdd5999f66659dbf82",
      "short": "71ac2711",
      "role": "P0 — 第一轮 + 第二轮第 8 步的基线",
      "worktree": "~/.ai-ds-lab/pins/tvu-ds-71ac2711",
      "pinnedAt": "2026-08-24",
      "keep": true,
      "whyKeep": "⛔ 别拆。first-round-baseline / gate-mount-inventory / retrospection-s1..s3 / escape-rate / context-cost 全部读数以它为主键（§5.2），拆了就不可复现。"
    },
    {
      "sha": "339a72bf83b6920bfcb2f591aae6afdb38e73f8d",
      "short": "339a72bf",
      "role": "P1 — 第 7/7b 步落地 commit 的父提交 = 归因基线",
      "worktree": "~/.ai-ds-lab/pins/tvu-ds-339a72bf",
      "pinnedAt": "2026-08-25",
      "keep": true,
      "whyKeep": "delta 必须对着它算。P0→P2 之间有 17 个 commit，其中 16 个与两份处方无关 —— 用 P0 做基线会把别人的漂移记到处方账上（实测：KNOWN_SILENT 差 1 行）。"
    },
    {
      "sha": "4a68e02d3d695cee3c39d255ea5d20f7f2bf9b8c",
      "short": "4a68e02d",
      "role": "P2 — 第 7 + 7b 步落地；⚠️ 2026-08-26 起**不再是当前 pin**",
      "worktree": "~/.ai-ds-lab/pins/tvu-ds-4a68e02d",
      "pinnedAt": "2026-08-25",
      "keep": true,
      "whyKeep": "⛔ 别拆。第 11 步 / 6′ / 区分度实验那 15 个 run、first-shot-gt00{1,2,3}-n5 与 task-discrimination-v1 全部 inventory 的 §5.2 主键 subjectSha = 本 sha（实测：run 的 subjectSha 取自 contextManifest 的 cwdFacts.head，不是 task JSON 的 provenance.pinnedSha）⇒ 拆了这些读数就不可复现。它同时是 P3 的归因基线。"
    },
    {
      "sha": "c1db57b8759faaf3bf89ef89d1eb21caec369680",
      "short": "c1db57b8",
      "role": "P3 — 当前 pin（lab 5 份处方落地线的收尾 commit）",
      "worktree": "~/.ai-ds-lab/pins/tvu-ds-c1db57b8",
      "pinnedAt": "2026-08-26",
      "keep": true,
      "whyKeep": "delta 对 P2 算，⛔ 不对 P1/P0。选它而不选 DS 当时的 HEAD 有量化实证：其后 13 个 commit 与 lab 处方无关，在 `tests/*.test.ts` 口径上处方 delta +1 / 无关漂移 +13 ⇒ pin 到 HEAD 有 93% 是别人的账。⚠️ 该污染率**逐口径不同**，同一次对比里 `docs/_archive` 是处方 −52 / 无关 −1 ⇒ ⛔ 不得跨口径外推。"
    },
    {
      "sha": "19e55102c3866264b57c10c27aee25fb94b803ab",
      "short": "19e55102",
      "role": "P4 — 2026-08-28 设计系统体检报告的读数基线（⚠️ 事后补 pin）",
      "worktree": "~/.ai-ds-lab/pins/tvu-ds-19e55102",
      "pinnedAt": "2026-08-28",
      "keep": true,
      "whyKeep": "⛔ 别拆。`reports/2026-08-28-design-system-review.{md,html}` 全部读数以它为主键：126 段 / 71 unclassified / 25 gated / 8 条闸盲区、§29.2 四点曲线第 4 行。⚠️ **它是事后补 pin** —— 报告写作当时没有 pin，读数取自当时的工作区，按 AGENTS §1 那不是合格读数。本次补 pin 后已在 pin 上逐条复现 acceptance 面：窄尺 118 / 宽尺 126 / 差额 8，与 §29.2 表格该行逐字吻合 ⇒ 报告的 acceptance 面读数**事后获得了可复现性**。⛔ 但报告里其它面（组件数 / 入口类型声明 / 变量占比）**尚未在本 pin 上复验**，引用时别默认它们也复现过。"
    },
    {
      "sha": "dcc1c29b8e1dc48ee9fa29ecee71e5ca1ff46d4c",
      "short": "dcc1c29b",
      "role": "P5 — 复审新时点（acceptance 对位登记线第五批收尾）",
      "worktree": "~/.ai-ds-lab/pins/tvu-ds-dcc1c29b",
      "pinnedAt": "2026-08-28",
      "keep": true,
      "whyKeep": "第一次真实复审对比（P4→P5）的终点。delta 对 P4 算，⛔ 不对 c1db57b8（那是 lab 处方线的 pin，口径不同不可混读）。**选它而不选 HEAD 有实测支撑**：`dcc1c29b..HEAD` 的 20 个 commit 中，分子面（`audit-acceptance-gate-coverage.mjs` / 豁免表）零改动；分母面唯一嫌疑 `fbfc3e4f` 改了 `docs/meta-rules.md`（+22/−5），但三 sha 实测段数恒为窄 118 / 宽 126 / 差 8 ⇒ **未动 Acceptance 段**。按 `repinProtocol.pinTarget` 取对位登记线最后一个 commit。"
    },
    {
      "sha": "b3728d38",
      "short": "b3728d38",
      "role": "P6 — 第三时点复审（acceptance 输入面最后一次变动点）",
      "worktree": "~/.ai-ds-lab/pins/tvu-ds-b3728d38",
      "pinnedAt": "2026-08-28",
      "keep": true,
      "whyKeep": "⛔ 别拆。P5→P6 是第一次【全空 diff】的证据所在：迁移 0 · 增删 0 · 盲区 8→8。⚠️ 选它而非 HEAD(cb2e6576) 的理由 —— 它是 dcc1c29b..HEAD 这 21 个 commit 里【最后一个碰过 acceptance 完整输入面】的 commit（输入面 = 闸 + 豁免表 + 整个 scripts/ 自陈面 + 7 份扫描文件），其后 2 个 commit 不碰输入面。⚠️ 判定时补了一个此前两次都漏掉的面：GATE_DIR=scripts/ 是【整个目录】，三态分类靠全目录的闸自陈 ⇒ 只查闸本体和豁免表会漏判。"
    },
    {
      "sha": "6ac56de225828ec4bdf56781a95e95815b7159ab",
      "short": "6ac56de2",
      "role": "P7 — 触发器 T 落地当次 commit；触发器 T 存量覆盖面探针的唯一基线",
      "worktree": "~/.ai-ds-lab/pins/tvu-ds-6ac56de2",
      "pinnedAt": "2026-08-31",
      "keep": true,
      "whyKeep": "⛔ 别拆。`docs/2026-08-31-trigger-t-coverage-probe-plan.md` 的全部读数以它为主键（§5.2）。⚠️ 这次 pin 目标**刻意不按 repinProtocol.pinTarget**（那条规定 pin 到「本轮处方线最后一个 commit」）—— 本探针测的不是处方落地效果，而是**一条新规则落地那一刻的存量违规面**，基线只能是规则落地的那个 commit 本身，取更晚的会把 T 落地后的修补算进存量。⚠️ pin 时 DS HEAD 已是 `393053e8`（半小时内从 f3537a4d→6ac56de2→393053e8，DS 侧有并行 session 高频提交）⇒ 本 pin 落后 HEAD，这是**刻意的**，⛔ 别当成漏 re-pin 修掉。"
    }
  ],
  "repinProtocol": {
    "why": "reports/2026-08-24-round2-preconditions.md §4.3：自然 re-pin 时机 = DS 侧执行完某份 proposal 之后。⚠️ 2026-08-26 订正（AGENTS §2.13）：这是**一个已经发生过的时点，不是一个要等的状态** —— 曾把它读成「等 DS 空闲」，据此推迟 re-pin，而实测处方线 21 小时前就收尾了。判「时机到没到」看的是 git log 里处方线收没收尾，⛔ 不看对方此刻忙不忙。",
    "pinTarget": "⚠️ 2026-08-26 新增（原协议只规定「什么时候 re-pin」，⛔ 没规定「pin 到哪个 sha」，AGENTS §2.13）：pin 目标 = **本轮处方线的最后一个 commit**，⛔ 不是「对方当前 HEAD」。理由与 pinHistory[1].whyKeep 同源（用更早/更晚的基线会把别人的漂移记到处方账上），2026-08-26 给了它第二个量化实证（`tests/` 口径 93% 污染）。⚠️ 污染率**逐口径不同** ⇒ 报这条时必须带口径名，⛔ 别写「pin 到 HEAD 会污染读数」这种不带口径名的句子。",
    "dsMustReport": [
      "落地 commit **及其父提交** sha —— ⚠️ 2026-08-25 改：原文只要「commit sha 范围」，但 lab 的 pin 可能落后真源很多个 commit（本轮实测 17 个），父提交才是可直接用的归因基线",
      "**本轮 DS 声称执行的全部处方**的验收标准逐条实测结果（⛔ 不接受「已完成 / 通过」式断言，AGENTS §4）—— ⚠️ 2026-08-26 订正：原文写死「两份处方」，那是第 7/7b 轮的份数，到本轮已是 7 份在册、DS 一次执行 5 份 ⇒ 照原文执行会漏 5 份。**⛔ 不写死份数**（写死了下次还会过期，这正是它这次过期的原因，AGENTS §2.13 推论二）",
      "链入口 script 的新链条组成（步数 + 逐条 npm key）—— ⚠️ 2026-08-26 订正：原文写死 key 名 `prepublishOnly`，而 DS 已在 `483e3feb` 把 39 步串挪进 `scripts['gate-chain']`、`prepublishOnly` 退化成一步委托 ⇒ 写「链入口 script」，⛔ 不写死 key 名（同上一条，写死会过期）",
      "受影响路径的耗时实测",
      "audit-gate-mount-declaration 的 KNOWN_SILENT 表增删行清单"
    ],
    "labThenDoes": "re-pin（新建 worktree，⛔ 不拆旧的）→ 量 delta（对**紧邻的上一个 pin**算，⛔ 不对更早的；本轮实证：P2→P3，⛔ 不对 P1/P0）→ 才写下游处方"
  },
  "nodeModules": {
    "why": "跑闸链全链做成本画像与契约运行时读数需要依赖；`node_modules` 被 gitignore，装了不污染 pin（⛔ 不写死 worktree 份数 —— 2026-08-26 订正，原文写死「三个」而当时已是四个，与 repinProtocol.dsMustReport 那两条同一失效形态；判法是每次装完实跑 `git status --porcelain` 核 0）。",
    "how": "cd <worktree> && pnpm install --frozen-lockfile --prefer-offline",
    "gotcha": "⚠️ 用 sh -c 跑 npm script 时必须自己把 <worktree>/node_modules/.bin 塞进 PATH —— pnpm 会做这件事，sh 不会。少了它 eslint 类步骤报 exit 127，长得像被测对象失败（N30）。"
  },
  "driftAtFirstRound": {
    "observedHead": "fd1f7fe15fe2159b49cfa18d83f67d15027dd63b",
    "observedAt": "2026-08-24",
    "commitsAhead": 10,
    "auditCountDelta": "+1 (audit-commit-affordance-trace.mjs)",
    "workingTreeDirty": true,
    "why": "记录下来是因为 spec §5.2 的 baseline 主键含 subjectSha；DS 真源工作区当时是脏的，直接在真源上量会得到不可复现的数。"
  }
}
