2026-10-17 보관. 2026-10-17 네 저장소 origin/main 대조 전 판. 미병합 PR 작업 보고서였던 본문을 현재 main의 Rust projection/align과 aippt 변환을 설명하는 규칙별 레퍼런스로 재구성했다. · projection 적용 순서 P5→P4→차트 열 제거→P6→P3→P7→P2, P3 name:value/빈 문자열 처리, align의 value 전용 처리와 이미 제거된 items: 접두를 구분했다. 본문과 자동 동기화 표는 보관 당시 내용입니다.
표 머리글·관계 설명·빈 문자열을 다루는 PR #1458은 유지했다. 문자열 P3(#1487), value의 「값:」(#1484), 평탄화 접두(#1485), 신호 필드 제외(#1486)를 각각 별도 PR로 만들어 원격에 반영했다. 네 PR은 모두 #1458의 같은 head에서 독립 분기하며 서로 의존하지 않는다. 로컬 검사는 모두 통과했고 GitHub CI·자동 리뷰 상태는 따로 표시한다.
어긋남 (의도) 정본과 다르게 동작한다. 정본을 고칠 대상이다정본 없음 해당 동작을 정한 규칙이 없다 · 필요한 규칙은 정본에 보충한다일치 정본대로다열린 문제 정본 안에서 해석이 갈린다
작업 업데이트 · 2026-10-17 · 4개 독립 PR 생성 완료
네 정책을 각각 리뷰·머지할 수 있도록 분리하고 네 PR을 모두 생성했다.#1458의 문서 정정 head a5bb50d452가 공통 base이며, 실행 코드는 검증한 48cf4ed722와 같다. 네 PR의 GitHub base는 모두 fix/mor-2516-yaml-keys-in-replacement이고, 네 정책 PR끼리의 의존은 없다.
공통 로컬 검사. 네 PR의 관련 Rust fmt·format·lint·core Clippy·앱 tsc 검사와 범위별 독립 코드 리뷰를 통과했다. 이 결과는 로컬 검증이며 GitHub 자동 리뷰 완료를 뜻하지 않는다.
P3의 독립성. #1487은 신호 필드의 기존 표기를 보존한다. 통합 이력의 p3_text 삭제 커밋 48142fa는 적용하지 않고 helper를 유지했다. 실행 코드와 무관한 추가 테스트 하나를 제거한 최종 head의 Rust 테스트 수는 893개다.
GitHub CI. #1458·#1484는 check·comp-pass가 통과했고 자동 리뷰는 pending이다. #1485는 check 통과·comp-pass 진행 중이다. #1486·#1487의 CI와 나머지 자동 리뷰도 진행 중이다. 열려 있는 다섯 PR 모두 MERGEABLE(충돌 없음)을 확인했다.
빈 문자열 보강 PR 추가 분리 진행. 규칙 1b(MOR-2778)의 정렬·투영·용량 사전 필터와 회귀 테스트를 #1458에서 별도 PR로 옮긴다. #1458에는 표 머리글·관계 설명만 남기고, 기존 네 정책 PR도 새 기준 브랜치를 반영한다. 각 diff와 Rust 테스트를 확인한 뒤 담당 PR·검증 기록을 갱신한다.
정본 대조 용어와 P4 티켓 갱신. 정본이 규정하지 않은 동작의 표기를 “정본 없음”으로 통일했다. 규칙 3은 실제 머리글 보존(일치)과 머리글 없음·빈 머리글 처리(정본 없음 · P4 보충 필요)를 나누어 적고, 정본 보충 버그 MOR-2779를 생성해 연결했다.
규칙 3의 정본 보충 구분. 실제 머리글 보존은 P4와 일치하지만, 머리글이 없는 경우의 값만 보존 규칙은 정본에 없다. “정본 수정 없음”을 “P4 예외 규칙 보충 필요 · MOR-2779”으로 정정했다. 구현과 기존 P4가 충돌하지 않는다는 사실과 정본 보충 필요성을 구분한다.
#1458 본문 갱신. 실제 머리글은 정본 P4와 일치하고, 이름 없는 열·빈 문자열 처리는 정본이 정하지 않은 보강이며, 관계 desc는 P7과 일치한다는 근거를 고정 코드·정본 원문·로직 운영 링크와 함께 원격 Summary·Test plan에 반영했다.
배포 방침.LOGIC_ID 유지와 (b) 서빙 중인 판을 새 코드로 다시 굽기를 유지한다. 각 정책 PR에도 이 결정을 적는다. stg/prd 배포 전 필요한 판 재굽기와 태그·환경별 짝 증명서 갱신은 이번 PR 재분리에서 실행하지 않는다.
TS 벤더. Eregion에서 복사한 TS 원본은 직접 바꾸지 않는다. 각 정책 PR에서 Rust와 TS 벤더의 차이를 명시하고, Eregion 수정 후 MOR-2776에서 sync 한다.
썸네일 기준. 아래 18개 사례는 통합 변경 4634def6e의 렌더 기록이다. 이후 ca5d4c555의 별칭 보강과 이번 네 PR 재분리는 재렌더하지 않았다. 개별 PR 단독의 최종 렌더 결과로 읽으면 안 된다.
대체된 통합 PR #1483의 기록 · a25e4eb267
PR #1483은 a25e4eb267로 원격에 생성했다가 네 개별 PR로 대체해 닫은 통합 PR이다. 실행 코드·골든은 그 이전 통합 head ca5d4c555와 바이트가 같고 빈 값 용량 사전 필터 테스트 1개를 추가했다. 아래 검사는 이 통합판의 기록이며, 네 개별 PR의 검사 결과가 아니다.
ca5d4c555는 분리 전 #1458에 커밋·푸시했던 통합 head다. 아래 결과는 그 판의 기록이며, 현재 #1458과 네 개별 PR의 상태는 위 표를 따른다.
High — 별칭 호스트의 신호 필드 제외. pass 1.5가 호스트에서 Marker만 빼던 누락을 고쳤다. emphasis·weight·avatar를 제외하고 일반 별칭 호스트를 계속 찾으며, 없으면 기존 items·폴백 경로로 본문을 옮긴다. 원인과 영향 · 수정 코드.
회귀 검증. 신호 호스트를 건너뛴 본문이 items로 옮겨지는 경우와 뒤쪽 일반 별칭 호스트를 사용하는 경우를 추가했다. 두 테스트 모두 수정 전 실패·수정 후 통과를 확인했고, 사용자 본문의 콜론과 신호 슬롯의 blank도 검증한다. items 이동 테스트 · 일반 별칭 호스트 테스트.
검사 결과. Rust 전체 cargo test 896개 통과, comp-frame-core Clippy(--all-targets -- -D warnings)·Rust fmt·저장소 format:check 통과. lint 오류 0건(기존 경고 238건), 앱 타입 검사 통과(WASM 생성물 연결 후). 별도 코드 리뷰에서도 추가 수정 사항이 없었다.
분석·구현·검증·PR 상태가 바뀔 때마다 관련 규칙과 작업 업데이트를 함께 갱신한다. 최초 통합판 문서 보관본.
#1458과 네 개별 PR을 읽는 기준
#1458은 규약에 맞추거나 빈 입력을 보강하는 변경이다. 실제 표 머리글과 사용자 본문의 콜론을 보존하고, 임의로 만든 열 N·관계 종류 접두와 빈 문자열만 제외한다. 비어 있지 않은 문자열의 period: 같은 접두는 이 PR에 남는다.
정책 PR 네 개는 서로 독립이다. 문자열 P3, value 접두, 평탄화 접두, 신호 제외를 각각 하나의 PR에서 다룬다. 모두 #1458의 a5bb50d452를 같은 출발점으로 삼으며, 다른 정책 PR을 base로 연쇄 연결하지 않는다. #1458 머지 후에는 각 PR의 base를 main으로 옮겨 해당 정책의 변경을 따로 리뷰한다.
규칙 카드의 전후 문구·사례·코드 위치·행 수는 분리 전 통합판 분석을 보존했다. 「분리 전 구현 기록」은 역사적 근거이며 현행 PR 소속을 뜻하지 않는다. 현재 번호·SHA·검증 상태는 위 작업 업데이트를 따른다.
도착이 안 읽는 내용 필드는 그 entity 의 items 맨 뒤에 이름: 값 으로 붙인다.
정본대로면 period: 2018년 이 화면에 그대로 찍힌다. 필드 이름은 매핑 메타데이터(moves)에만 남긴다.
개별 PR 확정:PR #1487 · 문자열 P3 · dfd5dbc37b. 로컬 Rust 893개·TS 2,532개(51개 skip)와 관련 정적 검사를 통과했다. 신호 필드의 기존 접두를 보존하기 위해 p3_text를 유지했다. 아래 통합 이력의 삭제 커밋 48142fa는 이 개별 PR에 적용하지 않았다. GitHub CI·자동 리뷰 상태는 상단 작업 업데이트를 따른다.
2.6판에서 그려질 수 있는 행 — 2.6판에서 그 필드 슬롯이 없고 글 자리(label·items)가 있는 행 — 선언 카테고리 안에서: period(Timeline·ResumeCV) 1,837행, speaker 123행, author 922행, source 1,836행, organization 5,268행. 카테고리와 상관없이 세면 20만 행 안팎이다(검증기가 필드를 카테고리로 막지 않는다).
통합판에서 키를 떼고 값만 옮기자 빈 항목이 드러났다. 분리 후에는 접두 제거(규칙 1)와 독립적으로 빈 문자열 자체를 이동 대상에서 제외한다. 접두를 붙이기 전에 빈 값인지 검사하므로 접두 제거에 의존하지 않는다. 비어 있지 않은 값의 표기는 이 규칙이 바꾸지 않는다. 정본은 빈 값을 다루지 않는다.
MOR-2778. 이 사례만 전 = 분리 전 통합판의 보강 전 head cb3645e60, 후 = 접두 제거와 빈 값 보강이 함께 든 4634def6e다. #1458 단독 렌더는 아니다. 빈 bullet 이 붙으면 글상자가 목록 모양이 되어 왼쪽 위로 밀린다.
#1458 고정 근거:정본 P3는 빈 값 처리를 명시하지 않는다. 접두를 붙이기 전 빈 값을 거르는 정렬, 투영, 용량 사전 필터를 같은 조건으로 맞췄다.
2.6판에서 그려질 수 있는 행 — 다섯 필드 중 하나라도 슬롯이 없고 items 가 있는 2.6판 행 174,648. 기간 슬롯 없는 Timeline 중 items 있는 행 1,461.
version: "0.5"
title: 서비스 출시 일정
components:
- type: TimelineSchedule.Timeline
structure:
entities:
- label: 베타 오픈
period: "2025년 3월"
items:
- 초대 사용자 대상
- label: 정식 출시
period: ""
items:
- 전체 공개
- label: 해외 진출
period: "2026년"
items:
- 일본·대만
검색 경로에서는 닿지 않는다. ① value 를 reads.content 로 선언한 카테고리는 BigNumber(measure?)·Gauge(measure) 둘뿐이다(vocab.json 45종·kernel 41종). ② 선택 dataset 도 dataset 을 가진 것으로 보니(capability_data.rs:136has_dataset) value 를 안 읽는 도착은 measure 도 못 읽어 P5 가 늘 같이 걸린다(projection.rs:80-83). ③ P5 가 걸리면 unread 에서 Value·Unit 을 지운다(projection.rs:224-228). BigNumber↔Gauge 는 서로 value 를 읽어 unread 가 아니다. 그래서 썸네일 사례가 없고, 단위 테스트(p3_merges_unread_value_and_unit_into_one_line·p3_keeps_unit_when_only_value_is_unread)로만 확인했다.
개별 PR 확정:PR #1484 · value 접두 · 5716caeed6. 로컬 Rust 890개(이 PR에서 TS 테스트 추가 실행 없음)와 관련 정적 검사를 통과했다. GitHub CI·자동 리뷰 상태는 상단 작업 업데이트를 따른다.
보충할 규칙: 실제 머리글이 있으면 열이름: 값을 유지하고, 머리글이 없거나 공백뿐이면 열 N이나 콜론을 생성하지 않고 값(단위가 있으면 단위 포함)만 보존한다. entities+columns 평탄화에도 같은 규칙을 명시해야 한다. 종전의 “정본 수정 없음”은 기존 규칙과 충돌하지 않는다는 뜻을 과도하게 단정한 표기였다. 정본 원문은 아직 수정하지 않았다.
사례
열 3개짜리 표에 칸 4개인 행 (ListingTable → List)
V3 생성 기록2.6판 13625758 · VStack_19 · tier 2 · ListingTable → List
바뀐 칸 근처만 잘라 그렸다.
쿼리 YAML
version: "0.5"
title: 출결 원인 분석
components:
- type: Enumeration.ListingTable
structure:
entities:
- label: 출결 원인 분석
items:
- 🔴 신앙 포기
- 🟠 생활관리 및 기질
- 🟡 보고체계 미흡
- 🟢 개인사정
dataset:
shape: matrix
columns:
- label: 대상
role: category
- label: 주요 내용
role: category
- label: 원인
role: category
rows:
- [김종수, 연속 결석, 신앙 포기]
- [김재희, 사유출석·인증, 생활관리, 연락]
- [양기영, 인증·보고 문제, 보고체계 미흡]
- [조부경, 대체예배, 개인 사정]
전 · 962dde1f5후 · 분리 전 통합판 4634def6e
슬롯
전
후
items
* 원인: 생활관리
* 열 4: 연락
* 원인: 생활관리
* 연락
4
평탄화한 줄에 필드 이름을 붙이지 않는다
value · unit · period · … · values
전value: 42% · values: 77→ 후42% · 77
어디서 생기나
평탄화 — 중첩 peel·종단 N5·표 행·용량 계산이 쓰는 글 줄
visual_summary/summary_content.rs:18 entity_lines
정본과 대조
열린 문제
schema-v0.5.md:956 · 8.7절 예시
위 예시가 평탄화되면 1분기 항목의 items 가 [신규 계약 12건, 매출 12억원] 이 된다
정본은 「중첩은 평탄화된다」(:115)까지만 규칙으로 적고 줄 표기는 정하지 않았다. 다만 예시는 { label: 매출, value: 12, unit: 억원 } 을 매출 12억원한 줄로 적는다. MOR-2516 수정은 키만 뗐고, label 과 값은 여전히 두 줄(매출 · 12억원)로 나눈다 — 예시와 다르다.
화면에는 중첩 컴포넌트를 벗길 때(peel)와 종단(List 등)으로 내려갈 때 보인다. 골든 nested.json·summary_content.json 이 이 변화를 잠근다.
개별 PR 확정:PR #1485 · 평탄화 접두 · c9b8bbe331. 로컬 Rust 891개·TS 2,533개(51개 skip)와 관련 정적 검사를 통과했다. GitHub CI·자동 리뷰 상태는 상단 작업 업데이트를 따른다.
2.6판에서 그려질 수 있는 행 — 종단 세 카테고리의 items 행 107,398. peel 자식은 어느 카테고리든 되므로 상한은 items 행 전체 174,648.
measure 를 못 읽는 곳으로 가면 value 와 unit 을 entity 로 옮긴다. 나머지 필드는 P3 을 따른다
P3 을 따르니 정본대로면 target: 80 이다. fallback 엣지(P5·Gauge→BigNumber)는 이 조항과 어긋난다.
정본 없음
tier 1(Gauge → Gauge)에서 부속값이 items 글이 되는 것은 정본이 다루지 않는다. §3.4 는 「fallback 은 카테고리를 바꾸는 일이므로」 엣지만 말한다. Frame 에 measure 칸이 없어 생긴 구현 사정이다.
Gauge 타입 처리라 MOR-2516 범위 밖으로 남겼다. 분리 전 통합 PR 첫 판에서 키를 떼 봤지만 숫자만 남아 무엇이 목표인지 알 수 없어 뺐다. 당시 렌더 기준 4634def6e로 다시 돌려 결과 목록·순위·cost까지 당시 main과 같은 것을 확인했다. 아래는 그 통합판 기록이며, 분리 후 개별 PR의 재렌더 결과는 아니다. 표기를 정하는 일은 MOR-2769 future plan 이다. 운영 생성 프롬프트 V3 에는 KPI 타입이 없어 지금 운영 영향은 없다.
2.6판에서 그려질 수 있는 행 — items 행: Gauge 239, BigNumber 5,314, HighlightedMessage 10,266, List 69,014 (합집합 84,613).
선택 내용 — period, weight, speaker, author, source, avatar, organization, children … → 옮긴다 (P3, P7)
mordor-wiki capability-table.md:315–317 · §3.5
BigNumber → List | value, unit, delta, emphasis 가 items 로 간다
mordor-wiki capability-table.md:389–391 · §3.5
ProfileCard → List | avatar, organization
mordor-wiki capability-table.md:392·394 · §3.5
Pyramid → List·Staircase | weight 가 items 로 간다
열린 문제
mordor-wiki capability-table.md:393 · §3.5
Pyramid → NestedScope | weight 는 표현 선택이라 버린다
정본 안에서 weight 가 엣지마다 다르게 적혀 있다. MOR-2516 수정은 늘 버린다.
schema-v0.5.md:51
강조(Element.Highlight)는 대치가 내용으로 채우는 노드 … entity.emphasis 가 담는다
강조 노드를 비울지, 강조된 entity 의 내용을 실을지는 정본 해석이 갈린다. MOR-2516 수정은 비운다(임시 문구).
2.6판에는 avatar 슬롯이 0행, weight 3행, emphasis 165행뿐이라 거의 늘 items 로 흘러 true·0.8·파일 이름이 찍혔다.
신호 제외 PR #1486에 포함한 리뷰 보강 — 신호 필드는 별칭 호스트로도 쓰지 않는다
적재는 FIELD_ORDER 순으로 같은 Text 노드의 첫 필드를 호스트로 잡는다. emphasis·weight가 speaker·author·source·organization보다 먼저 잡으면 본문 필드는 그 신호 슬롯의 별칭이 된다. pass 1.5는 쿼리 신호 필드를 걸렀지만 호스트에서는 Marker만 제외해, 일반 본문이 강조·가중치 칸에 들어갈 수 있었다.
호스트에도 !host.is_signal()을 적용했다. 신호 칸은 빈 필드로 남고, 본문은 다음 일반 별칭 호스트 또는 기존 items·폴백 경로를 따른다. 저장 데이터의 손상이 아니라 화면의 대치 위치가 잘못되는 문제다. 검색 후 용량 게이트는 정렬 결과를 다시 보므로 이번 누락으로 용량 초과 후보가 검사를 우회하는 것은 아니다.
개별 PR 확정:PR #1486 · 신호 제외 · 0e3e4fbb49. 로컬 Rust 896개·TS 2,533개(51개 skip)와 관련 정적 검사를 통과했다. GitHub CI·자동 리뷰 상태는 상단 작업 업데이트를 따른다.
2.6판에서 그려질 수 있는 행 — BigNumber 중 emphasis 슬롯 있음 158 / 없음 8,063, Pyramid 중 weight 슬롯 있음 2 / 없음 360, ProfileCard 중 avatar 슬롯 0 (글 자리 있는 행 7,284).
V3 생성 기록2.6판 13209109 · HStack_0 · tier 1 · Versus (투영 없음)
쿼리 YAML
version: "0.5"
title: 시작 방식의 비교
components:
- type: AttributeComparison.Versus
structure:
entities:
- label: 피해야 할 시작
items:
- "회사소개를 길게 하는 것"
- "통화 가능 여부부터 묻는 것"
- "정책자금·상품 설명부터 하는 것"
- label: 좋은 시작
items:
- "정책자금 신청 건 먼저 언급"
- "연락 목적을 짧게 설명"
- "바로 확인 질문으로 연결"
relations:
- type: compares
of: [피해야 할 시작, 좋은 시작]
desc: 피해야 할 시작과 좋은 시작의 접근 방식을 비교한다.
전 · 962dde1f5후 · 분리 전 통합판 4634def6e
슬롯
전
후
items
* 정책자금·상품 설명부터 하는 것
* 비교: 피해야 할 시작과 좋은 시작의 접근 방식을 비교한다.
* 정책자금·상품 설명부터 하는 것
* 피해야 할 시작과 좋은 시작의 접근 방식을 비교한다.
List 의 intersects
V3 생성 기록2.6판 13634877 · VStack_2 · tier 1 · List (투영 없음)
코드가 지어내는 채움 글 — 표 머리 행 항목·속성 N·본문 N, 채움말 값 없음·내용, 깊이 들여쓰기. 키 누출이 아니라 「빈 자리를 무엇으로 채우나」의 문제라 따로 정한다(MOR-2768).
TS 벤더 eregion/visual-summary/projection.ts — Eregion(aippt-prisonbreaksrc/lib/visual-summary/projection.ts)에서 복사해 오는 파일이라 손대지 않는다(분리 전 통합판의 sync-eregion --check 기록: 38개 일치). 아직 옛 표기(값:·emphasis: true)다. iUi capabilityCheck 에서만 돌아 화면에는 영향이 없다. Eregion 에서 고친 뒤 sync 하는 일은 MOR-2776 이다.
개별 PR 분리 결과와 다음 순서
#1458 유지: 규칙 3·7·1b 실행 코드는 48cf4ed722 그대로다. 문서만 정정한 a5bb50d452가 네 PR의 공통 base다. 빈 값 검사는 접두 제거와 독립적으로 동작한다.
#1483 닫힘: 네 정책을 묶은 통합 PR을 네 개별 PR로 대체했고 CLOSED를 확인했다.
공통: TS 벤더는 직접 바꾸지 않고 Eregion 수정 뒤 MOR-2776에서 sync 한다. LOGIC_ID 유지와 (b) 판 재굽기를 유지한다.
다음 순서: CI·자동 리뷰 완료를 확인한다. #1458 머지 후 네 PR의 base를 main으로 옮겨 각각 리뷰·머지한다. 머지·배포·판 재굽기·썸네일 재렌더는 이번 작업에서 실행하지 않았다.
범위 밖: 규칙 5 측정값은 모두 바꾸지 않는다 — MOR-2769 future plan.
썸네일은 분리 전 통합판의 역사적 비교다. 전 = 당시 origin/main962dde1f5(1b만 cb3645e60), 후 = 별칭 리뷰 보강 전 4634def6e(18개 사례). 이후 통합 head ca5d4c555의 별칭 호스트 수정은 당시 회귀 테스트로 확인했다. 재분리한 개별 PR은 아직 재렌더하지 않았다. 두 판의 comp-pass-logic::run_document_search 를 2.6판 후보 풀(excluded=false)에 돌리고, comp-frame-clientbuildFrameReplacement 로 대치해 preview 렌더러로 그렸다(글자 축소 끔). 문서 제목(pageTitle)은 넘기지 않아 경계 밖 제목 자리는 임시 문구다 — 전·후 조건은 같다. 「V3 생성 기록」은 iui.visual_summary_generations 의 YAML 그대로, 「합성 문서」는 V3 가 만들지 않는 필드를 보이려고 손으로 쓴 최소 v0.5 문서다. 재현 스크립트: ~/Documents/miricanvas-iui-pr-assets/mor-2516/scripts/.