주제 13개 · Case 28 · Concept 5 · Reference 15 · Question 4 · Decision 4. 계약의 노드마다 종류가 요구하는 칸을 채우고, 본문이 있는 두 종류에는 SSOT 가 이미 그려 둔 도식 셋(value-boundaries · decision-path-404 · topic-variant-model)을 tech-log-studio/ 로 옮겨 붙였다. 새로 그린 그림은 없다. 검사 셋 전부 통과한다. check_body.mjs 56 편 중 본문이 있는 33 편 PASS check_prose.mjs 56 편 error 0 check_evidence.mjs --repo 포함 문제 없음 verify-tech-log-tree.py 프로젝트 5 · error 0 · warn 0 인용한 코드블록은 전부 SSOT 에서 찾아 대조했다. check_evidence.mjs 가 본문의 각 줄과 source 앵커와 계약 제목을 다시 확인한다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
96 lines
4.3 KiB
Markdown
96 lines
4.3 KiB
Markdown
---
|
|
kind: CASE
|
|
slug: a-summary-vanished-at-three-boundaries
|
|
title: 관계의 요약이 경계 세 곳을 지나며 사라졌다
|
|
topic: values-lost-between-boundaries
|
|
topicName: 값이 경계에서 사라진다
|
|
project: TechLog
|
|
status: 게시 전
|
|
lastVerifiedOn: 2026-09-04
|
|
sourceRevision: tech-log@2026-09-02
|
|
source:
|
|
- final/document.md#§5.2
|
|
- final/document.md#§5.3
|
|
---
|
|
|
|
# 관계의 요약이 경계 세 곳을 지나며 사라졌다
|
|
|
|
관계 목록의 라벨을 고쳤는데 요약은 여전히 비어 있었다. 한 경계를 고치고 확인했더니 다음 경계가 버리고 있었고, 그것을 고치니 그다음이 버렸다. 세 번째는 계약에 담을 칸 자체가 없었다.
|
|
|
|
## 관계
|
|
|
|
- **공개 화면 한 줄이 그려지기까지 값이 지나는 경계 열한 개**
|
|
세 경계가 그중 어디인지가 그 개념에 있다.
|
|
- **한 경계를 고쳤으면 값의 여정 끝에서 확인한다**
|
|
이 사건에서 굳힌 규칙이다.
|
|
- **결정에는 상세 화면이 없어 목록 항목이 문서 전체를 실어야 했다**
|
|
같은 시기에 계약의 빈칸으로 난 다른 사건이다.
|
|
|
|
## 문제
|
|
|
|
관계 목록은 한 줄에 대상의 종류와 작성자가 쓴 이유와 대상의 요약을 보인다. 라벨은 고쳤는데 요약 자리가 계속 비어 있었다.
|
|
|
|
계약에는 요약이 있었다. DB 에도 값이 있었다. 화면까지 오지 못했다.
|
|
|
|
## 결론
|
|
|
|
값이 세 경계를 지나며 사라지고 있었다.
|
|
|
|
flattenRelations : 담지 않음 — 1차로 고침
|
|
렌더 모델로 변환 : 담을 칸 자체가 없었음
|
|
화면 목록으로 전달 : 또 버림
|
|
|
|
렌더 모델 계약(`ResolvedRelation`)에 요약 칸이 없었고 `additionalProperties: false` 라 실을 수도 없었다. 계약에 `summary` 를 더하고 — 이미 나가 있는 응답을 깨지 않으려고 required 에는 넣지 않고 — 세 경계를 모두 이었다.
|
|
|
|
그 과정에서 한 칸에 뭉쳐 있던 셋을 갈랐다. 대상의 종류는 `label`, 작성자가 쓴 이유는 `note`, 대상의 요약은 `summary` 다.
|
|
|
|
## 검증 환경
|
|
|
|
tech-log-frontend : a3ed23e 이후
|
|
tech-log-design-package : fa67a64 이후
|
|
tech-log-backend : 92679f5 이후
|
|
확인 방식 : 공개 화면의 관계 목록에서 세 값이 각각 나오는지 확인
|
|
|
|
## 재현 조건
|
|
|
|
1. 기록 둘을 관계로 잇고 이유를 적는다
|
|
2. 게시한 뒤 공개 화면에서 관계 목록을 본다
|
|
3. 라벨·이유·요약 세 값이 각각 나오는지 본다 — 하나라도 비면 그 값이 어느 경계에서 사라졌는지 역순으로 따라간다
|
|
|
|
## 본문
|
|
|
|
<!-- body:start -->
|
|
|
|
## 세 번 버려졌다
|
|
|
|
```text
|
|
계약(요약 있음)
|
|
└─ flattenRelations 가 담지 않음 ← 1차로 고침
|
|
└─ 렌더 모델로 바꿀 때 버림 ← 담을 칸 자체가 없었다
|
|
└─ 화면 목록으로 넘길 때 또 버림
|
|
```
|
|
|
|
첫 번째를 고치고 화면을 봤을 때도 요약은 비어 있었다. 두 번째를 고치려고 보니 렌더 모델 계약에 담을 칸이 없었고, `additionalProperties: false` 라 계약을 고치지 않고는 실을 수 없었다.
|
|
|
|
## 계약에 칸을 더할 때 required 를 따로 판단한다
|
|
|
|
`ResolvedRelation` 에 `summary` 를 더했다. required 에는 넣지 않았다. 이미 나가 있는 응답에는 그 칸이 없으므로, required 로 올리면 배포 순서에 따라 검증이 깨진다.
|
|
|
|
## 한 칸에 셋이 뭉쳐 있었다
|
|
|
|
값을 잇고 나서 다른 문제가 보였다. 관계 한 줄이 답해야 하는 것이 셋인데 `reason` 한 칸을 지나고 있었다.
|
|
|
|
| 무엇 | 뜻 | 경로별로 어떻게 나왔나 |
|
|
|---|---|---|
|
|
| 대상의 종류 | 「근거」「관련 기준」 같은 분류 | 렌더 모델 경로: 작성자의 문장이 이 자리에 눌려 나옴 |
|
|
| 작성자가 쓴 이유 | 「다음에 무엇을 읽을지」의 답 | 공개 조회 경로: **아예 버려짐** |
|
|
| 대상의 요약 | 대상이 무엇인지 | — |
|
|
|
|
셋을 `label` · `note` · `summary` 로 갈랐다. 설명 자리에는 문장이 있으면 문장을, 없으면 요약을 보인다. 요약은 대상이 무엇인지 말하고, 문장은 왜 지금 그것을 읽어야 하는지 말한다.
|
|
|
|
## 확인하지 못한 것
|
|
|
|
세 경로에서 무엇이 나오는지는 화면으로 확인했다. 세 경로 전부를 자동 검사로 고정하지는 않았다.
|
|
|
|
<!-- body:end -->
|