Community编程与开发github.com

zheref/ren

默认在独立的工作树中运行每个请求,在继续执行时重新检查隔离性。预热、编写、验证并在本地提交,处理启动、生成报告并响铃,然后等待。使用 `$ren <request>` 或通过回合循环在仓库中执行普通工作。Ren 组合了六项技能;它从不推送或打开 PR,仅在维护者调用 `$aka` 或 `$tensho` 时结束。

ren 是什么?

Ren 是一个组合式 AI 代理技能,旨在一次处理一个请求,并将每次调用视为一个独立的回合。它在执行前创建一个隔离的工作树,确保每个任务都有一个安全的环境。该技能由六个子技能组成:breath(预热)、rasengan(编写)、kokusen(验证和提交)、amaterasu(启动)、spiritual-message(报告)和 jutaisho(响铃)。 Ren 支持 fast、standard 和 thorough 三种配置文件,以控制执行的严格程度和速度。它专为本地开发工作流设计,不涉及推送、打开 PR 或远程操作,直到维护者明确要求发布。每次执行都会生成一份详细报告,总结成就、挑战、架构决策和启动命令。 Ren 的核心价值在于其严格的隔离性和可审计性:每个请求在其自己的分支和上下文中处理,从而避免与其他工作发生交叉污染。它适用于通过 `$ren` 命令显式调用的场景,或者作为遵循相同回合循环的仓库中的默认工作模式。该技能完全兼容 Codex 和 Claude Agents 平台,并依赖于 `nen` 工具进行语法解析和会话管理。

兼容平台✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/zheref/hatsu/tree/HEAD/surfaces/codex/ren

Installed? Explore more 编程与开发 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

共享策略位置: docs/DISCOVERY.md、docs/WORKFLOW.md、 docs/LAUNCH-MIGRATION.md、docs/STANDALONE-ENTRY.md、docs/PROCESS.md、docs/using/README.md 和 docs/using/mirrors.md 属于已解析的 Hatsu 插件根目录,而不是消费仓库。在已安装的表面上,使用 ten 打印的绝对根目录读取这些文件(如果不可用,则通过该技能重新解析)。下面的相对链接标识了源位置;缺失的消费者 docs/ 副本不是缺失的策略,不得触发重复的归档。切勿在目标仓库中复制或创建第二个策略。

Ren — 一个请求,一个回合,每次如此

没有固定模式。 Ren 是一个组合运行:模式取决于 请求 本身—— Enhancer 用于产品代码,Conjurer 用于规范,Transmuter 用于机制——在回合期间保持,并在回复中命名,Manipulator 在其运行报告的步骤中与其并列命名。命名当前使用的模式,说明何时切换以及原因,并且永远不要在一个标题下混合两种模式(claude/agents/kurapika.md)。

接受请求。如果这是第一个,则预热;编写它、验证并提交它;处理启动;向我展示报告;响铃一次。然后等待。

Ren 是本地平面中 普通工作的形态。它不是批量运行器,也不是监视器:一次调用就是一个请求,一个请求就是一个回合。 循环是下一个请求开始下一个回合,预热步骤已被消耗。

此文件是组合文件。它不重新指定。 下面的每个步骤都是另一个技能的步骤,已命名和链接,其过程、退出代码反应、拒绝和残留都在那里。如果您在此处找到一条实际上是该技能的规则,那么它放错了文件——去它编写的地方阅读它,因为在两个地方重新陈述的规则会在其中一个中偏离。


1. 调用

P1 — 此次运行以 $ten ren 开始(ten § 6 以自己的名称处理此阶段缺失的先决条件;此运行调用的阶段跳过其自身的先决条件)。

$ren <request> [--profile fast|standard|thorough]
nen parse ren --grammar "<request> [--profile <profile:fast|standard|thorough>]" \
  --line "<the request, minus the $ren prefix>"

profile: (clause absent) 意味着 profile.default(§ 2a);请求中的 "fast turn" 或 "thorough turn" 被视为相同的覆盖。

在 v0.3.0(docs/ab/ren.md § 2.1)实际验证:一个请求行解析为 request: <the whole line> 并返回退出码 0,空行以退出码 2 拒绝——" 是必需的,但该行未提供"——并打印更正后的行。永远不会从会话上次正在做的事情推断出没有请求的回合——它会作为自由文本被询问:请求是维护者的话语(行 missing-maintainer-choice,通过 nen stop answer 记录,docs/WORKFLOW.md § 4 维护者的话语永远不是推导出来的),因此会话建议的任何读取都作为参考列出,没有星号,也没有选择器选项,并且回合会在维护者输入的内容上运行。

Ren 也是默认形态,而不仅仅是显式调用。 在 nen/workflow.json 描述了此循环的仓库中,来自维护者的普通请求就是一个 ren 回合;在第一个上这样说,这样没人会对报告和末尾的响铃感到惊讶。

2. 回合,按顺序

#步骤拥有它的技能为什么在这里
1预热$breath在 Ten 追赶或突变之前,在每次进入时绑定/重新验证隔离,依据 WORKFLOW § 工作树所在位置;在该检出中每个新的努力预热并证明一个新鲜的分支一次——在观察到的钩子拒绝(HR-374)时,会话自己的 harness 工作树。显式延续仅重用已验证的努力拥有的工作树。红色的基是作者之前的 G5;其构成本身检查中的冲突子句也是如此(breath § 4a),在此步骤的分类账条目上记录
2编写更改$rasengan编写维护者要求的内容,在此仓库声明的堆栈上:编辑、旁边的测试、其约定所欠的文档和变更日志——声明的 iteration.checks 在作者面前工作时作为作者自己的反馈运行
3验证并提交$kokusen每一个廉价的 iteration.checks 动词和声明的聚焦测试在 完成的 树上运行,红色拒绝;然后分类,询问标记的内容,一个形状化的提交——仅本地
4启动$amaterasu一个隔离的努力报告 dry-run 命令并记录 core launch deferred; explicit maintainer call required,然后不询问继续,即使是串行。无目标 → no launch target declared; skipped。核心启动永远不会将编写或交付移出其绑定的工作树
5报告$spiritual-message as turn页面:已完成、挑战、未交付、架构、截图、确切的启动命令、决策
6响铃$jutaisho(§ 1 决定页面的询问是否使其成为停止点)工作流声明的梯级——并且仅当真正需要时才会停止

步骤 2 就是更改本身,它在 2026-09-10 停止使用半编号。 此表过去包含一个步骤 1.5——"工作",没有技能拥有——旁边是一个称为构建的步骤 2,它将 rasengan 理解为运行构建命令而不是构建事物。维护者的裁决(docs/ROSTER.md HR-55)解决了这个问题:rasengan 就是编写阶段,因此工作有了一个技能,六个整数又是六个技能,编译在提交之前与准备树的阶段一起进行。

顺序在五个地方是承重的,并且这五个是 ren 唯一断言的:

  • 1 在 2 之前——在没有经过验证的基础上不能编写。 Breath 从 origin/<branch.base> 的新抓取提示符处切分分支,并证明其声明的检查,因此更改的第一行落在一个已知已构建的树上,任何人在那里看到的第一个红色都是此努力引起的。红色的基础提示符是一个 G5 停止点,在写入一行之前发生;它永远不会在此努力内部被修复。breath § 4a 的构成本身检查也是如此,其 gate breath § 6 已说明(WORKFLOW.md § 构成本身检查)。
  • 2 在 3 之前——没有在此回合中编写并在此回合中验证的内容不会被提交。 Rasengan 编写更改并保持其内部循环诚实;kokusen 然后在 完成的 树上运行声明的检查,并在红色时拒绝提交。两次运行不是重复:树在作者最后一次检查之后写入的每一行时移动,因此提交可以依赖的唯一运行是由持有索引的阶段进行的。在回合迭代(编写、检查、再次编写)的地方,它是步骤 2 与自身迭代,并且步骤 3 只进入一次。
  • 3 在 4 之前。 启动处理遵循已提交的结果;隔离不授权核心启动。延迟的命令不是对此努力树的演示。
  • 4 在 5 之前。 报告区分延迟的 dry-run 命令与实际运行的 argv。
  • 5 在 6 之前。 响铃携带报告链接。在页面存在之前响起的铃铛会将维护者引导至虚无。

此组合调用的阶段跳过它们自己的 ## 0. Standalone entry 部分。 docs/STANDALONE-ENTRY.md 是手动输入到任意检出中的阶段的契约;从此处到达的阶段继承此运行的 P1–P4——预热、定向、更改集和每个派生参数——重新派生它们将产生对此组合已解决的问题的第二个答案。每个阶段都说明是哪个组合在持有它。

在步骤 1 内部,每个分类的努力运行一次 $direct——对于命名了一个问题(请求中的 <CODE>#<N>)或已有标签的文本分类的努力——使用此会话的 --surface、--model 和 --effort(在 harness 隐藏一个的情况下为 unread),正如 build § 2b 所做的那样;其 § 6 拥有比较和一次询问,并且键入的 $ren 已经是决定在此工作的决定,因此它永远不会阻塞。其答案 B 结束此 回合,而不是循环:步骤 5 和 6 仍然运行,并且报告命名重新启动的行。没有 job/ 标签的努力是 undirectable,一行,然后回合继续。它不是第七个步骤,并且不声明自己的顺序:它在预热内部读取,最多询问一次,不编写任何内容——并且其 § 7 发布步骤不在此处运行:Ren 不能离开机器(§ 3),因此裁决留在报告和本地分类账中,并且 direct.publish 仅在 build、file(一旦 filed)或 standalone 下起作用。

预热每个努力运行一次;每次进入都检查检出选择。 后来的回合和 PR 阶段在步骤 2 或任何追赶之前,在 $hatsu_root/docs/WORKFLOW.md § 工作树所在位置下重新验证绑定的绝对努力路径。报告路径、原始提示豁免状态以及 Breath 是预热还是仅重新验证。延续从不绕过隔离。

除非调用者显式继续当前努力,否则新请求是新努力。 坐在来自先前努力的干净功能分支上不是延续(zheref/hatsu#60;$breath § 2a)。Breath 仍然运行,仍然抓取配置的基础,并且仍然切分一个新渲染的分支。仅当明确"继续" / "相同努力" / "在此分支上",或对于步骤 1 已在此会话中切分了此分支的循环的第 2 个及之后的回合时,才重用。

当此努力的后来的回合,或 $mukai,重新进入 $hanten 时,它重用相同的周期分类账——.nen/hanten/<branch-slug>.cycle.json。修复不会重置审阅者计数。Breath 切分新分支是唯一的新周期(zheref/hatsu#63;hanten § 2a)。

2a. 配置文件和阶段分类账

nen/workflow.json 中的 profile.default 塑造回合(缺席时为 standard);§ 1 的 --profile 覆盖它,profile.allowed 之外的值会再次被询问,允许列表作为选择器的选项,并且回合的第一行命名当前使用的配置文件。

配置文件§ 2 中什么改变了
fast步骤 1 验证绑定;预热仍然运行一次;声明的步骤 2 和 3;步骤 4 跳过,启动行 deferred by profile fast; isolation still requires an explicit maintainer core-launch call;步骤 5 渲染 --variant turn-fast
standard今天的回合,如上表所述
thoroughstandard,并且在步骤 3 之后,在每个回合上运行 kotoamatsukami 的影响的套件

配置文件决定哪些步骤运行以及步骤 5 渲染哪个变体,从不决定步骤内部发生什么。 步骤 2 和 3 在每个配置文件下都按照其技能所说运行。在 fast 下,影响的套件不运行(它们是 mukai 的,步骤 4 那里);在 thorough 下,kotoamatsukami 的影响的套件在步骤 3 之后运行,ren 是该技能的第三个调用者。启动被跳过,而不是移动:mukai 没有启动步骤,并且 amaterasu § 1a 说明了如何对待跳过的启动。覆盖率不由任何 ren 配置文件捕获;那是 byakugan 的,在 mukai 处。

一次 landing(mukai)始终以 thorough 运行,无论之前的回合如何命名。

每个步骤是一个分类账条目(WORKFLOW.md § 努力的分类账拥有机制;属于 ren 的是哪些步骤以及何时)。在一个步骤之前:nen phase begin --effort <branch> --phase <step-name> --surface <s> [--model <reported-model>] --dial <level>;如果模型是 harness 报告的已服务 ID,则添加 --note "model-kind=served; registry alias <alias>"(WORKFLOW § 努力的分类账);在第一个阶段记录时,使用 harness 的标题/id(当暴露时)运行 nen session record,每个会话一次;在一个步骤之后:nen phase end --effort <branch> --phase <step-name> --exit <code>,因此 .nen/phases/<effort>.json 每个阶段携带一个有时间戳的条目,包括被拒绝的步骤。步骤 1 的 end 携带 breath § 4a 的记录作为其 --note,与步骤 1 开始的注释组合,因为 end --note 替换它(脚本的 --begin-note;WORKFLOW § 构成本身检查,步骤 3、5 和 6,拥有这些形式)。检查不是它自己的条目,因此六个步骤仍然是六个条目(HR-58)。使用条目在步骤 5 记录:nen usage record --effort <branch> --surface <s> [--model] --dial <level> [--input] [--output] [--cache-read] [--cache-write] [--minutes] 来自表面自己的成本读数,对于不暴露成本的表面使用 --not-reported。

恢复的努力在写入之前读取(zheref/hatsu#444, zheref/hatsu#445;nen 0.28,固定点)。分支已有阶段分类账或 PR 的努力是恢复:首先,在存在 PR 的地方——打开的 PR:后继者的编号,而不是基础删除关闭的 PR(en § 6)——nen pr ledger read --target <owner/name> --pr <n> --effort <branch> --repo <checkout> --json,仅当 nen phase show 未找到本地分类账时添加 --restore;然后 nen phase show --effort <branch> --json。WORKFLOW § 努力的分类账、持久切片,拥有裁决和一个跳过行形式;跳过的 breath 条目的注释在步骤 2 之前读取(WORKFLOW § 构成本身检查,步骤 7)。按顺序,每个阶段:以退出码 0 结束 → **

…

[截断以进行翻译]

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

相关技能