P67（职业每日任务 UI 目标展示：design §2.4-3 收口后的可见化）验证记录
基线：commit f943bf7（P66 验收 push 后的 docs tick）。本单未 push。

范围
- 把 P66 定点的 DailyTask.TargetNpc/TargetTile 在玩家可见的每日任务面板展示出来。
- 只动 Desktop UI 展示；Kernel/Sim 数值路径零改动（`git diff --name-only` 无 Sim.fs / Kernel 文件）。
- 文案格式（自定）：有目标 → 「<模板>：<状态> → <目标名>」；无目标 → 与旧文案逐字节一致
  （「<模板>：<状态>」，无箭头/目标名）。帮工 → 「村民 N」；翻土 → 「自家地块」（同 P66 语义）。

改动文件
- src/LivingVillage.Desktop/TaskRuntime.fs：新增 `targetText`（HelpWork+TargetNpc→村民 N；
  TillSoil+TargetTile→自家地块；其余/无目标→None）与 `taskLine`（有目标追加「 → 目标」）。
- src/LivingVillage.Desktop/Interaction.fs：TaskPanel 任务行改用 `TaskRuntime.taskLine`
  （其余面板/文案不动）。
- src/LivingVillage.Desktop/CjkGlyphAtlas.fs + Assets/cjk-glyphs.txt + Assets/cjk-glyph-atlas.png：
  新增 3 字形「地 块 →」（343 字，16 列，行 22，384x528）；`bash scripts/generate-cjk-glyph-atlas.sh` 重生成。
- src/LivingVillage.Desktop/ChineseText.fs：requiredUiLabels 增补「自家地块」「→」。
- src/LivingVillage.Desktop.Tests/P67TaskTargetUiTests.fs（新，5 例）+ .fsproj 挂载；
  PrototypeTests 字形表计数 340 → 343（行数/尺寸不变）。
- src/LivingVillage.Desktop/Game.fs：LV_P67_SHOT 钩子（真实每日任务纯函数生成 DailyTask →
  任务面板，有目标/无目标各拍一帧；打印 template/target/整行/missing_glyph_slots）。
- scripts/analyze-p67.py（新）+ docs/evidence/p67-{run-log,target,wildcard}.png + p67-analysis.txt。

红先
- 先建 P67TaskTargetUiTests.fs 引用未实现的 TaskRuntime.taskLine/targetText → 暂存 TaskRuntime.fs/Interaction.fs
  后编译红（FS0039 taskLine 未定义），恢复后转绿。首次全量编译又暴露测试两处笔误
  （AreEqual<string> 类型批注、task 参数多传 None），修正后 0 错误。

构建/测试
- dotnet build LivingVillage.sln -c Release → 0 错误，1 警告（P40ArtTests.fs FS0760，既有）。
- dotnet test src/LivingVillage.Desktop.Tests -c Release --no-build → 333/333（328→+5）。
- dotnet test src/LivingVillage.Kernel.Tests -c Release --no-build → 119/119。
- 用例：HelpWork 定点 → 「帮工：进行中 → 村民 9」；TillSoil 定点 → 「翻土：待接受 → 自家地块」；
  无目标（帮工/夜捕/翻土通配）逐字节保持旧文案；panelLines 任务面板含目标行、无目标面板不含「→」；
  目标行/箭头经 PixelText.isRenderable 全可渲染 + CjkGlyphAtlas.contains '→'。

真实截图证据（Xvfb 1280x720，LV_P67_SHOT=1 LV_LEGACY_MAP=1）
- p67-target：panel=task template=帮工 target=村民 9 line=帮工：进行中 → 村民 9 slots=0
- p67-wildcard：panel=task template=帮工 target=<none> line=帮工：进行中 slots=0
- scripts/analyze-p67.py verdict: PASS
  - 两帧 missing_glyph_slots=0；图集含 地块→（total=343）。
  - 两帧 1280x720 非空，无 24x24 纯黑块、无 64x64 纯白块（唯一白块 18px < 4096 阈值）。
  - target vs wildcard differing_pixels=358，其中任务行带（x0..400,y620..662）352px
    → 目标文案确实画在面板任务行内。
- scripts/check-no-white-blocks.py → checked=4 failures=0 OK。

确定性
- dotnet run -c Release --project src/LivingVillage.Headless -- --performance-baseline ×3
  → final_digest 全等 953775FAEB2FDDE97289491AA260BD8D390C571E48A7A13AD2CB6FB7124F7F6C，
  performance_determinism=PASS ×3。

边界
- 未改 Kernel/Sim 数值路径、HUD 结构、字号/布局、外部素材；未 push。
- 逐帧「字形清晰可辨」的 vision 复核由 Hermes 侧完成。
- 未改任务面板以外的展示位置（目标仅出现在每日任务面板行）。
