diff options
| author | eunhhu <[email protected]> | 2026-09-30 12:52:39 +0100 |
|---|---|---|
| committer | eunhhu <[email protected]> | 2026-09-30 12:52:39 +0100 |
| commit | d9b02855dad6369c63479b24238f05acfd2312fb (patch) | |
| tree | d15bda078a1178ae73f5a918d51e54c5567429e3 /docs/research/108-one-value-every-path.md | |
| parent | 854c5f502444d440ec8e56ad159a050e4985f516 (diff) | |
| download | pure-d9b02855dad6369c63479b24238f05acfd2312fb.tar.gz pure-d9b02855dad6369c63479b24238f05acfd2312fb.zip | |
Say what pinning a value across every boundary checks, before writing the check (108)
Diffstat (limited to 'docs/research/108-one-value-every-path.md')
| -rw-r--r-- | docs/research/108-one-value-every-path.md | 37 |
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가 보기를 그리는 것)은 다음 단계다. |
