# 工作纪律 · harness 适配矩阵
#
# 真源（唯一手写）：docs/工作纪律_认知图条目_v1.1.json
# 本文件只声明「怎么把真源渲染成各端产物」，不承载纪律本体（与真源边界一致）。
#
# transport:
#   file        —— 产物是一个独立文件；path 相对仓库根，或以 ~ 开头（用户目录）
#   config-key  —— 产物写进某个 YAML 配置文件的指定键；用受管标记块原地修订，保留注释
# variant:  full    —— 全文形态（含声明出口表 / 收尾流程 / 维护规则），供会话起始注入
#           compact —— 精简形态（执行公约 + 路由表 + 声明），供「每轮都在」的系统提示槽位
#           skill   —— SKILL.md 形态（YAML frontmatter + 纪律正文），供 Claude Code / Codex 插件的 skills/ 目录
# enabled:  是否纳入 render --write 与 verify 的默认范围
# memory:   该端 Agent 访问灵枢记忆的通路；仅声明事实，不参与渲染与校验。三种形态：
#           ① MCP 客户端配置 —— 写客户端配置里的 server 名（如 mcp/mdcg）；
#           ② 宿主内建桥   —— 插件直接 spawn 同一个 md_cg.mcp_server 为子进程，
#                            再注册为宿主工具（DSH 侧 = cg / stg）。
#           ③ 蜂巢并发通路 —— hive = 另一个 MCP server（python -m hive.hive_mcp.mcp_server，
#                            四工具 hive_spawn / hive_poll / hive_kill / hive_doctor），
#                            提供多智能体并发 + 任务上下文管理（context_files 注入、预算交回、
#                            进展卡 / handoff）。池与 serve 由 PYTHONPATH 指向的仓库内 hive/ 推导
#                            ⇒ 多端指向同一仓库即**共享同一并发池**（「通用并发」的落地形态）；
#                            要隔离可加 HIVE_JOBS_DIR / HIVE_CONFIG 指定独立池。
#           底层服务是同一个 python -m md_cg.mcp_server；差别只在"谁去连它"。
#           未列该项的端表示通路未在本矩阵登记，不代表该端无通路。
# slot:     该产物在**宿主侧**占的注入位（对应下面 injection.slots 的键）。
#           用途（Pi⑦⑤ 祖先链发现 + 防重复）：宿主从启动目录逐级上溯读同名件，故需按槽位
#           发现「这条链上还并存哪些竞争件」；config-key 类产物无文件槽位，写 system-prompt-key。

version: 1
source: docs/工作纪律_认知图条目_v1.1.json

# —— 注入面发现与防重复（Pi⑦⑤）——
# 依据：宿主 agent 的注入件不是单点读取——它从启动目录逐级上溯读同名件（AGENTS.md /
# CLAUDE.md / CODEBUDDY.md），故「产物落在哪」不等于「宿主只读到这一份」。本段把该事实
# 声明为机械判据的输入，由 scripts/verify_discipline.py 裁决（判据见其 check_injection_matrix）：
#   ① 同一物理文件被两个 target 写            → 后渲染者静默覆盖前者        → 硬失败
#   ② 仓根出现会遮蔽本地私有件的槽位件         → 本地纪律注入在该宿主下失效   → 硬失败（§5 机械化的那条）
#   ③ 同一条祖先链上并存同槽位件               → 宿主可能一并读到 / 按声明的
#      择优顺序遮蔽                             → **发现面报告**（宿主侧事实，本仓不裁决，但不得假定不存在）
injection:
  version: 1
  # 槽位 = 宿主侧的注入位；文件名列表 = **声明的宿主读取优先级**（首项优先，靠后者在同槽位被忽略）。
  # 属「声明」而非「实测」：宿主行为一旦与此声明不符，应改本段而不是改判据。
  slots:
    codebuddy-session: [CODEBUDDY.md, AGENTS.md]
    codebuddy-rules: [RULE.mdc]
    zcode-session: [AGENTS.md]
    # 用户级槽位（2026-09-28 登记）：ZCode 除「工作区级 <repo>/AGENTS.md」外还读**用户级**
    # ~/.zcode/AGENTS.md（对所有工作目录生效）。该件落在仓外用户目录，**不参与本仓祖先链
    # 发现**（链终点不在它上面，probe 命中只报告不判失败）；但与 zcode-session 同槽同名，
    # 故在此显式声明，供发现面报告「同一启动目录下并存的竞争件」。
    zcode-user-session: [AGENTS.md]
    codex-session: [AGENTS.md]
    claude-session: [CLAUDE.md]
    plugin-skill: [SKILL.md]
    # DSH 是配置键注入（personaPrefix），无文件级竞争面 —— 显式声明为空，不参与祖先链发现
    system-prompt-key: []
  # 仓根**允许**存在的槽位件：root AGENTS.md 是本地私有件（by design，见 codebuddy-local target）。
  # 其余槽位件一旦出现在仓根，按 slots 声明顺序会遮蔽本地私有件 → 判硬失败。
  root_allow: [AGENTS.md]
  # 祖先链上溯终点：filesystem = 一路查到盘根（仓外命中只报告）；repo = 只查仓内。
  chain_scope: filesystem

targets:

  dsh:
    enabled: true
    transport: config-key
    slot: system-prompt-key
    path: '~/.dsh/profiles/web/cordis.patch.yml'
    entry_id: system-prompt
    key: personaPrefix
    variant: spec
    format: text
    marker: lingshu:discipline
    memory: plugin/cg+stg (插件内建桥，spawn md_cg.mcp_server；tools=core)
    # hive：本端未经 MCP 面接入——插件是内建桥形态（TS 侧 spawn + 工具注册），接蜂巢须在
    # src/lib/ 新增 hive 客户端与四工具暴露，非「写一条配置」可解。当前兜底=CLI
    # （hive.exe submit --spec <spec.json>）。详见 hive/README.md「各 harness 注册」。
    memory_excluded: mcp/hive（形态差异：非原生 MCP 客户端，待插件 TS 侧接入）
    note: >-
      DSH 系统提示 order=0（DEPLOYMENT_PERSONA_PREFIX），每轮注入；
      严格 {{variable}} 插值 ⇒ 正文禁含裸 {{ 。
    # 端差异与落地边界 → 注入 compact 模板的 %%PREAMBLE%%（模板保持通用，差异留在矩阵）
    preamble: |-
      【本端（DSH）与其它端的差异】
      - 记忆通路：插件内建 cg / stg 两个基元（与 MCP 服务同名，无前缀）（tools = core），即正文纪律中的 cg / stg——同一服务，勿因名字不同而猜测；其余能力经 cg(op=…) / stg(op=…) 分发，op 为必填参数（漏传会被参数签名推导兜底并标记 op_derived）。
      - 注入时机：本段在系统提示 order=0（DEPLOYMENT_PERSONA_PREFIX），每轮都在；codebuddy / zcode 端是会话起始一次性注入全文。
      - 自动记忆：本端有 session hook，默认自动转录用户消息（assistant / tool 默认关）。
        故第 16 条在本端只补核心结论（内容／原因／位置／验证结论），不复述对话流水——否则与自动转录重复、稀释检索。
        CodeBuddy 端无会话 hook，其自动记忆改由第 16 条显式归档驱动；两端落地方式不同，勿照搬。

      【仓库结构与公开边界（第 9 / 14 条落地用）】
      - 仓库按 harness 分目录：dsh/ · codebuddy/ · zcode/ · codex/；共享层（md_cg/ · docs/ · scripts/）在仓库根。
      - 根目录 AGENTS.md 是本地私有件（.gitignore，含运维注记）；公开产物是 codebuddy/CODEBUDDY.md 与 zcode/AGENTS.md。
      - 公开仓 = GitHub FuRongJun-1999/dsh-memory；私有运行时 = AEIS。含敏感／隐私内容只写 AEIS，不进公开仓。

      【纪律本体的维护链路】
      - 真源 docs/工作纪律_认知图条目_v1.1.json → scripts/render_discipline.py → 各端产物 → scripts/verify_discipline.py 守漂移。
      - 改纪律 = 改真源 → 重渲染（--write）→ 过校验（漂移即非零退出）；禁止手改本段（下次渲染会覆盖）。

  codebuddy:
    enabled: true
    transport: file
    slot: codebuddy-session
    path: codebuddy/CODEBUDDY.md
    variant: full
    uses_spec: true
    format: markdown
    memory: mcp/mdcg (cg,stg) · mcp/hive (蜂巢并发：spawn/poll/kill/doctor)
    note: >-
      CodeBuddy 会话起始全文注入。**根目录 CODEBUDDY.md 优先于 AGENTS.md**——
      本仓产物落 codebuddy/CODEBUDDY.md（不落根，避免屏蔽本地私有 AGENTS.md）；
      外部用户复制该文件到自身项目根即生效（见 codebuddy/README.md）。

  # —— CodeBuddy 宿主规则注入面（2026-09-23 新增，issue #24 复盘断点修复）——
  # 历史缺陷：本落点（.codebuddy/rules/RULE.mdc，宿主 alwaysApply 自动注入）曾不在
  # 渲染矩阵内且被 .gitignore 整目录忽略 → 只存在本机、clone 后宿主无规则可注入——
  # 「入口（WORKSPACE_INDEX + 第 18 条）都写好了，AI 却不知道它存在」的断点即此。
  # 修法：rules-mdc 模板 + .gitignore 白名单 !/.codebuddy/rules/ 入库分发 + 本 target 纳管。
  codebuddy-rules:
    enabled: true
    transport: file
    slot: codebuddy-rules
    path: .codebuddy/rules/lingshu-discipline/RULE.mdc
    variant: rules-mdc
    uses_spec: true
    format: markdown
    memory: mcp/mdcg (cg,stg) · mcp/hive (蜂巢并发：spawn/poll/kill/restart/doctor)
    note: >-
      CodeBuddy 宿主 .codebuddy/rules/ 注入面（frontmatter alwaysApply: true，
      会话起始自动注入；CODEBUDDY.md 四端件是分发样例，本件才是宿主实际加载位）。

  zcode:
    enabled: true
    transport: file
    slot: zcode-session
    path: zcode/AGENTS.md
    variant: full
    uses_spec: true
    format: markdown
    preserve: true
    memory: mcp/mdcg (cg,stg) · mcp/hive (蜂巢并发：spawn/poll/kill/doctor)
    note: >-
      ZCode 读项目根 AGENTS.md。本仓产物落 zcode/AGENTS.md（不落根，避免与
      CodeBuddy 的 CODEBUDDY.md 及本地 AGENTS.md 冲突）；复制到项目根生效。

  # —— 用户级注入件（仓外：用户目录）：**渲染产物（执行公约 + 声明出口表 + 指向）** ——
  # 2026-10-05 使用者裁决①：本件由「手写指针」升级为渲染产物——把纪律的**声明出口表**
  # （18 条 response.direct 原文）与执行公约（0.1–0.5）内嵌进本件。理由：用户级件是本仓
  # 纪律唯一「每会话必在」的注入通道（工作区级发现面自 cwd 向上搜到项目根，到不了子目录
  # zcode/）——声明出口是「命中即声明」（0.2）的可执行面，必须在这个通道里。
  # 为什么选「表 + 公约」而不是条款全文：本件落在**用户全局**注入面，对非本仓的其它工作
  # 目录同样生效——贴全文成本高、噪声大；条款本体仍以 zcode/AGENTS.md 为准（本件保留指向）。
  # 防漂移改由「渲染 ＋ 全文一致校验」承担（原 render:false 的「不含条款正文 ⇒ 不可能漂移」
  # 前提已不成立）：
  #   · render: true + variant: zcode-user（模板 docs/discipline/templates/zcode-user.md.tmpl）；
  #   · verify_discipline 指针分支在既有三检（指向面 / 陈化面 / 工具名随端）外新增第四检——
  #     extract 文本与 R.render(target, src, repo) 逐字比对（仅归一末尾空白/换行），手改表行 /
  #     指纹 / 指向 / 任意正文即判漂移；
  #   · 仓外件缺失仍按 --allow-missing 跳过（CI / 裸 clone 不误红），本机存在则须判绿。
  zcode-user:
    enabled: true
    render: true
    variant: zcode-user
    uses_spec: true
    pointer: true
    # 指针须指向的纪律本体（相对仓库根）——判据侧按此值查「指向面」，故路径只有这一处声明
    pointer_body: zcode/AGENTS.md
    transport: file
    slot: zcode-user-session
    path: ~/.zcode/AGENTS.md
    format: markdown
    preserve: true
    memory: mcp/mdcg (cg,stg) · mcp/hive (蜂巢并发：spawn/poll/kill/doctor)
    note: >-
      ZCode 的**用户级**指令件（对所有工作目录生效；工作区级见 zcode target 的
      zcode/AGENTS.md）。存在理由：本仓纪律产物落在**子目录** zcode/，而 ZCode 的
      工作区级发现面只查 <repo>/AGENTS.md ⇒ 子目录件永不进注入面；用户级指针把
      「会话起始（含压缩续接后）先读 <repo>/zcode/AGENTS.md」钉在每轮都在的位置。
      注入验收见本条 note 的后续记录与 docs/discipline 的验收协议。

  codex:
    enabled: true
    transport: file
    slot: codex-session
    path: codex/AGENTS.md
    variant: full
    uses_spec: true
    format: markdown
    preserve: true
    memory: mcp/mdcg (cg,stg) · mcp/hive (蜂巢并发：spawn/poll/kill/doctor)
    note: >-
      Codex CLI 读项目根 AGENTS.md（另支持 ~/.codex/AGENTS.md 全局）。
      本仓产物落 codex/AGENTS.md（不落根，根 AGENTS.md 是本地私有件）；
      复制到项目根即生效。MCP 通路模板见 codex/config.toml.example。

  claude-code:
    enabled: true
    transport: file
    slot: claude-session
    path: claude/CLAUDE.md
    variant: full
    uses_spec: true
    format: markdown
    preserve: true
    memory: mcp/mdcg (cg,stg) · mcp/hive (蜂巢并发：spawn/poll/kill/doctor)
    note: >-
      Claude Code（Anthropic）会话起始读取项目根 CLAUDE.md（另支持 ~/.claude/CLAUDE.md
      全局、CLAUDE.local.md 私有附加）。本仓产物落 claude/CLAUDE.md（不落根——根 AGENTS.md
      是本地私有件，且落根会与 CodeBuddy / Codex 端的根级注入并存造成重复）；
      复制到项目根即生效。MCP 通路模板见 claude/mcp.json.example（项目级 .mcp.json）。
    preamble: |-
      【本端（Claude Code）与其它端的差异】
      - 记忆通路：MCP server「mdcg」（项目级 .mcp.json 或 claude mcp add 配置，tools = kernel 面 cg/stg）；
        其余能力经 cg(op=…) / stg(op=…) 分发。
      - 注入时机：本段在会话起始一次性注入全文（CLAUDE.md）；DSH 端是每轮都在的 compact 系统提示。
      - 自动记忆：本端无会话 hook 自动转录，记忆沉淀由第 16 条显式归档驱动（与 CodeBuddy / Codex 端同构）。

  # —— 插件生态形态（新增）：纪律不再靠复制注入文件，而是随插件 skills/ 分发 ——
  claude-code-plugin-skill:
    enabled: true
    transport: file
    slot: plugin-skill
    path: claude/lingshu-memory/skills/linglu-discipline/SKILL.md
    variant: skill
    uses_spec: true
    format: markdown
    memory: mcp/mdcg (cg,stg) · mcp/hive (蜂巢并发：spawn/poll/kill/doctor)
    note: >-
      Claude Code 插件形态（插件根 = claude/lingshu-memory/，经仓根 .claude-plugin/marketplace.json
      分发：/plugin marketplace add FuRongJun-1999/dsh-memory → /plugin install）。
      CLAUDE.md 不能随插件分发，纪律注入改由 skill 承载（Claude 按 frontmatter description 自动调用，
      或 /lingshu-memory:linglu-discipline 显式调用）。
    preamble: |-
      【本 skill（Claude Code 插件形态）与其它端的差异】
      - 记忆通路：MCP server「mdcg」（tools = kernel 面 cg/stg，其余能力经 op 分发）。插件不含大脑本体——
        安装后须按插件 README 把 mcp.json.example 配置为项目 .mcp.json（PYTHONPATH 指向你本机的 dsh-memory 仓库）。
      - 注入时机：Claude 按本 skill 的 description 在任务开始 / 命中触发词时自动调用；
        也可用 /lingshu-memory:linglu-discipline 显式调用。其它端是会话起始一次性全文注入——
        本 skill 形态下若本会话尚未加载过本 skill，应先加载再动手。
      - 写入凭据：mdcg fail-closed，未配 MDCG_TOKEN 时只读 guest（读得到、写不进）；签发见插件 README。

  codex-plugin-skill:
    enabled: true
    transport: file
    slot: plugin-skill
    path: codex/lingshu-memory/skills/linglu-discipline/SKILL.md
    variant: skill
    uses_spec: true
    format: markdown
    memory: mcp/mdcg (cg,stg) · mcp/hive (蜂巢并发：spawn/poll/kill/doctor)
    note: >-
      Codex 插件形态（插件根 = codex/lingshu-memory/，.codex-plugin/plugin.json，name 与文件夹一致；
      经仓根 .agents/plugins/marketplace.json 分发：codex plugin marketplace add <本仓路径> → codex plugin add）。
      与 codex/AGENTS.md 手工路线并存：AGENTS.md 是会话起始全文注入主通道，本 skill 是插件分发的等价形态。
    preamble: |-
      【本 skill（Codex 插件形态）与其它端的差异】
      - 记忆通路：MCP server「mdcg」（tools = kernel 面 cg/stg，其余能力经 op 分发）。插件不含大脑本体——
        安装后须按插件 README 把 config.toml.example 的 [mcp_servers.mdcg] 两段合并进 ~/.codex/config.toml
        （PYTHONPATH 指向你本机的 dsh-memory 仓库）。
      - 注入时机：Codex 按 skill 三级渐进加载（元数据常驻、正文触发时加载）；项目根 AGENTS.md 仍是
        会话起始全文注入主通道，本 skill 与之同源、并存不冲突。
      - 写入凭据：mdcg fail-closed，未配 MDCG_TOKEN 时只读 guest（读得到、写不进）；签发见插件 README。

  # —— 本地私有注入件（.gitignore，不入公开仓）：只校验，不渲染 ——
  # 它是「纪律本体 + 本地增强」的手工件（§1 设计者视角含本机路径、§0.6 工具规范、§5 运维注记），
  # full 模板渲染会覆盖这些本地增强段，故 render: false（禁写盘）。
  codebuddy-local:
    enabled: true
    render: false
    transport: file
    slot: codebuddy-session
    path: AGENTS.md
    variant: full
    format: markdown
    memory: mcp/mdcg (cg,stg) · mcp/hive (蜂巢并发：spawn/poll/kill/doctor)
    note: >-
      根目录 AGENTS.md = 本机 CodeBuddy 会话注入件（见本文件 dsh preamble「仓库结构与公开边界」）。
      历史缺陷（20260916 漂移实例）：它是手工件、长期不在渲染/校验矩阵内，0.1 / 0.6 把 DSH 端
      注册名写死为通用工具名并加「非 cg」的反向否决，本端 agent 因此对工具名产生疑惑——
      与「手写行号必腐化」同构：无守卫的手工件必然漂移。
      修法：纳入矩阵只做校验（render: false），守卫 ①声明出口逐字一致；②工具名随端标注
      （件内每处 DSH 端基元名须与 MCP 端正名 mdcg 同行出现）；③编号完备（缺条即其声明缺失）。
    # 形态说明（20260916 修订）：本件 §2 路由表原为分组表格；markdown 表格单元格须转义
    # 半角 '|'，而真源 execution.how 含半角 '|'（第 2 / 8 条）——与「逐字嵌入」物理不相容，
    # 故曾退让为 verify_fields advisory（差异全量打印、不判失败，不静默）。
    # 现按使用者裁定改为**列表形态**（与渲染产物同源、逐字真源），摘要化差异归零：
    # 撤下 verify_fields，本件回到**全字段 strict**（trigger / action / negative / declaration）。
    # 同轮另一项：真源第 1 条 how 补「与既有实践」，与 content / response.direct 自洽——
    # 原 how 缺该语、与真源自身矛盾，手工件反而是对的（属真源过时，非件漂移）。
