harness-tour

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Skill: harness-tour

Skill: harness-tour

WHAT

WHAT

Purpose và context

目的与背景

  • Purpose: Cho user THẤY (không phải đọc) harness hoạt động: bạn — Claude — cố tình vi phạm rule trên project thật, bị hook chặn theo thời gian thực, và tường thuật lại. Kết thúc không để lại rác.
  • Trigger (when to use): user gõ
    /harness-tour
    hoặc nói "harness tour", "xem harness làm gì", "test short", "test full" (
    disable-model-invocation: true
    — chỉ chạy khi user gọi). Hai độ dài: SHORT (mặc định, R1·R2·R3) và FULL (R1–R10).
  • Non-goals: không cài/sửa harness (chỉ gợi ý lệnh cài khi MISSING), không diễn giả khi không có hook, không đụng file có sẵn của project, không thay
    demo.sh
    /
    test-broad.sh
    (bản máy-diễn không cần phiên).
  • 目的: 让用户亲眼看到(而不是阅读)harness 如何运行:你——Claude——在真实项目上故意违反 rule,被 hook 实时拦截,并进行解说。结束后不留下任何残留内容。
  • 触发条件(何时使用): 用户输入
    /harness-tour
    或说 “harness tour”、“看看 harness 做什么”、“test short”、“test full”(
    disable-model-invocation: true
    — 仅在用户调用时运行)。两种长度:SHORT(默认,R1·R2·R3)和 FULL(R1–R10)。
  • 非目标: 不安装或修改 harness(仅在 MISSING 时建议安装命令);没有 hook 时不做演示;不触碰项目已有文件;不替换
    demo.sh
    /
    test-broad.sh
    (无 session 的机器演示版本)。

Mental model

心智模型

ARGUMENTS → độ dài (SHORT|FULL) → pre-check harness (POC|PROD|MISSING) → mỗi cảnh: tường thuật → vi phạm có chủ đích trên path map 1-rule → hook chặn live → trích nguyên văn → khắc phục → dọn dẹp tour-demo* + row index cùng lượt → kết màn trích audit.jsonl
. Rule chia 3 nhóm: chặn-live (R1,R2,R3,R5,R7,R9) · ghi/nhắc không chặn (R4,R8,R10) · tầng repo (R6).
ARGUMENTS → 长度(SHORT|FULL)→ harness 预检查(POC|PROD|MISSING)→ 每个场景:解说 → 按仅会触发 1 个 rule 的 path→rule 映射故意违规 → hook 实时拦截 → 原样摘录 → 修复 → 在同一轮次中清理 tour-demo* + index row → 结尾摘录 audit.jsonl
。Rule 分为 3 组:实时拦截(R1、R2、R3、R5、R7、R9)· 记录或提示但不拦截(R4、R8、R10)· repo 层(R6)。

Input và output contract

Input 和 output 契约

FieldRequired?Ý nghĩa
InARGUMENTSkhôngchứa
full
/
10
/"đầy đủ" → FULL; còn lại → SHORT
Insession mở ở root project đã cài harnesscó
.claude/settings.json
phải được load, không thì MISSING
Outtường thuật + stderr chặn trích nguyên văn mỗi cảnhcóvd
[R1 no-write-raw] …
,
[R3 index-sync] …
Outproject sạchcómọi
tour-demo*
đã PASS bị xoá + row index tương ứng; artifact harness giữ nguyên
Outkết màncótóm rule vừa chặn +
cat
vài dòng cuối
.claude/audit/*.jsonl
; FULL thêm bảng 10 rule
字段必需?含义
输入ARGUMENTS否包含
full
/
10
/“完整” → FULL;其他情况 → SHORT
输入在已安装 harness 的项目 root 中打开的 session是必须加载
.claude/settings.json
,否则为 MISSING
输出每个场景的解说 + 原样摘录的拦截 stderr是例如
[R1 no-write-raw] …
、
[R3 index-sync] …
输出干净的项目是所有已 PASS 的
tour-demo*
均被删除,对应 index row 也被删除;harness artifact 保持不变
输出结尾内容是总结刚刚拦截的 rule +
cat
.claude/audit/*.jsonl
的最后几行;FULL 额外提供 10 个 rule 的表格

Rules và capabilities

Rules 和 capabilities

  • RULE-01 (MUST): Mỗi cảnh: tường thuật → vi phạm → trích nguyên văn lý do chặn → khắc phục. Không diễn tắt.
  • RULE-02 (MUST): Chỉ đụng file tên
    tour-demo*
    ; tuyệt đối không sửa/xóa file có sẵn của project.
  • RULE-03 (MUST): Một cảnh đáng-lẽ-chặn mà KHÔNG bị chặn → dừng tour, báo "hàng rào hỏng ở rule X" — đó là bug thật cần xử lý (KHÔNG áp dụng cho nhóm không-chặn R4/R6/R8/R10 — chúng vốn không block).
  • Capabilities: ghi/xoá file demo
    tour-demo*
    trong
    llmwiki/
    + sửa
    wiki/index.md
    (row demo); đọc artifact audit; chạy script harness cục bộ. Phụ thuộc hook của host (PreToolUse/Stop) — không có hook thì không diễn.
  • RULE-01 (MUST):每个场景都必须按以下顺序进行:解说 → 违规 → 原样摘录拦截原因 → 修复。不得进行主观解释。
  • RULE-02 (MUST):只能操作名称为
    tour-demo*
    的文件;绝不能修改或删除项目已有文件。
  • RULE-03 (MUST):某个场景本应被拦截却没有被拦截时,立即停止 tour,并报告“rule X 的防护栏已损坏”——这是需要处理的真实 bug。 (此规则不适用于不拦截的 R4/R6/R8/R10——它们本来就不会 block。)
  • Capabilities:在
    llmwiki/
    中创建或删除
    tour-demo*
    demo 文件,并修改
    wiki/index.md
    (demo row);读取 audit artifact;运行本地 harness 脚本。依赖宿主提供的 hook(PreToolUse/Stop)——没有 hook 时不进行演示。

Failure boundaries

失败边界

  • Pre-check không in gì → blocked (MISSING): DỪNG, gợi ý lệnh cài PoC + mở session mới tại root, không diễn giả.
  • Cảnh đáng-lẽ-chặn mà không bị chặn → failed: dừng tour, báo "hàng rào hỏng ở rule X" (trừ R4/R6/R8/R10).
  • Dọn dẹp xoá file mà sót row index → Stop hook R3 chặn chính lượt dọn → xoá row trong cùng lượt rồi kết thúc.
  • Pre-check 没有任何输出 → blocked(MISSING):立即停止,建议 PoC 安装命令,并让用户在项目 root 中打开新 session;不做演示。
  • 某个场景本应被拦截却没有被拦截 → failed:停止 tour,报告“rule X 的防护栏已损坏”(R4/R6/R8/R10 除外)。
  • 清理时删除了文件,却残留 index row → Stop hook R3 会拦截当前清理轮次 → 在同一轮次中删除残留 row,然后结束。

HOW

HOW

Main workflow

主工作流

StepTypeInputsActionOutputs/exitFailure/next
W01deterministicARGUMENTSChọn độ dài tourSHORT hoặc FULL—
W02deterministicroot sessionPre-check harness (lệnh
grep
/
test
dưới)
POC / PRODkhông in gì → MISSING, dừng
W03effectmap path → ruleDiễn kịch bản SHORT (3 cảnh) hoặc FULL (R1–R10) tuần tự, tường thuật TRƯỚC mỗi cảnhstderr chặn trích nguyên văn + file PASSkhông bị chặn → dừng, báo hàng rào hỏng
W04effectfile tour-demo* đã PASSDọn dẹp cùng một lượt: xoá file + row indexproject sạchStop R3 chặn → xoá row còn sót
W05deterministicauditKết màn: tóm rule +
cat
.claude/audit/*.jsonl
báo cáo—
Chi tiết từng bước (nguồn chân lý cho W01–W05):
StepTypeInputsActionOutputs/exitFailure/next
W01deterministicARGUMENTS选择 tour 长度SHORT 或 FULL—
W02deterministicroot session预检查 harness(使用下面的
grep
/
test
命令)
POC / PROD没有输出 → MISSING,停止
W03effectpath→rule 映射依次执行 SHORT(3 个场景)或 FULL(R1–R10)场景,每个场景开始前先解说原样摘录的拦截 stderr + PASS 文件未被拦截 → 停止并报告防护栏损坏
W04effect已 PASS 的
tour-demo*
文件
在同一轮次中清理:删除文件 + index row项目保持干净Stop R3 拦截 → 删除残留 row
W05deterministicaudit结尾:rule 总结 +
cat
.claude/audit/*.jsonl
报告—
各步骤详情(W01–W05 的唯一事实来源):

Chọn độ dài tour (đọc ARGUMENTS)

选择 tour 长度(读取 ARGUMENTS)

  • Chứa
    full
    /
    10
    / "đầy đủ" → FULL (R1–R10).
  • Còn lại (mặc định, hay
    short
    /
    3
    ) → SHORT (3 cảnh: R1 · R2 · R3).
  • 包含
    full
    /
    10
    / “完整” → FULL(R1–R10)。
  • 其他情况(默认,或
    short
    /
    3
    )→ SHORT(3 个场景:R1 · R2 · R3)。

Pre-check — phát hiện harness nào đang sống trong session

Pre-check — 检测 session 中正在生效的 harness

Chạy ở ROOT của session:
bash
{ grep -q llmwiki-validate .claude/settings.json 2>/dev/null && test -f harness/poc-vendor-neutral/bin/llmwiki-validate.py && echo POC; }
test -f llmwiki/.claude/hooks/pre_tool_use.py && echo PROD
  • In
    POC
    → cách CHÍNH. PoC nay đủ R1–R10 (5 rule chặn ở PreToolUse + R3/R4/R8/R10 qua hook sự kiện).
  • In
    PROD
    → harness production. Cùng R1–R10, cùng kịch bản short/full dưới đây; chỉ khác tên hook script (
    pre_tool_use.py
    /
    post_tool_use.py
    /
    stop.py
    ) và R1 có thể chặn qua
    permissions.deny
    . Diễn y hệt.
  • KHÔNG in gì → MISSING. DỪNG (đừng diễn giả), gợi ý cài (PoC là cách chính):
    bash
    curl -fsSL https://raw.githubusercontent.com/Rheinmir/setup/orca/harness/poc-vendor-neutral/bootstrap.sh | bash
    rồi mở session Claude MỚI tại root project đó (để
    .claude/settings.json
    được load) → gõ lại
    /harness-tour
    .
Hook chỉ chặn khi session load
.claude/settings.json
ở đúng root project đã cài
. Mở session ở repo nguồn / root khác → không có hook → tour KHÔNG diễn (diễn mà không bị chặn = dàn dựng, cấm).
在 session 的 ROOT 中运行:
bash
{ grep -q llmwiki-validate .claude/settings.json 2>/dev/null && test -f harness/poc-vendor-neutral/bin/llmwiki-validate.py && echo POC; }
test -f llmwiki/.claude/hooks/pre_tool_use.py && echo PROD
  • 输出
    POC
    → 主要方式。当前 PoC 已覆盖 R1–R10(5 个 rule 在 PreToolUse 阶段拦截,R3/R4/R8/R10 通过事件 hook 处理)。
  • 输出
    PROD
    → production harness。R1–R10 以及下面的 short/full 场景完全相同;唯一区别是 hook 脚本名称(
    pre_tool_use.py
    /
    post_tool_use.py
    /
    stop.py
    ),且 R1 可以通过
    permissions.deny
    拦截。演示完全相同。
  • 没有任何输出 → MISSING。立即停止(不要演示),建议安装(PoC 是主要方式):
    bash
    curl -fsSL https://raw.githubusercontent.com/Rheinmir/setup/orca/harness/poc-vendor-neutral/bootstrap.sh | bash
    然后在该项目 root 中打开新的 Claude session(确保加载
    .claude/settings.json
    )→ 再次输入
    /harness-tour
    。
只有当 session 在已安装 harness 的正确项目 root 中加载
.claude/settings.json
时,hook 才会拦截。若在源 repo 或其他 root 中打开 session → 不会存在 hook → tour 不会进行演示(在未被拦截的情况下演示等于排练,禁止执行)。

Harness là HOOK, KHÔNG phải MCP (giải thích nếu user hỏi "sao /mcp không thấy")

Harness 是 HOOK,不是 MCP(如果用户问“为什么在 /mcp 中看不到”则进行解释)

Lớp chặn là PreToolUse hook → kiểm bằng
/hooks
hoặc khối
hooks
trong
.claude/settings.json
, KHÔNG ở
/mcp
. MCP là thứ khác (tool cho model gọi). PoC: hook gọi
llmwiki-validate claude-hook
. Production:
pre_tool_use.py
…

拦截层是 PreToolUse hook → 可通过
/hooks
或
.claude/settings.json
中的
hooks
块进行检查,而不是在
/mcp
中。 MCP 是另一回事(供 model 调用的 tool)。PoC:hook 调用
llmwiki-validate claude-hook
。Production:
pre_tool_use.py
…

Bảng map path → rule (DÙNG ĐÚNG path để mỗi cảnh chỉ kích 1 rule)

path→rule 映射表(使用正确路径,确保每个场景只触发 1 个 rule)

Nhiều rule cùng soi
wiki/
→ chọn sai path là 2 rule cùng chặn, rối. Map chuẩn (theo
policy.yaml
):
RuleFile để vi phạmVì sao CHỈ rule đó kích
R1 no-write-raw
llmwiki/raw/tour-demo.md
deny_write glob
raw/**
R2 origin-required
llmwiki/wiki/sources/draft/tour-demo.md
=
---\ntype: draft\n---\n# Tour Demo
(CÓ frontmatter, KHÔNG
## Origin
, KHÔNG
## Plan
)
frontmatter → R9 qua; thiếu Origin → R2 chặn
R3 index-sync(Stop) chính file R2 vừa tạo, CHƯA có trong
wiki/index.md
m_stop
quét
concepts/entities/sources/draft
so với index
R5 folder-structure
llmwiki/wiki/tour-demo.md
(ngay dưới
wiki/
, basename lạ)
forbid_root:
wiki/*.md
không thuộc allow-list
R7 proposal-complete
llmwiki/wiki/sources/draft/tour-demo-proposal.md
— CÓ frontmatter +
## Origin
+
## Plan
+
proposed
, THIẾU
## Agent Task Assignment
&
Sequence diagram
frontmatter→R9 qua, Origin→R2 qua → R7 là cái chặn
R9 okf-frontmatter
llmwiki/wiki/concepts/tour-demo.md
— CÓ
## Origin
nhưng KHÔNG có YAML frontmatter
có Origin nên R2 qua; thiếu
type:
→ R9 chặn
⚠️ R9 nay phủ CẢ
sources/
+
draft/
(khớp global production — nháp cũng cần frontmatter). Vì R2/R9 cùng soi mọi content dir → cô lập bằng NỘI DUNG, không bằng path: file CÓ frontmatter mà THIẾU Origin → chỉ R2; file CÓ Origin mà THIẾU frontmatter → chỉ R9.
Không-chặn-live (chỉ cho XEM artifact, nói rõ "không chặn"): R4 (
.claude/audit/audit.jsonl
+
log.md
), R8 (dòng
[harness] N rule…
lúc SessionStart), R10 (
.claude/audit/.docs-gate.json
đếm prompt). Tầng repo: R6 (pre-commit + CI
.github/workflows/harness.yml
+ skill
/verify-before-commit
).

多个 rule 会同时检查
wiki/
→ 如果选错路径,就可能同时触发 2 个 rule 并造成混乱。标准映射(依据
policy.yaml
):
Rule用于违规的文件为何只触发该 rule
R1 no-write-raw
llmwiki/raw/tour-demo.md
deny_write
glob
raw/**
R2 origin-required
llmwiki/wiki/sources/draft/tour-demo.md
=
---\ntype: draft\n---\n# Tour Demo
(有 frontmatter,没有
## Origin
,也没有
## Plan
)
有 frontmatter,因此 R9 放行;缺少 Origin,因此 R2 拦截
R3 index-sync(Stop)刚创建的同一个 R2 文件,但尚未加入
wiki/index.md
m_stop
扫描
concepts/entities/sources/draft
并与 index 对比
R5 folder-structure
llmwiki/wiki/tour-demo.md
(直接位于
wiki/
下,basename 不符合规则)
forbid_root
:
wiki/*.md
不在 allow-list 中
R7 proposal-complete
llmwiki/wiki/sources/draft/tour-demo-proposal.md
— 有 frontmatter +
## Origin
+
## Plan
+
proposed
,但缺少
## Agent Task Assignment
和
Sequence diagram
frontmatter 使 R9 放行,Origin 使 R2 放行,因此由 R7 拦截
R9 okf-frontmatter
llmwiki/wiki/concepts/tour-demo.md
— 有
## Origin
,但没有 YAML frontmatter
有 Origin,因此 R2 放行;缺少
type:
,因此 R9 拦截
⚠️ R9 现在同时覆盖
sources/
和
draft/
(与 global production 保持一致——draft 同样需要 frontmatter)。由于 R2 和 R9 都会检查所有 content 目录,因此必须通过内容进行隔离,而不是通过路径:文件有 frontmatter 但缺少 Origin → 只触发 R2;文件有 Origin 但缺少 frontmatter → 只触发 R9。
不实时拦截(仅展示 artifact,并明确说明“不拦截”):R4(
.claude/audit/audit.jsonl
+
log.md
)、R8(SessionStart 时的
[harness] N rule…
行)、R10(
.claude/audit/.docs-gate.json
prompt 计数器)。 Repo 层:R6(pre-commit + CI
.github/workflows/harness.yml
+ skill
/verify-before-commit
)。

KỊCH BẢN SHORT (mặc định) — 3 cảnh, diễn TUẦN TỰ, tường thuật TRƯỚC mỗi cảnh

SHORT 场景(默认)— 3 个场景,依次执行,每个场景开始前先解说

Mở màn: "Tôi sẽ cố tình vi phạm 3 rule. Xem hook chặn tôi theo thời gian thực — không phải tôi tự nhường."
Cảnh 1 — R1 (PreToolUse · deny ghi raw/):
  • Tường thuật: "raw/ là inbox của con người, agent không được ghi."
  • Write
    llmwiki/raw/tour-demo.md
    → exit 2 → CHẶN. Trích nguyên văn stderr
    [R1 no-write-raw] …
    . KHÔNG retry. File không ra đời.
Cảnh 2 — R2 (PreToolUse · ép
## Origin
):
  • Tường thuật: "Tạo file nguồn mà 'quên'
    ## Origin
    → không truy được gốc."
  • Write
    llmwiki/wiki/sources/draft/tour-demo.md
    =
    ---\ntype: draft\n---\n# Tour Demo
    (CÓ frontmatter để R9 qua, nhưng KHÔNG có
    ## Origin
    ) → exit 2 → CHẶN. Trích
    [R2 origin-required] …
    .
  • Sửa: Write lại đúng file đó, thêm
    ## Origin\n- harness-tour demo
    (giữ nguyên frontmatter) → lần này PASS, file được ghi.
Cảnh 3 — R3 (Stop · index nói dối):
  • Tường thuật: "File tour-demo vừa tạo nhưng tôi cố tình KHÔNG ghi nó vào
    wiki/index.md
    . Giờ thử kết thúc lượt."
  • Kết thúc response tại đây mà không cập nhật index → Stop hook (
    harness-events.py stop
    ) trả exit 2, đưa danh sách lệch về.
  • Khi bị block: trích nguyên văn
    [R3 index-sync] wiki/index.md chưa liệt kê: …
    , rồi thêm đúng 1 row cho tour-demo vào
    wiki/index.md
    , sang dọn dẹp.
→ tiếp Dọn dẹp (dưới).

开场: “我会故意违反 3 个 rule。请看 hook 如何实时拦截我——这不是我自己主动让步。”
场景 1 — R1(PreToolUse · 禁止写入 raw/):
  • 解说:“raw/ 是人类收件箱,agent 不得写入。”
  • Write
    llmwiki/raw/tour-demo.md
    → exit 2 → 拦截。原样摘录 stderr
    [R1 no-write-raw] …
    。不得重试。文件不会创建。
场景 2 — R2(PreToolUse · 强制要求
## Origin
):
  • 解说:“创建一个故意‘忘记’
    ## Origin
    的源文件 → 无法追溯来源。”
  • Write
    llmwiki/wiki/sources/draft/tour-demo.md
    =
    ---\ntype: draft\n---\n# Tour Demo
    (有 frontmatter,因此 R9 放行,但没有
    ## Origin
    )→ exit 2 → 拦截。原样摘录
    [R2 origin-required] …
    。
  • 修复: 重新 Write 同一个文件,添加
    ## Origin\n- harness-tour demo
    (保留 frontmatter)→ 此次 PASS,文件写入成功。
场景 3 — R3(Stop · index 失同步):
  • 解说:“刚创建的 tour-demo 文件,我故意不把它写入
    wiki/index.md
    。现在尝试结束本轮。”
  • 在此处结束 response,不更新 index → Stop hook(
    harness-events.py stop
    )返回 exit 2,并给出不匹配列表。
  • 被拦截时:原样摘录
    [R3 index-sync] wiki/index.md chưa liệt kê: …
    ,然后向
    wiki/index.md
    添加且仅添加 1 个 tour-demo row,再进入清理。
→ 接下来执行清理(见下文)。

KỊCH BẢN FULL (khi ARGUMENTS có
full
) — R1–R10 tuần tự

FULL 场景(ARGUMENTS 包含
full
时)— 依次执行 R1–R10

Diễn 6 cảnh chặn-live (R1,R2,R3,R5,R7,R9) + 3 cái không-chặn cho xem artifact (R4,R8,R10) + 1 cái repo (R6). Nói rõ trước nhóm không-chặn: "3 rule sau KHÔNG chặn lúc gõ — chúng GHI/NHẮC; tôi sẽ chỉ artifact làm bằng."
R1 — Write
llmwiki/raw/tour-demo.md
→ CHẶN (deny raw/). Trích, không retry.
R2 — Write
llmwiki/wiki/sources/draft/tour-demo.md
(CÓ frontmatter
---\ntype: draft\n---
để R9 qua, nhưng thiếu
## Origin
) → CHẶN → thêm
## Origin
→ PASS.
R3 — (Stop) kết thúc lượt khi file R2 chưa vào
index.md
→ Stop block → thêm row index → tiếp. (Trong FULL, để liền mạch có thể gộp R3 vào cuối: sau khi tạo các file PASS bên dưới, thử kết thúc 1 lượt còn lệch index → block → cập nhật index.)
R4 — log-append (KHÔNG chặn): sau một Write PASS, chỉ
.claude/audit/audit.jsonl
vừa có dòng mới (tool+path+timestamp) và
.claude/audit/log.md
được sinh lại.
cat
vài dòng cuối làm bằng — "máy ghi, tôi không xoá được."
R5 — Write
llmwiki/wiki/tour-demo.md
(ngay dưới
wiki/
) → CHẶN
[R5 folder-structure] …
(file wiki phải nằm trong concepts/entities/…). Không retry.
R6 — verify-before-commit (repo, KHÔNG chặn-live): chỉ ra cổng commit gồm pre-commit hook + CI
.github/workflows/harness.yml
(gọi lõi
files
mode trên .md đổi) + skill
/verify-before-commit
(Claude tự soi code mới trước khi commit). Đây là tầng repo, không phải session — không demo block trực tiếp.
R7 — Write
llmwiki/wiki/sources/draft/tour-demo-proposal.md
có frontmatter +
## Origin
+
## Plan
+
proposed
nhưng THIẾU
## Agent Task Assignment
&
Sequence diagram
→ CHẶN
[R7 proposal-complete] …
→ sửa thêm 2 mục đó → PASS.
R8 — pattern-health (KHÔNG chặn): chạy
python3 harness/poc-vendor-neutral/bin/harness-events.py session
để hiện dòng
[harness] N rule đang gác…
(+ cảnh báo drift nếu policy lệch remote). Đây là thứ in lúc SessionStart.
R9 — Write
llmwiki/wiki/concepts/tour-demo.md
có
## Origin
nhưng KHÔNG có YAML frontmatter → CHẶN
[R9 okf-frontmatter] …
(thiếu
type
) → sửa thêm
---\ntype: concept\n---
lên đầu → PASS.
R10 — docs-gate (KHÔNG chặn):
cat .claude/audit/.docs-gate.json
cho thấy bộ đếm prompt; giải thích mỗi
LLMWIKI_DOCS_GATE_EVERY
(mặc định 5) lượt, UserPromptSubmit chèn directive đề nghị gọi
/docs-site-macos
.
Kết FULL: bảng 10 rule — cái nào chặn-live, cái nào ghi/nhắc, cái nào ở repo; trích
.claude/audit/*.jsonl
làm bằng.

依次执行 6 个实时拦截场景(R1、R2、R3、R5、R7、R9)、3 个仅展示 artifact 的不拦截场景(R4、R8、R10),以及 1 个 repo 场景(R6)。 在进入不拦截场景组之前明确说明:“接下来的 3 个 rule 不会在输入过程中拦截;它们只会记录或提示。我将展示对应 artifact 作为证明。”
R1 — Write
llmwiki/raw/tour-demo.md
→ 拦截(禁止写入 raw/)。原样摘录,不得重试。
R2 — Write
llmwiki/wiki/sources/draft/tour-demo.md
(有 frontmatter
---\ntype: draft\n---
,因此 R9 放行,但缺少
## Origin
)→ 拦截 → 添加
## Origin
→ PASS。
**R3 —(Stop)**在 R2 文件尚未加入
index.md
时结束本轮 → Stop 拦截 → 添加 index row → 继续。 (在 FULL 中,为了保持流程连贯,也可以将 R3 合并到最后:创建下方所有 PASS 文件后,尝试结束一轮仍存在 index 不一致的场景 → 拦截 → 更新 index。)
**R4 — log-append(不拦截):**在一次 PASS 的 Write 之后,
.claude/audit/audit.jsonl
会新增一行(tool+path+timestamp),并重新生成
.claude/audit/log.md
。使用
cat
查看最后几行作为证明——“这是机器记录的,我无法删除它。”
R5 — Write
llmwiki/wiki/tour-demo.md
(直接位于
wiki/
下)→ 拦截
[R5 folder-structure] …
(wiki 文件必须位于 concepts/entities/… 中)。不得重试。
**R6 — verify-before-commit(repo,不实时拦截):**指出 commit 门禁由 pre-commit hook + CI
.github/workflows/harness.yml
(对变更的 .md 文件调用核心
files
模式)+ skill
/verify-before-commit
(Claude 在 commit 前自行检查新代码)组成。这属于 repo 层,而不是 session 层,因此不直接演示拦截。
R7 — Write
llmwiki/wiki/sources/draft/tour-demo-proposal.md
,包含 frontmatter +
## Origin
+
## Plan
+
proposed
,但缺少
## Agent Task Assignment
和
Sequence diagram
→ 拦截
[R7 proposal-complete] …
→ 补上这两个部分 → PASS。
**R8 — pattern-health(不拦截):**运行
python3 harness/poc-vendor-neutral/bin/harness-events.py session
,显示
[harness] N rule đang gác…
行(如果 policy 与 remote 不一致,还会显示 drift 警告)。这是 SessionStart 时输出的内容。
R9 — Write
llmwiki/wiki/concepts/tour-demo.md
,包含
## Origin
,但没有 YAML frontmatter → 拦截
[R9 okf-frontmatter] …
(缺少
type
)→ 在文件开头添加
---\ntype: concept\n---
→ PASS。
R10 — docs-gate(不拦截):
cat .claude/audit/.docs-gate.json
会显示 prompt 计数器;解释每经过
LLMWIKI_DOCS_GATE_EVERY
(默认 5)轮,UserPromptSubmit 会插入一条建议调用
/docs-site-macos
的 directive。
**FULL 结尾:**提供 10 个 rule 的表格——哪些会实时拦截、哪些只记录或提示、哪些位于 repo 层;并摘录
.claude/audit/*.jsonl
作为证明。

Dọn dẹp (BẮT BUỘC — cùng một lượt, kẻo R3 chặn)

清理(强制要求 — 必须在同一轮次中完成,否则 R3 会拦截)

Xóa MỌI file
tour-demo*
đã PASS (được tạo) và xóa row tương ứng trong
wiki/index.md
trong cùng lượt (xóa file mà để row → index lệch → Stop hook chặn chính lượt dọn):
  • SHORT:
    wiki/sources/draft/tour-demo.md
    + row của nó.
  • FULL: thêm
    wiki/sources/draft/tour-demo-proposal.md
    ,
    wiki/concepts/tour-demo.md
    + các row.
  • Các file bị CHẶN (raw/tour-demo, wiki/tour-demo R5) không tồn tại → khỏi xóa.
  • Artifact harness (
    audit.jsonl
    ,
    log.md
    ,
    .docs-gate.json
    ) là bản ghi máy hợp lệ → giữ nguyên, không xóa.
  • TUYỆT ĐỐI không đụng file có sẵn khác của project.
Kết màn: tóm 1 đoạn các rule vừa chặn + "mọi tool call vừa rồi nằm trong
.claude/audit/*.jsonl
— máy ghi, tôi không quên được" (cat vài dòng cuối). Bản máy-diễn không cần phiên:
bash harness/poc-vendor-neutral/demo.sh
(13 assertion) ·
test-broad.sh
(63).
删除所有已 PASS(已创建)的
tour-demo*
文件,并在同一轮次中删除
wiki/index.md
中对应的 row(如果只删除文件却保留 row,就会产生 index 不一致,Stop hook 会拦截当前清理轮次):
  • SHORT:删除
    wiki/sources/draft/tour-demo.md
    及其 row。
  • FULL:还需删除
    wiki/sources/draft/tour-demo-proposal.md
    、
    wiki/concepts/tour-demo.md
    及其 rows。
  • 被拦截的文件(raw/tour-demo、wiki/tour-demo R5)并不存在 → 无需删除。
  • Harness artifact(
    audit.jsonl
    、
    log.md
    、
    .docs-gate.json
    )是合法的机器记录 → 保持不变,不得删除。
  • 绝不触碰项目中其他已有文件。
**结尾:**用一个段落总结刚刚拦截的 rule,并说明“刚才所有 tool call 都记录在
.claude/audit/*.jsonl
中——这是机器记录的,我无法忘记”(使用
cat
查看最后几行)。机器演示版本无需 session:
bash harness/poc-vendor-neutral/demo.sh
(13 个 assertion)·
test-broad.sh
(63 个)。

Branches

分支

IDKindGuardHành viSkip / failureRejoin
B01user_optionalARGUMENTS có
full
/
10
/ "đầy đủ"
KỊCH BẢN FULL R1–R10 thay SHORTmặc định → SHORTW04
B02conditional_requiredpre-check in
PROD
diễn y hệt, chỉ khác tên hook script (
pre_tool_use.py
/
post_tool_use.py
/
stop.py
), R1 có thể chặn qua
permissions.deny
—W03
B03recoverypre-check không in gì (MISSING)DỪNG, gợi ý lệnh curl
bootstrap.sh
PoC (khối Pre-check) rồi mở session MỚI tại root project
không diễnkết thúc
B04user_optionaluser hỏi "sao /mcp không thấy"giải thích harness là HOOK (kiểm
/hooks
), không phải MCP
—W03
IDKindGuard行为Skip / failureRejoin
B01user_optionalARGUMENTS 包含
full
/
10
/ “完整”
使用 FULL R1–R10 场景替代 SHORT默认 → SHORTW04
B02conditional_requiredPre-check 输出
PROD
演示完全相同,仅 hook 脚本名称不同(
pre_tool_use.py
/
post_tool_use.py
/
stop.py
),R1 可以通过
permissions.deny
拦截
—W03
B03recoveryPre-check 没有任何输出(MISSING)立即停止,建议使用 curl
bootstrap.sh
安装 PoC(Pre-check 块),然后在项目 root 中打开新 session
不进行演示结束
B04user_optional用户询问“为什么在 /mcp 中看不到”解释 harness 是 HOOK(检查
/hooks
),而不是 MCP
—W03

Validation và stopping

验证与停止条件

Mỗi cảnh chặn-live chỉ tính khi hook thật trả exit 2 và stderr được trích nguyên văn; không retry sau chặn (trừ bước khắc phục đã định). Tour dừng ngay khi một rule chặn-live không chặn. Xong khi không còn
tour-demo*
và
wiki/index.md
khớp.
只有当真实 hook 返回 exit 2,并且 stderr 被原样摘录时,实时拦截场景才算成功;被拦截后不得重试(已规定的修复步骤除外)。一旦某个实时拦截 rule 没有执行拦截,tour 必须立即停止。当不再存在
tour-demo*
,且
wiki/index.md
与之匹配时,tour 完成。

Examples

示例

  • Positive:
    /harness-tour
    trên project đã cài PoC → pre-check in
    POC
    → Write
    llmwiki/raw/tour-demo.md
    bị chặn
    [R1 no-write-raw] …
    → R2 chặn rồi PASS sau khi thêm
    ## Origin
    → kết lượt bị Stop
    [R3 index-sync] …
    → thêm row → dọn
    wiki/sources/draft/tour-demo.md
    + row cùng lượt.
  • Boundary/failure:
    /harness-tour full
    mở ở repo nguồn (không load
    .claude/settings.json
    của project) → pre-check không in gì → MISSING, dừng, gợi ý lệnh curl bootstrap + mở session mới; không diễn cảnh nào.
  • **正向:**在已安装 PoC 的项目中执行
    /harness-tour
    → Pre-check 输出
    POC
    → Write
    llmwiki/raw/tour-demo.md
    被
    [R1 no-write-raw] …
    拦截 → R2 拦截,添加
    ## Origin
    后 PASS → 结束本轮时被 Stop
    [R3 index-sync] …
    拦截 → 添加 row → 在同一轮次中删除
    wiki/sources/draft/tour-demo.md
    及其 row。
  • **边界/失败:**在源 repo 中执行
    /harness-tour full
    (没有加载项目的
    .claude/settings.json
    )→ Pre-check 没有任何输出 → MISSING,立即停止,建议执行 curl bootstrap 并打开新 session;不演示任何场景。