Repository navigation
[DONE] 정리 2단계 PR 9 — 새로 쓴 글에 금지 낱말이나 셋 나열, 「이 문서는」 첫머리, 맺음 요약이 있으면 check:voice 가 줄마다 짚는다 - #33
Merged
Merged
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BuCv1gYnJ5iaHHEEYBb9qb
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BuCv1gYnJ5iaHHEEYBb9qb
… fails on a missing file Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BuCv1gYnJ5iaHHEEYBb9qb
9 tasks done
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BuCv1gYnJ5iaHHEEYBb9qb
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01BuCv1gYnJ5iaHHEEYBb9qb
patternflow-bot
marked this pull request as ready for review
October 15, 2026 01:46
8 tasks done
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
studio / https://claude.ai/code/session_01BuCv1gYnJ5iaHHEEYBb9qb
정리 2단계 계획서 표의 PR 9 이다. 새로 쓴 글에
npm run check:voice를 돌리면 금지 낱말, 쉼표로 늘어놓은 셋, 「This document describes」 같은 첫머리, 「In conclusion」 같은 맺음 요약을파일:줄로 짚는다. CI 에는 넣지 않았고, PR 을 열기 전에 손으로 돌린다(계획서 D6).좋아지는 것: 일꾼 글의 기계 같은 말투를 올리기 전에 줄마다 짚는다 — 읽을 글이 덜 거슬린다
할 일
docs/investigations/2026-10-cleanup-step2-plan.md) 표의 PR 9 줄, D3·D6, k9 와docs/rfc-cleanup.md§2.1·§2.10·§2.11·§2.13 답 6,docs/voice.md,docs/voice-banned.txt를 읽는다web/scripts/voice-lint.ts(+271, §2.1(5) 의 300줄 안)typecheck,lint,check:drift,check:ci,check:human-lock,doc-map을 돌린다(CSV 는 되돌린다)42bb578, [DONE] 정리 2단계 PR 7 — 루트 CHANGELOG 와 릴리스 파일 두 벌이 어긋나면 CI 가 빨개지는 검사 #31·[DONE] 정리 2단계 PR 10 — BOM·묶음만 고친 PR 에서도 어긋남 검사와 직접 쓴 글 잠금이 돈다 #32·[DONE] 정리 2단계 PR 6 — /roadmap 노드 상태가 그 이슈의 열림·닫힘과 어긋나면 CI 가 빨개지는 검사 #34 까지)b5f1c5f와a40d2db에서 Drift checks·Web CI 모두 success한 일
web/scripts/voice-lint.ts를 새로 썼다. 명령 이름check:voice는 #25 가package.json에 넣어 두었다. 출력은 찾은 것마다 한 줄,파일:줄 규칙 걸린 말이다.규칙은 §2.10 마지막 문단과 k9 가 적은 넷이다.
banned:docs/voice-banned.txt의 말. 영어는 대소문자를 가리지 않고 낱말 단위로 어미까지 잡는다(ensure는ensures·ensured·ensuring,robust는robustly). 여러 낱말로 된 말은 줄이 바뀌어도 잡는다. 한국어는 쓴 그대로 어디서나 잡는다. 목록 파일 머리에 적힌 약속 그대로라 목록에 말을 더해도 스크립트는 안 고친다.threes: 쉼표로 늘어놓은 셋. 영어는 §2.10 의 예 "fast, simple, and reliable" 처럼 마지막 앞에도 쉼표가 있고, 셋의 낱말 수가 같고(1~3), 관사 따위로 시작하지 않는 것이다. 한국어는 「빠르고, 간단하고, 안정적인」처럼 앞 둘이 -고·-며·-한·-적인 따위로 끝나는 것이다.opener: 문장 첫머리의 「This document/guide/page/PR/module … describes/covers/introduces/provides …」, 「In this guide, we …」, 「이 문서는 … 설명」.closer: 문장 첫머리의 「In conclusion」「In summary」「To sum up」「Overall,」, 그리고 「결론적으로」「요약하면」「요컨대」.읽는 범위.
scripts/lib/pr-base.ts) 뒤로 이 브랜치가 더한 줄만 읽는다. 새 파일은 추적 안 된 것까지 전부, 고친 파일은 hunk 의 + 쪽 줄이다. 인자가 파일이면 그 파일 전부,-면 stdin 을 마크다운으로 읽는다(PR 본문용).String.raw템플릿은 패턴이라 건너뛴다. C·C++·Kotlin 은 주석, Python 은 주석과 docstring, 셸·YAML 은 주석만 읽는다.docs/voice-banned.txt도 이유와 함께EXEMPT에 두고 뺀다(D3).PF_LOCK_BASE가 이 클론에 없는 커밋이면 실패, 기준이 없으면 skip(exit 0),PF_DRIFT_STRICT=1이면 skip 도 실패다.증거
지금 브랜치(
a40d2db, web/):npm run check:voice(인자 없음): exit 0. 스크립트가 자기 자신을 읽고도 걸리지 않는다. 패턴을 정규식 리터럴로 둔 까닭이다.npm run typecheck: exit 0.npm run lint: exit 0,✖ 12 problems (0 errors, 12 warnings). 모두 원래 있던src/경고이고 새 파일에는 없다.npm run check:drift:passedbom, bom-schematic, changelog, editions, features, links-absolute, presets,skipped roadmap(이 컨테이너엔 gh 로그인이 없다, D2). exit 0. CI 의 Drift checks 는PF_DRIFT_STRICT=1과GH_TOKEN으로 roadmap 까지 돈다.npm run check:ci(dev merge 전1d30c0c): exit 0,Test Files 35 passed (35),Tests 478 passed (478). merge 로 들어온 것은 changelog·roadmap 검사와 drift 워크플로이고, 검사는 위 check:drift 와 CI 에서 돌았다.npm run check:human-lock:check:human-lock: no locked words changed.git fetch --tags뒤npm run doc-map:1071 links from 214 files,0 do not resolve. 바뀐 다섯 행은 dev 의 5단계 계획서·진행 기록·editions.ts것이라 이 PR 과 무관하고, 두 CSV 는git checkout으로 되돌렸다.저장소 밖 스크래치 폴더의 버리는 글에 돌린 결과.
bad.md:3줄의 경로, 21·25줄의 Writing voice 절은 걸리지 않고, 절이 끝난 29줄은 다시 걸린다. 다른 꼴도 같은 실행에서 봤다.
(오른쪽은 그 줄의 원문.) 걸리지 않은 것:
bad.tsx의import … from "./robust-path"과/seamless|robust/정규식,bad.h의 C 문자열,bad.py의 문자열,bad.html의<style>·<script>,raw.ts의String.raw안.깨끗한 글
clean.md:check:voice: nothing found, exit 0. 관사로 시작하는 셋(The cards, the bundles, and the images), 고유명사 셋(Korean, English, and Japanese),U1, SW1, and J4, 인라인 코드의seamless, 큰따옴표·「」 안의robust·다양한, 링크 대상·URL·img src 의robust·ensure·seamless, 코드 펜스 안,## Writing voice절,insured·there's를 담았다.버리는 고침으로 본 인자 없는 실행.
docs/legacy/BUILD_GUIDE_v2.md5줄 끝에 「In conclusion, it works.」를 붙이고 끝에 「The panel is fast, simple, and reliable.」을 더하고, 추적 안 된docs/throwaway-voice.md를 만들었다(돌린 뒤 되돌리고 지웠다).같은 파일 3줄의 「This guide walks」와 321줄의 「ensures」는 원래 있던 줄이라 읽지 않았다. 다섯째 줄은 이 스크립트 주석의 인용을 잘못 짚은 것이다.
String.raw안의 따옴표가 인용 짝을 흐트러뜨려서였고,String.raw를 건너뛰게 고친 뒤로는 위처럼nothing found다.기준과 인자:
PF_LOCK_BASE가 없는 커밋check:voice: PF_LOCK_BASE is 0123…, and this clone has no such commit (check out with fetch-depth: 0), exit 1check:voice: skipped, no PF_LOCK_BASE, and no merge-base with origin/dev or origin/main, exit 0PF_DRIFT_STRICT=1PF_DRIFT_STRICT=1, so a skip fails, exit 1check:voice: no such file: docs/nope.md, exit 1docs/voice-banned.txtskipped docs/voice-banned.txt: it is the list the banned rule reads, exit 0(stdin):3 banned robust,(stdin):3 opener This PR introduces, exit 1이 본문도 파일로
check:voice에 돌려nothing found였다. 처음엔 규칙의 낱말을 이름으로 든 곳 열두 군데가 걸려서 백틱으로 쌌다.트리 전체에 돌려 본 수(참고만, 아무것도 고치지 않았다):
banned 42 중 대부분은 일지의 「다양한」이고, opener 6 은 「This guide walks」(BUILD_GUIDE.md 등)와 「This file provides」(AGENTS.md)다. 잠긴 글이거나 사람이 쓴 글이라 고치지 않는다. 이 검사는 일꾼이 더한 줄에 쓴다.
실행법
가정
CHANGELOG.md,docs/rfc-cleanup-progress.md, doc-map CSV 는 안 고쳤다. 라벨cleanup·step-2는 포크에 없어서 달지 않았다.check:ci에도 drift 워크플로에도 넣지 않았다(D6, 질문 14 의 기본값). 그래서 찾은 것이 있으면 exit 1 로 끝내도 막는 것이 없다.PF_DRIFT_STRICT는 기준을 못 찾은 skip 에만 쓴다.threes는 어림이다. 처음엔 「A, B and C」도 잡았더니 트리의 .md 에서 452개(100줄에 2.3개)가 나왔고 거의 물건 목록이었다. 그래서 §2.10 의 예처럼 마지막 앞 쉼표가 있는 것, 셋의 낱말 수가 같은 것, 관사·소유격으로 시작하지 않는 것만 잡게 줄여 104개가 됐다. 관사 없는 물건 목록(makers, artists, and musicians)은 아직 걸린다. 사람이 보고 넘긴다.docs/voice-banned.txt에 더하면 그대로 잡힌다.for another k
check:voice: 손으로, 산문을 새로 쓴 PR 을 열기 전에. 인자가 없으면 기준 뒤로 더한 줄, 파일이나-(stdin)도 받는다」. §2.10 블록의 제목에 「Writing voice」를 그대로 두어야 이 검사가 그 절을 건너뛴다.check:voice는 CI 에 없다고 한 줄.Changelog
Web
check:voicepoints at the habits of generated prose, line by line. Run it by hand on new or rewritten text before a pull request opens. With no arguments it reads the lines the branch adds; it also takes files, and-reads a PR description from stdin. It flags a word fromdocs/voice-banned.txt, three adjectives or clauses after a serial comma, an opening that says what the text is about and a closing summary, each asfile:line. CI does not run it.Upstream
check:voice(web/scripts/voice-lint.ts), the voice lint of rfc-cleanup.md section 2.10. It flags words fromdocs/voice-banned.txt, serial-comma triplets, openers and closing summaries as file:line, in the files given or the lines a branch adds. Run by hand, not in CI.npm run typecheck,npm run lint(0 errors),npm run check:drift,npm run check:ci,npm run check:human-lock,npm run check:voice(throwaway text fails each of the four rules, clean text passes),npm run doc-map(1071 links, 0 unresolved, CSVs restored).🤖 Generated with Claude Code
https://claude.ai/code/session_01BuCv1gYnJ5iaHHEEYBb9qb