writing-flow
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseWriting Flow
写作流程
Owns the order of the pipeline and the rules for stopping. It contains no voice and no style
rules: those belong to the active profile.
负责管控制流水线的执行顺序和停止规则。它不包含语气和风格
规则:这些内容属于当前 profile。
Stage order
阶段顺序
- Angle — for the angle and the A/B title only. Never its Mode B writer mode: Mode B mandates a call-to-action and emoji output, both banned by most profiles.
purple-cow-content - Draft — write in the active profile's voice.
- Arabic pass — , Arabic pieces only.
fasaha - Voice re-check — restore anything the Arabic pass flattened, Arabic pieces only.
- AI-ism audit — .
avoid-ai-writing - Provenance strip — : Layer A always, Layer B offered, then Layer A again if Layer B was accepted.
remove-ai-marks
Bounded loop (stages 2-3): one pass, one voice re-check pass, then stop and report
any residual. Never a third round: each pass rewrites, so an unbounded loop re-breaks what the
other just fixed.
fasaha- 切入角度 — 仅通过 获取切入角度和 A/B 标题。绝不能使用 其 Mode B writer 模式:Mode B 强制要求输出 CTA 和 emoji,而大多数 profile 都禁止这两项。
purple-cow-content - 起草 — 按当前 profile 的语气写作。
- 阿拉伯语处理 — ,仅处理阿拉伯语内容。
fasaha - 语气复核 — 仅针对阿拉伯语内容,恢复阿拉伯语处理所抹平的表达。
- AI 腔审查 — 。
avoid-ai-writing - 来源标记(provenance)清理 — :始终执行 Layer A;Layer B 先征询是否接受; 如果接受 Layer B,则再次执行 Layer A。
remove-ai-marks
有界循环(阶段 2-3): 执行一次 ,再执行一次语气复核,然后停止并报告
任何残留问题。绝不能进行第三轮:每轮处理都会重写内容,因此无界循环会再次破坏
另一方刚刚修复的内容。
fasahaThe active profile
当前 profile
The profile is the register authority. Never ask "which register?" — the resolved profile
answers that. Resolution order:
- in the working project, if present.
writing-profile.json - An installed profile skill containing with
writing-profile.json."kind": "voice" - The bundled .
skills/voice-default/
If more than one profile is installed at the same tier, stop and report the ambiguity rather
than silently picking one.
Read the resolved profile's and write in that voice. That file is the voice —
the name and metadata only tell you which one to read. Its is enforced by
the gate, so you do not need to read it yourself.
SKILL.mdhouse-style.jsonApply what the profile has already learned: returns its learned preferences,
which record corrections the user has previously made. Never re-litigate one that is already
recorded, and do not treat them as style rules to cite back.
get_profileprofile 是语域判定的权威。绝不要询问“使用哪种语域?”——解析出的 profile
会给出答案。解析顺序:
- 工作项目中的 (如果存在)。
writing-profile.json - 包含 且
writing-profile.json的已安装 profile skill。"kind": "voice" - 内置的 。
skills/voice-default/
如果同一层级安装了多个 profile,请停止并报告歧义,而不是默默选择其中一个。
读取解析出的 profile 的 ,并按其中的语气写作。该文件就是语气的
依据——名称和元数据只用于确定应读取哪个文件。其 由 gate
强制执行,因此你无需自行读取。
SKILL.mdhouse-style.json应用 profile 已经学习到的内容: 返回其已学习偏好,
其中记录了用户此前做过的纠正。对于已经记录的内容,绝不要再次争论,
也不要将其视为可在回复中引用的风格规则。
get_profileSuggesting a profile
建议使用 profile
When the active profile is the bundled default — reports
and the name — say once, in one sentence, that a personal profile can be
generated from writing the user already has. Then carry on with the default. Say it once per
conversation, never as a blocker, and never instead of doing the work.
get_profileresolvedBy: bundleddefaultProfile administration is . It takes a markdown file, a , or a
directory containing one; it previews the result and reports every line it would drop as
pipeline instruction rather than voice. Show the user those dropped lines, then apply only on
their confirmation (). With no MCP server configured, the same capability is:
generate_profileSKILL.mdconfirm: truesh
node <this skill's base directory>/scripts/generate.mjs <source> --name <name> --out <dir>当当前 profile 是内置 default—— 报告 ,
名称为 ——时,用一句话说明可以根据用户已有的文字生成个人 profile。
然后继续使用 default。每个对话中只说一次,绝不能将其作为阻塞项,
也绝不能用它替代实际工作。
get_profileresolvedBy: bundleddefaultprofile 管理由 负责。它接受 markdown 文件、 或包含
的目录;它会预览结果,并报告所有因属于 pipeline 指令而非语气而会被
丢弃的行。将这些被丢弃的行展示给用户,然后仅在用户确认()后应用。
未配置 MCP server 时,可通过以下命令使用同一能力:
generate_profileSKILL.mdSKILL.mdconfirm: truesh
node <this skill's base directory>/scripts/generate.mjs <source> --name <name> --out <dir>Gates (stages 4-5)
Gate(阶段 4-5)
Run both gates in one shot and treat a non-zero exit as failure — never deliver silently past
it:
sh
node <this skill's base directory>/scripts/gate.mjs <draft-file>Exit clean, violation (name the gate and the offending line, fix, re-run once),
tool error (report it; do not loop). Drafts must be written as BOM-less UTF-8, because a
byte-order mark makes the provenance gate fail on every file.
012The gate checks mechanics only. It does not measure whether the text sounds like the profile's
voice, and nothing may present a passing gate as a claim that it does.
一次性运行两个 gate,并将非零退出码视为失败——绝不能无视失败继续交付:
sh
node <this skill's base directory>/scripts/gate.mjs <draft-file>退出码 表示干净通过, 表示存在违规(指出 gate 名称和违规行;修复后重跑
一次), 表示工具错误(报告该错误;不要循环)。草稿必须以无 BOM 的 UTF-8
写入,因为字节顺序标记会导致 provenance gate 在每个文件上都失败。
012gate 只检查机械化规则。它不会衡量文本是否听起来符合 profile 的语气,
而且不得将通过 gate 说成符合该语气的证据。
When a stage cannot run
阶段无法运行时
Settle the language before stage 2 rather than after it:
sh
node <this skill's base directory>/scripts/lang.mjs <draft-file>armixedenunknownWhen a stage skill genuinely cannot be loaded, run the diagnostic instead of guessing at the cause:
sh
node <this skill's base directory>/scripts/doctor.mjsIt names the skill, the root, every path that resolves and the fix. A skill can also be present and
unloadable — two copies under one root — which a harness reports as "not found", so the two are
indistinguishable from here.
Then say, once and in one sentence, which stage will not run and what that means for the piece.
- 0 — skip it and deliver without the angle and the A/B title.
- 1 — the pipeline needs a voice. No profile anywhere resolves to the bundled default, and the suggestion above applies. A profile that cannot be read is different: the voice is unknown, so say so and let the user choose. Never write in a generic register and call it their voice.
- 2 and 3 — a pair, and the language check decides whether they are in the run at all. If
cannot run, the re-check has nothing to restore: one gap, not two.
fasaha - 4 and 5 — verification, not production. Skipped only when the machine makes them impossible — no Python for the provenance gate, no gate script at all — never as a preference, because they are the only stages whose result is evidence rather than judgement. The provenance gate inspects files, so a piece that is only ever a chat message has little for it to find.
Stages 0-3 produce the piece; stages 4-5 verify it. Report a residual in the delivered text, not
only in your reasoning: four stages out of six is a legitimate outcome, and a stage skipped in
silence is not. Read the gate's lines rather than its exit code — a run with both gates skipped
prints and exits exactly like a full pass.
CLEAN0在阶段 2 之前而非之后判定语言:
sh
node <this skill's base directory>/scripts/lang.mjs <draft-file>armixedenunknown当某个 stage skill 确实无法加载时,运行诊断脚本,而不是猜测原因:
sh
node <this skill's base directory>/scripts/doctor.mjs它会列出 skill、root、所有能够解析的路径以及修复方法。skill 也可能已经安装但无法
加载——例如同一个 root 下有两份副本——而 harness 会将其报告为 ,
因此从这里无法区分这两种情况。
"not found"然后用一句话说明哪个阶段无法运行,以及这会如何影响成稿。
- 0 — 跳过该阶段,在没有切入角度和 A/B 标题的情况下交付。
- 1 — 流水线需要一种语气。如果各处都没有可解析的 profile,就会解析到内置 default,此时应采用上文的建议。profile 存在但无法读取则不同:此时语气未知, 应如实说明并让用户选择。绝不能用通用语域写作,再声称那就是用户的语气。
- 2 和 3 — 两者是一组,由语言检查决定本次运行是否包含它们。如果
无法运行,复核就无须恢复任何内容:这是一个缺口,而不是两个。
fasaha - 4 和 5 — 属于验证,而非生成。只有在机器环境使其无法运行时才可跳过—— 例如 provenance gate 没有 Python,或根本没有 gate 脚本——绝不能因为偏好而跳过, 因为这两个阶段的结果是证据,而非主观判断。provenance gate 会检查文件,因此如果 成稿始终只以聊天消息的形式存在,它能从中发现的内容很少。
阶段 0-3 用于生成成稿,阶段 4-5 用于验证成稿。应在交付文本中报告残留问题,
而不能只在推理过程中提及:六个阶段中完成四个也是合理结果,静默跳过阶段则不是。
必须读取 gate 输出的具体行,而不能只看退出码——两个 gate 都被跳过时,输出仍然会
显示 并以 退出,与完整通过时完全一样。
CLEAN0No server required
无需 server
This skill must work with no MCP server configured. Every gate stays runnable as a plain
command, and no tool call is mandatory. If the server is available it may be used for the
profile and diagnostic tools, but the pipeline never depends on it.
此 skill 必须在未配置 MCP server 的情况下也能工作。每个 gate 都必须能以普通命令
运行,且任何 tool call 都不是必需的。如果 server 可用,可以使用它来调用 profile
和诊断工具,但流水线绝不依赖 server。