harness-context:需求上下文的入口与仓管
定位:本技能只定义上下文落在哪里、长什么格式;抓取(拉 IM 消息、拉文档、拉 MR 评论)由你——调用本技能的 agent——用现成能力完成(lark-cli、bytedcli 及相关技能)。判断类工作(截取哪段、摘录多少)也归你。
机械层脚本:~/.claude/skills/harness-context/scripts/ctx-dir.sh(依赖 git、jq)。
目录契约
<仓库根>/.harness-ceilf6/<分支名,/ 替换为 __>/
├── meta.json # branch / wiki_url / selftest_url / base_branch / status / max_rounds / mr_id / created_at / milestones
├── context/ # 上下文条目,只增不改,命名 <YYMMDD-HHmm>-<im|doc|meego|mr|note>-<slug>.md
│ └── 00-seed.md # wiki 子文档种子
├── plan.md # 计划门产物(由 harness-ceilf6 写入)
├── tdd-evidence.md # 阶段 1 红绿证据与豁免记录(由 harness-ceilf6 写入)
├── cr/round-N/ # CR 轮次产物(由 harness-ceilf6 写入)
└── sediment.md # 沉淀台账
该目录经 .git/info/exclude 排除,不进团队 git。status 枚举:planning|developing|cr|awaiting_human|done。
动作
init(初始化 + 导入种子)
运行
bash ~/.claude/skills/harness-context/scripts/ctx-dir.sh init --wiki-url '<需求 wiki 子文档链接>',得到上下文目录路径(下称$CTX)。wiki 链接暂缺时可省略--wiki-url,之后用 jq 补写 meta。主分支恢复流:脚本在 master/main 上会拒绝(守卫保留在脚本层,防止上下文挂错分支)。此时不要把「先切分支」抛回给用户了事——分支名应从需求派生:先读需求源(wiki 种子的标题与正文,或用户口述),参考仓库近期分支命名风格(
git branch --sort=-committerdate | head看前缀习惯,如fix/feat/chore/)提议一个分支名,向用户一句话确认(分支名会进 MR 与提交历史,允许用户改名)。确认后git checkout -b <分支名>(从当前 HEAD 切出,不自动 pull,主分支是否先同步由用户自行处理),再重跑 init。detached HEAD 仍硬拒绝——无从派生名字,请用户自行处理。若给了 wiki 链接且
$CTX/context/00-seed.md不存在:用 lark-cli 拉全文(先按 lark-doc 技能要求读取其前置 references):lark-cli docs +fetch --doc '<链接>' --doc-format markdown --jq '.data.document.content'写入$CTX/context/00-seed.md,头部加 provenance:> 来源: <链接> > 导入时间: <当前时间> --- <正文>已存在 00-seed.md 时不重拉;用户明确说「重拉种子」才覆盖。
回显:目录路径 + 种子标题级摘要(几个一级标题、是否含提示词段)。
add(随时存入)
识别输入形态并抓取(抓取失败时如实报告,并询问是否降级为自由文本手工粘贴):
输入形态 类型标记 抓取方式 IM 群聊 chat/session id + 起止消息引文 imlark-cli im 拉消息列表,按引文截取区间(含两端) 飞书文档 / wiki 链接 doclark-cli docs +fetch --doc '<链接>'(遵循 lark-doc 技能前置)Meego 链接 meegobytedcli-meego 技能查询工单详情 MR 号 / 链接 mrmr-comments 技能 fetch --ctx-dir "$CTX"拉全部评论快照(线程带 kind:bot/human/self 与 path:line);MR 基本信息用 bytedcli-bits-mr其他一切 note原文即内容 运行
bash ~/.claude/skills/harness-context/scripts/ctx-dir.sh new-entry <类型> <英文短slug>得到目标文件路径,用 Write 写入,头部 provenance 同上(来源、抓取时间、区间说明),正文为摘录内容。回显:文件名 + 一行内容摘要。
get(取出全部上下文)
按以下顺序读取并汇总输出(现读现拼,不存聚合缓存):
$CTX/meta.json(状态一行);$CTX/plan.md(存在时全文);$CTX/context/下全部条目按文件名升序(00-seed.md 天然最先);- 最近一轮
cr/round-N/的 verdict.json 未决 findings 与 fixes.md(存在时)。
输出为一个结构化块,供当前会话直接消费。
沉淀供料(组合式)
沉淀由用户组合触发(如 /harness-context /lark-sediment 或指定写回需求 wiki 子文档)。本技能职责:
- 供料:执行 get,并对照
$CTX/sediment.md台账标出尚未沉淀的部分(结论、CR 往返要点、踩坑)。 - 写入动作由组合的技能/用户指令完成(目标常是 meta.wiki_url 指向的子文档)。
- 写入完成后,往
$CTX/sediment.md追加一行台账:- <日期> 沉淀至 <文档/位置>:<一句话内容摘要>。
自动接续(默认行为)
init / add / get 任一动作完成后,不等用户指示,立即接续调用 harness-ceilf6:$CTX/plan.md 不存在走其全流程(计划门起步),存在走续入。「把这个 MR 评论存进上下文」默认等于「存进去并开始修」。
豁免仅两种(会话判断):
- 用户指令含明确的存储限定(「只存不跑」「先不开发」「暂不接续」等语义);
- 本次调用本身是沉淀供料(收尾流程,不回头开发)。
约束
context/只增不改:勘误用新条目说明,不回改旧文件。- 本技能不写代码仓文件、不建 MR、不动 Meego 状态。
- status 变更用
ctx-dir.sh set-status <状态>,不手改 meta.json 其他字段。例外三处:wiki_url / selftest_url 补写(jq '.wiki_url="<url>"' "$CTX/meta.json" > "$CTX/tmp" && mv "$CTX/tmp" "$CTX/meta.json",selftest_url 同形,由 harness-ceilf6 收尾建自测矩阵子文档后写入);milestones 节点时间戳由 harness-ceilf6 的threads.sh mark写入;harness-ceilf6 看板手控的threads.sh set-node/threads.sh undone在钉节点与撤销完成时连带改写 status。