Skip to content

Commit 08866da

Browse files
authored
[rustjava-report-state-md-per-round-files-port-from-wie] docs(ledger): REPORT.md·STATE.md 동결 — 회차 기록은 docs/worklog/ 회차별 파일로 (#97)
[rustjava-report-state-md-per-round-files-port-from-wie] docs(ledger): REPORT.md·STATE.md 동결 — 회차 기록은 docs/worklog/ 회차별 파일로
2 parents 37107f4 + 285f09f commit 08866da

8 files changed

Lines changed: 102 additions & 5 deletions

File tree

‎.github/workflows/rust.yml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ jobs:
6161
steps:
6262
- uses: actions/checkout@v7
6363
- run: python3 scripts/check-worklog-json.py
64+
- run: python3 scripts/check-ledgers-frozen.py
6465

6566
# a conflict resolution that drops one side's work leaves no other trace: no marker, mergeable
6667
# CLEAN, suite green. fetch-depth 0 because the check needs the merge commits and their parents,

‎AGENTS.md‎

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,30 @@ basename** in `docs/worklog/`: `YYYY-MM-DD-<slug>.md` (the human axis) and
3636
`YYYY-MM-DD-<slug>.json` (the machine axis). Without the `.json`, the proposal is
3737
**structurally unreachable** by the cockpit "후속 작업 추천" panel — its scanner reads `.json` only.
3838

39+
**Since 2026-09-25 the `.md` is written by every round, and it is the round record.** `REPORT.md`
40+
and `STATE.md` are frozen (ticket `rustjava-report-state-md-per-round-files-port-from-wie`, ported
41+
from wie `a5091df6`). Every PR used to add to the top of those two shared files, so each landing
42+
made every open sibling conflict: **42 union merges out of 61 PRs** from 2026-09-10 to 2026-09-25.
43+
A file named after its own round has no shared line to fight over. So:
44+
45+
- **Every round** creates `docs/worklog/YYYY-MM-DD-<slug>.md`. Its first line is
46+
`## [YYYY-MM-DD] title (<ticket-id>)`, followed by the 무엇을·왜·사용자 영향 lines that used to go
47+
into `REPORT.md`. Add the `.json` sibling when the round leaves proposals or disposes of them,
48+
as below.
49+
- **진행중** is `gh pr list -R Jun025/RustJava`. **완료** is this directory:
50+
`grep -H '^## \[' docs/worklog/*.md | sort -r`. **다음** is `docs/next.md`, and a round edits it
51+
only when a prerequisite chain or an item outside the cards changes. Adopting or declining a
52+
card is recorded in the round's own `.json`, which is not a shared file.
53+
- `scripts/check-ledgers-frozen.py` pins both frozen files by hash. It runs in the `worklog_json`
54+
CI job and in the local DoD, and any edit to either file turns it red. If a merge conflict
55+
offers you one of those files, take `main`'s side and move your entry into your own `.md`.
56+
- Names are `date-slug`, not wie's serial `NNNN--`. The slug is the round's own name, so two open
57+
PRs never pick the same filename. That also means this repo does not need wie's
58+
serial-collision checker.
59+
60+
Text below that says "into `REPORT.md`" means the round's `.md` from 2026-09-25 on. It is kept
61+
as written because it records decisions that were made at the time.
62+
3963
**Do not invent a schema** — these key names are shared with otterpebble/dodu/qts. The consumer
4064
(`/api/proposals`, `scanRepoSimple`) reads exactly these:
4165

‎CLAUDE.md‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
cargo clippy --workspace --exclude test-utils --target wasm32-unknown-unknown -- -D warnings
3131
cargo test --all
3232
python3 scripts/check-worklog-json.py
33+
python3 scripts/check-ledgers-frozen.py
3334
python3 scripts/check-dod-ci-parity.py
3435
python3 scripts/check-named-exception-classes-are-loadable.py
3536
python3 scripts/check-merge-dropped-symbols.py
@@ -53,10 +54,11 @@
5354
`test-utils` 로 개명(S8)했을 때 **로컬에서는 어떤 명령으로도 드러나지 않고 CI 에서만** 빨개졌다.
5455
⇒ ★**CI 가 검사를 늘리거나 «매트릭스 차원»을 바꾸면 이 블록도 «같이» 고쳐라**(아래 재개 조건이 둘 다 센다).
5556
※OS 축(3종)은 로컬에서 재현할 수 없다 — ★**그 차원만은 CI 가 유일한 그물이고, 그것은 «알고 두는» 값이다.**
56-
- 착수·완료마다 STATE.md 의 "진행중/완료/다음" 을 갱신하고, 완료 시 REPORT.md 상단에
57-
`[YYYY-MM-DD]` 요약 3줄(무엇을·왜·사용자 영향) + 후속 추천을 append 한다.
58-
- ★**후속 추천을 적었으면 `docs/worklog/YYYY-MM-DD-<slug>.{md,json}` 한 쌍도 남긴다** —
59-
`.json` 이 없으면 그 추천은 cockpit 「후속 작업 추천」 패널에 **구조적으로 도달하지 못한다**
60-
(규약·되돌릴 수 = `AGENTS.md` §Round Worklog).
57+
- ★**회차 기록은 회차마다 새 파일 `docs/worklog/YYYY-MM-DD-<slug>.md` 에 쓴다.** 첫 줄에
58+
`## [YYYY-MM-DD] 제목 (<ticket-id>)`, 그 아래 무엇을·왜·사용자 영향 3줄을 적는다. 후속 추천을 적었으면
59+
같은 basename 의 `.json` 도 쓴다. `.json` 이 없으면 그 추천은 cockpit 「후속 작업 추천」 패널에 **닿지 못한다**.
60+
★**`REPORT.md`·`STATE.md` 는 2026-09-25 에 동결됐다 — 건드리지 마라**(`scripts/check-ledgers-frozen.py` 가 red 를 낸다).
61+
진행중 = `gh pr list -R Jun025/RustJava` · 완료 = `docs/worklog/` · 다음 = `docs/next.md`
62+
(규약 = `AGENTS.md` §Round Worklog).
6163
- ★작업 티켓의 **완주 지점 = PR 오픈**이다. 머지는 게이트② 검수자가 approve 와 같은 턴에 집행한다(`<id>-merge` 는 예외 경로)
6264
(`main` 직push 0 — `AGENTS.md` §Git Workflow).

‎REPORT.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# REPORT
2+
> ★**동결 — 2026-09-25 이후 기록은 `docs/worklog/YYYY-MM-DD-<slug>.md`(회차마다 새 파일) · 다음 = `docs/next.md` · 진행중 = `gh pr list -R Jun025/RustJava`.** 이 파일을 고치면 `scripts/check-ledgers-frozen.py` 가 red 를 낸다(규약 `AGENTS.md` §Round Worklog).
23
## [2026-09-24] «파일 끝에 남는 바이트» 거부가 클래스가 끝난 위치를 말한다 (rustjava-2026-09-23-validation-rules-name-their-position-adopt-p0)
34
- 무엇을: parse-level 거부 3종을 재어, 정확한 위치를 쥔 «extra bytes» 하나만 `Location::ByteOffset` 으로 오프셋을 싣는다. «truncated or unparsable» 은 nom 오프셋이 손상 지점을 절반 가까이 빗나가 두었고, «version < 45.0» 은 가리킬 자리가 없다.
45
- 왜: 채택 제안 `2026-09-23-validation-rules-name-their-position#p0`. 제안의 예상(«truncated» 가 후보, 나머지는 없음)은 측정으로 뒤집혔다.

‎STATE.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
# STATE
2+
> ★**동결 — 2026-09-25 이후 기록은 `docs/worklog/YYYY-MM-DD-<slug>.md`(회차마다 새 파일) · 다음 = `docs/next.md` · 진행중 = `gh pr list -R Jun025/RustJava`.** 이 파일을 고치면 `scripts/check-ledgers-frozen.py` 가 red 를 낸다(규약 `AGENTS.md` §Round Worklog).
23
34
## 진행중
45
(없음 — 2026-09-17 실측: 착수 시 열린 PR **4건**(#56·#57·#58·#59). ★**내 경로와 겹치는 것은 둘**이다 —

‎docs/next.md‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# 다음
2+
3+
`STATE.md` `## 다음` 을 옮긴 것이다(2026-09-25 · `rustjava-report-state-md-per-round-files-port-from-wie`).
4+
그 뒤로 `STATE.md` 는 동결됐다. 규칙은 `AGENTS.md` §Round Worklog 에 있다.
5+
6+
★**이 파일에는 카드가 표현하지 못하는 것만 적는다**: 선행 사슬과 카드 밖 항목(PR 번호). 열린 카드 목록은 적지 마라 — 아래 명령으로 세라.
7+
옮기기 전 `STATE.md` 의 「순서 없음」 4줄 중 2줄은 이미 닫혀 있었다(`…bootstrap-argument-index-and-tag#p0`·`…unraisable-error-variant#p0`).
8+
직접 적어 둔 목록은 이렇게 낡는다.
9+
10+
```sh
11+
# 열린 카드 = proposals − adopted − declined (tower 의 «− injected» 술어가 아니다)
12+
python3 -c "
13+
import json,glob,os
14+
refs=[];done=set()
15+
for f in sorted(glob.glob('docs/worklog/*.json')):
16+
d=json.load(open(f));b=os.path.basename(f)[:-5]
17+
refs+=[f'{b}#p{i}' for i in range(len(d.get('proposals',[])))]
18+
done|=set(d.get('adoptedProposals',[]))|set(d.get('declinedProposals',[]))
19+
print(*[r for r in refs if r not in done],sep='\n')"
20+
```
21+
22+
1. **선행 사슬**: `2026-09-17-link-lambdametafactory#p1`(결정) → `#p0`(어댑터) → `java.lang.invoke` 패키지(카드 없음 · 근거 = `rustjava-runtime/src/classes/java/lang/invoke` **부재**) → `2026-09-17-string-concat-recipe-arity#p1`.
23+
2. **카드 밖**: PR **#81**. 2026-09-23 에 `CONFLICTING` 이었고 충돌 해소가 먼저다.
24+
25+
지난 판(⓪-사료·①~⑤)은 동결된 `STATE.md` `## 다음` 아래에 그대로 있다.
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
## [2026-09-25] `REPORT.md`·`STATE.md` 동결 — 회차 기록은 회차별 파일로 (rustjava-report-state-md-per-round-files-port-from-wie)
2+
- 무엇을: 두 원장 머리에 동결 1줄을 달고 해시로 고정했다(`scripts/check-ledgers-frozen.py` · CI `worklog_json` job + 로컬 DoD). 회차 기록은 `docs/worklog/YYYY-MM-DD-<slug>.md`, 진행중은 `gh pr list`, 다음은 `docs/next.md` 로 옮겼다.
3+
- 왜: 모든 PR 이 두 파일 맨 앞에 덧붙여서 착지 1회가 열린 형제 PR 전건을 충돌시켰다. 2026-09-10~25 PR 61건에 합집합 머지가 42건이었다(`origin/main` 실측). wie `a5091df6` 선례를 포팅했다.
4+
- 사용자 영향: 없음(문서·검사). 회차 PR 이 공유 줄을 만지지 않으니 원장 충돌 재회차가 사라진다. ★열린 PR #81 은 두 원장을 만진다 — 착지 전에 그 항목을 자기 worklog `.md` 로 옮겨야 한다.
5+
6+
wie 와 다른 점: 새 `docs/report/NNNN--` 연번 디렉터리 대신 기존 `docs/worklog/` 의 `date-slug` 이름을 쓴다(파일 이름이 겹치지 않으니 연번 충돌 검사기가 필요 없다). `STATE.md` 도 한 번에 전부 동결했다(wie 는 진행중·완료를 두 번에 걸쳐 포인터로 바꿨다). 과거 기록은 옮기지 않았다.

‎scripts/check-ledgers-frozen.py‎

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#!/usr/bin/env python3
2+
"""Refuse any change to the frozen ledgers `REPORT.md` and `STATE.md`.
3+
4+
Why: until 2026-09-25 every PR prepended to these two files. Each landing then conflicted with
5+
every open sibling PR: 42 union merges out of 61 PRs between 2026-09-10 and 2026-09-25. Round
6+
records now go to per-round files in `docs/worklog/` (AGENTS.md §Round Worklog), and the two files
7+
are kept as history. A round that goes back to the old habit would bring the conflicts back, so
8+
the files are pinned by hash here.
9+
10+
A merge conflict in either file means your side added an entry. Take `main`'s side and move the
11+
entry into your round's `docs/worklog/*.md`.
12+
"""
13+
14+
import hashlib
15+
import sys
16+
from pathlib import Path
17+
18+
FROZEN = {
19+
"REPORT.md": "dd2f16f4e0da590919fcfcdb71d4f9ad6105d1c58b8284472fdaff1b0dab9079",
20+
"STATE.md": "38a53e3c415a609b265334e69a59cfd4b31cc4ad4a284b567d9377c47f5b6e02",
21+
}
22+
23+
root = Path(__file__).resolve().parent.parent
24+
bad = []
25+
for name, want in FROZEN.items():
26+
path = root / name
27+
got = hashlib.sha256(path.read_bytes()).hexdigest() if path.exists() else "missing"
28+
if got != want:
29+
bad.append(f"{name}: sha256 {got} != frozen {want}")
30+
31+
if bad:
32+
print("check-ledgers-frozen: FAIL — these files are frozen since 2026-09-25", file=sys.stderr)
33+
for line in bad:
34+
print(f" {line}", file=sys.stderr)
35+
print(" write the round entry to docs/worklog/YYYY-MM-DD-<slug>.md instead (AGENTS.md §Round Worklog)", file=sys.stderr)
36+
sys.exit(1)
37+
print(f"check-ledgers-frozen: ok — {len(FROZEN)} frozen ledgers unchanged")

0 commit comments

Comments
 (0)