patina-cli 3.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.patina.default.yaml +211 -0
- package/CHANGELOG.md +265 -0
- package/LICENSE +21 -0
- package/README.md +319 -0
- package/README_JA.md +254 -0
- package/README_KR.md +253 -0
- package/README_ZH.md +254 -0
- package/SKILL-MAX.md +455 -0
- package/SKILL.md +730 -0
- package/assets/brand/patina-icon.svg +9 -0
- package/assets/brand/patina-logo.svg +17 -0
- package/assets/social/patina-before-after.svg +46 -0
- package/assets/social/patina-og.svg +31 -0
- package/bin/patina.js +9 -0
- package/core/scoring.md +657 -0
- package/core/standalone-prompt.md +364 -0
- package/core/stylometry.md +754 -0
- package/core/voice.md +163 -0
- package/docs/AUTHENTICATION.md +105 -0
- package/docs/AUTHENTICATION_KR.md +105 -0
- package/docs/BRANDING.md +37 -0
- package/docs/CLI.md +80 -0
- package/docs/COMPARISON.md +38 -0
- package/docs/COOKBOOK.md +173 -0
- package/docs/DEMO.md +40 -0
- package/docs/ETHICS.md +27 -0
- package/docs/EXAMPLES.md +130 -0
- package/docs/EXAMPLES_KR.md +130 -0
- package/docs/EXIT-CODES.md +25 -0
- package/docs/FAQ.md +67 -0
- package/docs/FAQ_KR.md +65 -0
- package/docs/FLAG-PARITY.md +53 -0
- package/docs/GLOSSARY.md +123 -0
- package/docs/PATTERNS-EN.md +718 -0
- package/docs/PATTERNS-JA.md +706 -0
- package/docs/PATTERNS-KO.md +707 -0
- package/docs/PATTERNS-ZH.md +706 -0
- package/docs/PATTERNS.md +22 -0
- package/docs/ROADMAP.md +315 -0
- package/docs/audits/2026-05-deep-research.md +290 -0
- package/docs/benchmarks/detector-comparison.json +442 -0
- package/docs/benchmarks/detector-comparison.md +65 -0
- package/docs/benchmarks/latest.json +988 -0
- package/docs/benchmarks/latest.md +112 -0
- package/docs/integrations/docker.md +19 -0
- package/docs/integrations/github-action.md +59 -0
- package/docs/integrations/pre-commit.md +77 -0
- package/docs/integrations/release.md +43 -0
- package/docs/internal/HARNESS.md +14 -0
- package/docs/internal/README.md +14 -0
- package/docs/internal/WARP.md +23 -0
- package/docs/research/2025-rebaseline-plan.md +89 -0
- package/docs/research/ai-human-metrics.md +380 -0
- package/docs/social/gstack-cardnews.html +236 -0
- package/docs/social/gstack-cardnews.md +88 -0
- package/docs/social/gstack-thread.md +106 -0
- package/docs/social/patina-launch-copy.md +227 -0
- package/docs/superpowers/specs/2026-04-03-meaning-preservation-design.md +299 -0
- package/lexicon/ai-en.md +162 -0
- package/lexicon/ai-ko.md +159 -0
- package/package.json +100 -0
- package/patina-max/SKILL.md +523 -0
- package/patina-max/composite.py +457 -0
- package/patterns/en-communication.md +89 -0
- package/patterns/en-content.md +133 -0
- package/patterns/en-filler.md +113 -0
- package/patterns/en-language.md +163 -0
- package/patterns/en-structure.md +173 -0
- package/patterns/en-style.md +139 -0
- package/patterns/en-viral-hook.md +211 -0
- package/patterns/ja-communication.md +101 -0
- package/patterns/ja-content.md +153 -0
- package/patterns/ja-filler.md +123 -0
- package/patterns/ja-language.md +190 -0
- package/patterns/ja-structure.md +142 -0
- package/patterns/ja-style.md +147 -0
- package/patterns/ja-viral-hook.md +216 -0
- package/patterns/ko-communication.md +98 -0
- package/patterns/ko-content.md +154 -0
- package/patterns/ko-filler.md +105 -0
- package/patterns/ko-language.md +182 -0
- package/patterns/ko-structure.md +147 -0
- package/patterns/ko-style.md +146 -0
- package/patterns/ko-viral-hook.md +211 -0
- package/patterns/zh-communication.md +101 -0
- package/patterns/zh-content.md +153 -0
- package/patterns/zh-filler.md +118 -0
- package/patterns/zh-language.md +173 -0
- package/patterns/zh-structure.md +145 -0
- package/patterns/zh-style.md +159 -0
- package/patterns/zh-viral-hook.md +216 -0
- package/profiles/academic.md +53 -0
- package/profiles/blog.md +81 -0
- package/profiles/casual-conversation.md +105 -0
- package/profiles/code-comment.md +104 -0
- package/profiles/commit-message.md +99 -0
- package/profiles/default.md +62 -0
- package/profiles/email.md +52 -0
- package/profiles/formal.md +98 -0
- package/profiles/instructional.md +80 -0
- package/profiles/legal.md +57 -0
- package/profiles/marketing.md +56 -0
- package/profiles/medical.md +53 -0
- package/profiles/narrative.md +79 -0
- package/profiles/release-notes.md +98 -0
- package/profiles/social.md +56 -0
- package/profiles/technical.md +53 -0
- package/scripts/benchmark-report.mjs +252 -0
- package/scripts/check-release-metadata.mjs +48 -0
- package/scripts/detector-comparison.mjs +267 -0
- package/scripts/lint.mjs +40 -0
- package/scripts/precommit-score.mjs +31 -0
- package/scripts/prose-score.mjs +186 -0
- package/scripts/update-benchmark-ranges.mjs +108 -0
- package/src/api.js +330 -0
- package/src/auth.js +105 -0
- package/src/backends/claude-cli.js +112 -0
- package/src/backends/codex-cli.js +121 -0
- package/src/backends/contract.js +21 -0
- package/src/backends/gemini-cli.js +135 -0
- package/src/backends/index.js +159 -0
- package/src/cache.js +106 -0
- package/src/cli.js +1280 -0
- package/src/commands/doctor.js +229 -0
- package/src/commands/init.js +208 -0
- package/src/config.js +126 -0
- package/src/errors.js +53 -0
- package/src/features/index.js +96 -0
- package/src/features/lexicon.js +90 -0
- package/src/features/segment.js +49 -0
- package/src/features/stylometry.js +50 -0
- package/src/loader.js +103 -0
- package/src/logger.js +70 -0
- package/src/manifest.js +162 -0
- package/src/max-mode.js +207 -0
- package/src/ouroboros.js +233 -0
- package/src/output.js +480 -0
- package/src/prompt-builder.js +409 -0
- package/src/providers.js +100 -0
- package/src/scoring.js +531 -0
- package/src/security.js +133 -0
- package/tests/fixtures/suspect-zones/en/ai/en-ai-01.md +16 -0
- package/tests/fixtures/suspect-zones/en/ai/en-ai-02.md +16 -0
- package/tests/fixtures/suspect-zones/en/ai/en-ai-03.md +17 -0
- package/tests/fixtures/suspect-zones/en/ai/en-ai-04.md +15 -0
- package/tests/fixtures/suspect-zones/en/ai/en-ai-05.md +16 -0
- package/tests/fixtures/suspect-zones/en/ai/en-ai-06-chat-register.md +16 -0
- package/tests/fixtures/suspect-zones/en/natural/en-nat-01.md +15 -0
- package/tests/fixtures/suspect-zones/en/natural/en-nat-02.md +15 -0
- package/tests/fixtures/suspect-zones/en/natural/en-nat-03.md +15 -0
- package/tests/fixtures/suspect-zones/en/natural/en-nat-04.md +15 -0
- package/tests/fixtures/suspect-zones/en/natural/en-nat-05.md +15 -0
- package/tests/fixtures/suspect-zones/expected-ranges.json +939 -0
- package/tests/fixtures/suspect-zones/ja/ai/ja-ai-01.md +11 -0
- package/tests/fixtures/suspect-zones/ja/ai/ja-ai-02.md +11 -0
- package/tests/fixtures/suspect-zones/ja/ai/ja-ai-03.md +11 -0
- package/tests/fixtures/suspect-zones/ja/natural/ja-nat-01.md +11 -0
- package/tests/fixtures/suspect-zones/ja/natural/ja-nat-02.md +11 -0
- package/tests/fixtures/suspect-zones/ja/natural/ja-nat-03.md +11 -0
- package/tests/fixtures/suspect-zones/ko/ai/ko-ai-01.md +14 -0
- package/tests/fixtures/suspect-zones/ko/ai/ko-ai-02.md +16 -0
- package/tests/fixtures/suspect-zones/ko/ai/ko-ai-03.md +15 -0
- package/tests/fixtures/suspect-zones/ko/ai/ko-ai-04.md +15 -0
- package/tests/fixtures/suspect-zones/ko/ai/ko-ai-05.md +16 -0
- package/tests/fixtures/suspect-zones/ko/ai/ko-ai-06-chat-register.md +16 -0
- package/tests/fixtures/suspect-zones/ko/natural/ko-nat-01.md +15 -0
- package/tests/fixtures/suspect-zones/ko/natural/ko-nat-02.md +15 -0
- package/tests/fixtures/suspect-zones/ko/natural/ko-nat-03.md +15 -0
- package/tests/fixtures/suspect-zones/ko/natural/ko-nat-04.md +14 -0
- package/tests/fixtures/suspect-zones/ko/natural/ko-nat-05.md +15 -0
- package/tests/fixtures/suspect-zones/zh/ai/zh-ai-01.md +11 -0
- package/tests/fixtures/suspect-zones/zh/ai/zh-ai-02.md +11 -0
- package/tests/fixtures/suspect-zones/zh/ai/zh-ai-03.md +11 -0
- package/tests/fixtures/suspect-zones/zh/natural/zh-nat-01.md +11 -0
- package/tests/fixtures/suspect-zones/zh/natural/zh-nat-02.md +11 -0
- package/tests/fixtures/suspect-zones/zh/natural/zh-nat-03.md +11 -0
- package/tests/quality/README.md +121 -0
- package/tests/quality/benchmark.mjs +306 -0
- package/tests/quality/detectors.manual.example.json +31 -0
- package/tests/quality/dogfood.mjs +44 -0
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
# AI 글과 사람 글 차이의 지표화 — patina 벤치마크 조사 노트
|
|
2
|
+
|
|
3
|
+
작성일: 2026-05-20
|
|
4
|
+
상태: 조사/설계 노트, 구현 전 제안
|
|
5
|
+
|
|
6
|
+
## 1. 질문
|
|
7
|
+
|
|
8
|
+
patina의 벤치마크에서 측정하려는 것은 단순히 “이 글의 출처가 AI인가?”가 아니다. 더 정확한 질문은 다음이다.
|
|
9
|
+
|
|
10
|
+
> AI가 쓴 것처럼 읽히는 표면적·문체적 신호를 얼마나 줄였고, 그 과정에서 의미를 얼마나 보존했는가?
|
|
11
|
+
|
|
12
|
+
따라서 patina의 지표는 법적·징계용 provenance detector가 아니라, **AI-like writing signal을 줄이는 편집 품질 지표**로 정의해야 한다.
|
|
13
|
+
|
|
14
|
+
## 2. 현재 레포의 기준선
|
|
15
|
+
|
|
16
|
+
현재 main 기준 벤치마크는 결정론적 suspect-zone 층이 구현돼 있고, live rewrite 품질 평가는 follow-up으로 분리한다.
|
|
17
|
+
|
|
18
|
+
| 층 | 파일 | 현재 측정값 | 성격 |
|
|
19
|
+
|---|---|---|---|
|
|
20
|
+
| 결정론적 benchmark | `tests/quality/benchmark.mjs` | accuracy, precision, recall, F1, TP/FP/FN/TN | LLM 호출 없음. stylometry/lexicon hot 판정 회귀 테스트 |
|
|
21
|
+
| future live quality regression | proposed `tests/quality/live-quality.mjs` | AI-likeness, MPS, fidelity, PASS/WARN/ERROR | 모델 호출 필요. rewrite 품질과 의미 보존 점검. 현재 main 기준 구현 전 follow-up |
|
|
22
|
+
| scoring spec | `core/scoring.md` | AI-likeness, fidelity, combined score, MPS | 점수 정의의 기준 문서 |
|
|
23
|
+
| stylometry spec | `core/stylometry.md` | burstiness CV, MATTR, lexicon density | deterministic signal 정의 |
|
|
24
|
+
|
|
25
|
+
현재 deterministic hot 판정은 다음 OR 규칙이다.
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
paragraph is SUSPECT iff
|
|
29
|
+
burstiness_band == "low"
|
|
30
|
+
OR MATTR_band == "low"
|
|
31
|
+
OR lexicon_density > threshold
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
현재 레포의 로컬 `tests/quality/results.json` 스냅샷은 ko/en/zh/ja fixture 34개 기준 전체 accuracy 1.0이다. 다만 이 corpus는 작고 설계된 synthetic/curated fixture이므로, 일반화 성능 증거로 과신하면 안 된다.
|
|
35
|
+
|
|
36
|
+
### 2.1 단기 benchmark 한계와 rebaseline 계획 (#155/#162)
|
|
37
|
+
|
|
38
|
+
현재 체크인된 deterministic report는 회귀 테스트로는 유용하지만, 공개 성능 주장으로 쓰기에는 아직 좁다.
|
|
39
|
+
|
|
40
|
+
- 표본 수: ko/en/zh/ja suspect-zone fixture 34개. 언어·장르·출처별 신뢰구간을 낼 만큼 크지 않다.
|
|
41
|
+
- 모델 시대성: 2025+ GPT/Claude/Gemini/Llama/Qwen 계열 생성문 rebaseline은 아직 별도 follow-up이다.
|
|
42
|
+
- 통계 보고: `docs/benchmarks/latest.md`는 fixture 수, lang/class sample size, Wilson 95% CI를 공개한다. bootstrap interval과 threshold sweep은 아직 없다.
|
|
43
|
+
- 범위: 현재 수치는 stylometry/lexicon hot 판정 회귀이며, rewrite 품질·MPS·fidelity의 live 품질 점수가 아니다.
|
|
44
|
+
|
|
45
|
+
따라서 README/benchmark 문구는 “현재 fixture에서 회귀가 통과했다”로 해석해야 하며, “새 모델·새 장르에서도 100% 탐지한다”는 의미가 아니다. 다음 rebaseline에서는 최소한 언어 × class × register별 sample size를 고정하고, confidence interval과 threshold sweep을 함께 게시한다.
|
|
46
|
+
|
|
47
|
+
현재 2025+ 재측정 프로토콜은 [2025+ Re-baseline Plan](2025-rebaseline-plan.md)에 둔다. 외부 detector 비교는 `scripts/detector-comparison.mjs`의 수동 입력 경로를 사용해 scraping/API 호출 없이 기록한다.
|
|
48
|
+
|
|
49
|
+
## 3. 문헌/실무에서 반복되는 지표 축
|
|
50
|
+
|
|
51
|
+
### 3.1 문장 리듬: burstiness / sentence-length variation
|
|
52
|
+
|
|
53
|
+
AI 글은 같은 길이의 문장을 안정적으로 반복하는 경향이 있다. patina는 이미 문장 토큰 수의 변동계수(CV)를 사용한다.
|
|
54
|
+
|
|
55
|
+
```text
|
|
56
|
+
CV = stddev(sentence_token_counts) / mean(sentence_token_counts)
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
- 장점: 빠르고 설명 가능하며 ko/en은 whitespace token, zh/ja는 character-token fallback으로 구현 가능하다.
|
|
60
|
+
- 약점: 백과사전식 register, 보도자료, 법률/학술 문장도 균질해질 수 있다.
|
|
61
|
+
- patina 판단: **유지하되 단독 판정 근거로 쓰지 않는다.**
|
|
62
|
+
|
|
63
|
+
### 3.2 어휘 다양성: TTR / MATTR / MTLD
|
|
64
|
+
|
|
65
|
+
MATTR는 길이에 민감한 TTR 문제를 완화하기 위해 moving window를 쓰는 lexical diversity 지표다. patina는 이미 window=50 MATTR를 쓴다.
|
|
66
|
+
|
|
67
|
+
- 근거: Covington & McFall의 MATTR 논문은 단순 TTR의 길이 의존 문제를 지적하고 moving-average 방식을 제안한다.
|
|
68
|
+
- patina 관찰: 영어에서는 보조 신호, 한국어에서는 어절 토큰화 때문에 MATTR가 과대평가되어 약한 신호다.
|
|
69
|
+
- patina 판단: **현행 유지. 한국어에서는 핵심 신호로 보지 않는다.**
|
|
70
|
+
|
|
71
|
+
### 3.3 AI-favored lexicon density
|
|
72
|
+
|
|
73
|
+
AI 글은 의미를 구체화하기보다 추상 명명, 포장어, 의례적 도입/결론 phrase를 반복한다. patina는 `lexicon/ai-en.md`, `lexicon/ai-ko.md`를 통해 lexicon density를 계산한다.
|
|
74
|
+
|
|
75
|
+
```text
|
|
76
|
+
density = matched_ai_lexicon_entries / token_count * 1000
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
- 장점: 해석 가능하고, 패턴팩이 놓치는 어휘적 신호를 잡는다.
|
|
80
|
+
- 약점: 도메인별 정상 전문어와 AI 포장어를 혼동할 수 있다.
|
|
81
|
+
- patina 판단: **언어/도메인별 calibration이 필요하다.** 특히 한국어 lexicon은 paired corpus mining 방식이 효과적이었다.
|
|
82
|
+
|
|
83
|
+
### 3.4 패턴 기반 severity score
|
|
84
|
+
|
|
85
|
+
patina의 가장 중요한 차별점은 “AI detection”보다 “AI writing pattern editing”에 있다. 따라서 다음 패턴들은 detector feature이면서 동시에 rewrite target이다.
|
|
86
|
+
|
|
87
|
+
- 과잉 연결어, 도입/결론 template
|
|
88
|
+
- 추상명사/명사화 연쇄
|
|
89
|
+
- 균일한 bullet/heading scaffold
|
|
90
|
+
- generic positive conclusion
|
|
91
|
+
- 출처 없는 권위 주장
|
|
92
|
+
- viral-hook score-only rhetoric
|
|
93
|
+
|
|
94
|
+
patina 판단: **패턴 기반 점수는 계속 중심축이어야 한다.** 통계 지표는 패턴 스캔의 보조 신호로 둔다.
|
|
95
|
+
|
|
96
|
+
### 3.5 언어모델 확률 기반 지표
|
|
97
|
+
|
|
98
|
+
대표 연구:
|
|
99
|
+
|
|
100
|
+
| 접근 | 핵심 아이디어 | patina 적용성 |
|
|
101
|
+
|---|---|---|
|
|
102
|
+
| [GLTR](https://arxiv.org/abs/1906.04043) | token probability, rank, entropy로 “너무 예측 가능한 선택”을 시각화 | 설명 가능. 단, local LM 또는 API logprob 필요 |
|
|
103
|
+
| [DetectGPT](https://arxiv.org/abs/2301.11305) | 생성 텍스트가 log-probability curvature의 특정 영역에 놓인다는 가설 | 강력하지만 perturbation/LM logprob 비용 큼 |
|
|
104
|
+
| [Binoculars](https://arxiv.org/abs/2401.12070) | 두 LM의 perplexity/cross-perplexity contrast | 성능 보고는 좋지만 기본 CLI에 넣기엔 무거움 |
|
|
105
|
+
| [Ghostbuster](https://arxiv.org/abs/2305.15047) | 약한 LM feature 조합 + classifier | benchmark 연구에는 유용, patina 기본 철학과는 다소 거리 있음 |
|
|
106
|
+
|
|
107
|
+
patina 판단: **기본 benchmark에는 넣지 말고 optional research track으로 둔다.** 이 레포는 의존성 추가를 보수적으로 해야 하고, 현재 장점은 “설명 가능한 lightweight signal”이다.
|
|
108
|
+
|
|
109
|
+
### 3.6 Function-word / punctuation / syntax distribution
|
|
110
|
+
|
|
111
|
+
전통 stylometry는 내용어보다 기능어 분포를 자주 사용한다. 기능어는 주제보다 습관적 문체에 가깝기 때문이다.
|
|
112
|
+
|
|
113
|
+
후보 지표:
|
|
114
|
+
|
|
115
|
+
- 영어: `the/of/and/to/in/that/is` 등 function-word frequency vector
|
|
116
|
+
- 한국어: 조사/어미 proxy (`은/는`, `이/가`, `을/를`, `에서`, `으로`, `하다/되다` 계열)
|
|
117
|
+
- punctuation rhythm: comma/semicolon/dash/parenthesis density
|
|
118
|
+
- sentence opener diversity
|
|
119
|
+
- POS-like rough proxy: 명사형 종결, 수동 표현, nominalization suffix
|
|
120
|
+
|
|
121
|
+
patina 판단: **다음 deterministic feature 후보 1순위.** 외부 모델 없이 구현 가능하고, pattern/lexicon과 다른 축이다.
|
|
122
|
+
|
|
123
|
+
## 4. 탐지 연구에서 얻을 주의사항
|
|
124
|
+
|
|
125
|
+
### 4.1 detector는 일반적으로 OOD에 약하다
|
|
126
|
+
|
|
127
|
+
[M4](https://arxiv.org/abs/2305.14902)는 multi-generator, multi-domain, multilingual 환경에서 detector의 generalization이 어렵다고 보고한다. [RAID](https://arxiv.org/abs/2405.07940)는 sampling strategy, adversarial attack, unseen model 변화에 기존 detector들이 쉽게 속는다고 보고한다.
|
|
128
|
+
|
|
129
|
+
patina 벤치마크도 같은 함정이 있다. synthetic fixture에서 100%가 나와도 다음 상황에서는 깨질 수 있다.
|
|
130
|
+
|
|
131
|
+
- unseen LLM: GPT/Claude/Gemini/Llama 계열 차이
|
|
132
|
+
- unseen domain: 학술, 법률, 마케팅, 개인 에세이
|
|
133
|
+
- unseen decoding: temperature, top-p, repetition penalty
|
|
134
|
+
- edited AI: humanizer, paraphrase, 번역 후 재작성
|
|
135
|
+
- non-native human prose
|
|
136
|
+
|
|
137
|
+
### 4.2 단일 “AI 확률”로 말하면 안 된다
|
|
138
|
+
|
|
139
|
+
OpenAI도 기존 AI classifier를 낮은 정확도 때문에 중단했고, 짧은 텍스트·비영어·OOD·편집된 AI 글에서 취약하다고 명시했다. 공식 문서의 핵심 메시지는 “주요 의사결정 도구로 쓰지 말라”는 것이다.
|
|
140
|
+
|
|
141
|
+
patina도 `AI-generated probability`가 아니라 다음처럼 표현해야 한다.
|
|
142
|
+
|
|
143
|
+
- 좋음: `AI-likeness`, `AI-like writing signals`, `suspect zones`
|
|
144
|
+
- 피해야 함: `이 글은 AI가 쓴 글임`, `AI 확률 87%`, `작성자 판정`
|
|
145
|
+
|
|
146
|
+
### 4.3 watermark/provenance는 별도 문제다
|
|
147
|
+
|
|
148
|
+
[Kirchenbauer et al.](https://proceedings.mlr.press/v202/kirchenbauer23a.html)과 [SynthID-Text](https://www.nature.com/articles/s41586-024-08025-4)는 생성 시점에 watermark를 삽입하는 방식이다. 임의의 외부 텍스트를 보고 “AI스러움”을 측정하는 patina와 목적이 다르다.
|
|
149
|
+
|
|
150
|
+
- watermark: 특정 생성 시스템이 사전에 심은 신호 검출
|
|
151
|
+
- patina: 결과 텍스트의 문체적 AI 신호 축소
|
|
152
|
+
|
|
153
|
+
따라서 watermark는 참고 연구로만 두고, patina benchmark의 핵심 지표로 넣지 않는다.
|
|
154
|
+
|
|
155
|
+
## 5. patina에 맞는 지표 설계안
|
|
156
|
+
|
|
157
|
+
### 5.1 Feature vector를 먼저 만들고, binary 판정은 그 다음에 둔다
|
|
158
|
+
|
|
159
|
+
현재 benchmark는 `hot/cold` 판정 중심이다. 연구/튜닝을 위해서는 fixture별 feature vector를 더 풍부하게 남겨야 한다.
|
|
160
|
+
|
|
161
|
+
```json
|
|
162
|
+
{
|
|
163
|
+
"fixture_id": "ko-ai-01",
|
|
164
|
+
"label": "ai",
|
|
165
|
+
"features": {
|
|
166
|
+
"burstiness_cv": 0.059,
|
|
167
|
+
"mattr": 0.91,
|
|
168
|
+
"lexicon_density": 3.4,
|
|
169
|
+
"pattern_hits": 5,
|
|
170
|
+
"pattern_severity_sum": 9,
|
|
171
|
+
"function_word_divergence": 0.12,
|
|
172
|
+
"punctuation_uniformity": 0.33
|
|
173
|
+
},
|
|
174
|
+
"scores": {
|
|
175
|
+
"deterministic_ai_likeness": 72.4,
|
|
176
|
+
"hot": true
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
### 5.2 Deterministic AI-likeness score 후보
|
|
182
|
+
|
|
183
|
+
기본 방향은 “설명 가능한 feature들의 weighted score”다.
|
|
184
|
+
|
|
185
|
+
```text
|
|
186
|
+
deterministic_ai_likeness =
|
|
187
|
+
w1 * burstiness_suspicion
|
|
188
|
+
+ w2 * mattr_suspicion
|
|
189
|
+
+ w3 * lexicon_suspicion
|
|
190
|
+
+ w4 * pattern_suspicion
|
|
191
|
+
+ w5 * function_word_suspicion
|
|
192
|
+
+ w6 * punctuation_suspicion
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
권장 초기 가중치:
|
|
196
|
+
|
|
197
|
+
| Feature | 초기 weight | 이유 |
|
|
198
|
+
|---|---:|---|
|
|
199
|
+
| pattern severity | 0.35 | patina의 핵심 목적과 직접 연결 |
|
|
200
|
+
| lexicon density | 0.20 | 설명 가능하고 calibration 경험 있음 |
|
|
201
|
+
| burstiness CV | 0.20 | 현재 ko/en/zh/ja suspect-zone fixture에서 유효한 핵심 deterministic 신호 |
|
|
202
|
+
| function-word divergence | 0.15 | 다음 확장 후보. 주제 독립성이 높음 |
|
|
203
|
+
| punctuation/opening rhythm | 0.05 | 가벼운 보조 신호 |
|
|
204
|
+
| MATTR | 0.05 | 한국어에서 약하므로 낮게 시작 |
|
|
205
|
+
|
|
206
|
+
단, 이 score는 처음부터 사용자 노출용으로 쓰지 말고 benchmark 내부 연구값으로 둔다.
|
|
207
|
+
|
|
208
|
+
### 5.3 Humanizer 전용 품질 지표
|
|
209
|
+
|
|
210
|
+
patina의 최종 성공은 “탐지”가 아니라 “안전한 인간화”다. 따라서 before/after 지표가 필요하다.
|
|
211
|
+
|
|
212
|
+
#### Humanization Gain
|
|
213
|
+
|
|
214
|
+
```text
|
|
215
|
+
humanization_gain = before_ai_likeness - after_ai_likeness
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
#### Meaning Safety
|
|
219
|
+
|
|
220
|
+
```text
|
|
221
|
+
meaning_safety = min(MPS, fidelity)
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
#### Safe Humanization Gain
|
|
225
|
+
|
|
226
|
+
```text
|
|
227
|
+
safe_gain = max(0, humanization_gain) * (meaning_safety / 100)
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
해석:
|
|
231
|
+
|
|
232
|
+
| 상황 | 해석 |
|
|
233
|
+
|---|---|
|
|
234
|
+
| AI score는 많이 낮아졌지만 MPS가 낮음 | 의미를 망가뜨린 가짜 개선 |
|
|
235
|
+
| MPS는 높지만 AI score가 그대로임 | 안전하지만 인간화 실패 |
|
|
236
|
+
| AI score 하락 + MPS/fidelity 유지 | 성공 |
|
|
237
|
+
|
|
238
|
+
#### Stability
|
|
239
|
+
|
|
240
|
+
LLM 기반 rewrite는 비결정적이므로 같은 fixture를 N회 돌린 분산도 필요하다.
|
|
241
|
+
|
|
242
|
+
```text
|
|
243
|
+
score_stability = stddev(after_ai_likeness over N runs)
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
보고는 평균만 하지 말고 `mean ± stddev`로 한다.
|
|
247
|
+
|
|
248
|
+
## 6. benchmark 보고서에 추가할 지표
|
|
249
|
+
|
|
250
|
+
현재 accuracy/F1은 유지하되, 연구용으로 다음을 추가한다.
|
|
251
|
+
|
|
252
|
+
| 지표 | 이유 | 우선순위 |
|
|
253
|
+
|---|---|---:|
|
|
254
|
+
| ROC-AUC | threshold와 무관한 ranking 품질 | 높음 |
|
|
255
|
+
| PR-AUC | positive class가 희소해질 때 유용 | 높음 |
|
|
256
|
+
| threshold sweep | FP/TP tradeoff 확인 | 높음 |
|
|
257
|
+
| per-register FP | 학술/법률/백과/마케팅 등 register별 오탐 확인 | 높음 |
|
|
258
|
+
| per-language metrics | ko/en/zh/ja 성능 분리 | 높음 |
|
|
259
|
+
| per-generator metrics | GPT/Claude/Gemini/Llama 차이 | 중간 |
|
|
260
|
+
| adversarial robustness | paraphrase/humanizer/translation 공격 | 중간 |
|
|
261
|
+
| calibration curve / ECE | 점수를 확률처럼 말하지 않기 위한 점검 | 낮음-중간 |
|
|
262
|
+
|
|
263
|
+
## 7. Corpus 확장 설계
|
|
264
|
+
|
|
265
|
+
최소 확장 단위는 “언어 × 출처 × register × 생성기”로 나눈다.
|
|
266
|
+
|
|
267
|
+
### 7.1 Human corpus
|
|
268
|
+
|
|
269
|
+
| 언어 | 후보 | 목적 |
|
|
270
|
+
|---|---|---|
|
|
271
|
+
| ko | NamuWiki, 블로그/에세이, 뉴스, 공공문서 | 한국어 register별 FP 측정 |
|
|
272
|
+
| en | HC3 human, Wikipedia, news, essays | 기존 calibration 연속성 |
|
|
273
|
+
| zh/ja | Wikipedia/뉴스/블로그 계열 | zh/ja benchmark 확장 전 토큰화 결정 필요 |
|
|
274
|
+
|
|
275
|
+
### 7.2 AI corpus
|
|
276
|
+
|
|
277
|
+
| 축 | 후보 |
|
|
278
|
+
|---|---|
|
|
279
|
+
| 모델 | GPT, Claude, Gemini, Llama/Qwen 계열 |
|
|
280
|
+
| prompt | neutral, academic, marketing, casual, “humanize this” |
|
|
281
|
+
| decoding | default, high temperature, low temperature |
|
|
282
|
+
| 후처리 | paraphrase, translation roundtrip, light human edit |
|
|
283
|
+
|
|
284
|
+
### 7.3 Fixture metadata 권장
|
|
285
|
+
|
|
286
|
+
```yaml
|
|
287
|
+
fixture_id: ko-ai-claude-academic-001
|
|
288
|
+
language: ko
|
|
289
|
+
class: ai
|
|
290
|
+
source_type: generated
|
|
291
|
+
model_family: claude
|
|
292
|
+
register: academic
|
|
293
|
+
prompt_style: neutral
|
|
294
|
+
postprocess: none
|
|
295
|
+
expected_hot: true
|
|
296
|
+
expected_features:
|
|
297
|
+
- low_burstiness
|
|
298
|
+
- ai_lexicon
|
|
299
|
+
- nominalization
|
|
300
|
+
notes: |
|
|
301
|
+
왜 이 fixture가 필요한지, 어떤 신호가 발화해야 하는지 기록한다.
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
## 8. 구현 우선순위
|
|
305
|
+
|
|
306
|
+
### Phase 1 — 보고 강화, 의존성 없음
|
|
307
|
+
|
|
308
|
+
- `tests/quality/results.json`에 feature vector를 더 상세히 저장
|
|
309
|
+
- threshold sweep과 ROC-AUC/PR-AUC 계산 추가
|
|
310
|
+
- per-register/per-language/per-class 요약 추가
|
|
311
|
+
- `tests/quality/README.md`에 “AI-likeness이지 provenance가 아님” 명시
|
|
312
|
+
|
|
313
|
+
### Phase 2 — corpus 확장
|
|
314
|
+
|
|
315
|
+
- synthetic/curated fixture 34개에서 real-world sampled fixture로 확장
|
|
316
|
+
- human false positive register를 먼저 늘린다
|
|
317
|
+
- 목표: 언어별 최소 100 human + 100 AI paragraph
|
|
318
|
+
|
|
319
|
+
### Phase 3 — 새 deterministic feature
|
|
320
|
+
|
|
321
|
+
- function-word divergence
|
|
322
|
+
- punctuation rhythm
|
|
323
|
+
- sentence opener diversity
|
|
324
|
+
- 한국어 수동/명사화 proxy
|
|
325
|
+
|
|
326
|
+
이 단계도 외부 의존성 없이 구현 가능해야 한다.
|
|
327
|
+
|
|
328
|
+
### Phase 4 — optional LM probability research
|
|
329
|
+
|
|
330
|
+
- GLTR-style logprob/rank/entropy 실험
|
|
331
|
+
- Binoculars/DetectGPT류는 별도 research script로만 검토
|
|
332
|
+
- 기본 CLI/benchmark에는 넣지 않는다
|
|
333
|
+
|
|
334
|
+
## 9. 성공 기준 제안
|
|
335
|
+
|
|
336
|
+
현재 README의 공개 수치와 충돌하지 않게 다음 기준을 둔다.
|
|
337
|
+
|
|
338
|
+
| 기준 | 제안 threshold |
|
|
339
|
+
|---|---:|
|
|
340
|
+
| AI catch rate | ≥ 75% |
|
|
341
|
+
| max human FP | ≤ 25% |
|
|
342
|
+
| register-specific FP | 각 register ≤ 30%, 경계 register는 별도 표기 |
|
|
343
|
+
| rewrite after AI-likeness | target ≤ 30 |
|
|
344
|
+
| MPS floor | ≥ 70 |
|
|
345
|
+
| fidelity floor | ≥ 70 |
|
|
346
|
+
| safe_gain | 양수이고 meaning_safety ≥ 70 |
|
|
347
|
+
|
|
348
|
+
주의: 이 기준은 “작성자 판정”이 아니라 patina 내부 품질 회귀 기준이다.
|
|
349
|
+
|
|
350
|
+
## 10. 결론
|
|
351
|
+
|
|
352
|
+
patina가 따라야 할 방향은 범용 AI detector가 아니다. 더 강한 방향은 다음이다.
|
|
353
|
+
|
|
354
|
+
1. **설명 가능한 다중 신호**로 AI-like writing pattern을 측정한다.
|
|
355
|
+
2. **human false positive를 register별로 공개**한다.
|
|
356
|
+
3. **rewrite 전후의 gain과 meaning safety를 함께 본다.**
|
|
357
|
+
4. **단일 AI 확률을 주장하지 않는다.**
|
|
358
|
+
5. 무거운 LM-probability detector는 optional research track으로 격리한다.
|
|
359
|
+
|
|
360
|
+
즉, patina benchmark의 핵심 지표는 다음 세 문장으로 요약할 수 있다.
|
|
361
|
+
|
|
362
|
+
```text
|
|
363
|
+
얼마나 AI스럽게 읽히는가?
|
|
364
|
+
얼마나 사람 글의 변동성과 구체성을 회복했는가?
|
|
365
|
+
그 과정에서 의미를 얼마나 안전하게 보존했는가?
|
|
366
|
+
```
|
|
367
|
+
|
|
368
|
+
## 참고 자료
|
|
369
|
+
|
|
370
|
+
- GLTR: Statistical Detection and Visualization of Generated Text — https://arxiv.org/abs/1906.04043
|
|
371
|
+
- DetectGPT: Zero-Shot Machine-Generated Text Detection using Probability Curvature — https://arxiv.org/abs/2301.11305
|
|
372
|
+
- Ghostbuster: Detecting Text Ghostwritten by Large Language Models — https://arxiv.org/abs/2305.15047
|
|
373
|
+
- M4: Multi-generator, Multi-domain, and Multi-lingual Black-Box Machine-Generated Text Detection — https://arxiv.org/abs/2305.14902
|
|
374
|
+
- RAID: A Shared Benchmark for Robust Evaluation of Machine-Generated Text Detectors — https://arxiv.org/abs/2405.07940
|
|
375
|
+
- Spotting LLMs With Binoculars — https://arxiv.org/abs/2401.12070
|
|
376
|
+
- Can AI-Generated Text be Reliably Detected? — https://arxiv.org/abs/2303.11156
|
|
377
|
+
- OpenAI: New AI classifier for indicating AI-written text — https://openai.com/index/new-ai-classifier-for-indicating-ai-written-text/
|
|
378
|
+
- A Watermark for Large Language Models — https://proceedings.mlr.press/v202/kirchenbauer23a.html
|
|
379
|
+
- SynthID-Text / Scalable watermarking for identifying large language model outputs — https://www.nature.com/articles/s41586-024-08025-4
|
|
380
|
+
- Covington & McFall, MATTR — https://www.tandfonline.com/doi/abs/10.1080/09296171003643098
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="ko">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>gstack 카드뉴스 초안</title>
|
|
7
|
+
<style>
|
|
8
|
+
:root {
|
|
9
|
+
--bg: #121212;
|
|
10
|
+
--panel: #1d1d1d;
|
|
11
|
+
--panel-2: #232323;
|
|
12
|
+
--text: #f5f5f5;
|
|
13
|
+
--muted: #b8b8b8;
|
|
14
|
+
--accent: #b8ff01;
|
|
15
|
+
--border: rgba(255,255,255,0.08);
|
|
16
|
+
}
|
|
17
|
+
* { box-sizing: border-box; }
|
|
18
|
+
body {
|
|
19
|
+
margin: 0;
|
|
20
|
+
font-family: Pretendard, Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
21
|
+
background: #0b0b0b;
|
|
22
|
+
color: var(--text);
|
|
23
|
+
line-height: 1.6;
|
|
24
|
+
padding: 24px;
|
|
25
|
+
}
|
|
26
|
+
.deck {
|
|
27
|
+
display: grid;
|
|
28
|
+
gap: 28px;
|
|
29
|
+
justify-content: center;
|
|
30
|
+
}
|
|
31
|
+
.slide {
|
|
32
|
+
width: 1080px;
|
|
33
|
+
min-height: 1350px;
|
|
34
|
+
background: linear-gradient(180deg, var(--panel), var(--bg));
|
|
35
|
+
border: 1px solid var(--border);
|
|
36
|
+
border-radius: 28px;
|
|
37
|
+
padding: 64px;
|
|
38
|
+
position: relative;
|
|
39
|
+
overflow: hidden;
|
|
40
|
+
box-shadow: 0 30px 80px rgba(0,0,0,0.4);
|
|
41
|
+
}
|
|
42
|
+
.eyebrow {
|
|
43
|
+
color: var(--accent);
|
|
44
|
+
font-weight: 800;
|
|
45
|
+
letter-spacing: 0.04em;
|
|
46
|
+
text-transform: uppercase;
|
|
47
|
+
margin-bottom: 20px;
|
|
48
|
+
}
|
|
49
|
+
h1, h2 {
|
|
50
|
+
margin: 0 0 20px;
|
|
51
|
+
line-height: 1.1;
|
|
52
|
+
letter-spacing: -0.03em;
|
|
53
|
+
}
|
|
54
|
+
h1 { font-size: 92px; }
|
|
55
|
+
h2 { font-size: 74px; }
|
|
56
|
+
.subtitle {
|
|
57
|
+
font-size: 34px;
|
|
58
|
+
color: var(--muted);
|
|
59
|
+
margin-bottom: 40px;
|
|
60
|
+
max-width: 820px;
|
|
61
|
+
}
|
|
62
|
+
.hero {
|
|
63
|
+
font-size: 42px;
|
|
64
|
+
font-weight: 700;
|
|
65
|
+
max-width: 860px;
|
|
66
|
+
}
|
|
67
|
+
ul {
|
|
68
|
+
margin: 0;
|
|
69
|
+
padding-left: 28px;
|
|
70
|
+
font-size: 34px;
|
|
71
|
+
}
|
|
72
|
+
li + li { margin-top: 14px; }
|
|
73
|
+
.grid {
|
|
74
|
+
display: grid;
|
|
75
|
+
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
76
|
+
gap: 18px;
|
|
77
|
+
margin-top: 30px;
|
|
78
|
+
}
|
|
79
|
+
.card {
|
|
80
|
+
background: var(--panel-2);
|
|
81
|
+
border: 1px solid var(--border);
|
|
82
|
+
border-radius: 22px;
|
|
83
|
+
padding: 24px 28px;
|
|
84
|
+
}
|
|
85
|
+
.card strong {
|
|
86
|
+
color: var(--accent);
|
|
87
|
+
display: block;
|
|
88
|
+
font-size: 22px;
|
|
89
|
+
margin-bottom: 10px;
|
|
90
|
+
text-transform: uppercase;
|
|
91
|
+
letter-spacing: 0.04em;
|
|
92
|
+
}
|
|
93
|
+
.card p {
|
|
94
|
+
margin: 0;
|
|
95
|
+
font-size: 29px;
|
|
96
|
+
color: var(--text);
|
|
97
|
+
}
|
|
98
|
+
.footer {
|
|
99
|
+
position: absolute;
|
|
100
|
+
left: 64px;
|
|
101
|
+
right: 64px;
|
|
102
|
+
bottom: 44px;
|
|
103
|
+
display: flex;
|
|
104
|
+
justify-content: space-between;
|
|
105
|
+
color: var(--muted);
|
|
106
|
+
font-size: 20px;
|
|
107
|
+
}
|
|
108
|
+
.accent-box {
|
|
109
|
+
margin-top: 28px;
|
|
110
|
+
padding: 24px 28px;
|
|
111
|
+
border-radius: 22px;
|
|
112
|
+
background: rgba(184,255,1,0.08);
|
|
113
|
+
border: 1px solid rgba(184,255,1,0.18);
|
|
114
|
+
font-size: 31px;
|
|
115
|
+
font-weight: 700;
|
|
116
|
+
}
|
|
117
|
+
.numbers {
|
|
118
|
+
display: grid;
|
|
119
|
+
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
120
|
+
gap: 18px;
|
|
121
|
+
margin-top: 34px;
|
|
122
|
+
}
|
|
123
|
+
.number {
|
|
124
|
+
background: var(--panel-2);
|
|
125
|
+
border: 1px solid var(--border);
|
|
126
|
+
border-radius: 22px;
|
|
127
|
+
padding: 28px;
|
|
128
|
+
}
|
|
129
|
+
.number .value {
|
|
130
|
+
font-size: 54px;
|
|
131
|
+
font-weight: 900;
|
|
132
|
+
color: var(--accent);
|
|
133
|
+
line-height: 1;
|
|
134
|
+
margin-bottom: 10px;
|
|
135
|
+
}
|
|
136
|
+
.number .label {
|
|
137
|
+
font-size: 24px;
|
|
138
|
+
color: var(--muted);
|
|
139
|
+
}
|
|
140
|
+
</style>
|
|
141
|
+
</head>
|
|
142
|
+
<body>
|
|
143
|
+
<main class="deck">
|
|
144
|
+
<section class="slide">
|
|
145
|
+
<div class="eyebrow">Github Repo Review</div>
|
|
146
|
+
<h1>gstack</h1>
|
|
147
|
+
<p class="subtitle">Claude Code를 팀처럼 쓰는 법</p>
|
|
148
|
+
<p class="hero">프롬프트 몇 개 더 붙이는 얘기가 아니다. 역할, 순서, 검토 루프를 통째로 세팅하는 방식이다.</p>
|
|
149
|
+
<div class="footer"><span>garrytan/gstack</span><span>1 / 7</span></div>
|
|
150
|
+
</section>
|
|
151
|
+
|
|
152
|
+
<section class="slide">
|
|
153
|
+
<div class="eyebrow">Problem</div>
|
|
154
|
+
<h2>AI 코딩이 자꾸<br>어긋나는 이유</h2>
|
|
155
|
+
<div class="grid">
|
|
156
|
+
<div class="card"><strong>Role</strong><p>역할이 없으면 모델은 그냥 범용 답변기로 돌아간다.</p></div>
|
|
157
|
+
<div class="card"><strong>Review</strong><p>리뷰가 없으면 돌아가는 코드와 안전한 코드를 구분 못 한다.</p></div>
|
|
158
|
+
<div class="card"><strong>QA</strong><p>QA가 없으면 결국 사람 손으로 다시 확인하게 된다.</p></div>
|
|
159
|
+
<div class="card"><strong>Process</strong><p>순서가 없으면 아이디어가 바로 구현으로 튀어서 방향이 흔들린다.</p></div>
|
|
160
|
+
</div>
|
|
161
|
+
<div class="accent-box">모델보다 운영 방식이 더 중요하다.</div>
|
|
162
|
+
<div class="footer"><span>gstack cardnews draft</span><span>2 / 7</span></div>
|
|
163
|
+
</section>
|
|
164
|
+
|
|
165
|
+
<section class="slide">
|
|
166
|
+
<div class="eyebrow">What it does</div>
|
|
167
|
+
<h2>Claude Code를<br>역할 분리된 팀으로</h2>
|
|
168
|
+
<div class="grid">
|
|
169
|
+
<div class="card"><strong>/office-hours</strong><p>문제 자체를 다시 정의한다.</p></div>
|
|
170
|
+
<div class="card"><strong>/plan-ceo-review</strong><p>범위를 다시 보고 제품 방향을 점검한다.</p></div>
|
|
171
|
+
<div class="card"><strong>/plan-eng-review</strong><p>설계, 에러 경로, 테스트를 고정한다.</p></div>
|
|
172
|
+
<div class="card"><strong>/review</strong><p>CI는 통과하지만 프로덕션에서 터질 문제를 찾는다.</p></div>
|
|
173
|
+
<div class="card"><strong>/qa</strong><p>실제 브라우저로 클릭하며 확인한다.</p></div>
|
|
174
|
+
<div class="card"><strong>/ship</strong><p>PR과 릴리즈까지 마무리한다.</p></div>
|
|
175
|
+
</div>
|
|
176
|
+
<div class="footer"><span>핵심은 역할 분리</span><span>3 / 7</span></div>
|
|
177
|
+
</section>
|
|
178
|
+
|
|
179
|
+
<section class="slide">
|
|
180
|
+
<div class="eyebrow">Process</div>
|
|
181
|
+
<h2>도구 모음보다<br>프로세스에 가깝다</h2>
|
|
182
|
+
<div class="numbers">
|
|
183
|
+
<div class="number"><div class="value">Think</div><div class="label">아이디어를 다시 본다</div></div>
|
|
184
|
+
<div class="number"><div class="value">Plan</div><div class="label">범위와 구조를 고정한다</div></div>
|
|
185
|
+
<div class="number"><div class="value">Build</div><div class="label">그 다음에 구현한다</div></div>
|
|
186
|
+
</div>
|
|
187
|
+
<div class="numbers">
|
|
188
|
+
<div class="number"><div class="value">Review</div><div class="label">버그와 누락을 잡는다</div></div>
|
|
189
|
+
<div class="number"><div class="value">Test</div><div class="label">브라우저와 회귀 검증을 붙인다</div></div>
|
|
190
|
+
<div class="number"><div class="value">Ship</div><div class="label">배포 후 회고까지 이어진다</div></div>
|
|
191
|
+
</div>
|
|
192
|
+
<div class="accent-box">각 스킬이 다음 단계의 입력을 만든다. 그래서 흐름이 끊기지 않는다.</div>
|
|
193
|
+
<div class="footer"><span>Think → Plan → Build → Review → Test → Ship → Reflect</span><span>4 / 7</span></div>
|
|
194
|
+
</section>
|
|
195
|
+
|
|
196
|
+
<section class="slide">
|
|
197
|
+
<div class="eyebrow">Why people watch it</div>
|
|
198
|
+
<h2>숫자보다<br>주장 구조가 세다</h2>
|
|
199
|
+
<ul>
|
|
200
|
+
<li>README 기준 최근 60일 생산 코드 60만+ 라인</li>
|
|
201
|
+
<li>테스트 비중 35%</li>
|
|
202
|
+
<li>하루 1만~2만 라인 주장</li>
|
|
203
|
+
<li>1주일 362 commits, 140,751 lines added</li>
|
|
204
|
+
</ul>
|
|
205
|
+
<div class="accent-box">중요한 건 숫자 자체보다, 역할 분리와 리뷰 루프를 붙였더니 처리량이 올라갔다는 서사다.</div>
|
|
206
|
+
<p class="subtitle">주의: 위 수치는 외부 검증치가 아니라 gstack README의 자기 보고 기준이다.</p>
|
|
207
|
+
<div class="footer"><span>README self-reported metrics</span><span>5 / 7</span></div>
|
|
208
|
+
</section>
|
|
209
|
+
|
|
210
|
+
<section class="slide">
|
|
211
|
+
<div class="eyebrow">Why Codex users care</div>
|
|
212
|
+
<h2>Claude 전용에서<br>안 멈춘다</h2>
|
|
213
|
+
<div class="grid">
|
|
214
|
+
<div class="card"><strong>Standard</strong><p>README는 SKILL.md 표준을 지원하는 에이전트로 확장 가능하다고 설명한다.</p></div>
|
|
215
|
+
<div class="card"><strong>Hosts</strong><p>Codex, Gemini CLI, Cursor 설치 경로를 별도로 안내한다.</p></div>
|
|
216
|
+
<div class="card"><strong>Codex install</strong><p><code>.agents/skills/gstack</code>에 clone 후 <code>./setup --host codex</code>.</p></div>
|
|
217
|
+
<div class="card"><strong>Takeaway</strong><p>워크플로우 자체를 다른 에이전트로 이식하려는 시도다.</p></div>
|
|
218
|
+
</div>
|
|
219
|
+
<div class="footer"><span>repo metadata checked 2026-03-27 UTC</span><span>6 / 7</span></div>
|
|
220
|
+
</section>
|
|
221
|
+
|
|
222
|
+
<section class="slide">
|
|
223
|
+
<div class="eyebrow">Takeaway</div>
|
|
224
|
+
<h2>AI를 잘 쓰는 건<br>모델 선택이 끝이 아니다</h2>
|
|
225
|
+
<ul>
|
|
226
|
+
<li>역할을 나누고</li>
|
|
227
|
+
<li>순서를 고정하고</li>
|
|
228
|
+
<li>리뷰와 QA를 붙여야 한다</li>
|
|
229
|
+
</ul>
|
|
230
|
+
<div class="accent-box">AI가 자꾸 엉뚱한 방향으로 가면, gstack README의 Quick start부터 읽어볼 만하다.</div>
|
|
231
|
+
<p class="subtitle">2026-03-27 UTC 기준 GitHub: Stars 50,844 · Forks 6,519 · License MIT</p>
|
|
232
|
+
<div class="footer"><span>https://github.com/garrytan/gstack</span><span>7 / 7</span></div>
|
|
233
|
+
</section>
|
|
234
|
+
</main>
|
|
235
|
+
</body>
|
|
236
|
+
</html>
|