리뷰 두 건을 반영했다.
계약
- 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>