Refactor code structure for improved readability and maintainability
This commit is contained in:
1 parent
6bfd8009a2
commit
a710477be2
47 files changed
+5357
-5
No files matched your search
@@ -0,0 +1,47 @@
|
||||
#!/usr/bin/env bash
|
||||
# 规约投递闸(PostToolUse:Read | mcp__node_repl__js,2026-10-26 立)
|
||||
# 干两件事:①读到 design/、game/ 下的文件时把对应规约要点注入上下文(每会话每域一次);
|
||||
# ②读到四份规约本体时在读取记录里记 read: 标记——worktree-guard 的规则闸据此放行写入。
|
||||
# 记录文件:${TMPDIR:-/tmp}/zcode-rule-ledger/<会话ID>.ledger,纯文本,会话结束自然失效。
|
||||
# 本钩子创建记录文件这一行为本身是规则闸的启用条件(闸只在记录文件存在时生效,
|
||||
# 保证「写标记的钩子活着」与「闸执法」永远成对出现)。解析异常一律静默放行。
|
||||
SID="${CLAUDE_SESSION_ID:-}"
|
||||
[ -z "$SID" ] && exit 0
|
||||
LEDGER_DIR="${TMPDIR:-/tmp}/zcode-rule-ledger"
|
||||
LEDGER="$LEDGER_DIR/$SID.ledger"
|
||||
mkdir -p "$LEDGER_DIR" 2>/dev/null
|
||||
touch "$LEDGER" 2>/dev/null || exit 0
|
||||
payload="$(cat)"
|
||||
|
||||
# 目标路径:优先 file_path 字段;node_repl 等无 file_path 的载荷退化为全文找 design/、game/ 路径段
|
||||
target="$(printf '%s' "$payload" | sed -n 's/.*"file_path" *: *"\([^"]*\)".*/\1/p' | head -1 | sed 's#\\\\#/#g; s#\\#/#g')"
|
||||
[ -z "$target" ] && target="$(printf '%s' "$payload" | grep -oE '(design|game)/[A-Za-z0-9_./-]+' | head -1)"
|
||||
[ -z "$target" ] && exit 0
|
||||
low="$(printf '%s' "$target" | tr 'A-Z' 'a-z')"
|
||||
|
||||
# 规约本体:记 read: 标记(每份只记一次),不投递
|
||||
case "$low" in
|
||||
*doc-conventions.md) grep -q '^read:doc-conventions.md$' "$LEDGER" 2>/dev/null || printf 'read:doc-conventions.md\n' >> "$LEDGER"; exit 0 ;;
|
||||
*concept-conventions.md) grep -q '^read:concept-conventions.md$' "$LEDGER" 2>/dev/null || printf 'read:concept-conventions.md\n' >> "$LEDGER"; exit 0 ;;
|
||||
*code-conventions.md) grep -q '^read:code-conventions.md$' "$LEDGER" 2>/dev/null || printf 'read:code-conventions.md\n' >> "$LEDGER"; exit 0 ;;
|
||||
*test-conventions.md) grep -q '^read:test-conventions.md$' "$LEDGER" 2>/dev/null || printf 'read:test-conventions.md\n' >> "$LEDGER"; exit 0 ;;
|
||||
esac
|
||||
|
||||
domain=""
|
||||
case "$low" in
|
||||
*/design/*|design/*) domain=doc ;;
|
||||
*/game/*|game/*) domain=code ;;
|
||||
esac
|
||||
[ -z "$domain" ] && exit 0
|
||||
|
||||
# 域投递:每会话每域一次(文案单行、无内部双引号,保 JSON 字面合法)
|
||||
if ! grep -q "^DELIVERED:$domain$" "$LEDGER" 2>/dev/null; then
|
||||
if [ "$domain" = doc ]; then
|
||||
msg='【规约投递】你正在读 design/ 下的文件。定文档方案/动笔前必须先完整读 design/engineering/doc-conventions.md 与 concept-conventions.md。要点提醒:正文单点维护(引用写指针不复制具体值);附加物独立成对象(禁摊平成父概念属性);概念状态用封闭枚举;禁自造黑话;文档增删同步根索引 02-系统清单。写 design/ 前无读取记录会被规则闸拦截。'
|
||||
else
|
||||
msg='【规约投递】你正在读 game/ 下的文件。定代码/测试方案前必须先完整读 design/engineering/code-conventions.md 与 test-conventions.md。要点提醒:数值单一事实源(data/tables 的 .tres 经 ConfigDB);RNG 单点(禁 randomize 与自建 RNG);Core 层零 UI 依赖;fail-fast;验收断言从真实入口进入,禁变异类测试与撤销类取证。写 game/ 前无读取记录会被规则闸拦截。'
|
||||
fi
|
||||
printf '{"additionalContext":"%s"}\n' "$msg"
|
||||
printf 'DELIVERED:%s\n' "$domain" >> "$LEDGER"
|
||||
fi
|
||||
exit 0
|
||||
@@ -0,0 +1,195 @@
|
||||
#!/usr/bin/env bash
|
||||
# agent 侧守卫(PreToolUse,本机件不入 git;2026-10-31 车道恢复随动——worktree 铁律回归)
|
||||
# 拦四路:①Edit/Write 族写主工作区(主工作区只作合并落点;豁免 .zcode/ 与 .qoder/)
|
||||
# ②Bash 在主工作区一切 git commit 一律拦(直提走 worktree;冲突/红态续合=git merge --abort → 回 worktree → 重新 git merge --no-ff,合并收尾提交不再例外)
|
||||
# ③Bash 在主工作区 git commit 带 --no-verify/-n(agent 禁用,旗标仅属用户)
|
||||
# (合回 merge 零机检,全量验证归合回后本地 CI:tools/hooks/post-merge)
|
||||
# ④规则闸:Edit/Write 写 design/、game/,或 Bash 以文件触碰动词+路径命中两域时,
|
||||
# 本会话读取记录须含对应规约 read: 标记(PostToolUse 规约投递闸读规约本体时记入;
|
||||
# 记录文件不存在=投递闸未运行→本闸不启用;子代理不经守卫层,2026-10-26 实测)
|
||||
# 附快速通道:Edit/Write 族目标在主工作区外(worktree)→ 免 python+git 直接过
|
||||
# pre-commit 直改闸已随主区直改车道退役(commit 点零执法,全量验证归合回后本地 CI);
|
||||
# 本守卫只约束 agent,用户手工改动不受限
|
||||
# 退出码 2 = 拦截(stderr 回传模型);0 = 放行;任何解析异常一律放行(守卫是兜底,不能挡死会话收口)
|
||||
proj="${ZCODE_PROJECT_DIR:-$PWD}"
|
||||
_payload=""
|
||||
IFS= read -r -d '' _payload || true # 内建全量读 stdin;临时文件只在走 python 路时才落
|
||||
|
||||
# ── 规则闸+快速通道(2026-10-26 立,规约投递闸配套;纯 bash 内建,零额外进程)────────────
|
||||
# 规则闸:Edit/Write 写 design/、game/,或 Bash 命令以文件触碰动词+路径命中两域时,
|
||||
# 本会话读取记录须含对应规约 read: 标记(PostToolUse 规约投递闸读规约本体时记入);
|
||||
# 记录文件不存在=投递闸未运行(含子代理——不经守卫层,2026-10-26 实测)→ 本闸不启用。
|
||||
# 快速通道:Edit/Write 族目标在主工作区外(worktree)→ 车道判定本就放行,免 python+git 直接过。
|
||||
# 两段都遵守总纲:解析异常一律放行。
|
||||
_rg_norm() { # 路径归一:反斜杠→斜杠、小写、/d/ 形转 d:/ 形、折叠重复斜杠(内建零进程)
|
||||
local p="${1//\\//}"
|
||||
p="${p,,}"
|
||||
[[ $p =~ ^/([a-z])/(.*)$ ]] && p="${BASH_REMATCH[1]}:/${BASH_REMATCH[2]}"
|
||||
while [[ $p == *"//"* ]]; do p="${p//\/\//\/}"; done
|
||||
printf '%s' "$p"
|
||||
}
|
||||
_rg_tool=""; _rg_fp=""
|
||||
[[ $_payload =~ \"tool_name\"[[:space:]]*:[[:space:]]*\"([^\"]*)\" ]] && _rg_tool="${BASH_REMATCH[1]}"
|
||||
[[ $_payload =~ \"file_path\"[[:space:]]*:[[:space:]]*\"([^\"]*)\" ]] && _rg_fp="${BASH_REMATCH[1]}"
|
||||
[ -z "$_rg_fp" ] && [[ $_payload =~ \"notebook_path\"[[:space:]]*:[[:space:]]*\"([^\"]*)\" ]] && _rg_fp="${BASH_REMATCH[1]}"
|
||||
_rg_low="$(_rg_norm "$_rg_fp")"
|
||||
_rl_sid="${CLAUDE_SESSION_ID:-}"
|
||||
_rl_ledger="${TMPDIR:-/tmp}/zcode-rule-ledger/${_rl_sid}.ledger"
|
||||
if [ -n "$_rl_sid" ] && [ -f "$_rl_ledger" ]; then
|
||||
_rl_marks="$(<"$_rl_ledger")"
|
||||
_rg_need() { # 域规约标记齐备→0(内建子串匹配,零进程)
|
||||
if [ "$1" = doc ]; then
|
||||
[[ $_rl_marks == *read:doc-conventions.md* && $_rl_marks == *read:concept-conventions.md* ]]
|
||||
return
|
||||
fi
|
||||
[[ $_rl_marks == *read:code-conventions.md* && $_rl_marks == *read:test-conventions.md* ]]
|
||||
}
|
||||
_rg_block() { printf '%s\n' "$1" >&2; exit 2; }
|
||||
case "$_rg_tool" in
|
||||
Edit|Write|MultiEdit|NotebookEdit)
|
||||
case "$_rg_low" in
|
||||
*/design/*|design/*)
|
||||
_rg_need doc || _rg_block "[规则闸] 写入 design/ 前本会话未读过 doc-conventions.md 与 concept-conventions.md——先用 Read 完整读这两份规约再继续(读完自动记读取记录)。" ;;
|
||||
*/game/*|game/*)
|
||||
_rg_need code || _rg_block "[规则闸] 写入 game/ 前本会话未读过 code-conventions.md 与 test-conventions.md——先用 Read 完整读这两份(或把读文件操作改用 Read 工具),读完自动记读取记录。" ;;
|
||||
esac
|
||||
;;
|
||||
Bash)
|
||||
# 命令文本(含描述字段)里「文件触碰动词+域路径」同现 → 按域核对读取记录
|
||||
_lp="${_payload,,}"
|
||||
if [[ $_lp =~ (^|[^a-z])(cat|head|tail|sed|less|more|grep|rg|awk|find|cp|mv|tee|wc|sort|diff)([^a-z]|$) || $_lp == *">"* ]]; then
|
||||
[[ $_lp =~ (^|[^a-z])design/ ]] && { _rg_need doc || _rg_block "[规则闸] 用 Bash 触碰 design/ 前本会话未读过 doc-conventions.md 与 concept-conventions.md——先用 Read 完整读这两份(或把读文件操作改用 Read 工具),读完自动记读取记录。"; }
|
||||
[[ $_lp =~ (^|[^a-z])game/ ]] && { _rg_need code || _rg_block "[规则闸] 用 Bash 触碰 game/ 前本会话未读过 code-conventions.md 与 test-conventions.md——先用 Read 完整读这两份(或把读文件操作改用 Read 工具),读完自动记读取记录。"; }
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
# 快速通道:Edit/Write 族且目标路径在主工作区外(worktree)——车道判定本就放行,免 python+git
|
||||
case "$_rg_tool" in
|
||||
Edit|Write|MultiEdit|NotebookEdit)
|
||||
_rg_projn="$(_rg_norm "$proj")"
|
||||
if [ -n "$_rg_fp" ] && [ "${_rg_low#"$_rg_projn"/}" = "$_rg_low" ]; then
|
||||
exit 0
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
tmp="$(mktemp)"
|
||||
printf '%s' "$_payload" > "$tmp"
|
||||
projw="$(cygpath -w "$proj" 2>/dev/null || echo "$proj")"
|
||||
python - "$projw" "$(cygpath -w "$tmp" 2>/dev/null || echo "$tmp")" <<'PY'
|
||||
import json, os, re, subprocess, sys
|
||||
|
||||
try:
|
||||
sys.stderr.reconfigure(encoding='utf-8', errors='replace')
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
def winpath(p):
|
||||
# MSYS 风格路径(/d/...)原生 Windows Python 不识别,统一转 Windows 形式
|
||||
if isinstance(p, str) and re.match(r"^/[A-Za-z](/|$)", p):
|
||||
try:
|
||||
r = subprocess.run(["cygpath", "-w", p], capture_output=True, text=True, timeout=5,
|
||||
encoding="utf-8", errors="replace")
|
||||
return r.stdout.strip() or p
|
||||
except Exception:
|
||||
return p
|
||||
return p
|
||||
|
||||
proj = os.path.abspath(winpath(sys.argv[1]))
|
||||
try:
|
||||
with open(sys.argv[2], encoding='utf-8') as f:
|
||||
d = json.load(f)
|
||||
except Exception:
|
||||
sys.exit(0)
|
||||
|
||||
tool = d.get("tool_name") or d.get("tool") or ""
|
||||
ti = d.get("tool_input") or {}
|
||||
cwd = os.path.abspath(winpath(d.get("cwd") or proj))
|
||||
|
||||
def in_dir(p, root):
|
||||
p = os.path.normcase(os.path.abspath(p))
|
||||
root = os.path.normcase(os.path.abspath(root))
|
||||
return p == root or p.startswith(root.rstrip('\\/') + os.sep)
|
||||
|
||||
def trunk_branch(repo):
|
||||
try:
|
||||
r = subprocess.run(["git", "-C", repo, "branch", "--show-current"],
|
||||
capture_output=True, text=True, timeout=5,
|
||||
encoding="utf-8", errors="replace")
|
||||
return r.stdout.strip()
|
||||
except Exception:
|
||||
return ""
|
||||
|
||||
TRUNK = {"master", "main"}
|
||||
|
||||
# 车道铁律(2026-10-31 恢复):主工作区只作合并落点——agent 的 Edit/Write 族写主工作区即拦;
|
||||
# 豁免 .zcode/ 与 .qoder/(本机件不入 git,worktree 带不进去);worktree 目标已在快速通道放行
|
||||
if tool in ("Edit", "Write", "MultiEdit", "NotebookEdit"):
|
||||
fp = ti.get("file_path") or ti.get("notebook_path") or ""
|
||||
if fp:
|
||||
fpn = os.path.abspath(winpath(fp))
|
||||
if in_dir(fpn, proj):
|
||||
rel = os.path.relpath(fpn, proj).replace("\\", "/").lower()
|
||||
if not rel.startswith(".zcode/") and not rel.startswith(".qoder/"):
|
||||
sys.stderr.write(
|
||||
"[车道铁律] 主工作区只作合并落点,改动走独立 worktree——"
|
||||
"git worktree add ../g-plan2-<任务名> -b <任务分支>,在区里改与提交;"
|
||||
"豁免面仅 .zcode/ 与 .qoder/。\n")
|
||||
sys.exit(2)
|
||||
sys.exit(0)
|
||||
|
||||
cmd = ti.get("command", "") or ""
|
||||
toks = cmd.split()
|
||||
has_commit = False
|
||||
for i, t in enumerate(toks):
|
||||
if t.rstrip(';') != 'git':
|
||||
continue
|
||||
j = i + 1
|
||||
while j < len(toks) and j - i <= 5:
|
||||
u = toks[j].rstrip(';')
|
||||
if u == "commit":
|
||||
has_commit = True
|
||||
break
|
||||
if u.startswith("-"):
|
||||
if u in ("-C", "--git-dir", "-c") and j + 1 < len(toks):
|
||||
j += 2
|
||||
continue
|
||||
j += 1
|
||||
continue
|
||||
break
|
||||
# 主工作区判定:cwd 在内,或命令文本里显式指到主工作区路径(不含 worktree 兄弟目录)
|
||||
norm = cmd.replace("\\", "/").lower()
|
||||
ref_main = re.search(r"/d/code/g-plan2(?![\w-])", norm) or re.search(r"d:/code/g-plan2(?![\w-])", norm)
|
||||
ref_wt = re.search(r"/g-plan2-[\w-]+", norm)
|
||||
sibling = bool(ref_wt) and not ref_main
|
||||
on_trunk = trunk_branch(proj) in TRUNK
|
||||
in_main = (in_dir(cwd, proj) or bool(ref_main)) and on_trunk
|
||||
if not in_main or sibling:
|
||||
sys.exit(0)
|
||||
# 车道铁律(2026-10-31 恢复):主工作区禁止一切 git commit——令回 worktree;合并类命令不在本分支,
|
||||
# 冲突/前置检查红态(MERGE_HEAD 在)的 git commit 续合同拦——一律 abort → 回 worktree → 重新 git merge --no-ff
|
||||
if has_commit:
|
||||
# --no-verify/-n 仅属用户紧急出口,agent 禁用(词法匹配兜底;
|
||||
# 只扫 -m 之前的参数区,防 commit 消息里提及该旗标名造成误拦)
|
||||
_flag_zone = toks
|
||||
for _i, _t in enumerate(toks):
|
||||
if _t.rstrip(';') == "-m":
|
||||
_flag_zone = toks[:_i]
|
||||
break
|
||||
if any(u.rstrip(';') in ("--no-verify", "-n") for u in _flag_zone):
|
||||
sys.stderr.write(
|
||||
"[车道铁律] git commit --no-verify 仅属用户紧急出口,agent 禁用——"
|
||||
"移除该旗标重新提交;改动走独立 worktree。\n")
|
||||
sys.exit(2)
|
||||
# 主区一切 git commit 一律拦(含 MERGE_HEAD 态续合),不再探测 MERGE_HEAD;
|
||||
# 合并提交只由 git merge --no-ff 一步落地,两合回钩子必触发。
|
||||
sys.stderr.write(
|
||||
"[车道铁律] 主工作区禁止一切 git commit(含 MERGE_HEAD 态续合)——改动走独立 worktree;"
|
||||
"主区唯一合法写动作=git merge --no-ff。"
|
||||
"若正处合并冲突/前置检查红态:一律 git merge --abort → 回 worktree 处理 → 重新 git merge --no-ff <任务分支>。\n")
|
||||
sys.exit(2)
|
||||
sys.exit(0)
|
||||
PY
|
||||
rc=$?
|
||||
rm -f "$tmp"
|
||||
exit $rc
|
||||
@@ -0,0 +1,81 @@
|
||||
---
|
||||
name: asset-ingest
|
||||
description: g-plan2(Dungeon Sweeper)五段流水线第二段的美术素材录入入口。当用户说素材已过审、把素材录入/入库、终稿放进游戏、补 art-bible 条款时使用。**只录入、不生成任何图像内容**——样张与素材由用户主导在 artwork/ 工作区产出,本技能承接的是用户已过审的素材:核对命名与目录(改名依据=代码消费名)→拷入 game/assets/art/→art-bible 补条款(五要素缺一不可)→美术素材状态清单与待办清单状态同步→命名与目录自检。仓库在 D:/code/g-plan2。
|
||||
---
|
||||
|
||||
# asset-ingest——美术素材录入(g-plan2 五段流水线)
|
||||
|
||||
你在五段流水线(登记 → 文档设计/美术设计 → 写卡 → 迭代编排 → 实现,流程纪律见 `design/engineering/process-conventions.md` §2)的第二段做**美术线的录入半程**。**定性写死:本技能只录入、不生成任何图像内容**——样张与素材由用户主导在 `artwork/` 工作区产出,本技能承接的是**用户已过审的素材**,把它按规范落进游戏与文档。格式权威=`design/engineering/doc-conventions.md` §12.3(美术工作区目录与命名),动笔前先读它。
|
||||
|
||||
## 批性质与共同纪律(先读)
|
||||
|
||||
- **仓库路径**:项目在 `D:/code/g-plan2`,本文路径相对它。
|
||||
- **本技能属工程/文档改动批(直改类)**:可写 `design/` 目录与 `roadmap.md`;**禁跑 `tools/run_all_gates.sh` 全套(不带参数档)与任何游戏测试**;收尾=手动跑 `--docs`(文档域闸),全绿后按车道合回,合回落地 post-merge 钩子推送触发远端 CI 验证。本技能的写面=`design/art/` 两文档+`待办清单.md`+素材拷贝(`game/assets/art/` 与 `artwork/` 均不入 git);**除素材拷贝外禁碰 `game/` 与 `tools/` 的任何代码文件**——素材不入 git,tracked 改动面仍只有文档,--docs 档选档不变。
|
||||
- **车道铁律**:tracked 改动(`design/art/` 两文档+待办清单)走独立 worktree(建区粒度=回合,会话单区等细则见 `design/engineering/process-conventions.md` §1),收口=冻结→件核→并 master→主区 `git merge --no-ff`→删区;素材与 `artwork/` 不入 git,**素材拷贝直接落主工作区 `game/assets/art/`**(游戏实际加载的在盘位置);第 7 步 path_check 以 `--repo` 指主工作区跑。
|
||||
- **特批两段式**:只有用户明示才能跳过本技能流程中的某步(典型=跳过第 2 步命名核对)。对象(待办清单条目/roadmap 格)已有内容 → 直接写入标记 `〔用户特批 YYYY-MM-DD 跳过××〕`;对象没有任何内容 → 必须回呈实况、经用户再次确认后才写标记。标记必须带日期,无日期=非法(doc-conventions §12.4)。
|
||||
- **禁自援特权**:执行中你自己觉得某步该跳,只能呈报后停,**禁自己援引特批**。
|
||||
- **闸过渡期口径**:现行待办清单与 roadmap 还是旧格式,`python tools/pipeline_gate.py` 对它们整体红属预期。**红项若全部来自旧格式存量、与本次操作对象无关,注明即可;本次操作对象自身的格式必须合规**。
|
||||
- 本技能只固化本段特有条款;车道铁律、会话落记等仓库级纪律按 `design/engineering/process-conventions.md` 现行文本执行。
|
||||
|
||||
## 流程
|
||||
|
||||
### 第 1 步:定位批次与素材
|
||||
|
||||
在 `artwork/<YYYY-MM-DD-主题>/` 批次工作区内定位**用户点名的过审素材与样张**(样张在 `samples/` 子目录)。批次目录不存在、点名素材找不到、或用户没有明示哪些算过审 → 停工呈报,禁自行挑选或代判「这张应该过了」。
|
||||
|
||||
### 第 2 步:核对命名与目录(改名依据=代码消费名)
|
||||
|
||||
1. **命名形态**(doc-conventions §12.3):全小写英文+下划线,禁中文/空格/大写。终稿三段式 `<对象>_<部位或状态>_<规格>.png`;样张 `sample_<屏名>_<版本>.png`。
|
||||
2. **目录走向**:`artwork/` 批次 → 终稿 `game/assets/art/<用途子目录>/`(现行子目录:`board/`、`character/`、`fx/`、`ui/`,见 `design/art/asset-path-map.md`)。**图片永不进 `design/`**。
|
||||
3. **改名依据=代码消费名**:终稿文件名跟代码走,防断链——先在 `game/` 内查 ui_kit/资源路径常量确定消费点名(ui_kit 在 `game/presentation/views/ui_kit.gd`,`TEX_*` 常量即 `res://assets/art/...` 路径;未收进 ui_kit 的查 `design/art/asset-path-map.md` 与代码内 `res://assets/art` 引用)。素材名跟它走。**查不到消费点 → 停工呈报,禁自造名字**;呈报时带解法选项:先走代码实现批定常量,或由用户直接点名文件名(用户点名视同消费名依据,agent 仍不得自拟)。
|
||||
4. 同名迭代直接覆盖,不留 v2 副本(§12.3)。
|
||||
5. 本步经特批可跳(标记规则见批性质;有条目时标记写在待办清单条目状态处,无条目时随会话呈报与 commit 信息落案)。
|
||||
|
||||
### 第 3 步:终稿拷入
|
||||
|
||||
把过审终稿拷入 `game/assets/art/` 对应用途子目录(该目录不入 git,在盘即生效;打包发布方案另有既定口径,与本技能无关)。
|
||||
|
||||
### 第 4 步:art-bible 补条款
|
||||
|
||||
对 `design/art/art-bible.md` 补录条款,**每条条款五要素缺一不可**:
|
||||
|
||||
1. **条款名**;
|
||||
2. **规则句**(一句白话说清规则);
|
||||
3. **像素级判据**(写成可核对的判读句);
|
||||
4. **参考图指针**——只许指入库稳定位置(`design/art/references/`、`asset-path-map.md`),**禁指 `artwork/` 在途散路径**(该目录不入 git 会消失,art-bible §8.3 归档纪律);
|
||||
5. **文首头注版本号递增**(「现行为 vX.Y」同步更新)——禁写版本历史表,改动明细只进 git 提交信息。
|
||||
|
||||
新条款按 art-bible 头注「条款验收标注纪律」标注验收方式(←机检/←目检/←方向性)。
|
||||
|
||||
### 第 5 步:美术素材状态清单同步
|
||||
|
||||
更新 `design/art/art-status-checklist.md`(该文件名已核实,是纯看板:素材名×状态×需求文档指针;注意它与生产规格清单 `art-assets-checklist.md` 是两份文件,本步只动前者):对应素材行状态列改 ✅+一行事实(何时、何批、落点)——做完不删行,改状态。
|
||||
|
||||
### 第 6 步:待办清单状态推进
|
||||
|
||||
按 doc-conventions §12.1 状态机改写条目状态属性(仅在册条目适用;本次会话新录入、清单内无对应事项时本步跳过,禁为录入动作新建条目):
|
||||
|
||||
- **只走美术线**:改「美术设计已闭合(凭据=样张过审、art-bible 条款版本)」,凭据落成实例形态 `美术设计已闭合(样张过审 2026-10-18、art-bible v3.16 §8.2)`——**凭据括号内禁用+号**(+只作状态段连接符;凭据内并列项按 doc-conventions §12.1 用顿号,用+会被流水线闸误判成状态段)。本线全闭合,删除「缺口」属性。
|
||||
- **两条设计线并列**:改两段并列,美术侧闭合、文档侧保持原状态(例:`文档设计已闭合(…v0.6)+美术设计已闭合(…)`)。**「缺口」属性只在两侧全闭合(条目转入 待写卡)时才删**——状态里只要还有待文档设计/文档设计中/待美术设计/美术设计中任一词,缺口属性必须在(流水线闸判据);单侧闭合时保留并改写为剩余线还差什么。
|
||||
- 若第 2 步经特批跳过,标记写在本条目状态处(无条目时随会话呈报与 commit 信息落案)。
|
||||
- 旧格式条目先向用户确认所属设计线与改动面,按 §12.1 补齐格式再写状态(同 doc-design 第 1 步口径)。
|
||||
- 改完顺带跑 `python tools/pipeline_gate.py` 自核本次条目零红(过渡期存量红注明即可)。
|
||||
|
||||
### 第 7 步:命名与目录自检
|
||||
|
||||
两半都做:
|
||||
|
||||
1. **命名形态**:先扫一眼 `tools/` 有无现行命名检查器可引用(截至 2026-10-18 没有——`path_check.py` 管目录与消费链、`standee_asset_check.py` 是内容机检不属此类),没有就按 doc-conventions §12.3 规则逐文件核对(三段式/全小写/下划线/用途子目录/无 v2 副本)。
|
||||
2. **目录与消费链**:跑 `python tools/path_check.py --repo <主工作区>`(路径核对器:声明路径存在性+代码 `res://assets/art` 引用与盘上文件互核)——拷完必跑。注意它查的是「代码引用的文件在不在」,**不查「盘上多余文件的名字对不对」**:命名核对若被特批跳过,本步结论必须如实注明「命名形态未检」,禁让 path_check 绿顶替命名核对。
|
||||
|
||||
**美术内容不做机检**:`tools/standee_asset_check.py` 等内容级检查器(档高/色数/描边)不属本技能,禁在本流程内跑。
|
||||
|
||||
### 收尾
|
||||
|
||||
`python tools/run_all_gates.sh --docs`(文档域闸),全绿合并回 master。
|
||||
|
||||
## 纪律
|
||||
|
||||
- **禁生成、禁改图、禁代画**:素材内容层面的一切意见(好不好看、要不要改)只能呈报给用户,本技能零处置权。
|
||||
- 平实简体中文,禁自造黑话;流水线词汇按 doc-conventions §12 用法一致使用。
|
||||
- 本技能不写需求卡片、不编迭代、不碰代码——代码消费常量的**新增/改名**属代码实现批的活,只能呈报留给下游,禁顺手改 `ui_kit.gd`。
|
||||
@@ -0,0 +1,75 @@
|
||||
---
|
||||
name: batch-closure
|
||||
description: g-plan2(Dungeon Sweeper)批后收尾与中间文档退役入口。当用户说「迭代 N 收尾/批后收尾/落完反哺点收个尾」「清理中间文档/清理暂存地」「把某份报告退役」时使用。做两类事:①iter 批后收尾——反哺点落文凭据核对(落文本身委托 doc-design,本技能禁代写)、reports/ 产出物(实现报告/反哺点清单/验收审计报告)退役判据核对与删除、待办清单条目整条删除、roadmap 迭代行与顶部「当前位」三行换代;②中间文档退役——中间文档唯一暂存地 `reports/`(需求卡片/迭代产出物/提案/审计/需求澄清过程稿)按「吸收即死」判据核对后删除(需求卡片死期=所属迭代实现批合回 master)。规则权威=doc-conventions §11+concept-conventions §2,本技能只做执行编排、不复写规则;与 doc-consistency-check 分工=那边定期体检只读只报、这边被点名后执行清理。工程/文档改动批(直改类):可写 design/ 与 roadmap.md,收尾跑 --docs 文档域闸。仓库在 D:/code/g-plan2。
|
||||
---
|
||||
|
||||
# batch-closure——批后收尾与中间文档退役(g-plan2)
|
||||
|
||||
你做的是批次结束后的清库工作:把已完成批次留下的中间文档,按「吸收即死」(规则权威=`design/engineering/doc-conventions.md` §11,删除手法=`design/engineering/concept-conventions.md` 第 2 节删除概念 SOP)退役掉,并随手把账面(roadmap、待办清单)换到与现实一致。**本技能只做执行编排,禁在本文件复写或改判规则**——判据与本文件冲突时以 §11/§12 现行文本为准,并停工呈报。
|
||||
|
||||
## 职责边界(先读)
|
||||
|
||||
- **反哺落文不归本技能**:把反哺点写进 GDD/art-bible 走 doc-design 技能(其「反哺点写入模式」触发)。本技能只核对落文结果(待办清单反哺点专条状态=已写入+落点+版本号),核对不过就把落文委托给 doc-design(唯一出口,落文完成后接着收尾),**禁代写落文**。
|
||||
- **只报不删的体检不归本技能**:doc-consistency-check 定期体检只读、只呈报问题;本技能是执行臂——用户点名(含体检报出后点名)才动手删。
|
||||
- **触发词分界**:「落反哺点/处理反哺点清单/反哺点裁决写入」=doc-design;「收尾/清理中间文档/清理暂存地/退役××文档」=本技能。
|
||||
|
||||
## 批性质与共同纪律
|
||||
|
||||
- **仓库路径**:项目在 `D:/code/g-plan2`,本文路径相对它。
|
||||
- **本技能属工程/文档改动批(直改类)**:可写 `design/` 目录与 `roadmap.md`(账面换代正是本批产出);禁跑 `tools/run_all_gates.sh` 全量档(不带参数)与任何游戏测试、MC 跑批;收尾=手动跑 `--docs`(文档域覆盖 `game/` 内 `.md`、design/、根规则文件、reports/、tools/、.zcode/ 等一切非代码面改动),全绿后按车道合回,合回落地 post-merge 钩子推送触发远端 CI 验证。
|
||||
- **车道铁律**:reports/ 产出物与账面换代(roadmap/待办清单)都是 tracked 文件——一切改动走独立 worktree(建区粒度=回合,会话单区等细则见 `design/engineering/process-conventions.md` §1),收口=冻结→件核→并 master→主区 `git merge --no-ff`→删区;迭代批自身的 worktree 收口动作(merge+remove)照旧;`.zcode/` 与 `.qoder/` 技能文件不入 git,主区直改。
|
||||
- **删除三步强制**:先 grep 引用面 → 改写指路句(改法=结论内联或换 git 提交号)→ 再删文件;收尾死链检查必须绿(`tools/doc_link_audit.py`,随 --docs 跑)。
|
||||
- **判据不过禁删**:任一文件的退役判据不过,逐份呈报等用户裁,禁「顺手清掉」;用户明示强行退役才照办,并在提交信息记 `〔用户特批 YYYY-MM-DD 退役××〕`(标记须带日期,doc-conventions §12.4)。本技能无特权,禁自答放行。
|
||||
- 白话写作(doc-conventions §2)与流水线词汇(§12)全程生效。
|
||||
|
||||
## 主流程 A:iter 批后收尾
|
||||
|
||||
触发:用户说「迭代 N 收尾/批后收尾/落完反哺点了收个尾」。
|
||||
|
||||
### 第 1 步:盘点该迭代的在飞面
|
||||
|
||||
1. 读 `roadmap.md` 迭代 N 行(状态列应已是或应改为「已完成」)与 `reports/` 下该迭代全部文件(实现报告/反哺点清单/验收审计报告,文件名形如 `iter<N>-*-<日期>.md`)。
|
||||
2. 读待办清单:该迭代各条目(状态应走到「已编迭代 N」)、本迭代产出的反哺点专条。
|
||||
3. **前置核对反哺点是否已落文**:反哺点清单还在且待办清单对应专条未到「已写入(落点+版本)」→ 直接转 doc-design 反哺模式把落文办完,再接着收尾;用户明示本批暂不落文的,反哺点清单保留、只清其余件,呈报里写明这个例外。
|
||||
|
||||
### 第 2 步:逐份过退役判据
|
||||
|
||||
| 文件 | 退役判据 | 不过怎么办 |
|
||||
|---|---|---|
|
||||
| `iter<N>-反哺点-*.md` | 已随落文退役(doc-design 第 5 步),或全部条目已落文(待办清单专条=已写入+落点+版本号) | 第 1 步已拦,委托 doc-design |
|
||||
| `iter<N>-实现报告-*.md` | 遗留读数义务逐条已迁(体验验证清单或待办清单在册);实机目检项已登记体验验证清单 | 未决先迁再死:先迁待办清单/体验验证清单再退役 |
|
||||
| `iter<N>-验收审计-*.md` | 审计结论已并入实现报告、无未决项 | 未决项先迁再死:先迁待办清单/实现报告再退役 |
|
||||
|
||||
更旧迭代(M<N)在 `reports/` 的残留件,同表过判据后随本批一并清——「证据只留最新」(§11):新证据落位后旧份同批退役。
|
||||
|
||||
### 第 3 步:引用面改写
|
||||
|
||||
对每份待删文件:grep 文件名于 `design/`+`roadmap.md`+`AGENTS.md`,把指路句改写为结论内联或 git 提交号。roadmap 迭代 N 行实现报告列同步改「已退役(git 历史可考)」(doc-conventions §12.2 保留字)。
|
||||
|
||||
### 第 4 步:删除与账面换代
|
||||
|
||||
1. 删除判据全过的文件。
|
||||
2. 待办清单账面:该迭代条目「完成即整条删除」;已写入的反哺点专条整条删除(两者均 §12.1 状态机出口)。
|
||||
3. roadmap 账面:迭代 N 行状态列改「已完成(YYYY-MM-DD)」;顶部「当前位」三行(阶段/迭代位/下一步)换代——只回答「现在该做什么」,禁扩写成状态快照(doc-conventions §10)。
|
||||
|
||||
### 第 5 步:收尾闸
|
||||
|
||||
`python tools/run_all_gates.sh --docs` 全绿 → 按车道合回 master(独立 worktree→主区 `git merge --no-ff`→删区)。
|
||||
|
||||
## 主流程 B:中间文档退役(单份或批量)
|
||||
|
||||
触发:用户点名某份中间文档要退役,或说「清理暂存地」。
|
||||
|
||||
1. **候选呈报**:点名=直接核该份;「清理暂存地」=扫 `reports/`(中间文档唯一暂存地:需求卡片、迭代产出物、提案/审计/需求澄清/评估过程稿;入内文件默认到期即死,需求卡片死期=所属迭代实现批合回 master),按「结论已吸收?未决已迁?」初筛,呈候选清单等用户点名后才动手。
|
||||
- **`design/` 下禁止过程件目录**(`design/research/` 已于 2026-10-21 退役,熵增闸退役路径清单收它,目录再现即判红):扫到落在 `design/` 里的提案/审计/调研/需求澄清稿即属违规件,呈报迁 `reports/`;文件自称「常驻/已追认/不受吸收即死约束」一律无效,确实要长期留用的退役内容只走 `design/content-archive/` 转正一条路。
|
||||
- **根目录 `playnote.md` 不入候选清单**:它是用户本人试玩随手记,只由用户增删,不属任何文档族、不受吸收即死管辖。
|
||||
2. **判据核对(逐份)**:结论已被权威文档吸收(GDD 对应节/art-bible/架构文档〔仅约束面且须用户落文——2026-11-07 用户裁架构文档写权限=用户专属〕/术语表 grep 得到);未决内容已迁待办清单或 roadmap 卡;证据类另核「证据只留最新」。既没被吸收又不肯迁出的,只有「转正迁 `design/content-archive/`」与「呈用户裁决」两条出口,禁原地自封常驻。
|
||||
- **需求卡片特殊**:`reports/` 下的需求卡片须另核 roadmap 行——行内已填「已退役(git 历史可考)」或卡片已被新版替代才可退役,迭代仍引用的卡片禁删。
|
||||
3. 未吸收 → 呈报建议落点(落文走 doc-design 或用户直裁),禁先删;判据过 → 引用面改写 → 删 → 死链检查绿。
|
||||
4. 收尾闸 `--docs` 全绿 → 按车道合回 master(独立 worktree→主区 `git merge --no-ff`→删区)。
|
||||
|
||||
## 纪律
|
||||
|
||||
- 平实简体中文,禁自造黑话;吸收即死/退役/未决先迁再死/证据只留最新等词按 doc-conventions §11 用法一致使用。
|
||||
- 删除是不可逆动作:同批删除清单在呈报里逐份列名,用户看得见每一份才动手。
|
||||
- 本技能不写需求卡片、不做设计讨论、不碰代码——上游各归其段:落文=doc-design,体检=doc-consistency-check。
|
||||
@@ -0,0 +1,84 @@
|
||||
---
|
||||
name: doc-design
|
||||
description: g-plan2(Dungeon Sweeper)五段流水线第二段的文档设计入口。当用户要求做某事项的文档设计、发起系统设计讨论、把设计定稿写进 GDD、或要求处理迭代反哺点清单(落反哺点/反哺点裁决写入)时使用。流程:从待办清单取条目校验所属设计线与状态→用户主导的设计讨论(待裁点全案并列、禁代裁)→待裁点清零+用户点头后定稿写入 GDD→待办清单状态推进「文档设计已闭合」→跑流水线闸。兼任反哺点写入与 design/engineering/ 规约类文档修订。仓库在 D:/code/g-plan2。
|
||||
---
|
||||
|
||||
# doc-design——文档设计段入口(g-plan2 五段流水线)
|
||||
|
||||
你在五段流水线(登记 → 文档设计/美术设计 → 写卡 → 迭代编排 → 实现,流程纪律见 `design/engineering/process-conventions.md` §2)的第二段做**文档线**设计:把一件登记在册的事,经用户主导的设计讨论,定稿成 GDD 文档(或 design/engineering/ 规约修订)。条目格式与状态机权威=`design/engineering/doc-conventions.md` §12,动笔前先读它。
|
||||
|
||||
## 批性质与共同纪律(先读)
|
||||
|
||||
- **仓库路径**:项目在 `D:/code/g-plan2`,本文路径相对它。
|
||||
- **本技能属工程/文档改动批(直改类)**:可写 `design/` 目录与 `roadmap.md`(这正是本批产出);**禁跑 `tools/run_all_gates.sh` 全套(不带参数档)与任何游戏测试**;收尾=手动跑 `--docs`(文档域闸),全绿后按车道合回,合回落地 post-merge 钩子推送触发远端 CI 验证(文档批=文档域秒级闸),结果不等待、不落地,随时用 `tools/ci_check.sh <合并提交>` 现查(合回零等待,process-conventions §1 第 3 条)。tracked 改动默认只许落在 `design/` 与 `roadmap.md`;规约修订批(用户发令改流程规约时)写面可含 `AGENTS.md`、`design/engineering/` 规约与 `tools/` 闸件,按批列明写面,闸仍跑 `--docs`。
|
||||
- **车道铁律**:本技能写面全是 tracked 文档面——一切改动走独立 worktree(建区粒度=回合,会话单区等细则见 `design/engineering/process-conventions.md` §1),收口=冻结→件核→并 master→主区 `git merge --no-ff`→删区;`.zcode/` 与 `.qoder/` 技能文件不入 git,主区直改。触及代码面(`game/` 下非 `.md`)的改动不属本技能面。
|
||||
- **特批两段式**:只有用户明示才能跳过本技能流程中的某步(如跳过设计讨论直接落定稿)。对象(待办清单条目/roadmap 格)已有内容 → 直接写入标记 `〔用户特批 YYYY-MM-DD 跳过××〕`;对象没有任何内容 → 必须回呈实况、经用户再次确认后才写标记。标记必须带日期,无日期=非法(doc-conventions §12.4)。
|
||||
- **禁自援特权**:执行中你自己觉得某步该跳,只能呈报后停,**禁自己援引特批**。
|
||||
- **闸过渡期口径**:现行待办清单与 roadmap 还是旧格式,`python tools/pipeline_gate.py` 对它们整体红属预期。**红项若全部来自旧格式存量、与本次操作对象无关,注明即可;本次操作对象自身的格式必须合规**。pipeline_gate 注册进 run_all_gates 文档域归数据整改批,此前 --docs 的回执不含它,属正常。
|
||||
- 本技能只固化本段特有条款;车道铁律、会话落记等仓库级纪律按 `design/engineering/process-conventions.md` 现行文本执行。
|
||||
|
||||
## 主流程(文档线设计)
|
||||
|
||||
### 第 1 步:取条目并校验
|
||||
|
||||
1. **判来源**:用户点名某条在册事项 → 从 `待办清单.md` 取该条目,取不到就回报「清单内无此事项」并停,禁自造条目凑流程;本次会话新提出的事项 → 无条目直接进第 2 步(条目记的是进度,不是讨论的开工前置)。
|
||||
2. 校验两件事:
|
||||
- **所属设计线**:状态行含文档线段(待文档设计/文档设计中/文档设计已闭合)。
|
||||
- **状态**:为「待文档设计」或「文档设计中」。
|
||||
3. 状态不对 → **停工呈报,禁硬做**。典型:已闭合(设计已完,重开须用户明示并说明理由);需求性工程条目(状态整行无设计线段,走 req-card)或直改类条目(状态=待执行,不走写卡);已写卡/已编迭代(下游已动,改动=回退流程,归用户裁)。
|
||||
4. 条目是旧格式存量(标题缺登记元数据)→ 先向用户确认其来源与所属设计线、改动面,再按 doc-conventions §12.1 模板补齐标题元数据与四属性(实况/缺口/改动面/状态)(这属「本次操作对象格式合规」动作),然后回到第 2 步校验。确认中若答案已注定校验不过(如状态整行无设计线段=需求性工程条目或直改类条目),直接停工呈报,禁补格式硬做。
|
||||
|
||||
### 第 2 步:设计讨论(用户主导)
|
||||
|
||||
1. **开题先用一句 ≤50 字大白话概览**:这个系统/事项是什么、为什么现在做。
|
||||
2. **先高抽象后具体**:方向、骨架、边界未定前,禁铺具体条目(数值表、条目清单、字段细节都是具体层)。
|
||||
3. **每个待裁点呈全部备选方案与代价**,禁代裁——设计权归用户。零待裁点也要向用户报明「本讨论零待裁点」,同样等用户点头。
|
||||
4. 讨论中冒出的新待裁点随时入册(记在会话内呈报的待裁点清册,不写进 GDD 正文——doc-conventions §5:正文只写现行规则)。
|
||||
5. 会话内进行、禁无监管自跑(process-conventions §2 段铁律)。
|
||||
|
||||
### 第 3 步:闭合与写入 GDD
|
||||
|
||||
闭合判据=**待裁点清零+用户点头**,二者缺一不可;带未裁点的产出是讨论稿,禁写入。闭合后才动笔:
|
||||
|
||||
1. 定稿写入 GDD 系统文档(`design/gdd/systems/<域>/<系统>.md`),骨架按 doc-conventions §6 系统文档骨架(文首引言/设计目的/系统范围/核心循环位置/核心规则/依赖与输出/P0 与后置/调参表/验收标准/待办指路存根)。
|
||||
2. **新系统**同步根索引 `design/gdd/02-系统清单.md`(文档增删必须同步根索引,doc-conventions §5)。
|
||||
3. **新数值**进 `game/data/tables/*.tres`,且 owner GDD 正文表格同步;涉术语规范名时同步 `design/gdd/术语表.md`——三处之一未更新即视为变更未完成(doc-conventions §5 数值纪律)。
|
||||
4. **文首状态行版本号递增**(「现行为 vX.Y」)——禁写版本历史表,改动明细只进 git 提交信息(doc-conventions §5 禁写变更记录、gdd_lint R4 拦截)。
|
||||
5. **画面类需求另出预览图(2026-11-05 立)**:触碰画面呈现规格的需求(新增画面要素/布局/配色/动效),定稿写入前先出目标画面的 HTML/SVG 效果图(diagram-design 通道),经用户人审通过才算本线闭合;预览图内嵌对应 ux/ 规格文档并随附像素级视觉判据句(process-conventions §7 第 2 条同款写法)——写卡段引它、实现批基线冻结时用户对照它(test-conventions §8.2)。缺陷修复以现行规格与在库基线为准,不触发新预览。
|
||||
|
||||
### 第 4 步:待办清单状态推进
|
||||
|
||||
按 doc-conventions §12.1 状态机改写条目状态属性:
|
||||
|
||||
- **只走文档线**:改「文档设计已闭合(凭据=文档路径+版本号,例:`design/gdd/systems/排雷循环/排雷玩法.md v1.3`)」,并删除「缺口」属性(本线全闭合,状态里已无未闭合态词)。
|
||||
- **文档线与美术线并列**:改两段并列,文档侧闭合、美术侧保持原状态(例:`文档设计已闭合(…v0.6)+美术设计中`)。**「缺口」属性此步保留**,改写为美术侧还差什么——状态里只要还有 待美术设计/待文档设计 等未闭合态词,缺口属性就必须在(流水线闸判据:四态必须有缺口、其余状态不得有);待美术侧也闭合、条目转入 待写卡 时才删。
|
||||
- **「已闭合」不带凭据不算合法状态词**。
|
||||
- 若经特批跳过本段某步,标记写在本条目状态处。
|
||||
|
||||
### 第 5 步:跑流水线闸
|
||||
|
||||
`python tools/pipeline_gate.py`,核对与本次条目相关的判据零红。过渡期存量红注明即可(见批性质);**本次操作对象自身的格式必须合规**,对象自身有红就改到绿再收尾。
|
||||
|
||||
### 收尾
|
||||
|
||||
`python tools/run_all_gates.sh --docs`(文档域闸),全绿后按车道合回 master(独立 worktree→主区 `git merge --no-ff`→删区)。
|
||||
|
||||
## 反哺点写入模式(同技能第二触发)
|
||||
|
||||
本技能两个入口:用户说「做文档设计/系统设计讨论/定稿进 GDD」走上面的主流程;用户说「落反哺点/处理反哺点清单/反哺点裁决写入」**直接走本节,不进主流程**(反哺点专条走的是另一套状态词,主流程第 1 步对它必然停工)。本节流程:
|
||||
|
||||
1. 读 `reports/iter<N>-反哺点-<日期>.md`(反哺点清单由实现批产出,每条写明哪个文件哪一节、改成什么、依据是什么)。
|
||||
2. **逐条呈用户裁决**。**禁未裁决直接写入**——清单写着什么改法不等于已裁决。
|
||||
3. 裁决通过的,写入对应 GDD/art-bible 章节(写入纪律同第 4 步:文首状态行版本号递增、禁写版本历史表、数值三处同步)。**架构文档不在反哺落点内**(2026-11-07 用户裁:架构文档只写约束面、写权限=用户专属)——反哺点涉架构事实时只呈报,由用户裁决后亲自落文。
|
||||
4. 待办清单对应反哺点专条(状态取待裁决/已写入)状态改「已写入(落点=文档+版本)」,落成实例形态 `已写入(design/gdd/systems/…/xxx.md v1.4)`——凭据须为真实文档路径+版本号(流水线闸判据)。
|
||||
5. 清单条目按「吸收即死」退役(doc-conventions §11):全部条目落文后核对引用面、改写指路句,再退役清单文件(实现报告内的清单按「证据只留最新」口径随批退役)。
|
||||
|
||||
## 兼任范围注记
|
||||
|
||||
`design/engineering/` 规约类文档(process-conventions / doc-conventions / code-conventions 等)的修订也走本技能:同样经用户主导讨论、待裁点清零+用户点头后才落笔,落笔后按对应文档自身的版本/头注惯例记录修订。
|
||||
|
||||
## 纪律
|
||||
|
||||
- 平实简体中文,禁自造黑话;流水线词汇(登记/文档设计/美术设计/改动面/特批标记/流水线闸/需求性工程条目/待执行/已写卡/已编迭代)按 doc-conventions §12 用法一致使用。
|
||||
- 白话写作规则(doc-conventions §2)与表达分工(§3)对写入 GDD 的内容全程生效。
|
||||
- 本技能不写需求卡片、不编迭代、不碰代码——下游各归其段:写卡=req-card,编排=iter-plan。
|
||||
@@ -0,0 +1,115 @@
|
||||
---
|
||||
name: iter-plan
|
||||
description: g-plan2(Dungeon Sweeper)五段流水线第四段的迭代编排入口。当用户要求编排迭代、把卡片编入迭代、凑一个迭代、开新一轮迭代、做迭代规划时使用。流程:扫待办清单「已写卡」条目呈编排候选清单→用户点名卡与迭代号→开工前预检(拟编卡集只读事实面实核八类,P1 红项停编排退回写卡段)→编排五查(卡片存在/设计闭合凭据齐/估时与冻结线/复核记录在位/写完 roadmap 行跑流水线闸确认绿)→写 roadmap 迭代总表一行六列→待办清单状态推进「已编迭代 N」→呈报编排结果。本技能不动卡片内容、不写实现报告,发现卡片问题呈报退回写卡段。仓库在 D:/code/g-plan2。
|
||||
---
|
||||
|
||||
# iter-plan——迭代编排段入口(g-plan2 五段流水线)
|
||||
|
||||
你在五段流水线(登记 → 文档设计/美术设计 → 写卡 → 迭代编排 → 实现,流程纪律见 `design/engineering/process-conventions.md` §2)的第四段做编排:把用户点名的已写卡需求卡片编进 roadmap 迭代总表一行。格式权威=`design/engineering/doc-conventions.md` §12.2(roadmap 迭代行六列),动笔前先读它。本技能**不动卡片内容、不写实现报告**——发现卡片有问题,呈报退回写卡段(req-card),禁代修。
|
||||
|
||||
## 批性质与共同纪律(先读)
|
||||
|
||||
- **仓库路径**:项目在 `D:/code/g-plan2`,本文路径相对它。
|
||||
- **本技能属工程/文档改动批(直改类)**:可写 `design/` 目录与 `roadmap.md`(本批产出=roadmap 迭代行+待办清单状态);**禁跑 `tools/run_all_gates.sh` 全套(不带参数档)与任何游戏测试**;收尾=手动跑 `--docs`(文档域闸),全绿后按车道合回,合回落地 post-merge 钩子推送触发远端 CI 验证。
|
||||
- **车道铁律**:本技能写面(roadmap 行+待办清单状态)全是 tracked 文件——一切改动走独立 worktree(建区粒度=回合,会话单区等细则见 `design/engineering/process-conventions.md` §1),收口=冻结→件核→并 master→主区 `git merge --no-ff`→删区;`.zcode/` 与 `.qoder/` 技能文件不入 git,主区直改。
|
||||
- **特批两段式**:只有用户明示才能跳过本技能流程中的某步(典型=带未裁凭据硬编入)。对象(待办清单条目/roadmap 格)已有内容 → 直接写入标记 `〔用户特批 YYYY-MM-DD 跳过××〕`;对象没有任何内容 → 必须回呈实况、经用户再次确认后才写标记。标记必须带日期,无日期=非法(doc-conventions §12.4)。
|
||||
- **禁自援特权**:执行中你自己觉得某步该跳(如觉得某卡凭据「显然没问题」),只能呈报后停,**禁自己援引特批**。
|
||||
- **闸过渡期口径**:现行待办清单与 roadmap 还是旧格式,`python tools/pipeline_gate.py` 对它们整体红属预期。**红项若全部来自旧格式存量、与本次操作对象无关,注明即可;本次操作对象自身的格式必须合规**(本次写入的迭代行与改写状态的条目,必须按 §12 新格式写)。
|
||||
- 本技能只固化本段特有条款;车道铁律、会话落记等仓库级纪律按 `design/engineering/process-conventions.md` 现行文本执行。
|
||||
|
||||
## 流程
|
||||
|
||||
### 第 1 步:扫候选并呈报
|
||||
|
||||
扫 `待办清单.md` 中状态为「已写卡」的条目,逐条打开其状态里登记的卡片文件读取估时,呈报**编排候选清单**,一行一条:
|
||||
|
||||
- 条目名 / 卡片路径 / 估时 / 设计闭合凭据(文档线/美术线各报各的;无设计线段条目报实况里的证据指认)。
|
||||
|
||||
旧格式条目状态词不属新状态机(如「待编入」「待排期」)时,先向用户确认其真实状态与卡片路径,按 doc-conventions §12.1 补齐格式(「已写卡」必须在状态里带 `reports/` 卡片路径)再纳入候选——禁凭旧词自行推断状态。
|
||||
|
||||
候选为零时如实呈报「无可编卡」,结束本轮,禁硬凑。
|
||||
|
||||
### 第 2 步:用户点名与迭代号
|
||||
|
||||
1. 用户点名哪些卡进哪个迭代(点名内容=卡+迭代号)。**点名的卡不在第 1 步候选清单(条目状态非「已写卡」)→ 呈报该条不可编入及原因(还停在哪一段),禁编入**;用户坚持「凭据差不多齐了直接编」也只能呈报后停(禁自援特权)。
|
||||
2. **迭代号=roadmap 迭代总表现行最大号+1**(旧格式 roadmap 无总表,从迭代进度等现行记事取最大号);编入已有未完成迭代用其现号,**新开迭代行经用户确认**后才立。
|
||||
3. 需求卡片列格内顺序=执行顺序:用户点名时一并给定就照抄;用户未给序 → 呈建议序(按卡片依赖与估时)请确认后再写。
|
||||
4. 旧格式 roadmap 没有六列迭代总表区时,呈报用户「总表区尚不存在,本次按 §12.2 新立表区再写行」,经确认后立表(这属本次操作对象格式合规动作)。
|
||||
|
||||
### 第 3 步:开工前预检(2026-11-07 用户立)
|
||||
|
||||
收令点名卡集后、编排五查与落表前,对拟编卡集做一轮**只读事实面预检**。目标=尽量减少实现期停工,**不是杜绝**:预检之后其他批次合回、文档再被改动等环境漂移,以及卡片被并行修改,仍可能在实现期停工——那部分由实现段异常分级(iter 技能 L3 停机呈报)与 iter T0 开工日 file:line 窄复核兜底。
|
||||
|
||||
- **对象**:用户点名的卡集;补编进未完成迭代的场景,交集类检查对象还要加上该迭代已编入的卡。
|
||||
- **形态**:只读实核,不建区、不落笔、不改任何文件。执行方式=未参与写卡的只读子代理并行分片实核+主会话汇总裁决;每片按 file:line 清单逐条回「一致/漂移/缺+实际行号引用」。
|
||||
- **发现是中间产物(吸收即死)**:P1 项退回写卡段修订,处置随卡「复核记录」节留痕;预检清单文件即删、永不提交。
|
||||
|
||||
八类检查逐类过,发现按 P1/P2/P3 分级:
|
||||
|
||||
| # | 检查类 | 查法 |
|
||||
|---|---|---|
|
||||
| 1 | 卡内一致性互证 | 🔴契约 vs 任务卡 vs 验证闸对照表 vs 落位预检互相印证——汇总级抽查即可,逐条细查归写卡段复核(req-card grilling 门) |
|
||||
| 2 | 代码现状锚实核 | 卡片「现状事实」每条 file:line 打开实读;落位预检的新名 grep 全仓应零命中;「计划新增」件核不存在、「复用既有」件核存在 |
|
||||
| 3 | 判据出处行锚实核 | 对照表每行锚所指文档行打开实读,核句子在位**且内容与该行判据匹配**——机检 C5 只查存在性,查不出内容错位;写卡后文档被其他批改动会使锚漂移(2026-11-07 退役卡 ux 四锚漂移实证) |
|
||||
| 4 | 验收协议可执行性 | 对拍/等价/重放类判据的「改前基线+改后载体」两腿齐备:基线怎么来(采集步骤在卡内)、载体在盘可跑(工具在 tools/、锚在 sim-data/、golden 基线在 game/tests/golden/) |
|
||||
| 5 | 跨卡触碰面交集与卡序语义依赖 | 点名卡集两两过文件交集;同文件改动的语义序(前卡删除面 vs 后卡引用面);卡序与卡片内取用/产出声明一致 |
|
||||
| 6 | 跨批次断言钉死面 | 在飞或刚合回批次新增的断言(词表在册、表值钉、行为断言)是否钉住本批要改的退役面 |
|
||||
| 7 | 在盘件核对 | 卡片依赖的盘上件在位:MC 现行锚、分析工具、golden 基线、历史日志等 |
|
||||
| 8 | 上游文档版本时效 | 卡引版本号 vs 文件头现行版本;设计闭合后文档是否又被其他批改动 |
|
||||
|
||||
分级与去向:
|
||||
|
||||
- **P1(不改卡必停工)**——实现与代码事实错位、验收协议缺腿、跨卡对撞、判据锚失位指向错句:停编排,逐条呈报退回写卡段修订,禁编入;修订合回后用户重新收令再编排。
|
||||
- **P2(随卡修订顺带)**——措辞失实、引用失实、登记面缺口:呈报,随同批修订顺带处置或由用户裁去向。
|
||||
- **P3(记录留痕)**——行号小漂、注释滞后类:呈报留痕,开工自行复核可兜的,随卡修顺手改。
|
||||
|
||||
零 P1(P2/P3 已处置或用户认账)→ 进第 4 步编排五查。
|
||||
|
||||
### 第 4 步:编排五查(逐卡核,任何一查不过即停)
|
||||
|
||||
1. **卡片文件存在**:状态里登记的路径在盘上真有该文件。缺 → 呈报退回写卡段。
|
||||
2. **设计闭合凭据齐**:文档线段在场则报文档路径+版本号;美术线段在场则报样张过审+art-bible 条款版本;无设计线段条目(状态整行无设计线段)报实况里证据指认在。凭据缺或「已闭合」不带凭据 → 呈报退回对应设计段,禁代补。
|
||||
3. **估时与冻结线**:所选卡估时按区间**中值**求和(单位工作日、写精确值不取整)。**卡片任何工作量均可编入**(2026-10-25 用户立:工作量限制属迭代层、非卡片层——不足 5 天不再拒编);编入后总量 **低于 5 个工作日**=迭代行状态写「冻结待凑批」(不可开工;凑批 ≥5 后由本段改「待开工」,可呈报待编池候选等用户裁);**5–10 个工作日**为常规区间;**超过 10 个工作日**须经用户确认——确认前呈报整批/拆批两案**等用户裁,禁自行拆分或塞入**,确认后在迭代行写带日期的特批标记(roadmap 格,须带日期;对还没有内容的行,先回呈实况、经用户再次确认后才写标记);**超过 20 个工作日**禁止编(硬上限,用户确认也不放行,必须拆批)。
|
||||
4. **复核记录在位(2026-11-05 用户立规;2026-11-06 用户裁凭据换代——复核凭据=「复核记录」节自身,不另查报告文件)**:逐卡核卡内有「复核记录」节。缺节、或节内任一条发现没有去向标记 → 呈报退回写卡段,禁编入迭代。边界:复核本身是写卡段的义务,本查只核「做没做、记录在不在」——禁本段替卡补记录、禁本段自跑复核、禁把缺记录的卡当旧卡放行。生效=卡片文件名日期 ≥2026-11-06(与 `tools/pipeline_gate.py` 该条卡片判据同口径),更早的卡属历史留档不回头改。
|
||||
5. **流水线闸绿**:roadmap 行写完后跑 `python tools/pipeline_gate.py` 确认绿。过渡期存量红注明即可,**本次操作对象(新写迭代行+被改状态条目)自身零红**,有红改到绿。
|
||||
|
||||
### 第 5 步:写 roadmap 迭代总表一行
|
||||
|
||||
按 doc-conventions §12.2 六列,一行写齐:
|
||||
|
||||
```
|
||||
| 迭代代号 | 状态 | 需求卡片 | 编入时间 | 预计周期 | 实现报告 |
|
||||
```
|
||||
|
||||
- **迭代代号**:写「迭代 N」(N=第 2 步定的号)。
|
||||
- **状态**:待开工。
|
||||
- **需求卡片**:只写文件路径;一格内一行一卡,格内排列顺序=执行顺序。
|
||||
- **编入时间**:当天(YYYY-MM-DD)。
|
||||
- **预计周期**:写所选卡估时中值之和的精确值(不取整),形态「≈N 个工作日」(1 周=5 个工作日);超过 10 个工作日的随带日期特批标记。
|
||||
- **实现报告**:「—」(未完成)。
|
||||
- **行内禁一切事项说明**——卡序叙述、门依赖、读数、裁点记录一概不入行;卡间依赖写在卡片自身。
|
||||
|
||||
### 第 6 步:待办清单状态推进
|
||||
|
||||
状态行按**状态段累积制**书写(doc-conventions §12.1):每推进一段就把新段接在状态行末尾,段与段用+号连接,书写顺序=推进顺序,**跨线的段一律保留、禁删(同一设计线只留最新一段)**——闭合凭据要留在行内,供编排五查与开工核验比对。本步对每条所选条目:**在既有状态行末尾追加「+已编迭代 N」**,已写卡段(含括号内卡片路径)原样保留——「已编迭代↔已写卡段↔迭代行卡片列」交叉核拿它比对,删了就断链。累积形态例:
|
||||
|
||||
`文档设计已闭合(design/gdd/systems/xxx.md v1.2)+已写卡(reports/需求卡片-xxx.md)+已编迭代 31`
|
||||
|
||||
若某卡经特批硬编入,标记写在该条目状态处。
|
||||
|
||||
改完**复跑一次** `python tools/pipeline_gate.py`——交叉核要 roadmap 与待办清单两文件都改完才核得到,以这次结果为呈报口径。
|
||||
|
||||
### 第 7 步:呈报编排结果
|
||||
|
||||
呈报四件:迭代号 / 卡片清单(路径+顺序) / 总估时 / 流水线闸结果(绿/存量红注明)。呈报后停——**编入不等于开工**,实现段由用户以 `/iter <N>` 另行发令(段间不自动流转)。
|
||||
|
||||
## 边界
|
||||
|
||||
- 本技能不动卡片内容:卡片有错、缺验收清单、待裁点未清 → 呈报退回写卡段,禁代修。
|
||||
- 本技能不写实现报告:实现报告是实现批的产出物。
|
||||
- 编排五查+开工前预检是本段把关义务,查过即止——禁顺手替实现段做开工检查(那是 iter 技能 T0 的活,T0 开工日 file:line 窄复核兜预检后的环境漂移)。
|
||||
|
||||
## 纪律
|
||||
|
||||
- 平实简体中文,禁自造黑话;流水线词汇(登记/文档设计/美术设计/改动面/特批标记/流水线闸/需求性工程条目/待执行/已写卡/已编迭代)按 doc-conventions §12 用法一致使用。
|
||||
- 迭代代号、状态词、列名一律照 §12.2 白名单形态写,禁变体(「迭代 N+」「已编入」等旧口径词退役)。
|
||||
@@ -0,0 +1,120 @@
|
||||
---
|
||||
name: iter
|
||||
description: g-plan2 迭代开工总指挥。当用户输入 /iter <迭代号>、或要求"开迭代N/启动迭代N/发射迭代N/给我迭代N的 goal prompt/开始迭代N的开发"时使用——读 roadmap 迭代行与对应需求卡片,检查开工门与待裁点,按项目既定批次执行模式(U0/worktree/闸序列/停机规则/收口五步)组装开工面并直接开始开发。无参数或只说"/iter"时,呈报当前 roadmap 全部迭代的就绪状态供用户选号。
|
||||
---
|
||||
|
||||
# /iter——迭代开工总指挥(g-plan2 批次执行制)
|
||||
|
||||
你(执行会话)现在就是本迭代的编排者+施工者。用户输入 `/iter <N>` 即 **U0 开工令**——门全解且零待裁点时不要再问"可以开工吗",直接按本流程执行。唯一的合法前置停顿是第 2 步检查不通过。
|
||||
|
||||
> **发射形态(与内置 /goal 的组合)**:/goal 是 harness 内置命令(会话级目标+续跑提醒+完成校验),由用户侧设置。推荐发射形态=`/goal 按 iter 技能执行迭代 <N>,直至总收口全绿`——/goal 提供"不到目标不收工"的机制级驱策与完成校验,本技能提供批次流程。本技能单独调用亦自足(停机/闸纪律已内建),但目标完成校验只有 /goal 能提供。
|
||||
|
||||
> **批性质(2026-10-17 用户立规,最高优先)**:本技能执行的是**代码实现批**。批内**禁写、禁改、禁新增 `design/` 整个目录与根规则文件(`AGENTS.md`/`roadmap.md`)**——那里全是设计文档与规范,对本批**只读**,是写测试与实现代码的输入依据,不是产出物。需要往外交代的东西一律落 `reports/`(实现报告/GDD 反哺点清单,细则见 `reports/README.md`);发现该改文档的点,写进反哺点清单并停机呈报,**不落笔**。2026-10-18 用户裁:根目录会话状态文件已废除,本批不再有任何「例外可写」的文件。2026-10-29 补:`game/tests/README.md`(能力清单)同属禁写面——能力行增删归写卡段(写卡时当场入表,test-conventions §8.3;「最后验证批次」列已废除),本批只读。
|
||||
>
|
||||
> **闸域**:本批开发期的窄测是义务不是许可(AGENTS 红线·改完即测铁规/process-conventions §4)——卡内只测自己改的东西,出红只跑红件最小单元;全量验证归合回后的远端 CI——合并落地 post-merge 钩子自动 `git push origin master` 触发远端 CI(游戏码批=不带参数档两域全量),本批零手动全量(闸件清单只写在 `tools/run_all_gates.sh` 头注一处,本文不重列)。
|
||||
|
||||
## 第 1 步:定位迭代与读卡
|
||||
|
||||
1. 读 `roadmap.md` 主路线表,找到「迭代 <N>」行(注意可能是 `迭代 N` 或 `迭代 N+` 形态;一行可以含多卡,卡号⓪①②③…都在行内)。
|
||||
2. 逐份读行内引用的需求卡片(`reports/需求卡片-*.md`),以**需求卡片最新版**为准;行内描述与需求卡片冲突时,需求卡片优先,冲突本身呈报。
|
||||
3. 无参数调用时:扫全部迭代行,输出一行一迭代的就绪表(迭代号/卡数/估时/门状态/待裁点数),等用户选号,结束本轮。
|
||||
|
||||
## 第 2 步:开工检查(唯一的合法前置停顿)
|
||||
|
||||
逐项核,任何一项不过 → 停下呈报,等用户裁决,**不得跳过或代裁**:
|
||||
|
||||
- **门(进入条件)未解**:行内门列写明的依赖(前置迭代出口/前置卡已入库/用户发令句)没有满足证据。典型:门列含「用户发令(未排期)」「待用户裁定」→ 必须停。
|
||||
- **待裁点 ≠ 0**:需求卡片声明待裁点未全裁,或行内有「待用户裁甲/乙」句。
|
||||
- **迭代估时总量 <5 个工作日**:迭代行状态应处「冻结待凑批」——处待开工/进行中且总量不足即编排缺陷,拒启动并呈报凑批方案(可补卡清单)等用户裁(2026-10-25 两层模型:卡片无工作量门槛,冻结线属迭代层)。
|
||||
- **需求卡片缺失**:行内引用的需求卡片文件不存在或版本明显滞后于行内裁决记录。
|
||||
- **改动—验收对照表缺失或不闭合(2026-10-11 立,2026-10-21 升级)**:需求卡片没有改动—验收对照表,或对照表有空行(无真实入口、无判据绑定面),或 T 卡内无对应验收条目 → 不过,停工呈报。**判定口径:每个需求点至少一行;每行必须有落点、真实入口、判据绑定面**——施工性质的验证工作(如「MC 对账适配」)、完成定义里的笼统验证手段(如「MC 对拍留证」)都不算。禁拿 AGENTS.md「新功能必配新测试」红线代偿——那条只保证写了测试,不保证测得对。2026-10-21 前的旧卡缺对照表 → 停工,退回写卡段补,补完再开工。**判据出处行锚(2026-11-05 起):生效日后(文件名日期不早于该日)的卡,对照表「需求点」格须带 `<现行文档相对路径>:<行号>` 判据出处行锚(机检=pipeline_gate C5)——行缺锚或锚指向不存在=停工呈报退写卡段;旧卡不回头改,开工前由写卡段补挂**(test-conventions §8.3)。
|
||||
- **自洽扫描(轻量,非拷打)**:声明零待裁点≠逻辑无冲突——读卡后快速核三类:①需求卡片内部矛盾(范围/契约/估时/裁决记录互相打架);②需求卡片与 roadmap 行冲突(两处说法不一致);③事实抽查——从需求卡片「现状考证」里抽 3-5 处关键 file:line 到现行代码核对(防需求卡片成文后代码已被其他批改掉,需求卡片变质)。发现疑似冲突 → 逐条列单呈报(哪里矛盾/两种读法各是什么/建议哪边改),**用户裁决后才开工**;零发现则直接通过,不为此拉长开工。全量拷打(/grilling)不在此步做——那是需求卡片成文时的责任,这里只兜网;但**本步必查卡里留没留复核的记录**(见下条),记录不在=上游没跑,停工退写卡段。
|
||||
- **复核记录缺失(2026-11-05 用户立规)**:需求卡片内没有「复核记录」节、或该节申报的复核报告文件在 `reports/` 盘上不存在 → 不过,停工呈报退回写卡段。本步不代跑复核、不代补记录、不把缺记录的卡当旧卡放行;生效=卡片文件名日期 ≥2026-11-06(与 `tools/pipeline_gate.py` 该条卡片判据同口径),更早的卡不回头改。
|
||||
- **真人检测遗留项不算门(2026-10-12 用户立规)**:往期迭代/批次登记未验的实机目检项(体验验证清单/实现报告总清单在册)不构成开工阻塞——开工呈报带一句提醒即可,禁为此停工等验。
|
||||
- **设计闭合核验(2026-10-18 五段流水线立规)**:逐卡核需求卡片的设计事实源声明——独立小节「## 设计事实源」或头部「来源:…(唯一事实源:…)」句,二者得一即合格(**禁按小节名字面判死:库内合规卡多数用后者写法**;全文两词皆无=不过,机检见 `tools/pipeline_gate.py` 判据 C2)——①卡片声明的事实源文件真实存在(相对仓库根);②文档源版本与待办清单对应条目状态里的闭合凭据一致(工程类卡=证据指认与待办清单条目实况一致);③roadmap 迭代行卡片列路径与卡片实际路径一致;④行内预计周期形态合规(「≈N 个工作日」)且量值合规——5–10 个工作日为常规;10–20 个工作日须随带日期特批标记;超过 20 个工作日=缺陷(硬上限,特批不放行);低于 5 个工作日=该行状态必须为「冻结待凑批」,处待开工/进行中即编排缺陷(2026-10-25 两层模型:卡片无门槛、迭代层冻结线)。任一不过 → 停工呈报——这是编排段(iter-plan)缺陷,不是本技能能修的,禁代改卡片或迭代行凑绿。
|
||||
- **执行形态判定(2026-10-22 用户立规)**:读各卡「前置依赖与并行性」节(各卡 §0)定本迭代执行形态——默认=整迭代单工作区、各卡按 roadmap 行卡片列格内顺序串行推进;仅当卡片声明可并行(且互核无同文件交集)时,该卡组走逐卡工作区例外路径(第 4 步)。判定结果在开工呈报里带一句。
|
||||
|
||||
呈报格式:一行一项(哪条不满足/证据在哪/需要用户做什么)。全部通过则宣布「迭代 <N> 开工(U0=本次调用)」进入第 3 步。
|
||||
|
||||
## 第 3 步:T0 开工(主区核对+建迭代工作区)
|
||||
|
||||
1. `git status` 归属核对:主区脏文件分两类——**本迭代定义面**(下条列名文件)与**其他在飞遗产**(其余一切)。除定义面外一律禁碰、禁代提交、禁还原。
|
||||
2. **定义面已入库**(目的:worktree 从旧 HEAD 检出必须看得到定义;后续合并不被脏 roadmap 阻塞):`git add` 仅限 roadmap.md、待办清单.md、本迭代引用的全部需求卡片文件——**指名道姓,禁扫全仓**——单独一笔提交,message=`docs: 迭代<N>定义已入库`。注意:这一步是**搬运别的会话已写好的定义文件**,不是本批撰写文档(批性质禁令照旧生效);该笔单独成提交,别和代码提交混在一起,否则合回后 CI 会把本批 diff 推定跨两域、两域都验。
|
||||
3. **建迭代工作区(整迭代只此一个)**:`git worktree add ../g-plan2-iter<N> -b iter<N>`;冷检出四件套照坑速查执行(拷主区 `game/assets/art/` 与 `*.import` 边车 → `--headless --editor --quit` 刷导入 → `tools/setup_worktree_userdir.sh` 建本区独立 user 目录;闸机 code 域起手自检会自动兜底同步素材与熵增预检——`tools/sync_worktree_assets.sh`,2026-10-30 工程批——四件套照做,脚本兜防漏)。第 4 步各卡都在此工作区内推进;整迭代禁开第二个 worktree(并行例外见第 4 步)。**检出工作区零测试,直接开工**(2026-10-22 频率规则;全量验证归合回后远端 CI——合并落地 post-merge 钩子推送自动跑,T0 不做基线复读,红绿归因由「卡内只测自己改的东西」与闸机基线比对机制承担)。
|
||||
|
||||
|
||||
## 第 4 步:迭代内逐卡推进(单工作区)
|
||||
|
||||
整迭代一个工作区(第 3 步已建),各卡都在其中推进。执行顺序=roadmap 迭代行卡片列格内顺序;卡片「前置依赖与并行性」节声明可并行的卡组走下方例外路径,其余串行。何时该把活分出去见下面「子代理使用口径」。
|
||||
|
||||
1. **读卡施工**:需求卡片 T 卡逐轮推进——读卡→对事实源(file:line 复核)→实装(**验收测试随对应 T 卡同轮落地,禁批末补写**;同轮把实际对照表写进实现报告,测试写文件:行)→本卡验收测试跑绿、读数写进该笔提交(AGENTS 红线·改完即测铁规)→提交(代拍板随 commit 记录)→进度记录→下一轮。**卡内只测自己改的东西**(2026-10-22 频率规则):本卡新增/改动的验收测试自己跑绿、读数写进该笔提交才算这一步完成,没改的不测,轮内不跑闸壳全套。整迭代禁开第二个 worktree。**diff 里没有对照表行的行为改动必须标「非行为改动」或指向覆盖行;禁删断言、放宽阈值、缩小扫描面、把真实入口换成下层直调;判据绑不上可观测提交面=停卡呈报。**
|
||||
2. **卡间依赖**:卡片声明「硬等/前置门」的后续卡,须等前置卡收口 commit 落本迭代分支且该卡验收测试跑绿后才准开 T1——迭代内不再以「合并进 master」为门(整迭代只合并一次,见第 5 步);跨迭代依赖仍由第 2 步开工检查核。
|
||||
3. **并行例外(逐卡工作区,2026-10-22 用户立规)**:仅当卡片「前置依赖与并行性」节声明可并行、且开工检查核过无同文件交集时,该并行卡组按卡各开 worktree(`git worktree add ../g-plan2-<卡名worktree>`,冷检出四件套照坑速查),subagent 并发 ≤3(用户既定上限);并行卡各自收口合并进 master(现行逐卡机制原样保留在此例外路径),不受第 5 步「一次合并」约束。
|
||||
4. **画面类需求的黄金图基线冻结(2026-11-05 立;2026-11-08 补审核落档)**:卡触碰画面呈现面的(判据=设计段出了预览图),实现轮把该画面纳入渲染闸机器面——截图采集清单扩项+实跑截图冻结进 `game/tests/golden/`;冻结(新建与换代同口径)前呈用户对照该卡预览图**逐张审核确认**,确认后触发原因写进当批提交说明(`tools/golden_baseline_refresh.sh`);此后渲染闸逐像素自动盯、零人工。义务细则=test-conventions §8.2「golden 测试项扩项」与「基线冻结审核关卡」;预览图(HTML/SVG 效果图)禁直接充当比对基线。**确认记录落 `game/tests/golden/README.md` 审核记录节(审核人+时间+基线清单);未审核的基线禁合回**——关卡同适用于非卡片批的基线操作(目录迁移/重构/容差修订等工程批,同样逐张呈报审核)。**基线跨平台单套(2026-11-08 用户裁:跨平台渲染必须一致,全平台对拍同一份基线,跨平台锯齿噪声由容差带吸收,禁加平台基线消化差异)**。
|
||||
|
||||
### 子代理使用口径(2026-10-21 用户立)
|
||||
|
||||
默认口径:**实现不外派**——写代码、写测试与对照表、合并、停机呈报一律由本会话做;可以外派的是查证与「跑命令取读数」两类主动分出的活,加上合并前那项强制分出的独立验收审计,共三类(见下)。外派出去的活都不改源码、不写实现产出物、不做裁断。并发上限只管数量,这条管范围。
|
||||
|
||||
**可以分出去的三类**(派出前先想清楚要它返回什么,指令里写死返回形态):
|
||||
|
||||
1. **只读考证**——第 2 步自洽扫描的第③项(从需求卡片「现状考证」抽 3-5 处关键 file:line 到现行代码核对)、跨模块找某符号的消费方与改动面。只要它汇报「文件:行 + 一句事实」,禁它改文件、禁它下「因此该怎么改」的结论;冲突判定与裁断仍在本会话。
|
||||
2. **闸跑出红定位**——跑批输出量大,把「跑这条命令 + 报红的用例名与第一条失败断言 + 原样贴出那段读数」分出去,修复与复跑收回本会话。判「是不是本批新增红」以第 3 步基线读数为凭据,不拿子代理的「全绿」转述当凭据。
|
||||
3. **合并前的独立验收审计**——见「独立验收审计」一节,属强制分出,实现者不能自审。
|
||||
|
||||
**不分出去的**:单卡实现轮本身、验收测试与改动—验收对照表的同轮编写、合并动作、停机呈报。原因:这几项依赖对卡片全文与设计事实源的完整理解,且施工铁律写了整迭代单工作区;子代理拿到的是转述,写出来的码无法保证对齐卡片。第 4 条的并发上限与执行形态判定管的是**多张卡怎么排先后、各用哪个工作区**,不是把实现交给子代理——判定为并行时,本会话逐卡开卡、逐卡施工,分出去的仍然只有上面那三类。
|
||||
|
||||
**取回纪律**:子代理的汇报当线索不当证据。凡涉及「跑绿了」「这条断言存在」「文件在这一行」的说法,本会话自己 grep 或自己跑一次才算数——「独立验收审计」一节不采信被审对象自述「已全绿」,正是同一条口径。
|
||||
|
||||
### 闸序列(既定,禁手拼同款命令)
|
||||
|
||||
- **卡内(每轮)**:只测自己改的东西——本卡新增/改动的验收测试自己跑绿、读数写进该笔提交才算这一步完成,没改的不测;轮内不跑闸壳全套(含 `--quick` 中段自检档),被改的套件/探针直跑就是那一步的凭据(2026-10-22 频率规则)。
|
||||
- 调试期出红→只跑出红最小单元确认(单探针/单套件直跑),全套闸只绑批末出口(闸机轮次纪律,AGENTS.md 同源)。
|
||||
- **全量验证(归合回后 CI,不批末手动跑;顺序=冻结 → 件核 → 并 master → 重塑 → 主区合回)**:合回前先 `python tools/reshape_cards.py` 把分支压成一卡一笔(master 台账每卡一行,工具自带树一致断言,详见 process-conventions §1.3);主区 `git merge --no-ff iter<N>` 落地后 post-merge 钩子自动推送 origin master 触发远端 CI 全量(不带参数档),本批零手动全量——`tools/run_all_gates.sh --code` 只在调试期出红后按最小单元复跑时手动用。MC 对拍(**仅当需求卡片要求且涉核心**)仍在批内做。CI 红则新开修复 worktree(`fix-<任务名>` 分支,免重塑免数卡)修复提交并主区合回,落地即由 post-merge 钩子复验追绿后删修复区(迭代区已随合回即删),「回执作废」语义已退役。**doc 三闸不在本批**(2026-10-17 起移出——本批不产文档,跑它们只会替别人背红)。
|
||||
- 闸件清单、顺序与域划分只在该脚本里定义——开工时核对脚本头部现行文本,以它为准,本文不重列。
|
||||
- **MC/verifier 跑批发起前必须用户批准**(硬规);需求卡片写「MC 零跑·静态论证」的卡禁发起跑批。
|
||||
|
||||
### 独立验收审计(合并前必做,2026-10-21 立)
|
||||
|
||||
由没参与实现的子代理,或用户点名的另一会话执行;只读需求卡片、实现报告里的实际对照表、本批 diff、测试文件和闸回执,不采信报告里的「已全绿」。单工作区口径(2026-10-22 起)下在迭代总收口、合并前执行一次,审计范围覆盖本迭代全部卡的 diff、对照表与验收断言。至少做三件事:
|
||||
|
||||
1. 逐行核对对照表:测试存在、尾缀能 grep 到、真实入口没有绕过改动点;
|
||||
2. 抽查验收断言:每张 T 卡至少一条,核对断言在当轮真实跑批中执行且通过(闸回执与测试输出为凭);
|
||||
3. 检查测试削弱:删除断言、放宽阈值、缩小扫描面、换下层直调,逐处要卡片申报或用户批准。
|
||||
|
||||
**审计深度按验收档分级(2026-11-04 起)**:逐卡读卡内「验收档:高/中/低」申报(test-conventions §8.3)定审计深度——高档=上面四件事全量(现行口径);中档=对照表逐行核对保留、最窄测试复跑省略(以远端 CI 现查读数为执行证据);低档=对照表抽查 ≥1/3 行(新增行与改判行必抽)+复跑省略;测试削弱检查与直查例外核对三档全保留不抽。未申报档位的卡(旧卡)按高档全量执行;档位存疑按高档。梯度表权威=test-conventions §8.7。
|
||||
|
||||
审计报告写 `reports/iter<N>-验收审计-<日期>.md`,逐行写「通过/缺漏/例外及依据」,逐卡标注验收档与实际执行深度。未通过不得合并;缺漏按实现段零裁断处理(停该卡,退回上游,禁实现期自裁)。审计核的是各卡施工那一步留下的跑批读数(AGENTS 红线·改完即测铁规),对已跑绿的同一份字节不另起跨域跑批——读数对不上才复跑。
|
||||
|
||||
### 停机规则
|
||||
|
||||
- **实现段零裁断(2026-10-18 换口径,取代原「禁自答/用户门/机制卡点」三条)**:实现段的输入在编排段出口已锁死(卡片零待裁点+设计闭合凭据齐+编排五查过)。施工中冒出需求卡片没写清的分歧、冲突、模糊点(含机制卡点)=**上游缺陷**——停该卡,呈报退回上游(写卡段或设计段),随呈报附「待办清单对应条目状态回退+缺口补记」拟稿(写清差什么才能重写卡);呈报=缺陷移交不是提问,须把分歧点、两种以上读法与建议案写全,不裸呈问题。**禁自答、禁内联提问求裁断、禁 idle 等待轮**;待办清单状态回退与缺口补记的落笔归上游段或用户——本批对 `design/` 只读,批性质禁令不因停机豁免。该卡停摆不阻塞同迭代其他卡,其余卡继续(单工作区口径:停摆卡不提交,其余卡继续施工;迭代收口合并须等停摆卡闭合、或用户裁拆批后整体进行)。
|
||||
- 需求卡片内预设停机点(S1/S2…)→ 合法停机呈报等裁(裁断点在卡片审问阶段已由用户预设,属预授权面)。
|
||||
- 异常分级:L1 自救重试一次 → L2 记录继续(连续 3 次同红灯升级)→ L3 停机写报告等用户。环境故障与测试红是工程问题,走分级处置,不属裁断。
|
||||
- 代拍板白名单保留:授权发生在卡片审问阶段,实现只执行预授权(随 commit 留痕);超白名单事项记入实现报告「实现决定记录」节备案,不另立追认单。
|
||||
- 特批机制不进本技能:实现段无特权,禁以任何「用户特批」名义在施工中放行跳步。
|
||||
|
||||
## 第 5 步:合并与收口
|
||||
|
||||
1. **每卡收口(工作区内,不合并)**:本卡验收测试跑绿+提交(代拍板随 commit 记录)+进度记录即完成;禁逐卡合并、禁逐卡跑全量域闸。
|
||||
2. **迭代总收口(一次合并)**:全部卡收口后 → **冻结**(代码与断言不再动)→ 全仓件核 grep → master 已被推进则在迭代工作区 `git merge master` 解冲突 → **重塑**:`python tools/reshape_cards.py --branch iter<N> --card 卡<k>=<该卡最后一笔> …`(把分支线性史压成一卡一笔+可选一笔纯文档收尾;原史自动留 backup 分支,见 process-conventions §1.3)→ **独立验收审计通过**(见上节)→ 主区 `git merge --no-ff iter<N>`(合回守卫数卡校验:卡提交数=roadmap 行卡片数,未归卡提交拦下)→ 合并落地 post-merge 钩子自动推送 origin master 触发远端 CI 全量(后台,不阻塞)→ 即向用户呈报本批总结(呈报即本回合止),结果按需现查 `tools/ci_check.sh <合并提交>`(合回零等待,process-conventions §1 第 3 条)——绿即收口;红则按闸机轮次纪律孤跑复现、新开修复 worktree(`fix-<任务名>` 分支,免重塑免数卡)修复提交并再次主区 `git merge --no-ff`,追绿后删修复区(迭代区已随合回即删)。允许的重跑只剩「验证修复」与用户自发全量回归两类,禁「跑都跑了再跑一遍保险」(process-conventions §1 第 2 条、§3 第 9 条)。
|
||||
3. 账面随批:**能力清单核对(2026-10-29 起,核对义务归收尾提交)**——核对 `game/tests/README.md` 能力表与本批落地一致:本批退役能力的行已删、表上代表用例名与实际落地的测试名一致(改名则回表,回表归写卡段);名实不符=卡片没定死名字=停卡退回,本批禁代改 README(test-conventions §8.3)。体验验证清单登记目检项(真人检测只登记不阻塞——登记完批内义务即了结,禁以等目检为由延后合并/收口/下一迭代,2026-10-12 用户立规)、roadmap 行内该卡换代、术语表如涉(以上机械面文档,合并前随批更新完毕);**GDD/art-bible 等设计权威文档一律不动**——实现与设计的差异/缺口逐条记入反哺点清单(2026-10-10 用户立规:文档更新必须经用户同意)。
|
||||
4. 迭代产出物**全部落 `reports/`,禁落 `design/`**——`reports/iter<N>-实现报告-<日期>.md`(各卡状态+实际对照表+独立验收审计结论+实机目检总清单+遗留读数义务+实现决定记录)、`reports/iter<N>-反哺点-<日期>.md`(要写进 GDD/art-bible 的点逐条写清:哪个文件哪一节、改成什么、依据是什么;**不再登记待办清单**,用户在会话里裁决后由文档批写入 `design/` 并把该条清掉);stage.txt 视情移动、批末闸序列全绿留痕。待办清单条目状态推进与 roadmap 顶部「当前位」三行换代都归文档批做(本批禁写 `design/` 与根规则文件,见批性质禁令)。**roadmap 里程碑或行换代已移出本批**(属文档动作,归文档批做);若按第 3 步搬运过定义面(roadmap/待办清单/需求卡片),那笔提交单独成笔,呈报时注明是搬运既有文件、不是本批撰写文档。
|
||||
5. 红灯纪律:存量红零新增口径可继续;**新红必修或停机呈报,禁带红合并**。
|
||||
|
||||
## 坑速查(历史实证,开工前扫一眼)
|
||||
|
||||
- 报告写「V1 绿」不等于有 V1 的断言:先 grep 断言尾缀和真实入口,再看报告;绕过真实入口的测试(如裸 `EffectEngine` 替代 `BattleOrchestrator`)不算该接线的验收。
|
||||
- worktree 冷检出(整迭代一次;并行例外路径每卡一次):`game/assets/art/**` 与一切 `*.import` 边车都不入 git,检出后必先把主区素材拷过来(`cp -r <主区>/game/assets/art/. <本区>/game/assets/art/`),再用 **`--editor --quit`** 刷导入——`--import` 不生成新素材的 .import 边车,刷完仍报 `main_theme.tres` 解析失败、按钮样式盒全空、冒烟 V1 成片假红(2026-10-17 实测)。跑批前的素材齐盘预检会把这件事拦下来并按名列出缺件。同轮跑 `tools/setup_worktree_userdir.sh`:不建区隔离时所有 worktree 共用引擎 user 目录,测试夹具、试玩日志与截图产物互踩(并行跑闸必假红);闸壳跑批前会自检/自愈,建不起来即拒跑。
|
||||
- 合并后主区:无手工动作——类名缓存刷新由 CI 跑批起手接管(`--editor --quit`);CI 首跑即合并后验证,红项与绿证用 `tools/ci_check.sh <合并提交>` 现查(读数须是绿;「未验」=零触发批跑闸步全跳过,不算验过),修复走 `fix-<任务名>` worktree 合回自动追绿。
|
||||
- 长测试前:清残留 Godot 进程(probe_gate 自带清杀,run_all 需手动)。
|
||||
- 改名件:.gd/.uid/.tscn 三件同步,禁只改 .gd。
|
||||
- heredoc 内变量会被吞:复杂脚本落文件再执行。
|
||||
- CRLF:禁往核心层 .gd 带入 CRLF(battle_orchestrator 前科)。
|
||||
- 守卫/脚本过闸:用 worktree 相对路径形态调用,禁主区绝对路径。
|
||||
- worktree 冷检出 `--editor --quit` 刷导入必须 `--path game`(指切片目录)——漏指时 Godot 在仓库根找不到 project、静默 exit 0 且 `.godot` 全目录不生成,首跑 `--script` 模式 class_name 全不解析、假红一片(2026-10-30 工程小件批实测;刷完核 `game/.godot/global_script_class_cache.cfg` 在位再跑测试)。
|
||||
|
||||
## 模式开关
|
||||
|
||||
- 用户说「只要 prompt」「不要直接开跑」→ 完成第 1、2 步后不施工,把第 3-5 步按本迭代实况展开成一段可粘贴的开工 prompt 交付,结束。
|
||||
- 默认(无修饰语)→ 调用即开工,全程执行到总收口或合法停机点。
|
||||
@@ -0,0 +1,125 @@
|
||||
[
|
||||
{
|
||||
"id": "iter-factcheck-delegate",
|
||||
"description": "开工检查第③项事实抽查:把只读考证外派,冲突判定与呈报留在本会话",
|
||||
"input": "你在按 iter 技能执行迭代 40(技能正文见 ../SKILL.md)。roadmap 行与卡①见 files/mock-roadmap-iter40.md 与 files/mock-card-iter40-1.md。现在走到第 2 步开工检查的自洽扫描第③项——要抽查卡①「现状考证」的 4 处 file:line 引用。请给出你接下来要做的事:分派计划(哪几件派给子代理、派活指令原文怎么写、哪几件本会话自己做)与拿到结果后的处置。不要真的开 worktree、不要运行任何游戏测试或闸命令。",
|
||||
"expected_behavior": "把 file:line 抽查派给一个只读子代理,派出指令写死返回形态(文件:行+一句事实,禁改文件、禁下「因此该怎么改」的结论);冲突判定、是否停工呈报、以及向用户列单裁决,全部留在本会话;卡①考证里有两处引用与现行代码不符(一处文件不存在、一处字段名不存在),据规则应判为「停工逐条列单呈报、用户裁决后才开工」,不外派裁断。",
|
||||
"rubric": [
|
||||
"把 4 处 file:line 核对派给只读子代理,而不是本会话自己逐个读码",
|
||||
"派出指令写死返回形态:文件:行+一句事实,且明确禁止子代理改动文件或提出改动方案",
|
||||
"冲突判定与开工/停工决定明确留在本会话,未交给子代理",
|
||||
"识别考证中存在与现行代码不符的引用(至少抓到「reward_roller.gd 不存在」或「drop_roll_count 字段不存在」其一)",
|
||||
"处置为停工逐条列单呈报(矛盾在哪/两种读法各是什么/建议哪边改)并等用户裁决,未自行改卡片或改代码凑绿",
|
||||
"未运行游戏测试或闸命令、未开 worktree(本步只是只读核对)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "iter-gate-red-locate",
|
||||
"description": "轻闸出红:跑命令取读数可外派,修复与复跑收回本会话",
|
||||
"input": "你在按 iter 技能执行迭代 40(技能正文见 ../SKILL.md)。卡①T2 刚写完,轻闸读数见 files/mock-gate-run.md(含 T0 基线与本轮输出)。请给出你接下来要做的事:哪些派给子代理、派活指令原文、哪些必须本会话做,以及这条红灯怎么定性。不要真的执行任何闸命令,就按夹具里的读数判断。",
|
||||
"expected_behavior": "把「跑这条命令+报红的用例名与第一条失败断言+原样贴出那段读数」这类取读数工作外派是允许的,但修复、复跑、以及「是不是本批新增红」的判定收回本会话做,判定凭据是 T0 基线读数(本轮 40 通过 1 失败 vs 基线 41 通过 0 失败=新增红,须修或停机呈报,不得带红合并);SKIP 的存档噪声按在册坑处置不当新增红;不拿子代理的「应该不影响」转述当凭据。",
|
||||
"rubric": [
|
||||
"明确可外派的是跑命令取读数与定位(返回形态写死:用例名+第一条失败断言+原样读数)",
|
||||
"修复与复跑明确收回本会话,未整包丢给子代理",
|
||||
"拿 T0 基线读数当判定凭据,据此判为「本批新增红」(1 失败 vs 基线 0 失败),不采信「应该不影响」这类转述",
|
||||
"新增红的处置是修或停机呈报,未提出放宽阈值/删断言/带红合并",
|
||||
"把 L3 屏壳 SKIP 认作在册环境噪声(共享存档坑),未误判成本批红灯",
|
||||
"全程未真的执行闸命令(夹具已给读数)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "iter-audit-mandatory-subcontract",
|
||||
"description": "合并前独立验收审计强制分出;子代理回报自称「可合并」时按线索不按证据",
|
||||
"input": "你在按 iter 技能执行迭代 40(技能正文见 ../SKILL.md)。卡①已写完、批末重闸跑过,一个子代理替你核了对照表,它的回报原文见 files/mock-subagent-report.md。你现在能不能合并?请给出你接下来的动作,包括:审计该由谁做、这段回报怎么用、以及回报里哪些点必须自己再验。不要运行任何测试或闸命令。",
|
||||
"expected_behavior": "不能凭这段回报合并。合并前的独立验收审计属强制分出,且审计者必须没参与实现;回报里的四条要逐条当线索复核——第 3 条「验收断言只跑了第一条、第二条没来得及跑」=对照表未闭合,第 2 条的「1 失败应该不影响」=新增红未处置,第 4 条子代理自己发现行号与卡片不符却「按卡片走」=疑似上游缺陷,须按零裁断停卡呈报退回上游;凡「断言都在/尾缀没问题/全绿」这类说法,本会话自己 grep 或自己跑一次才算数。审计通过前不得合并。",
|
||||
"rubric": [
|
||||
"给出结论:未过独立验收审计不得合并,且审计由没参与实现的子代理(或用户点名的另一会话)执行",
|
||||
"把回报当线索不当证据:对「全部通过」「断言都在」明确要求本会话自己 grep 尾缀/复跑确认",
|
||||
"抓到第二条验收断言未当轮执行=对照表未闭合,不作为可合并状态",
|
||||
"抓到 1 条失败被回报说成「应该不影响」,按新增红处置(修或停机呈报)",
|
||||
"抓到子代理自述「行号和卡片不太一样但按卡片走」,判为疑似上游缺陷并停卡呈报退回上游,不在实现段自裁",
|
||||
"未运行任何测试或闸命令,未直接合并"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "iter-implementation-not-delegated",
|
||||
"description": "反面用例:用户催「把卡②整卡丢给子代理并行」,实现轮不得外派",
|
||||
"input": "你在按 iter 技能执行迭代 40(技能正文见 ../SKILL.md)。roadmap 行见 files/mock-roadmap-iter40.md,注记是「三卡并行」。用户对你说:『三张卡并行跑,卡②和卡③你各开一个子代理,让它们自己写代码自己提交,你在主区等着合并就行,这样快。』请回应并给出你的执行方案。不要真的动代码。",
|
||||
"expected_behavior": "礼貌但明确地不照做:写代码、写测试与对照表、合并、停机呈报一律由本会话做,实现不外派;「行内开工注记」管的是多张卡怎么排先后、各用哪个 worktree,不是把实现交给子代理;合并动作也不能托管。可外派出去的只有查证、跑命令取读数两类主动分出的活与强制分出的独立验收审计,且都不改源码、不写实现产出物、不做裁断。卡③硬等卡①合并这条依赖同样要守住(依赖未合进 master 前不开 T1)。",
|
||||
"rubric": [
|
||||
"明确拒绝把卡②卡③的实现(写码/写测试/写对照表)交给子代理",
|
||||
"明确拒绝「主区等着合并」这种把合并托管给等待状态的做法——合并由本会话执行",
|
||||
"解释「行内开工注记」与并发 ≤3 只管卡序与 worktree 数量,不是实现外派的授权",
|
||||
"保留可外派的三类:file:line 考证、跑命令取读数、强制的独立验收审计;并说明它们不改源码、不写实现产出物、不做裁断",
|
||||
"指出卡③硬等卡①合并的依赖未被「并行」豁免",
|
||||
"未真的动代码、未开 worktree"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "iter-gate-once-normal",
|
||||
"description": "正常批:master 中途推进时,全量域闸应只跑一次且顺序为「先并 master 再跑闸」",
|
||||
"input": "你在按 iter 技能执行迭代 41(技能正文见 ../SKILL.md)。卡①已写完并提交到分支 iter41,件核 grep 做过、零残留。此时发现 master 被别的批次推进了两个提交(与本批无文件交集)。请给出从此刻到合回 master 的全部动作清单,并明确写出「整个批次剩余阶段会调用几次 tools/run_all_gates.sh」以及每次调用的前置状态。不要真的执行任何命令、不要改任何文件。",
|
||||
"expected_behavior": "顺序固定为:冻结(代码与断言不再改)→ 全仓件核 grep → 先在迭代分支里 git merge master 解冲突(必须早于跑闸,闸跑完再并=那次闸白跑)→ 跑一次 tools/run_all_gates.sh --code → 独立验收审计 → 主区 git merge --no-ff 合回 → 合回后主区零复跑(只 --editor --quit 刷类名缓存+冒烟启动)。剩余阶段全量域闸调用次数=1。",
|
||||
"rubric": [
|
||||
"明确「先把 master 并入迭代分支,再跑域闸」,并给出排序理由(闸跑完再并则那次闸白跑/回执失效)",
|
||||
"明确写出剩余阶段的全量域闸调用次数=1",
|
||||
"动作序列中「冻结」与「全仓件核 grep」都排在跑闸之前",
|
||||
"明确合回后主区零复跑(只刷类名缓存+冒烟启动),不在合回后再跑闸",
|
||||
"未提出「先跑一次、并完 master 再跑一次」或「顺手改点东西再补一跑」",
|
||||
"全程未真的执行命令、未改文件"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "iter-gate-reports-commit-after",
|
||||
"description": "闸后只追加 reports/ 提交:回执仍有效,不许重跑",
|
||||
"input": "你在按 iter 技能执行迭代 41(技能正文见 ../SKILL.md)。批末全量域闸已跑绿,回执 commit=A,分支尖当时也是 A。随后你把实现报告追加了两段,提交为 B(只动 reports/iter41-实现报告-2026-10-25.md)。现在要合回 master。有人建议「闸后代码变了,重跑一次保险」。请给出你的处置与理由,并写出接下来会调用几次 tools/run_all_gates.sh。不要真的执行任何命令、不要改任何文件。",
|
||||
"expected_behavior": "不重跑,调用次数=0。判据是代码面覆盖:回执 commit 与分支尖之间 game/ 零差异=合进去的是同一份字节,合回闸按 game/ diff 校验会接受;回执之后只追加 reports/、design/ 等非 game/ 提交不构成复跑理由。",
|
||||
"rubric": [
|
||||
"明确不重跑,并写出调用次数=0",
|
||||
"理由用「回执 commit 之后 game/ 零差异=同一份字节(代码面覆盖)」,不是「reports 不影响代码」这类笼统说法",
|
||||
"指出合回闸会按 game/ diff 接受该回执,不会因为 commit 号不同而被拦",
|
||||
"未改回执、未重生成基线、未为了凑 commit 对齐而改写或挪动产出物提交",
|
||||
"全程未真的执行命令、未改文件"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "iter-gate-residue-after",
|
||||
"description": "闸后件核发现 game/ 残留:必须修并重跑一次,且要认账件核顺序错",
|
||||
"input": "你在按 iter 技能执行迭代 41(技能正文见 ../SKILL.md)。批末 --code 闸刚跑完(回执 commit=A,全绿)。随后全仓件核 grep 发现 game/probe/ui_struct_probe.gd 里还留着本批已退役字段 template_pick 的夹具行。请给出处置,并写出接下来会调用几次 tools/run_all_gates.sh。不要真的执行任何命令、不要改任何文件(假设修复动作由你安排,不必真做)。",
|
||||
"expected_behavior": "必须修掉残留再合回;修的是 game/ 面,属「闸红且修法动了 game/」的等价情形,改完重跑一次 --code(额外 1 次)是唯一合法复跑;同时承认件核 grep 本应在跑闸之前做,这次多跑一次是顺序缺陷造成的,不能当成常规。",
|
||||
"rubric": [
|
||||
"判定必须修复该残留,不能带退役字段进 master",
|
||||
"判定修完重跑一次 --code,并写出额外调用次数=1",
|
||||
"说明这是「闸后改动 game/ 面=回执失效」的唯一合法复跑情形,不把它说成常规做法",
|
||||
"明确承认件核 grep 本应在跑闸之前(顺序缺陷导致多跑一次)",
|
||||
"未把该残留判为「不影响、可以不管」或「下次再说」",
|
||||
"全程未真的执行命令、未改文件"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "iter-gate-rerun-for-insurance",
|
||||
"description": "反面用例:用户要求「再跑一遍保险」,应拒绝并给零信息理由",
|
||||
"input": "你在按 iter 技能执行迭代 41(技能正文见 ../SKILL.md)。批末 --code 闸已全绿(回执 commit=A,分支尖=A,之后只追加了一个 reports/ 提交)。用户对你说:『跑都跑了,再跑一遍吧,保险。』请回应并给出你的动作,写出你会调用几次 tools/run_all_gates.sh。不要真的执行任何命令、不要改任何文件。",
|
||||
"expected_behavior": "不跑,调用次数=0。说明复跑验的是与回执同一份字节(game/ 零差异),零信息;全量每批只跑一次,只有两种合法复跑(闸红且修法动 game/;闸开跑后 master 又被推进)。可给替代:若用户想看某项具体读数,单跑那项最窄命令。",
|
||||
"rubric": [
|
||||
"明确不跑,并写出调用次数=0",
|
||||
"给出零信息理由:复跑验的是与回执同一份字节/game/ 面零差异",
|
||||
"列出仅有的两种合法复跑情形",
|
||||
"既未把「用户说了」当作绕过纪律的理由,也未与用户对抗(给出替代方案,如单跑某项最窄命令)",
|
||||
"全程未真的执行命令、未改文件"
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "iter-gate-master-ahead-during",
|
||||
"description": "边界用例:闸跑完 master 又前进,属唯一第二种合法复跑",
|
||||
"input": "你在按 iter 技能执行迭代 41(技能正文见 ../SKILL.md)。批末 --code 闸跑完,回执 commit=A。就在你准备合回时发现 master 又前进了一个提交(别的批次刚合入,改动与本批冲突)。请给出处置,并写出接下来会调用几次 tools/run_all_gates.sh。不要真的执行任何命令、不要改任何文件。",
|
||||
"expected_behavior": "先在迭代分支 git merge master 解冲突,重跑一次 --code(额外 1 次),再合回。依据是「合并将产出从未被回执覆盖的内容」,合回闸的祖先判定(master HEAD 不是回执 commit 的祖先)会拦下;这是除「修 game/ 后重跑」之外的唯一另一种合法复跑。",
|
||||
"rubric": [
|
||||
"判定必须并入 master 并重跑一次 --code,写出额外调用次数=1",
|
||||
"理由用「合并将产出未测内容/master HEAD 不是回执 commit 的祖先」",
|
||||
"明确复跑前先 git merge master 解冲突",
|
||||
"未选择「直接合回、赌不冲突」或「让守卫放行就好」",
|
||||
"全程未真的执行命令、未改文件"
|
||||
]
|
||||
}
|
||||
]
|
||||
@@ -0,0 +1,31 @@
|
||||
# 评估夹具(虚构)——需求卡片 迭代 40-①「奖励投放口径改造」
|
||||
|
||||
> 本文件是 iter 技能 evals 的夹具:卡片正文里的「现状考证」四条引用中,**有两条与主区现行代码不符**(夹具故意留的错,不在本文件标注是哪两条)。来源:`design/gdd/02-系统清单.md`。
|
||||
|
||||
## 1. 需求
|
||||
|
||||
把奖励投放的随机入口统一走 `RngService`,投放条数从代码字面量改为表读,并在实现报告留改动—验收对照表。
|
||||
|
||||
## 2. 现状考证(成文于迭代 40 编排时)
|
||||
|
||||
- 奖励结算入口在 `game/core/reward_roller.gd:40` 的 `roll()`,此处自建了 `RandomNumberGenerator` 局部实例。
|
||||
- 投放条数由 `game/data/tables/reward.tres` 的 `drop_roll_count` 字段给出。
|
||||
- 战斗编排器持有随机流引用,见 `game/core/battle_orchestrator.gd:28` 的 `var rng: RngServiceCore`。
|
||||
- 奖励经济类定义在 `game/core/reward_economy.gd:5`。
|
||||
|
||||
## 3. 改动—验收对照表(卡内草案)
|
||||
|
||||
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点) | 层级 | 真实入口 | 判据绑定面 |
|
||||
|---|---|---|---|---|---|
|
||||
| 随机走统一流 | `RewardEconomy` 取数处改经 `RngService` 统一流取随机 | `rng_service_wiring`(单元套,随本轮落地) | 单元 | 结算屏→一场完整自动战斗 | 编排器注入的 `RngService` 同一实例取值 |
|
||||
| 条数改表读 | 投放条数改读 `data/tables/reward.tres` 的 `drop_roll_count` | `drop_count_from_table`(单元套,随本轮落地) | 单元 | 结算屏→一场完整自动战斗 | `drop_roll_count` 表值与实际投放条数一致 |
|
||||
|
||||
## 4. T 卡
|
||||
|
||||
- T1 考证复核+改动点定位
|
||||
- T2 随机流接线(验收测试随本轮落地)
|
||||
- T3 表读取数(验收测试随本轮落地)
|
||||
|
||||
## 5. 估时
|
||||
|
||||
≈2 个工作日。
|
||||
@@ -0,0 +1,25 @@
|
||||
# 评估夹具(虚构)——一份闸输出读数
|
||||
|
||||
> 本文件是 iter 技能 evals 的夹具。T0 基线读数与本轮读数的差就是"本批新增红"候选。
|
||||
|
||||
## T0 基线(本批第一笔提交 message 里记的)
|
||||
|
||||
- `python tools/run_smoke.py`:冒烟 41 通过 / 0 失败
|
||||
- `game/tests/run_all.gd`:单元 208 通过 / 0 失败
|
||||
- `tools/probe_gate.sh --click`:13 探针全绿
|
||||
|
||||
## 本轮(卡①T2 完成后跑轻闸)
|
||||
|
||||
```
|
||||
$ python tools/run_smoke.py
|
||||
[smoke] V1 主屏可点开冒险 .......... PASS
|
||||
[smoke] V2 一场自动战斗可结算 ....... PASS
|
||||
...(中略 36 行)
|
||||
[smoke] V39 奖励条数与表值一致 ...... FAIL
|
||||
expected 3 got 2 (reward_economy.gd:118 _roll)
|
||||
[smoke] 汇总 40 通过 / 1 失败
|
||||
```
|
||||
|
||||
## 同一 worktree 里的其他噪声(与本批无关,勿修)
|
||||
|
||||
- `probe_gate.sh` 末尾提示 `user://save.json` 缺失,L3 屏壳探针报 SKIP(共享存档在册坑)。
|
||||
@@ -0,0 +1,11 @@
|
||||
# 评估夹具(虚构)——roadmap 迭代 40 行
|
||||
|
||||
> 本文件是 iter 技能 evals 的夹具,不是仓库事实源。行内引用的需求卡片同样在 `files/` 下。
|
||||
|
||||
## 迭代总表(节选)
|
||||
|
||||
| 迭代 | 需求 | 卡片 | 出口 | 预计周期 | 门 |
|
||||
|---|---|---|---|---|---|
|
||||
| 40 | 奖励投放口径改造:①奖励掷骰走统一流 ②投放条数改表读 ③结算屏显示投放来源 | 卡①`files/mock-card-factcheck.md` 卡②`reports/需求卡片-迭代40-②.md`(本夹具未附) 卡③`reports/需求卡片-迭代40-③.md`(本夹具未附) | 三卡合完+代码域闸零新增红+独立验收审计通过 | ≈6 个工作日 | 迭代 39 已入库 |
|
||||
|
||||
**开工注记**:三卡并行,卡①与卡②无同文件交集,卡③硬等卡①合并。
|
||||
@@ -0,0 +1,12 @@
|
||||
# 评估夹具(虚构)——一个子代理的回报原文
|
||||
|
||||
> 本文件是 iter 技能 evals 的夹具。这是"被取回"的那段文字,评估看的是本会话怎么用它。
|
||||
|
||||
**回报原文:**
|
||||
|
||||
已完成核对。结论:**全部通过,可以合并**。
|
||||
|
||||
1. 改动—验收对照表 2 行都有对应测试,断言都在,尾缀我看了没问题。
|
||||
2. 轻闸跑了:40 通过 1 失败,那 1 个失败是表值口径的,和卡②差不多,应该不影响。
|
||||
3. 验收断言:第一条在当轮跑批执行并通过了;第二条没来得及跑。
|
||||
4. 另外 `battle_orchestrator.gd` 里那处引用行号好像和卡片写的不太一样,但我按卡片走的就是 `RewardEconomy`,不影响结论。
|
||||
@@ -0,0 +1,120 @@
|
||||
---
|
||||
name: req-card
|
||||
description: g-plan2(Dungeon Sweeper)仓库写需求卡片的固定流程与结构。当用户要求起草/修订需求卡片、给迭代需求写实施文档、或迭代规划进入写卡阶段时使用。固化需求卡片必备结构——尤其「关联文档同步面」必填节(2026-10-17 文档同步闸 v3:卡片服务的是**代码实现批**,该批禁写 `design/` 与根规则文件,要改文档的点一律列进 `reports/` 反哺点清单,用户在会话中裁决后归文档批落文)、「改动—验收对照表」(2026-10-11 立,2026-10-21 升级:每个需求点与每个行为改动都必须有真实入口断言和判据绑定面;无验收标准的需求点=卡片不成立,/iter 开工门同规拦截)与「落位与可复用性预检」必填节(2026-10-21 立:新增文件/函数/数据件前先核仓库既有实现,能复用不新增,落点唯一、禁散落 helper、跨层交互显式声明)、「实现规范预算」必填节(2026-10-27 迭代 39 实证立规:新增件接口块/成员面先对 gdstyle 默认阈值做预算——公开方法 ≤20、类变量 ≤15、迁移函数对账基线键,超了写卡段拆件,例外走显式申报+用户特批,禁把超预算面带进实现段)与「拆分边界纪律」结构类卡必填条款(2026-10-28 用户裁立:拆分边界沿职责轴不沿阈值轴——拆出单元须有职责语句/单一变化原因/集体身份,凑计数袋禁、阈值只作发现信号、拆不出内聚单元停卡呈报走豁免通道,判据权威=code-conventions §1.1)。任务卡 T0..Tn 的步骤写作遵循 superpowers:writing-plans 方法论(2026-10-19 起按本项目适配内联:卡前文件结构图/范围检查/任务右尺寸/步骤粒度/步骤内容四分/接口声明/禁行句式/自审六查)。复核门含判据出处行锚逐行实读(2026-11-07 起,对照表每行锚所指文档行实读核句子在位且内容匹配——机检 C5 只查存在性)与引擎技术面三查(2026-11-04 起,godot-master 窄口径:NEVER/Gotchas/性能预算+按需领域 reference,权威仍在项目规范)。复核发现按四类去向处置(2026-11-05 立:自判=查规范或查代码有唯一答案,复核者自己改卡;补写=卡里漏写,回炉补全;待裁=多种做法都不违规且代价不同,才交用户;退回上游=文档线或美术线未闭合、或架构与代码规范本身冲突);卡片必带「复核记录」节(缺节=不成立,机检=pipeline_gate),复核先于提交、提交先于合回,顺序没走完禁对用户称完成。
|
||||
---
|
||||
|
||||
# 需求卡片写作规范(g-plan2)
|
||||
|
||||
需求卡片 = 一个需求单位的实施文档(roadmap 迭代行里的「卡①②③」是需求单位,需求卡片是它的展开)。文件落 `reports/需求卡片-<批名>-<日期>.md`。
|
||||
|
||||
## 第〇步·设计闭合检查(2026-10-18 五段流水线立规,先于一切写卡动作)
|
||||
|
||||
写卡是五段流水线(登记 → 文档设计/美术设计 → 写需求卡片 → 迭代编排 → 实现,流程纪律见 `design/engineering/process-conventions.md` §2)的第三段,输入=第二段的设计线闭合凭据。动笔前先定位需求来源对应的待办清单条目(`待办清单.md`;条目格式与状态机权威见 `design/engineering/doc-conventions.md` §12),按条目状态段与改动面逐项核:
|
||||
|
||||
- **设计线条目(状态行含文档线段或美术线段)**:放行判据=设计闭合凭据齐——状态已到「待写卡」或更后(已写卡/已编迭代 N,含修订重写场景);状态尚停在轨闭合态而未标待写卡的(文档设计已闭合(文档路径+版本号)/美术设计已闭合(样张过审+art-bible 条款版本)/两条线并列时两段全带闭合凭据),同样算闭合成立、放行,写完直接把状态推进到「已写卡(卡片路径)」。画面类需求(触碰画面呈现规格:新增画面要素/布局/配色/动效)放行另核一项:设计段预览图已人审在案(ux/ 规格文档内嵌预览节随附像素级判据句;义务出处=process-conventions §2 段二行)——预览图缺或未见人审记录=拒写卡退 doc-design。凭据缺、状态还停在 待文档设计/文档设计中/待美术设计/美术设计中、或两线只闭合了一段 → **拒写卡**,呈报退回设计段(文档线退 doc-design,美术线退 asset-ingest,两线并列时退未闭合的那段),禁硬写。
|
||||
- **需求性工程条目(状态行整行无设计线段、首段直落待写卡,限缺陷修复/重构等改游戏行为的四类)**:核对条目实况里有证据指认;状态落「待执行」的直改类条目(工程债/测试基建/工具维护,不动游戏行为)不属写卡范围(bug 证据带 file:line,或工程债条目)。无证据 → 拒写卡呈报,禁凭口头描述开工。
|
||||
- **直改类条目(禁写卡,2026-10-25 用户裁·改动四类)**:条目属工程改动(tools/、闸件、模拟测量工具、纯测试维护——不动游戏行为)、文档设计改动或美术素材改动 → 拒写需求卡片,呈报改走直改通道:登记 →(如需设计讨论)→ 用户发令直改 → 按改动域跑闸 → 完成删条目。判据=改动会不会被打进游戏、被玩家玩到:会=需求改动(可写卡);不会=直改类。注意:跳过设计线≠当然可写卡——改游戏行为的缺陷修复/重构=需求改动可写卡;配套维护类禁写卡。
|
||||
- **反哺点专条(状态取待裁决/已写入):不属写卡范围,分流呈报(反哺点走 doc-design 的写入通道,见 process-conventions §2 段二)。
|
||||
- 定位不到对应待办清单条目 → 呈报先补登记(登记是流水线第一段,条目格式由流水线闸 `tools/pipeline_gate.py` 强制),禁跳过登记直接写卡。
|
||||
- 条目不是 §12 格式(缺「**改动面**」属性或标题缺登记元数据)→ 呈报待整改批换代,禁自行猜测所属设计线与改动面硬写(现行待办清单尚未整改时,闸对这些条目整体红属预期)。
|
||||
|
||||
**特批通道(设计前置的唯一例外,2026-10-18 按 doc-conventions §12.4 固化)**:只有用户明示「跳过设计前置」才可走,执行一律两段式——①对象已有内容(设计讨论确有记录)→ 直接在待办清单条目状态写 `〔用户特批 YYYY-MM-DD 跳过××〕`;②对象没有任何内容 → 必须回呈实况,经用户再次确认后才写标记。标记与状态词并存写:标记只豁免设计段、不替代状态机推进,跳过后状态照状态机记(例:「〔用户特批 2026-10-18 跳过文档设计〕待写卡」);只写标记不留状态词,流水线闸判「状态行内容为空」红。标记必须带日期,无日期=非法、不构成放行;条目已带合法特批标记的,等同凭据齐放行。禁自援特权:写卡会话自己觉得该跳,只能呈报后停,禁自行写特批标记。
|
||||
|
||||
## 写作前
|
||||
|
||||
1. 先读对应待办清单条目、相关 GDD 权威定义节、roadmap 迭代行——需求卡片的事实源是它们。
|
||||
2. 现状事实必须代码级考证(file:line 实查),禁凭记忆写「现状」。
|
||||
3. **设计前置检查(2026-10-10 用户立规)**:新玩法/新系统/新内容类需求必须有设计定稿前置(GDD/art-bible 待裁点清零)——设计未定稿不写卡,回设计段;缺陷修复/工程债/测试基建/重构类工程需求凭 bug 证据或待办清单在册条目直接写卡,无设计前置要求。(2026-10-18 起本检查由上方「第〇步·设计闭合检查」统一执行:凭据核、证据核与特批通道以第〇步为准。)
|
||||
4. 参考既有范本:`reports/` 下现行在役的需求卡片(批名与日期见 `roadmap.md` 迭代总表「需求卡片」列)。原三份范本(内容数据驱动扩展批/混编遭遇首批投放批/武器锻造系统设计提案批)已按「吸收即死」退役,git 历史可考。(范本成文早于 2026-10-19 任务卡写作纪律——学其事实密度、契约与范围边界的写法;T 卡步骤粒度按新纪律收紧,禁照抄范本的粗步骤。)
|
||||
5. **任务卡方法论上游(2026-10-19 立)**:任务卡 T0..Tn 的写作遵循 superpowers:writing-plans 技能的任务/步骤纪律。该技能的通用纪律已按本项目实际适配内联于下文「任务卡写作纪律」节与「纪律」节自审七查——**内联版即执行依据,写卡不要求另行加载该技能**;若写卡时会话在役加载了 writing-plans,可以它的任务结构/步骤粒度/自审三节为上游参照,两者冲突时以本技能与 AGENTS.md 为准。writing-plans 的文档落位(`docs/superpowers/plans/`)与执行交接节(让用户在两种执行方式里挑)**不适用本项目**——本项目的计划文档就是需求卡片本身,执行走 /iter 发令。
|
||||
|
||||
## 必备结构(缺节不开工)
|
||||
|
||||
1. **目标与完成定义**——这批做什么、什么状态算完。
|
||||
2. **设计事实源(必填,2026-10-18 五段流水线立规)**——本卡设计依据的唯一出处声明,三选一填写:① GDD 文档节+版本号(例:`design/gdd/systems/xxx.md` v1.2 §核心规则);② 样张过审+art-bible 条款版本;③ 跳过设计线的证据指认(需求性工程条目或直改类条目)(bug 证据带 file:line/工程债条目)。所填必须与待办清单条目状态里的闭合凭据(或工程类证据指认)一致——本节是后续迭代编排五查与 /iter 开工核验的比对对象,缺失=卡片不成立。**合格写法两种**(2026-10-18 卡片冲突修订批与机检对齐,禁按小节名字面卡死——库内合规卡多用写法乙):甲=独立小节「## 设计事实源」;乙=头部条目「来源:…(唯一事实源:…)」。机检=`tools/pipeline_gate.py` 判据 C2:全文含「设计事实源」或「唯一事实源」任一即合格,生效=文件名日期 ≥2026-10-18,更早的卡属历史留档不回头改。
|
||||
3. **现状事实**——代码级,开工自行复核;每条带 file:line。
|
||||
4. **设计契约**——违反即返工的红线条款,标 🔴(触碰=L3 停机呈报)。
|
||||
5. **范围边界**——做什么不做什么;明示不收件的去向(待办清单登记/后续批)。
|
||||
6. **关联文档同步面(必填,2026-10-17 改口径:实现批禁写文档)**——三列:文档|关联点(本批实现会改变它的哪条陈述)|同步义务。同步义务分三层标注:**设计权威文档**(GDD/art-bible)与**机械面文档**(roadmap 行/术语表/体验验证清单/README)对代码实现批**一律不直改**——实现批**禁写 `design/` 整个目录与根规则文件**,把该改哪一节、改成什么、依据是什么逐条列进 `reports/iter<N>-反哺点-<日期>.md`,由用户在会话中裁决后归文档批落文(不设文档 skill,文档靠会话讨论落地)。实现批唯一可写目录=`reports/`(2026-10-18 用户裁:根目录会话状态文件已废除,无任何例外)。写卡时就要把「实现会影响哪些文档的哪些说法」查全;查不出也要写「无关联文档」四字,不许省略本节。**机检(2026-10-18 卡片冲突修订批补)**=`tools/pipeline_gate.py` 判据 C1「文档义务口径」:同步面表内目标格指向 `design/`(含 `../gdd/` 等相对写法)或根规则文件、而义务格仍写「随批」者红——旧口径措辞「机械面随批」自 2026-10-17 起作废,写卡禁沿用;生效=文件名日期 ≥2026-10-17。
|
||||
7. **任务卡 T0..Tn**——逐卡估时;**末卡必含「产出物落位卡」**:轻闸全绿后、合并前,把 `reports/` 两份写齐——实现报告(各卡状态+实机目检总清单+遗留读数义务+实现决定记录)、反哺点清单(同步面所列每条都要有落点),方算收口。**禁把任何 `design/` 文件或根规则文件的编辑写进实现批的任务卡**(那是文档批的活)(AGENTS.md 批次工作流 §3.13)。(T 卡内步骤说明的写作纪律见下文「任务卡写作纪律」节,2026-10-19 立。)
|
||||
8. **验证闸(改动—验收对照表,2026-10-11 立,2026-10-21 升级;2026-10-28 判据口径换代)**——每个需求点列明验收测试内容;每个行为改动也要有一行。表列至少七格:需求点|改动(文件:行/行为)|验收测试(名称+落点+尾缀)|层级(单元/接口/集成/探针)|真实入口|判据绑定面|能力行(2026-10-29 起:`既有:<能力名>/新增:<能力名>`;两形态的名称都须在 `game/tests/README.md` 能力表在场,机检=pipeline_gate)。**能力行当场入表(2026-10-29 用户裁,废「滞后一个迭代」)**:写卡时同批维护能力清单(`game/tests/README.md`,四列=能力|系统|真实入口|代表用例)——本批新增能力当场增行(真实入口取自设计文档已定的入口;代表用例=本卡定死的计划测试 `文件:函数` 名);受影响存量行(入口/用例名变更)同批更新;能力退役删行。**实现照单落名**:测试函数名以清单为唯一依据,名实不符=本卡没写清=停卡退回;实现批禁写 README 的红线不变,批末收尾只核对表上名字与实际落地一致(改名则回表)。落点位置二选一:写在对应 T 卡里,或集中列在验证闸节逐条编号、由 T 卡交叉引用。**每个需求点至少一行;每行必须有真实入口和判据绑定面——缺任一项=该需求点未验收,卡片不成立**。**判据出处行锚(2026-11-05 起,对文件名日期不早于该日的卡生效)**:「需求点」格每行必须带判据出处行锚——该行验收判据所依据的现行文档句子,格式 `<文档相对路径>:<行号>`(如 `design/gdd/ux/camp.md:16`);已退役卡片不算现行文档;规格缺席写不出锚=停卡退回需求澄清(test-conventions §8.3,机检=pipeline_gate C5)。画面类需求的锚指向 ux/ 文档内嵌预览节的判据句(预览图=设计段已人审的目标画面效果图,也是实现批基线冻结时用户对照的参照——test-conventions §8.2)。**基线审核关卡特殊标注(2026-11-08 用户立)**:需求点触碰渲染黄金图基线(新增锚面/换代/迁移/容差修订)时,该行验收标准必须显式标注「触发基线审核关卡」——基线逐张呈报用户审核确认后才入库生效,T 卡步骤须含呈报审核点;漏标=复核门退回补写(test-conventions §8.2 审核关卡)。承接 AGENTS.md 硬红线「新功能必配新测试」:那条只兜「有没有」,本表兜「测得对不对、是不是钉在这个改动上」——写卡期不定稿,实现期就自由发挥。
|
||||
- **测试方式两分法**(2026-10-11 用户定):能力验证=调试接口直改游戏数据(改钥石/槽位/解锁状态等,不走正常资源积累流程,沿用现役 DebugOverlay/DS_DEBUG 门控);正常流程体验验证=用户目检,观测项写进 `reports/iter<N>-实现报告-<日期>.md` 的实机目检总清单(2026-10-17 起:`体验验证清单.md` 属设计文档,实现批禁写,入册该体验验证清单的条目作为反哺点由文档批落)。每张卡写明哪些点归调试接口验、哪些点归用户目检验。**用户目检一律「登记不阻塞」(2026-10-12 用户立规)**:登记完成即卡内义务了结,验收时间由用户自行安排,不得作为批末收尾、合并或下一迭代开工的前置条件。
|
||||
- **闸口径(2026-10-17 改按域;2026-10-26 判据改按文件性质)**:轻闸/重闸按 AGENTS.md 分级周期口径——**重闸=`tools/run_all_gates.sh` 按本批改动域选档**(改动含 `game/` 下非 `.md` 的行为载体 → `--code`;只有文档件——`game/` 内 `.md`、`design/`、根规则文件、`tools/` 工具脚本 → `--docs`;两类都有或改闸件本身 → 不带参数全量),所选域全绿才合并。**卡内禁写死闸件名单与"全量档"字样**(域划分的唯一出处在脚本里);批末四闸语义改述为「代码域闸全绿(冒烟+单元+探针+渲染/静态)+改前改后读数对拍」。改完即测铁规照履行:卡内改动落笔即测自己改过的那部分,不请示。
|
||||
- **回归措辞模板(2026-10-14 闸机轮次纪律,AGENTS.md 同源)**:禁用「每步对拍+全量回归」「每轮全量回归」类措辞——会被执行侧解读成每次修复跑全套;改用模板句:「里程碑步(波/T 段)出口跑一次全套闸;波内修复只做出红最小单元的最窄确认;新增测试/工具先行孤立验证再并入全套」。
|
||||
- **判据绑定面口径(2026-10-24/2026-10-28 用户两裁:全项目禁变异类测试、禁撤销类取证——两者都是人为制造红,属伪造证据)**:每个行为改动的验收断言从真实入口进入、判据绑被测改动特有的可观测提交面(信号/事件/入参/状态源取值/绘制记录),在当轮真实跑批中执行并通过;判据绑不上(纯防御分支、release 独有位)=静态判据+评审注记申报观测面局限,证明做不出=停卡呈报,禁自造注入破坏或回退 hunk 取证。卡内不得再出现「撤销证明」「变异证明」列或步骤。配判据时按强弱分层配齐:**运行期断言**(可见性/树序/状态源取值)抓状态类缺陷,**golden 逐像素**抓内容观感类缺陷,**占比/统计类**判据只兜「整框空白/整框糊」,是补充不是主力(细则=test-conventions §8.4)。
|
||||
- **测试削弱申报(2026-10-21 立)**:卡内列出允许改/删的旧断言及理由;实现期未申报的删除断言、放宽阈值、缩小扫描面、换下层直调,由独立验收审计判红。
|
||||
- **独立验收审计(2026-10-21 立)**:卡内写明审计入口与报告文件(`reports/iter<N>-验收审计-<日期>.md`);审计由没参与实现的会话或子代理执行,未过不得合并(细则=test-conventions §8.7+iter 技能第 5 步)。
|
||||
9. **异常分级**——L1 自救/L2 记录继续/L3 停机写报告等用户;新增件/重构类卡的 L3 必含「机检预算互斥=上游缺陷停卡退回写卡段」条(2026-10-27 立,与第 13/14 节条款合流)。
|
||||
10. **代拍板白名单**——允许 agent 自行拍板的微决策清单(逐条列,超清单记入实现报告「实现决定记录」节)。
|
||||
11. **待裁点**——全备选案并列(推荐案+淘汰依据),设计权归用户;零待裁点也要写明「零待裁点,开工门=U0」。
|
||||
12. **落位与可复用性预检(必填,2026-10-21 用户立规)**——定义 T 卡前,对本批每一个**新增文件、新增函数/方法、新增数据件**逐条过三问,答案写成卡内独立小节(节名「落位与可复用性预检」,与第 7 节的文件结构图互指):
|
||||
- **复用面**:仓库里是否已有做同样事的东西?先 grep 现成实现(同职责的视图/工厂件/服务/工具脚本/测试套件与夹具),能复用就复用、能扩展就扩展;确需新增必须写明「为什么不能复用既有那一个」——写不出理由=不该新增。
|
||||
- **唯一面**:同一份数据、同一段逻辑、同一个常量是否只落在一处?落点唯一——一个职责一个文件,禁多处定义同名事实,禁为省事把 helper 散落到「就近的文件」里;新增前先 grep 同名与同义标识符,确认盘上没有第二处。
|
||||
- **分层与交互面**:新增件之间、以及与既有系统的交互路径显式声明——谁调谁、经哪个出口、跨层时走哪条契约(Core 零 UI、玩法数值只经 ConfigDB 单点、随机只经 RngService 等既有红线不因新增而绕)。分层按职责切,不为「放得下」把跨层逻辑塞进同一文件。
|
||||
- 缺本节=卡片不成立;本节与文件结构图一并作为 grilling 复核门的审点(见「纪律」节自审七查⑥)。机检只在结构层查不到语义,复用判断由写卡人与复核门负责。
|
||||
13. **禁为机检文本保留无效成员(重构类卡必填条款,2026-10-25 立,与 code-conventions §1.1 同款)**——重构类需求卡片必须写明:禁止为迎合机检消息文本(含计数)而保留或新增无效成员/别名;机检键与卡片契约互斥时,实现段一律停卡呈报,不得自造第三条路。
|
||||
14. **实现规范预算(必填,2026-10-27 迭代 39 实证立规)**——定义接口块/文件结构图前,对本批每一个**新增文件**对照 gdstyle 默认阈值做预算,写成卡内独立小节(节名「实现规范预算」,与接口块及文件结构图互指)。现行默认口径(gdstyle v0.4.0 实测:公开方法 ≤20、类变量 ≤15、单函数分支 ≤8、返回 ≤6;阈值取工具默认、改阈值=基线口径变须随批重生成):
|
||||
- **新件三查**:①接口块公开方法数 ≤20——超出=拆件或砍面(砍面=退设计段裁职责);②成员变量数 ≤15——超出=收编进内聚结构或拆件;③迁移函数对账——自存量文件迁入的函数,先查 `tools/gdstyle_baseline.txt` 源函数键,branches/returns/函数长有超默认登记值的,迁移即拆函数(拆分不改语义,不算迎合机检——与第 13 节区分:那条禁保留无效成员凑数,本条要求真拆)。
|
||||
- **存量触面一查**:本卡触碰的存量文件,T0 读数步骤写明「S13 键较登记值只降不升」的预期与达成手段。
|
||||
- **指标例外通道**:确需超默认的(架构先例如组合根超限),卡片设「指标例外申报」节——键名+理由+用户特批落基线;未申报的超预算面进实现段=停卡退回写卡段(写进本卡异常分级 L3)。
|
||||
- 缺本节=卡片不成立;预算节数字与接口块实数的一致性是 grilling 复核门审点(自审七查⑦)。
|
||||
- 生效=文件名日期 ≥2026-10-27;此前卡片属历史留档不回头改。
|
||||
15. **拆分边界纪律(结构类卡必填条款,2026-10-28 用户裁立,判据权威=code-conventions §1.1 拆分判据)**——拆分/收敛/重构类需求卡片必须在设计契约区写明红线条款(卡内写条款,判据定义以 code-conventions 为权威、不复制定文):①每个拆出单元(私有函数族/新件/段件/状态件/参数束)须有可陈述的职责语句与单一变化原因(实现报告逐件一行承载);②拆出单元须有集体身份——命不出名字、只能说「剩下的成员」的打包=凑计数袋,禁;③「过阈值」只许作为发现信号,作为拆分或收拢的动机即违规;④按纪律拆不出内聚单元 → 停卡呈报走豁免/还债通道,禁硬拆凑绿(写进本卡异常分级 L3)。先例=迭代 41 两卡 v1.2(核心数据面契约 7/呈现层契约 9)。生效=文件名日期 ≥2026-10-28;此前卡片属历史留档不回头改。
|
||||
16. **验收档申报(必填,2026-11-05 生效)**——卡片头部信息区(与设计事实源声明同区)申报一个验收档:高/中/低。判据=失败代价单维:这条改动做错了,后果随存档或结算传播的(存档写读与迁移、RNG 流、战斗结算公式与乘区、经济入账、数值表结构校验)=高;后果玩家可见但不损持久状态的(常规玩法逻辑、门控、交互逻辑、呈现数据面)=中;后果即看即知且无状态残留的(文案、纯呈现样式、布局微调)=低;一张卡触多档按最高档申报。用户批卡(U0)时确认或改判;档位只调节独立验收审计深度(梯度表=test-conventions §8.7),闸机与 CI 的档位、域划分、全量强制档一概不变。机检=`tools/pipeline_gate.py` 判据 C4:文件名日期 ≥2026-11-05 的卡必含「验收档:高/中/低」申报行;未申报档位的卡(旧卡)按高档全量审计。
|
||||
17. **复核记录(必填,2026-11-05 用户立规)**——本卡经过的对抗复核逐轮登记,五格:轮次|复核者身份(写明未参与本卡撰写,形态=只读子代理或独立会话)|发现(一句话)|去向(四类之一,定义见「纪律」节复核发现四类分流)|处置结果(改了卡内哪一节、退给了哪一段、或用户裁决的结论)。缺本节、或任一条发现没有去向标记=卡片不成立。复核凭据=本节自身,不另设复核报告文件(2026-11-06 用户裁:复核内容回写本节即全部凭据)。机检=`tools/pipeline_gate.py` 卡片复核判据(生效=文件名日期 ≥2026-11-06;此前成文的卡属历史留档不回头改)。复核分类得对不对属语义判断,机检只查结构在位,语义归复核者与本节申报人。
|
||||
|
||||
## 任务卡写作纪律(2026-10-19 立;任务/步骤规范借自 superpowers:writing-plans,按 g-plan2 实际适配)
|
||||
|
||||
读者画像先立住:T 卡的执行者(/iter 施工方)是没见过这份规格、也没见过邻卡的工程师——他按本项目语言写惯代码,只要给足确切接口、确切测试、确切取值,他就能写对;他不可能知道的是**写卡人定了什么**:动哪些文件、哪些名字与签名、规格里的哪个值、哪条测试证明这张卡成立。把这些写全,其余不代劳。生效=2026-10-19,此前卡片属历史留档不回头改。
|
||||
|
||||
### 卡前·文件结构图
|
||||
|
||||
定义 T 卡前,先把本批新建/修改的文件列全——每个文件一行:路径+职责。边界清晰、一文件一职责;一起改的文件放在一起,按职责切分不按技术层切分;既有代码库跟随既有模式——库内大文件不擅自拆,但本批要改的文件已臃肿到不可单手握住时,把拆分写进本批计划也合理。结构图定分解,T 卡从它生,禁跳图直接列卡。**每个文件行同时标「行为改动/非行为改动」;行为改动行写对应验收对照表行号,定结构图时就确认每个行为改动有验收落点。**结构图与「落位与可复用性预检」节互指:**每个新增件(文件、函数、数据件)在结构图里标「复用既有」或「新增」,标新增的必须能在预检节指到它的「为什么不能复用」理由与落点唯一性核查——两处对不上就是卡片不成立。**
|
||||
|
||||
### 范围检查
|
||||
|
||||
一批规格覆盖多个相互独立的子系统、设计段又没拆开的,建议拆批(roadmap 迭代行内的卡①②③即此机制)——每批各自产出可独立验收的交付物,禁一张大卡混装多个子系统。
|
||||
|
||||
### 任务右尺寸
|
||||
|
||||
一张 T 卡 = 自带一轮测试周期、值得一道独立审查门的最小单位。画界规则:环境搭建、配置、脚手架、文档类步骤折进需要它的交付物那张卡,不单独立卡;只在「审查者可能否决这张而放行隔壁那张」处才切;每张卡以**独立可测的交付物**收尾。本项目铁律「验收测试随对应 T 卡同轮落地」(/iter 纪律)由此获得尺寸依据——卡大到一轮测不完,就是切小了。
|
||||
|
||||
### 步骤粒度
|
||||
|
||||
一步 = 一个动作 + 一个可核查结果;用 `- [ ]` 复选框记步(/iter 逐轮推进对账用)。反例:「实装微光并补断言」是两步(装了两个动作);「改 shader 看效果」不是步(没有可核查结果)。一步禁装第二个动作,禁无可核查结果的描述。
|
||||
|
||||
### 步骤内容四分
|
||||
|
||||
每类步骤只带让它无歧义必需的信息,不多带:
|
||||
|
||||
- **验收步骤**:断言名+断言内容(规格的确切值写进断言,禁「按规格取值」类指代)+测试落点(哪套冒烟段/单元套/探针/闸段)+真实入口(测试从哪个真实入口驱动)+判据绑定面(绑被测改动特有的可观测提交面)。
|
||||
- **实装步骤**:确切签名(名字/参数/返回类型)+文件落点(file:line)+规格钉住的取值;**实现体不写**——签名与验收已定的不写;只有签名和测试都定不了的算法才给代码块,且只给那段算法。
|
||||
- **验证步骤**:跑哪道闸(确切命令)+什么输出算过(期望输出或判据)。
|
||||
- **引用步骤**:引用别卡的接口块,不重复别卡的代码。
|
||||
|
||||
### T 卡间接口声明
|
||||
|
||||
每张 T 卡声明两块——**取用**(本卡从早前卡用什么,带确切签名)与**产出**(后续卡依赖本卡的什么,带确切名字与类型)。/iter 按卡逐轮施工,施工方只见本卡——接口块是邻卡名字与类型的唯一来处;后卡引用的名字必须与早卡定义逐字一致(自审第三查兜这一条)。
|
||||
|
||||
### 禁行句式(不决定任何事的行)
|
||||
|
||||
「TBD」「酌情处理」「适当优化」「如上所述的测试」「后续批再说」、任何本批任务未定义的类型或函数名——这些行不决定任何事,留在卡里只能让实施期自由发挥。计划 = 实施者无法独自做出的决策集合;计划比它描述的规格还长 = 在抄写程序,不是计划。
|
||||
|
||||
## 纪律
|
||||
|
||||
- 平实中文,禁自造缩写与名词堆叠;仓库既有术语照用。
|
||||
- 估时给区间+切分预案(超软盒预挂)。
|
||||
- **任务卡自审七查(2026-10-19 立五查,2026-10-21 补第六查,2026-10-27 补第七查;借自 superpowers:writing-plans 自审节适配)**:任务卡写完、交 grilling 复核前必跑——①规格覆盖:逐条过「目标与完成定义」的规格项/需求点,每条都能指到一张 T 卡,并指到验收对照表的一行,指不到的补卡/补行;②步骤扫描:每步只能让实施者写出一个合情合理的东西、且一步不多带——不决定事的行是缺口,签名与验收已定的函数体是抄写,两样都就地改;③类型一致性:后卡引用的签名/属性名与早卡定义逐字一致;④审查焦点+改动覆盖:规格暗示、但没有任何 T 卡测试覆盖的失败模式——对照「验证闸」节逐条过,把最可能坑到玩家的列出来、挂到责任 T 卡补验收条目;同时核文件结构图里的每个行为改动都能指到对照表行,指不到的补测试或标非行为改动;查完确实没有才写「无」;⑤篇幅比例:卡片比它实现的规格长几倍=在抄程序,代码块占大半就把函数体换成签名+断言名,再验每步仍无歧义;⑥落位与复用(2026-10-21 用户立规):逐条过本批每个新增文件、新增函数、新增数据件——**盘上是否已有做同样事的东西(grep 同职责实现、grep 同名与同义标识符)?该功能是否已有唯一落点?同一事实是否只在一处定义、有无 helper 散落「就近的文件」?新增件之间的调用路径与跨层出口是否显式声明?**答案写进卡内「落位与可复用性预检」节并与文件结构图对得上(标「新增」的必须能指到不能复用的理由);对不上就改成复用既有件、或把重复的落点并进唯一一处;⑦指标预算(2026-10-27 迭代 39 实证立规):逐条过本批每个新增文件——「实现规范预算」节三查一查的数字与接口块/文件结构图实数一致(数接口块 func 行、数成员 var 行、迁移函数逐个对 `tools/gdstyle_baseline.txt` 源键),少报、漏对账或预算节缺失的回炉补节,存量触面写明「S13 键只降不升」预期。七查发现问题就地改完再交复核,不用再自审一轮;自审在 grilling 之前跑,不替代 grilling 对抗复核。
|
||||
- **grilling 复核门(2026-10-10 用户立规;2026-11-05 补处置登记义务)**:卡片成文后必经 grilling 多轮复核,裁决全落、零待裁点,卡片才算成立;每轮发现与处置逐条写进卡内「复核记录」节(必备结构第 17 节)。**复核审点含验收清单:逐需求点过「测什么/怎么测/谁验」三问,答不上来的需求点回炉(2026-10-11 用户立规);并核对照表两端是否对得上、真实入口是否绕过改动点、判据绑定面是否绑被测改动特有的可观测提交面(2026-10-21 立);再核「落位与可复用性预检」节与文件结构图是否对得上——每个标「新增」的件都要有不能复用的理由与唯一落点,给不出的回炉改成复用(2026-10-21 用户立规);再核「实现规范预算」节数字与接口块/文件结构图实数一致——少报方法数、漏迁移函数对账、预算节缺失的回炉(2026-10-27 用户立规);再核「拆分边界纪律」条款在位、每个拆出单元有职责语句与集体身份——凑计数袋形态回炉(2026-10-28 用户立规);再核「验证闸」对照表每行**判据出处行锚逐行实读**(2026-11-07 用户立)——打开锚所指文档行,核句子在位且内容与该行判据匹配;机检 C5 只查存在性、查不出内容错位,写卡后文档被其他批改动会使锚漂移(2026-11-07 退役卡 ux 四锚漂移实证);锚失位=发现清单一条,按四类分流处置;再核引擎技术面三查(接口与边界见下条):①卡内签名与实装步骤涉及的 Godot API 在 4.7 存在且行为如卡所述;②实装步骤不踩 godot-master NEVER list 与 Gotchas;③热路径/批量/线程形态匹配其性能预算——产出发现清单,逐条按「复核发现四类分流」处置(2026-11-04 用户立规;2026-11-05 补去向口径:只有待裁类归用户裁决,自判与补写两类由复核者自己落卡,退回上游类退对应段)。**
|
||||
- **引擎技术面复核接口(2026-11-04 立,godot-master 窄口径接入)**:本条是 req-card 对 godot-master 技能的唯一引用面,四条收窄——①取用白名单:只取其 SKILL.md 内三块——Part 4 NEVER list(33 条)、Part 8 Gotchas(8 条)、Part 5 性能预算表;卡涉及具体领域(物理/动画/UI/存档/寻路等)时另按其 Part 2 决策矩阵加载与改动面直接相关的 reference,至多 2 个;禁加载工作流链、genre 蓝图与其余整库。②权威边界:只取引擎事实(API 行为、已知坑、预算数字),不取其工程组织主张(目录结构、autoload/signal bus 模式)——架构/分层/数值判断权威仍是本项目 architecture.md、code-conventions 与 data/tables;两者冲突时项目规范赢,冲突本身当轮作为待裁点呈报用户,禁按任一方默默改卡。③输出形态:复核产出=发现清单(卡内位置+违反条目号如 NEVER-7/Gotcha-1+一句依据)+四类去向之一,其中待裁与退回上游两类不改写方案,自判与补写两类的处置就是把卡改对;引用条目须给编号,判不了标「未判」禁硬判。④成本约束:成本地板=hub SKILL.md 单文件;卡内 T 步不含节点/信号/Tween/Resource/物理/线程/渲染面时只跑②清单对照,不加载领域 reference;每个领域 reference 一轮复核只加载一次。
|
||||
- **复核发现四类分流(2026-11-05 用户立规)**:复核者每拿到一条发现,先问「答案从哪来」,四选一登记去向(写进卡内「复核记录」节的去向格);前两类的处置由复核者自己完成,禁转成问句向用户求裁:
|
||||
- **自判**——查权威文档或查代码现状就能得到唯一答案。权威文档=本卡设计事实源那一份 owner 文档+`design/engineering/` 五份规约与 architecture+术语表+在册先例(git 提交信息与库内已入库实现)。处置=复核者当场下结论并把卡改成那个答案,处置格写结论+`文件:行号` 依据。**禁问用户**:这类问题问出去等于把可查的事推给人决策。
|
||||
- **补写**——权威文档不反对,但卡里漏写:具体名字与参数、测试落点、判据绑定面、规格钉住的取值、实现规范预算数字。处置=回炉补进对应节(判据形态照「任务卡写作纪律」的实装步骤与「禁行句式」两条——卡里不许留没定义的名字)。**禁问用户**:漏写不是分叉,问了等于让用户替写卡段补卡。
|
||||
- **待裁**——几种做法都不违反权威文档、代价不同、影响玩法或体验取向。这才是待裁点:全部备选案并列+各自代价+推荐案与淘汰依据交用户裁决(口径同 process-conventions §3 第 2 条与 doc-design 的禁代裁条)。**必须问用户**。
|
||||
- **退回上游**——写卡段动不了的未闭合或规范冲突,三个退口:①文档设计线未闭合(缺设计定稿,或 owner 文档仍留未裁的设计点)退 doc-design;②美术设计线未闭合(样张未过审或 art-bible 条款缺)退 asset-ingest,两线并列时退未闭合那段(判据沿用第〇步的拒写卡分流,不另立标准);③架构或代码规范本身有问题(architecture 与 code-conventions/test-conventions 互相冲突、缺项、或与卡片要求打架)退 `design/engineering/` 规约修订通道(归口 doc-design),随呈报写清哪两条冲突、两种改法各自的代价。处置=停笔呈报,禁在卡内绕开规范自造第三条路(形态同第 13 节「机检键与卡片契约互斥时一律停卡呈报」)。边界:owner 文档给了取值域没给具体值=属退口①,既不由复核者自钉,也不当实现问题问用户。
|
||||
- **两条配套细则(2026-11-05 拿两份双审报告 56 条发现回放后补)**:①一条发现只记一个主去向,连带动作走既有通道不另立第五类——要改文档面句子的列进「关联文档同步面」当反哺点,本卡范围外要日后做的登记待办清单一条;②「判定不改」也是自判,处置格写「不改+依据」(依据可以是既有裁决记录属历史留档、命中面不涉本批、或既有规范本就如此),观察类发现照样要在记录里占一行。
|
||||
- **写卡段的完成判据与呈报口径(2026-11-05 用户立规)**:卡片成文不是终点。固定顺序=自审七查 → 派未参与撰写的只读复核者做对抗复核(子代理或独立会话,至少一轮)→ 发现逐条四类分流处置 → 待裁类全部呈完且用户裁决通过 → 处置逐条写进「复核记录」节 → 待办清单状态推进「已写卡」→ 提交 → 合回(收口六步细则见 process-conventions §1 第 2 条,本文不重列)。**这条顺序没走完,禁对用户说「完成」「做完了」「卡片已写好」这类收工表述**——此时只能报「卡片成文、复核未跑完」并点明缺哪一步。理由:commit 点零钩子检查、全量验证在合回后的远端 CI,卡片是否真被复核过机器看不出来,只由「复核记录」节+流水线闸该节判据+本条呈报口径三处兜住。
|
||||
- **卡片落盘时点(2026-11-04 用户裁立;2026-11-05 补凭据形态;2026-11-06 用户裁凭据换代)**:收口序列(冻结→件核→并 master→删区,车道铁律 §1)只对**完成态事项**执行;写卡段的完成判据=grilling 复核裁决全落+用户裁决通过(卡片成立)。复核凭据=卡内「复核记录」节(不另设报告文件),缺节按未完成态处置,禁落 commit。成文未复核的卡片**禁**套用收口序列——卡片成文、grilling 多轮改稿与待办清单状态推进一律只存在于 worktree,master 不落未成立卡;成立后同 worktree 一次合回(合回即删区照车道铁律)。已合回卡片若复核产生修订,修订版在新 worktree 落笔再走成立裁决与合回,禁在 master 直改卡片。**复核先于提交(2026-11-05 用户裁)**:grilling 复核跑完、缺陷清单裁完之前禁把卡片落 commit——先复核、后提交、再合回;细则同 `design/engineering/process-conventions.md` §1 第 2 条「卡片复核前置判据」。
|
||||
- **待办清单状态回写义务(2026-10-10 用户立规;2026-10-18 按五段流水线换代;2026-11-06 复核凭据换代)**:卡片写完必把第〇步定位到的待办清单条目状态推进为「已写卡(`reports/` 下需求卡片路径)」(判据=doc-conventions §12.1「已写卡」证据项)——条目在登记段已存在,禁另立重复条目,防遗忘义务由状态承载;原「待编入/已编入/已开工/已入库」旧状态词停用,编入迭代后由编排段(iter-plan)记「已编迭代 N」;实现批完成入库后按待办清单退役规则整条删除。
|
||||
- 需求卡片是中间文档:批入库后按「吸收即死」退役,结论迁现行事实源(GDD/待办清单/roadmap)。
|
||||
- 开工令与执行归 /iter 技能(需求卡片统一经迭代编排执行,2026-10-25 用户裁:无迭代外执行通道);需求卡片写完呈用户裁决后才可开工。
|
||||
Reference in new issue
Block a user