aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--docs/research/108-one-value-every-path.md37
1 files changed, 37 insertions, 0 deletions
diff --git a/docs/research/108-one-value-every-path.md b/docs/research/108-one-value-every-path.md
new file mode 100644
index 0000000..4f0bb28
--- /dev/null
+++ b/docs/research/108-one-value-every-path.md
@@ -0,0 +1,37 @@
+# 108 — 경계에서 값이 그대로인가: 한 값, 모든 길
+
+2026-09-30. [외부 리뷰 004](../outside-feedback/feedback-004.md)의 맺음말에서 시작한다. 리뷰는 "앱 코드와 저장·전달·화면
+사이의 중복 상태와 변환을 실제로 줄인 것"을 가장 중요한 성과로 꼽고, "그 경계에서 의미가 유지되는지부터 고정하는 일"을 다음
+연구의 기반으로 권했다.
+
+변환은 줄었지만 없어지지는 않았다.
+
+- 들어올 때: HTTP의 JSON 본문과 쿼리가 메시지의 필드가 된다(JSON 문자열의 이스케이프를 풀고, 수의 글자를 읽는다).
+- 저장할 때: 상태가 저장 형식이 된다(위치는 varint, 2^53 미만의 정수는 zigzag varint, 그 밖의 수는 표시와 8바이트).
+ 체크포인트는 그것을 다시 이미지로 쓴다.
+- 보일 때: 스냅숏의 상태가 보기의 JSON이 된다(수는 가장 짧은 글자로, text는 JSON 문자열로).
+- 보낼 때: 보냄이 outbox의 기록이 되고, 링크의 기록이 되고, 받는 쪽 입력의 배치로 옮겨진다(모양이 다르면 이름으로,
+ [014](../design/014-fields-by-name.md)).
+
+변환마다 단위 검사는 있다. 그러나 한 값이 한 길로 들어가 다른 모든 길로 나올 때 같은지를 보는 검사는 없다.
+
+착수 기준(검사를 짜기 전에 정해 커밋했다):
+
+- **바꿀 결정.**
+ - 어떤 길이 값을 바꾸면(수의 비트, text의 바이트, 필드가 있고 없음) 다른 일보다 먼저 고친다.
+ - 형식이 싣지 못해 바꿀 수 없는 것은 계약으로 적는다.
+ - 경계마다의 계약을 설계 문서로 두고, 이 검사를 `make check`에 넣는다.
+- **길.**
+ - 들어가는 길: HTTP의 JSON 본문, HTTP의 쿼리와 날 본문(text), 링크 전달, HTTP 전달.
+ - 나오는 길: 보기(연결 스레드가 스냅숏에서), 등록한 질의, 재시작(저장소의 로그에서), 체크포인트 뒤의 재시작(이미지에서),
+ 모듈 교체(필드 순서를 바꾸고 u32를 number로 넓힌 모듈), 중계(A에서 B로 링크, B에서 C로 HTTP).
+- **값.**
+ - 수: 0, −0, 2^53 부근, 가장 큰 수, 가장 작은 정규 수와 비정규 수, 1/3, 글자가 지수로 바뀌는 1e21 부근.
+ - u32: 0, 2^31, 2^32 − 1.
+ - text: 빈 것, 한글, 4바이트 UTF-8, 따옴표·역슬래시·제어 문자, NUL, U+2028, 4 KiB.
+ - 그룹 안의 필드.
+- **통과 조건.**
+ - 받아들인 값은 모든 나오는 길에서 같아야 한다. 수는 비트까지(보기의 글자를 다시 읽은 binary64), text는 바이트까지.
+ - 거절할 값(넘치는 수, 음수·소수·2^32 이상의 u32, UTF-8이 아닌 text, 짝 없는 서로게이트)은 모든 들어가는 길이 거절해야
+ 한다. 거절한 사건은 아무것도 남기지 않는다(보기에도, 보냄에도).
+- **범위.** Pure의 경계다. 화면(Vega가 보기를 그리는 것)은 다음 단계다.