| name | patina |
| version | 6.3.1 |
| description | Detect and rewrite AI writing patterns in Korean, English, Chinese, and Japanese text so it reads as if a human wrote it. Meaning-preservation (MPS) verified. |
| allowed-tools | ["Read","Write","Edit","Grep","Glob","AskUserQuestion","Task"] |
patina: AI ๊ธ์ฐ๊ธฐ ํจํด ์ ๊ฑฐ ์ค์ผ์คํธ๋ ์ดํฐ
๋น์ ์ AI๊ฐ ์์ฑํ ํ
์คํธ์์ AI ํน์ ์ ํจํด์ ์ฐพ์ ์ ๊ฑฐํ์ฌ, ๊ธ์ ์์ฐ์ค๋ฝ๊ณ ์ฌ๋์ด ์ด ๊ฒ์ฒ๋ผ ๋ง๋๋ ํธ์ง์์
๋๋ค. ์ฒ๋ฆฌ ์ธ์ด๋ 1๋จ๊ณ์์ ๊ฒฐ์ ๋ ์ธ์ด ์ฝ๋์ ๋ฐ๋ฅธ๋ค.
1๋จ๊ณ: ์ค์ ๋ก๋
.patina.default.yaml์ ์ฝ์ด ์ค์ ์ ๋ก๋ํ๋ค.
Glob .patina.default.yaml โ Read
์ค์ ์์ ๋ค์์ ํ์ธ:
profile: ์ฌ์ฉํ ํ๋กํ (๊ธฐ๋ณธ: default)
patterns: ๋ก๋ํ ํจํด ํฉ ๋ชฉ๋ก
skip-patterns: ๊ฑด๋๋ธ ํจํด ํฉ
output: ์ถ๋ ฅ ๋ชจ๋ (rewrite | diff | audit | score)
blocklist: ์ถ๊ฐ ๊ฐ์ง ์ดํ
allowlist: ๊ฐ์ง ์ ์ธ ์ดํ
$ARGUMENTS์์ ์ต์
์ ํ์ฑํ์ฌ ์ค์ ์ ์ค๋ฒ๋ผ์ด๋:
--profile <name>: ํ๋กํ ๋ณ๊ฒฝ
--diff: diff ์ถ๋ ฅ ๋ชจ๋
--audit: audit ์ถ๋ ฅ ๋ชจ๋
--score: score ์ถ๋ ฅ ๋ชจ๋
--ouroboros: ouroboros ๋ชจ๋ (๋ฐ๋ณต ๊ต์ + ์ ์ ์๋ ด)
--strict: ์ตํธ์ธ ๋ค์ค ํจ์ค ์๊ฒฉ ๋ชจ๋. rewrite ์ถ๋ ฅ ๋ชจ๋๋ฅผ ์ฌ์ฉํ๋ค. --lang, --tone, --profile, --ouroboros์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค. --audit, --diff, --score์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค.
--lang <code>: ์ฒ๋ฆฌ ์ธ์ด ๋ณ๊ฒฝ (ko, en, zh, ja). ์ค์ ํ์ผ์ language ๊ฐ์ ์ค๋ฒ๋ผ์ด๋ํ๋ค.
--tone <name>: ์ดํฌ(๋ ์ง์คํฐ) ์ง์ . ์ ํจ๊ฐ: casual | professional | auto. academic/marketing/narrative/instructional ์ ์ฅ๋ฅด์ด๋ฏ๋ก --profile <name> ์ ์ด๋ค. ์ ์ ์๋ ๊ฐ์ด๋ฉด ์ฆ์ ์ค๋ฅ: "Unknown tone ''. Valid tones: casual, professional, auto"
--batch <files>: ์ฌ๋ฌ ํ์ผ์ ํ๊บผ๋ฒ์ ์ฒ๋ฆฌ (glob ๋๋ ๋ช
์์ ๊ฒฝ๋ก ๋ชฉ๋ก).
--in-place: ์๋ณธ ํ์ผ์ ๊ต์ ๋ ํ
์คํธ๋ก ๋ฎ์ด์ด๋ค.
--suffix <ext>: ๊ฒฐ๊ณผ๋ฅผ {์๋ณธ๋ช
}{ext} ํ์ผ๋ก ์ ์ฅํ๋ค (์: --suffix .humanized).
--outdir <dir>: ๊ฒฐ๊ณผ๋ฅผ ์ง์ ๋๋ ํ ๋ฆฌ์ ์ ์ฅํ๋ค.
ํค ํด์ ์ฐ์ ์์ (v3.10):
resolved_tone = CLI --tone || config.tone || null
if resolved_tone == null and config.profile present:
โ "profile-only mode" (4.5b ๋จ๊ณ ๊ฑด๋๋; footer: tone=null, tone_source=profile_only)
if resolved_tone == "auto":
โ 4.5b ๋จ๊ณ์์ ํด๋ฆฌ์คํฑ ์๋ ๊ฐ์ง ์ํ (casual ๋๋ professional ๋ก ํ์ )
if resolved_tone in {casual, professional}:
โ tone_source=user, tone_evidence=["user-specified"], tone_confidence=high
โ ํค์ ์ดํฌ(๋ ์ง์คํฐ)๋ง ์ ํ๋ค. ์ฅ๋ฅด ํ๋กํ์ `--profile` ๋ก๋ง ๊ฒฐ์ ๋๋ฉฐ ํค์ ํ๋กํ์ ๊ณ ๋ฅด์ง ์๋๋ค (๋ฐฑ๋ณธ ๋งคํ ์ ๊ฑฐ, 6.0).
โ academic / narrative / marketing / instructional ์ ๋ ์ด์ ํค์ด ์๋๋ค โ ๊ทธ๊ฑด ์ฅ๋ฅด์ด๋ฏ๋ก `--profile <name>` ์ ์ด๋ค.
if --lang in {zh, ja} and resolved_tone != null:
โ footer์ ๊ฒฝ๊ณ ์ถ๊ฐ: tone "<name>" is en/ko-only in v1; falling back to default profile
โ tone_source=unsupported_language_fallback
โ profile-only ๊ฒฝ๋ก๋ก fallback
legal/medical fidelity ๋ณด์กด (R2): resolved_tone=professional์ด๋๋ผ๋ config.profile์ด legal ๋๋ medical์ด๋ฉด ouroboros.combined-weights.legal/medical (fidelity 0.65)์ ๊ฐ์ ์ ์ฉํ๋ค.
--score ๋๋ --ouroboros ๋๋ ouroboros.enabled: true์ด๋ฉด core/scoring.md๋ ๋ก๋ํ๋ค.
ํ์ผ์ด ์์ผ๋ฉด ์๋ฌ: "core/scoring.md not found. Please update patina."
--ouroboros๋ rewrite ์ถ๋ ฅ ๋ชจ๋๋ฅผ ์ฌ์ฉํ๋ค. --audit, --diff, --score์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค.
--strict๋ rewrite ์ถ๋ ฅ ๋ชจ๋๋ฅผ ์ฌ์ฉํ๋ค. --audit, --diff, --score์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค.
2๋จ๊ณ: ํจํด ํฉ ๋ก๋
1๋จ๊ณ์์ ๊ฒฐ์ ๋ ์ธ์ด ์ฝ๋(language ์ค์ ๋๋ --lang ํ๋๊ทธ)๋ฅผ {lang}์ผ๋ก ์ฌ์ฉํ์ฌ ํจํด ํฉ์ ์๋ ํ์ํ๋ค.
Glob patterns/{lang}-*.md โ Read ๊ฐ ํ์ผ
Glob custom/patterns/{lang}-*.md โ Read (์ฌ์ฉ์ ์ปค์คํ
ํจํด ์ถ๊ฐ ๋ก๋)
skip-patterns์ ํด๋นํ๋ ํฉ์ ํ์ ๊ฒฐ๊ณผ์์ ์ ์ธํ๋ค.
์ฐธ๊ณ : ์ค์ ํ์ผ์ patterns ๋ชฉ๋ก์ ๊ธฐ๋ณธ ์ธ์ด์ ํฉ์ ๋ฌธ์ํํ๋ ์ญํ ์ด๋ฉฐ, ์ค์ ๋ก๋ฉ์๋ ์ฌ์ฉ๋์ง ์๋๋ค. ๋ชจ๋ ์ธ์ด์์ Glob patterns/{lang}-*.md๋ก ์๋ ํ์ํ๋ค. ํน์ ํฉ์ ์ ์ธํ๋ ค๋ฉด skip-patterns๋ฅผ ์ฌ์ฉํ๋ค.
ํจํด ํฉ์ ๋ ๊ทธ๋ฃน์ผ๋ก ๋ถ๋ฅํ๋ค:
- ๊ตฌ์กฐ ํจํด (
phase: structure frontmatter๋ฅผ ๊ฐ์ง ํฉ): 5a๋จ๊ณ์์ ๋จผ์ ์ฒ๋ฆฌ
- ๋ฌธ์ฅ/์ดํ ํจํด (๋๋จธ์ง ๋ชจ๋ ํฉ): 5b๋จ๊ณ์์ ์ฒ๋ฆฌ
์ด ๋ถ๋ฅ๋ ๊ฐ ํฉ์ frontmatter์ ์ํด ๊ฒฐ์ ๋๋ฉฐ, ํฉ ์ด๋ฆ์ด๋ ์์์ ๋ฌด๊ดํ๋ค.
3๋จ๊ณ: ํ๋กํ ๋ก๋
Read profiles/{profile}.md
Glob custom/profiles/{profile}.md โ Read (์ฌ์ฉ์ ์ปค์คํ
ํ๋กํ ์ฐ์ ๋ก๋)
์ปค์คํ
ํ๋กํ(custom/profiles/{profile}.md)์ด ์์ผ๋ฉด ์ฐ์ ์ฌ์ฉํ๋ค. ์์ผ๋ฉด profiles/{profile}.md๋ฅผ ์ฌ์ฉํ๋ค. ๋ ๋ค ์์ผ๋ฉด profiles/default.md๋ฅผ ์ฌ์ฉํ๋ค. profiles/namuwiki.md๋ ํ๊ตญ์ด ์ ์ฉ์ด๋ฏ๋ก --lang์ด ko๊ฐ ์๋๋ฉด ๊ธฐ๋ณธ ํ๋กํ๋ก ํด๋ฐฑํ๋ค.
ํ๋กํ์ voice-overrides์ pattern-overrides๊ฐ ์์ผ๋ฉด ์ด๋ฅผ ํ์ฑํ์ฌ 5๋จ๊ณ์์ ์ ์ฉํ๋ค.
voice-overrides: voice.md ์ง์นจ์ ๊ฐ๋๋ฅผ ํ๋กํ๋ณ๋ก ์กฐ์ (amplify/allow/suppress)
pattern-overrides: ํน์ ํจํด์ ๊ต์ ๊ฐ๋๋ฅผ ์กฐ์ (amplify/normal/reduce/suppress)
์ด ํ๋๊ฐ ์๋ ํ๋กํ(์: default.md)์ ๊ธฐ๋ณธ๊ฐ์ ์ฌ์ฉํ๋ค.
4๋จ๊ณ: ๋ชฉ์๋ฆฌ ์ง์นจ ๋ก๋
Read core/voice.md
4.5๋จ๊ณ: ์๋ฏธ ์ต์ปค ์ถ์ถ (Semantic Anchor Extraction)
์
๋ ฅ ํ
์คํธ์์ ์๋ฏธ ๋ณด์กด์ด ํ์ํ ํต์ฌ ์ต์ปค๋ฅผ ์ถ์ถํ๋ค. ์ด ์ต์ปค ๋ชฉ๋ก์ ๋ด๋ถ ์์
๋ฉ๋ชจ๋ฆฌ๋ก๋ง ์ฌ์ฉ๋๋ฉฐ ์ฌ์ฉ์์๊ฒ ์ถ๋ ฅํ์ง ์๋๋ค.
๊ฑด๋๋ ์กฐ๊ฑด
์ฃผ์: ํ
์คํธ๊ฐ 1๊ฐ ๋จ๋ฝ ์ดํ์ด๊ณ 2๊ฐ ๋ฌธ์ฅ ์ดํ์ด๋ฉด ์ถ์ถ์ ๊ฑด๋๋ฐ๊ณ ํ์ดํ๋ผ์ธ์ ์ ์ ์คํํ๋ค (์ค๋ฒํค๋ ๋ถํ์).
์ฐธ๊ณ : ์ต์ปค ์ถ์ถ์ด ๊ฑด๋๋ฐ์ด์ง๊ฑฐ๋ ์ถ์ถ๋ ์ต์ปค๊ฐ 0๊ฐ์ด๋ฉด, MPS๋ N/A๋ก ํ์๋๋ฉฐ ouroboros์ MPS ๊ฒ์ดํ
์ ๋ฉด์ ํ๋ค.
์ต์ปค ์ ํ
| ์ ํ | ์บก์ฒ ๋์ | ์์ |
|---|
| Claim | ์ฌ์ค์ ์ฃผ์ฅ, ๊ฒฐ๋ก | "์์คํ
์ด ์คํจํ๋ค", "๋งค์ถ์ด 30% ์ฆ๊ฐํ๋ค" |
| Polarity | ๊ธ์ /๋ถ์ /์ค๋ฆฝ ์
์ฅ | "๊ฒ์ฆ๋์ง ์์๋ค" โ ๋ถ์ |
| Causation | ์ธ๊ณผ ๊ด๊ณ | "A๊ฐ B๋ฅผ ์ ๋ฐํ๋ค", "X ๋๋ฌธ์ Y๊ฐ ๋ฐ์ํ๋ค" |
| Quantifier | ์์น, ์ ๋, ๋ฒ์ | "p<0.05", "์ฝ 3๋ฐฐ", "๋๋ถ๋ถ" |
| Negation | ๋ถ์ ํํ | "ํ์ง ์๋๋ค", "๋ถ๊ฐ๋ฅํ๋ค", "๊ฒฐ์ฝ" |
์ถ์ถ ๊ท์น
- ๋ช
์์ ์ผ๋ก ์์ ๋ ์๋ฏธ๋ง ์ถ์ถํ๋ค. ํ๊ฐ์ ์๋ฏธ๋ ํจ์๋ ์ถ์ถํ์ง ์๋๋ค.
- ๋จ๋ฝ๋น ์ต๋ 3๊ฐ ์ต์ปค๋ฅผ ์ถ์ถํ๋ค (๊ฒ์ฆ ๋น์ฉ ์ํ).
- ๊ฐ ์ต์ปค๋
{type, content, paragraph_index, polarity} ํํ๋ก ๊ธฐ๋กํ๋ค.
- ์ต์ปค ๋ชฉ๋ก์ ๋ด๋ถ ์์
๋ฉ๋ชจ๋ฆฌ์ด๋ฉฐ ์ฌ์ฉ์ ๋๋ฉด ์ถ๋ ฅ์ ํฌํจํ์ง ์๋๋ค.
- ์ต์ปค ๊ตฌ์กฐ๋ ์ธ์ด์ ๋ฌด๊ดํ๋ค. ์ถ์ถ์ ์๋ฌธ ์ธ์ด๋ก ์ํํ๋ค.
4.5b๋จ๊ณ: ํค ์๋ ๊ฐ์ง (Tone Auto-Detection)
์คํ ์กฐ๊ฑด: resolved_tone == "auto" ์ผ ๋๋ง ์คํํ๋ค. resolved_tone์ด null์ด๊ฑฐ๋ ๋ช
์ ํค(casual/professional)์ด๋ฉด ์ด ๋จ๊ณ๋ฅผ ๊ฑด๋๋ด๋ค.
์งง์ ์
๋ ฅ ์์ธ: ํ
์คํธ๊ฐ ๋จ๋ฝ < 2 OR ์ ์ฒด ๋ฌธ์ฅ < 2์ด๋ฉด ๊ฐ์ง๋ฅผ ์คํํ์ง ์๋๋ค โ professional ํค์ผ๋ก ๊ธฐ๋ก, tone_source: skipped_short_input, tone_confidence: low, tone_evidence: ["input too short"]. ์ด๊ฒ์ ํด๋ฐฑ์ด ์๋๋ผ ๊ฐ์ง ์์ ์ ํจ์ด๋ค (A5 ์๋ฐฐ ์๋). skipped_short_input ์ ๊ฐ์ง๋ฅผ ๊ฑด๋๋ด ๊ฒฝ์ฐ ์ ์ฉ ๋ผ๋ฒจ์ด๋ฉฐ, ๊ฐ์ง๊ฐ ์คํ๋์์ผ๋ ์๋ฅ ๊ท์น์ผ๋ก ๋จ์ด์ง ๊ฒฝ์ฐ(์๋ ์๋ฅ ๊ท์น ํญ๋ชฉ)์ ๋ช
ํํ ๊ตฌ๋ถ๋๋ค.
ํด๋ฆฌ์คํฑ ์ ํธ (๊ฐ ์ ํธ๊ฐ ํธ๋ฆฌ๊ฑฐ๋๋ฉด ํด๋น tone ๋ฒํท์ +1์ ):
| ์ ํธ | ํธ๋ฆฌ๊ฑฐ ์กฐ๊ฑด | ๊ท์ ํค |
|---|
| ์ดํ: casual-ko | ์ง์ง, ์์งํ, ๊ทผ๋ฐ, ๋ญ, ์ด, ๊ฑ, ์ข, ๊ทธ๋ฅ, ใ
, ใ
์ค 3๊ฐ ์ด์ | casual |
| ์ดํ: casual-en | ์ถ์ฝํ(don't, I'm, it's, can't, won't) 2๊ฐ ์ด์ OR honestly, actually, kinda, tbh ๋ฑ์ฅ | casual |
์๋ฅ(residual) ๊ท์น: ์ ์ ํธ ์ค ์ด๋ ๋ฒํท๋ ์๊ณ๊ฐ(1์ )์ ๋๊ธฐ์ง ๋ชปํ๋ฉด โ professional (์ค๋ฆฝ ๊ธฐ๋ณธ๊ฐ).
tone_source: auto (๊ฐ์ง๋ ์คํ๋์์ โ short-input ์ skipped_short_input ๊ณผ ๊ตฌ๋ถ)
tone_evidence: ["no signal cluster reached threshold; residual default"]
tone_confidence: low
์ ๋ขฐ๋ ๋ฒํท:
high: top-bucket score >= 2 ร runner-up
medium: top-bucket score >= 1.3 ร runner-up
low: otherwise (์ฌ์ ํ ๋จ์ผ ํค์ผ๋ก ํ์ โ A5)
์ถ๋ ฅ: ๋ด๋ถ <detected-tone> ๋ธ๋ก์ผ๋ก๋ง ๊ธฐ๋ก. ์ฌ์ฉ์ ๋๋ฉด ๋ณธ๋ฌธ์ ์ ๋ ํฌํจํ์ง ์๋๋ค.
<detected-tone>
tone: casual
tone_source: auto
tone_evidence: ["casual-ko lexical hit: ์ง์ง/์์งํ/๊ทผ๋ฐ", "first-person-ratio: 0.62"]
tone_confidence: high
</detected-tone>
๊ฐ์ง ์๋ฃ ํ ๊ฒฐ๊ณผ ํค(casual/professional)์ ์ดํฌ(๋ ์ง์คํฐ)์๋ง ๋ฐ์ํ๋ค. ํค์ ํ๋กํ์ ๊ณ ๋ฅด์ง ์์ผ๋ฉฐ, ์ฅ๋ฅด ํ๋กํ์ --profile ๋ก๋ง ๊ฒฐ์ ๋๋ค (๋ฐฑ๋ณธ ๋งคํ ์ ๊ฑฐ, 6.0).
4.6๋จ๊ณ: ํต๊ณ ๊ธฐ๋ฐ ์์ฌ ๊ตฌ๊ฐ ํ์ง (Stylometric Suspect Zone Detection)
ํจํด ์นดํ๋ก๊ทธ๊ฐ ๋ช
๋ช
ํ์ง ๋ชปํ๋ ๋ถํฌ์ AI๋ค์(๊ท ์งํ ๋ฌธ์ฅ ๊ธธ์ด, ๋น์ฝํ ์ดํ ๋ค์์ฑ)์ ๊ฒฐ์ ๋ก ์ ํต๊ณ๋ก ๋ฏธ๋ฆฌ ํ์ํ๋ค. 4.5๋จ๊ณ ์๋ฏธ ์ต์ปค์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด ๊ฒฐ๊ณผ๋ ๋ด๋ถ ์์
๋ฉ๋ชจ๋ฆฌ์ด๋ฉฐ ์ฌ์ฉ์ ๋๋ฉด ์ถ๋ ฅ์ ํฌํจํ์ง ์๋๋ค.
๊ฑด๋๋ ์กฐ๊ฑด
์ฃผ์: ํ
์คํธ๊ฐ ๋จ๋ฝ โค2 ๋๋ ์ ์ฒด ๋ฌธ์ฅ โค2 ์ด๋ฉด 4.6๋จ๊ณ๋ฅผ ํต์งธ๋ก ๊ฑด๋๋ด๋ค (4.5๋จ๊ณ์ ๋์ผ ์๊ณ).
์ธ์ด ์ ํ: stylometry.languages ์ค์ ์ ํฌํจ๋ ์ธ์ด์์๋ง ์คํํ๋ค. ๊ธฐ๋ณธ๊ฐ์ [ko, en, zh, ja]. ์ฒ๋ฆฌ ์ธ์ด๊ฐ zh ๋๋ ja ์ธ ๊ฒฝ์ฐ whitespace ๋จ์ด๊ฐ ์๋๋ผ ๋ฌธ์ ํ ํฐ fallback์ผ๋ก 4.6๋จ๊ณ๋ฅผ ์คํํ๋ค.
๋ฉํธ๋ฆญ ์ ์
์ ์ฒด ์๊ณ ๋ฆฌ์ฆ ์ ์๋ core/stylometry.md๋ฅผ ์ฐธ์กฐํ๋ค. ํต์ฌ ๊ณต์๋ง ์ธ๋ผ์ธ์ผ๋ก ์ ์ํ๋ค.
Tokenization โ ko/en์ whitespace ๊ธฐ์ค ๋ถํ + edge-punctuation strip(ko=์ด์ , en=๋จ์ด)์ ์ฌ์ฉํ๋ค. zh/ja๋ Han/Kana ๋ฌธ์์ ASCII run์ ํ ํฐ์ผ๋ก ์ผ๋ deterministic character-token fallback์ ์ฌ์ฉํ๋ค. ํํ์ ๋ถ์๊ธฐ ๋ฏธ์ฌ์ฉ.
Korean advisory metadata (translationese, koPostEditese.v1)
Korean deterministic analysis may surface analysis.translationese and top-level koPostEditese / koPostEditese.v1 as rewrite editing hints: calque candidates, literal pronouns, by-passives, double particles, uniform endings, rhythm, and suffix-diversity proxies. These hints are advisory context only for natural Korean editing and are separate from the 4.6/4.7 hot-zone computation. They must not feed or alter score, hot ํ์ , gates, benchmark claims, severity, z-score/baseline/percentile logic, prompt/rewrite gates, or authorship verdicts.
Burstiness (CV, ๋ฌธ์ฅ ๊ธธ์ด ๋ณ๋์ฑ)
sentence_token_counts = [len(tokens) for sentence in paragraph]
mean = sum(...) / N
stddev = sqrt(sum((x - mean)^2) / N) # population stddev
burstiness_CV = stddev / mean
๋ฐด๋: low < 0.30 / 0.30 โค mid โค 0.50 / high > 0.50. (v3.5.1 calibration)
MATTR (Moving Average TTR, ์ดํ ๋ค์์ฑ)
window = 50 tokens
lower_tokens = [token.lower() for token in paragraph_tokens]
ratios = [len(set(slice)) / window for slice in sliding_window(lower_tokens, 50)]
MATTR = mean(ratios)
# fallback: len(tokens) < 50 ์ด๋ฉด simple TTR (unique / total)
๋ฐด๋: low < 0.55 / 0.55 โค mid โค 0.70 / high > 0.70. lowercase ์ธ ์ถ๊ฐ ์ ๊ทํ ์์ (no stemming/lemmatization).
Hot ํ์ ๊ท์น (4.6 ๋จ๋
์ ํธ)
paragraph is SUSPECT iff burstiness_band == "low" OR MATTR_band == "low"
์ฃผ์: ์ 2์ ํธ๋ 4.6๋จ๊ณ๊ฐ ๋จ๋
์ผ๋ก ๊ณ์ฐํ๋ ๋ถ๋ถ ๊ท์น์ด๋ค. ์ต์ข
hot ํ์ ์ 4.7๋จ๊ณ์ ํตํฉ OR ๊ท์น(lexicon, KO ์ง๋จ ๋ณตํฉ, discourse tells, ending monotony, ๋ฌธ์ ๋ ๋ฒจ ์ ํธ ํฌํจ)์ผ๋ก ๊ฒฐ์ ๋๋ค.
Sentence Zoom
hot ๋จ๋ฝ ๋ด๋ถ์์ ์ธ์ ๋ฌธ์ฅ ํ ํฐ ์ ์ฐจ์ด < 20% ์ธ ์ฐ์ ๋ฌธ์ฅ์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด sub-flag ์ผ๋ก ํ๊ธฐํ๋ค.
LLM ์ ๋ฌ ํ์
์๋ฌธ ํ
์คํธ ์๋จ์ meta block ์ ์ฝ์
ํ๊ณ , hot ๋จ๋ฝ ๋ณธ๋ฌธ ์ฒซ๋จธ๋ฆฌ์ prefix ํ ํฐ์ ๋ถ์ฐฉํ๋ค.
Meta Block (์)
<suspect-zones lang="ko">
- P2: burstiness=0.18 (low), MATTR=0.48 (low) โ ๋ฌธ์ฅ ๊ธธ์ด ๊ท ์ง, ์ดํ ๋ฐ๋ณต ๋ค์
- P2.S2-S4: ์ธ์ ๋ฌธ์ฅ ํ ํฐ ์ ๋์ผ
</suspect-zones>
Body Prefix (์)
ยซP2 SUSPECTยป ์ด ๋๊ตฌ๋ ๋จ์ํ ์๋์์ฑ์ ๋์ด์ ๋ค. ...
ํ์ดํ๋ผ์ธ ๊ฒฐํฉ
- 5a ๋จ๊ณ: ์
๋ ฅ์ meta block + prefix ๊ฐ ํฌํจ๋ ์ํ๋ก ์ ๋ฌ๋๋ค. hot ๋จ๋ฝ์ด ์ฐ์ ๊ฒํ ๋์์ด๋ค.
- 5b ๋จ๊ณ: ๋์ผ ์
๋ ฅ์ ๋ฐ๋๋ค. hot ๋ฌธ์ฅ ๊ทธ๋ฃน์ด ์ฐ์ ์ฌ์์ฑ ๋์์ด๋ค.
- 5c ๋จ๊ณ: ์ต์ข
์ถ๋ ฅ์์ meta block ๊ณผ prefix ๊ฐ ๋ชจ๋ ์ ๊ฑฐ๋์๋์ง ํ์ธํ๋ค. ์ฒ๋ฆฌ๋์ง ์์ hot zone ์ด ์์ผ๋ฉด ๊ฒฝ๊ณ ํ๋ค (๊ฐ์ ์ฌ์ฒ๋ฆฌ๋ v1 ๋ฒ์ ๋ฐ).
์ฃผ์: suspect zone ์ ๋ณด๋ ์ฌ์ฉ์ ๋๋ฉด ์ถ๋ ฅ์ ๋
ธ์ถํ์ง ์๋๋ค. 4.5๋จ๊ณ anchor ์ ๋์ผํ "๋ด๋ถ ์์
๋ฉ๋ชจ๋ฆฌ" ์ ์ฑ
์ด๋ค.
4.7๋จ๊ณ: AI-lexicon ๋งค์นญ (AI-Lexicon Overlap Detection)
28-ํจํด ์นดํ๋ก๊ทธ๊ฐ ๋ช
๋ช
ํ์ง ๋ชปํ๋ AI ํน์ ์ด๊ตฌ(์: transformative, cutting-edge, unlock the potential, ์๋ฆฌ๋งค๊น, ๊ฒฐ๋ก ์ ์ผ๋ก)๋ฅผ ํ๋ฉด ์ฌ์ (flat dictionary)์ผ๋ก ์ถ๊ฐ ๋งค์นญํ๋ค. 4.6๋จ๊ณ๊ฐ ๋ถํฌ์ ์ ํธ(๋ฌธ์ฅ ๊ธธ์ด ๊ท ์ง, ์ดํ ๋ฐ๋ณต)๋ผ๋ฉด, 4.7๋จ๊ณ๋ ์ดํ์ ์ ํธ โ ๋ค๋ฅธ ์ถ์ด๋ผ OR ๊ฒฐํฉ์ผ๋ก ํฉ์ฐ ํจ๊ณผ๋ฅผ ๋ธ๋ค. 4.5/4.6๋จ๊ณ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฒฐ๊ณผ๋ ๋ด๋ถ ์์
๋ฉ๋ชจ๋ฆฌ์ด๋ฉฐ ์ฌ์ฉ์ ๋๋ฉด ์ถ๋ ฅ์ ํฌํจํ์ง ์๋๋ค. (v2.0 ๋ ์์ฝ๋ถํฐ ์ธ๋ถ ๊ฒ์ฆ๋ ๊ณ ์ ๋ฐ ์นดํ๋ก๊ทธ ์ต์ปค๋ ์ฌ์ ์ ์ค๋ณต ์๋ก๋๋ค โ lexicon/ai-ko.md ํค๋ ์ฐธ์กฐ.)
๊ฑด๋๋ ์กฐ๊ฑด
์ฃผ์: ํ
์คํธ๊ฐ ๋จ๋ฝ โค2 ๋๋ ์ ์ฒด ๋ฌธ์ฅ โค2 ์ด๋ฉด 4.7๋จ๊ณ๋ฅผ ํต์งธ๋ก ๊ฑด๋๋ด๋ค (4.6๋จ๊ณ์ ๋์ผ ์๊ณ).
์ธ์ด ์ ํ: lexicon.languages ์ค์ ์ ํฌํจ๋ ์ธ์ด์์๋ง ์คํํ๋ค. ๊ธฐ๋ณธ๊ฐ์ [en, ko, zh, ja]. zh/ja๋ character-token fallback ํน์ฑ์ ๊ธฐ๋ณธ ์ฌ์ ์ phrase-only๋ก ์ ์งํ๋ค.
์ฌ์ ๋ก๋
Glob lexicon/ai-{lang}.md โ Read
Glob custom/lexicon/ai-{lang}.md โ Read (์ฌ์ฉ์ ์ปค์คํ
์ฐ์ )
๊ฐ lexicon ํ์ผ์ ๋ ์น์
์ผ๋ก ๊ตฌ์ฑ๋๋ค:
## Strict matches: ๋์๋ฌธ์ ๋ฌด์ whole-word ๋งค์นญ (CJK ko/zh/ja๋ substring ๊ทผ์ฌ)
## Multi-word phrases: ๋์๋ฌธ์ ๋ฌด์ substring ๋งค์นญ. ~ placeholder ๋ wildcard ๋ก ์ทจ๊ธ
์๊ณ ๋ฆฌ์ฆ
For paragraph P with tokens T:
matches = lexicon entries that appear in P (entry ๋จ์ ์นด์ดํธ, ์ค๋ณต ๋ฏธํฉ์ฐ)
density = matches / len(T) * 1000 # matches per 1000 tokens
hot iff density > lexicon.density_threshold
AND matches >= lexicon.min_hot_matches
๊ธฐ๋ณธ threshold = 3.0, min_hot_matches ๊ธฐ๋ณธ๊ฐ = en 1, ko/zh/ja 2. CJK๋ ์งง์ ๋จ๋ฝ์์ ํํธ 1๊ฐ๋ง์ผ๋ก density๊ฐ 3.0์ ์ฝ๊ฒ ๋์ผ๋ฏ๋ก ์ต์ ๋งค์น ์๋ฅผ ์๊ตฌํ๋ค โ ํํธ 1๊ฐ์ง๋ฆฌ ๋จ๋ฝ์ hot์ด ์๋๋ผ audit ํํธ๋ก๋ง ์ทจ๊ธํ๋ค. .patina.default.yaml์ lexicon.density_threshold๋ก threshold ์กฐ์ ๊ฐ๋ฅ.
Hot ๊ฒฐ์ ๊ท์น (ํตํฉ OR โ analyzeText()์ ๋์ผ)
paragraph is SUSPECT iff
burstiness_band == "low"
OR MATTR_band == "low"
OR (lexicon_density > lexicon.density_threshold
AND lexicon_matches >= lexicon.min_hot_matches)
OR (ko ์ ์ฉ) ko_diagnostics_hot
: 3์ ํธ ๋ณตํฉ โ ๊ท ์ผ ์ด์ ๊ธธ์ด AND ๋ฎ์ ์ผํ ๋ฐ๋ AND ๋ฎ์ ์ ๋ฏธ ํด๋์ค ๋ค์์ฑ
(์ ๋ถ ์ถฉ์กฑํด์ผ ๋ฐํ; ์์ธ ์๊ณ๋ core/stylometry.md)
OR fake_candor_hot
: ๋ฌธ์ ๊ฒ์ดํธ(๊ฐ์ง ์์ง์ฒด ์คํ๋ ๋ฌธ์ ์ ์ฒด >= 2) AND ์ด ๋จ๋ฝ์ ํด๋น ์คํ๋ >= 1
OR thematic_break_hot
: ๋ฌธ์ ๊ฒ์ดํธ(--- ๋ฅ ๊ตฌ๋ถ์ ๋ฌธ์ ์ ์ฒด >= 3) AND ์ด ๋จ๋ฝ์ ๊ตฌ๋ถ์ >= 1
OR (ko ์ ์ฉ) ending_monotony
: ํ์ํ '-๋ค' ๋น์จ >= 0.6 AND '-๋ค' ๋ฌธ์ฅ ์ >= 2
AND burstiness CV < low AND ๋จ๋ฝ ํ ํฐ >= 20
document is SUSPECT iff
markup_leakage_detected # ๋ชจ๋ธ ์ถ๋ ฅ ๋งํฌ์
์์ฌ (๊ทผ์ฆ๊ฑฐ, ๋ฌธ์ ๋ ๋ฒจ ๋จ๋
๋ฐํ)
OR structural_classifier_hot # ํ๋ผ์ด๋น ๊ตฌ์กฐ ๋ถ๋ฅ๊ธฐ (์ค์น๋ ๊ฒฝ์ฐ์๋ง)
OR any paragraph SUSPECT
๊ถ์ ๊ท์น: ์ด ํ๋ก์ฆ์ ๊ตฌํ์ด ์ด๊ธ๋๋ฉด src/features/index.js#analyzeText()์ core/stylometry.md๊ฐ ์ฐ์ ํ๋ค. ์ฌ๊ธฐ ๋ธ๋ก์ ๊ทธ ๊ตฌํ์ ์์ฝ ๋ฏธ๋ฌ๋ค.
๊ฐ ์ ๋ฉ๋ชจ:
ko_diagnostics_hot์ 4.6/4.7์ hot ํ์ ์ ์ฐธ์ฌํ๋ ๊ฒฐ์ ๋ก ๋ณตํฉ ์ ํธ๋ค. 215ํ์ Korean advisory metadata(translationese, koPostEditese)์ ํผ๋ ๊ธ์ง โ ๊ทธ์ชฝ์ ํธ์ง ํํธ ์ ์ฉ์ด๋ฉฐ hot ํ์ ์ ๊ด์ฌํ์ง ์๋๋ค.
fake_candor / thematic_break๋ ๋ฌธ์ ๋ ๋ฒจ ๋ฐ๋ ๊ฒ์ดํธ๊ฐ ์ด๋ฆฐ ๊ฒฝ์ฐ์๋ง ํด๋น tell์ ์ค์ ๋จ๋ฝ์ ๊ท์๋๋ค. ์์ธ ๊ท์นยท์คํ๋ ๋ชฉ๋ก์ core/stylometry.md.
- (ko ์ ์ฉ)
ending_monotony: ํํํ ํ๋ค์ฒด(ํ์ํ -๋ค)๋ฅผ ๊ท ์ผํ ๋ฌธ์ฅ ๊ธธ์ด๋ก ์ฐ๋ ์งง์ AI ํ๊ตญ์ด๋ฅผ ์ก๋, ๋ฌธ์ฅ ๊ธธ์ด ๋ณ๋์ด ํฐ ๊ฒฉ์ ์ฌ๋ ํ๊ตญ์ด์ ๋ํ์ฒด(์/์ต๋๋ค)๋ ๋ฐฐ์ ํ๋ค. 3๋ฌธ์ฅ ๋ฏธ๋ง์ด๋ผ burstiness band gate๊ฐ ๋นํ์ฑ์ธ ๋จ๋ฝ๋ ํฌํจํ๋ ์ด๋จ๋ฌธ ์คํ ๋ฐฉ์ง๋ฅผ ์ํด ๋จ๋ฝ ํ ํฐ 20๊ฐ ์ด์์ ์๊ตฌํ๋ค. ์์ธ๋ core/stylometry.md ์ฐธ์กฐ.
LLM ์ ๋ฌ ํ์ ํ์ฅ
๊ธฐ์กด <suspect-zones> meta block (4.6๋จ๊ณ ์ถ๋ ฅ) ์ lexicon hit entry ๋ฅผ ์ถ๊ฐํ๋ค. ๋ณ๋ block ์ ๋ง๋ค์ง ์๋๋ค.
<suspect-zones lang="ko">
- P1: burstiness=0.18 (low) โ ๋ฌธ์ฅ ๊ธธ์ด ๊ท ์ง
- P2: lexicon_density=97.6/1000 (matches=4) โ AI-lexicon hits: "๊ฒฐ๋ก ์ ์ผ๋ก, ์ค์ํฉ๋๋ค., ํ์๊ฐ ์์ต๋๋ค"
- P3: burstiness=0.22 (low), lexicon_density=31.0/1000 (matches=2) โ ๊ท ์ง + AI ์ดํ ๋ค์
</suspect-zones>
๊ท์น:
- lexicon hit์ด ์๋ ๋จ๋ฝ์ ๋งค์นญ๋ entry ์ค ์ต๋ 5๊ฐ๋ฅผ ์งง์ ์ธ์ฉ์ผ๋ก ํ๊ธฐ
- burstiness/MATTR hot ๊ณผ lexicon hot ์ด ๋์ ๋ฐํํ๋ฉด ํ ์ค์ ํฉ์ณ์ ํ๊ธฐ
- 4.6๋จ๊ณ์
ยซP{n} SUSPECTยป body prefix ๋ lexicon-only hot ๋จ๋ฝ์๋ ๋์ผํ๊ฒ ์ ์ฉ
์ ์ฒด ์๊ณ ๋ฆฌ์ฆ๊ณผ calibration ๊ทผ๊ฑฐ๋ core/stylometry.md ยง16 ์ฐธ์กฐ.
์ฃผ์: lexicon ๋งค์นญ ๊ฒฐ๊ณผ๋ ์ฌ์ฉ์ ๋๋ฉด ์ถ๋ ฅ์ ๋
ธ์ถํ์ง ์๋๋ค. 4.5/4.6๋จ๊ณ์ ๋์ผํ "๋ด๋ถ ์์
๋ฉ๋ชจ๋ฆฌ" ์ ์ฑ
์ด๋ค.
4.8๋จ๊ณ: ๋ฌธ์ ๋ธ๋ฆฌํ (Document Brief)
๋ธ๋ก ๋จ์ ํจ๋ฌํ๋ ์ด์ฆ๋ ๋ชจ๋ธ ๊ธฐ๋ณธ ๋งํฌ๋ก ํ๊ทํด ๊ฒฐ๊ณผ๊ฐ ์ฌ์ ํ AI์ค๋ฝ๋ค. ์ฌ์์ฑ ์ ์ ๊ธ ์ ์ฒด๋ฅผ ํ ๋ฒ ์ฝ๊ณ ์ ์ญ ํ๋ ์์ ๊ณ ์ ํ๋ค.
ํ์
ํญ๋ชฉ (๊ฐ ํ ์ค, ๋ด๋ถ ์์
๋ฉ๋ชจ๋ฆฌ):
- ๋ฌธ์ ์ข
๋ฅ โ ๋๋ฉํ์ด์ง / ๋ธ๋ก๊ทธ / ๊ณต์ง / ๋ฌธ์ / ์์ธ์ด ์ค ๋ฌด์์ธ๊ฐ
- ํ์์ ๋
์ โ ๋๊ฐ ๋๊ตฌ์๊ฒ ๋งํ๋ ๊ธ์ธ๊ฐ
- ์ง๋ฐฐ ์ดํฌ โ ํด์์ฒด / ํฉ์ผ์ฒด(-์ต๋๋ค) / ํ์์ฒด(-๋ค) ์ค ์ด๋ ๊ฒ์ด ์ง๋ฐฐ์ ์ธ๊ฐ. ํ๊ตญ์ด๋ ๋ฌธ์ฅ ์ข
๊ฒฐ์ด๋ฏธ ๋ถํฌ๋ฅผ ์ง์ ์ธ์ด ํ์ ํ๋ค(-๋๋ค/-๋๊น โ ํฉ์ผ์ฒด, -์/-์ฃ โ ํด์์ฒด, ๊ทธ ์ธ -๋ค โ ํ์์ฒด). 60% ์ด์ ์ ์ ํ ์ดํฌ๊ฐ ์์ผ๋ฉด "ํผํฉ"์ผ๋ก ํ์ ํ๊ณ , ๋ฌธ์ ์ฑ๊ฒฉ์ ๋ง๋ ์ดํฌ ํ๋๋ฅผ ์ ํํ๋ค
- ํต์ฌ ๋๋ฉ์ธ ์ฉ์ด โ ๊ธ์ด ๋ฐ๋ณต ์ฌ์ฉํ๋ ๊ณ ์ ํํ ๋ชฉ๋ก
5๋จ๊ณ ์ ์ฉ ๊ท์น:
- 5a/5b์ ๋ชจ๋ ์ฌ์์ฑ์ ์ด ๋ธ๋ฆฌํ ํ๋ ์ ์์์ ์ํํ๋ค
- ์ฌ์์ฑ ๋ฌธ์ฅ ์ ์ฒด๋ฅผ ์ง๋ฐฐ ์ดํฌ ํ๋๋ก ํต์ผํ๋ค โ ๋ฌธ์ฅ ๊ฐ ์ดํฌ ํผ์ฉ ์์ฒด๊ฐ AI ์ ํธ๋ค
- ํต์ฌ ์ฉ์ด๋ ์ผ๋ฐ ๋์์ด๋ก ์นํํ์ง ์๊ณ ๊ธ์ ํํ์ ๊ทธ๋๋ก ์ฌ์ฌ์ฉํ๋ค
--tone ์ด ๋ช
์๋ ๊ฒฝ์ฐ(4.5b ์ฐธ์กฐ) ํค์ ๊ทธ ์ง์๋ฅผ ๋ฐ๋ฅด๋, ์ดํฌ ํต์ผ ๊ท์น์ ๋์ผํ๊ฒ ์ ์ฉํ๋ค
์ฃผ์: ๋ธ๋ฆฌํ๋ 4.5๋จ๊ณ ์ต์ปค์ ๋์ผํ ๋ด๋ถ ์์
๋ฉ๋ชจ๋ฆฌ๋ค. ์ฌ์ฉ์ ๋๋ฉด ์ถ๋ ฅ์ ํฌํจํ์ง ์๋๋ค.
CLI ๋๊ธฐํ: Node CLI๋ ๊ฐ์ ๋จ๊ณ๋ฅผ ํ๋กฌํํธ๋ก ์ํํ๋ค โ ์ง๋ฐฐ ์ดํฌ๋ src/features/stylometry.js#detectKoreanRegister๊ฐ ๊ฒฐ์ ๋ก ์ผ๋ก ์ธก์ ํด "๋ฌธ์ ์ ํธ" ์น์
์ผ๋ก ์ฃผ์
ํ๊ณ , ๋ธ๋ฆฌํ ์ง์๋ rewrite ํ๋กฌํํธ(minimalยทstrict ๋ชจ๋)์ ํฌํจ๋๋ค.
Ouroboros ๋ฃจํ (--ouroboros)
--ouroboros ํ๋๊ทธ๊ฐ ์๊ฑฐ๋ ouroboros.enabled: true์ด๋ฉด, ์๋ ๋ฃจํ๊ฐ 5๋จ๊ณ์ 6๋จ๊ณ๋ฅผ ๊ฐ์ผ๋ค.
1~4๋จ๊ณ(์ค์ , ํจํด, ํ๋กํ, ๋ชฉ์๋ฆฌ ๋ก๋)๋ ํ ๋ฒ๋ง ์คํํ๋ค.
์ ์ฐจ
-
์ด๊ธฐ ์ ์ ์ธก์ : ์
๋ ฅ ํ
์คํธ์ ๋ํด score ์๊ณ ๋ฆฌ์ฆ(6๋จ๊ณ score ๋ชจ๋)์ ์คํํ์ฌ ์ด๊ธฐ ์ ์๋ฅผ ์ฐ์ถํ๋ค
- ์ด๊ธฐ ์ ์๊ฐ ์ด๋ฏธ target-score ์ดํ์ด๋ฉด "์ด๋ฏธ ๋ชฉํ ๋ฌ์ฑ"์ผ๋ก ์ฆ์ ์ข
๋ฃํ๋ค
-
๋ฐ๋ณต ์คํ (iteration = 1๋ถํฐ):
a. 5a๋จ๊ณ(๊ตฌ์กฐ) โ 5b๋จ๊ณ(๋ฌธ์ฅ/์ดํ) โ 5c๋จ๊ณ(์๊ธฐ๊ฒ์) ํ์ดํ๋ผ์ธ์ ์คํํ๋ค
b. ๊ต์ ๋ ํ
์คํธ์ ๋ํด score ์๊ณ ๋ฆฌ์ฆ์ ๋ค์ ์คํํ๋ค
c. delta = ์ด์ ์ ์ - ํ์ฌ ์ ์ (์์ = ๊ฐ์ )
d. ์ข
๋ฃ ์กฐ๊ฑด์ ํ์ธํ๋ค:
- ํ์ฌ ์ ์ โค target-score โ ์ข
๋ฃ ์ฌ์ : ๋ชฉํ ๋ฌ์ฑ
- delta < 0 (์ ์๊ฐ ์คํ๋ ค ์ฌ๋ผ๊ฐ) โ ์ข
๋ฃ ์ฌ์ : ์ ์ ํ๊ท โ ์ด์ ๋ฐ๋ณต ๊ฒฐ๊ณผ๋ก ๋กค๋ฐฑ
- 0 โค delta โค plateau-threshold โ ์ข
๋ฃ ์ฌ์ : ๊ฐ์ ์ ์ฒด
- iteration โฅ max-iterations โ ์ข
๋ฃ ์ฌ์ : ๋ฐ๋ณต ์ํ
- ์ถฉ์ค๋ ์ ์ < fidelity-floor (๊ธฐ๋ณธ: 70) โ ์ข
๋ฃ ์ฌ์ : ์ถฉ์ค๋ ํํ ์๋ฐ โ ์ด์ ๋ฐ๋ณต ๊ฒฐ๊ณผ๋ก ๋กค๋ฐฑ
- MPS < mps-floor (๊ธฐ๋ณธ: 70) โ ์ข
๋ฃ ์ฌ์ : ์๋ฏธ ๋ณด์กด ํํ ์๋ฐ โ ์ด์ ๋ฐ๋ณต ๊ฒฐ๊ณผ๋ก ๋กค๋ฐฑ
e. ์ข
๋ฃ ์กฐ๊ฑด ๋ฏธ์ถฉ์กฑ ์ ๊ต์ ๋ ํ
์คํธ๋ฅผ ์
๋ ฅ์ผ๋ก ๋ค์ ๋ฐ๋ณต
-
์ถ๋ ฅ ํ์:
Ouroboros ๋ฐ๋ณต ๋ก๊ทธ
| ๋ฐ๋ณต | ์ ์ (์ ) | ์ ์ (ํ) | ๊ฐ์ ๋ | ์ข
๋ฃ ์ฌ์ |
|---|
| 0 | โ | 78 | โ | ์ด๊ธฐ ์ธก์ |
| 1 | 78 | 45 | +33 | |
| 2 | 45 | 28 | +17 | ๋ชฉํ ๋ฌ์ฑ |
์ต์ข
๊ฒฐ๊ณผ
- ์ต์ข
์ ์: 28/100 (ยฑ10)
- ๋ฐ๋ณต ํ์: 2/3
- ์ข
๋ฃ ์ฌ์ : ๋ชฉํ ๋ฌ์ฑ (target: 30)
[์ต์ข
๊ต์ ํ
์คํธ]
์ฃผ์: --ouroboros๋ rewrite ์ถ๋ ฅ์ ๊ธฐ๋ณธ์ผ๋ก ํ๋ค. --diff, --audit, --score์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค.
Strict ๋ชจ๋ (๋ค์ค ํจ์ค) (--strict)
--strict ํ๋๊ทธ๊ฐ ์์ผ๋ฉด ์๋ 5๋จ๊ณ ํจ์ค๋ฅผ ์์ฐจ์ ์ผ๋ก ์ํํ๋ค. 1~4๋จ๊ณ(์ค์ , ํจํด, ํ๋กํ, ๋ชฉ์๋ฆฌ ๋ก๋)๋ ํ ๋ฒ๋ง ์คํํ๋ค.
์คํ ๋ชจ๋ (์๋ ์ ํ):
- ์์ ๋ชจ๋ (ํ๋ฌ๊ทธ์ธ ํ๊ฒฝ): patina ํ๋ฌ๊ทธ์ธ์ read-only ์๋ธ์์ด์ ํธ(
patina-detector, patina-fidelity-auditor, patina-naturalness-reviewer)๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉด, Task ๋๊ตฌ๋ก ๋ถ์ ํจ์ค P1/P3/P4๋ฅผ ๊ฐ ์๋ธ์์ด์ ํธ์ ์์ํ๋ค(๊ฒฉ๋ฆฌ๋ ์ปจํ
์คํธ). ์ค์ผ์คํธ๋ ์ด์
, ์ฌ์์ฑ(P2), ๊ฒ์ดํธ(P5)๋ ๋ฉ์ธ ์คํฌ์ด ๋ด๋นํ๋ค. ์๋ธ์์ด์ ํธ๋ read-only๋ผ ์ ๋ ํ
์คํธ๋ฅผ ์ง์ ์ฐ์ง ์๋๋ค.
- ์์ฒด ์๊ฒฐ ๋ชจ๋ (ํด๋ฐฑ): ์๋ธ์์ด์ ํธ๊ฐ ์์ผ๋ฉด(Codex/Cursor/OpenCode ๋๋ ๋นํ๋ฌ๊ทธ์ธ ์ค์น) ๋์ผ ์คํฌ ์์ด์ ํธ๊ฐ P1~P5๋ฅผ ๋ชจ๋ ์ธ๋ผ์ธ์ผ๋ก ์ํํ๋ค.
- ๋ ๋ชจ๋์ ํ์ ๊ธฐ์ค, floor, ๊ฒ์ดํธ ๋ก์ง์ ๋์ผํ๋ค. ์์์ ์ปจํ
์คํธ ๊ฒฉ๋ฆฌ๋ฅผ ์ํ ๊ฒ์ผ ๋ฟ ๊ฒฐ๊ณผ์ ์๋ฏธ๋ฅผ ๋ฐ๊พธ์ง ์๋๋ค. ์์ ํธ์ถ์ด ์คํจํ๋ฉด ํด๋น ํจ์ค๋ฅผ ์ธ๋ผ์ธ์ผ๋ก ํด๋ฐฑํ๋ค.
์ด๋๋ฐ์ด์ ๋ฆฌ ๋ฉํ๋ฐ์ดํฐ ๊ท์น: ํ๊ตญ์ด translationese ๋ฐ koPostEditese.v1 ์ ํธ๋ ์ด๋๋ฐ์ด์ ๋ฆฌ ์ ์ฉ์ด๋ค. ์ด ์ ํธ๋ Strict ๋ชจ๋ ๋ด์ ์ด๋ ํ ํจ์ค์์๋ ์ ์, hot ํ์ , ๊ฒ์ดํธ, ์ฌ๊ฐ๋, ๊ธฐ์ค์ /๋ฐฑ๋ถ์์, ๋ฒค์น๋งํฌ ์ฃผ์ฅ, ๋๋ ์ ์๊ถ ํ์ ์ ๋ฐ์๋์ด์๋ ์ ๋๋ค.
ํจ์ค ์ํ์ค
P1: ์ ์ฒด ๊ฐ์ง ํจ์ค (Detection Pass)
4.x๋จ๊ณ(4.5 ์๋ฏธ ์ต์ปค ์ถ์ถ, 4.5b ํค ๊ฐ์ง, 4.6 ํต๊ณ ๊ธฐ๋ฐ ์์ฌ ๊ตฌ๊ฐ, 4.7 AI-lexicon ๋งค์นญ, 4.8 ๋ฌธ์ ๋ธ๋ฆฌํ)๋ฅผ ์์ ํ ์คํํ๋ค. ๊ฒฐ๊ณผ๋ ์ฌ๊ฐ๋๊ฐ ๋ถ์ฌ๋ ๋ฐ๊ฒฌ ๋ชฉ๋ก(findings list)์ผ๋ก ์ ๋ฆฌํ๋ค.
์์ ๋ชจ๋: ์ด ํจ์ค๋ฅผ patina-detector ์๋ธ์์ด์ ํธ์ ์์ํ๋ค(๋ฐํ: ์ฌ๊ฐ๋๊ฐ ๋ถ์ฌ๋ ๋ฐ๊ฒฌ ๋ชฉ๋ก). ํด๋ฐฑ ๋ชจ๋์์๋ ๋ฉ์ธ ์คํฌ์ด ์ 4.x๋จ๊ณ๋ฅผ ์ง์ ์คํํ๋ค.
- ๊ฐ ๋ฐ๊ฒฌ ํญ๋ชฉ:
{paragraph_index, span, signal_type, severity} ํํ (๋ด๋ถ ์์
๋ฉ๋ชจ๋ฆฌ)
signal_type: burstiness_low | MATTR_low | lexicon_hot | pattern_match
- ๋ฐ๊ฒฌ์ด 0๊ฑด์ด๋ฉด ์ฆ์ ์ข
๋ฃ โ ์๋ฌธ์ ๊ทธ๋๋ก ์ถ๋ ฅํ๊ณ Strict ๋ชจ๋ ๊ฒฐ๊ณผ footer๋ฅผ ๋ถ์ธ๋ค
P2: ๊ทผ๊ฑฐ ๊ธฐ๋ฐ ์ฌ์์ฑ (Evidence-Based Rewrite)
P1 ๋ฐ๊ฒฌ ๋ชฉ๋ก์ ์
๋ ฅ์ผ๋ก, 5a๋จ๊ณ(๊ตฌ์กฐ ๋ถ์) โ 5b๋จ๊ณ(๋ฌธ์ฅ/์ดํ ํจํด) โ 5c๋จ๊ณ(์๊ธฐ๊ฒ์) ํ์ดํ๋ผ์ธ์ ์คํํ๋ค. ๋ฐ๊ฒฌ๋ ์คํฌ/์กด์ ํ์ ํด ๊ต์ ํ๋ค โ ๋ฐ๊ฒฌ์ด ์๋ ๊ตฌ๊ฐ์ ๊ฑด๋๋ฆฌ์ง ์๋๋ค.
P3: ์ถฉ์ค๋/MPS ๊ฐ์ฌ ํจ์ค (Fidelity & MPS Audit)
core/scoring.md ยงยง9-14์ ์ ์ฐจ์ ๋ฐ๋ผ P2 ์ถ๋ ฅ์ ์๋ฌธ๊ณผ ๋์กฐํ๋ค.
์์ ๋ชจ๋: ์ด ํจ์ค๋ฅผ patina-fidelity-auditor ์๋ธ์์ด์ ํธ์ ์์ํ๋ค(์
๋ ฅ: ์๋ฌธ + P2 ์ถ๋ ฅ, ๋ฐํ: PASS/NEEDS-ROLLBACK + ์๋ฐ ์คํฌ + {fidelity_score, mps_score}). ํด๋ฐฑ ๋ชจ๋์์๋ ๋ฉ์ธ ์คํฌ์ด ์ง์ ๋์กฐํ๋ค.
๊ฒ์ฆ ๋์:
- ์ฃผ์ฅ(Claims): ์ฌ์ค์ ์ฃผ์ฅ์ด ๋ณด์กด๋์๋๊ฐ
- ์์น(Numbers): ๋ชจ๋ ์ซ์ยท๋น์จยท์ธก์ ๊ฐ์ด ๊ทธ๋๋ก์ธ๊ฐ
- ๊ทน์ฑ(Polarity): ๊ธ์ /๋ถ์ /์ค๋ฆฝ ์
์ฅ์ด ๋ฐ์ ๋์ง ์์๋๊ฐ
- ์ธ๊ณผ(Causation): ์ธ๊ณผ ๊ด๊ณ๊ฐ ์๊ด ๊ด๊ณ๋ก ๋ฐ๋๊ฑฐ๋ ์ญ์ ๋์ง ์์๋๊ฐ
- ๊ณ ์ ๋ช
์ฌ(Named Entities): ์ธ๋ช
ยท์ง๋ช
ยท๋ธ๋๋๋ช
ยท์ ํ๋ช
์ด ๊ทธ๋๋ก์ธ๊ฐ
- ์ง์ ์ธ์ฉ(Quotes): ํฐ๋ฐ์ดํ ์์ ๋ด์ฉ์ด ๋ณ๊ฒฝ๋์ง ์์๋๊ฐ
๊ฒฐ๊ณผ: {fidelity_score, mps_score} (๋ด๋ถ ์์
๋ฉ๋ชจ๋ฆฌ)
P4: ์์ฐ์ค๋ฌ์ ์ฌ์ค์บ (Naturalness Re-Scan)
P2 ์ถ๋ ฅ์ 4.6/4.7๋จ๊ณ์ ํต๊ณ ๊ฐ์ง์ AI-lexicon ๋งค์นญ์ ์ฌ์คํํ์ฌ ์๋ฅ hot ์กด๊ณผ ๊ณผ์ ํธ์ง ์ฌ๋ถ๋ฅผ ํ์ธํ๋ค.
์์ ๋ชจ๋: ์ด ํจ์ค๋ฅผ patina-naturalness-reviewer ์๋ธ์์ด์ ํธ์ ์์ํ๋ค(๋ฐํ: ์๋ฅ hot ์กด + ๊ณผ์ ํธ์ง ์ฌ๋ถ + AโD ๋ฑ๊ธ). ํด๋ฐฑ ๋ชจ๋์์๋ ๋ฉ์ธ ์คํฌ์ด ์ง์ ์ฌ์ค์บํ๋ค.
- ์๋ฅ hot ์กด: P1์์ ๊ฐ์ง๋ ์คํฌ์ด P2 ์ดํ์๋ ์ฌ์ ํ hot์ด๋ฉด ์๋ฅ๋ก ๊ธฐ๋ก
- ๊ณผ์ ํธ์ง ๊ฐ์ง: ๋ณ๊ฒฝ๋ ํ ํฐ ์ / ์๋ฌธ ํ ํฐ ์ > 0.50์ด๋ฉด ๊ณผ์ ํธ์ง ๊ฒฝ๊ณ
๊ฒฐ๊ณผ: {residual_hot_zones: [...], over_edit: bool} (๋ด๋ถ ์์
๋ฉ๋ชจ๋ฆฌ)
P5: ์๋ฝ/์ฌ์๋/๋กค๋ฐฑ ๊ฒ์ดํธ (Accept / Retry / Rollback Gate)
floors (ouroboros์ ๋์ผ):
fidelity_floor = 70
mps_floor = 70
accept ์กฐ๊ฑด (๋ชจ๋ ์ถฉ์กฑ):
fidelity_score >= fidelity_floor
AND mps_score >= mps_floor
AND residual_hot_zones == []
AND over_edit == false
โ ACCEPT: P2 ์ถ๋ ฅ์ ์ต์ข
๊ฒฐ๊ณผ๋ก ํ์ ํ๋ค
retry ์กฐ๊ฑด (accept ์คํจ ์, ์ฌ์๋ ํ์ < 3):
offending ์คํฌ๋ง ๊ฒฉ๋ฆฌํ์ฌ P2โP3โP4๋ฅผ ์ฌ์คํํ๋ค
์ฌ์๋๋ง๋ค retry_count += 1
retry_count ์ํ: 3ํ
rollback ์กฐ๊ฑด (retry ์ํ ์ด๊ณผ ๋๋ retry ํ์๋ accept ์คํจ):
offending ์คํฌ์ ๊ต์ ์ ์ทจ์ํ๊ณ ํด๋น ๊ตฌ๊ฐ์ ์๋ฌธ์ผ๋ก ๋ณต์ํ๋ค
๋๋จธ์ง ํต๊ณผ๋ ์คํฌ์ ๊ต์ ์ ์ ์งํ๋ค
๋กค๋ฐฑ ์ฌ์ ๋ฅผ footer์ ๋ณด๊ณ ํ๋ค
์ถ๋ ฅ ํ์
P5 ๊ฒ์ดํธ ๊ฒฐ๊ณผ ์ดํ ์ต์ข
๊ต์ ํ
์คํธ์ ํจ๊ป ๋ค์ footer๋ฅผ ์ถ๋ ฅํ๋ค (6๋จ๊ณ ๊ณตํต YAML footer์ ์ถ๊ฐ):
---
strict_mode: true
passes: [P1, P2, P3, P4, P5]
fidelity_score: <๊ฐ>
mps_score: <๊ฐ>
residual_hot_zones: <๊ฐ์>
over_edit: <true|false>
retries: <ํ์>
rollback_spans: <๋กค๋ฐฑ๋ ์คํฌ ์ ๋๋ 0>
gate_result: accept | rollback
---
์ฐธ๊ณ : --strict๋ --ouroboros์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค. ์ด ๊ฒฝ์ฐ P5 ๊ฒ์ดํธ๋ฅผ ํต๊ณผํ ์ต์ข
์ถ๋ ฅ์ด ouroboros ๋ฃจํ์ ์
๋ ฅ์ผ๋ก ์ฌ์ฉ๋๋ค.
๋ฐฐ์น ๋ชจ๋ (--batch)
--batch ํ๋๊ทธ๊ฐ ์์ผ๋ฉด ์๋ ์ ์ฐจ๋ฅผ ๋ฐ๋ฅธ๋ค. 1~4๋จ๊ณ(์ค์ , ํจํด, ํ๋กํ, ๋ชฉ์๋ฆฌ ๋ก๋)๋ ํ ๋ฒ๋ง ์คํํ๋ค.
์
๋ ฅ
Glob {์ง์ ๋ ํ์ผ ํจํด} โ ํ์ผ ๋ชฉ๋ก ํ๋ณด
ํ์ผ ํฌ๊ธฐ ์ ํ: 50KB ์ด๊ณผ ํ์ผ์ ๊ฑด๋๋ฐ๊ณ ์์ฝ์ "skipped (too large)" ํ์.
์ฒ๋ฆฌ ํ๋ฆ
๊ฐ ํ์ผ์ ๋ํด ์์ฐจ์ ์ผ๋ก:
Read ํ์ผ ๋ด์ฉ
- 5๋จ๊ณ(ํ
์คํธ ์ฒ๋ฆฌ) ํ์ดํ๋ผ์ธ ์คํ
--score ๋ชจ๋๋ฅผ ์๋ ์ ์ฉํ์ฌ ๊ต์ ์ /ํ ์ ์๋ฅผ ์ธก์
- ๊ฒฐ๊ณผ ์ ์ฅ:
--in-place: Write๋ก ์๋ณธ ํ์ผ ๋ฎ์ด์ฐ๊ธฐ
--suffix <ext>: Write๋ก {์๋ณธ๋ช
}{ext} ํ์ผ ์์ฑ
--outdir <dir>: Write๋ก {dir}/{ํ์ผ๋ช
} ์์ฑ
- ์ ์ต์
์ด ์์ผ๋ฉด: ๊ฐ ํ์ผ์ ๊ฒฐ๊ณผ๋ฅผ ์์ฐจ์ ์ผ๋ก ์ถ๋ ฅ (๊ธฐ๋ณธ output ๋ชจ๋ ์ ์ฉ)
ํ ํ์ผ์ด ์คํจํ๋ฉด ์๋ฌ๋ฅผ ๊ธฐ๋กํ๊ณ ๋ค์ ํ์ผ๋ก ๊ณ์ ์งํํ๋ค.
๊ฒฐ๊ณผ ์์ฝ
๋ชจ๋ ํ์ผ ์ฒ๋ฆฌ ํ ์์ฝ ํ
์ด๋ธ์ ์ถ๋ ฅํ๋ค:
| ํ์ผ | ๊ต์ ์ ์ ์ | ๊ต์ ํ ์ ์ | ๊ต์ ํจํด ์ | ์ํ |
|---|
| post1.md | 67 | 23 | 12 | โ
|
| post2.md | 45 | 18 | 8 | โ
|
| big.md | โ | โ | โ | โญ๏ธ skipped (too large) |
| broken.md | โ | โ | โ | โ error: parse failed |
์ฃผ์: --batch๋ --ouroboros์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ค. ์ด ๊ฒฝ์ฐ ๊ฐ ํ์ผ์ ๋ํด ouroboros ๋ฃจํ๊ฐ ๋
๋ฆฝ์ ์ผ๋ก ์คํ๋๋ค.
5๋จ๊ณ: ํ
์คํธ ์ฒ๋ฆฌ
๋ก๋๋ ํจํด, ํ๋กํ, ๋ชฉ์๋ฆฌ ์ง์นจ์ ์กฐํฉํ์ฌ ํ
์คํธ๋ฅผ ์ฒ๋ฆฌํ๋ค. ์ฒ๋ฆฌ๋ 3๊ฐ ํ์ ๋จ๊ณ๋ก ๋๋๋ค.
5a๋จ๊ณ: ๊ตฌ์กฐ ๋ถ์ (Phase 1)
phase: structure ํฉ์ ํจํด๋ง ์ ์ฉํ๋ค. ๊ธ ์ ์ฒด์ ๊ตฌ์กฐ์ ๋ฌธ์ ๋ฅผ ๋จผ์ ํด๊ฒฐํ๋ค.
- Suspect zone ํ์ฉ โ 4.6๋จ๊ณ์ hot ๋จ๋ฝ์ ์ฐ์ ๊ฒํ ๋์์ผ๋ก ํ์. meta block ๊ณผ
ยซP{n} SUSPECTยป prefix ๋ฅผ ์ฐธ๊ณ ํด ๋จ๋ฝ ๋จ์ ๋ถ์ ์ฐ์ ์์๋ฅผ ๊ฒฐ์ ํ๋ค. 4.7๋จ๊ณ์ lexicon hit ์ ๋ณด(meta block์ lexicon_density ํญ๋ชฉ๊ณผ ์ธ์ฉ๋ AI-lexicon entry)๋ ์ถ๊ฐ ์ฐ์ ์ ํธ๋ก ์ฐธ๊ณ ํ๋ค โ ๋ถํฌ ๊ท ์ง์ฑ๊ณผ ์ดํ ์ ํธ๊ฐ ํจ๊ป ๋ ์์ผ๋ฉด ๊ทธ ๋จ๋ฝ์ด ๊ฐ์ฅ ์ฐ์ ์ด๋ค
- ๋ฌธ์ ๊ตฌ์กฐ ์ค์บ - ๋จ๋ฝ ๋ฐฐ์น, ๋ฐ๋ณต ๊ตฌ์กฐ, ๋ฒ์ญ์ฒด ๊ตฌ๋ฌธ, ์๋ํ ํจํด์ ๊ธ ์ ์ฒด ์์ค์์ ๋ถ์
- ๊ตฌ์กฐ์ ๋ฌธ์ ๊ต์ - ๋จ๋ฝ ๊ตฌ์กฐ ๋ค์ํ, ๋ฒ์ญ์ฒด ๊ต์ , ์ด์ค ํผ๋ ์ ๊ฑฐ
- ์๋ฏธ ๋ณด์กด ํ์ธ - ๊ตฌ์กฐ ๋ณ๊ฒฝ ํ์๋ ํต์ฌ ์ฃผ์ฅ๊ณผ ๋
ผ๋ฆฌ ํ๋ฆ์ด ์ ์ง๋๋์ง ํ์ธ
- Burstiness ์ ์ฉ - ๋จ๋ฝ ๊ธธ์ด์ ๋ฌธ์ฅ ์๋ฟ ์๋๋ผ ๋จ๋ฝ ๋ด๋ถ ๋ฌธ์ฅ ๊ธธ์ด์ ๋ถ์ฐ์ ์๋์ ์ผ๋ก ๋ฒ๋ฆฐ๋ค. burstiness
low ํ์ ์ ๋ฐ์ ๋จ๋ฝ์ ๋ฌธ์ฅ ํ ํฐ ์๊ฐ ๊ฑฐ์ ๊ฐ๋ค๋ ๋ป์ด๋ฏ๋ก(CV < 0.30), ํ๋ฉด ์ดํ๋ง ๋ฐ๊ฟ์๋ ์ ๋ ํด์๋์ง ์๋๋ค:
- hot ๋จ๋ฝ๋ง๋ค ์งง์ ๋ฌธ์ฅ(5~8ํ ํฐ)๊ณผ ๊ธด ๋ฌธ์ฅ(20ํ ํฐ ์ด์)์ ์ต์ ํ๋์ฉ ์๋๋ค. ๋ชฉํ๋ CV โฅ 0.35.
- ๊ธฐ๋ฒ: ๊ธด ๋ฌธ์ฅ ํ๋๋ฅผ "๋จ๋ฌธ ์ ์ธ + ๋ถ์ฐ ์ฅ๋ฌธ"์ผ๋ก ์ชผ๊ฐ๊ธฐ, ๋น์ทํ ๊ธธ์ด์ ์ค๋ฌธ ๋ ๊ฐ๋ฅผ ํ๋๋ก ํฉ์น๊ธฐ, ํต์ฌ ์ฃผ์ฅ ๋ค์ ํ๋ ์ด์ ์ง๋ฆฌ ์๋ผ ๋งํ๊ธฐ ์ถ๊ฐ.
- ๊ฒ์ฆ: ๋ฆฌ๋ผ์ดํธ ํ hot ๋จ๋ฝ์ ๋ฌธ์ฅ ํ ํฐ ์๋ฅผ ๋์ผ๋ก ์ฌ๋ณธ๋ค. ์ฌ์ ํ 12ยฑ2 ํ ํฐ์ด ์ค์ง์ด ์์ผ๋ฉด ์ด ํญ๋ชฉ์ ๋ฏธ์ดํ์ด๋ค โ ํ๋ฉด ์ดํ ๊ต์ฒด๋ง์ผ๋ก ์ด ๋จ๊ณ๋ฅผ ํต๊ณผ์ํค์ง ๋ง๋ผ.
์ฃผ์: ํ
์คํธ๊ฐ 2๊ฐ ๋จ๋ฝ ์ดํ๋ก ์งง์ผ๋ฉด ๊ตฌ์กฐ ๋ถ์์ ๊ฑด๋๋ฐ๊ณ 5b๋จ๊ณ๋ก ์งํํ๋ค.
์ฃผ์: phase: structure frontmatter๋ฅผ ๊ฐ์ง ํฉ์ด 0๊ฐ์ด๋ฉด ์ด ๋จ๊ณ๋ฅผ ๊ฑด๋๋ฐ๊ณ 5b๋จ๊ณ๋ก ์งํํ๋ค.
์ฃผ์ (๋งํฌ๋ค์ด ์ ๋ชฉ ๋ณด์กด, #473): ATX ์ ๋ชฉ ์ค(#, ##, ### โฆ)์ ํ์ค ์ฝ๋๋ธ๋ก๊ณผ ๋์ผํ๊ฒ ๊ณ ์ ๊ตฌ์กฐ๋ก ์ทจ๊ธํ๋ค โ ๊ธ์ ๊ทธ๋๋ก ๋ณด์กดํ๊ณ ๋ฆฌ์๋ฉยท๋ฒ์ญยท์์ ๋ณ๊ฒฝยท์ถ๊ฐยท์ญ์ ํ์ง ์๋๋ค. ๋ค๋ฌ๋ ๊ฒ์ ์ ๋ชฉ ์๋ ๋ณธ๋ฌธ๋ฟ์ด๋ฉฐ, ์ถ๋ ฅ์ ์ ๋ชฉ ์งํฉยทํ
์คํธ๋ ์
๋ ฅ๊ณผ ์์ ํ ๊ฐ์์ผ ํ๋ค(๋ชฉ์ฐจ์ #anchor ๋งํฌ ๋ณด์กด). ์ ๋ชฉ ์์ฒด๋ฅผ ๋ค์ ์ฐ๋ ค๋ฉด CLI --rewrite-headings๋ก ๋ช
์์ ์ผ๋ก ์ตํธ์ธํ๋ค.
5a-v๋จ๊ณ: ์ต์ปค ๊ฒ์ฆ (Anchor Verification)
5a๋จ๊ณ ์๋ฃ ํ, 4.5๋จ๊ณ์์ ์ถ์ถํ ์ต์ปค ๋ชฉ๋ก๊ณผ 5a ์ถ๋ ฅ์ ๋น๊ตํ๋ค.
FOR each anchor IN anchor_list:
IF anchor.content์ด ์กด์ฌํ๊ณ anchor.polarity๊ฐ ๋ณด์กด๋จ:
โ PASS
ELSE IF anchor.content์ด ์กด์ฌํ์ง๋ง ์ฝํ/๋ชจํธํจ:
โ SOFT FAIL
ELSE IF anchor.content์ด ์ญ์ ๋์๊ฑฐ๋ anchor.polarity๊ฐ ๋ฐ์ ๋จ:
โ HARD FAIL
SOFT FAIL ๊ธฐ์ค (์ต์ปค๊ฐ ์กด์ฌํ์ง๋ง ์ฝํ๋ ๊ฒฝ์ฐ):
- ๊ตฌ์ฒด์ ์ฃผ์ฅ์ด ๋ชจํธํด์ง ๊ฒฝ์ฐ: "๋งค์ถ์ด 30% ์ฆ๊ฐ" โ "๋งค์ถ์ด ํฌ๊ฒ ์ฆ๊ฐ"
- ์์น๊ฐ ์ ๋ฐ๋๋ฅผ ์์ ๊ฒฝ์ฐ: "p<0.05" โ "ํต๊ณ์ ์ผ๋ก ์ ์๋ฏธํจ"
- ์ธ๊ณผ ๊ด๊ณ๊ฐ ์๊ด ๊ด๊ณ๋ก ๋ฐ๋ ๊ฒฝ์ฐ: "A๊ฐ B๋ฅผ ์ ๋ฐ" โ "A์ B๋ ์ฐ๊ด"
- ๋จ์ ์ ์ง์ ์ด ํค์ง๋ ๊ฒฝ์ฐ: "์์คํ
์ด ์คํจํ๋ค" โ "์์คํ
์ ๋ฌธ์ ๊ฐ ์์์ ์ ์๋ค"
ํ์ ๋ณ ์ฒ๋ฆฌ:
| ํ์ | ์กฐ๊ฑด | ์ฒ๋ฆฌ |
|---|
| PASS | ์ต์ปค ์๋ฏธ ๋ณด์กด, ๊ทน์ฑ ์ ์ง | ๋ค์ ๋จ๊ณ๋ก ์งํ |
| SOFT FAIL | ์ต์ปค ์กด์ฌํ๋ ์ฝํ/๋ชจํธ | ๋์ ๊ต์ ์๋ (์ฌ์๋ 1ํ) |
| HARD FAIL | ์ต์ปค ์ญ์ ๋๋ ๊ทน์ฑ ๋ฐ์ | ํด๋น ๊ตฌ๊ฐ ์๋ฌธ์ผ๋ก ๋ณต์ |
์ฌ์๋ ์ ์ฐจ (SOFT FAIL ๋ฐ์ ์):
- ์คํจํ ๊ฒฐ๊ณผ๊ฐ ์๋ ์๋ฌธ ๋ฌธ์ฅ์ ๋์ผ ํจํด์ ์ฌ์ ์ฉํ๋ค
- ๊ต์ ํ๋กฌํํธ์ ์ ์ฝ์ ์ฃผ์
ํ๋ค: "๋ค์ ์๋ฏธ๋ฅผ ๋ฐ๋์ ๋ณด์กดํ๋ผ: {์ต์ปค ๋ด์ฉ}"
- ์ฌ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ต์ปค์ ๋์กฐํ๋ค
- ์ฌ์๋๋ ์คํจํ๋ฉด โ HARD FAIL๋ก ์ฒ๋ฆฌ (์๋ฌธ ๋ณต์)
- ์ต์ปค๋น ์ต๋ 1ํ ์ฌ์๋ (์ฌ์๋ ๋ฃจํ ์์)
5b๋จ๊ณ: ๋ฌธ์ฅ/์ดํ ํจํด (Phase 2)
๋๋จธ์ง ํจํด ํฉ(2๋จ๊ณ์์ ๋ก๋๋ ํฉ ์ค phase: structure๊ฐ ์๋ ๋ชจ๋ ํฉ)์ ์ ์ฉํ๋ค.
-
Suspect zone ํ์ฉ โ 4.6๋จ๊ณ์ hot ๋ฌธ์ฅ ๊ทธ๋ฃน(P{n}.S{m}-S{k})์ ์ฐ์ ์ฌ์์ฑ ๋์์ผ๋ก ์ฒ๋ฆฌ. meta block ์ sub-flag ์ ๋ณด๋ฅผ ์ฌ์ฉํด ํจํด ์ค์บ ์ฐ์ ์์๋ฅผ ๊ฒฐ์ ํ๋ค. 4.7๋จ๊ณ์ lexicon hit ์ธ์ฉ("AI-lexicon hits: ..." ๋ถ๋ถ) ๋ ์ฐ์ ์ฌ์์ฑ ์ ํธ๋ก ์ฌ์ฉ โ ์ธ์ฉ๋ AI ์ด๊ตฌ๊ฐ ๋ฑ์ฅํ๋ ๋ฌธ์ฅ์ ํจํด ์ค์บ ์ฐ์ ์์ ์๋จ์ ๋๋ค
-
AI ํจํด ์๋ณ - ๋ก๋๋ ๋ฌธ์ฅ/์ดํ ํจํด ํฉ์ ๋ชจ๋ ํจํด์ ์ค์บ
-
๋ฌธ์ ๊ตฌ๊ฐ ๋ค์ ์ฐ๊ธฐ - AI์ค๋ฌ์ด ํํ์ ํ ํฐ ๋จ์๋ก ์นํํ์ง ๋ง๊ณ , ๋ฌธ๋งฅ์ ์ฝ์ ๋ค ์ /๋ฌธ์ฅ ๋จ์๋ก ์์ฐ์ค๋ฝ๊ฒ ๋ค์ ์ด๋ค
-
์๋ฏธ ๋ณด์กด - ํต์ฌ ๋ฉ์์ง๋ฅผ ์ ์ง
-
์ด์กฐ ๋ง์ถ๊ธฐ - ํ๋กํ์ ์ด์กฐ ์ง์นจ์ ๋ฐ๋ผ ํค ์กฐ์
-
๊ฐ์ฑ ๋ถ์ด๋ฃ๊ธฐ - voice.md์ ์ง์นจ์ ๋ฐ๋ผ ์ค์ ์ฌ๋์ ๋ชฉ์๋ฆฌ๋ฅผ ๋ฃ๊ธฐ
-
blocklist/allowlist ์ ์ฉ - ์ค์ ์ blocklist ์ดํ๋ ์ถ๊ฐ ๊ฐ์ง, allowlist ์ดํ๋ ๊ฐ์ง์์ ์ ์ธ
-
ํ๋กํ ์ค๋ฒ๋ผ์ด๋ ์ ์ฉ - ํ๋กํ์ pattern-overrides๊ฐ ์์ผ๋ฉด ํด๋น ํจํด์ ๊ต์ ๊ฐ๋๋ฅผ ์กฐ์ (suppress/reduce/amplify)
-
ํค ํ์ ์ค๋ฒ๋ผ์ด๋ ์ ์ฉ (v3.10) โ resolved_tone != null์ด๋ฉด ํ๋กํ ์ค๋ฒ๋ผ์ด๋ ์์ ํค๋ณ ์ค๋ฒ๋ผ์ด๋๋ฅผ ์ถ๊ฐ ์ ์ฉํ๋ค. ์ถฉ๋ ์ ํค ์ค๋ฒ๋ผ์ด๋๊ฐ ์ฐ์ ํ๋ค.
Override stack ๊ท์น (H5): ๋์ผ instruction์ด ๋ ๋ ์ด์ด(profile + tone)์์ ๋ฐํํ๋ฉด ํ ๋ฒ๋ง ์ ์ฉํ๋ค (๋ฉฑ๋ฑ). ํค ์ค๋ฒ๋ผ์ด๋๋ ํ๋กํ ์ค๋ฒ๋ผ์ด๋๋ฅผ ๋์ฒด(replace) ํ๋ ๊ฒ์ด์ง ์ค์ฒฉ(stack) ์ด ์๋๋ค. ์ฆ, ๊ฐ์ ํจํด ๋ฒํธ์ ๋ํด profile=reduce, tone=amplify ๊ฐ ๋์ ์ง์ ๋๋ฉด ์ต์ข
์ amplify ๋จ์ผ์ด๋ฉฐ reduce ร amplify ๊ฐ์ ๋์ ์ฐ์ฐ์ ์ผ์ด๋์ง ์๋๋ค.
| Tone | ko ์ค๋ฒ๋ผ์ด๋ | en ์ค๋ฒ๋ผ์ด๋ |
|---|
casual | 14:suppress, 15:reduce, 17:reduce, 18:amplify, 8:amplify | 14:suppress, 15:reduce, 17:reduce, 7:amplify, 8:amplify |
professional | 17:suppress, 25:reduce, 28:amplify | 17:suppress, 25:reduce, 28:amplify |
legal/medical fidelity ๊ฐ์ (R2): resolved_tone=professional์ด๊ณ config.profile์ด legal ๋๋ medical์ด๋ฉด, ouroboros.combined-weights.legal / ouroboros.combined-weights.medical (fidelity 0.65)์ ๊ฐ์ ์ ์ฉํ๋ค. ํค ์ค๋ฒ๋ผ์ด๋๊ฐ fidelity ํํ์ ๋ฎ์ถ์ง ์๋๋ก ํ๋ค.
-
์๋ฏธ ๋ณด์กด ์ ์ฝ ์ฃผ์
โ ์๋ฏธ ์ํ๋๊ฐ HIGH์ธ ํจํด์ ์ ์ฉํ ๋, ํด๋น ๋ฌธ๋จ์ ์ต์ปค๋ฅผ ๊ต์ ํ๋กฌํํธ์ ํฌํจํ๋ค: "๋ค์ ์ฃผ์ฅ์ ๋ฐ๋์ ์ ์งํ๋ผ: {์ต์ปค ๋ชฉ๋ก}". MEDIUM ์ํ๋ ํจํด์ ๊ทน์ฑ(Polarity) ๋๋ ๋ถ์ (Negation) ์ต์ปค๊ฐ ์๋ ๋ฌธ๋จ์์๋ง ์ ์ฝ์ ์ฃผ์
ํ๋ค. LOW ์ํ๋ ํจํด์ ์ ์ฝ ์์ด ์ ์ฉํ๋ค.
CJK ์ /๋ฌธ์ฅ ๋จ์ ๊ต์ ๊ฐ๋ (issue #352): --lang ko|zh|ja์์๋ ๊ตฌ๋์ ์ด๋ ๋จ์ด 1๊ฐ๋ง 1:1๋ก ๋ฐ๊พธ์ง ์๋๋ค. em dash, ์ฝ๋ก , ์ธ๋ฏธ์ฝ๋ก , ์ฌ๋์, ์ผํ ์ ์, ๊ดํธ์ ์ฝ์
๊ตฌ์ฒ๋ผ ์ ๊ด๊ณ๋ฅผ ํ์ํ๋ ๊ตฌ๋์ ์ด AI ์ ํธ์ ํจ๊ป ๋ณด์ด๋ฉด, ๋ฌธ์ฅ ์ ์ฒด๋ฅผ ์ฝ๊ณ ๋ชฉํ ์ธ์ด์ ์์ฐ์ค๋ฌ์ด ์ ๊ตฌ์กฐยท๋ฌธ์ฅ ๋ถ๋ฆฌยท์ ์ ํํ์ผ๋ก ๋ค์ ์ง ๋ค. ๋ฒ์ญ์ฒด/์ง์ญ ๋ช
์ฌ๊ตฌ๊ฐ ๊ตฌ๋์ ์ ๋ถ์ด ์์ผ๋ฉด ๋์ ํจ๊ป ๊ณ ์น๋ค. ํ๊ตญ์ด ์: ๋ฌด TUI ์ ์ง์ญ์ TUI ์์ด ์์ ์์จ๋ก ์ค์นํ๋ ค๋ฉด ...์ฒ๋ผ ํ๊ณ , "๋๋ ๊ฒ ๊ฐ์์"๋ก๋ ๋ถ์กฑํ ์ด๋ฆฐ ์์
์ "๋๋ ๊ฒ ๊ฐ์์"๋ง์ผ๋ก๋ ๋ถ์กฑํ, ๊ฒฐ๊ณผ๋ฅผ ๋๊น์ง ํ์ธํด์ผ ํ๋ ์ด๋ฆฐ ์์
์ฒ๋ผ ์ ๊ด๊ณ๋ฅผ ๋๋ฌ๋ธ๋ค. ๊ต์ ์ค ํ์์ยท๊ทน์ฑยท์กฐ๊ฑดยท์ซ์ยท์ธ๊ณผ๋ ์ ์งํ๋ค.
์ฃผ์: 5a๋จ๊ณ์์ ์ด๋ฏธ ๊ต์ ํ ๊ตฌ๊ฐ์ 5b๋จ๊ณ์์ ๋ค์ "์ ๋๋ ๊ณต์๋ฌธ"์ผ๋ก ๋๋๋ฆฌ์ง ์๋๋ก ์ฃผ์ํ๋ค.
5b-v๋จ๊ณ: ์ต์ปค ๊ฒ์ฆ (Anchor Verification)
5b๋จ๊ณ ์๋ฃ ํ, ์ต์ปค ๋ชฉ๋ก๊ณผ 5b ์ถ๋ ฅ์ ๋น๊ตํ๋ค. ๊ฒ์ฆ ๋ก์ง์ 5a-v๋จ๊ณ์ ๋์ผํ๋ค.
ํ๊ท ์ฒดํฌ: 5a๋จ๊ณ์์ ๊ต์ ๋ ๊ตฌ๊ฐ์ด 5b๋จ๊ณ์์ ๋๋๋ ค์ง์ง ์์๋์ง, 5a ์ถ๋ ฅ๊ณผ 5b ์ถ๋ ฅ์ ํด๋น ๊ตฌ๊ฐ์ ๋ํด ๋น๊ตํ๋ค. ๋๋๋ ค์ง ๊ตฌ๊ฐ์ด ์์ผ๋ฉด 5a ๊ต์ ์ ์ฌ์ ์ฉํ๋ค.
5c๋จ๊ณ: ์๊ธฐ๊ฒ์ (Phase 3)
- AI ๊ฒ์ โ "์๋ ๊ธ์์ AI๊ฐ ์ด ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๋ถ๋ถ์?" ์ง๋ฌธ ํ ์งง๊ฒ ๋ตํ๋ค
- ์ต์ข
์ต์ปค ๋์กฐ โ ์ ์ฒด ์ต์ปค ๋ชฉ๋ก๊ณผ ์ต์ข
๊ฒฐ๊ณผ๋ฌผ์ ๋น๊ตํ๋ค. 5a-v/5b-v์์ ๋ฏธ์ฒ๋ฆฌ๋ HARD FAIL ์ต์ปค๊ฐ ์์ผ๋ฉด ํด๋น ๋ฌธ์ฅ์ ์๋ฌธ์ผ๋ก ๋ณต์ํ๋ค (์์ ๋ง)
- ๊ทน์ฑ ๋ฐ์ ์ค์บ โ ์๋ฌธ์ ๋ถ์ ์ด ๊ธ์ ์ผ๋ก(๋๋ ๋ฐ๋) ๋ฐ๋ ๊ณณ์ ๋ช
์์ ์ผ๋ก ํ์ํ๋ค. ๋ถ์ ์ด, ๋น๊ต ํํ, ์กฐ๊ฑด์ ์ ์ง์คํ๋ค
- ํ๊ท ์ฒดํฌ โ 5a๋จ๊ณ ์ถ๋ ฅ๊ณผ ์ต์ข
์ถ๋ ฅ์ ๋น๊ตํ์ฌ, 5a ๊ต์ ์ด ๋๋๋ ค์ง ๊ตฌ๊ฐ์ด ์์ผ๋ฉด 5a ๊ต์ ์ ์ฌ์ ์ฉํ๋ค
- MPS ์ฐ์ถ โ ์ต์ปค ๊ฒ์ฆ ๊ฒฐ๊ณผ๋ก๋ถํฐ MPS(Meaning Preservation Score)๋ฅผ ๊ณ์ฐํ๋ค.
--score ๋๋ --ouroboros ๋ชจ๋์ผ ๋ ์ถ๋ ฅ์ ํฌํจํ๋ค
6๋จ๊ณ: ์ถ๋ ฅ
๋ชจ๋ ์ถ๋ ฅ ๋ชจ๋ ๊ณตํต โ YAML footer (v3.10):
๋ชจ๋ ์ถ๋ ฅ ๋ชจ๋(rewrite, diff, audit, score)์ ์ต์ข
๊ฒฐ๊ณผ ๋์ ๋ค์ YAML footer ๋ธ๋ก์ ์ถ๊ฐํ๋ค. ์ด๊ฒ์ด tone ์ ๋ณด์ ์ ์ผํ ๋
ธ์ถ ์ง์ ์ด๋ค. rewrite ๋ณธ๋ฌธ์ [tone: ...] ๊ฐ์ ์ธ๋ผ์ธ ํ๊ธฐ๋ฅผ ์ ๋ ํฌํจํ์ง ์๋๋ค (A7).
---
tone: <resolved_tone | null>
tone_source: user | auto | unsupported_language_fallback | profile_only | skipped_short_input
tone_evidence: ["<์ ํธ 1>", "<์ ํธ 2>"]
tone_confidence: low | medium | high
---
tone_source: profile_only: --tone ๋ฏธ์ฌ์ฉ + config tone: ๋ฏธ์ค์ (profile-only ๋ชจ๋)
tone_source: user: ๋ช
์์ --tone ๋๋ config tone: ์ผ๋ก ์ง์
tone_source: auto: --tone auto ๋๋ tone: auto ๋ก ์๋ ๊ฐ์ง ์ํ (์๋ฅ ๊ท์น์ผ๋ก ๋จ์ด์ง ๊ฒฝ์ฐ ํฌํจ)
tone_source: unsupported_language_fallback: zh/ja์์ ๋ช
์ ํค ์ฌ์ฉ ์
tone_source: skipped_short_input: ๋จ๋ฝ<2 OR ๋ฌธ์ฅ<2 ์ด๋ผ 4.5b ๊ฐ์ง๋ฅผ ์์ ์ ํ ๊ฒฝ์ฐ (auto ์์ฒญ์ด์์ง๋ง ๊ฒ์ถ ์์ฒด๊ฐ ์คํ๋์ง ์์)
rewrite ๋ชจ๋ (๊ธฐ๋ณธ)
๋ค์์ ์ ๊ณตํ๋ค:
- ์ด์
- "์๋ ๊ธ์์ AI๊ฐ ์ด ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๋ถ๋ถ์?" (๊ฐ๋จํ ๋ชฉ๋ก)
- ์ต์ข
๋ณธ
- ๋ณ๊ฒฝ ์ฌํญ ์์ฝ (ํ์์)
- YAML footer (์ ๊ณตํต ๊ท์น ์ ์ฉ)
์ฃผ์ (A7): rewrite ์ต์ข
๋ณธ ๋ณธ๋ฌธ์ tone ์ ๋ณด๋ฅผ ์ธ๊ธํ๊ฑฐ๋ ์ฝ์
ํ์ง ์๋๋ค. "์ด ํ
์คํธ๋ casual ํค์ผ๋ก ์ฌ์์ฑ๋์์ต๋๋ค" ๊ฐ์ ๋ด๋ฌํฐ๋ธ ์ธํฐ์ ์
๊ธ์ง.
diff ๋ชจ๋ (--diff)
๋ณ๊ฒฝ ์ฌํญ์ ํจํด๋ณ๋ก ํ์ํ๋ค. ๋ญ ์ ๋ฐ๊ฟจ๋์ง ๋ณด์ฌ์ค๋ค. ๋์ YAML footer ์ถ๊ฐ.
audit ๋ชจ๋ (--audit)
๊ฐ์ง๋ง ํ๊ณ ์์ ํ์ง ์๋๋ค. ํจํด๋ณ ๋ฐ๊ฒฌ ์์น์ ์ฌ๊ฐ๋๋ฅผ ํ
์ด๋ธ๋ก ์ถ๋ ฅํ๋ค. ๋์ YAML footer ์ถ๊ฐ.
score ๋ชจ๋ (--score)
AI ์ ์ฌ๋ ์ ์๋ฅผ 0-100 ์ฒ๋๋ก ์ฐ์ถํ๋ค. core/scoring.md๋ฅผ ์ฐธ์กฐํ์ฌ ์๋ ์ ์ฐจ๋ฅผ ๋ฐ๋ฅธ๋ค.
- ํจํด ๊ฐ์ง: audit ๋ชจ๋์ ๋์ผํ๊ฒ ๋ชจ๋ ํจํด์ ์ค์บํ๊ณ , ๊ฐ์ง๋ ๊ฐ ํจํด์ ๋ํด
severity๋ฅผ ๋ถ์ฌํ๋ค (
core/scoring.md์ ์ฌ๊ฐ๋ ๋ฃจ๋ธ๋ฆญ ์ฐธ์กฐ)
- ํ๋กํ ์ค๋ฒ๋ผ์ด๋ ์ ์ฉ: pattern-overrides๊ฐ ์์ผ๋ฉด ์ฌ๊ฐ๋๋ฅผ ์กฐ์ ํ๋ค
amplify: ์ฌ๊ฐ๋ ร 1.5 (์ต๋ 3)
reduce: ์ฌ๊ฐ๋ ร 0.5
suppress: ์ฌ๊ฐ๋ = 0 (ํด๋น ํจํด ๊ฑด๋๋)
- ์นดํ
๊ณ ๋ฆฌ ์ ์ ๊ณ์ฐ: ๊ฐ ์นดํ
๊ณ ๋ฆฌ๋ณ๋ก (์นดํ
๊ณ ๋ฆฌ๋ ํฉ frontmatter์
pack ํ๋์์
์ธ์ด ์ ๋์ฌ๋ฅผ ์ ๊ฑฐํ์ฌ ๋์ถ: ko-content โ content)
- ์นดํ
๊ณ ๋ฆฌ ์ ์ = (์กฐ์ ๋ ์ฌ๊ฐ๋ ํฉ๊ณ / (ํจํด ์ ร 3)) ร 100
- ํจํด ์๋ ํฉ frontmatter์
patterns ํ๋๋ฅผ ์ฌ์ฉํ๋ค
- ์ ์ฒด ์ ์ ๊ณ์ฐ: ์นดํ
๊ณ ๋ฆฌ ์ ์์ ๊ฐ์ค ํ๊ท
- ๊ฐ์ค์น๋
ouroboros.category-weights.{lang} ์ค์ ์ ์ฌ์ฉํ๋ค
- ์ค์ ์ ์๋ ์นดํ
๊ณ ๋ฆฌ(์ปค์คํ
ํฉ)๋ ๊ธฐ๋ณธ ๊ฐ์ค์น 0.10์ ์ฌ์ฉํ๋ค
- ์ถ๋ ฅ ํ์:
| ์นดํ
๊ณ ๋ฆฌ | ๊ฐ์ค์น | ๊ฐ์ง ํจํด | ์์ ์ | ๊ฐ์ค ์ ์ |
|---|
| content | 0.18 | 3/6 | 33.3 | 6.0 |
| language | 0.18 | 1/9 | 7.4 | 1.3 |
| style | 0.18 | 2/6 | 27.8 | 5.0 |
| communication | 0.13 | 0/4 | 0.0 | 0.0 |
| filler | 0.08 | 1/4 | 8.3 | 0.7 |
| structure | 0.15 | 1/5 | 20.0 | 3.0 |
| viral-hook | 0.10 | 0/9 | 0.0 | 0.0 |
| ์ ์ฒด | | | | 16.0 (ยฑ10) |
| tone | โ | โ | casual | auto/high |
์ฐธ๊ณ : ์นดํ
๊ณ ๋ฆฌ ์ ์๋ ์์์ ์ผ๋ก ๊ณ์ฐํ๊ณ , ํ์๋ ์์ ์ฒซ์งธ ์๋ฆฌ๊น์ง ๋ฐ์ฌ๋ฆผํ๋ค. tone ํ์ resolved_tone๊ณผ tone_source/tone_confidence๋ฅผ ํ์ํ๋ค. ๋์ ๊ณตํต YAML footer๋ฅผ ์ถ๊ฐํ๋ค.
์ ์ ํด์: 0-15 ์ฌ๋๋ค์ / 16-30 ๊ฑฐ์ ์ฌ๋๋ค์ / 31-50 ํผ์ฌ / 51-70 AI ๋๋ / 71-100 AI ์์ฑ
Fidelity ์ ์ (rewrite/ouroboros ๋ชจ๋์์๋ง)
--score๊ฐ rewrite ๋๋ ouroboros ๋ชจ๋์ ํจ๊ป ์ฌ์ฉ๋๋ฉด (์๋ณธ ํ
์คํธ๊ฐ ์๋ ๊ฒฝ์ฐ), ์๋ณธ ๋๋น ์๋ฏธ ๋ณด์กด๋๋ฅผ ์ถ๊ฐ๋ก ์ธก์ ํ๋ค. core/scoring.md ยงยง 9-13์ ์ ์ฐจ๋ฅผ ๋ฐ๋ฅธ๋ค:
- Claims Preserved โ ์๋ณธ์ ์ฌ์ค์ ์ฃผ์ฅ์ด ๊ต์ ๋ณธ์ ๋ณด์กด๋์๋์ง (0-3)
- No Fabrication โ ๊ต์ ๋ณธ์ ์๋ณธ์ ์๋ ๋ด์ฉ์ด ์ถ๊ฐ๋์ง ์์๋์ง (0-3)
- Tone Match โ ๋ฌธ์ฒด/๊ฒฉ์ ์์ค์ด ์ผ์นํ๋์ง (0-3, ํ๋กํ ์ค๋ฒ๋ผ์ด๋ ๊ณ ๋ ค)
- Length Ratio โ ๊ธธ์ด ๋น์จ์ด ์ ์ ํ์ง (0-3, ๊ฒฐ์ ๋ก ์ ๊ณ์ฐ)
| ์งํ | ์ ์ |
|---|
| AI ์ ์ฌ๋ | 23/100 (๋ฎ์์๋ก ์ข์) |
| ์ถฉ์ค๋ | 87/100 (๋์์๋ก ์ข์) |
| ์๋ฏธ ๋ณด์กด (MPS) | 92/100 (๋์์๋ก ์ข์) |
| ์ข
ํฉ | 25/100 (๋ฎ์์๋ก ์ข์) |
์๋ฏธ ๋ณด์กด ์ ์(MPS)๋ 4.5๋จ๊ณ์์ ์ถ์ถ๋ ์๋ฏธ ์ต์ปค๊ฐ ์ต์ข
๊ฒฐ๊ณผ๋ฌผ์ ์ผ๋ง๋ ๋ณด์กด๋์๋์ง๋ฅผ ์ธก์ ํ๋ค. core/scoring.md ยง14๋ฅผ ์ฐธ์กฐํ๋ค.
์ข
ํฉ ์ ์ = (AI ์ ์ฌ๋ ร ai_weight) + ((100 - ์ถฉ์ค๋) ร fidelity_weight).
๊ฐ์ค์น๋ ouroboros.combined-weights.{profile} ์ค์ ์ ๋ฐ๋ฅธ๋ค (๊ธฐ๋ณธ: AI 0.60, ์ถฉ์ค๋ 0.40).
์ฐธ๊ณ : ์ ์๋ LLM์ ์ฌ๊ฐ๋ ํ๋จ์ ๊ธฐ๋ฐํ๋ฏ๋ก ยฑ8-10 ํฌ์ธํธ์ ๋ณ๋์ด ์์ ์ ์๋ค.
์ ํํ ์์น๋ณด๋ค ๋ฒ์๋ก ํด์ํ๋ค.
์ ์ฒด ์์
์์ ์ (AI์ค๋ฌ์ด ๊ธ):
์ข์ ์ง๋ฌธ์ด์ญ๋๋ค! ์ด ์ฃผ์ ์ ๋ํด ์ ๋ฆฌํด ๋๋ฆฌ๊ฒ ์ต๋๋ค. ๋์์ด ๋์
จ์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค!
AI ์ฝ๋ฉ ๋๊ตฌ๋ ๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ์ ํ์ ์ ์ธ ์ ์ฌ๋ ฅ์ ๋ณด์ฌ์ฃผ๋ ํต์ฌ์ ์ธ ์ด์ ํ๋ก์, ์ํํธ์จ์ด ๊ฐ๋ฐ์ ์งํ์ ์์ด ํ๊ธฐ์ ์ธ ์ ํ์ ์ ์๋ฏธํ๋ค. ์ค๋๋ ๊ธ๋ณํ๋ ๊ธฐ์ ํ๊ฒฝ์์ ์ด๋ฌํ ์ ๋์ ์ธ ๋๊ตฌ๋ค์ ์ฐ๊ตฌ์ ์ค๋ฌด์ ๊ต์ฐจ์ ์ ์๋ฆฌํ๋ฉฐ, ์์ง๋์ด๋ค์ ์์
๋ฐฉ์์ ๊ทผ๋ณธ์ ์ผ๋ก ์ฌํธํ๊ณ ์๋ค.
์ด๋ฅผ ํตํด ๋ฌ์ฑ๋๋ ํต์ฌ์ ์ธ ๊ฐ์น๋ ๋ช
ํํ๋ค: ํ๋ก์ธ์ค์ ํจ์จํ, ํ์
์ ๊ฐํ, ๊ทธ๋ฆฌ๊ณ ์กฐ์ง ์ ๋ ฌ์ ์ด์ง. ์ด๊ฒ์ ๋จ์ํ ์๋์์ฑ์ ๊ทธ์น์ง ์๊ณ , ๋๊ท๋ชจ ์ฐฝ์์ฑ ๋ฐํ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ์ด๋ค. ์ด ๋๊ตฌ๋ ์ด๋งค์ ์ญํ ์ ํ๊ณ ์๋ค. ์ด ์ด์์คํดํธ๋ ํํธ๋๋ก์ ๊ธฐ๋ฅํ๊ณ ์๋ค. ์ด ์์คํ
์ ํ์ ์ ํ ๋๋ฅผ ๋ง๋ จํ๊ณ ์๋ค.
์
๊ณ ๊ด๊ณ์๋ค์ ๋์
์ด ๊ฐ์ธ ์คํ ๋จ๊ณ์์ ์ ์ฌ์ ๋ฐฐํฌ ๋จ๊ณ๋ก, 1์ธ ๊ฐ๋ฐ์์์ ๋ค๊ธฐ๋ฅ ํ์ผ๋ก ๋น ๋ฅด๊ฒ ํ๋๋๊ณ ์๋ค๊ณ ์ฃผ๋ชฉํ๊ณ ์๋ค. ์ด ๊ธฐ์ ์ ๋ด์ํ์์ค, ์์ด์ด๋, ๋๋ฒ์ง ๋ฑ์์ ํฌ๊ฒ ๋ณด๋๋์๋ค. ์์ธ๋ฌ, ๋ฌธ์ํ, ํ
์คํธ, ๋ฆฌํฉํ ๋ง์ ์์ฑํ ์ ์๋ ๋ฅ๋ ฅ์ AI๊ฐ ํจ๊ณผ์ ์ธ ์ฑ๊ณผ ๋์ถ์ ๊ธฐ์ฌํ ์ ์์์ ๋ณด์ฌ์ฃผ๋ฉฐ, ์๋ํ์ ์ธ๊ฐ ํ๋จ ๊ฐ์ ์ฌ์ธต์ ์ธ ์ํธ์์ฉ์ ๋ถ๊ฐํ๊ณ ์๋ค.
- ๐ก ์๋: ์ฝ๋ ์์ฑ์ด ํ๊ธฐ์ ์ผ๋ก ๋นจ๋ผ์ง๋ฉฐ, ๊ฐ๋ฐ์ ์ญ๋์ ๊ทน๋ํํ๊ณ ์์ต๋๋ค.
- ๐ ํ์ง: ๊ฐ์ ๋ ํ์ต์ ํตํด ์ถ๋ ฅ ํ์ง์ด ํจ๊ณผ์ ์ผ๋ก ํฅ์๋๊ณ ์์ต๋๋ค.
- โ
๋์
: ์ฌ์ฉ๋์ด ์ง์์ ์ผ๋ก ์ฆ๊ฐํ๋ฉฐ, ์
๊ณ ์ ๋ฐ์ ํธ๋ ๋๋ฅผ ๋ฐ์ํ๊ณ ์์ต๋๋ค.
๊ตฌ์ฒด์ ์ธ ์ ๋ณด๋ ์ ํ์ ์ด๋, ์ด๋ฌํ ๋๊ตฌ๋ค์ด ์ด๋ ์ ๋์ ๊ธ์ ์ ํจ๊ณผ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ ๊ฒ์ผ๋ก ํ๋จ๋ ์๋ ์๋ค. ์ด๋ฌํ ๊ณผ์ ์๋ ๋ถ๊ตฌํ๊ณ ์ํ๊ณ๋ ๊ณ์ ์ฑ์ฅํ๊ณ ์๋ค. ์ด ์ ์ฌ๋ ฅ์ ๊ทน๋ํํ๊ธฐ ์ํด์๋ ์ฒด๊ณ์ ์ธ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์๋ฆฝํด์ผ ํ๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, ์์ผ๋ก ๋ฐ์ ๋ฏธ๋๊ฐ ๊ธฐ๋๋๋ค. ํ์ํจ์ ํฅํ ํฅ๋ฏธ์ง์งํ ์ฌ์ ์ด ์ฐ๋ฆฌ ์์ ํผ์ณ์ ธ ์๋ค. ๋ ์์ธํ ๋ด์ฉ์ด ํ์ํ์๋ฉด ๋ง์ํด ์ฃผ์ธ์!
์ด์:
AI ์ฝ๋ฉ ๋๊ตฌ๋ ์ง๋ฃจํ ์์
์ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํด ์ค๋ค. ์ํคํ
์ฒ ์ค๊ณ๊น์ง๋ ์๋์ง๋ง.
์ค์ ํ์ผ, ํ
์คํธ ๋ผ๋, ๋ฐ๋ณต์ ์ธ ๋ฆฌํฉํ ๋ง ๊ฐ์ ๋ณด์ผ๋ฌํ๋ ์ดํธ์ ๊ฐํ๋ค. ๋ฌธ์ ๋ ํ๋ฆฐ ์ฝ๋๋ ์์ ์๊ฒ ๋ณด์ธ๋ค๋ ๊ฒ์ด๋ค. ์ปดํ์ผ๋ ๋๊ณ ๋ฆฐํธ๋ ํต๊ณผํ๋ ์ฝ๋๋ฅผ ๋ฌด์ฌ์ฝ ์๋ฝํ๋ค๊ฐ, ๋์ค์ ์๋์ ๋ค๋ฅธ ๋์์ ํ๋ ๊ฑธ ๋ฐ๊ฒฌํ ์ ์ด ์๋ค.
์ฃผ๋ณ ์ฌ๋๋ค ๋ฐ์์ ๋์ฒด๋ก ๋ ๋ถ๋ฅ๋ค. ์ก๋ฌด์ ์๋์์ฑ์ฒ๋ผ ์ฐ๋ฉด์ ํ ์ค ํ ์ค ํ์ธํ๋ ์ฌ๋. ์ํ์ง ์๋ ํจํด์ ์๊พธ ์ ์ํด์ ๊บผ๋ฒ๋ฆฐ ์ฌ๋. ๋ ๋ค ํฉ๋ฆฌ์ ์ด๋ค.
์์ฐ์ฑ ์งํ๋ ์ ๋งคํ๋ค. GitHub์ ์ฝํ์ผ๋ฟ ์ฌ์ฉ์๊ฐ "์ ์์ 30%๋ฅผ ์๋ฝํ๋ค"๊ณ ํ๋๋ฐ, ์๋ฝ์ด ์ ํ์ฑ์ ์๋๊ณ , ์ ํ์ฑ์ด ๊ฐ์น๋ ์๋๋ค. ํ
์คํธ๊ฐ ์์ผ๋ฉด ๊ฒฐ๊ตญ ๊ฐ์ผ๋ก ํ๋จํ๋ ๊ฒ์ด๋ค.
"์๋ ๊ธ์์ AI๊ฐ ์ด ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๋ถ๋ถ์?"
- ๋ฆฌ๋ฌ์ด ์์ง ์ข ๊น๋ํ๊ฒ ์ ๋๋์ด ์๋ค (๊น๋ํ ๋์กฐ, ๊ณ ๋ฅธ ๋ฌธ๋จ ๊ธธ์ด).
- ๋ง์ง๋ง ๋ฌธ์ฅ์ด ์ฝ๊ฐ ์ฌ๋ก๊ฑด์ฒ๋ผ ๋ค๋ฆฐ๋ค.
- ์ ์ฒด์ ์ผ๋ก "์ ๋ฆฌ๋ ๋ธ๋ก๊ทธ ๊ธ" ๋๋์ด ๋จ์ ์๋ค.
"์ด์ AI๊ฐ ์ด ๊ฒ์ฒ๋ผ ๋ณด์ด์ง ์๊ฒ ๊ณ ์ณ๋ผ"
AI ์ฝ๋ฉ ๋๊ตฌ, ์ก์ผ์ ๋นจ๋ผ์ง๋ค. ์ค์ ํ์ผ์ด๋ ํ
์คํธ ๋ผ๋ ๊ฐ์ ๊ฑฐ.
๊ทผ๋ฐ ๋ง๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ๊ฒ ๋ฌธ์ ๋ค. ์ปดํ์ผ๋๊ณ ๋ฆฐํธ ํต๊ณผํ๊ธธ๋ ๋๊ฒผ๋๋ฐ ๋์ค์ ๋ณด๋ ์์ ์๋ฑํ ๋์์ ํ๊ณ ์์๋ค. ๋ด๊ฐ ํ์ธ์ ์ ํ ๊ฒ ๋ฌธ์ ์ง๋ง, ํ์ธ ์ ํ๊ฒ ๋ง๋๋ ๊ฒ๋ ์ด ๋๊ตฌ์ ํน์ฑ์ด๋ค.
์ฐ๋ ์ฌ๋๋ค์ ๋ ๋ถ๋ฅ์ธ ๊ฒ ๊ฐ๋ค. ์ก๋ฌด์๋ง ์ฐ๋ฉด์ ํ ์ค์ฉ ๋ณด๋ ์ฌ๋์ด๋, ์ง์ฆ๋์ ๊บผ๋ฒ๋ฆฐ ์ฌ๋. ๋๋ ์๋ค ๊ฐ๋ค ํ๋ค.
์์ฐ์ฑ์ด ์ฌ๋ผ๊ฐ๋๊ณ ๋ฌผ์ผ๋ฉด ์์งํ ๋ชจ๋ฅด๊ฒ ๋ค. "์ ์ 30% ์๋ฝ"์ด ๋ญ ์๋ฏธํ๋์ง๋ ๋ชจ๋ฅด๊ฒ ๊ณ . ํ
์คํธ๊ฐ ์์ผ๋ฉด ๋ง๋์ง ํ๋ฆฐ์ง ๊ฐ์ผ๋ก ๋๋ฆฌ๋ ๊ฑฐ๋๊น.
๋ณ๊ฒฝ ์ฌํญ:
- ์ฑ๋ด ํํ ์ ๊ฑฐ ("์ข์ ์ง๋ฌธ์ด์ญ๋๋ค!", "๋์์ด ๋์
จ์ผ๋ฉด", "๋ง์ํด ์ฃผ์ธ์")
- ๊ณผ๋ํ ์ค์์ฑ ๋ถ์ฌ ์ ๊ฑฐ ("ํต์ฌ์ ์ธ ์ด์ ํ", "ํ๊ธฐ์ ์ธ ์ ํ์ ", "ํ์ ์ ์ธ ์ ์ฌ๋ ฅ")
- ํ๋ณด์ฑ ์ธ์ด ์ ๊ฑฐ ("์ ๋์ ์ธ", "ํ์ํจ์ ํฅํ")
- ๋ชจํธํ ์ถ์ฒ ์ ๊ฑฐ ("์
๊ณ ๊ด๊ณ์๋ค์")
- ~ํ๋ฉฐ/~ํ๊ณ ํผ์์ ๋ถ์ ์ ๊ฑฐ ("๊ธฐ์ฌํ๋ฉฐ", "๋ถ๊ฐํ๊ณ ", "๋ฐ์ํ๊ณ ")
- ๋ถ์ ๋ณ๋ ฌ๊ตฌ์กฐ ์ ๊ฑฐ ("๊ทธ์น์ง ์๊ณ ... ๊ฒ์ด๋ค")
- 3์ ๋ฒ์น ์ ๊ฑฐ ("ํจ์จํ, ๊ฐํ, ์ด์ง", "์ด๋งค์ /ํํธ๋/ํ ๋")
- AI ํน์ ์ดํ ์ ๊ฑฐ ("์์ธ๋ฌ", "์ฌ์ธต์ ์ธ", "์ฒด๊ณ์ ์ธ")
- ~์ ์ ๋ฏธ์ฌ ์ถ์ ("ํ์ ์ ์ธ", "ํจ๊ณผ์ ์ผ๋ก", "ํ๊ธฐ์ ์ผ๋ก")
- ~๊ณ ์๋ค ์งํํ ์ถ์ ("์ฌํธํ๊ณ ์๋ค", "์ฑ์ฅํ๊ณ ์๋ค")
- ์ด๋ชจ์ง, ๋ณผ๋์ฒด, ์ธ๋ผ์ธ ํค๋ ์ ๊ฑฐ
- ๊ณผ๋ํ ์ฐ๊ฒฐ ํํ ์ ๊ฑฐ ("์ด๋ฅผ ํตํด", "์์ธ๋ฌ")
- ํ์ต ๋ฐ์ดํฐ ๋ฉด์ฑ
์ ๊ฑฐ ("๊ตฌ์ฒด์ ์ธ ์ ๋ณด๋ ์ ํ์ ์ด๋")
- ๊ณผ๋ํ ํค์ง ์ ๊ฑฐ ("~์ผ ์๋ ์๋ค")
- ์ฑ์ ํํ ์ ๊ฑฐ ("~ํ๊ธฐ ์ํด์๋")
- ๋ง์ฐํ ๊ธ์ ์ ๊ฒฐ๋ก ์ ๊ฑฐ ("๋ฐ์ ๋ฏธ๋๊ฐ ๊ธฐ๋๋๋ค", "ํฅ๋ฏธ์ง์งํ ์ฌ์ ")
- ๊ฐ์ฑ๊ณผ ๋ชฉ์๋ฆฌ๋ฅผ ์ถ๊ฐ (๋ฆฌ๋ฌ ๋ณํ, 1์ธ์นญ, ์์งํ ๊ฐ์ )
์ฐธ๊ณ
์ด ์คํฌ์ ์ํค๋ฐฑ๊ณผ:AI ๊ธ์ฐ๊ธฐ์ ์งํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ, WikiProject AI Cleanup์ด ๊ด๋ฆฌํฉ๋๋ค. ํด๋น ๋ฌธ์์ ํจํด์ ์ํค๋ฐฑ๊ณผ์์ ๋ฐ๊ฒฌ๋ ์์ฒ ๊ฑด์ AI ์์ฑ ํ
์คํธ ๊ด์ฐฐ์์ ๋น๋กฏ๋์์ต๋๋ค. ํ๊ตญ์ด ๋ฒ์ ์ ์๋ณธ์ ๋ณดํธ์ ํจํด์ ๋ํด, ํ๊ตญ์ด AI ๊ธ์ฐ๊ธฐ์์ ๋ํ๋๋ ๊ณ ์ ํ ํจํด(~์ ์ ๋ฏธ์ฌ, ~๊ณ ์๋ค ์งํํ, ๊ณผ๋ํ ํ์์ด ๋ฑ)์ ์ถ๊ฐ๋ก ๋ฐ์ํฉ๋๋ค.
ํต์ฌ ํต์ฐฐ: "LLM์ ํต๊ณ์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๋ค์์ ์ฌ ๊ฒ์ ์์ธกํ๋ค. ๊ฒฐ๊ณผ๋ ๊ฐ์ฅ ๋์ ๋ฒ์์ ์ ์ฉ ๊ฐ๋ฅํ, ๊ฐ์ฅ ํต๊ณ์ ์ผ๋ก ๊ฐ๋ฅ์ฑ ๋์ ๊ฒฐ๊ณผ๋ก ์๋ ดํ๋ ๊ฒฝํฅ์ด ์๋ค."
์์ด ์ฒ๋ฆฌ ์ฐธ๊ณ : --lang en ์ฌ์ฉ ์ ๋์ผํ ํ์ดํ๋ผ์ธ์ ๋ฐ๋ฅธ๋ค. ์์ด en-structure.md ํฉ์๋ 4๊ฐ์ ๊ตฌ์กฐ ํจํด(#25 Metronomic Paragraph Structure, #26 Passive Nominalization Chains, #27 Zombie Nouns, #28 Stacked Subordinate Clauses)์ด ํฌํจ๋์ด ์์ผ๋ฏ๋ก 5a๋จ๊ณ(๊ตฌ์กฐ ๋ถ์)๊ฐ ํ๊ตญ์ด์ ๋ง์ฐฌ๊ฐ์ง๋ก ์คํ๋๋ค.