br
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseSkill: br — dây chuyền sản xuất Ralph (BR-kỹ → frames → loop có harness)
Skill: br — Ralph 生产线(严谨 BR → frames → 带 harness 的 loop)
BR = Business Requirements — bản đặc tả yêu cầu đã chốt, nằm ở. Skill đặt tên theo artifact trung tâm mà nó sản xuất, không theo động từ. Mọi frame và mọi clause đều truy ngược về file đó, nên "lỗi sản phẩm ⇔ lỗi BR" (GH#15, 2026-07-03) là tiền đề của cả dây chuyền chứ không phải khẩu hiệu.br/BR.mdHub 1-tên: user mô tả phạm vi (interview / compile / slice / run / status), KHÔNG phải nhớ nhiều lệnh. Nền tảng: council 028 (thin-slice, người-trong-vòng-lặp) + council 031/032 (loop v1 với 6 điều kiện bắt buộc — winner Taleb mean-rank 1.0).
BR = Business Requirements — 已敲定的需求规格说明,位于。Skill 以其生成的核心 artifact 命名,而非以动词命名。每个 frame 和每个 clause 都可追溯到该文件,因此“产品错误 ⇔ BR 错误”(GH#15,2026-07-03)是 整条生产线的前提,而不只是口号。br/BR.md单名称 Hub:用户只需描述范围(interview / compile / slice / run / status),无需 记住多个命令。基础来自 council 028(thin-slice、人在回路中)+ council 031/032(loop v1,包含 6 项强制条件——winner Taleb mean-rank 1.0)。
WHAT
是什么
Purpose và context
目的与上下文
- Purpose: biến tài liệu yêu cầu thô của user thành sản phẩm có kỷ luật qua dây chuyền BR-kỹ → frames → loop có harness, mọi frame và clause truy ngược về .
br/BR.md - Trigger (when to use):
- User có tài liệu yêu cầu (thô/không cấu trúc) và muốn biến thành sản phẩm có kỷ luật.
- User nói: interview / phỏng vấn yêu cầu / soạn BR / slice frame / chạy frame / trạng thái dây chuyền / ralph.
- Non-goals: không ghi vào ; không viết lại đồ nghề tất định đã build (
llmwiki/raw/,frame-lint.py,loop-runner.py…); không tự commit/merge thay người; không sửa UI tay ngoàibuild-line-status.py; không hook auto-fire./br run
- **目的:**将用户的原始需求文档转化为具有纪律约束的产品,流程为严谨 BR → frames → 带 harness 的 loop;每个 frame 和 clause 都可追溯到 。
br/BR.md - 触发条件(何时使用):
- 用户拥有原始或未结构化的需求文档,并希望将其转化为具有纪律约束的产品。
- 用户提到:interview / 需求访谈 / 编写 BR / slice frame / 运行 frame / 生产线状态 / ralph。
- **非目标:**不写入 ;不重写已经构建的确定性工具(
llmwiki/raw/、frame-lint.py、loop-runner.py…);不代替用户自动 commit/merge;不通过build-line-status.py之外的方式手动修改 UI;不触发自动运行的 hook。/br run
Mental model
心智模型
llmwiki/raw/ → interview (spec-filled S1–S10 + câu hỏi hỏi-bù) → compile (BR.md có clause_id + "Giả định đang gánh" + BR.clauses.json) → slice (frames có depends_on, frame-lint gác) → run (loop-runner 6 phanh, commit per-frame, sổ trace) → qc / find / status (truy ngược lỗi→frame→clause)llmwiki/raw/ → interview(填充 spec 的 S1–S10 + 补问问题)→ compile(BR.md,包含 clause_id +“当前承担的假设”+ BR.clauses.json)→ slice(frames,包含 depends_on,并由 frame-lint 把关)→ run(loop-runner 的 6 道刹车、按 frame commit、trace 账本)→ qc / find / status(将错误追溯至 frame → clause)Input và output contract
输入与输出契约
| Field | Required? | Ý nghĩa | |
|---|---|---|---|
| In | tài liệu thô trong | có (mode interview) | chỉ đọc; trống → hỏi user bỏ tài liệu vào |
| In | | có (mode compile) | câu trả lời thật của user theo field-id |
| In | phạm vi user mô tả | có | interview · compile · slice · run · find · qc · status · sync · contract · rail |
| In | cờ | không | nhánh tuỳ chọn (xem Branches) |
| Out | | mode interview | field có |
| Out | | mode compile | check-contract xanh |
| Out | | mode slice | frame-lint xanh |
| Out | commit | mode run | tóm tắt một dòng + medic |
| Out | | mode status | tóm tắt 3 dòng |
| 字段 | 必需? | 含义 | |
|---|---|---|---|
| 输入 | | 是(interview mode) | 只读;为空 → 询问用户将文档放入其中 |
| 输入 | 已填写的 | 是(compile mode) | 用户按 field-id 填写的真实答案 |
| 输入 | 用户描述的范围 | 是 | interview · compile · slice · run · find · qc · status · sync · contract · rail |
| 输入 | 标志 | 否 | 可选分支(参见 Branches) |
| 输出 | | interview mode | 字段包含 |
| 输出 | | compile mode | check-contract 通过 |
| 输出 | | slice mode | frame-lint 通过 |
| 输出 | commit | run mode | 一行摘要 + medic |
| 输出 | | status mode | 三行摘要 |
Rules và capabilities
规则与能力
- RULE-01 (MUST): Người là cổng cuối — KHÔNG tự commit/merge output frame; dry-run + người duyệt (council 028).
- RULE-02 (MUST): Phanh bất khả xâm phạm — không bao giờ nâng max_iter hay tắt guard "để nó xong". Thừa phanh rẻ hơn thiếu phanh (council 031/032).
- RULE-03 (MUST): Prompt-dặn KHÔNG phải lớp an toàn — scope-jail/test-hash là code tất định (loop-runner guard 5/6), không phải lời dặn trong prompt (council 5/5 ghế).
- RULE-04 (MUST): Lens-fill luôn — không trộn với câu trả lời thật; luôn hiện ở bảng "Giả định đang gánh".
verified: false - RULE-05 (MUST): Slicer người-trong-vòng-lặp ở đợt đầu — chưa full-auto (lỗi slicer là lỗi tương quan, blast-radius = toàn BR).
- RULE-06 (MUST): File-first, on-demand — mọi artifact là file travel-được; skill gọi tay, KHÔNG hook auto-fire (ADR-004).
- RULE-07 (MUST): HTML sinh ra cho người xem phải giải nghĩa thuật ngữ + in full-path (R16).
- Capabilities: đọc tài liệu thô + codebase; ghi artifact dưới ; chạy tool tất định (lint, loop, monitor) cục bộ; gọi adapter model có tools bó hẹp; tạo issue ở tracker ngoài chỉ sau xác nhận.
br/
- RULE-01(必须):人是最后一道关卡——不得自动 commit/merge 输出的 frame;必须 dry-run + 由人审核(council 028)。
- RULE-02(必须):刹车不可侵犯——绝不能为了“让它完成”而提高 max_iter 或关闭 guard。多一道刹车比缺少刹车更便宜(council 031/032)。
- RULE-03(必须):提示词中的告诫不是安全层——scope-jail/test-hash 属于确定性代码(loop-runner guard 5/6),不能只是 prompt 中的提醒(council 5/5 席位)。
- RULE-04(必须):Lens-fill 始终标记 ——不得与用户的真实答案混合;始终显示在“当前承担的假设”表中。
verified: false - RULE-05(必须):Slicer 在首轮保持在回路中——尚非 full-auto(slicer 错误具有关联性,blast-radius = 整个 BR)。
- RULE-06(必须):File-first, on-demand——所有 artifact 都是可传输的文件;skill 由用户手动调用,绝不通过 hook 自动触发(ADR-004)。
- RULE-07(必须):为审阅者生成的 HTML 必须解释专业术语并打印 full-path(R16)。
- 能力:读取原始文档 + codebase;将 artifact 写入 ;在本地运行确定性工具(lint、loop、monitor);调用工具受限的 model adapter;仅在获得确认后创建外部 tracker issue。
br/
Failure boundaries
失败边界
- trống → clarify: hỏi user bỏ tài liệu vào.
llmwiki/raw/ - ĐỎ → compile failed, sửa BR tới khi xanh.
br-fill.py check-contract - đỏ, hoặc working-tree bẩn →
frame-lint.py checkblocked (từ chối chạy)./br run - Frame chưa có
tier: compensable/irreversible→ blocked (TIER-GATE).--ack-tier - Điều kiện KILL (vd diff-jail cắn ≥2 lần / test-hash cắn 1 lần) → cancelled cả run, không cứu, không nâng phanh.
- Frame đỏ → nhánh dưới (partial), nhánh không liên quan vẫn chạy.
status: blocked - Kiểm UI không có FILE ẢNH thật + → coi là failed (chưa từng làm).
MANIFEST.json
- 为空 → clarify:询问用户将文档放入其中。
llmwiki/raw/ - 为红色 → compile failed;修复 BR,直至通过。
br-fill.py check-contract - 为红色,或 working-tree 脏 →
frame-lint.py checkblocked,拒绝运行。/br run - Frame 的 尚未提供
tier: compensable/irreversible→ blocked(TIER-GATE)。--ack-tier - 触发 KILL 条件(例如 diff-jail 命中 ≥2 次 / test-hash 命中 1 次)→ 整个 run cancelled;不得挽救,也不得提高刹车力度。
- Frame 为红色 → 其下游分支标记为 (partial);无关分支仍可运行。
status: blocked - UI 检查缺少真实图片文件 + → 视为 failed(从未执行过)。
MANIFEST.json
HOW
如何执行
Main workflow
主工作流
| Step | Type | Inputs | Action | Outputs/exit | Failure/next |
|---|---|---|---|---|---|
| W01 | judgment | lời user | Chọn mode theo phạm vi user mô tả (hub 1-tên) | mode | mơ hồ → hỏi lại |
| W02 | judgment | | Mode 1 interview: bóc raw vào S1–S10, gap-diff, sinh questions.html + answers.md | 2 file NNN | raw trống → clarify; |
| W03 | deterministic | — | STOP — user mở HTML + điền answers.md | answers đã điền | |
| W04 | judgment | spec-filled + answers | Mode 2 compile: BR.md + BR.clauses.json (+ DESIGN.md nếu có UI) | BR | — |
| W05 | deterministic | BR | Gate | xanh | đỏ → sửa BR, lặp W05 |
| W06 | judgment | BR.md | Mode 3 slice: đề xuất lát cắt, STOP cho user duyệt TỪNG lát, ghi frame theo template | frames + index | — |
| W07 | deterministic | frames | Gác | lint xanh | đỏ → sửa frame, lặp W07 |
| W08 | effect | frame | Mode 4 run: | commit frame + run log | đỏ → chặn nhánh dưới; KILL → vứt run |
| W09 | deterministic | frames + run log + BR | Mode 5 status: | line-status.html | lỗi rơi vào assumed → quay W02 vòng sau |
Chi tiết từng bước (nguồn chân lý cho W01–W09 và mọi mode phụ):
| 步骤 | 类型 | 输入 | 操作 | 输出/退出条件 | 失败/下一步 |
|---|---|---|---|---|---|
| W01 | judgment | 用户话语 | 根据用户描述的范围选择 mode(单名称 Hub) | mode | 模糊 → 再次询问 |
| W02 | judgment | | Mode 1 interview:将 raw 映射到 S1–S10,执行 gap-diff,生成 questions.html + answers.md | 2 个 NNN 文件 | raw 为空 → clarify; |
| W03 | deterministic | — | STOP — 用户打开 HTML 并填写 answers.md | 答案已填写 | |
| W04 | judgment | spec-filled + answers | Mode 2 compile:生成 BR.md + BR.clauses.json(如果有 UI,再生成 DESIGN.md) | BR | — |
| W05 | deterministic | BR | 门禁 | 通过 | 失败 → 修复 BR,重复 W05 |
| W06 | judgment | BR.md | Mode 3 slice:提出切片方案,STOP 并让用户逐项审核,按模板写入 frame | frames + index | — |
| W07 | deterministic | frames | 门禁 | lint 通过 | 失败 → 修复 frame,重复 W07 |
| W08 | effect | frame | Mode 4 run: | frame commit + run log | 失败 → 阻止下游分支;KILL → 丢弃 run |
| W09 | deterministic | frames + run log + BR | Mode 5 status: | line-status.html | 错误落入 assumed → 下一轮返回 W02 |
以下为每个步骤的详细信息(W01–W09 及所有子 mode 的事实来源):
Đồ nghề tất định (đã build + selftest — KHÔNG viết lại)
确定性工具(已构建并通过 selftest——不要重写)
| Tool | Việc | selftest |
|---|---|---|
| bộ specs chuẩn S1–S10 (khung tham chiếu mọi project) | — |
| template TẤT ĐỊNH cho mọi frame (frontmatter + 4 section body người-đọc-hiểu) | — |
| template thiết kế tái dùng (khung Google design-doc + design system nạp từ | — |
| gác frame 7 luật (schema · scope · test-first · freshness · DAG · exclusive-scope có lease · content) | |
| loop 6 phanh (max_iter·budget·no_progress·escalate·diff-jail·test-hash) | |
| monitor tất định (frame·run-log·BR → json+html, | |
Runtime artifacts sống ở tại gốc project (không phải trong skill): ,
, , , ,
, , .
br/br/spec-filled.mdbr/interview/NNN-{questions.html,answers.md}br/BR.mdbr/BR.clauses.jsonbr/frames/*.mdbr/frames/index.mdbr/frames/<id>.run.jsonbr/line-status.{json,html}| 工具 | 用途 | selftest |
|---|---|---|
| 标准 S1–S10 specs(所有项目的参考框架) | — |
| 所有 frame 的确定性模板(frontmatter + 4 个供人阅读的正文 section) | — |
| 可复用的设计模板(Google design-doc 框架 + 从 | — |
| 把关 frame 的 7 条规则(schema · scope · test-first · freshness · DAG · 带 lease 的 exclusive-scope · content) | |
| 带 6 道刹车的 loop(max_iter·budget·no_progress·escalate·diff-jail·test-hash) | |
| 确定性 monitor(frame·run-log·BR → json+html, | |
运行时 artifacts 位于项目根目录的 下(不在 skill 内):、
、、、、
、、。
br/br/spec-filled.mdbr/interview/NNN-{questions.html,answers.md}br/BR.mdbr/BR.clauses.jsonbr/frames/*.mdbr/frames/index.mdbr/frames/<id>.run.jsonbr/line-status.{json,html}Mode 1 — /br interview
/br interviewMode 1 — /br interview
/br interview- Đọc TẤT CẢ file trong (chỉ đọc — luật cấm ghi raw/). Nếu trống → hỏi user bỏ tài liệu vào.
llmwiki/raw/ - Đối chiếu bộ specs chuẩn : bóc thông tin từ raw map vào từng field S1–S10 → ghi
skills/br/assets/spec-template.md. MỖI field ghibr/spec-filled.md(status) +filled|missing|conflict|assumed(provenance).raw:<file> - Gap-diff: field /
missing→ sinh bộ câu hỏi. Mỗi field là MỘT spec rõ (rigor /orca-workflow): câu hỏi nêu field LÀM GÌ + "trả lời thế nào là ĐỦ" (tiêu chí chấp nhận của field), không hỏi mơ hồ. Ghi 2 file (cùng số thứ tự NNN):conflict- — xem theo section, có giải nghĩa thuật ngữ + tiêu chí-đủ mỗi field, in full-path (R16), dark-mode. CHỈ hỏi phần thiếu.
br/interview/NNN-questions.html - — block điền theo field-id (vd
br/interview/NNN-answers.md… khoảng trống), để user gõ câu trả lời. 3b.## S4.2(T-260714-01, gọi tắt--proactive) — user muốn máy điền phần thiếu thay vì hỏi hết: chạy/br auto(tất định, không model). Tool tra registry defaults (python3 fdk/tools/br-fill.py fill --root .— bảng 26 điều kiện loop + convention github/spec-kit; project overrideskills/br/assets/defaults.yamlthắng khi trùng field) và in 2 nhóm:br/defaults.yaml - ĐỀ XUẤT MÁY ĐIỀN → dán vào , GIỮ NGUYÊN
NNN-answers.md+filled_by: <source>:<refs>từng mục (kỷ luật lens-fill áp cho mọi tầng máy điền).verified: false - CÂU HỎI THẬT (field carve-out — auth/quyền, trust boundary, tiền — và field không có default): chọn ≤5 câu theo Impact × Uncertainty (carve-out đã xếp trước, chiếm suất hỏi trước) đưa vào questions.html; phần vượt trần thì lens-fill (bước 5). Carve-out KHÔNG BAO GIỜ nhận giá trị máy — kể cả registry có entry, kể cả lens.
- STOP — báo user mở HTML xem + điền answers.md.
- Nếu user bật (hoặc nói "cho chuyên gia điền mục chưa chắc"): bốc lens bằng
--lens-fill, điền các fieldpython3 harness/scripts/council.py roster --case product --jsonmà user đánh dấu "không chắc" → mỗi field đóng dấumissing+filled_by: lens:<tên>. KHÔNG trộn với câu trả lời thật của user.verified: false
- 读取 中的所有文件(只读——禁止写入 raw/)。如果为空 → 询问用户将文档放入其中。
llmwiki/raw/ - 对照标准 specs :将 raw map 中的信息提取到每个 S1–S10 字段 → 写入
skills/br/assets/spec-template.md。每个字段都要写入br/spec-filled.md(status)+filled|missing|conflict|assumed(provenance)。raw:<file> - Gap-diff:对于 /
missing字段 → 生成问题集。**每个字段都是一项清晰 spec(rigor / orca-workflow):**问题需说明该字段的作用,以及“怎样回答才算充分”(字段的验收标准),不得含糊提问。写入两个具有相同序号 NNN 的文件:conflict- — 按 section 展示,包含术语解释 + 每个字段的充分性标准,打印 full-path(R16),支持 dark-mode。只询问缺失部分。
br/interview/NNN-questions.html - — 按 field-id 提供填写区块(例如
br/interview/NNN-answers.md……留空),供用户输入答案。 3b.## S4.2(T-260714-01,简称--proactive)——用户希望由机器代填缺失部分,而非全部询问时:运行/br auto(确定性执行,不使用 model)。工具遍历 registry defaults(python3 fdk/tools/br-fill.py fill --root .——包含 26 项 loop 条件 + github/spec-kit convention;项目覆盖文件skills/br/assets/defaults.yaml在字段冲突时优先),并输出两组内容:br/defaults.yaml - 机器代填建议 → 粘贴到 中,并原样保留每项的
NNN-answers.md+filled_by: <source>:<refs>(所有机器代填层级都遵循 lens-fill 纪律)。verified: false - 真实问题(field carve-out——auth/权限、trust boundary、金额,以及没有 default 的字段):按 Impact × Uncertainty 选择**≤5 个问题**(carve-out 已预先排序,优先占用提问配额),并写入 questions.html;超出阈值的内容通过 lens-fill 处理(步骤 5)。Carve-out 绝不接受机器生成的值——即使 registry 中存在对应项,即使来自 lens,也不得接受。
- STOP — 告知用户打开 HTML 查看并填写 answers.md。
- 如果用户启用 (或表示“让专家填写尚不确定的项目”):通过
--lens-fill抽取 lens,填写用户标记为“尚不确定”的python3 harness/scripts/council.py roster --case product --json字段 → 每个字段标记missing+filled_by: lens:<名称>。不得与用户的真实答案混合。verified: false
Mode 2 — /br compile
/br compileMode 2 — /br compile
/br compile- Đọc +
br/spec-filled.mdđã điền.br/interview/*-answers.md - Sinh : mỗi điều khoản có
br/BR.md(kế thừa field-id, vdclause_id) + provenance (S4.2). Đầu file là bảng "Giả định đang gánh" liệt kê mọi clauseraw|user|lens:<tên>/lens(fail-fast: nhìn một phát biết đang cược gì).assumed- Sản phẩm có UI (S7.5): chốt một clause NFR (vd ) TRỎ tới
N01 giao-diện, KHÔNG chép luật design vào BR. Đồng thời copybr/DESIGN.md→skills/br/assets/design-template.mdvà điền §1/§2/§4/§6/§7 cho sản phẩm (giữ nguyên §3/§5 kế thừa). BR = phải có theme/design; DESIGN.md = design trông ra sao.br/DESIGN.md
- Sản phẩm có UI (S7.5): chốt một clause NFR (vd
- Sinh :
br/BR.clauses.json—{clause_id: {provenance, assumed: bool, fields: ["S4.2", …]}}khai field spec S1–S10 mà clause hiện thực (khoá của checksum hợp đồng); monitor (fields) đọc file này để tô cam clause assumed. Bảng "Giả định đang gánh" nhóm theo nguồn fill (/br status/default/spec-kit) để người duyệt thấy đang cược gì từ đâu.lens - Gate checksum hợp đồng (vá G1 — council c9dc13d): — mọi required field S1–S10 phải có clause đối ứng; ĐỎ là compile FAIL, sửa BR cho tới khi xanh, không có chuyện "compile xong mà hợp đồng thủng".
python3 fdk/tools/br-fill.py check-contract --root .
- 读取 + 已填写的
br/spec-filled.md。br/interview/*-answers.md - 生成 :每个条款都包含
br/BR.md(继承 field-id,例如clause_id)+ provenance(S4.2)。文件开头是 “当前承担的假设” 表,列出所有raw|user|lens:<名称>/lensclause(fail-fast:一眼即可看出当前在押注什么)。assumed- 产品具有 UI(S7.5):敲定一条指向 的 NFR clause(例如
br/DESIGN.md),不要将设计规则复制到 BR。同时将N01 界面复制为skills/br/assets/design-template.md,并为产品填写 §1/§2/§4/§6/§7(保留继承的 §3/§5)。BR = 必须具备 theme/design;DESIGN.md = 设计呈现出的具体样子。br/DESIGN.md
- 产品具有 UI(S7.5):敲定一条指向
- 生成 :
br/BR.clauses.json——{clause_id: {provenance, assumed: bool, fields: ["S4.2", …]}}声明该 clause 实际实现的 S1–S10 spec 字段(合同 checksum 的键);monitor(fields)读取此文件,为 assumed clause 着色。“当前承担的假设”表按填充来源分组(/br status/default/spec-kit),让审核者看清当前押注内容的来源。lens - 合同 checksum 门禁(G1 修复——council c9dc13d):——每个 S1–S10 required field 都必须有对应 clause;为红色意味着 compile FAIL,必须修复 BR 直至通过,绝不允许出现“compile 完成但合同有漏洞”的情况。
python3 fdk/tools/br-fill.py check-contract --root .
Mode 3 — /br slice
/br sliceMode 3 — /br slice
/br slice- Đọc . ĐỀ XUẤT danh sách lát cắt: mỗi lát = {clause_ids, scope_code dự kiến (≤3 file), scope_test, acceptance_test, depends_on}. STOP cho user duyệt/sửa/gộp/tách TỪNG lát (người-trong-vòng-lặp — chốt chặn lỗi tương quan slicer). Lô đầu ≤ 3–5 frame.
br/BR.md- là bắt buộc nghĩ, không bắt buộc có (GH#75, distill Atomic Task Graph): dây chuyền là ĐỒ THỊ chứ không phải danh sách. Frame B khai
depends_onkhi B không thể xanh nếu A chưa xanh (B gọi API/store/schema A dựng). Không dựa ai →depends_on: [frame-A]. Khai đúng thì được ba thứ miễn phí ở mode 4: thứ tự chạy tự đúng, frame đỏ tự chặn nhánh dưới, và sửa một frame chỉ phải chạy lại đúng nhánh của nó. Khai bừa (nối cho "có vẻ hợp lý") thì mất song song và tạo chờ giả — chỉ nối khi có phụ thuộc THẬT.depends_on: []
- Ghi THEO TEMPLATE
br/frames/frame-NNN-<slug>.md(schema v0 + 5 section body bắt buộc: Nghiệp vụ · Input/Output · Spec (FR/SC) · Tiêu chí nghiệm thu · Ngoài phạm vi — viết cho NGƯỜI VỀ SAU đọc-hiểu, frame-lint R7 gác cứng: frame_id phải có slug nghiệp vụ, muc_tieu không được generic, mỗi frame có FR-id/SC-id rõ, section không được rỗng) +skills/br/assets/frame-template.md.parent_br_hash = sha256(br/BR.md) - Sinh registry (bảng frame_id · clause_ids · scope_code · status · run_log_ref) từ frontmatter các frame.
br/frames/index.md - Gác: — xanh hết mới coi là slice xong (gồm R6 exclusive-scope: 2 frame chưa xong không được giẫm cùng file).
python3 fdk/tools/frame-lint.py check br/frames --root .- R6 là HỢP ĐỒNG THUÊ, không phải sổ đỏ: frame đã xong (run-log ) nhả quyền giữ file. Nhờ vậy frame mới được nối vào điểm khởi động (
verdict: SUCCESS,main.ts,state.ts…) mà frame cũ từng giữ — không có lease thì code mới xanh mà không tới tay người dùng (walleye 2026-09-10: 4 frame xanh, người chơi không thấy gì). Hai frame chưa xong cùng giữ một file vẫn ĐỎ — trừ khiserver.tsđã xếp chúng nối tiếp (frame này là tổ tiên của frame kia): khi đó chúng không bao giờ cùng sửa một lúc, và nhiều tính năng lần lượt nối vào cùng mộtdepends_onđược.main.tstrao file cho người thuê sau cùng (hậu duệ)._manifest.json - Mỗi tính năng phải có một lát NỐI DÂY tới điểm khởi động, và frame UI phải nghiệm thu bằng test đi qua giao diện thật (e2e/route-shots), không bằng unit test của module đứng riêng.
- R6 là HỢP ĐỒNG THUÊ, không phải sổ đỏ: frame đã xong (run-log
- — bổ sung mục prompt cho các frame mới vào sổ
python3 fdk/tools/br-prompts.py sync(user sửa tay được ngay).br/prompts.md
- 读取 。提出切片列表:每个切片 = {clause_ids、预计 scope_code(≤3 个文件)、scope_test、acceptance_test、depends_on}。STOP,让用户逐项审核/修改/合并/拆分(人在回路中——用于阻断 slicer 的关联性错误)。首批 ≤ 3–5 个 frame。
br/BR.md- 是必须思考的字段,但不要求一定存在(GH#75,distill Atomic Task Graph):生产线是有向图,而不是列表。当 Frame B 在 Frame A 尚未通过时不可能变绿(B 依赖 A 构建的 API/store/schema)时,声明
depends_on。不依赖任何 frame →depends_on: [frame-A]。正确声明后,在 mode 4 中可免费获得三项能力:运行顺序自动正确、红色 frame 自动阻止下游分支、修复一个 frame 时只需重新运行其对应分支。随意声明(仅仅因为“看起来合理”)会损失并行能力并制造虚假等待——只有存在真实依赖时才建立连接。depends_on: []
- 按模板 写入
skills/br/assets/frame-template.md(schema v0 + 5 个必填正文 section:业务 · Input/Output · Spec (FR/SC) · 验收标准 · 范围外事项——写给未来的人类读者;frame-lint R7 严格把关:frame_id 必须包含业务 slug,目标不得泛化,每个 frame 都必须有明确的 FR-id/SC-id,section 不得为空)+br/frames/frame-NNN-<slug>.md。parent_br_hash = sha256(br/BR.md) - 生成 registry (根据 frontmatter 生成 frame_id · clause_ids · scope_code · status · run_log_ref 表格)。
br/frames/index.md - 把关:— 全部通过后,slice 才算完成(包括 R6 exclusive-scope:两个尚未完成的 frame 不得同时占用同一文件)。
python3 fdk/tools/frame-lint.py check br/frames --root .- **R6 是一份租赁合同,不是产权证明:**已完成的 frame(run-log )会释放其所持文件。这样,新 frame 才能连接到旧 frame 曾占用的启动入口(
verdict: SUCCESS、main.ts、state.ts…)——如果没有 lease,新代码可能测试通过,但最终用户根本看不到(walleye 2026-09-10:4 个 frame 通过,但用户没有看到任何变化)。两个未完成 frame 同时持有同一文件仍为红色——除非server.ts已将二者排列为前后依赖(一个 frame 是另一个的祖先):此时二者绝不会同时修改文件,多项功能也可以依次接入同一个depends_on。main.ts将文件移交给最后一位承租者(继承者)。_manifest.json - 每项功能都必须有一个连接到启动入口的切片,且 UI frame 必须通过真实界面的测试完成验收(e2e/route-shots),不能只测试独立模块的 unit test。
- **R6 是一份租赁合同,不是产权证明:**已完成的 frame(run-log
- — 为新 frame 补充 prompt 条目并写入
python3 fdk/tools/br-prompts.py sync账本(用户可立即手动修改)。br/prompts.md
Mode 4 — /br run <frame>
/br run <frame>Mode 4 — /br run <frame>
/br run <frame>Cách gọi tất định (đã wire — mặc định IN-PLACE, MỘT cây làm việc duy nhất):
python3 fdk/tools/br-run.py run br/frames/<frame>.md --root .确定性调用方式(已接线——默认 IN-PLACE,仅一棵工作树):
python3 fdk/tools/br-run.py run br/frames/<frame>.md --root .xem prompt sẽ gửi mà không chạy: thêm --print-prompt
查看将要发送的 prompt 但不运行:添加 --print-prompt
chạy cả hàng đợi resumable: python3 fdk/tools/br-queue.py run --queue br/queue.yaml
运行整个可恢复队列:python3 fdk/tools/br-queue.py run --queue br/queue.yaml
sửa 1 frame → chạy lại ĐÚNG nhánh của nó, không cả dây chuyền:
修复一个 frame → 仅重新运行其所在的正确分支,而不是整条生产线:
python3 fdk/tools/br-queue.py affected <frame_id> --queue br/queue.yaml --reset
python3 fdk/tools/br-queue.py affected <frame_id> --queue br/queue.yaml --reset
python3 fdk/tools/br-queue.py run --queue br/queue.yaml
python3 fdk/tools/br-queue.py run --queue br/queue.yaml
cần cô lập thư mục thật sự (hiếm): thêm --worktree
如需真正隔离目录(少见):添加 --worktree
**Queue chạy theo ĐỒ THỊ, không theo thứ tự gõ tay** (GH#75 — distill Atomic Task Graph, arXiv 2607.01942):
- **Topo order**: `br-queue` đọc `depends_on` của từng frame và tự sắp thứ tự (không phụ thuộc thì giữ nguyên thứ tự khai — queue cũ chạy y như trước).
- **Frame đỏ CHẶN cả nhánh dưới nó** (`status: blocked`, ghi `blocked_by`): input của nhánh đó đã hỏng, chạy tiếp chỉ tốn lượt model cho một cái chắc chắn fail. Nhánh KHÔNG liên quan vẫn chạy bình thường — một frame hỏng không còn đứng chặn cả dây chuyền.
- **Sửa cục bộ (`affected`)**: sửa một frame → chỉ frame đó + nhánh dưới nó về `pending`, mọi frame xanh khác giữ nguyên. Đây là chỗ trả tiền: trước đây một frame hỏng giữa chuỗi buộc chạy lại nhiều hơn mức cần.
- **KHÔNG làm subgraph-reuse cache** (paper có, ta bỏ có chủ ý): `status: done` đã bỏ qua frame xanh rồi; thêm cache theo hash ở quy mô vài chục frame chỉ đẻ bug stale. Giới hạn của chính paper cũng áp ở đây — lợi ích còn nguyên khi đồ thị nhỏ và acceptance_test tất định; graph rất lớn hoặc test/tool trả kết quả bấp bênh thì lịch chạy này mất tác dụng.
`br-run.py` tự: (0) **TIER-GATE** — frame khai `tier: compensable|irreversible` trong frontmatter (effect không-đảo: gọi API ngoài/gửi mail/ghi DB) bị CHẶN cho tới khi người chạy lại với `--ack-tier` (SHEPHERD gate-before-materialize), (1) frame-lint, (2) kiểm working-tree sạch, (3) chạy loop-runner **NGAY TRONG cây hiện tại** với revise **đã trỏ tới `fdk/tools/br-revise.py`** (render `skills/br/assets/revise-prompt.md` → `claude -p` tools bó hẹp), (4) frame xanh → commit vào nhánh hiện tại, message gắn frame_id (mốc revert/blame), (5) in tóm tắt 1 dòng, (6) ghi `run_log_ref` vào frame, (7) **ghi mốc vào SỔ TRACE** `.checkpoints.jsonl` (checkpoint-trace/SHEPHERD — record trỏ commit sẵn, không double-commit) → xem cả dây chuyền: `python3 fdk/tools/checkpoint.py list`; **rollback cả pipeline về frame bất kỳ theo TÊN**: `checkpoint.py rollback <frame_id>` (giữ lịch sử, cảnh báo effect tier không-đảo sau mốc).
**Vì sao in-place là mặc định (feedback user 05/07):** N frame = N worktree = N folder ma không ai lục; luồng người thường là *bật app lên xem*, sửa phải hiện ngay trong cây đang chạy app. **Kiểm soát không-phạm-scope nằm ở HARNESS** (diff-jail revert mỗi vòng + FINAL SCOPE SWEEP + test-hash + scope_clean + R6 exclusive-scope), không nằm ở cô lập thư mục. Không ưng kết quả → `git revert <commit frame>`.
Bước thủ công tương đương (nếu cần tinh chỉnh tay):
1. `frame-lint check` frame đó xanh. Kiểm **working-tree SẠCH** (`git status --porcelain` rỗng) — bẩn thì từ chối.
2. Tạo **git worktree riêng** từ `baseline_ref` của frame (jail filesystem — frame đầu KHÔNG đụng harness/hook/CI).
3. Chạy loop — commit per-frame VÀO WORKTREE BRANCH (không phải main); người vẫn merge tay:python3 harness/scripts/loop-runner.py run
--verify "<acceptance_test>" --revise "<adapter claude -p>"
--state "<scope_code>" --scope "<scope_code>" --protect "<scope_test>"
--baseline "<baseline_ref>" --commit-on-success
--commit-message "frame(<frame_id>): <muc_tieu> [<clause_ids>]"
--max-iter <g> --budget-seconds <g> --no-progress-k <g> --escalate-after <g>
--log br/frames/<id>.run.json --cwd <worktree>
--verify "<acceptance_test>" --revise "<adapter claude -p>"
--state "<scope_code>" --scope "<scope_code>" --protect "<scope_test>"
--baseline "<baseline_ref>" --commit-on-success
--commit-message "frame(<frame_id>): <muc_tieu> [<clause_ids>]"
--max-iter <g> --budget-seconds <g> --no-progress-k <g> --escalate-after <g>
--log br/frames/<id>.run.json --cwd <worktree>
Adapter revise = `claude -p` với tools bó hẹp (`--allowedTools Edit,Write,Read,Grep,Glob` — KHÔNG Bash tự do, không network), prompt dựng từ `muc_tieu` + `scope_code` + output verify fail gần nhất.
**Truy vết frame→code (điều kiện tiên quyết — chắc frame tạo code nào + không phạm scope):**
- Run-log ghi `changed_files` = file THẬT frame đã đổi (≠ scope dự định); `scope_clean`=true khi mọi file ⊆ `scope_code`; `attempted_out_of_scope` = file frame ĐỊNH ghi ngoài scope nhưng đã bị revert.
- **FINAL SCOPE SWEEP**: mọi lần loop dừng (kể cả PROTECT_VIOLATION), loop-runner revert sạch mọi file ngoài `scope_code` → worktree LUÔN scope-clean, `changed_files` LUÔN ⊆ `scope_code`. Kiểm soát hoàn toàn, không chỉ dựa lời dặn prompt.
- `--commit-on-success` chỉ commit khi verdict=SUCCESS VÀ scope_clean; message gắn `frame_id` → `git blame` truy đúng frame. `--baseline` = commit gốc để tính diff (thường HEAD của worktree lúc bắt đầu).
**队列按有向图运行,而不是按手动输入顺序运行**(GH#75 — distill Atomic Task Graph,arXiv 2607.01942):
- **拓扑顺序:**`br-queue` 读取每个 frame 的 `depends_on` 并自动排序(无依赖的 frame 保持声明顺序——旧队列行为不变)。
- **红色 frame 会阻止其所有下游分支**(`status: blocked`,记录 `blocked_by`):下游分支的输入已经损坏,继续运行只会浪费 model 配额去做必然失败的事。**无关分支仍会正常运行**——一个损坏的 frame 不再阻塞整条生产线。
- **局部修复(`affected`):**修复一个 frame → 仅将该 frame 及其下游分支重置为 `pending`,其他已通过的 frame 保持不变。这是成本回报所在:过去,链条中间的 frame 失败会迫使更多无关内容重新运行。
- **不使用 subgraph-reuse cache**(论文中存在,但此处有意放弃):`status: done` 已会跳过通过的 frame;在几十个 frame 的规模下再加入基于 hash 的 cache,只会滋生产生 stale bug 的机会。论文自身的限制在此同样适用——当图较小时且 acceptance_test 是确定性的,收益仍然存在;但当图非常大,或 test/tool 返回结果不稳定时,这种运行顺序将失去价值。
`br-run.py` 自动执行:(0) **TIER-GATE** — frontmatter 中声明 `tier: compensable|irreversible` 的 frame(不可逆 effect:调用外部 API/发送邮件/写入数据库)在运行者再次提供 `--ack-tier` 前一律**阻止**(SHEPHERD gate-before-materialize);(1) frame-lint;(2) 检查 working-tree 是否干净;(3) **直接在当前工作树中**运行 loop-runner,revise 已指向 `fdk/tools/br-revise.py`(渲染 `skills/br/assets/revise-prompt.md` → 使用受限工具的 `claude -p`);(4) frame 变绿 → commit 到当前分支,提交消息附带 frame_id(便于 revert/blame);(5) 打印一行摘要;(6) 将 `run_log_ref` 写入 frame;(7) **在 TRACE 账本 `.checkpoints.jsonl` 中记录 checkpoint**(checkpoint-trace/SHEPHERD——记录提前指向 commit,避免 double-commit)→ 查看整条生产线:`python3 fdk/tools/checkpoint.py list`;**按名称将整个 pipeline 回滚到任意 frame:**`checkpoint.py rollback <frame_id>`(保留历史,并警告 checkpoint 之后存在不可逆 effect tier)。
**为什么默认采用 in-place(用户反馈 05/07):**N 个 frame = N 个 worktree = N 个没人能理清的文件夹;人的常见工作流是*启动应用查看效果*,修改必须立即显示在当前运行应用的工作树中。**范围控制位于 HARNESS**(diff-jail 每轮回滚 + FINAL SCOPE SWEEP + test-hash + scope_clean + R6 exclusive-scope),而不是依赖目录隔离。如果不满意结果 → `git revert <commit frame>`。
等效的手动步骤(如需手动微调):
1. 该 frame 的 `frame-lint check` 必须通过。检查 **working-tree 干净**(`git status --porcelain` 为空)——如果脏,则拒绝运行。
2. 从 frame 的 `baseline_ref` 创建**独立的 git worktree**(隔离文件系统——首个 frame 不得触碰 harness/hook/CI)。
3. 运行 loop — 按 frame commit 到 WORKTREE BRANCH(不是 main);仍由用户手动 merge:python3 harness/scripts/loop-runner.py run
--verify "<acceptance_test>" --revise "<adapter claude -p>"
--state "<scope_code>" --scope "<scope_code>" --protect "<scope_test>"
--baseline "<baseline_ref>" --commit-on-success
--commit-message "frame(<frame_id>): <muc_tieu> [<clause_ids>]"
--max-iter <g> --budget-seconds <g> --no-progress-k <g> --escalate-after <g>
--log br/frames/<id>.run.json --cwd <worktree>
--verify "<acceptance_test>" --revise "<adapter claude -p>"
--state "<scope_code>" --scope "<scope_code>" --protect "<scope_test>"
--baseline "<baseline_ref>" --commit-on-success
--commit-message "frame(<frame_id>): <muc_tieu> [<clause_ids>]"
--max-iter <g> --budget-seconds <g> --no-progress-k <g> --escalate-after <g>
--log br/frames/<id>.run.json --cwd <worktree>
Revise adapter = 使用受限工具的 `claude -p`(`--allowedTools Edit,Write,Read,Grep,Glob`——不允许自由使用 Bash,不允许 network),prompt 根据 `muc_tieu` + `scope_code` + 最近一次 verify 失败结果生成。
**追踪 frame → code(先决条件——确保 frame 创建了代码且未越界):**
- Run-log 记录 `changed_files` = frame 实际修改的文件(不同于预计 scope);当所有文件均 ⊆ `scope_code` 时,`scope_clean`=true;`attempted_out_of_scope` = frame 曾打算写入 scope 之外、但已被回滚的文件。
- **FINAL SCOPE SWEEP**:loop 每次停止时(包括 PROTECT_VIOLATION),loop-runner 都会回滚所有 scope_code 之外的文件 → worktree 始终 scope-clean,`changed_files` 始终 ⊆ `scope_code`。这是完全确定性的控制,而不是只依赖 prompt 中的提醒。
- `--commit-on-success` 仅在 verdict=SUCCESS 且 scope_clean 时 commit;消息附带 `frame_id` → `git blame` 可准确追踪到 frame。`--baseline` = 用于计算 diff 的原始 commit(通常是 worktree 开始时的 HEAD)。Prompt & queue (chạy nhiều frame, resume được)
Prompt 与队列(运行多个 frame,可恢复)
- 📒 SỔ PROMPT TỔNG (nguồn ƯU TIÊN #1, user sửa tay không cần model): — MỘT file, mỗi frame một mục
br/prompts.md. Mở ra, tìm frame, sửa/THÊM nội dung thoải mái (placeholder## <frame_id>giữ nguyên để máy điền lúc chạy).{{...}}tự thêm mục cho frame mới, KHÔNG BAO GIỜ đè mục đã sửa tay (chạy sau mỗipython3 fdk/tools/br-prompts.py sync);/br slice/listđể tra. Thứ tự ưu tiên khi run: sổ prompt > queue inline > prompt_file > template mặc định.get <frame_id> - Template gốc (seed cho sổ): . Adapter
skills/br/assets/revise-prompt.mdrender nguồn thắng cuộc → gọifdk/tools/br-revise.py(tools bó hẹp). Xem prompt sẽ gửi:claude -p.br-revise.py run --frame <f> --verify "<cmd>" --print - File QUEUE (, mẫu
br/queue.yaml): DANH SÁCH frame để chạy tuần tự; mỗi mục hoặcskills/br/assets/queue.example.yaml(trỏ file template) HOẶCprompt_file:(ghi text trực tiếp, vẫn hỗ trợ placeholder). Driverprompt:chạy từng mục, ghifdk/tools/br-queue.py run --queue br/queue.yamlback sau MỖI mục → chạy lại queue = bỏ quastatus, chạy tiếp (resume).donexem mỗi mục dùng prompt nào;--dry-runxem trạng thái.list - Adapter là ranh giới
claude -p(BNAL) — template + queue + render đều tất định + selftest (verified:false,br-revise.py selftest).br-queue.py selftest
- Điều kiện KILL viết TRƯỚC (via negativa): vd diff-jail cắn ≥2 lần / test-hash cắn 1 lần → vứt cả run, không cứu, không nâng phanh.
- Loop dừng → in tóm tắt MỘT DÒNG (verdict · số vòng · diffstat · lệnh verify cuối) + chạy . STOP — người đọc diff trong worktree, tự quyết merge/chạy-tiếp/vứt.
python3 fdk/tools/medic.py --ci - Điền +
run_log_refvào frame + registry. Ghi lesson (kể cả điều KHÔNG xảy ra — phanh nào chưa từng cắn).outcome
- 📒 总 PROMPT 账本(优先级 #1 的来源,无需 model 即可手动修改):— 一个文件,每个 frame 对应一个
br/prompts.md条目。可以自由打开、查找 frame 并修改/添加内容(运行时由机器替换## <frame_id>placeholder)。{{...}}自动为新 frame 添加条目,绝不覆盖手动修改过的条目(每次python3 fdk/tools/br-prompts.py sync后运行);通过/br slice/list查询。运行时 prompt 优先级:总账本 > queue inline > prompt_file > 默认模板。get <frame_id> - 原始模板(总账本的 seed):。Adapter
skills/br/assets/revise-prompt.md渲染优先级最高的来源 → 调用fdk/tools/br-revise.py(受限工具)。查看将要发送的 prompt:claude -p。br-revise.py run --frame <f> --verify "<cmd>" --print - QUEUE 文件(,示例为
br/queue.yaml):按顺序运行的 frame 列表;每项包含skills/br/assets/queue.example.yaml(指向文件模板)或prompt_file:(直接写入文本,仍支持 placeholder)。Driverprompt:逐项运行,并在每项后把fdk/tools/br-queue.py run --queue br/queue.yaml写回 → 重新运行 queue = 跳过status并继续执行(可恢复)。done查看每项使用的 prompt;--dry-run查看状态。list - adapter 是
claude -p的边界(BNAL)——模板 + queue + 渲染均为确定性,并带 selftest(verified:false、br-revise.py selftest)。br-queue.py selftest
- KILL 条件必须预先写入(via negativa):例如 diff-jail 命中 ≥2 次 / test-hash 命中 1 次 → 丢弃整个 run;不得挽救,也不得提高刹车力度。
- Loop 停止 → 打印一行摘要(verdict · 迭代次数 · diffstat · 最后一条 verify 命令)+ 运行 。STOP — 由用户阅读 worktree 中的 diff,并自行决定 merge/继续运行/丢弃。
python3 fdk/tools/medic.py --ci - 将 +
run_log_ref写入 frame + registry。记录经验(即使某项情况未发生,也应记录哪道刹车尚未真正触发)。outcome
Mode 4b — /br find <file-hoặc-từ-khoá>
— trỏ vào chỗ lỗi, ra frame/prompt phụ trách
/br find <file-hoặc-từ-khoá>Mode 4b — /br find <file-or-keyword>
— 定位错误,并找到负责的 frame/prompt
/br find <file-or-keyword>Luồng người thường: bật app → thấy lỗi → trỏ vào khúc đó:
python3 fdk/tools/br-find.py "src/auth/login.py" # theo file
python3 fdk/tools/br-find.py "đăng nhập" # theo từ khoá / clauseIn ra: frame phụ trách (khớp theo file THẬT đã đổi > scope_code > từ khoá) · điều khoản BR · prompt nằm ở đâu (inline trong queue.yaml / prompt_file / template mặc định) · lệnh chạy lại ĐÚNG frame đó sau khi sửa prompt. Hoạt động được vì R6 exclusive-scope (frame-lint) ép mỗi file chỉ thuộc MỘT frame tại một thời điểm — file đã đổi chủ qua lease thì frame phụ trách là người thuê sau cùng (), còn lịch sử thì theo commit .
_manifest.jsongit blameframe(<id>)人的常见流程:启动应用 → 发现错误 → 指向相应位置:
python3 fdk/tools/br-find.py "src/auth/login.py" # 按文件查找
python3 fdk/tools/br-find.py "登录" # 按关键词或 clause 查找输出:负责的 frame(匹配顺序为实际修改文件 > scope_code > 关键词)· BR 条款 · prompt 位于何处(queue.yaml inline / prompt_file / 默认模板)· 修复 prompt 后重新运行正确 frame的命令。其工作原理是 R6 exclusive-scope(frame-lint)保证任一时刻每个文件只属于一个 frame——当文件通过 lease 更换持有者后,负责的 frame 就是最后一位承租者(),而历史则通过 和 commit 追踪。
_manifest.jsongit blameframe(<id>)Mode 4c — /br qc [frame]
— audit senior QC (LLM 4-mục) trên mockup/frame
/br qc [frame]Mode 4c — /br qc [frame]
— 对 mockup/frame 执行高级 QC 审查(LLM 4 项)
/br qc [frame]Sau khi có mockup/frame xanh, chạy CẶP MẮT SENIOR (đắt=LLM, gọi tay — phần rẻ tất định đã tự chạy sau mỗi ):
/br run- Code: gọi (Skill tool →
/qc-code) soi diff frame — 4 mục security/performance/naming/logic + sinh test tái hiệnqc-code.qc-* - UI/UX: gọi (Skill tool →
/qc-uiux) audit mockup — 4 mục a11y/hierarchy/consistency/antipattern; phần đo được (contrast/tap-target/overlap/misalign/missing-label) chạy qua engine visual-qa headless:qc-uiuxnode skills/visual-qa/assets/route-shots.mjs <base-url-mockup> --audit - Verdict CẦN SỬA → sửa trước khi chốt frame. Advisory — verdict LLM là ý kiến; số đo engine + test mới gác cứng (đã tự chạy ở
qc-*và/br runbước 3b). Không có frame chỉ định → audit các route mockup hiện có.verify-before-commit
在 mockup/frame 变绿后,运行高级审查搭档组合(成本高 = LLM,手动调用;成本低的确定性检查已在每次 后自动运行):
/br run- **Code:**调用 (Skill tool →
/qc-code)审查 frame diff — 4 项 security/performance/naming/logic + 生成qc-code复现测试。qc-* - **UI/UX:**调用 (Skill tool →
/qc-uiux)审查 mockup — 4 项 a11y/hierarchy/consistency/antipattern;可测量部分(contrast/tap-target/overlap/misalign/missing-label)通过 headless visual-qa engine 运行:qc-uiuxnode skills/visual-qa/assets/route-shots.mjs <base-url-mockup> --audit - verdict 为需要修复 → 在敲定 frame 前先修复。Advisory — LLM verdict 仅代表意见;只有 engine 数值 + 测试才构成硬门禁(已在
qc-*和/br run步骤 3b 中自动运行)。如果未指定 frame → 审查当前所有 mockup route。verify-before-commit
Mode 5 — /br status
/br statusMode 5 — /br status
/br status- →
python3 fdk/tools/build-line-status.py build --root .+br/line-status.json.llmwiki/html/line-status.html - In tóm tắt 3 dòng (tổng quan trạng thái · frame đáng chú ý nhất · đường dẫn HTML). Trang cho truy ngược lỗi→frame→clause; clause assumed tô cam → quay vòng sau nếu lỗi rơi vào assumed.
/br interview
- →
python3 fdk/tools/build-line-status.py build --root .+br/line-status.json。llmwiki/html/line-status.html - 打印三行摘要(总体状态 · 最值得关注的 frame · HTML 路径)。该页面支持将错误追溯至 frame → clause;assumed clause 以橙色显示 → 如果错误落在 assumed 上,下一轮返回 。
/br interview
Mode 6 — /br sync
(frame ↔ GitHub sub-issue)
/br syncMode 6 — /br sync
(frame ↔ GitHub sub-issue)
/br syncDistill : mỗi frame → một GitHub sub-issue để team thấy tiến độ + hand-off. KHÔNG làm lại provenance (clause_id/manifest đã sâu hơn ccpm); chỉ lớp đồng bộ mỏng trên .
automazeio/ccpmgh- — LUÔN dry-run trước (không gọi gh, không ghi mapping).
python3 fdk/tools/br-sync.py sync br/frames --root . --repo <owner/repo> --dry-run - Bỏ khi chắc → tạo sub-issue cho frame chưa map, ghi
--dry-run. Idempotent.br/frames/issue-mapping.jsontạo epic-issue.--epic/statuscó sẵn.selftest - Tạo issue là hành động ra-ngoài repo → xác nhận trước khi bỏ .
--dry-run
Distill :每个 frame → 一个 GitHub sub-issue,让团队能看到进度并进行 hand-off。不重复生成 provenance(clause_id/manifest 已比 ccpm 更深入);仅通过 提供一层轻量同步。
automazeio/ccpmgh- — 始终先 dry-run(不调用 gh,不写入 mapping)。
python3 fdk/tools/br-sync.py sync br/frames --root . --repo <owner/repo> --dry-run - 确认无误后移除 :为尚未映射的 frame 创建 sub-issue,并将
--dry-run写入磁盘。操作具有幂等性。br/frames/issue-mapping.json创建 epic-issue。--epic/status已提供。selftest - 创建 issue 是对 repo 外部产生影响的 action → 移除 前必须获得确认。
--dry-run
Mode 7 — /br contract
(UI Contract chốt thực hiện, md+html)
/br contractMode 7 — /br contract
(锁定 UI Contract,md+html)
/br contractTách trục CODE (frame) khỏi trục HIỂN THỊ (screen/route). Chuẩn mọi dự án:
- Frame khai +
ui_role: none|screen|panel|widget|form|action(frame-template) + section "## UI hoạt động ra sao".ui_screen - :
br/ui-layout.yaml+nav_style(id·title·route thật·frames[]). Sửa file này gom màn KHÔNG đụng frame.screens[] - →
python3 fdk/tools/br-contract.py build br/frames --layout br/ui-layout.yaml --root .+br/UI-CONTRACT.md. Bảng frame·làm gì·ui_role·màn·route·clause·acceptance + đếm frame/màn/route + cảnh báo lệch..htmlcó sẵn.selftest
将 CODE 轴(frame)与 DISPLAY 轴(screen/route)分离。为所有项目建立统一标准:
- Frame 声明 +
ui_role: none|screen|panel|widget|form|action(frame-template)+ section“## UI 如何运作”。ui_screen - :
br/ui-layout.yaml+nav_style(id·title·真实 route·frames[])。修改此文件时不得触碰 frame。screens[] - →
python3 fdk/tools/br-contract.py build br/frames --layout br/ui-layout.yaml --root .+br/UI-CONTRACT.md。表格包含 frame·功能·ui_role·屏幕·route·clause·acceptance,并统计 frame/屏幕/route 数量,同时警告不一致。.html已提供。selftest
Branches
分支
| ID | Kind | Guard | Hành vi | Skip / failure | Rejoin |
|---|---|---|---|---|---|
| B01 | user_optional | | | vượt trần → lens-fill | W03 |
| B02 | user_optional | | | không trộn với câu trả lời thật | W04 |
| B03 | conditional_required | sản phẩm có UI (S7.5) | clause NFR trỏ | không có UI → skip | W05 |
| B04 | conditional_required | frame có | | thiếu mục | W08 |
| B05 | conditional_required | frame khai | chặn cho tới khi chạy lại với | không ack → không chạy | W08 |
| B06 | capability_optional | cần cô lập thư mục thật sự (hiếm) | thêm | — | W08 |
| B07 | user_optional | chạy nhiều frame / sửa một frame | | frame đỏ chặn nhánh dưới | W09 |
| B08 | user_optional | | Mode 4b: | — | W08 (sửa prompt rồi chạy lại) |
| B09 | user_optional | | Mode 4c: | — | W08 |
| B10 | user_optional | | Mode 6: | không xác nhận → dừng ở dry-run | kết thúc |
| B11 | user_optional | | Mode 7: | — | kết thúc |
| B12 | user_optional | | tắt gate MỀM (R7 content · visual-qa UI · assumption-gate) qua | skip tự bật lại sau 1 lần | W08 |
| ID | 类型 | Guard | 行为 | Skip/失败 | Rejoin |
|---|---|---|---|---|---|
| B01 | user_optional | interview 中的 | | 超出阈值 → lens-fill | W03 |
| B02 | user_optional | | | 不与真实答案混合 | W04 |
| B03 | conditional_required | 产品具有 UI(S7.5) | NFR clause 指向 | 无 UI → skip | W05 |
| B04 | conditional_required | frame 的 | 编码前运行 | 缺少“## 设计(design-twice)”section → frame 未完成 | W08 |
| B05 | conditional_required | frame 声明 | 阻止运行,直到再次执行时提供 | 未 ack → 不运行 | W08 |
| B06 | capability_optional | 需要真正隔离目录(少见) | 添加 | — | W08 |
| B07 | user_optional | 运行多个 frame / 修复一个 frame | | 红色 frame 阻止下游分支 | W09 |
| B08 | user_optional | | Mode 4b: | — | W08(修复 prompt 后运行) |
| B09 | user_optional | | Mode 4c: | — | W08 |
| B10 | user_optional | | Mode 6:先运行 | 未确认 → 停在 dry-run | 结束 |
| B11 | user_optional | | Mode 7: | — | 结束 |
| B12 | user_optional | | 通过 | skip 仅生效一次,之后自动重新开启 | W08 |
Validation và stopping
验证与停止
Tất định: (7 luật), , loop-runner 6 phanh + FINAL SCOPE SWEEP, sau mỗi loop, selftest của từng tool (, , , , ). Cần review (người là cổng cuối): duyệt answers, duyệt TỪNG lát ở slice, đọc diff frame rồi tự quyết merge/chạy-tiếp/vứt. Mode dừng ở các điểm STOP đã ghi; loop dừng theo phanh, không nâng phanh.
frame-lint.py checkbr-fill.py check-contractmedic.py --ciframe-lint.py selftestloop-runner.py selftestbuild-line-status.py selftestbr-revise.py selftestbr-queue.py selftest确定性检查:(7 条规则)、、loop-runner 的 6 道刹车 + FINAL SCOPE SWEEP、每次 loop 后运行 ,以及各工具的 selftest(、、、、)。需要人工审核(人是最后一道关卡):审核 answers、在 slice 阶段逐项审核切片、阅读 frame diff 后自行决定 merge/继续运行/丢弃。Mode 在已标明的 STOP 点停止;loop 按刹车停止,不得提高刹车力度。
frame-lint.py checkbr-fill.py check-contractmedic.py --ciframe-lint.py selftestloop-runner.py selftestbuild-line-status.py selftestbr-revise.py selftestbr-queue.py selftestExamples
示例
- Positive: user bỏ 3 file yêu cầu vào , nói "soạn BR" → interview sinh
llmwiki/raw/hỏi 7 field thiếu → user điền → compile rabr/interview/001-questions.html+ check-contract xanh → slice đề xuất 4 lát, user duyệt →br/BR.mdxanh →frame-lint.py check br/frames --root .→ SUCCESS, commitbr-run.py run br/frames/frame-001-dang-nhap.md --root ., tóm tắt một dòng + medic.frame(frame-001-dang-nhap): … - Boundary/failure: khi
/br runkhông rỗng → từ chối chạy. Frame gửi mail khaigit status --porcelain→ TIER-GATE chặn tới khitier: irreversible. Frame-003 đỏ → frame-004 (--ack-tier) thànhdepends_on: [frame-003], frame-005 không liên quan vẫn chạy.status: blocked
- **正向示例:**用户将 3 个需求文件放入 ,并表示“编写 BR”→ interview 生成
llmwiki/raw/,询问 7 个缺失字段 → 用户填写 → compile 生成br/interview/001-questions.html+ check-contract 通过 → slice 提出 4 个切片,由用户审核 →br/BR.md通过 →frame-lint.py check br/frames --root .→ SUCCESS,commitbr-run.py run br/frames/frame-001-dang-nhap.md --root .,输出一行摘要 + medic。frame(frame-001-dang-nhap): … - **边界/失败示例:**执行 时
/br run不为空 → 拒绝运行。Frame 会发送邮件并声明git status --porcelain→ TIER-GATE 阻止运行,直到提供tier: irreversible。Frame-003 为红色 → Frame-004(--ack-tier)变为depends_on: [frame-003],而无关的 Frame-005 仍可运行。status: blocked
Reference — Stream UI thống nhất + Spec rõ ràng (distill hallmark + orca-workflow)
参考 — 统一 Stream UI 与清晰 Spec(distill hallmark + orca-workflow)
Hai lỗ hổng của dây chuyền nhiều-frame, vá bằng hai cơ chế distill:
A. UI/UX thống nhất XUYÊN FRAME (distill ). Mỗi frame chạy độc lập qua loop-runner → dễ mỗi frame một kiểu, mockup chắp vá. Cơ chế hallmark: = HỆ TOKEN KHOÁ, đọc trước và đè mọi lựa chọn; luật ĐẢO NGƯỢC — frame phải GIỐNG nhau (chia sẻ hệ), không đa dạng hoá; locked-token — mọi màu/font/spacing trỏ token có tên (), CẤM inline. Áp vào /br:
hallmarkbr/DESIGN.mdvar(--…)- copy
/br compile→design-template.mdvới bảng token §4 + §4.1 (token khoá) là NGUỒN CHÂN LÝ.br/DESIGN.md - Frame UI ở chỉ dùng token DESIGN.md; thêm giá trị mới = thêm token vào DESIGN.md rồi trỏ, không tự chế tại frame.
## UI hoạt động ra sao - Drift token bị (consistency) + engine visual-qa bắt → "stream" chạy bằng gate tất định, không bằng lời dặn. Kết quả: frame-01 và frame-09 trông như MỘT sản phẩm.
/qc-uiux
B. Mọi frame + màn interview cần SPEC rõ (học ). Propose sinh FR/SC id-bền + acceptance; /br mang rigor đó xuống mọi mắt xích:
/orca-workflow- Frame: frame-template có section (frame-lint R7 gác cứng) — mỗi frame khai FR-id (hệ thống PHẢI…) + SC-id (đo NGƯỜI), acceptance_test là bằng chứng của SC, mỗi dòng nghiệm thu truy về một FR. Frame thiếu FR/SC rõ = chưa xong, y như interview thiếu field.
## Spec (FR/SC) - Interview: mỗi field S1–S10 hỏi ra phải là MỘT spec rõ — câu hỏi nêu field làm gì + tiêu chí "trả lời thế nào là ĐỦ" (không hỏi mơ hồ). Field còn = spec chưa đủ, hiện ở bảng "Giả định đang gánh" để không trôi.
missing/assumed
多 frame 生产线存在两个漏洞,并通过两项 distill 机制加以修复:
A. 跨 FRAME 的 UI/UX 一致性(distill )。每个 frame 通过 loop-runner 独立运行 → 容易出现每个 frame 风格各异、mockup 靠拼凑的问题。Hallmark 机制: = 锁定的 TOKEN 系统,读取后覆盖所有设计选择;反向规则——frame 必须彼此一致(共享同一系统),而不是追求多样化;locked-token——所有颜色/字体/spacing 都引用具名 token(),禁止 inline。应用到 /br:
hallmarkbr/DESIGN.mdvar(--…)- 将
/br compile→design-template.md,其中 §4 + §4.1 的 token 表(锁定 token)是事实来源。br/DESIGN.md - UI frame 的“## UI 如何运作”只使用 DESIGN.md 中的 token;如需新值,先向 DESIGN.md 添加 token 再引用,不得在 frame 中自行创造。
- Token 漂移由 (consistency)+ visual-qa engine 捕获 → “stream”依靠确定性 gate 运行,而不是依靠口头提醒。结果是 frame-01 和 frame-09 看起来如同同一个产品。
/qc-uiux
**B. 每个 frame + interview 界面都需要清晰 SPEC(借鉴 )。**提出时生成持久的 FR/SC id + acceptance;/br 将这种严谨性传递到每个环节:
/orca-workflow- Frame:frame-template 包含 section (由 frame-lint R7 严格把关)——每个 frame 声明 FR-id(系统必须……)+ SC-id(衡量用户……),acceptance_test 是 SC 的证据,每条验收项都追溯到一个 FR。Frame 缺少明确 FR/SC = 尚未完成,与 interview 缺少字段相同。
## Spec (FR/SC) - **Interview:**每个 S1–S10 字段都必须问出一项清晰 spec——问题说明字段作用和“怎样回答才算充分”的标准(不得含糊提问)。字段仍为 = spec 尚不充分,并显示在“当前承担的假设”表中,防止信息流失。
missing/assumed
Reference — Vòng THIẾT KẾ cho frame UI (skill /design-twice
) — chạy TRƯỚC khi code
/design-twice参考 — UI frame 的设计迭代循环(skill /design-twice
)— 编码前运行
/design-twiceBắt buộc với mọi frame : trước khi viết một dòng code UI, chạy
để có 2–3 phương án KHÁC NHAU TẬN GỐC, so sánh, chọn 1, rồi ghi mục
vào chính frame (3 phương án + phương án chọn + lý do + ý ghép từ bản thua).
ui_role≠none/design-twice## Thiết kế (design-twice)- Vì sao: ý đầu tiên là ý dễ nghĩ nhất, không phải ý tốt nhất. Không có phương án để so thì agent chỉ biết vá phương án duy nhất — mỗi vòng vá đẻ một lỗi mới (theme Lume: 5 vòng vá).
- Tín hiệu phải quay lại vòng thiết kế: đang vá lần thứ 2 cho cùng một chỗ, hoặc user chê "xấu/bựa/không ưng" mà không chỉ ra lỗi cụ thể ⇒ hình dạng sai, vá thêm chỉ tốn công.
- Frame UI thiếu mục = chưa xong (R7 content coi là thiếu nội dung).
## Thiết kế (design-twice) - Thiết kế xong mới tới → code → gate
## UI hoạt động ra saobên dưới./visual-qa
**对每个 的 frame 强制执行:**编写任何一行 UI 代码之前,先运行 ,获得 2–3 个从根本上彼此不同的方案,进行比较并选择 1 个,然后将“## 设计(design-twice)”section 写入该 frame 本身(3 个方案 + 所选方案 + 原因 + 从落选方案吸收的经验)。
ui_role≠none/design-twice- **原因:**想到的第一个方案最容易想到,但并非最佳。如果没有方案可比较,agent 只会为唯一方案打补丁——每次补丁都会产生一个新 bug(theme Lume:5 轮补丁)。
- **必须返回设计循环的信号:**正在第二次为同一位置打补丁,或用户表示“难看/别扭/不满意”但未指出具体问题 ⇒ 形态本身有误,继续打补丁只会浪费时间。
- UI frame 缺少“## 设计(design-twice)”section = 尚未完成(R7 content 将其视为内容缺失)。
- 设计完成后才进入“## UI 如何运作”→ 编码 → 下方的 gate。
/visual-qa
Reference — Vòng tự-kiểm THỊ GIÁC cho frame UI (skill /visual-qa
)
/visual-qa参考 — UI frame 的视觉自检循环(skill /visual-qa
)
/visual-qaNguyên tắc (không phải luật re-check riêng): sửa UI = edit spec + code CỦA FRAME đó rồi
lại. Muốn "chạy lại frame là tự re-verify UI" thì của frame UI
phải CHÍNH LÀ visual-qa — test hit vào UI, không phải unit-test cạnh bên. Đây là điểm đòn bẩy
cao: không cần dặn agent "nhớ kiểm lại", vì loop verify của chính frame đã ôm luôn cái kiểm UI.
/br runacceptance_test- Frame đặt:
ui_role≠none→ exit 1 nếu route không 200/rỗng → frame ĐỎ tới khi UI render đúng.acceptance_test: "node skills/visual-qa/assets/route-shots.mjs --base <url> --route <route> --assert --user <u> --pass <p> --out <dir>"lại sau mỗi sửa = tự re-verify./br run - Sau green, agent ảnh (skill
Read) →/visual-qa(route·mức·cách sửa) → mỗi finding là một sửa spec+code của frame →FINDINGS.mdlại. Bắt lỗi theme/brand/empty-state unit-test không thấy; dùng khi extension MCP lỗi localhost./br run - Cấm sửa UI tay ngoài (nợ p28 05/07): sửa tay = mất gate + không re-verify. Mọi sửa UI phải qua frame.
/br run
**原则(不是单独的 re-check 规则):**修改 UI = 修改该 frame 的 spec + 代码,然后重新运行 。如果希望“重新运行 frame 即自动重新验证 UI”,那么 UI frame 的 必须本身就是 visual-qa — 测试必须命中 UI,而不是旁边的 unit test。这是高杠杆点:无需提醒 agent“记得再检查一次”,因为 frame 自身的 loop verify 已包含 UI 检查。
/br runacceptance_test- 的 frame 设置:
ui_role≠none→ 如果 route 不是 200 或页面为空则 exit 1 → frame 保持红色,直至 UI 正确渲染。每次修改 UI 后重新运行acceptance_test: "node skills/visual-qa/assets/route-shots.mjs --base <url> --route <route> --assert --user <u> --pass <p> --out <dir>"= 自动重新验证。/br run - 变绿后,agent 图片(skill
Read)→/visual-qa(route·严重程度·修复方法)→ 每条 finding 都对应一次 frame spec + 代码修复 → 重新运行FINDINGS.md。该机制可捕获 theme/brand/empty-state 等 unit test 无法发现的问题;当 localhost 的 MCP extension 出错时使用。/br run - 禁止在 之外手动修改 UI(用户反馈 05/07,p28):手动修改 = 丢失 gate + 没有 re-verify。所有 UI 修改都必须通过 frame 完成。
/br run
Reference — Rail — công tắc harness của dây chuyền (/br rail on|off|skip
)
/br rail on|off|skip参考 — Rail — 生产线的 harness 开关(/br rail on|off|skip
)
/br rail on|off|skip"On the rails" = đang trong tầm gác. MẶC ĐỊNH ON — auto-on cả phiên khi dùng /br.
- → trạng thái + LUÔN nhắc bật/tắt được.
python3 fdk/tools/br-rail.py status --root . - (gác đủ) ·
on(tắt gate MỀM tới khi bật lại) ·off(bỏ gate mềm ĐÚNG 1 lần rồi tự bật lại + cảnh báo).skip - AN TOÀN (bất biến): off/skip CHỈ tắt gate mềm — R7 content · visual-qa UI · assumption-gate. PHANH CỨNG (diff-jail · test-hash · scope-clean) + cấu trúc R1–R6 + hook bảo mật KHÔNG BAO GIỜ tắt qua đây.
- Wiring: đầu , đọc
/br run→ nếu off/skip thì gọibr-rail.py consume(bỏ R7+assumption), loop-runner phanh cứng vẫn nguyên; IN trạng thái Rail + dòng nhắc mỗi lần chạy.frame-lint … --soft-off
“On the rails”表示处于受控范围之内。默认开启——使用 /br 时整场会话自动开启。
- → 显示状态,并始终提示可以开启/关闭。
python3 fdk/tools/br-rail.py status --root . - (完整门禁)·
on(关闭软门禁,直到重新开启)·off(仅跳过软门禁一次,之后自动重新开启 + 显示警告)。skip - 安全机制(不可变):off/skip 只能关闭软门禁——R7 content · visual-qa UI · assumption-gate。硬刹车(diff-jail · test-hash · scope-clean)+ R1–R6 结构 + 安全 hook 绝不能通过此机制关闭。
- **接线:**在 开头读取
/br run→ 如果为 off/skip,则调用br-rail.py consume(关闭 R7+assumption);loop-runner 的硬刹车保持不变;打印 Rail 状态 + 每次运行时的提示行。frame-lint … --soft-off
Reference — Bằng chứng > lời (luật kiểm UI — feedback 2026-07-13)
参考 — 证据 > 言语(UI 检查规则——用户反馈 2026-07-13)
Kiểm UI/thị giác chỉ hợp lệ khi có FILE ẢNH thật + liệt kê route→ảnh→bytes (skill ). Không có file = CHƯA TỪNG LÀM = fail, bất kể model nói gì. Sau khi sửa UI phải chụp LẠI + đọc lại trước khi green. Cấm "cho pass" bằng suy luận. (Cũng là luật /fdk.)
MANIFEST.json/visual-qaUI/视觉检查只有在具备真实图片文件 + 列出 route→图片→bytes 的 时才有效(skill )。没有文件 = 从未执行 = fail,无论 model 如何声称。修改 UI 后必须重新截图并重新读取,然后才能变绿。禁止通过推断“让它通过”。
MANIFEST.json/visual-qa