Files
document-haness/skills/technical-doc-flow/config/quality-rules.json
T

251 lines
7.4 KiB
JSON

{
"$schema": "../schemas/quality-rules.schema.json",
"schema_version": "1.0",
"rules_version": "1.4.0",
"thresholds": {
"heading": {
"required_h1_count": 1,
"max_level_jump": 1
},
"term": {
"max_new_terms_per_sentence": 2,
"max_new_terms_per_paragraph": 2,
"max_new_terms_per_section": 7,
"definition_window_chars": 240,
"max_assumed_known": 12,
"max_assumed_per_prerequisite": 4
},
"paragraph": {
"max_chars": 900,
"max_sentences": 7
},
"logic": {
"core_claim_max_reader_paragraphs": 2
},
"route": {
"light": {
"requires_existing_draft": true,
"max_input_chars": 4000,
"max_sources": 2,
"max_headings": 8
},
"standard": {
"max_input_chars": 12000,
"max_sources": 8,
"max_headings": 24
},
"deep": {
"min_input_chars": 12001,
"min_sources": 9,
"min_headings": 25
}
},
"split": {
"default_max_chars": 12000,
"minimum_h2_fill_ratio": 0.35
},
"finalization": {
"max_change_rate": 0.0
}
},
"patterns": {
"placeholders": [
"\\bTODO\\b",
"\\bTBD\\b",
"\\bFIXME\\b",
"\\bXXX\\b",
"\\?\\?\\?",
"\\{\\{[^{}]+\\}\\}",
"\\[(?:작성|보강|확인|추가)\\s*(?:예정|필요|중)?\\]"
],
"evidence_markers": [
"<!--\\s*claim:{claim_id}\\s*-->",
"\\[(?:근거|관찰|측정|도출|권고|가정):\\s*{claim_id}\\]"
],
"technical_candidate_allowlist": [
"Markdown",
"UTF-8",
"SHA256",
"TODO",
"TBD",
"FIXME",
"XXX"
],
"technical_lowercase_candidates": [
"backpressure",
"deadlock",
"deserialization",
"idempotency",
"memoization",
"observability",
"serialization",
"sharding",
"throughput"
]
},
"rules": [
{
"id": "DOC-H001",
"category": "heading",
"severity": "error",
"description": "제목 단계는 한 번에 한 수준만 내려가야 합니다."
},
{
"id": "DOC-H002",
"category": "heading",
"severity": "error",
"description": "문서에는 비어 있지 않은 H1 제목이 정확히 하나 있어야 합니다."
},
{
"id": "DOC-M001",
"category": "markdown",
"severity": "error",
"description": "TODO, TBD 같은 미완성 표시를 최종 문서에 남기지 않습니다."
},
{
"id": "DOC-M002",
"category": "markdown",
"severity": "error",
"description": "Markdown 코드 fence는 같은 기호로 닫혀야 합니다."
},
{
"id": "DOC-M003",
"category": "markdown",
"severity": "error",
"description": "문서 내부 앵커 링크는 실제 제목이나 명시적 id를 가리켜야 합니다."
},
{
"id": "DOC-M004",
"category": "markdown",
"severity": "error",
"description": "HTML 주석은 문서 끝 전에 닫혀야 하며 렌더링되는 내용을 숨기지 않아야 합니다."
},
{
"id": "DOC-L001",
"category": "logic",
"severity": "error",
"description": "logic map의 섹션은 문서에 빠짐없이 같은 순서로 나타나야 합니다."
},
{
"id": "DOC-L002",
"category": "logic",
"severity": "error",
"description": "logic map의 핵심 주장은 문서 앞부분에 명시되어야 합니다."
},
{
"id": "DOC-L003",
"category": "logic",
"severity": "error",
"description": "근거가 필요한 절은 연결된 claim id를 본문 marker로 표시해야 합니다."
},
{
"id": "DOC-L004",
"category": "logic",
"severity": "error",
"description": "logic map 섹션의 필수 필드와 의존 순서는 완결되어야 합니다."
},
{
"id": "DOC-T001",
"category": "terminology",
"severity": "error",
"description": "새 용어의 첫 등장은 용어 장부에 적은 쉬운 설명 문구를 포함해야 합니다."
},
{
"id": "DOC-T002",
"category": "terminology",
"severity": "error",
"description": "별칭은 정식 용어의 첫 설명보다 먼저 사용하지 않습니다."
},
{
"id": "DOC-T003",
"category": "terminology",
"severity": "error",
"description": "약어는 정식 이름과 쉬운 뜻을 먼저 소개한 뒤 사용해야 합니다."
},
{
"id": "DOC-T004",
"category": "terminology",
"severity": "error",
"description": "한 문단에서 새로 소개하는 용어 수는 설정된 예산을 넘지 않아야 합니다."
},
{
"id": "DOC-T005",
"category": "terminology",
"severity": "error",
"description": "한 문장에서 새로 소개하는 용어 수는 설정된 예산을 넘지 않아야 합니다."
},
{
"id": "DOC-T006",
"category": "terminology",
"severity": "error",
"description": "한 절에서 새로 소개하는 용어 수는 설정된 예산을 넘지 않아야 합니다."
},
{
"id": "DOC-T007",
"category": "terminology",
"severity": "error",
"description": "영문 및 코드형 기술 용어 후보는 용어 장부 또는 독자 계약에 등록해야 합니다."
},
{
"id": "DOC-T008",
"category": "terminology",
"severity": "warning",
"description": "독자가 이미 안다고 가정하는 용어 목록은 선수지식과 비례하는 범위로 제한합니다."
},
{
"id": "DOC-T009",
"category": "terminology",
"severity": "error",
"description": "용어 장부와 독자 계약의 assumed_known 목록은 정확히 일치해야 합니다."
},
{
"id": "DOC-P001",
"category": "paragraph",
"severity": "warning",
"description": "긴 문단은 독자가 한 번에 따라갈 수 있도록 나눕니다."
},
{
"id": "DOC-P002",
"category": "paragraph",
"severity": "warning",
"description": "한 문단의 문장 수가 지나치게 많지 않아야 합니다."
},
{
"id": "DOC-F001",
"category": "fidelity",
"severity": "error",
"description": "기준 문서의 fenced·indented code block은 정확히 보존해야 합니다."
},
{
"id": "DOC-F002",
"category": "fidelity",
"severity": "error",
"description": "기준 문서의 inline code 식별자·명령·인수는 보존해야 합니다."
},
{
"id": "DOC-F003",
"category": "fidelity",
"severity": "error",
"description": "기준 문서의 http·https·ftp·ftps·file·mailto·ssh·git 절대 URI와 Markdown link/citation target은 보존해야 합니다."
},
{
"id": "DOC-F004",
"category": "fidelity",
"severity": "error",
"description": "기준 문서의 숫자, 단위, 날짜, 버전은 의미 연결과 함께 보존해야 합니다."
},
{
"id": "DOC-F005",
"category": "fidelity",
"severity": "error",
"description": "기준 문서의 명시적 큰따옴표와 blockquote 인용은 보존해야 합니다."
},
{
"id": "FNL-001",
"category": "finalization",
"severity": "error",
"description": "finalizer의 초안 대비 변경률은 설정된 상한을 넘지 않아야 합니다."
}
]
}