Why: the make-variable pass-through re-quoted CMD and broke any command containing quotes (caught by the redaction self-test before it could run). Evidence: redaction self-test now records 'token <redacted> hello' with quoting intact (row sha256 aae6a895); negative 'false' case earlier recorded exit=1 row and propagated rc — both in the task card evidence table. Impact: CMD now travels via environment (CMD="..." make evidence); SRC/TAIL stay make variables; usage strings updated in Makefile/AGENTS.md/task.sh template comment. Refs: task card evidence table; guidelines draft.10 tool-written-evidence rule.
7.4 KiB
7.4 KiB
Agent 工作说明(Agent-System-Dev)
本仓开发遵循 Development-Guidelines(见 deps/development-guidelines,gitlink 固定版本):
核心规则与术语见其 core/,按任务触发阅读 standards/ 专题;日常交付走 workflows/delivery.md。
UI 设计门禁(强制)
- 本仓一切界面生成/修改先读根目录
DESIGN.md(四原则:美观、现代、简洁、易用), 再动手;违反视为设计系统缺陷,不是风格偏好。 - 颜色/圆角/字号只消费
@ui/tokens.css令牌(字号走--fs-ui-*标尺);动效只用@ui/motion.css的mk-*工具类;折叠一律用@uiCollapsible 原语,禁止<details>。 - 守护测试(UI 仓与 Frontend 仓各一份
design-guard.test.ts)以棘轮拦截新增裸色值、 私有@keyframes与行内字号;改风格 =DESIGN.md+ 令牌文件同 PR 成对修改。 - 异步状态只有一个所有者。事件按 seq 处理,过期事件丢弃。
任务启动门禁(强制)
- 任务启动或恢复后,第一次写操作前运行
make precheck并附完整输出;verdict 为SHARED_WORKSPACE_BUSY / SYNC_REQUIRED时不得编辑。 - 按其必读清单完成阅读,然后
make task-start NAME=feature/<slug>建立独立 worktree + feature 分支(自动记录 R0 与任务卡);任务中途不重复运行 precheck。 - 分支层级:任务分支一律从权威
origin/main切(task-start已强制);同批互不依赖的 子任务用同一 R0 的兄弟分支。确有顺序依赖需从父 feature 分支切子分支时(collaboration.md 允许的堆叠例外):任务卡显式记录父任务与父 PR;子分支命名<type>/<父slug>-<子题>, 不嵌 SHA;合入顺序固定父→子;父合入后子分支须make task-sync并入最新 main 并把 PR base 改回 main,方可声明可合入(分支保护要求 head 含 origin/main,未同步必被拦)。 - 验收、请求审核、合入前各运行一次
make task-sync;完成声明附 precheck、task-sync、 测试三段输出。 - 合入后在 worktree 内运行
make task-finish回收 worktree 与分支(脚本会把 当前目录当 worktree 回收——在主检出运行会误删主检出,已加防护);放弃未合入 工作用make task-finish ABANDON="--abandon <原因>"并记录原因。 - 任务卡闭合(防欠账):分支合入 main 后,其任务卡须回填"已完成"+主记录 PR 链接并
归档至
.task/archive/。自动路径:make task-finish收尾触发、主检出 pull 触发 post-merge 钩子(实测 ff-only pull 也触发);钩子内 close 只扫主检出本地.task/,远端刚合入的卡片 要等 pull 完成才能被看到,扫不到时由手动make task-close兜底。手动闭合在主检出运行→建feature/card-close-*分支+PR,任务分支内加FOLD=--fold随当前 PR 合入。 precheck 的[cards]行报告欠账,验收前应清零;闭合 PR 由所有者合入。
证据与验证门禁(强制)
原则:「声明已就位」≠「能力已就位」。任何来源(用户输入、方案、报告、他人或自己的
叙述)的结果声明都不是证据;证据 = 命令 × 被测对象 SHA × 可复核输出,三者齐备才算事实。
规范依据:guidelines standards/verification.md「声明与证据来源」(draft.10)。
- 来源三分:产出物(任务卡、PR、报告、review 结论)中的通过类断言须标注来源——
GATE(CI/分支保护/precheck 实测)/REPLAY(审阅者独立重跑)/SELF(作者粘贴)。 合入与验收判定只认 GATE/REPLAY;SELF 仅为线索,与重验不一致时以重验为准。 - 证据由工具写入:命令输出进入任务卡/PR 一律经
CMD="<命令>" make evidence写入 (自动记录命令、被测 HEAD、退出码、输出 sha256 与尾部摘录并脱敏 token)。手抄、转写、 凭记忆重构的输出视为无效证据;补写输出与伪造测试同级红线。 - 完成声明三段输出(precheck / task-sync / 测试)必须由 evidence 工具写入任务卡,
PR 描述引用任务卡段落,不另手抄。测试通过的权威源是 CI(
.gitea/workflows/ci.yaml, 在 PR HEAD 上make test+make build),本地输出降级为辅助线索。 - 验收即重放:请求审核后,审阅者先在评审环境重放最小重放集(关键门禁命令 + 变更 直接相关检查)再读作者证据;重放与声明不一致直接阻塞,并作为失实事件登记。
- 外部事实零信任:用户/文档/旧报告里的「可用/已就位」必须先执行
policy/facts.md登记表中对应验证命令(或当场实测)才能写进产出物;无法当场复核的结论标[未经证实], 禁止裸写。登记表每条事实带last_verified与 TTL,precheck[facts]报告过期项,make facts-verify逐条重验。 - 诚实出口:未执行/未验证是合法状态,如实标注(NOT_RUN/未验证)优于补写。
提交与 PR
- 主题行:英文祈使句一行(≤100 列,不以句点结尾);body 写
Why: / Evidence: / Impact: / Refs:四段;任务卡与 PR 描述为同一份文档。 - 跨仓 gitlink 变更须经组合验证(
make test)后在 Dev 仓推进;受保护分支经 PR 合入。 - 高后果操作双钥匙:改写历史、解除/变更分支保护、删除归档引用、发布版本——Agent 只准备 方案与命令,由用户确认并亲手执行;Agent 不得自行实施(baseline 硬边界 1 的授权范围要求)。
- 模块边界、公开契约与隔离档位见
policy/modules/(如有)与 PROJECT.md。 - 验证命令见 PROJECT.md「验证」节;完成声明的三段输出按「证据与验证门禁」节由
make evidence写入任务卡,不手抄。 - 首次克隆本仓后运行
make setup启用本地 pre-commit 钩子。
Gitea 与 Git 访问事实(2026-09-30 实测;登记表 policy/facts.md)
机器可核的登记表在 policy/facts.md(每条带验证命令、last_verified 与 TTL);
引用任一事实前先跑其验证命令。以下为叙述版:
历史任务卡与旧脚本里的 git-panel.u1680832.nyat.app:30319 已失效(TLS 握手失败),
见到一律按过期处理,不要再试。当前权威通道:
- Web / API(HTTPS):
https://git-home.u1680832.nyat.app:30319(Gitea 1.27.3, API 前缀/api/v1;偶发 broken pipe / 超时,重试即可)。 - Git over SSH:
ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/<Repo>.git(.gitmodules 与各仓 origin 均为此格式)。 - API token:
~/.secrets/gitea,两行键值URL_PREFIX=…与ACCESS_TOKEN=<40 位 hex>;取值grep ACCESS_TOKEN ~/.secrets/gitea | cut -d= -f2-, 用作Authorization: token <值>请求头。token 值不入仓、不回显、不写进产出物 (baseline 硬边界 2:只记录来源、字段与可用状态)。 - SSH key:
~/.ssh/home_gitea(ED25519,公钥指纹SHA256:GYXaOXIMeloQ1fKSfdJ/ndgPQzs/Ix7Hk62ekfkfQ20,Gitea 侧密钥名 GMKtec);~/.ssh/config已有git-ssh.u1680832.nyat.app主机条目,克隆/推送直接可用。 - 任务卡闭合 PR(
make task-close/task-finish自动闭合)经 API 建 PR 时以GITEA_TOKEN环境变量传入同上的 token。