diff --git a/AGENTS.md b/AGENTS.md index 9100d0f..52429c4 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -80,6 +80,58 @@ print('open cards:',p-a)" 문서에만 둔 채로 유지하지 마라(그 상태가 가장 나쁘다: 규칙은 있고 효력은 없다). - ⒝ **< 5** ⇒ 의무화해도 카드가 늘지 않았다는 뜻이므로 **의무 자체를 재검토**하라. Baseline measured 2026-09-04: 9 proposals − 4 disposed = **5 open**. So ⒝ means "fewer than today". + +### ★★[2026-09-05 재측 · 사전 등록된 시점에 도달했다] 「부재」를 기계로 잡지 «않는다» + +채택 제안 `2026-09-04-worklog-mandate-and-local-gate#p0` 에 대한 **결정**이다. +★**위 「10번째 착지 회차에 재측하라」가 «충족»됐다** — 2026-09-04 이후 착지 회차 **11**. +⇒ ★**골대를 옮기지 않고, 그때 등록한 두 조건을 그대로 재서 판정한다.** + +> ★**결정: 「워크로그 «부재»」를 잡는 기계 강제를 «지금은 넣지 않는다».** +> ★**`check-worklog-json.py` 의 «존재하는 `.json` 만 검사한다» 설계와 «소급 금지»는 그대로 둔다.** + +**⒜ 미작성 회차 — 사전 등록 임계 `≥ 2 (>20%)`** + +| 창(`b3a4cf4..origin/main` · first-parent) | 착지 회차 | 미작성 | 비율 | +|---|---|---|---| +| 규약 착지 이후 **전건** | **15** | ★**1** | **6.7%** | +| ★**규약을 «알 수 있었던» 회차만** | **14** | ★**0** | ★**0%** | + +★**그 1건은 `11ef5010`(PR #13 · S2)이고 «규약보다 먼저 갈라졌다» — 옮겨 적지 않고 쟀다**: +PR #13 `createdAt` **2026-08-23T23:37:41Z** ↔ 규약 착지 `b3a4cf4` **2026-08-26T02:57:28Z**(≈2.6일 먼저). +⇒ ★**임계 «2» 미달**(측정 1 · 정상 참작분을 빼면 0). + +**⒝ 열린 카드 — 사전 등록 임계 `< 5`**: `.json` **15**개 · proposals **26** − disposed **13** = ★**13 open** +(기준선 **5** → **13**). ⇒ ★**임계 미달**(늘었다 = 의무가 카드를 «만들고» 있다). + +⇒ ★★**두 조건 «다» 발화하지 않는다.** 사전 등록한 규칙대로 **문안을 그대로 두고 기계 강제를 넣지 않는다.** + +**★약점을 숨기지 않는다 — 이것이 재개 조건의 근거다** +- ⒤★**「100%」는 «단일 집행 주체»의 습관일 수 있다.** 리니지는 **13개**로 갈렸지만(2026-08-27~09-05), + ★**git author 는 하나라 «누가 집행했나»를 가릴 수 없다.** ⇒ 일반화의 근거로 쓰지 마라. +- ⒥★**정본 술어는 느슨하다** — 「`docs/worklog/` 를 만졌다」는 **옛 워크로그에 한 줄 추가**도 통과시킨다. + ★이번 창에서는 엄격 술어(**새 `.json` 추가**)와 **같은 14** 라 물리지 않았지만, 그 약점은 **남아 있다**. +- ⒦★**실패는 여전히 «조용하다»** — 부재는 어떤 검사도 울리지 않는다. 오늘 그 대가를 치르지 않았을 뿐이다. + +**★★재개 조건 — 세는 명령과 «오늘의 값»** +> ★**위 ⒜ 를 다시 재서 «규약을 알 수 있었던 회차 중 미작성」이 «1건이라도» 나오면 이 결정을 다시 연다.** +> ★**「오래됐다」·「불안하다」는 재개 사유가 «아니다».** + +```sh +# 미작성 회차(엄격 술어 — 새 .json 쌍을 «추가»했는가) · b3a4cf4 = 규약 착지 +for c in $(git rev-list --first-parent b3a4cf4..origin/main); do + git diff --name-status "$c^1" "$c" | /usr/bin/grep -q '^A[[:space:]]*docs/worklog/.*\.json$' || echo "$c no-worklog" +done | /usr/bin/grep -c . +``` +★**오늘의 값 = `1`**(그 1건 = 규약 이전 분기 `11ef5010`) ⇒ ★**«2 이상»이 되면 재개**다. + +**★재개하면 «무엇을» 만들지 미리 적어 둔다**(그때 설계부터 시작하지 않게): +⒜★**baseline sha 를 쓰지 마라** — 소급 금지를 깨고, 기준선 자체가 낡는다. +⒝★**PR diff 로 «조건부» 판정하라**: 「`REPORT.md` 의 후속 추천 구역을 만졌으면 `docs/worklog/` 에 **새 쌍**도 있어야 한다」. + ⇒ 의무가 조건부(「후속 추천을 적은 회차」)이므로 **검사도 조건부**여야 한다. baseline 불요 · 소급 0. +⒞★**정상 참작 경로 = 「그 PR 이 규약 착지보다 먼저 생성됐는가」**(`gh pr view --json createdAt`) — ★**제목·라벨로 봐주지 마라** + (문구는 바뀌고 라벨은 붙이면 그만이다 · 이 저장소가 반복해 규탄한 형태). +⒟★**`check-worklog-json.py` 의 기존 6축을 약화하지 마라** — 「부재」는 **별 축**이다. ## Testing Boundaries - Keep `rustjava-runtime/tests/classes` limited to Java standard library class and API behavior. - Test JVM and interpreter semantics, including class initialization, bytecode execution, and monitor behavior, with compiled Java fixtures under `test-data/src` and expected output under `test-data`, executed by `tests/test_class.rs`. diff --git a/REPORT.md b/REPORT.md index 11cb74a..42f82fb 100644 --- a/REPORT.md +++ b/REPORT.md @@ -1,5 +1,24 @@ # REPORT +## [2026-09-05] 워크로그 «부재» 기계 강제 판정 — 넣지 않는다 (rustjava-worklog-absence-machine-enforcement-decision) +- 무엇을: 채택 제안 `2026-09-04-worklog-mandate-and-local-gate#p0` 에 대한 **판정**이다. + ★**결론: 워크로그 «부재»를 잡는 기계 강제를 지금은 넣지 않는다** — `check-worklog-json.py` 의 + 「존재하는 `.json` 만 검사한다」 설계와 «소급 금지»를 그대로 둔다. ★**검사기 무접촉 · `.rs` 0줄 · backfill 0**. +- 왜: ★★**의무화 회차가 «데이터를 보기 전»에 등록한 두 임계가 «둘 다» 발화하지 않았다.** + 그 문서가 정한 재측 시점(「2026-09-04 이후 열 번째 착지 회차」)에 ★**실제로 도달했고**(실측 **11**), + ⒜ 미작성 **1 / 15**(임계 ≥2 미달 · ★그 1건은 규약보다 먼저 갈라진 PR #13 이라 **0 / 14 = 100%**) · + ⒝ 열린 카드 **13**(임계 <5 미달 — 의무가 카드를 **늘렸다**). + ⇒ ★**데이터를 본 뒤 기계를 넣는 것은 «골대 옮기기»**다. 등록한 규칙을 지켰다. +- 사용자 영향: **없다**(CI·DoD·검사기 무변경). 회차 절차가 지금 그대로 유지된다. +- 검증: 창·분모를 밝혀 **전수**로 쟀고(`git rev-list --first-parent b3a4cf4..origin/main`), + ★**정상 참작도 인용이 아니라 실측**했다(PR #13 `createdAt` 2026-08-23 ↔ 규약 착지 2026-08-26). + ★**술어를 둘로 재서**(느슨/엄격) 같은 **14** 임을 확인했고, ★**문서에 박은 재개 조건 명령을 실행해 값 `1` 을 확인**했다. + 무회귀: `check-worklog-json.py` **rc=0** · `check-dod-ci-parity.py` **rc=0**. +- ★**약점을 숨기지 않는다**: 「100%」는 **단일 집행 주체**의 습관일 수 있고(리니지 13개지만 git author 는 하나), + 정본 술어는 **느슨**하며, ★**실패는 여전히 조용하다** ⇒ 「위험이 없다」가 아니라 「임계가 아직 발화하지 않았다」이다. +- ★**후속 추천**: ⑴재개는 **엄격 술어 값이 2 이상**일 때만(오늘 **1**) ⑵재개 시 설계는 이미 적어 뒀다 — + ★**baseline sha 를 쓰지 말고 «PR diff 로 조건부» 판정**하라(의무가 조건부이므로 검사도 조건부여야 한다). + ## [2026-09-04] upstream 동기 «정기 축» 판정 — 격차 기반 `behind ≥ 20` (rustjava-upstream-sync-cadence-decision) - 무엇을: 채택 제안 `2026-09-04-sync-contract-stale-assets-decision#p0` 에 대한 **판정**이다. ★**결론: 동기 회차는 `origin/main..upstream/main` 이 «20 이상»일 때 연다** — 시간(격주·월간) 기반은 기각. diff --git a/STATE.md b/STATE.md index 8c5af63..a53f883 100644 --- a/STATE.md +++ b/STATE.md @@ -23,6 +23,25 @@ (25번째 run, 앞선 24건 전부 red). **PR 대기 — 게이트③ 미착지.** ## 완료 +- [rustjava-worklog-absence-machine-enforcement-decision] ★★**워크로그 «부재»를 기계로 잡을지 «판정» — 결론: 지금은 «넣지 않는다».** + 채택 제안 `2026-09-04-worklog-mandate-and-local-gate#p0`. ★**`scripts/check-worklog-json.py` 무접촉**(6축 무회귀 · rc=0) · + `.rs` **0줄** · 과거 backfill **0** · qts 잠금·upstream 리니지·파리티 검사기 **무접촉**. + ★★**근거는 «사전 등록된 두 임계»가 «둘 다» 발화하지 않았다는 것 하나다** — 의무화 회차가 **데이터를 보기 «전»에** + `AGENTS.md` 에 등록했고, ★**그 문서가 정한 재측 시점(「2026-09-04 이후 열 번째 착지 회차」)에 실제로 도달했다**(실측 **11**). + ★**⒜ 미작성**: 창 `b3a4cf4..origin/main` first-parent **15건 중 1건**(6.7%) — 임계 **≥2** 미달. + ★그 1건은 **규약보다 먼저 갈라진 PR #13**(`createdAt` 2026-08-23 ↔ 규약 착지 2026-08-26 · ★**인용이 아니라 실측**) ⇒ + ★**규약을 «알 수 있었던» 회차만 보면 0 / 14 = 100%**. + ★**⒝ 열린 카드**: `.json` 15 · proposals **26** − disposed **13** = ★**13**(기준선 5) — 임계 **<5** 미달(★의무가 카드를 **늘렸다**). + ★★**약점을 숨기지 않는다**: ⒤「100%」는 **단일 집행 주체의 습관**일 수 있다(리니지는 13개로 갈렸으나 git author 가 하나다) + ⒥정본 술어가 **느슨**하다(「만졌다」는 옛 워크로그 한 줄 추가도 통과 — 엄격 술어로 재도 이번 창은 같은 14) + ⒦**실패는 여전히 조용하다** ⇒ 「위험이 없다」가 아니라 「임계가 아직 발화하지 않았다」이다. + ★**재개 조건 + 세는 명령 + 오늘의 값 `1`** 을 `AGENTS.md` §Round Worklog 에 박았다(**2 이상이면 재개** · ★엄격 술어). + ★**재개하면 만들 것도 미리 적었다**: baseline sha 금지 · ★**PR diff 로 «조건부» 판정**(REPORT 후속 추천을 만졌으면 새 쌍 필수) · + 정상 참작은 `createdAt` 으로(★제목·라벨 금지) · 기존 6축 보존. + ★**측정 함정 1건 기록**: 「회차 = 부모 2개」로 세면 **스쿼시 착지를 놓친다**(그 술어로는 12/12 · 정본 술어로 15/1). + ★게이트③ 완료: PR #30 — ★★**`--merge` 착지**(★`--squash` 아님 · 등재 repo `contracts/upstream-sync-repos.conf:22`). + 머지커밋 sha 는 회신 `merged:` 참조. ★**게이트② 1회차 approve** — 반려 0. + ★**착지로 「재개 조건」이 `AGENTS.md` 에 살아 있다**: 엄격 술어 값이 **2 이상**이면 다시 연다(오늘 **1**). - [rustjava-upstream-sync-cadence-decision] ★★**upstream 동기 «정기 축» 판정 — 결론: ⒝ 격차 기반 `behind ≥ 20`.** 채택 제안 `2026-09-04-sync-contract-stale-assets-decision#p0`. ★**신설 0**(검사기·크론·워크플로) · `.rs` **0줄** · ★**S9 미개시**(behind **0**). ★★**제안의 전제(「벌어진 뒤에 받으면 훨씬 비싸다」)를 «먼저 재서» 반증했다**: 회차 커밋 수 ↔ 충돌의 상관계수 ★**부호가 «음»**. diff --git a/docs/worklog/2026-09-05-worklog-absence-enforcement-decision.json b/docs/worklog/2026-09-05-worklog-absence-enforcement-decision.json new file mode 100644 index 0000000..1a18235 --- /dev/null +++ b/docs/worklog/2026-09-05-worklog-absence-enforcement-decision.json @@ -0,0 +1,38 @@ +{ + "schema": 1, + "date": "2026-09-05", + "title": "워크로그 «부재»를 기계로 잡을지 판정 — 지금은 넣지 않는다(사전 등록 임계 둘 다 미발화)", + "services": [ + "RustJava" + ], + "taskId": "rustjava-worklog-absence-machine-enforcement-decision", + "summary": "채택 제안 2026-09-04-worklog-mandate-and-local-gate#p0 에 대한 판정이다. 결론: 워크로그 «부재»를 잡는 기계 강제를 지금은 넣지 않고, check-worklog-json.py 의 「존재하는 .json 만 검사한다」 설계와 «소급 금지»를 그대로 둔다. ★근거는 «사전 등록된 두 임계»가 둘 다 발화하지 않았다는 것이다 — 의무화 회차가 데이터를 보기 «전»에 AGENTS.md 에 등록한 것이고, 그 문서가 정한 재측 시점(「2026-09-04 이후 열 번째 착지 회차」)에 실제로 도달했다(실측 11회차). ⒜ 미작성: 창 b3a4cf4..origin/main 의 first-parent 착지 회차 15건 중 1건(6.7%)이고, 그 1건은 규약보다 먼저 갈라진 PR #13 이다(createdAt 2026-08-23T23:37:41Z ↔ 규약 착지 2026-08-26T02:57:28Z — 인용이 아니라 실측). 규약을 «알 수 있었던» 회차만 보면 0/14 = 100% 다. 임계는 ≥2(>20%) 였으므로 미달. ⒝ 열린 카드: .json 15개 · proposals 26 − disposed 13 = 13 open(기준선 5 → 13). 임계는 <5 였으므로 미달 — 의무가 카드를 줄이지 않고 늘렸다. ★약점은 숨기지 않는다: ⒤「100%」는 단일 집행 주체의 습관일 수 있다(리니지는 13개로 갈렸지만 git author 가 하나라 «누가 집행했나»를 못 가린다) ⒥정본 술어가 느슨하다(「docs/worklog/ 를 만졌다」는 옛 워크로그에 한 줄 추가도 통과시킨다 — 엄격 술어로 다시 재니 이번 창에서는 같은 14 라 안 물렸다) ⒦실패는 여전히 조용하다. ⇒ 그래서 재개 조건을 엄격 술어로 적고 오늘의 값 1 을 함께 박았다(2 이상이면 재개). ★재개하면 무엇을 만들지도 미리 적었다 — baseline sha 를 쓰지 말고 PR diff 로 조건부 판정하라(「REPORT.md 후속 추천 구역을 만졌으면 docs/worklog/ 에 새 쌍도 있어야 한다」 · 의무가 조건부이므로 검사도 조건부여야 한다 · 소급 0), 정상 참작은 「그 PR 이 규약 착지보다 먼저 생성됐는가」로 판정하고 제목·라벨로 봐주지 마라.", + "changes": [ + "AGENTS.md §Round Worklog — 「[2026-09-05 재측] 「부재」를 기계로 잡지 않는다」 절 신설. 사전 등록 재측 시점 도달 확인 · ⒜⒝ 두 임계 실측표 · 정상 참작 실측(PR #13 createdAt) · 약점 3건(단일 집행 주체 · 느슨한 술어 · 조용한 실패) · 재개 조건(엄격 술어 명령 + 오늘의 값 1) · 재개 시 만들 것의 설계 4항(baseline 금지 · 조건부 PR diff 판정 · createdAt 기반 정상 참작 · 기존 6축 보존).", + "docs/worklog/2026-09-05-worklog-absence-enforcement-decision.{md,json} 신설.", + "STATE.md · REPORT.md — 회차 기록.", + "★scripts/check-worklog-json.py 무접촉(6축 무회귀 · rc=0) · 과거 backfill 0 · qts 잠금 무접촉 · upstream 동기 리니지 무접촉 · check-dod-ci-parity.py 무접촉." + ], + "deploy": { + "sha": "", + "urls": [] + }, + "verification": "★사전 등록 재측 시점: git rev-list --first-parent b3a4cf4..origin/main 중 2026-09-04 이후 착지 회차 = 11 ⇒ 「10번째에 재측하라」 충족. ⒜ 창 b3a4cf4..origin/main(현 main 4b91e8f) first-parent 15건 전수 — 느슨 술어(docs/worklog/ 를 만졌다) 통과 14 · 엄격 술어(--name-status 의 A 로 새 .json 추가) 통과 14 ⇒ 두 술어가 같은 수. 미작성 1건 = 11ef5010(PR #13 · S2 · squash 라 부모 1개). ★정상 참작 실측: gh pr view 13 -R Jun025/RustJava --json createdAt → 2026-08-23T23:37:41Z ↔ git log -1 --format=%cI b3a4cf4 → 2026-08-26T11:57:28+09:00(= 02:57:28Z) ⇒ PR 이 규약보다 약 2.6일 먼저 생성됐다. ⇒ 규약을 알 수 있었던 회차만 보면 0/14. ★주의: 부모 2개(머지커밋)만 세는 술어는 스쿼시 착지를 놓친다 — 처음 그렇게 세어 12/12(미작성 0)가 나왔고, AGENTS.md 정본 술어(first-parent 전건)로 다시 재서 15/1 을 얻었다. 그 차가 정확히 PR #13(스쿼시)이다. ⒝ 열린 카드: origin/main 의 docs/worklog/*.json 15개에서 proposals 26 · adopted+declined 13 ⇒ 13 open(기준선 5). ★리니지 다양성: 착지 14건의 태그 base 는 13개로 갈렸다(2026-08-27~09-05) — 단일 티켓이 아니다. 단 git author 는 하나라 «집행 주체»는 가릴 수 없다(회신에 한계로 명시). ★문서에 박은 재개 조건 명령을 그 자리에서 실행해 값 1 을 확인했다(문서 기재와 일치). ★무회귀: python3 scripts/check-worklog-json.py rc=0(14파일 0문제) · python3 scripts/check-dod-ci-parity.py rc=0 · docstring 「It never demands a .json for an existing .md — the convention is not retroactive.」 그대로 · .rs 변경 0.", + "issues": [ + "★★사전 등록된 임계를 «지켰다» — 데이터를 본 뒤 기계를 넣고 싶어졌더라도 그것은 골대 옮기기다. 의무화 회차가 데이터를 보기 전에 「⒜ ≥2 면 문안을 빼거나 기계 강제로 올려라 · ⒝ <5 면 의무를 재검토하라」를 등록했고, 실측은 ⒜ 1 · ⒝ 13 으로 둘 다 미달이다.", + "★「100%」를 일반화의 근거로 쓰지 마라 — 리니지는 13개로 갈렸지만 git author 가 하나라 «누가 집행했나»를 가릴 수 없다. 표본이 단일 집행 주체의 습관을 반영할 가능성이 남아 있고, 그것이 재개 조건을 «느슨하게»(1건이라도) 잡은 이유다.", + "★AGENTS.md 정본 술어가 느슨하다 — 「docs/worklog/ 를 만졌다」는 옛 워크로그에 한 줄 추가도 통과시킨다(이 리니지의 게이트③ 원장 동봉이 실제로 그런 커밋을 만든다). 이번 창에서는 엄격 술어와 같은 14 라 물리지 않았으나 약점은 남아 있어, 재개 조건은 엄격 술어로 적었다.", + "★측정 함정 1건을 기록한다 — 「회차 = 부모 2개 머지커밋」으로 세면 «스쿼시 착지»를 놓친다. 처음 그 술어로 12/12(미작성 0)를 얻었고, AGENTS.md 정본 술어로 다시 재서 15/1 을 얻었다. 그 차가 정확히 PR #13 이다.", + "★실패는 여전히 조용하다 — 부재는 어떤 검사도 울리지 않는다. 이 결정은 「위험이 없다」가 아니라 「사전 등록 임계가 아직 발화하지 않았다」이다.", + "머지하지 않았다 — 게이트②·③은 별 세션이다. ★게이트③은 등재 repo 라 --squash 금지 · merge_strategy: merge 필수.", + "★[게이트③ 집행] PR #30 을 --merge 로 착지시켰다(등재 repo — 스쿼시는 계보를 접는다). 동봉 «전» head 가 검수 핀 5ea7eafbb3e241c8f4a2079ec76b97334fef96f8 과 일치함을 확인했고(git fetch 를 먼저 쳐 거짓 일치를 막았다), 동봉 전/후 sha 는 머지 회신에 적었다. 착지 diff 5파일 전건 문서 · 배포 워크플로 0개 ⇒ 배포 0 · 코드(.rs) 변경 0 · scripts/check-worklog-json.py 무접촉(6축 무회귀). ★이 착지로 재개 조건과 «재개 시 설계 4항»이 AGENTS.md 에 상주한다 — 다음 재측 회차는 설계부터 시작하지 않아도 된다." + ], + "proposals": [], + "resolvedIssues": [ + "2026-09-04-worklog-mandate-and-local-gate#p0 — 「워크로그 미작성을 기계로 잡을지 판정하라」. 사전 등록된 재측 시점에 도달해 두 임계를 그대로 재고 «지금은 넣지 않는다»로 판정했으며, 재개 조건(엄격 술어 명령 + 오늘의 값 1)과 재개 시 설계 4항을 AGENTS.md §Round Worklog 에 박았다." + ], + "adoptedProposals": [ + "2026-09-04-worklog-mandate-and-local-gate#p0" + ], + "declinedProposals": [] +} diff --git a/docs/worklog/2026-09-05-worklog-absence-enforcement-decision.md b/docs/worklog/2026-09-05-worklog-absence-enforcement-decision.md new file mode 100644 index 0000000..bc84c83 --- /dev/null +++ b/docs/worklog/2026-09-05-worklog-absence-enforcement-decision.md @@ -0,0 +1,106 @@ +# [2026-09-05] 워크로그 «부재»를 기계로 잡을지 판정 — ★**지금은 넣지 않는다**(사전 등록 임계 둘 다 미발화) + +**티켓**: `rustjava-worklog-absence-machine-enforcement-decision` +**채택 제안**: `2026-09-04-worklog-mandate-and-local-gate#p0` +**성격**: ★**판정 회차** — `scripts/check-worklog-json.py` **무접촉**(6축 무회귀) · `.rs` **0줄** · 과거 backfill **0** + +--- + +## 1. ★사전 등록된 «재측 시점»에 도달했다 — 그래서 이 판정이 열렸다 + +`AGENTS.md` §Round Worklog 가 의무화 회차에서 **미리** 적어 둔 것: 「**recount at the 10th round landed after 2026-09-04**」. +★**실측: 2026-09-04 이후 착지 회차 «11»** ⇒ ★**조건 충족.** +⇒ ★★**골대를 옮기지 않았다** — 그때 등록한 두 임계를 **그대로** 재서 판정한다. + +| # | 커밋 | 날짜 | +|---|---|---| +| 1~9 | `a71676e` `1983d9f` `a0b5d3c` `3e02f8c` `3fb08a8` `a76b305` `7b2dcc4` `61d5bf3` `ba4bb41` | 2026-09-04 | +| 10~11 | `18fbb6e` `4b91e8f` | 2026-09-05 | + +## 2. ★지금 잰 작성률 — 창과 분모를 밝힌다 + +**창** = `b3a4cf4..origin/main`(규약 착지 → 현 `main` `4b91e8f`) · **분모** = `git rev-list --first-parent` 착지 회차. + +| 분모 | 착지 회차 | 미작성 | 작성률 | +|---|---|---|---| +| 규약 착지 이후 **전건** | **15** | ★**1** | **93.3%** | +| ★**규약을 «알 수 있었던» 회차만** | **14** | ★**0** | ★**100%** | + +★**제안의 「4회차 중 1건」을 옮겨 적지 않았다** — 창이 그때보다 넓어졌고(4 → 15) 값도 다시 쟀다. + +### ⒜ 그 «1건»이 정상 참작인지도 «쟀다» + +| 축 | 값 | +|---|---| +| 미작성 커밋 | `11ef5010`(PR **#13** · S2 · 2026-08-27 착지 · **squash** 라 부모 1개) | +| PR #13 `createdAt` | **2026-08-23T23:37:41Z** | +| 규약 착지 `b3a4cf4` | **2026-08-26T02:57:28Z** | +| 판정 | ★**PR 이 규약보다 «2.6일» 먼저 생성됐다** ⇒ 정상 참작 — **인용이 아니라 실측**이다 | + +### ⒝ 술어의 «약점»도 먼저 쟀다 + +`AGENTS.md` 정본 술어는 **「`docs/worklog/` 를 만졌다」** 라서 ★**옛 워크로그에 한 줄 추가**도 통과시킨다 +(이 리니지의 게이트③ 원장 동봉이 실제로 그런 커밋을 만든다). +⇒ ★**엄격 술어(«새 `.json` 을 추가»했는가 · `--name-status` 의 `A`)로 다시 쟀다**: + +| 술어 | 통과 | +|---|---| +| 느슨(만졌다) | **14 / 15** | +| ★엄격(새 `.json` 추가) | ★**14 / 15** | + +⇒ ★**이번 창에서는 «같은 수»라 약점이 물리지 않았다.** ★**그러나 약점은 남아 있고**, 그래서 재개 조건은 **엄격 술어**로 적었다. + +## 3. ★열린 카드(⒝ 임계) — `< 5` 면 의무 자체를 재검토 + +`.json` **15**개 · `proposals` 합 **26** − (`adoptedProposals` + `declinedProposals`) **13** = ★**열린 카드 13** +(의무화 시점 기준선 **5** → **13**). +⇒ ★**임계 미달** — 의무가 카드를 **줄이지 않고 늘렸다**. + +## 4. ★★결정문 + +> ★**「워크로그 «부재»」를 잡는 기계 강제를 «지금은 넣지 않는다».** +> ★**`check-worklog-json.py` 의 「존재하는 `.json` 만 검사한다」 설계와 «소급 금지»는 그대로 둔다.** + +**근거는 «사전 등록된 두 임계»가 «둘 다» 발화하지 않았다는 것 하나다**: +⒜ 미작성 **1**(정상 참작분을 빼면 **0**) < 임계 **2** · ⒝ 열린 카드 **13** ≥ 임계 **5**. +★★**그 임계는 «데이터를 보기 전»에 등록됐다** — 지금 그것을 넘어서 기계를 넣는 것은 +★**이 저장소가 반복해 규탄한 「골대 옮기기」**다. ⇒ **등록한 규칙을 지킨다.** + +### ★약점을 숨기지 않는다 — 이것이 재개 조건의 근거다 + +- ⒤★**「100%」는 «단일 집행 주체»의 습관일 수 있다.** 리니지는 **13개**로 갈렸으나(2026-08-27~09-05) + ★**git author 가 하나라 «누가 집행했나»를 가릴 수 없다.** ⇒ 일반화의 근거로 쓰지 마라. +- ⒥★**정본 술어는 느슨하다**(§2⒝) — 이번엔 안 물렸을 뿐이다. +- ⒦★**실패는 여전히 «조용하다»** — 부재는 어떤 검사도 울리지 않는다. ★**오늘 그 대가를 치르지 않았을 뿐이다.** + +## 5. ★재개 조건 — 세는 명령 + 오늘의 값 + +> ★**「규약을 알 수 있었던 회차 중 미작성」이 «1건이라도» 나오면 이 결정을 다시 연다**(= 위 명령 값이 **2 이상**). +> ★**「오래됐다」·「불안하다」는 재개 사유가 «아니다».** + +```sh +for c in $(git rev-list --first-parent b3a4cf4..origin/main); do + git diff --name-status "$c^1" "$c" \ + | /usr/bin/grep -q '^A[[:space:]]*docs/worklog/.*\.json$' || echo "$c no-worklog" +done | /usr/bin/grep -c . +``` +★**오늘의 값 = `1`**(그 1건 = 규약 이전 분기 `11ef5010`) — ★**문서에 적은 값을 «실행해» 확인했다**. + +## 6. ★재개하면 «무엇을» 만들지 미리 적어 둔다 + +그때 설계부터 시작하지 않도록, 티켓 계약 2 가 요구한 세 칸을 **지금** 채워 둔다: + +| 계약 | 미리 정한 답 | +|---|---| +| **소급 금지 유지** | ★**baseline sha 를 쓰지 마라** — 소급 금지를 깨고 기준선 자체가 낡는다 | +| ⒜-1 **판정 술어** | ★**PR diff 로 «조건부» 판정**: 「`REPORT.md` 후속 추천 구역을 만졌으면 `docs/worklog/` 에 **새 쌍**도 있어야 한다」. ★**의무가 조건부이므로 검사도 조건부여야 한다** ⇒ baseline 불요 · 소급 0 | +| ⒜-2 **정상 참작 경로** | ★**「그 PR 이 규약 착지보다 먼저 생성됐는가」**(`gh pr view --json createdAt`). ★**제목·라벨로 봐주지 마라** — 문구는 바뀌고 라벨은 붙이면 그만이다 | +| 6축 보존 | ★**「부재」는 «별 축»** — 기존 스키마 6축을 약화하지 않는다 | + +## 7. 무회귀 · 경계 + +★**`scripts/check-worklog-json.py` 무접촉** — `python3 scripts/check-worklog-json.py` **rc=0**(14파일 0문제) · +docstring 의 「It never demands a `.json` for an existing `.md` — the convention is not retroactive.」 **그대로**. +★과거 회차 **backfill 0** · `qts` 의 같은 잠금 **무접촉** · upstream 동기 리니지 **무접촉** · +`scripts/check-dod-ci-parity.py` **무접촉**(rc=0) · `.rs` **0줄** · 머지 **0**. +★게이트③은 ★**`--squash` 금지 저장소**다(`contracts/upstream-sync-repos.conf` 등재 — 스쿼시는 계보를 접는다) ⇒ `merge_strategy: merge`.