@solaqua/ghosts 0.1.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/README.md +41 -0
- package/common/AGENTS.md +19 -0
- package/engineering/skills/code-review/SKILL.md +46 -0
- package/engineering/skills/deep-module/SKILL.md +9 -0
- package/engineering/skills/explain-diff/SKILL.md +24 -0
- package/engineering/skills/github-pr/SKILL.md +36 -0
- package/engineering/skills/loop-coding/SKILL.md +46 -0
- package/engineering/skills/loop-plan/SKILL.md +229 -0
- package/engineering/skills/socratic-interview/SKILL.md +22 -0
- package/engineering/skills/task-handoff/SKILL.md +37 -0
- package/engineering/skills/work-breakdown/SKILL.md +26 -0
- package/manifest.json +3 -0
- package/package.json +22 -0
- package/registry/skul.refs.json +55 -0
- package/research/skills/decision-research/SKILL.md +56 -0
- package/research/skills/loop-research/SKILL.md +120 -0
- package/tools/skills/vibe-notion/SKILL.md +138 -0
- package/tools/skills/vibe-notion/UPSTREAM.md +15 -0
- package/tools/skills/vibe-notion/references/batch-operations.md +100 -0
- package/tools/skills/vibe-notion/references/block-types.md +73 -0
- package/tools/skills/vibe-notion/references/common-patterns.md +165 -0
- package/tools/skills/vibe-notion/references/output-format.md +126 -0
- package/tools/skills/vibe-notion/templates/create-page.sh +32 -0
- package/tools/skills/vibe-notion/templates/query-database.sh +12 -0
- package/tools/skills/vibe-notion/templates/read-page.sh +16 -0
- package/tools/skills/vibe-notion/templates/workspace-overview.sh +19 -0
- package/writing/skills/cold-reader/README.md +7 -0
- package/writing/skills/cold-reader/SKILL.md +48 -0
- package/writing/skills/eli5/SKILL.md +7 -0
- package/writing/skills/humanize-korean/SKILL.md +94 -0
- package/writing/skills/humanize-korean/references/ai-tell-taxonomy.md +149 -0
- package/writing/skills/humanize-korean/references/metrics.py +809 -0
- package/writing/skills/humanize-korean/references/quick-rules.md +107 -0
- package/writing/skills/humanize-korean/references/rewriting-playbook.md +122 -0
- package/writing/skills/humanize-korean/tests/test_metrics.py +176 -0
- package/writing/skills/loop-skills/SKILL.md +101 -0
- package/writing/skills/rewrite/SKILL.md +50 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Output Format
|
|
2
|
+
|
|
3
|
+
## JSON (Default)
|
|
4
|
+
|
|
5
|
+
All commands output JSON by default for AI consumption:
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
# Search results
|
|
9
|
+
vibe-notion search "Roadmap" --workspace-id <workspace_id>
|
|
10
|
+
```
|
|
11
|
+
```json
|
|
12
|
+
{
|
|
13
|
+
"results": [
|
|
14
|
+
{
|
|
15
|
+
"id": "305c0fcf-90b3-807a-bc1a-dc7cc18e0022",
|
|
16
|
+
"title": "Getting Started",
|
|
17
|
+
"score": 76.58
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"has_more": true,
|
|
21
|
+
"next_cursor": "20",
|
|
22
|
+
"total": 100
|
|
23
|
+
}
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
# Database query — properties use human-readable field names from the collection schema
|
|
28
|
+
vibe-notion database query <database_id> --workspace-id <workspace_id>
|
|
29
|
+
```
|
|
30
|
+
```json
|
|
31
|
+
{
|
|
32
|
+
"results": [
|
|
33
|
+
{
|
|
34
|
+
"id": "row-uuid",
|
|
35
|
+
"properties": {
|
|
36
|
+
"Name": "Acme Corp",
|
|
37
|
+
"Status": "Active",
|
|
38
|
+
"Type": "Enterprise"
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
"has_more": false,
|
|
43
|
+
"next_cursor": null
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Schema Hints (`$hints`)
|
|
48
|
+
|
|
49
|
+
`database get` and `database query` may include a `$hints` array when the database schema has issues. These are actionable warnings — follow the instructions in each hint to fix the problem.
|
|
50
|
+
|
|
51
|
+
```json
|
|
52
|
+
{
|
|
53
|
+
"id": "collection-uuid",
|
|
54
|
+
"name": "My Database",
|
|
55
|
+
"schema": { "Name": "title", "Status": "select" },
|
|
56
|
+
"$hints": [
|
|
57
|
+
"Rollup 'Revenue Sum' depends on deleted relation 'Deals'. This rollup will return empty values. Fix: run `database delete-property <database_id> --workspace-id <workspace_id> --property \"Revenue Sum\"` to remove it."
|
|
58
|
+
]
|
|
59
|
+
}
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
**When `$hints` is present**: Read each hint carefully and execute the suggested fix commands. Broken properties can crash the Notion app for the user. Common issues detected:
|
|
63
|
+
|
|
64
|
+
- **Dead properties**: Soft-deleted but still in schema. Usually harmless but indicates past issues.
|
|
65
|
+
- **Broken rollups**: Reference deleted or missing relations. Will return empty values and may crash Notion.
|
|
66
|
+
- **Broken relations**: Missing target collection. May crash Notion.
|
|
67
|
+
|
|
68
|
+
If `$hints` is absent, the schema is clean — no action needed.
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
# Page get — returns page metadata with content blocks
|
|
72
|
+
vibe-notion page get <page_id> --workspace-id <workspace_id>
|
|
73
|
+
```
|
|
74
|
+
```json
|
|
75
|
+
{
|
|
76
|
+
"id": "page-uuid",
|
|
77
|
+
"title": "My Page",
|
|
78
|
+
"space_id": "workspace-uuid",
|
|
79
|
+
"blocks": [
|
|
80
|
+
{ "id": "block-1", "type": "text", "text": "Hello world" },
|
|
81
|
+
{ "id": "block-2", "type": "to_do", "text": "Task item" }
|
|
82
|
+
]
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
The `space_id` field identifies the workspace that owns the page. Use it as `--workspace-id` for any follow-up writes.
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
# With --backlinks: includes pages that link to this page/block
|
|
90
|
+
vibe-notion page get <page_id> --workspace-id <workspace_id> --backlinks
|
|
91
|
+
vibe-notion block get <block_id> --workspace-id <workspace_id> --backlinks
|
|
92
|
+
```
|
|
93
|
+
```json
|
|
94
|
+
{
|
|
95
|
+
"id": "page-uuid",
|
|
96
|
+
"title": "My Page",
|
|
97
|
+
"blocks": [],
|
|
98
|
+
"backlinks": [
|
|
99
|
+
{ "id": "linking-page-uuid", "title": "Page That Links Here" }
|
|
100
|
+
]
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
# Block get — collection_view blocks include collection_id and view_ids
|
|
106
|
+
vibe-notion block get <block_id> --workspace-id <workspace_id>
|
|
107
|
+
```
|
|
108
|
+
```json
|
|
109
|
+
{
|
|
110
|
+
"id": "block-uuid",
|
|
111
|
+
"type": "collection_view",
|
|
112
|
+
"text": "",
|
|
113
|
+
"parent_id": "parent-uuid",
|
|
114
|
+
"space_id": "workspace-uuid",
|
|
115
|
+
"collection_id": "collection-uuid",
|
|
116
|
+
"view_ids": ["view-uuid"]
|
|
117
|
+
}
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
## Pretty (Human-Readable)
|
|
121
|
+
|
|
122
|
+
Use `--pretty` flag for formatted output on any command:
|
|
123
|
+
|
|
124
|
+
```bash
|
|
125
|
+
vibe-notion search "Roadmap" --workspace-id <workspace_id> --pretty
|
|
126
|
+
```
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Create a page and append a heading and paragraph
|
|
3
|
+
|
|
4
|
+
if [ -z "$3" ]; then
|
|
5
|
+
echo "Usage: $0 <workspace_id> <parent_id> <title>"
|
|
6
|
+
exit 1
|
|
7
|
+
fi
|
|
8
|
+
|
|
9
|
+
WORKSPACE_ID=$1
|
|
10
|
+
PARENT_ID=$2
|
|
11
|
+
TITLE=$3
|
|
12
|
+
|
|
13
|
+
echo "Creating page: $TITLE"
|
|
14
|
+
# Create page and extract ID
|
|
15
|
+
# Note: Requires 'jq' to be installed for ID extraction
|
|
16
|
+
RESPONSE=$(vibe-notion page create --workspace-id "$WORKSPACE_ID" --parent "$PARENT_ID" --title "$TITLE")
|
|
17
|
+
PAGE_ID=$(echo $RESPONSE | jq -r '.id')
|
|
18
|
+
|
|
19
|
+
if [ "$PAGE_ID" == "null" ] || [ -z "$PAGE_ID" ]; then
|
|
20
|
+
echo "Failed to create page"
|
|
21
|
+
echo $RESPONSE
|
|
22
|
+
exit 1
|
|
23
|
+
fi
|
|
24
|
+
|
|
25
|
+
echo "Page created with ID: $PAGE_ID"
|
|
26
|
+
|
|
27
|
+
# Append content
|
|
28
|
+
echo "Appending content blocks..."
|
|
29
|
+
vibe-notion block append "$PAGE_ID" --workspace-id "$WORKSPACE_ID" --content '[
|
|
30
|
+
{"type": "sub_header", "properties": {"title": [["Welcome to your new page"]]}},
|
|
31
|
+
{"type": "text", "properties": {"title": [["This page was created automatically using the Vibe Notion CLI."]]}}
|
|
32
|
+
]' --pretty
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Query a database and list the titles of the results
|
|
3
|
+
|
|
4
|
+
if [ -z "$2" ]; then
|
|
5
|
+
echo "Usage: $0 <workspace_id> <database_id>"
|
|
6
|
+
exit 1
|
|
7
|
+
fi
|
|
8
|
+
|
|
9
|
+
WORKSPACE_ID=$1
|
|
10
|
+
DATABASE_ID=$2
|
|
11
|
+
|
|
12
|
+
vibe-notion database query "$DATABASE_ID" --workspace-id "$WORKSPACE_ID" --pretty
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Read a page and its direct children
|
|
3
|
+
|
|
4
|
+
if [ -z "$2" ]; then
|
|
5
|
+
echo "Usage: $0 <workspace_id> <page_id>"
|
|
6
|
+
exit 1
|
|
7
|
+
fi
|
|
8
|
+
|
|
9
|
+
WORKSPACE_ID=$1
|
|
10
|
+
PAGE_ID=$2
|
|
11
|
+
|
|
12
|
+
echo "--- Page Metadata ---"
|
|
13
|
+
vibe-notion page get "$PAGE_ID" --workspace-id "$WORKSPACE_ID" --pretty
|
|
14
|
+
|
|
15
|
+
echo -e "\n--- Page Content (Direct Children) ---"
|
|
16
|
+
vibe-notion block children "$PAGE_ID" --workspace-id "$WORKSPACE_ID" --pretty
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Get an overview of the workspace
|
|
3
|
+
|
|
4
|
+
if [ -z "$1" ]; then
|
|
5
|
+
echo "Usage: $0 <workspace_id>"
|
|
6
|
+
echo "Run 'vibe-notion workspace list' to find your workspace ID."
|
|
7
|
+
exit 1
|
|
8
|
+
fi
|
|
9
|
+
|
|
10
|
+
WORKSPACE_ID=$1
|
|
11
|
+
|
|
12
|
+
echo "--- Current User Info ---"
|
|
13
|
+
vibe-notion auth status --pretty
|
|
14
|
+
|
|
15
|
+
echo -e "\n--- Accessible Databases ---"
|
|
16
|
+
vibe-notion database list --workspace-id "$WORKSPACE_ID" --pretty
|
|
17
|
+
|
|
18
|
+
echo -e "\n--- Recent Pages (Search) ---"
|
|
19
|
+
vibe-notion search "" --workspace-id "$WORKSPACE_ID" --sort lastEdited --limit 5 --pretty
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cold-reader
|
|
3
|
+
description: Draft or revise PR descriptions, ADRs, design documents, implementation plans, review responses, and other engineering artifacts for readers who did not participate in the preceding conversation. Do not use for casual conversation, ordinary code comments, or documents explicitly intended to rely on linked prior context.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Cold-Reader Writing
|
|
7
|
+
|
|
8
|
+
Draft or revise engineering artifacts so their intended readers can understand them without access to the private conversation behind them.
|
|
9
|
+
|
|
10
|
+
Use this for PR descriptions, ADRs, design documents, implementation plans, review responses, and similar artifacts. Do not use it for casual conversation, ordinary code comments, or artifacts explicitly intended to rely on linked prior context.
|
|
11
|
+
|
|
12
|
+
## Context
|
|
13
|
+
|
|
14
|
+
Treat preceding conversation as private working context. Identify claims, decisions, exclusions, and shorthand that depend on it, then restore only the premises needed by the reader.
|
|
15
|
+
|
|
16
|
+
Do not expose the conversation, reproduce every considered alternative, or add irrelevant background.
|
|
17
|
+
|
|
18
|
+
## Audience
|
|
19
|
+
|
|
20
|
+
Infer the intended readers and calibrate the explanation to their domain and repository knowledge. Follow any audience the user specifies.
|
|
21
|
+
|
|
22
|
+
Do not assume readers participated in the design discussion or treat experienced reviewers as beginners.
|
|
23
|
+
|
|
24
|
+
When the audience is unclear, write for a technically capable teammate who knows the repository but not the specific domain or decision.
|
|
25
|
+
|
|
26
|
+
## Language
|
|
27
|
+
|
|
28
|
+
Preserve technical precision and use domain terminology when useful. This does not require explaining every repository convention, avoiding technical language, or writing for a complete beginner.
|
|
29
|
+
|
|
30
|
+
Prefer direct, literal statements to mannered metaphor or flourish. When a literal phrase is available, use it instead of making readers decode language that mainly performs the writer or introduces unintended connotations.
|
|
31
|
+
|
|
32
|
+
When terminology hides an important premise, failure mode, or scope boundary, make that meaning understandable in the surrounding text.
|
|
33
|
+
|
|
34
|
+
Do not mechanically remove jargon, add glossaries, expand every acronym, or lengthen the artifact merely to appear accessible.
|
|
35
|
+
|
|
36
|
+
## Cold-reader review
|
|
37
|
+
|
|
38
|
+
Before delivering or publishing, reread the artifact as if the preceding conversation were unavailable. Perform this review internally unless the user asks to see it.
|
|
39
|
+
|
|
40
|
+
Revise anything that materially depends on missing context, including:
|
|
41
|
+
|
|
42
|
+
- conclusions whose premises exist only in the conversation;
|
|
43
|
+
- exclusions justified only as unnecessary, too complex, or not worth the cost;
|
|
44
|
+
- references such as “as discussed,” “the current approach,” or “this risk” without a clear referent;
|
|
45
|
+
- technical terms standing in for an unexplained situation;
|
|
46
|
+
- assumptions about environment, usage, constraints, or reader knowledge that affect the conclusion.
|
|
47
|
+
|
|
48
|
+
Preserve the user’s chosen structure, tone, and level of detail when specified. Otherwise choose what best fits the artifact. Do not add sections, follow a fixed template, or rewrite an existing artifact wholesale merely to demonstrate compliance.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: eli5
|
|
3
|
+
description: Explain any supplied topic to a complete beginner as a self-contained HTML artifact with big visuals, few words, and simple examples.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Explain like I'm someone who knows nothing about this topic, using an HTML artifact with big pictures and few words. Save the finished artifact outside the repository at `/tmp/YYYY-MM-DD-explanation-<slug>.html` and return its absolute path.
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: humanize-korean
|
|
3
|
+
description: 한국어 원문의 의미·사실·장르를 보존하면서 번역투, AI 관용구, 기계적인 구조와 리듬만 필요한 범위에서 국소적으로 줄인다.
|
|
4
|
+
disable-model-invocation: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
한국어 원문을 진단하고, 탐지된 AI 티가 있는 구간만 자연스럽게 윤문한다. 번역, 요약, 사실 검증, 전면 맞춤법 교정, 새 글 작성으로 작업을 넓히지 않는다. 명시된 원문·파일은 우선하고, 작업 대상과 범위는 사용자 요청과 대화 문맥에서 암묵적으로 판단한다. 직전 결과의 설명·체크리스트는 원문에 포함하지 않으며, 판단이 불가능할 때만 한 번 확인한다.
|
|
8
|
+
|
|
9
|
+
원문을 읽기 전에 문장별 핵심 내용 앵커(주어·목적어·보어의 명사와 개념어)를 내부적으로 표시한다. 조사와 어미는 바꿀 수 있지만 앵커의 원형은 결과에 남긴다. 앵커가 사라질 것 같으면 자연스러움보다 의미 보존을 우선해 해당 수정을 되돌린다.
|
|
10
|
+
|
|
11
|
+
## 입력 및 제한 사항
|
|
12
|
+
|
|
13
|
+
- 인자가 `.txt` 또는 `.md` 경로면 파일을 읽고, 읽지 못하면 오류를 보고한 뒤 추측으로 대체하지 않는다. 그 밖에는 붙여넣은 텍스트를 원문으로 사용한다.
|
|
14
|
+
- 한국어 구간이 없으면 이 스킬은 한국어만 처리한다고 알리고 종료한다.
|
|
15
|
+
- 장르가 지정되지 않으면 첫 300자로 `칼럼`, `리포트`, `블로그`, `공적 문서` 중 하나를 추정한다.
|
|
16
|
+
- [references/quick-rules.md](references/quick-rules.md)를 먼저 읽는다. 세밀한 분류나 처방이 필요할 때만 [references/ai-tell-taxonomy.md](references/ai-tell-taxonomy.md)와 [references/rewriting-playbook.md](references/rewriting-playbook.md)를 추가로 읽는다.
|
|
17
|
+
- 고유명사·제품명·기관명, 수치·날짜·단위, 법률 조항·공식·표준 기술 약어, 따옴표로 묶인 인용문은 발화자 표지가 없어도 기본적으로 탐지하거나 바꾸지 않는다. 필자의 질문·강조임이 문맥상 명확한 수사 장치만 예외적으로 다룬다.
|
|
18
|
+
- 코드 블록, URL, 링크 목적지, 태그, 템플릿 변수도 보존한다.
|
|
19
|
+
- 원문에 없는 사실, 주장, 인과관계, 비유, 예시, 인용, 전환, 강조를 추가하지 않는다. 장르와 문체 격식도 유지한다.
|
|
20
|
+
- 당위·요구("~해야 한다")와 추측·유보("~일 수 있다", "~로 보인다")를 사실 단정으로 바꾸지 않는다. 서법 표지가 반복될 때도 표지를 삭제하거나 다른 서법으로 바꾸지 말고 문장 배치와 리듬만 조정한다.
|
|
21
|
+
- 탐지된 패턴이 없으면 원문을 그대로 두고 변경 없음으로 보고한다.
|
|
22
|
+
|
|
23
|
+
## 실행 전 체크리스트
|
|
24
|
+
|
|
25
|
+
작업마다 `/tmp/humanize-korean-<safe-task-slug>.md`를 만들고 아래 항목을 순서대로 처리한다. 현재 항목을 끝낸 뒤 결과를 기록하고 다음으로 간다. 완료한 항목만 `[x]`로 표시하며, 해당 없음은 `[-]`와 이유를 적는다. 수정이 앞선 판단을 무효화하면 완료한 `[x]`는 남겨 두고, 영향받은 항목을 패스 번호가 붙은 재검토 행으로 새로 덧붙인다. 같은 파일에 `현재 상태`와 `수리 로그`를 기록하고, 수리 로그에는 원인·수정·재검증 항목·결과를 적는다. 미래 항목은 미리 표시하지 않는다.
|
|
26
|
+
|
|
27
|
+
```text
|
|
28
|
+
- [ ] 입력·장르 확인
|
|
29
|
+
- [ ] 보존 구간 표시·AI 티 탐지
|
|
30
|
+
- [ ] 해당 구간만 윤문
|
|
31
|
+
- [ ] Any 검증 실패 또는 변경률 30% 초과?
|
|
32
|
+
- [ ] 재윤문·롤백 또는 결과 보고
|
|
33
|
+
- [ ] 최종 검증·출력
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
## 실행 루프
|
|
37
|
+
|
|
38
|
+
```text
|
|
39
|
+
[Start: 입력·장르 확인] → [규칙 읽기·탐지] → [해당 구간만 윤문]
|
|
40
|
+
↓
|
|
41
|
+
[Any validation failure or >30% changed?]
|
|
42
|
+
├─ 아니오 → [결과·검증 요약 보고] → [Done]
|
|
43
|
+
└─ 예 → [실패 구간 롤백·범위 축소]
|
|
44
|
+
↓
|
|
45
|
+
[해당 구간만 한 번 재윤문·재검증]
|
|
46
|
+
↓
|
|
47
|
+
[Any validation still fails, >50% changed, or meaning lost?]
|
|
48
|
+
├─ 아니오 → [결과·검증 요약 보고] → [Done]
|
|
49
|
+
└─ 예 → [전체 원문 복원·중단 보고] → [Done]
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
1. 보존 구간을 표시하고 AI 티를 탐지한다.
|
|
53
|
+
2. [references/quick-rules.md](references/quick-rules.md)의 수정 순서인 `D → A → I → G → H → F → B → C/J → E`를 따른다. 탐지되지 않은 구간은 건드리지 않는다.
|
|
54
|
+
3. quick-rules의 `자체검증` 1–6을 모두 수행한다. 특히 핵심 내용 앵커와 원문의 서법 표지가 문장별로 보존됐는지 확인한다. 실패한 수정만 롤백하고 같은 구간을 한 번만 다시 시도한다. 다시 실패하면 원문을 유지한다.
|
|
55
|
+
4. `metrics.py`의 `change_rate(before, after)`로 원문 대비 변경률을 계산한다. 30%를 넘으면 범위를 다시 줄이고 재검토한다. 그래도 30%를 넘으면 경고를 붙이며, 50% 이상이거나 의미 보존에 실패하면 전체 원문을 복원한다.
|
|
56
|
+
|
|
57
|
+
## 요청 범위와 강도
|
|
58
|
+
|
|
59
|
+
- `이 문단만`: 지정한 문단만 수정한다.
|
|
60
|
+
- `번역투만`, `관용구만`, `이모지만`: 해당 분류만 적용한다.
|
|
61
|
+
- `강도 낮춰`: S1 패턴만 수정한다.
|
|
62
|
+
- `강도 높여`: S1·S2와 신중한 S3 리듬 수정까지 적용한다.
|
|
63
|
+
- `2차 윤문`: 직전 결과를 입력으로 삼고 1차보다 좁게 수정한다.
|
|
64
|
+
|
|
65
|
+
## 보조 도구
|
|
66
|
+
|
|
67
|
+
긴 글이거나 판단이 애매할 때만 [references/metrics.py](references/metrics.py)를 사용한다. 사용법은 다음처럼 `--help`로 확인한다. 장르 인자는 `칼럼/에세이→essay`, `리포트→report`, `블로그→blog`, `공적 문서→formal`로 맞춘다.
|
|
68
|
+
|
|
69
|
+
원문과 윤문본의 변경률을 비교할 때는 `metrics.py`의 `change_rate(before, after)`를 사용한다. 30% 초과는 범위를 줄이는 경고, 50% 이상은 원문 복원 기준이다. 마크다운 구조 차이가 큰 경우 `ignore_markup=True`를 사용한다.
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
python3 references/metrics.py --help
|
|
73
|
+
python3 references/metrics.py --input input.txt --genre essay
|
|
74
|
+
python3 references/metrics.py --text $'첫 문장입니다.\n둘째 문장입니다.' --genre essay
|
|
75
|
+
python3 references/metrics.py --before original.md --after revised.md --ignore-markup
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## 출력
|
|
79
|
+
|
|
80
|
+
다음 순서로 응답한다.
|
|
81
|
+
|
|
82
|
+
```markdown
|
|
83
|
+
완료. 변경률 약 X% / 자체검증 N/6 통과
|
|
84
|
+
|
|
85
|
+
<윤문본>
|
|
86
|
+
|
|
87
|
+
핵심 탐지:
|
|
88
|
+
- A-2: 원문 구간 → 윤문 구간
|
|
89
|
+
|
|
90
|
+
주요 변경:
|
|
91
|
+
- 무엇을 줄였는지 한 줄로 설명
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
재윤문 후에도 변경률이 30%를 넘으면 경고를 붙인다. 50% 이상이면 검증에 실패한 것으로 보고 원문을 복원한다. 검증에 실패해 복원하거나 작업을 중단하면 `완료` 대신 그 사유와 원문 유지 여부를 보고한다.
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# AI 한글 티 분류 체계
|
|
2
|
+
|
|
3
|
+
LLM이 생성한 한국어 글에서 반복되는 AI 티를 10개 대분류로 정리한다. 각 항목은 탐지 기준, 심각도, 윤문 방향만 남긴다.
|
|
4
|
+
|
|
5
|
+
## 심각도
|
|
6
|
+
|
|
7
|
+
- `S1`: 결정적 신호. 발견하면 제거한다.
|
|
8
|
+
- `S2`: 반복되면 강한 신호. 밀도를 낮춘다.
|
|
9
|
+
- `S3`: 단독으로는 약하지만 다른 패턴과 겹치면 조정한다.
|
|
10
|
+
|
|
11
|
+
## 오탐 방지
|
|
12
|
+
|
|
13
|
+
- 단일 어휘나 정량 지표만으로 AI 글이라고 판정하지 않는다. 개인 문체·장르·과업에 따라 사람 글에도 같은 표현이 나온다.
|
|
14
|
+
- `~에 대해`, `~를 통해`, `~을 위해`, 문두 접속사, 완곡 표현은 단발 사용을 보존하고 문단 내 반복·연쇄일 때만 줄인다.
|
|
15
|
+
- 대구·은유는 사람 글의 수사일 수 있다. 따옴표로 묶인 인용문은 발화자 표지와 무관하게 기본 보호하고, 필자의 자문·강조임이 문맥상 명확한 경우만 예외로 한다. 반복 구조가 확인될 때만 국소적으로 손대며, 의미가 불명확하면 원문을 유지한다.
|
|
16
|
+
- 오탐 방지와 별개로, 윤문 과정에서 연결어미 뒤 쉼표·`결국`·`이유다`·`더 이상 A가 아니라 B` 같은 패턴을 새로 만들지 않는다.
|
|
17
|
+
|
|
18
|
+
## A. 번역투
|
|
19
|
+
|
|
20
|
+
| ID | 심각도 | 탐지 | 처방 |
|
|
21
|
+
|---|---|---|---|
|
|
22
|
+
| A-1 | S1 | `~에 대해(서)`가 한 문단에 3회 이상 밀집 | 일부만 목적격 조사로 직결한다. 단발 사용은 보존한다. |
|
|
23
|
+
| A-2 | S2 | `~를 통해/통하여`가 한 문단에 3회 이상 반복 | 일부만 `~로`, `~해서`, `~함으로써`로 분산한다. |
|
|
24
|
+
| A-3 | S1 | `~에 있어(서)` | `~에서`, `~을 볼 때`로 바꾼다. |
|
|
25
|
+
| A-4 | S2 | `~라는 점에서` 반복 | `~서`, `~라는 이유로`로 줄인다. |
|
|
26
|
+
| A-5 | S2 | `~와 관련하여/관련된` | `~에`, `~의`, 목적격 조사로 줄인다. |
|
|
27
|
+
| A-6 | S2 | `~에 기반하여/바탕으로` 반복 | `~로`, `~을 보고`, `~를 근거로`로 바꾼다. |
|
|
28
|
+
| A-7 | S1 | `가지고 있다`, `회의를 가지다`, have/make/take/give 직역 | 동사·형용사로 환원한다. |
|
|
29
|
+
| A-8 | S1 | 이중 피동 `~되어진다`, `~지게 된다` | 능동 또는 단일 피동으로 바꾼다. |
|
|
30
|
+
| A-9 | S2 | `~에 의해` 피동 | 행위자를 주어로 올린다. |
|
|
31
|
+
| A-10 | S2 | 같은 `~할 수 있다`가 4회 이상 반복 | 능력·허용이면 보존하고, 가능성·전망 문맥에서만 같은 서법의 `~할 수도 있다`·`~할 가능성이 있다`로 일부 분산한다. `~할 여지가 있다`는 가능성 의미가 확인될 때만 쓴다. |
|
|
32
|
+
| A-11 | S2 | `~을 위해` 목적절이 한 문단에 밀집 | `~려고`, `~도록`, `~위한`으로 일부만 바꾼다. 단발 사용은 보존한다. |
|
|
33
|
+
| A-12 | S2 | `만들어지다`, `이루어지다` 자동 피동 | 행위자나 동사를 복원한다. |
|
|
34
|
+
| A-13 | S2 | 조사 없는 영어식 명사 나열 | 필요한 조사를 복원하거나 절로 푼다. |
|
|
35
|
+
| A-14 | S2 | 문두 `그리고`로 평문 연결 | `-고`, `-며`, `-면서`로 압축한다. |
|
|
36
|
+
| A-15 | S2 | 추상 주어 + `보여준다/제공한다/가져온다/시사한다` | 구체 주어, 원인절, 근거절로 바꾼다. |
|
|
37
|
+
| A-16 | S1 | 대명사 출현마다 직전 2문장의 선행 명사구 후보를 확인 | 후보 0개면 명사구 복원(확정 불가면 유지), 1개면 생략, 2개 이상이면 명사구로 되짚는다. 삭제 비율 목표는 두지 않는다. |
|
|
38
|
+
| A-18 | S2 | 명사 앞 긴 관형구·관계절 좌향 수식 | 문장을 나누거나 후치 동격절로 푼다. |
|
|
39
|
+
| A-19 | S2 | `~에서의/~에로의/~으로의/~에의/~으로부터의` | 절로 풀어 쓴다. 단순 `~의`는 제외한다. |
|
|
40
|
+
| A-20 | S2 | `~되고 있다/~지고 있다`가 한 문단에 3회 이상 | 의미가 유지될 때 일부만 단순 시제로 환원한다. |
|
|
41
|
+
| A-21 | S2 | `단순한 X를 넘어 Y` | `X만이 아니라 Y`로 풀되 새 내용을 보태지 않는다. |
|
|
42
|
+
| A-22 | S2 | `~은/는 명확하다·분명하다` | 평가 술어를 걷고 명제를 직접 쓴다. 이미 논증한 결론이면 보존한다. |
|
|
43
|
+
| A-23 | S2 | `발판·토대·초석을 마련하다`, `지평을 열다` 전망형 | 은유를 실제로 가능해지는 내용으로 풀되, 원문에 없으면 평서형으로만 낮춘다. 과거 사실·인용·실물 기반은 보존한다. |
|
|
44
|
+
| A-24 | S2 | `더 이상 ~ 않다/아니다`가 2회 이상 또는 결말부 재정의에 등장 | `이제`로 바꾸거나 변화 동사로 편다. 부정 명제를 긍정으로 바꾸지 않으며 해당 골격을 새로 만들지 않는다. |
|
|
45
|
+
|
|
46
|
+
## B. 영어 인용·용어 과다
|
|
47
|
+
|
|
48
|
+
| ID | 심각도 | 탐지 | 처방 |
|
|
49
|
+
|---|---|---|---|
|
|
50
|
+
| B-1 | S2 | 한글 용어 뒤 영어 괄호를 매번 병기 | 첫 등장만 병기한다. |
|
|
51
|
+
| B-2 | S2 | 한국어 대응어가 있는데 영어를 그대로 둠 | 의미를 해치지 않을 때 한국어로 옮긴다. |
|
|
52
|
+
| B-3 | S2 | 영어 인용문과 번역 병기 남발 | 원문 어감이 핵심일 때만 유지한다. |
|
|
53
|
+
| B-4 | S3 | `~라고 알려진`, `~로 일컬어지는` | 자연스러운 명사구로 줄인다. |
|
|
54
|
+
|
|
55
|
+
## C. 구조적 AI 패턴
|
|
56
|
+
|
|
57
|
+
| ID | 심각도 | 탐지 | 처방 |
|
|
58
|
+
|---|---|---|---|
|
|
59
|
+
| C-1 | S2 | `첫째/둘째/셋째` 기계적 열거 | 산문에 녹이거나 연결어를 변주한다. |
|
|
60
|
+
| C-2 | S2 | 칼럼·리포트의 과한 불릿 | 문단 산문으로 통합한다. |
|
|
61
|
+
| C-3 | S2 | `도입/본론/결론`식 반복 헤딩 | 흐름으로 처리하거나 헤딩을 줄인다. |
|
|
62
|
+
| C-4 | S2 | 매 문단 첫 문장 요약 공식 | 일부 문단은 장면, 수치, 질문으로 시작한다. |
|
|
63
|
+
| C-5 | S1 | 이모지 남발 | 칼럼, 리포트, 공적 문서에서는 삭제한다. |
|
|
64
|
+
| C-7 | S2 | `먼저/반면/결국` 3단 공식 | 접속사를 줄이거나 산문에 녹인다. |
|
|
65
|
+
| C-8 | S2 | `A인가, B인가`·`A가 아니라 B`·`~것이 아니라`·`~것은 아니다` 대구 2회 이상 반복 | 하나만 남기고 나머지는 비대칭 평서문으로 푼다. 사람의 수사일 수 있으므로 연쇄가 아니면 보존하고 전부 없애지 않는다. |
|
|
66
|
+
| C-9 | S2 | `1) 2) 3)` 또는 `(1)(2)(3)` 인덱싱 | 산문이나 단순 줄바꿈으로 바꾼다. |
|
|
67
|
+
| C-10 | S1 | 콜론 부제 `X: Y` 반복 | 헤딩을 짧게 하거나 평서형으로 바꾼다. |
|
|
68
|
+
| C-11 | S1 | 연결어미 바로 뒤 쉼표 | 문법상 필요 없으면 제거한다. 윤문 후 개수가 원문보다 늘면 실패다. |
|
|
69
|
+
| C-12 | S2 | 대부분 문장에 쉼표 포함 | 쉼표를 삭제, 분할, 연결어미 흡수로 줄인다. |
|
|
70
|
+
|
|
71
|
+
## D. AI 관용구
|
|
72
|
+
|
|
73
|
+
| ID | 심각도 | 탐지 | 처방 |
|
|
74
|
+
|---|---|---|---|
|
|
75
|
+
| D-1 | S1 | `결론적으로`, `따라서`, `이를 통해`, `그러므로`, `요약하면`, `정리하면`, `정리하자면` 3회 이상 | 대부분 삭제하고 필요한 1-2개만 남긴다. |
|
|
76
|
+
| D-2 | S1 | `시사하는 바가 크다`, `주목할 만하다`, `간과할 수 없다` | 삭제하거나 구체 결론으로 바꾼다. |
|
|
77
|
+
| D-3 | S1 | `본질적으로`, `핵심적으로` | 대비에 필요하지 않으면 삭제한다. |
|
|
78
|
+
| D-4 | S1 | `혁신적`, `획기적`, `압도적`, `강력한` 같은 hype 어휘 반복 | 삭제하거나 원문 사실로 대체한다. |
|
|
79
|
+
| D-5 | S1 | `기술이 묻는다`, `시대가 부른다` 같은 추상 주어 의인화 | 사람, 기관, 평범한 주어로 되돌린다. |
|
|
80
|
+
| D-6 | S1 | `~할 때다`, `~시점이다`, `지금이야말로` 공식 결말 | 구체 서술로 낮추되 당위 표지는 다른 서법으로 바꾸지 않는다. |
|
|
81
|
+
| D-7 | S2 | `X에서 Y로`, `X을 넘어 Y로` 반복 | 하나만 남기고 일반 서술로 바꾼다. |
|
|
82
|
+
| D-8 | S2 | `필요한/중요한 것은 X이다`, `문제는/핵심은 X다` 분열문 | 주어와 서술을 직결한다. |
|
|
83
|
+
| D-9 | S2 | `결국 ~로 이어진다`, `~에 직결된다` 결산 반복 | 인과 경로를 구체화하거나 단문으로 나눈다. `결국`·`이유다`를 새로 주입하지 않는다. |
|
|
84
|
+
| D-10 | S2 | 문장 말미 `~하는 이유다` 도치 결산 | `그래서 ~다`처럼 순방향으로 풀되 새 결산 공식을 만들지 않는다. |
|
|
85
|
+
| D-11 | S2 | 결말부의 `향후/앞으로/중장기적으로` | 실제 시점·조건이 원문에 있을 때만 살리고, 없으면 시간어를 줄인다. |
|
|
86
|
+
| D-12 | S2 | 독립 문장 `과제도 남아 있다/한계도 분명하다` | 문패를 덜고 원문에 있는 실제 과제·한계를 직접 쓴다. |
|
|
87
|
+
| D-13 | S2 | 에세이 결말의 `어쩌면/비로소/천천히` 공식 | 에세이 장르에서만 성찰 부사를 줄인다. |
|
|
88
|
+
| D-14 | S2 | `진단은 서늘하다/경고는 아프다` 같은 감각 술어 1회 이상, 사람 글에서 드문 개념 은유 1회 이상, 그 밖의 개념 은유 3회 이상, 또는 같은 은유 어근 3회 이상 반복 | 감각 술어는 구체 서술로, 반복 은유는 명제를 보존한 평서로 직역화한다. 중심 은유·명제 불명·새 은유 주입은 보존한다. 관통 은유도 가장 효과적인 1회만 남긴다. |
|
|
89
|
+
|
|
90
|
+
## E. 리듬과 종결
|
|
91
|
+
|
|
92
|
+
| ID | 심각도 | 탐지 | 처방 |
|
|
93
|
+
|---|---|---|---|
|
|
94
|
+
| E-1 | S2 | 문장 길이가 지나치게 균일함 | 짧은 문장과 긴 문장을 섞는다. |
|
|
95
|
+
| E-2 | S2 | `~다` 종결 4회 이상, `~고 있다` 남발 | 종결과 시제를 섞고 단순 시제로 환원한다. |
|
|
96
|
+
| E-3 | S2 | 모든 문단이 3-4문장으로 균일함 | 1문장 문단과 긴 문단을 섞는다. |
|
|
97
|
+
| E-4 | S2 | 단문만 이어지는 구조 | 일부 문장을 연결어미·관형절·조건절로 묶는다. |
|
|
98
|
+
| E-5 | S2 | 쉼표로 긴 절을 계속 잇는 문장 | 마침표로 나누거나 한국어식 절로 압축한다. |
|
|
99
|
+
| E-6 | S2 | 쉼표 위치가 무차별적으로 다양함 | 주절 경계나 명백한 삽입에만 둔다. |
|
|
100
|
+
| E-7 | S2 | 대화·구어의 말높임 불일치 | 한 화자·문단 안 말높임을 일관시킨다. |
|
|
101
|
+
|
|
102
|
+
## F. 과도한 수식·명사화
|
|
103
|
+
|
|
104
|
+
| ID | 심각도 | 탐지 | 처방 |
|
|
105
|
+
|---|---|---|---|
|
|
106
|
+
| F-1 | S2 | `매우`, `정말`, `대단히` 남발 | 대부분 삭제하고 필요하면 수치·사례로 대체한다. |
|
|
107
|
+
| F-2 | S2 | 동의어 이중 수식 | 하나만 남긴다. |
|
|
108
|
+
| F-3 | S2 | 추상어 반복 | 구체 명사·동사로 바꾼다. |
|
|
109
|
+
| F-4 | S2 | `-성/-적/-화`, `-tion/-ment/-ness/-ity` 명사화 누적 | 동사·형용사로 환원한다. |
|
|
110
|
+
| F-5 | S2 | 추상 `~적 N` 체인 | 명사+명사 또는 구체 절로 바꾼다. |
|
|
111
|
+
| F-7 | S2 | `확대·강화·개선·확보·마련·구축` 같은 범용 정책동사와 추상 목적어의 `설계` 밀집 | 실제 행위와 대상을 풀어 쓴다. 당위 표지를 새로 늘리지 않는다. |
|
|
112
|
+
|
|
113
|
+
## G. 완곡 표현
|
|
114
|
+
|
|
115
|
+
| ID | 심각도 | 탐지 | 처방 |
|
|
116
|
+
|---|---|---|---|
|
|
117
|
+
| G-1 | S2 | 같은 `~로 보인다/~로 판단된다/~라고 여겨진다` 반복 | 단정으로 바꾸지 말고 유보 강도를 유지한 채 형태만 바꾼다. |
|
|
118
|
+
| G-2 | S2 | 이중·삼중 완곡 `~할 가능성이 있을 수 있다` | 완곡 하나만 남기되 극성·확신도는 보존한다. |
|
|
119
|
+
| G-3 | S2 | `양쪽 모두`, `장점도 있지만`, `신중하게`, `균형` 4회 이상 | 근거가 충분할 때만 구체 비교나 조건으로 바꾼다. 근거가 약한 신호이므로 단독 판정하지 않는다. |
|
|
120
|
+
|
|
121
|
+
## H. 접속사
|
|
122
|
+
|
|
123
|
+
| ID | 심각도 | 탐지 | 처방 |
|
|
124
|
+
|---|---|---|---|
|
|
125
|
+
| H-1 | S2 | 문두 접속사가 한 문단에 3회 이상 반복 | 그 문단에서 일부만 덜어낸다. 문서 전체를 일괄 삭제하지 않는다. |
|
|
126
|
+
| H-2 | S2 | `하지만/그러나` 반복 | 일부를 `그런데`, 무접속, 문장 재배열로 바꾼다. |
|
|
127
|
+
| H-3 | S2 | `이는`, `이 점에서`, `이 관점에서`, `이 말은`이 한 문단에 3회 이상 반복 | 일부만 본 서술로 직진한다. 단발 사용은 보존한다. |
|
|
128
|
+
| H-4 | S2 | `즉` 남발 | 기술 설명문이 아니면 1회 이하로 줄인다. |
|
|
129
|
+
|
|
130
|
+
## I. 형식명사·의존명사
|
|
131
|
+
|
|
132
|
+
| ID | 심각도 | 탐지 | 처방 |
|
|
133
|
+
|---|---|---|---|
|
|
134
|
+
| I-1 | S1 | `~인 것이다/~한 것이다`가 연속 3회 이상 반복 | 일부만 평서형으로 바꾸며 단발 사용은 보존한다. |
|
|
135
|
+
| I-2 | S2 | `X은 ~라는 점에 있다` | `X는 ~다`로 쓴다. |
|
|
136
|
+
| I-3 | S2 | `~다는 뜻이다/~다는 의미다` | 의미를 문장 안에 녹인다. |
|
|
137
|
+
| I-4 | S2 | `~해야 한다/~할 필요가 있다/요구된다`로 끝나는 문단이 2개 이상 | 첫 문단을 제외하고 당위 문장을 앞·중간으로 이동한다. 삭제·병합·서법 치환은 금지한다. |
|
|
138
|
+
| I-5 | S2 | `~이/가 필요하다`를 일괄적으로 구체화 | 주체를 보완할 수 있을 때만 구체화하고, `~해야 한다`를 새로 늘리지 않는다. |
|
|
139
|
+
| I-6 | S2 | `~능력` 추상명사 연쇄 | 구체 능력이나 동사로 푼다. |
|
|
140
|
+
| I-7 | S2 | 출처 없는 `~다는 분석이다/평가다` 종결 | 출처가 있으면 보존하고, 없으면 직접 서술로 바꾼다. 출처를 만들지 않는다. |
|
|
141
|
+
|
|
142
|
+
## J. 시각 장식
|
|
143
|
+
|
|
144
|
+
| ID | 심각도 | 탐지 | 처방 |
|
|
145
|
+
|---|---|---|---|
|
|
146
|
+
| J-1 | S2 | 마크다운 볼드 남발 | 본문에서는 제거한다. |
|
|
147
|
+
| J-2 | S1 | 강조 따옴표 5회 이상 | 실제 인용이나 핵심 용례만 남긴다. |
|
|
148
|
+
| J-3 | S2 | 칼럼·리포트의 불릿 리스트 | 산문으로 통합한다. |
|
|
149
|
+
| J-4 | S3 | 대시, 괄호, 슬래시 장식 남발 | 쉼표, 문장 분리, 평서문으로 줄인다. |
|