글감 1,001개 중 제1부(§3~§11) 앵커를 하나라도 가진 것은 112개뿐이었다. 나머지 889개는
제2부 모듈 분석 65편의 절 제목에서 나온 것이고, 그것이 재판정이 필요했던 이유다.
주제 44 → 16 (43개가 독자 질문 없이 있었다. 지금은 전부 있다)
글감 1,001 → 123 (제1부 앵커 112 + 제1부가 채택했는데 비어 있던 자리 11)
후보 965 → 1,088 · PENDING 905 → 0
error 3,042 → 0
내려온 889개는 후보 대장에 KEEP_IN_SSOT 로 남는다 — 버린 것이 아니라 분석에 남기고 독립
기록으로 만들지 않기로 한 것이다. 그 글감을 받치던 기록 파일 828개는 지웠다. 계약이 정본이고,
파일이 남아 있다는 이유로 계약에서 뺀 주제가 되살아나면 안 된다. 이력에는 그대로 있다 —
git checkout a0ca2bb -- <경로>.
제1부가 채택했는데 글감이 없던 자리 열하나를 채웠다: mongo high-water mark 가 재전달 이벤트를
삼킨 P1, admin plane 이 가드만 켜고 서비스는 켜지 않은 것과 그 짝인 결정, 실패 어휘 세 층과
SQLState 매트릭스 병합 규칙, 부하 아래에서만 새는 admission 경계, 발행 증거와 완료 판정의
분리, keyset·JSONB 결정 둘.
Concept 17개에 basis-version 을 채우고, 계약 제목과 기록 제목이 갈라져 있던 23건을 기록 쪽에
맞췄다. candidateScope 에 excludedAnchorPattern 을 적어 제2부 앵커만 가진 글감이 다시 올라올
수 없게 한다.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
keycloak-session-store 와 TechLog 는 SSOT 만 있고 분해 계약이 없었다. 두 프로젝트
모두 후보를 처분과 함께 남기고 PROMOTE 만 주제로 올린다.
keycloak-session-store 주제 6 · 글감 33 · 후보 42 (제외 9)
TechLog 주제 13 · 글감 56 · 후보 91 (제외 35)
TechLog 는 저장소가 셋이라 sourceRepository 를 목록으로 적는다. 설계 패키지는 이
기계에 체크아웃이 없고 반입한 쪽의 MANIFEST.sha256 이 세 계약의 원본 리비전을
고정하므로 그것을 리비전으로 적었다. 검사기 둘이 그 모양을 읽게 고친다 —
verify-tech-log-tree.py 는 목록의 항목마다 path·revision·verified 를 보고,
check_evidence.mjs 는 체크아웃이면 git 으로, 매니페스트면 그 파일이 리비전을
적고 있는지로 대조한다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
- 계약 채택 — 독자 질문, 후보 29건(PROMOTE 24 · MERGE_INTO 4 · KEEP_IN_SSOT 1). 게시 중
17건은 전부 유지. 저장소 keycloak-pattern 은 패턴 넷이 브랜치로 갈라져 있어 revisions 로
tip 넷을 적었다. keycloak-session-store 는 같은 저장소 @ cdac9b8
- 게시된 기록의 redirect_uri 가 SSOT·코드와 달랐다 — OAuth2callback.html → callback.html
(frontend/src/app.js 에서 확인). 계약 title 이 기록과 다른 7건도 기록 쪽으로 맞췄다
- 미작성 1건 작성 — 패턴 검증을 실제로 돌릴 때의 안전한 순서(Reference)
- 리뷰 100건 반영 — 설명 뒤에 붙은 평가·차례 예고·독자 오해 가정·작성 지시를 지웠다.
삭제가 남긴 조각 4건을 고치고, 원래부터 잘려 있던 로컬 미리보기 라벨 1건도 닫았다
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- 계약 채택 — schema 2 → 4. 독자 질문, 후보 36건(PROMOTE 24 · MERGE_INTO 8 ·
KEEP_IN_SSOT 4), 종류별 칸, kind:slug 관계. 저장소 github-project/ca-tmpl @ 761384d
(문서가 인용한 IT 7종이 그 커밋에 있다)
- 재선별 결과 기존 24건이 전부 살아남았다. 측정이 Reference 안에 들어 있었지만 독립성 검사를
통과하지 못해 Case 로 빼지 않았다
- 평문 칸의 백틱 제거, 「기준선」을 실제 이름으로, frontmatter 에 source·sourceRevision
- 리뷰 39건 반영 — 설명 뒤에 붙은 평가·예고·되풀이·독자 오해 가정을 지웠다. 사실을 담은
절반이 있는 문장은 평가만 뺐다
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- analysis/·source-index·state.json 을 final/document.md 제2부·제3부로 접었다. SSOT 는 하나다
- 파일럿 — commit-ambiguity-as-a-result 를 새 기준으로 재선별. 후보 14 → 글감 5
(PROMOTE 5 · MERGE_INTO 3 · KEEP_IN_SSOT 4 · 보류 2). 기록 5건을 다시 썼고 그림 1개를
techviz 로 만들었다
- 재선별이 잡은 것: 제1부 §6.2·§11.1 이 자기 §13.2 와 어긋나 있었다(레인을 안 돌렸다 vs
돌렸다) — 정정. 이미 답이 나와 있던 Question 을 HEAD 재실행 질문으로 다시 세웠다.
Concept 이 인용한 코드가 SSOT 에 없어 뺐다
- candidateScope·sourceRepository 기록. 나머지 43개 주제는 재선별 대기(PENDING 905)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
리뷰 두 건을 반영했다.
계약
- tech-log-tree.json 하나가 분해 계약이자 색인이다. 사람이 읽는 트리·Node Specification·
후보 대장은 없어졌고, 문서에 남아 있던 그 개념을 걷어냈다
- candidateScope — 후보를 찾는 SSOT 범위. 접어 넣은 제2부·제3부는 근거이지 후보가 아니다
- sourceRepository — 분석한 저장소의 경로·리비전·판단 근거. 리비전을 모르면 null 로 두고
지어내지 않는다. 갈래가 여럿이면 revisions
- 검사기: 계약 미채택·PENDING·PROMOTE↔글감 양방향·candidateScope·sourceRepository 를
error/warn 으로 센다. 옛 스키마도 검사를 피하지 못한다. 테스트 22 → 31
기록 쓰기
- 템플릿 5종에 source·sourceRevision·topicName, Question 에 닫는 조건, 본문 없는 종류에서
assets 제거. 고정 절 개수 삭제
- check_evidence.mjs — 인용한 코드가 SSOT 에 있는지, 앵커가 SSOT 를 가리키는지, 제목이
계약과 같은지, 리비전이 저장소에 있는지. 게시된 기록에서 SSOT 와 다른 URL 을 잡았다
문체
- 문체 규칙의 정본을 ai-tells.md 로. explaining.md 의 질문체 제목·절 끝 대조 반복·그림 예고
규칙을 삭제해 충돌을 없앴다. 첫 절 「설명 뒤에 평가를 붙이지 않는다」에 지우는 사례 네 유형
- voice 스킬의 「독자 쪽을 본다」를 자료에 오독 기록이 있을 때로 좁히고, 평가만 더한 예시를 교체
- check_prose: 안내 문장을 요구하던 경고 제거, 문장이 끝나지 않은 채 문단이 끝나는 조각 검사 추가
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Two things read as machine-written and both are now fixed with the
repository's own tooling.
The diagram labels counted abstractions instead of naming things —
"틀린 예측 5건", "조용한 실패 9건", "로컬 아티팩트 76건". Replaced with what
those actually were, which is also more useful in a drawing:
틀린 예측 5건 -> A-1 · A-2 · A-6 · B-4 · B-6
조용한 실패 9건 -> NetworkPolicy · tc · kill · iptables
로컬 아티팩트 76건 -> 연결수 0 · 50µs
A층 결론 3건 반전 -> A-1 · A-2 · A-8
The prose was staccato: 30.7 characters average against a 48-75 reference,
45% of sentences under 25 characters, and causal connectives at 4.9 per 100
against a floor of 6. check_prose reported an error for closing six
sentences with 「~것이 ~이다」.
Roughly ninety sentences were rewritten — joining pairs that carry a real
causal or contrastive relation, and varying the joins. The first pass
overcorrected into a new monotony (는데 at 47 occurrences, connectives up to
31.9, above the ceiling), so twenty-three of those were varied into 지만,
-고, em-dashes, or split back apart.
check_prose FAIL error 1 -> OK error 0
평균 문장 길이 30.7 -> 43.1
25자 미만 비율 45.4% -> 23.4%
이유 연결어미 4.9 -> within range
Two style_profile numbers still read outside the band, and the reason is
worth writing down rather than editing around: the tool counts each image
caption as a sentence, and this document carries 28 diagrams. Excluding
captions and separators the prose is 46.4 characters average with 14.3%
short — inside the reference range. Padding sentences to move the remaining
gap is what CLAUDE.md forbids, so it stops here.
Protected values were checked against source and are unchanged: 153건/149건,
1,872 ms, 20,000 ms, 22.2 초, 2305초, 845361바이트, 8856건, 205.7ms, 106초.
All 28 diagrams still lint clean with no sentence left on any canvas.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The skill says drawings carry names and sentences go in <desc> and the
paragraph beside the figure. I put sentences in node details and edge labels
instead, and 27 of the 28 diagrams shipped with prose inside the canvas —
"예측 다섯 개가 틀렸다", "아홉 번 조용히 실패했다", "막혀서 닿지 않는다".
Only label and details render on the canvas; description does not. So every
sentence moved to a noun phrase and the meaning stays in description, which
was already carrying it.
막혀서 닿지 않는다 -> 차단
아홉 번 조용히 실패했다 -> 조용한 실패 9건
예측 다섯 개가 틀렸다 -> 틀린 예측 5건
로그아웃이 정리하지 않는다 -> 로그아웃 미정리
볼륨이 없으면 여기까지다 -> 볼륨 없음
Three node labels were sentences too and became names: 세션 스냅샷, 예측
선기록, 대조군 확보.
What stays is what the rules protect — identifiers, commands and measured
values: PRIMARY KEY (client_registration_id, principal_name),
ValidationFailedException: 1 changesets check sum, nginx -t && nginx -s
reload, SET LOCAL synchronous_commit TO OFF. Those are names of things, not
prose about them.
294 canvas strings across 28 diagrams, none matching a sentence ending,
average 11 characters. All 28 still lint clean and re-rendered.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The originating repository's SVGs were drawn by hand and every one of them
put a title, a subtitle and an explanation band inside the canvas. This
repository forbids both, so they could not be carried over — the whole set
was rebuilt through the skill's pipeline instead.
Each diagram went through prepare, references, prompt, a VizSpec 1.1 citing
document line ranges, lint, and render. All 28 pass lint and produce the
same eight formats the existing keycloak project has. Sentences moved out of
the canvas into <desc> and the paragraph beside each figure; the drawings
carry names only.
Two lint rules did real work rather than formatting work:
edge-through-node caught arrows crossing an unrelated
node and implying an adjacency that
does not exist — four diagrams had to
be restructured, not just relaid out
evidence-outside-prepared-context caught a diagram citing another
section; its anchor moved from B-0 to
B-1 so all three sections it draws on
are inside the prepared context
lab-topology also had to change profile: its context offers a different
candidate set, and query-fanout with shard roles is what the section
actually shows — one entry point spreading to two Keycloak nodes.
The document now carries all 28 inline, one per claim that needed one, and
the section recording what was still missing is updated: the diagram gap is
closed, Studio records remain.
verify-pipeline.py passes. audit-records.py reports no issues.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The keycloak project ended with four open questions that design could not
settle. A two-VM lab was built to answer them by measurement, and this is
that material: 26 experiments, 125 raw command outputs, 22 browser captures.
Follows the import procedure in README.md.
source/ the originating repository verbatim — 78 documents, 28 SVGs,
8 manifests, plus .source-revision recording the commit
final/ the SSOT
document.md 729 lines written from the 29 experiment documents, not
concatenated: what was predicted, what was measured, and
where the measurement itself was wrong
evidence/raw 125 outputs, flattened to <experiment>__<file> because
the originals collided (01-baseline.txt appeared three
times) and the audit only globs the top level
evidence/meta one per raw file; command and exitCode are null and the
README says why rather than inventing them
evidence/browser 22 captures
assets/ three diagrams through techviz
.techviz/ their VizSpecs
A separate project rather than an addition to keycloak: the B-layer answers
that project's four questions, but the A, C and D layers are about cluster
failure, SSO and operations, and one document.md should hold one subject.
The four question records there can point here through 관계.
Recorded rather than papered over: only three of the 28 diagrams were
remade. The repository forbids hand-drawn SVG and forbids titles inside the
canvas; all 28 originals carry both, so converting them is redrawing, not
reformatting. They stay in source/ and the gap is written into the document.
verify-pipeline.py passes. audit-records.py reports no issues.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
.run/의 세 런을 조사한 결과 claridoc run 파이프라인이 한 번도 완주하지
않았다. quality-gate.json 0건, stages/ 및 rounds/ 부재. 실사용 범위는
validate/collect/outline까지였고 글쓰기와 검수는 스킬이 담당했다.
파이썬 패키지, CLI, 스키마, 테스트, 예제, 조사 자료, 빌드·배포 산출물,
하네스 규약 문서를 제거한다. 남는 것은 Agent Skill 세 개, .run/의 문서
세 편, CLAUDE.md, README.md, LICENSE, 제거 결정 문서다.
examples/golden의 구버전 초안 두 편(n+1liner.md 1416줄,
claridoc-rewrite/document.md 1626줄)과 루트 document.md(.run 판과 md5
동일한 사본)도 함께 지운다. .run/에 더 진행된 판이 있다.
복구: git checkout pre-harness-removal -- <경로>
근거: docs/decisions/2026-08-07-remove-claridoc-harness.md
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
.run/의 세 런을 조사한 결과 claridoc run 파이프라인이 한 번도 완주하지
않았음을 확인했다. quality-gate.json 0건, stages/ 및 rounds/ 부재.
실사용 범위는 validate/collect/outline까지였고 글쓰기와 검수는 스킬이
담당했다.
하네스를 제거하고 korean-technical-blog-skills-bundle-v1의 스킬 세 개와
.run/의 문서 세 편만 남기기로 한 결정과, 보존/삭제 인벤토리, 안전장치,
검증 절차를 기록한다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>