| name | chapter-reorchestration |
| description | Use when reordering, bridging, or restructuring Code Complete chapter content for reader flow โ deciding where to place Verdict badge, voting bar, member opinions, or FE checklist, writing transition sentences between sections, or detecting when a chapter should break from the default render order. Also use when validating that human_only fields were preserved byte-for-byte after editing. |
chapter-reorchestration
Overview
Notion 9์น์
์์๋ ์งํ์ ํธ์๊ณ , ๋
์ ์ฝ๊ธฐ ํ๋ฆ๊ณผ ๋ค๋ฅด๋ค. ์ด ์คํฌ์ "๋ง๊น๋๊ฒ ์ฌ๊ตฌ์ฑ"์ ๊ตฌ์ฒด ๊ท์น โ ๋ ๋ ์์ ๊ฒฐ์ ๊ณผ ๋ธ๋ฆฟ์ง ๋ฌธ์ฅ ์์ฑ, ๊ทธ๋ฆฌ๊ณ Human-only Zone ๋ฌด๊ฒฐ์ฑ ๋ณด์ฅ์ ์ ์ํ๋ค.
When to Use
- chapter-editor๊ฐ YAML์ ๋ฐ์ ์ฌ๊ตฌ์ฑ๋ณธ์ ๋ง๋ค ๋
- ํน์ ์ฅ์ด ๊ธฐ๋ณธ ์์๋ก ์ฝ๊ธฐ ์ด์ํ ๋ ์ปค์คํ
์์ ๊ฒฐ์
- ์น์
๊ฐ ์ฐ๊ฒฐ์ด ๋๊ฒจ ๋ณด์ผ ๋ ๋ธ๋ฆฟ์ง ๋ฌธ์ฅ ์์ฑ
- ํธ์ง ํ Human-only ํ๋๊ฐ ๊ทธ๋๋ก์ธ์ง ๊ฒ์ฆ
๊ธฐ๋ณธ ๋ ๋ ์์ (default)
1. Verdict ๋ฑ์ง โ ํ
(์ด ์ฅ์ ๊ฐ์น๋ฅผ ํ๋์)
2. ํต์ฌ ์์ฝ (lead + bullets) โ ์ค์บ๋ ๋
์
3. VotingBar โ ์ฌํ์ ์ฆ๋ช
(ํ๊ท ์ ์)
4. Before/After ์ฝ๋ โ ๋ณธ๋ก
5. ํ ๋ก ํฌ์ธํธ โ ์ฌ๊ณ ์ ๋
6. MemberOpinion ร7 โ ํด๋ผ์ด๋งฅ์ค
7. DevilsAdvocate โ ๋๋น (๋ฐ๋ฐ)
8. FE ์ฒดํฌ๋ฆฌ์คํธ + ESLint โ ์ก์
๋๋ธ
9. BestPickCallout โ ์ฌ์ด + ๋ถ๋ก ์ฐ๊ฒฐ
์ ์ด ์์์ธ๊ฐ: ํ
โ ์์ฝ โ ์ฆ๋ช
โ ๋ณธ๋ก โ ํ ๋ก โ ์ฌ๋ ๋ชฉ์๋ฆฌ โ ๋ฐ๋ฐ โ ์ค๋ฌด โ ์ฌ์ด. ์คํ ๋ฆฌํ
๋ง ์ํฌ๋ฅผ ๋ฐ๋ฅธ๋ค.
์ปค์คํ
์์ ํ๋จ
๋ค์ ์กฐ๊ฑด ์ค ํ๋๋ผ๋ ํด๋นํ๋ฉด ๊ธฐ๋ณธ ์์๋ฅผ ๋ฒ์ด๋ ๊ณ ๋ ค:
| ์ํฉ | ๊ถ์ฅ ์์ ๋ณ๊ฒฝ |
|---|
| ์ฝ๋ ์์ ๊ฐ ์๋ ์ฅ (์ด๋ก ์ค์ฌ) | ์ฝ๋ ์น์
์๋ต, ํ ๋ก ํฌ์ธํธ๋ฅผ 4๋ฒ์ผ๋ก |
| ํ์ ์ด ๐ด ์ฌ๋ง | Verdict ๋ฐ๋ก ๋ค์ DevilsAdvocate๋ฅผ ๋ฐฐ์น (๋ฐ๋ฐ์ผ๋ก ์ค๋๋ ฅ ๋ณด๊ฐ) |
| ๋ฉค๋ฒ ์๊ฒฌ์ด 3๋ช
์ดํ (๋ฏธ์) | MemberOpinion์ ์กฐ์ฉํ ๋ท๋จ์ผ๋ก, VotingBar๋ ์๋ต |
| ์ฒดํฌ๋ฆฌ์คํธ๊ฐ ๋งค์ฐ ์งง์ (2ํญ๋ชฉ ์ดํ) | ์ฒดํฌ๋ฆฌ์คํธ ์น์
์์ฒด๋ฅผ ํ ๋ก ํฌ์ธํธ์ ํตํฉ |
์ฌ์ฉ์๊ฐ ๋ช
์์ ์ผ๋ก "์ด ์ฅ์ ์์ ๋ฐ๊ฟ๋ฌ๋ผ" ํ๋ฉด ์กด์ค. ๊ทผ๊ฑฐ๋ฅผ edit_meta.reorder_applied์ ๊ธฐ๋ก.
๋ธ๋ฆฟ์ง ๋ฌธ์ฅ ์์ฑ ์์น
์น์
์ฌ์ด์ 1~2๋ฌธ์ฅ ์ฐ๊ฒฐ ํ
์คํธ๋ฅผ ์ ํ์ ์ผ๋ก ์ถ๊ฐ. ์์ด๋ ๋ฌด๋ฐฉํ๋ฉด ์ ์ด๋ค.
์ดํฌ๋ writing-voice-ff ์คํฌ์ ํด์์ฒด ๊ฐ์ด๋๋ฅผ ๋ฐ๋ฅธ๋ค. ๋ธ๋ฆฟ์ง ์์๋ ๊ฑฐ๊ธฐ์ ๋ด๊ฒจ ์๋ค.
์ข์ ๋ธ๋ฆฟ์ง (ํด์์ฒด)
| ์์น | ์์ |
|---|
| ์์ฝ โ VotingBar | "7๋ช
์ด ์ด ์์น์ ์ค ์ ์๋ ๋ค์๊ณผ ๊ฐ์์." |
| ์ฝ๋ โ ํ ๋ก ํฌ์ธํธ | "์ฝ๋๋ก ๋๋์ง ์๋ ์์น์ด์์. ํ์
์์๋ ์ด๋ฐ ์ง๋ฌธ์ด ๋ฐ๋ผ์์." |
| ํ ๋ก โ MemberOpinion | "์์น์ ์ด๋ก ์ด์์. ์ค๋ฌด์์ ์ด๊ฒ ์ด๋ป๊ฒ ์ฒด๊ฐ๋๋์ง ๋ค์ด๋ด์." |
| ์ฒดํฌ๋ฆฌ์คํธ โ BestPick | "์ด ์ฅ์์ ํ์ด ๊ฐ์ฅ ์ธ์ ๊น๊ฒ ์ง์ ํ ๋ง๋๋ ์ด๊ฑฐ์์." |
๊ธ์ง ํจํด (AI ์ฌ๋กญ)
- "์ด์ ๋ถํฐ๋ ~์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค"
- "์ ๊ทธ๋ผ ๋ค์์ผ๋ก ๋์ด๊ฐ๋ณผ๊น์"
- "~์ ์ ๋ง ์ค์ํ ๊ฐ๋
์
๋๋ค"
- "์์์ ์ดํด๋ณธ ๋ฐ์ ๊ฐ์ด"
- "์ฌ๋ฌ๋ถ๋ ํ ๋ฒ ~ํด๋ณด์๋ ๊ฒ์ ์ด๋จ๊น์"
- ๊ฒฉ์์ฒด("~์
๋๋ค", "~ํฉ๋๋ค") โ
writing-voice-ff์ ํด์์ฒด ์์น ์๋ฐ
- "์ฐ๋ฆฌ๋", "์ฌ๋ฌ๋ถ์" ์ธ์นญ ๋จ์ฉ โ
writing-voice-ff๊ฐ ์ ์ํ "์ฝ๋๋ฅผ ์ฝ๋ ์ฌ๋" ์ผ๋ฐํ๋ฅผ ์ฐ์ธ์
ํ๋ณ ๊ธฐ์ค: ๋ธ๋ฆฟ์ง๊ฐ ์ ๊ฑฐ๋ผ๋ ๊ธ ํ๋ฆ์ด ๊นจ์ง์ง ์์ผ๋ฉด ๊ทธ ๋ธ๋ฆฟ์ง๋ ํ์ ์๋ ๊ฑฐ๋ค. ๊ณผ๊ฐํ null.
Human-only ๋ฌด๊ฒฐ์ฑ ํด์ ๊ฒ์ฆ
ํธ์ง ํ ์ถ๋ ฅ ์ง์ ๋ฐ๋์ ์ํ.
์ ์ฐจ
- ์
๋ ฅ YAML์
human_only.*๋ฅผ canonical JSON์ผ๋ก ์ง๋ ฌํ (ํค ์ ๋ ฌ, ๊ณต๋ฐฑ ํ์คํ)
- SHA-256 ํด์ ๊ณ์ฐ
- ์ถ๋ ฅ YAML์
human_only.*๋ ๋์ผํ๊ฒ ํด์
- ๋ถ์ผ์น ์ ์ถ๋ ฅ ํ์ผ ์์ฑํ์ง ์๊ณ ์๋ฌ ๋ฐ์
๊ตฌํ ์ค๋ํซ
import { createHash } from 'node:crypto';
function canonicalizeHumanOnly(humanOnly: unknown): string {
return JSON.stringify(humanOnly, Object.keys(humanOnly as object).sort());
}
function hashHumanOnly(yaml: { human_only: unknown }): string {
const canonical = canonicalizeHumanOnly(yaml.human_only);
return createHash('sha256').update(canonical).digest('hex');
}
const before = hashHumanOnly(inputYaml);
const after = hashHumanOnly(outputYaml);
if (before !== after) {
throw new Error(
`Human-only zone modified. Input hash: ${before}, Output hash: ${after}. ` +
`Aborting output.`
);
}
ํด์๊ฐ ๊นจ์ก์ ๋ ์ถ์
๋ถ์ผ์น ๋ฐ๊ฒฌ ์ ํ๋๋ณ๋ก diff:
for (const key of Object.keys(inputYaml.human_only)) {
const inputStr = JSON.stringify(inputYaml.human_only[key]);
const outputStr = JSON.stringify(outputYaml.human_only[key]);
if (inputStr !== outputStr) {
console.error(`MODIFIED: human_only.${key}`);
}
}
edit_meta ํ์ ํ๋
edit_meta:
edited_at: <ISO timestamp>
reorder_applied: "default" | "custom: summaryโcodeโdiscussionโ..."
bridges_added: <integer, 0 ์ด์>
zones_respected: true
ai_assisted_fields:
- verdict.rationale
zones_respected: false๊ฐ YAML์ ๋์ค๋ฉด ์ ๋๋ค โ ํด์ ๊นจ์ง๋ฉด ์ ์ฅ ์์ฒด๋ฅผ ์ค๋จ.
Common Mistakes
| ์ค์ | ์ ๋ฌธ์ | ์์ |
|---|
| "๋
์ ์ดํด๋ฅผ ์ํด" ์๊ฒฌ ์ด์ง ๊ณ ์นจ | Human-only ํผ์, ์ํ ๊ฐ์น ํ๊ดด | ํ ๊ธ์๋ ์์ ๊ธ์ง. ๋ถํธํด๋ ์๋ฌธ ๊ทธ๋๋ก |
| ๋ธ๋ฆฟ์ง์ ์์ฝ ๋ฐ๋ณต ("์์์ ๋ณธ ๊ฒ์ฒ๋ผ X๋ ์ค์ํฉ๋๋ค") | ์ค๋ณต + ์ฌ๋กญ | ๋ธ๋ฆฟ์ง๋ ์ฐ๊ฒฐ ๊ธฐ๋ฅ๋ง, ์์ฝ ๊ธ์ง |
| ์ฝ๋ ๋ธ๋ก์ ์ฃผ์์ผ๋ก ํด์ค ์ถ๊ฐ | ์๋ณธ ์ฝ๋ ์์ = ai_editable ์์ญ์ด์ง๋ง ์๋ ์๊ณก ๊ฐ๋ฅ | ํด์ค์ ๋ณธ๋ฌธ paragraph์ผ๋ก |
| ์์ ๋ณ๊ฒฝ ๊ทผ๊ฑฐ ๋ฏธ๊ธฐ๋ก | ์ฌ์คํ ์ ์ ๊ทธ๋ ๊ฒ ํ๋์ง ์์ด๋ฒ๋ฆผ | edit_meta.reorder_applied์ ์ฌ์ ๊น์ง |