Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions .claude/hooks/regen-spec-trace.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
#!/usr/bin/env python3
"""tests/*.py PostToolUse hook — spec trace report 자동 재생성.

stdin 으로 받은 hook event 의 ``tool_input.file_path`` 가 ``tests/**/*.py`` 면
``scripts/generate_spec_trace.py`` (write mode) 실행하여 ``docs/traces/coverage.md``
를 자동 갱신. 그 외 즉시 종료.

배경: trace 는 ``@pytest.mark.spec(...)`` marker 변경으로 invalidate 되지만 기존
docs-lint hook 은 ``docs/*.md`` 만 감시. ``tests/*.py`` 마커 추가/이름변경/제거가
로컬에서 재생성을 trigger 하지 않아 CI ``--check`` 까지 가서야 staleness 발견.

위반(generator failure) 시 exit 2 + stderr — 모델 컨텍스트 주입.
정상 갱신 또는 적용 안 되는 파일은 exit 0.
"""

import json
import subprocess
import sys
from pathlib import Path

REPO = Path(__file__).resolve().parents[2]

try:
event = json.loads(sys.stdin.read() or "{}")
except json.JSONDecodeError:
sys.exit(0)

tool_input = event.get("tool_input") or {}
file_path = tool_input.get("file_path") or ""
if not file_path:
sys.exit(0)

try:
rel = Path(file_path).resolve().relative_to(REPO)
except ValueError:
sys.exit(0)

rel_str = str(rel).replace("\\", "/")
if not (rel_str.startswith("tests/") and rel.suffix == ".py"):
sys.exit(0)

# * trace 재생성 — CI 와 동일한 무프로젝트 + ad-hoc typer install 패턴.
# project venv 의 extras 설치 상태와 무관하게 동작.
result = subprocess.run(
[
"uv",
"run",
"--no-project",
"--with",
"typer>=0.12",
"python",
str(REPO / "scripts" / "generate_spec_trace.py"),
],
cwd=str(REPO),
capture_output=True,
text=True,
)
if result.returncode != 0:
sys.stderr.write("\nregen-spec-trace: generator failed\n")
sys.stderr.write(result.stderr)
sys.exit(2)
4 changes: 4 additions & 0 deletions .claude/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@
{
"type": "command",
"command": "python3 ${CLAUDE_PROJECT_DIR}/.claude/hooks/docs-lint.py"
},
{
"type": "command",
"command": "python3 ${CLAUDE_PROJECT_DIR}/.claude/hooks/regen-spec-trace.py"
}
]
}
Expand Down
2 changes: 2 additions & 0 deletions .claude/skills/new-spec/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ When this skill is invoked, execute the following steps in order:
```markdown
---
status: Draft
description: <version> — <한 줄 요약: spec 이 도입하는 것 + 핵심 결정 압축, 50-150 자>
target: <version>
last_updated: <today YYYY-MM-DD>
---
Expand Down Expand Up @@ -78,6 +79,7 @@ When this skill is invoked, execute the following steps in order:
```markdown
---
status: Draft
description: <version> <topic> ADR — <짝 spec 의 결정 N 건 / 핵심 옵션 비교 한 줄, 50-150 자>
target: <version>
last_updated: <today YYYY-MM-DD>
---
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -119,6 +119,7 @@ jobs:
tests/test_ir_formula.py tests/test_ir_footnote.py \
tests/test_ir_list.py tests/test_ir_caption.py \
tests/test_ir_toc.py tests/test_ir_field.py \
tests/test_v0_3_1_marker_char_offset.py \
tests/test_cli.py \
tests/conftest.py tests/type_check_samples.py
- name: Run pyright (intentional errors — expect 4)
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ htmlcov/
.coverage
.coverage.*
coverage.xml
# ^ mutmut (mutation testing) 작업 디렉토리 — source copy + 변이 산출물
mutants/

# * MAC OS
.DS_Store
Expand Down
3 changes: 1 addition & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,7 @@ Authoritative policy is `docs/CONVENTIONS.md` — read it before any docs work.
Hard rules (auto-applied without further instruction):
- Every per-version spec / ADR / impl-log / verification report carries a YAML frontmatter block as the first lines: `status: <Active | Draft | Frozen | Superseded>` + `ga: vX.Y.Z` *or* `target: vX.Y.Z` + `last_updated: YYYY-MM-DD`. Living docs (README, CHANGELOG, AGENTS.md, CLAUDE.md, CONVENTIONS itself) skip the frontmatter.
- **Frozen spec body is immutable** — typo / broken-link fixes only. Decision changes go to a *new* spec; the old one's frontmatter flips to `status: Superseded`, `superseded_by: <new spec>` (single-block edit). Exception: Living-policy schema migration (see CONVENTIONS § Frozen 면제 조항).
- **Spec ↔ spec direct cross-links are forbidden** even within the same `vX.Y.Z/` directory. Use `phase-N.md` § two-axis-integration sections (or `roadmap/README.md`) as the bridge. **Exception**: pair files `<topic>.md` ↔ `<topic>-research.md` (the spec ↔ ADR pair) link directly.
- **`phase-N.md` carries no concrete decisions / open issues** — those belong in `vX.Y.Z/*.md`. Phase docs hold intent, scope, and two-axis integration only.
- **Spec ↔ spec direct cross-links are forbidden** even within the same `vX.Y.Z/` directory. Use `roadmap/README.md` as the bridge. **Exception**: pair files `<topic>.md` ↔ `<topic>-research.md` (the spec ↔ ADR pair) link directly.
- New version `vX.Y.Z`: invoke `/new-spec <version> <topic>` Claude Code skill (auto-scaffolds spec + paired ADR + README index row). Manual: create `docs/roadmap/vX.Y.Z/<topic>.md` + `docs/design/vX.Y.Z/<topic>-research.md` (frontmatter `status: Draft`, `target: vX.Y.Z`), then add a row to the active-spec index in `roadmap/README.md`. On GA: flip `status: Draft → Frozen`, swap `target` → `ga`, write `implementation/vX.Y.Z/...` (Frozen on creation), refresh README index.

### CI / secrets
Expand Down
21 changes: 20 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- 부수 정리: 상류 `edwardkim/rhwp#390` (find_control_text_positions) 옵션 A 채택 → cherry-pick 머지 → 본 spec in-place Frozen 전환 + RESOLVED notice. design 파일 `<topic>-design-research.md` → `<topic>-research.md` 명명 통일 (v0.2.0/ir, v0.3.0/cli rename + 24 cross-link 일괄 정정).
- 본 PR 의 a/b/c 결정 비교 + 14개 결정 historical record 는 [docs/implementation/spec-system-overhaul.md](docs/implementation/spec-system-overhaul.md) (Frozen) 가 보유.

## [0.3.1] — 2026-05-02

PATCH release. v0.3.0 의 IR 출고에서 inline 컨트롤 마커의 `Provenance.char_start` / `char_end` 가 항상 null 이던 문제를 정정. 상류 v0.7.8 의 `Paragraph::control_text_positions()` ([PR #405](https://github.com/edwardkim/rhwp/pull/405) / [Task #390](https://github.com/edwardkim/rhwp/issues/390)) 노출을 활용해 7 종 블록 (각주·미주 마커, 그림, 수식, 필드, TOC, 표) 의 zero-width character 위치를 채운다. SchemaVersion 변경 없음 (`"1.1"` 유지) — 기존에 nullable 슬롯에 정의된 `int | None` 에 non-null 값을 출고할 뿐, schema 호환 100%.

### Fixed

- inline 컨트롤 마커 (각주/미주/그림/수식/필드/TOC/표) 의 `Provenance.char_start` / `char_end` 가 v0.3.0 까지 항상 null 이던 문제 정정. 부모 paragraph 안 zero-width character 위치 (`char_start == char_end == position`) 로 채운다.
- 상류 `Paragraph::control_text_positions()` (v0.7.8 GA, PR #405 / Task #390) 의 결과를 paragraph 당 1회 호출로 공유하여 `controls.len() == positions.len()` 길이 invariant 를 release/debug 모두에서 `assert_eq!` 로 가드 — 상류 contract 위반의 silent regression 차단.
- 부모 paragraph 의 `char_offsets` 가 빈 경우 (보통 layout-only 컨트롤만 있는 paragraph) `None` 폴백 — 상류 fallback 분기의 의미 손실 position 을 그대로 흘리지 않음 (fail-fast).

### Build

- `external/rhwp` submodule pin `033617e` (v0.7.7) → `0fb3e67` (post-v0.7.8). 본 v0.3.1 의 enabling change 는 v0.7.8 의 PR #405 (`pub fn Paragraph::control_text_positions`). 후속 commit 들은 직교 영역 (Task #484 `utf16_pos_to_char_idx` 등) 으로 본 PATCH 동작에 영향 없음.

### Known limitations

- 중첩 표 안 inline 컨트롤의 `Provenance.char_start/end` 와 `(section_idx, para_idx)` 가 다른 paragraph 를 가리켜 `text[char_start:char_end]` 슬라이싱이 잘못된 결과를 낸다. v0.3.0 부터 있던 Provenance 모델 한계 — v0.3.1 은 새 마커 채움이 동일 모델을 재사용. v0.4.0+ Provenance 정정 spec 에서 다룬다 (spec § 영구 비목표 마지막 항목).

## [0.3.0] — 2026-04-28

### Changed — async API 의존성 정리
Expand Down Expand Up @@ -225,7 +243,8 @@ The `rhwp` Rust core is consumed via git submodule pinned to upstream commit `16
- Local `maturin build --release` wheel (3.0 MB) verified end-to-end in a clean venv: install → import → `rhwp.parse` → `HwpLoader` load. (Note: the v0.1.0 sdist exceeded PyPI's 100 MB limit and did not upload; fixed in [0.1.1](#011--2026-04-23).)
- GitHub Actions workflow (`publish.yml`) builds Linux (x86_64 + aarch64) / macOS (x86_64 + aarch64) / Windows wheels + sdist on release publish, then uploads via PyPI Trusted Publisher (OIDC).

[Unreleased]: https://github.com/DanMeon/rhwp-python/compare/v0.3.0...HEAD
[Unreleased]: https://github.com/DanMeon/rhwp-python/compare/v0.3.1...HEAD
[0.3.1]: https://github.com/DanMeon/rhwp-python/releases/tag/v0.3.1
[0.3.0]: https://github.com/DanMeon/rhwp-python/releases/tag/v0.3.0
[0.2.0]: https://github.com/DanMeon/rhwp-python/releases/tag/v0.2.0
[0.1.1]: https://github.com/DanMeon/rhwp-python/releases/tag/v0.1.1
Expand Down
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "rhwp-python"
version = "0.3.0"
version = "0.3.1"
edition = "2021"
# ^ rust-version 미명시 — 상위 rhwp crate 정책(stable Rust, MSRV unclaimed) 준수.
# PyO3 0.28 이 Rust 1.83+ 요구하지만, 이는 README 에 문서로 안내
Expand Down
36 changes: 27 additions & 9 deletions docs/CONVENTIONS.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

| 분류 | 의미 | 갱신 정책 | 예시 |
|---|---|---|---|
| **Living** | 항상 최신 — 다른 문서의 위치 포인터 + 시간선 + 규칙 | 자유 갱신, 매 변경 시 손봐도 무방 | `docs/CONVENTIONS.md` (자체), `docs/roadmap/README.md`, `CHANGELOG.md`, `CLAUDE.md`, `AGENTS.md`, `README.md` |
| **Living** | 항상 최신 — 다른 문서의 위치 포인터 + 시간선 + 규칙 | 자유 갱신, 매 변경 시 손봐도 무방 | `docs/CONVENTIONS.md` (자체), `docs/roadmap/README.md`, `docs/upstream/README.md`, `docs/traces/coverage.md`, `CHANGELOG.md`, `CLAUDE.md`, `AGENTS.md`, `README.md` |
| **Active** | 외부 시스템으로 흘러가기 전 staging | 큰 변경만, in-place 갱신 OK | `docs/upstream/<topic>.md` |
| **Draft** | 작성 중인 spec — 해당 버전 GA 전까지 활발 갱신 | 버전 GA 전까지 자유 갱신, GA 후 Frozen 으로 전환 | `docs/roadmap/v0.7.0/mcp.md` (현재 v0.7.0 GA 전) |
| **Frozen** | GA 완료된 spec / 완료된 stage / 완료된 검증 | **변경 금지** — 오타·링크 수정만 in-place 허용. 큰 변경은 새 spec + supersede | `docs/roadmap/v0.2.0/ir.md` (v0.2.0 GA 완료), `docs/implementation/v0.2.0/stages/*.md` |
Expand Down Expand Up @@ -36,6 +36,7 @@ Frozen 본문은 historical record. 시간 흐르며 외부 의존성 (라이브
```markdown
---
status: Frozen
description: <한 줄 요약 — optional, 50-150 자 권장>
ga: v0.3.0
last_updated: 2026-04-28
---
Expand All @@ -50,12 +51,21 @@ last_updated: 2026-04-28
| 필드 | 타입 | 규칙 |
|---|---|---|
| `status` | enum: `Active` / `Draft` / `Frozen` / `Superseded` | 필수 |
| `ga` | `vX.Y.Z` SemVer | `status: Frozen` 또는 `Superseded` 일 때 필수. `target` 과 mutex |
| `description` | non-empty string (50-150 자 권장) | 필수. 한 줄 요약 — 인덱스/검색/툴팁용 (MkDocs / Hugo / Astro 패턴) |
| `ga` | `vX.Y.Z` SemVer | `status: Frozen` 또는 `Superseded` 일 때 필수 (예외: meta-level `docs/implementation/<topic>.md`, RESOLVED `docs/upstream/<topic>.md` — § Implementation log 구조 / § upstream/ 참조). `target` 과 mutex |
| `target` | `vX.Y.Z` SemVer | `status: Draft` 일 때 필수. `ga` 와 mutex |
| `supersedes` | `<vX.Y.Z>/<topic>.md` 또는 생략 | 새 spec 이 무엇을 대체하는지 |
| `superseded_by` | `<vX.Y.Z>/<topic>.md` | `status: Superseded` 일 때 필수 |
| `last_updated` | `YYYY-MM-DD` | 필수. 의미 변경 commit 시 자동 갱신 ([D3 hook](#last_updated-자동-갱신)) |

`description` 가이드:

- 한 줄 요약 — 본문 첫 단락 또는 제목+핵심 결정 압축. 50-150 자 권장 (한국어 기준)
- 본문 의미 추가 금지 — 이미 본문에 있는 정보의 압축이어야 함. 새 결정 / 인용 / 사실 추가 안 됨 (특히 Frozen 본문은 immutability 원칙)
- non-semantic 형식 변경이라 Frozen 면제 조항 [Living-policy schema migration](#frozen-면제-조항--living-policy-schema-migration) 적용 — Frozen spec 도 in-place 추가 가능
- 모든 문서 종류 (roadmap / design / implementation / upstream / verification) 에 의미 있어 schema 갈래 없음
- **Quoting** — 값 전체를 큰따옴표 `"..."` 로 감싸고 inline code/식별자는 작은따옴표 `'rhwp-py'` 로 표기 (YAML 안전 + flat parser 호환). 예: `description: "v0.3.0 — 'rhwp-py' 얇은 CLI..."`

`Active` (예: `upstream/<topic>.md`) 는 `ga` / `target` 둘 다 생략.

`Living` 은 frontmatter 없음 — 정의상 항상 최신. 대신 README 같은 인덱스가 다른 문서들의 Status 를 노출.
Expand All @@ -67,6 +77,7 @@ last_updated: 2026-04-28
```markdown
---
status: Frozen
description: "v0.3.0 — 'rhwp-py' 얇은 CLI 재도입. 업스트림 'rhwp' 바이너리와 overlap=0 + Python 고유 가치 (IR / 청크) 집중"
ga: v0.3.0
last_updated: 2026-04-28
---
Expand All @@ -81,6 +92,7 @@ v0.2.0 에서 폐기했던 CLI 를...
```markdown
---
status: Draft
description: "v0.7.0 — 'rhwp-mcp' MCP 서버. LLM 에이전트가 HWP/HWPX 직접 파싱·요약·청크화 가능한 표준 프로토콜 표면"
target: v0.7.0
last_updated: 2026-04-28
---
Expand All @@ -95,6 +107,7 @@ last_updated: 2026-04-28
```markdown
---
status: Active
description: "업스트림 제안 — 'find_control_text_positions' 외부 노출 (paragraph 안 inline 컨트롤 character 위치 helper)"
last_updated: 2026-04-26
---

Expand All @@ -108,6 +121,7 @@ last_updated: 2026-04-26
```markdown
---
status: Superseded
description: "v0.2.0 Document IR v1 (v0.4.0/ir-correction.md 로 대체)"
ga: v0.2.0
superseded_by: v0.4.0/ir-correction.md
last_updated: 2026-04-25
Expand All @@ -118,7 +132,7 @@ last_updated: 2026-04-25

### last_updated 자동 갱신

Claude Code PostToolUse hook (`.claude/hooks/update-last-updated.py`) 이 docs/*.md 의 frontmatter `last_updated` 를 편집 시점 오늘 날짜로 자동 갱신. CI lint 가 frontmatter `last_updated` 와 git history 일치 여부 검증. **수기 갱신 절차는 폐기** — frontmatter 에 직접 손대지 않는다.
Claude Code PostToolUse hook (`.claude/hooks/update-last-updated.py`) 이 docs/*.md 의 frontmatter `last_updated` 를 편집 시점 오늘 날짜로 자동 갱신. **수기 갱신 절차는 폐기** — frontmatter 에 직접 손대지 않는다.

면제 조항 활용 마이그 commit 은 hook 실행을 건너뛴다 (non-semantic — 본문 의미 변경 없음). 이 경우 `last_updated` 는 기존 값 그대로 frontmatter 로 이전.

Expand All @@ -138,6 +152,7 @@ docs/
├── traces/
│ └── coverage.md Living — spec ↔ test 자동 매핑
├── upstream/
│ ├── README.md Living — 활성 / 해결 이슈 인덱스 + archive 정책
│ └── <topic>.md Active — 외부 (rhwp Rust 코어) 이슈 초안. 업스트림 머지 시 archive
└── verification/
└── v<X.Y.Z>/... Frozen — 큰 단위 작업 검증 리포트 (한정)
Expand All @@ -160,7 +175,8 @@ docs/

### upstream/

- `<topic>.md` (Active) — 업스트림 (`edwardkim/rhwp` 등) 에 제출 검토 중인 이슈/제안 초안. per-version 매핑 없음
- `README.md` (Living) — 활성 / 해결 이슈 인덱스 + archive 정책 SSOT. 자체 추적 메타 (상류 등록 여부 / RESOLVED 일자 / 관련 spec 참조) 보유
- `<topic>.md` (Active) — 업스트림 (`edwardkim/rhwp` 등) 에 제출 검토 중인 이슈/제안 초안. per-version 매핑 없음. **본문은 가능한 한 GitHub 이슈 본문에 그대로 등록 가능한 형태** — 자체 추적 문장은 본문에 두지 않고 위 README 인덱스가 관리
- 본 디렉토리는 외부 시스템 (GitHub Issues) 으로 흘러가기 전 단계의 staging — 정식 spec 의 일부가 아님
- **해결 시** — 두 가지 옵션:
- **삭제** — 다른 spec 이 본 파일을 참조하지 않을 때. 정보는 GitHub permalink + 본 PR commit history 가 보존
Expand Down Expand Up @@ -242,9 +258,11 @@ CHANGELOG 한 줄로 충분한 변경 (typo 정리, 단순 dep bump, 작은 docs

같은 사실 중복 기록 금지 — CHANGELOG 가 *what*, log 가 *why/how*. 결정 비교 (a/b/c) 가치가 없는 변경 (단순 dep bump, typo) 은 CHANGELOG 한 줄로 충분 — implementation log 작성 안 함.

## 인수조건 형식 (v0.4.0+ 신규 spec)
## 인수조건 형식 (spec-system-overhaul 이후 신규 spec)

spec-system-overhaul (2026-04-29) 이후 신규 작성 spec 의 § 인수조건 섹션은 각 항목에 `AC-N` ID 를 부여한다 (테스트 marker 와 1:1 매핑용). 형식은 자유 — testable 하고 명확하면 plain prose 도 OK. 모호성이 우려되면 [EARS notation](https://alistairmavin.com/ears/) (`THE ... SHALL`, `WHEN ..., THE ... SHALL` 등) 같은 구조화 패턴을 참고 가능 (강제 아님).

v0.4.0+ 신규 spec 의 § 인수조건 섹션은 각 항목에 `AC-N` ID 를 부여한다 (테스트 marker 와 1:1 매핑용). 형식은 자유testable 하고 명확하면 plain prose 도 OK. 모호성이 우려되면 [EARS notation](https://alistairmavin.com/ears/) (`THE ... SHALL`, `WHEN ..., THE ... SHALL` 등) 같은 구조화 패턴을 참고 가능 (강제 아님).
**적용 시점**: overhaul 발효일 (2026-04-29) 이후 신규 작성 spec. 첫 적용 사례는 [v0.3.1/ir-marker-char-offset](roadmap/v0.3.1/ir-marker-char-offset.md) (PATCH minor 라도 발효 이후 신규면 적용cutoff 는 버전이 아닌 *시점*). 발효일 *이전* 작성된 Draft 도 본 PR 에서 일괄 retrofit ([v0.7.0/mcp.md](roadmap/v0.7.0/mcp.md)). 향후 grandfather 가 발생하면 다음 의미 변경 PR 시점에 함께 retrofit.

```markdown
## 인수조건
Expand All @@ -255,14 +273,14 @@ v0.4.0+ 신규 spec 의 § 인수조건 섹션은 각 항목에 `AC-N` ID 를
- **AC-4** — 입력 파일 없으면 exit 2 + stderr 에 에러
```

기존 v0.1.0 ~ v0.3.0 Frozen spec 은 본 형식 미적용 — historical record 보존. 단 트레이스 매핑은 spec 단위 (AC-N 생략) 로 retrofit 적용 (Trace report 섹션 참조).
기존 v0.1.0 ~ v0.3.0 Frozen spec 은 본 형식 미적용 — historical record 보존 (Frozen 본문 변경 금지 정책). 단 트레이스 매핑은 spec 단위 (AC-N 생략) 로 retrofit 적용 (Trace report 섹션 참조).

## Trace report — pytest spec markers

테스트는 `pytest.mark.spec(spec_id)` marker 로 spec 과 매핑. `spec_id` 형식:

- **v0.4.0+ spec**: `"vX.Y.Z/topic#AC-N"` — AC 단위 매핑 (full)
- **v0.1.0 ~ v0.3.0 spec**: `"vX.Y.Z/topic"` — spec 단위 매핑 (soft, AC 생략)
- **AC 부여 spec** (overhaul 발효일 2026-04-29 이후 신규 작성 + retrofit Draft): `"vX.Y.Z/topic#AC-N"` — AC 단위 매핑 (full)
- **AC 미부여 spec** (v0.1.0 ~ v0.3.0 Frozen — 본문 변경 금지): `"vX.Y.Z/topic"` — spec 단위 매핑 (soft, AC 생략)

파일 단위 적용 (모든 테스트가 같은 spec 검증): module top 에 `pytestmark = pytest.mark.spec("vX.Y.Z/topic")` 한 줄. 개별 테스트가 추가 spec 검증 시 `@pytest.mark.spec(...)` 데코레이터 추가 (양쪽 누적).

Expand Down
1 change: 1 addition & 0 deletions docs/design/v0.2.0/ir-research.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
status: Frozen
description: "v0.2.0 IR ADR — 8 미결 결정 (Block 유니온 / HTML 위치 / char 단위 / schema_version / iter API / to_ir 캐싱 / $id 호스팅) 의 14 에이전트 병렬 조사"
ga: v0.2.0
last_updated: 2026-04-25
---
Expand Down
1 change: 1 addition & 0 deletions docs/design/v0.3.0/cli-research.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
status: Frozen
description: "v0.3.0 CLI ADR — 'rhwp-py' 이름 선정 / 업스트림 overlap=0 정책 / 기본 출력 포맷 (NDJSON / JSON) 결정의 업계 선례·근거"
ga: v0.3.0
last_updated: 2026-04-28
---
Expand Down
Loading
Loading