아카이브 · 당시 기준

2026-10-18 보관. 1.2.0 → 1.2.1 · PATCH: #1488 상세 기록을 MOR-2778 댓글로 연결하고 조사 요약·사례 배치를 정리 본문과 자동 동기화 표는 보관 당시 내용입니다.

현재 기준과 원본 보기 → · 보관 목록
miricanvas-iui · MOR-2516 · 2026-10-18 갱신 · 저자 홍지혜(jhhong) · 문서 v1.2.0 · 규약 v0.5.6 · #1488 공백 보완 · 이전판

MOR-2516 투영 규칙

내용 대치 과정에서 코드가 붙이는 접두어를 정리하는 작업이다. 규칙별 변경·정본과의 차이·사례를 설명하고, Rust PR과 규약·Eregion·iUi 동기화의 담당을 구분한다.

PR #1458 merged

표 머리글·관계 desc 수정이 main에 반영됐다. 규칙 3 · 실제 머리글 보존 · 규칙 7 · 관계 설명만 이동

머지: · 커밋 826cda2e31 · GitHub 상태 확인: 2026-10-18

후속 PR 5개는 진행 중. 모두 main 기준으로 열려 있으며, 원래 period: 노출 문제는 #1487의 머지·배포·결과 확인까지 추적한다. 여섯 PR의 CI·자동 리뷰 검사는 통과했다(2026-10-18 확인).

현행 규약 v0.5.6 · 기존 v0.5 사례 보존

2026-10-18에 확인한 현행 규약은 v0.5.6이다. mordor-wiki origin/main a0f8b01961의 §0.1이 현행 값을 명시한다. 파일명 schema-v0.5.md는 MAJOR.MINOR만 따르므로 v0.5.6에서도 그대로다.

아래 18개 사례의 version: "0.5" 입력과 기존 분석·전후 이미지는 보존했다. 정본은 이 옛 표기를 0.5.0으로 읽는다. 다만 입력의 버전 표기와 분석에 인용한 규약 판본은 다르다. 기존 대조 기준(a80aa5c097)의 schema·capability 표·JSON은 최신 main과 내용이 같아, 8개 규칙의 판정도 v0.5.6에서 유지된다.

v0.5.6에서 함께 읽을 범위: 생성기는 36종을 쓰고 enum·IIS·검색은 45종을 인식한다. 생성기는 해당 카테고리가 읽는다고 선언한 내용만 필드에 쓰며, 나머지 내용은 items에 담는다(B-33). P3는 카테고리가 바뀌는 fallback 엣지의 규칙이므로 생성이나 같은 카테고리의 슬롯 정렬에 자동 적용되는 조항으로 읽지 않는다. 생성 시점 의무·P3 적용 범위

v0.5 → v0.5.6 변경 내역·버전 표기 점검
규약 버전변경 내용
0.5.0종전 0.5 표기. 아래 보존 사례가 사용하는 입력 형식이다.
0.5.1component.type 필수화. 당시 골든 470개는 이미 모두 type을 갖고 있었다.
0.5.2type의 대분류 21값을 제거하고 결합값을 사용한다.
0.5.3PageNavigation 4종을 enum에 반영해 인식 어휘를 41종에서 45종으로 맞췄다.
0.5.4NestedScope의 children 필수 조건을 빼고 선택 속성 direction: inward | outward를 추가했다.
0.5.5type 필수 여부와 어휘 수의 오래된 문구를 정정했다.
0.5.6 · 현행첫 출시 생성기에서 9종 제외(45종 중 36종). generatable·generatorRedirect와 B-33 쓰기 의무를 반영했다. 생성기 범위의 제약이며 기존 산출물을 소급해 무효로 보지 않는다.

변경 내역은 정본 §0.1 버전 이력을 요약했다. 세 자리 표기를 받고 PATCH 차이만으로 거부하지 않는 것이 규약의 검증 원칙이다.

원본 저장소에도 이전 표기가 남아 있다. 프로젝트 README는 0.5.4, 생성물 README는 0.5.1이라고 적는다. 현행 버전은 두 안내문보다 정본 §0.1의 0.5.6을 따른다.

문서와 구현의 구분: 정본 §0.1에는 버전 규칙의 “코드 반영은 아직”이라는 문구도 남아 있다. 그러나 Eregion origin/main e6ffa4bdf6의 검증 코드는 이미 0.5와 0.5.0~0.5.99를 함께 받는다. 버전 문자열을 받는 것과 개별 투영 정책의 구현·동기화 완료는 별개다.

대조 근거: 기존 a80aa5c097 → 최신 a0f8b01961에서 spec/ diff 없음. 핵심 세 파일의 Git blob도 동일하다. 이 규약 버전 대조에서는 기존 18개 사례를 재생성·재렌더하지 않았다. 별도 2.6 전수 조사에는 개별 PR의 새 비교 5쌍을 추가했다.

#1488 추가 구현 · 공백뿐인 값도 이동하지 않는다

PR #1488진행 중 · 미머지 · cb9ba9d989 · 2026-10-18

period·speaker·author·source·organization의 값이 빈 문자열 또는 공백뿐이면, 접두어를 붙이기 전에 이동을 건너뛴다. 정렬·투영 P3·용량 사전 필터가 trim().is_empty()로 같은 기준을 적용한다. trim()은 검사에만 쓰며 실제 글이 있는 값의 앞뒤 공백·사용자 콜론을 보존한다.

회귀 검증: 빈 문자열·스페이스·탭/CRLF·NBSP(U+00A0)/전각 공백(U+3000)을 다섯 필드에 적용했다. items·label 폴백에서 본문과 이동 기록, 투영의 빈 항목 방지, 용량에 맞는 후보 유지를 확인했다. 보완 전 세 회귀 테스트 실패 → 보완 후 통과, 기존 공백·콜론 보존 테스트도 통과했다.

Rust 전체 893개 통과, workspace Clippy·Rust fmt·저장소 format:check·lint(오류 0, 기존 경고 238)·diff 검사 통과. 앱 tsc는 변경하지 않은 src/page-outline/LatestOutlineForDemo.ts:38의 기존 nullable Promise 오류 1건으로 실패했다. TS 전체 테스트·2.6 전수 조사·썸네일은 이번 보완에서 재실행하지 않았다. 아래의 이전 수치·이미지는 당시 head의 기록으로 보존했다.

MOR-2778은 버그·Rust PR 추적, MOR-2770은 규약·Eregion 구현, MOR-2776은 iUi 동기화·TS/Rust 대조를 맡는다. 정본 P3는 여전히 빈 값·공백 처리를 명시하지 않는다. LOGIC_ID 유지·(b) 서빙 판 재굽기 방침을 유지하며 배포·재굽기는 실행하지 않았다.

2.6판 전수 조사 · 그대로 적용할 것과 보완할 것

문자열·평탄화 접두 제거는 유용하다. 빈 값의 공백 검사 보완은 #1488에 추가했다. 신호 필드 일괄 제외는 weight의 의미 손실부터 해결해야 한다. #1484는 현재 경로에서 출력 효과가 없었고, 측정값은 이름을 지우기 전에 표기 정책이 필요하다.

2026-10-18 · 후보 데이터 2.6 / 현행 규약 v0.5.6 / 저장 입력 v0.5 / 이 문서 v1.2.0. 서로 다른 버전이다. PR #1458이 merged된 main 826cda2e31과 각 후속 PR을 독립 비교했다.

212,617검색 대상 후보 행 전수
170,717고유 디자인
1,405Rust로 읽힌 고유 입력 컴포넌트
130fallback 엣지 전수
규칙 · PR판단확인한 효과적용 전에 확인할 점
1 · #1487보완 후 권장날짜를 보존하며 period: 제거. 저장 입력 24개에서 query Frame 변화.#1487 단독의 공백 bullet 사례는 #1488 보완과 함께 처리한다. 작성자·출처 구분이 필요한 경우도 검토.
1b · #1488공백 보완 완료 · PR 진행 중""과 공백뿐인 값의 무의미한 접두·이동을 제거.공백·탭·줄바꿈·Unicode 공백 검사 보완 완료. 남은 칸의 임시 문구·벌점은 별도 정책.
2 · #1484효과 미확인입력 1,405개·엣지 130개 모두 출력 변화 0.P5가 value·unit을 먼저 처리한다. 실제 분기 도달 사례 없이 화면 개선으로 설명하지 않는다.
4 · #1485접두 제거 권장평탄화 함수 결과 59개, query Frame 5개 변화. 0·단위·사용자 콜론 보존.label·값 한 줄 결합과 출처 표기는 별도 결정. #1485만으로 MOR-2777 전체가 끝나지는 않는다.
5 · MOR-2769정책 결정 필요실제 measure 입력 5개 확인. 현 PR은 기존 표기 유지.목표·범위·증감·임계값의 의미를 보존한다. 접두만 일괄 삭제하면 안 된다.
6 · #1486일괄 제외 보류신호·중복 수치 노출을 줄임. query Frame 4개 변화.weight에만 있던 수치 손실을 실제 저장 입력에서 재현. 강조 칸·임시 문구도 함께 확인.

“권장”은 변경 방향에 대한 판단이다. 규약 v0.5.6과의 어긋남이나 TS 동기화가 해결됐다는 뜻은 아니다. 아래 사례 제목을 누르면 전후 글·썸네일이 펼쳐진다. 이미지를 누르면 크게 볼 수 있다.

1 · 권장 사례 — 기간 이름만 제거하고 날짜는 남는다

1 · 권장 사례 — 기간 이름만 제거하고 날짜는 남는다

저장 입력 V2 · d527f8fc-70fa-4587-b837-55dc1ccf3b41 / yaml_l1 · component 1b40e3f4921bbc4f · 2.6판 12070877 / HStack_1

세 정상회담의 날짜 중 전용 period 슬롯이 없는 NATO 항목만 본문으로 이동한다. #1487은 period:만 제거했다. 원래 본문과 다른 두 날짜 슬롯은 유지됐다. Timeline 전체 5,043행을 검색한 상위 500개에서 전·후 공통 후보를 골랐다(전 순위 96). 순위 개선을 뜻하는 사례는 아니다.

전
* 중국을 '구조적 도전'으로 공식화
* period: 6월 14일
후
* 중국을 '구조적 도전'으로 공식화
* 6월 14일
period · 전 · main / #1458 merged
전 · main / #1458 merged
period · 후 · #1487 단독
후 · #1487 단독
1b · 권장하되 화면 확인 — 빈 접두는 사라져도 임시 문구는 생긴다

1b · 권장하되 화면 확인 — 빈 접두는 사라져도 임시 문구는 생긴다

합성 경계 입력 · Timeline 3개 entity의 period: "" · 2.6판 13482509 / Group_2 · #1488 단독

period: 만 있던 세 items binding이 사라졌다. 실제 본문을 잃은 것은 아니다. 다만 제품 대치가 남는 설명 칸에 “설명을 입력해주세요.”를 채웠고, 이 후보의 비용은 25.11 → 60.59로 올랐다. 빈 값 방어와 임시 문구 정책(MOR-2768)은 따로 확인해야 한다. 생성 기록에서는 이 다섯 문자열 필드의 빈 값을 발견하지 못했다.

전
items = "period: "
후
items binding 없음
blank.role = Description → 임시 문구
empty · 전 · main / #1458 merged
전 · main / #1458 merged
empty · 후 · #1488 단독 / 임시 문구 표시
후 · #1488 단독 / 임시 문구 표시
1·1b · 보완 전 재현 — 공백 bullet, #1488 후속 수정 완료

1·1b · 보완 전 재현 — 공백 bullet, #1488 후속 수정 완료

합성 경계 입력 · items: [본문], period: " " · 2.6판 13482509 / Group_2

#1488의 보완 전 head 33cfb07bf8은 is_empty()만 검사했다. #1487에서 접두를 떼면 공백 줄이 남고, 두 PR의 변경을 결합한 별도 실험에서도 같은 binding을 확인했다. 후속 커밋에서 이동 전 trim().is_empty() 검사를 정렬·P3·용량 사전 필터에 적용했다. 비어 있지 않은 원문의 앞뒤 공백은 보존한다. 아래 이미지와 결합 실험 수치는 보완 전 기록이다.

아래 후 이미지는 #1487 단독이다. 렌더러가 공백 줄을 숨길 수 있으므로 빈 bullet 여부는 이미지뿐 아니라 binding 문자열로 판정했다. 실제 생성 기록의 공백 값 발생률은 이번 자료에서 0건이다.

전
* 본문
* period:    
후
* 본문
*    ← 공백만 있는 항목
spaces · 전 · main / #1458 merged
전 · main / #1458 merged
spaces · 후 · #1487 단독 / 공백 binding 잔존
후 · #1487 단독 / 공백 binding 잔존
6 · 권장 사례 — 본문에 수치가 있으면 weight 중복을 제거한다

6 · 권장 사례 — 본문에 수치가 있으면 weight 중복을 제거한다

저장 입력 V2 · 8d16e136-492e-4b78-9dff-4baa77adc6a8 / yaml_l1 · component 0c0d0a92e5f74b9e · 2.6판 13332795 / Group_11

일반·구독·VIP 회원 비율이 items의 82%·15%·3%에도 있다. #1486은 중복 weight를 제외해도 세 수치와 “매출 기여가 큼”을 보존한다. Pyramid 전체 363행 검색에서 전·후 같은 후보를 대치했다.

전
* 82%
* weight: 82
후
82%
weight-duplicate · 전 · main / #1458 merged
전 · main / #1458 merged
weight-duplicate · 후 · #1486 단독 / 본문 수치 보존
후 · #1486 단독 / 본문 수치 보존
6 · 실제 문제 — weight에만 있던 82·15·3이 사라진다

6 · 실제 문제 — weight에만 있던 82·15·3이 사라진다

같은 생성 기록의 yaml_l2 · component f8aee90fef12b085 · 2.6판 13332795 / Group_11 · 다른 생성 기록에서도 같은 입력 확인

L2에는 비율이 weight에만 남아 있다. #1486 적용 후 82·15·3이 모두 대치 글에서 없어지고 앞의 두 설명 칸은 임시 문구가 됐다. 실제 저장 입력을 검색·대치·렌더해 확인한 의미 손실 사례다. 모두 제외하기 전에 의미 있는 수치를 value/items로 보존하거나, 기존 입력을 정상화할 규칙이 필요하다. 이 V2 기록을 현재 생성기의 발생 빈도로 일반화하지 않는다.

전
일반 회원 → weight: 82
정기 구독 회원 → weight: 15
연간 결제 VIP → 매출 기여가 큼 + weight: 3
후
일반 회원 → 설명 임시 문구
정기 구독 회원 → 설명 임시 문구
연간 결제 VIP → 매출 기여가 큼
weight-only · 전 · main / #1458 merged
전 · main / #1458 merged
weight-only · 후 · #1486 단독 / 수치 손실
후 · #1486 단독 / 수치 손실
4 · 접두 제거 권장 — 값·0·단위·사용자 콜론을 보존한다

4 · 접두 제거 권장 — 값·0·단위·사용자 콜론을 보존한다

저장 입력 e79d4713-b6de-4c9c-ae70-3b19ba15103e / yaml_l2 / components[2] · a0ebc68fc2fb6679 · #1485 단독

실제 List의 “총 대상 / 40명”, “아파트 거주 / 70.8%”에서 기계적인 value:가 사라진다. 유효 입력 1,405개 중 평탄화 함수 결과 59개, 실제 생성된 query Frame은 5개가 바뀌었다. 함수만 호출하면 바뀌는 경우와 검색 경로에서 쓰이는 경우를 구분했다.

추가 합성 경계 입력에서 0억원과 label: 사용자 본문은 그대로였다. 다만 “매출”과 “0억원”은 여전히 별도 줄이다. label·값의 한 줄 결합, 출처·작성자의 의미 표시는 MOR-2777에서 별도로 정할 일이다.

전
총 대상
value: 40명
아파트 거주
value: 70.8%
후
총 대상
40명
아파트 거주
70.8%
2 · 현재 효과 없음 — “값:” 분기는 일반 fallback에서 실행되지 않았다

2 · 현재 효과 없음 — “값:” 분기는 일반 fallback에서 실행되지 않았다

유효 입력 1,405개 query 생성 · 현행 어휘 45종의 fallback 130개 · #1484 단독

두 검사 모두 변경된 출력은 0개다. 현재 value를 읽는 출발점에서 이를 읽지 않는 도착점으로 갈 때 P5가 먼저 적용되고, P3의 unread 목록에서 value·unit을 뺀다. #1484가 바꾸는 내부 분기만 보고 사용자 화면이 개선된다고 판단하면 안 된다. 머지 가치 판단 전에 실제 도달 경로를 추가로 제시하거나 방어적 정리임을 명시하는 편이 맞다.

값 자체·0·단위를 보존하는 방향은 타당하지만 이 조사로 화면 개선 효과를 확인한 것은 아니다. 평탄화에서 보이는 value:는 #1485, 측정값의 target: 등은 MOR-2769 범위다.

5 · 정책 먼저 — 숫자 이름을 일괄 제거하면 목표·범위를 구분할 수 없다

5 · 정책 먼저 — 숫자 이름을 일괄 제거하면 목표·범위를 구분할 수 없다

저장 입력의 measure 5개 · 이 중 delta 포함 1개(3bf0c1b7e4b5fa96) · 아래는 min/max/target/threshold를 추가한 합성 경계 입력

저장된 실제 예시는 1250억 원과 delta: 15.4, 본문의 “전년 대비 15.4% 증가”를 함께 갖는다. 중복은 줄일 수 있으나 delta에 주 값의 “억 원”을 붙이면 의미가 바뀐다. 나머지 네 measure는 값·단위만 있었다. 2.6 후보 Frame에 dataset.kind=measure가 0행인 것은 측정값을 쓸 수 없다는 뜻이 아니다. 쿼리에서 value/items로 풀어 일반 슬롯에 담는다.

아래 이름을 전부 떼면 0 / 100 / 80 / 5 / 50의 역할을 잃는다. “범위 0–100% · 목표 80% · 변화 +5(단위 확인) · 주의 기준 50%”처럼 의미를 남길 표기를 MOR-2769에서 먼저 정해야 한다. 이는 제안 표기이며 현재 PR 결과가 아니다.

전
현재 재현 결과
65%
min: 0
max: 100
target: 80
delta: 5
threshold: 50 주의 (warn)
후
현 PR 적용 후에도 같은 측정값 접두 유지
키만 일괄 삭제하는 변경은 보류
state warn 삭제 여부도 별도 결정
1·4 · 해석 주의 — 작성자와 출처의 역할은 값만으로 모호해질 수 있다

1·4 · 해석 주의 — 작성자와 출처의 역할은 값만으로 모호해질 수 있다

합성 QuoteTestimonial 입력 · author: 김민지, source: 2025 고객 조사 · 저장 자료에는 author/source/speaker/organization 사례가 없었음

이름·기관·출처를 서로 다른 전용 슬롯에 담는 경우에는 접두 제거가 읽기 좋다. 그러나 본문 한 칸으로 모으면 역할을 구분하던 정보가 표시에서 사라진다. 출처 표기가 중요한 자료에는 “작성자 김민지 · 출처 2025 고객 조사”처럼 의미를 살리는 규칙을 검토해야 한다. 이는 합성 사례에 대한 해석 위험이며, 저장 입력에서 발생한 결함 수로 세지 않았다.

전
author: 김민지
source: 2025 고객 조사
후
김민지
2025 고객 조사
6 · 구조상 경계 — 일반 글을 받을 곳이 강조 슬롯 하나뿐인 행

6 · 구조상 경계 — 일반 글을 받을 곳이 강조 슬롯 하나뿐인 행

2.6판 13640649 / Group_2 · BigNumber·BarChart · emphasis 1개 + chartlike matrix · 합성 정렬 검사

신호 입력 없이 label·items만 넣어도 기존 정렬은 emphasis 칸에 일반 글을 보냈다. #1486은 이 호스트를 막아 binding 1 → 0, content_loss 0 → 2가 됐다. 전체 후보에서 이 조건으로 일반 본문 손실이 늘어난 행은 이 1행이다.

운영에서 노출된 회귀로 확정하지 않았다. 이 행을 포함한 BigNumber·BarChart 최소 문서를 실제 검색했을 때는 전·후 모두 후보 0건이었다. 합성 검사는 데이터셋·검색 게이트를 생략한다. 강조 슬롯을 비울지 실제 강조 본문을 받을지 정책·적재 분류를 확인할 근거로 남긴다. 현재 데이터에서 신호 필드가 별칭 호스트인 행은 없었다.

전
emphasis ← label + items
content_loss: 0
후
emphasis ← blank
label + items 유실 / content_loss: 2
전수 범위·수치·한계·재현 근거

세 종류의 검사를 구분했다

  1. 공급 전수: iui.comp_frames의 semantic_component_version=2.6 AND excluded=false 전량을 읽었다. 2026-10-18 02:34:29–02:35:52 KST, ID 구간 237개를 끝까지 페이지 조회했다. 212,617개 행 키가 모두 고유하고 필터 위반은 0이다. children·nested까지 슬롯·별칭을 센 결과, label/items가 있는 행 205,326, emphasis 161, weight 2, avatar 0, 신호 슬롯 합계 163행이다. 서로 다른 카테고리를 함께 가진 행은 카테고리별 합계에서 중복될 수 있다.
  2. 저장 입력 전수: 조회 기준 시각 이전 생성 기록 853건의 YAML 1,669개를 모두 읽었다. 파싱 실패 0. 완전히 같은 JSON을 합쳐 1,305문서·1,409컴포넌트를 얻었다. Rust 타입으로 읽을 수 없는 4개(items에 문자열 대신 객체)는 제외하고 1,405개를 실제 평탄화·query 생성 함수에 넣었다. 4개는 PR 적용 전부터 같은 오류이며 새 회귀로 세지 않았다. 입력은 모두 version 0.5이고 기록 날짜는 2026-09-10–10-15다.
  3. 경계 실험: 모든 후보에 유닛·children 모양이 같은 합성 쿼리를 넣어 실제 Rust align을 실행했다. 문자열 5종·빈 값·공백·신호·평탄화 글을 별도 시나리오로 검사했다. 데이터셋·nested 쿼리·관계·params와 검색·용량 게이트를 생략한 정렬 검사다. 전체 후보 × 모든 실제 입력의 검색·렌더를 수행한 것은 아니다. 별도로 현행 어휘 45종의 130개 fallback에 공통 경계 entity를 투영했고, 위 대표 사례 5쌍은 실제 검색·제품 대치·렌더를 거쳤다.
검사분모결과
#1487 · 비어 있지 않은 문자열 5종후보 212,617행205,652행에서 대치 글이 짧아짐. 내용 손실·blank 증가 없음.
#1487 · 공백 문자열 5종같은 후보 전수205,652행에서 빈 bullet 증가. 저장 자료의 발생 건수가 아닌 합성 스트레스 조건.
#1488 · 빈 문자열 5종같은 후보 전수205,652행의 binding 변화. 기존 일반 본문 보존. blank 증가 29,196행은 빈 필드 이동을 없앤 결과.
#1488 · 공백 문자열 5종같은 후보 전수 · 보완 전 head33cfb07bf8 당시 출력 변화 0, #1487 결합에서도 공백 bullet 잔존. 후속 수정·회귀 검증을 추가했다. 이 전수 실험은 재실행하지 않았다.
#1485 · 평탄화 글같은 후보 전수205,652행에서 글이 짧아짐. 내용 손실·blank·빈 bullet 증가 없음.
#1486 · 신호 없는 일반 본문같은 후보 전수1행에서 본문 binding 1 → 0. 위 구조 경계 사례; 실제 노출 확인 아님.
저장 입력의 query Frame 변화유효 컴포넌트 1,405개#1487 24 / #1488 0 / #1484 0 / #1485 5 / #1486 4. PR끼리 중복 가능한 수치.
공통 entity의 fallback 결과 변화엣지 130개#1487 15 / #1488 0 / #1484 0 / #1485 0 / #1486 9. 빈 값·평탄화 전용 경로는 다른 검사로 보충.

이 수치를 장애율로 읽지 않는다. 합성 쿼리는 매번 같은 필드를 강제로 넣는다. 저장 입력에서 period는 115개 entity에 있었지만 speaker·author·source·organization·avatar는 없었다. 빈 문자열·공백 문자열도 없었다. weight는 6개 entity(고유 컴포넌트 2개), emphasis는 3개 entity(컴포넌트 2개)였다. 따라서 “모든 후보에 개선/결함이 발생한다”거나 현재 V3 생성기의 발생률이라고 해석할 수 없다.

DB 읽기는 단일 트랜잭션 스냅샷이 아니다. 시작 시점의 최대 ID를 고정한 짧은 구간 읽기이며, 조회 도중의 행 수정까지 불변임을 보증하지 않는다. 공급 전수는 검색에서 제외되지 않은 2.6행 기준이고, dev/stg/prd가 서빙 중인 스냅샷 전체의 상태를 뜻하지 않는다. 기존 카드의 옛 2.6 수치는 당시 기록으로 유지했다.

고정 소스·재현 파일

기준 main 826cda2e31 (#1458 merged). 후속 head: #1487 bec77cb1bd · #1488 33cfb07bf8 · #1484 aa58b8a6d0 · #1485 2e75e0f91a · #1486 2f6f0a4950. 소스는 커밋별 별도 사본에서 빌드했다. 작업 중인 Rust 파일은 사용하지 않았다.

근거 코드: P5 후 value·unit을 P3에서 제외 · 빈 문자열 검사 · measure 표기. 규약·Eregion 커밋은 위 v0.5.6 대조와 같다.

로컬 재현 묶음: ~/Documents/miricanvas-iui-pr-assets/mor-2516/audit-2.6-2026-10-18/. data/fetch-receipt.json·census-quality.json·corpus-receipt.json, results/comparison.json, examples/ 입력·검색 결과, images/textmaps.json·새 이미지 10장, runner.rs·search-runner.rs·커밋별 소스와 빌드 기록을 보관했다. 후보 JSONL SHA-256: 04b489dd4a4cc67b4a45fb5cb1e5e32ded102bb545a871ae843ba16be78ff607.

새 이미지 5쌍은 2026-10-18 재렌더. 제품 buildFrameReplacement·preview 렌더러, 글자 축소 끔. 후보 풀은 Timeline 5,043행 / Pyramid 363행이며 빈 값·공백 예시는 지정 디자인 1개 풀이다. 검색 문서 제목은 저장 원문 또는 합성 사례 제목을 사용했다. 경계 밖 제목을 위한 pageTitle은 전달하지 않아 남는 제목·설명 칸에 임시 문구가 보일 수 있다. 렌더에 사용한 클라이언트·프로토콜·렌더 스크립트는 기준 main과 diff가 없음을 확인했다.

반영 순서 제안

① #1488의 Rust 공백 방어 보완 완료; MOR-2770에서 규약·Eregion을 맞추고 #1487·1488 통합 확인 → ② #1485 접두 제거와 MOR-2777 줄 표기 결정 → ③ MOR-2770·2771에서 weight의 내용 보존·강조 슬롯 정책 결정 → ④ #1484 도달 경로와 MOR-2769 측정값 표기 확인 → ⑤ MOR-2776으로 TS 동기화·Rust 대조. 전수 조사 당시에는 분석만 갱신했다. 이후 #1488에 Rust 공백 방어를 추가했으며, Jira 상태·배포는 변경하지 않았다.

규칙 한눈에 보기 · 규약 대조

적용 판단은 위 2.6 전수 결과를 함께 본다. 아래 표는 정책과 현행 규약의 일치 여부다.

표의 변화는 각 PR의 목표 범위이며, 정본 대조는 v0.5.6 · 2026-10-18 최신 main 기준이다. 아래 규칙 카드의 v0.5 입력·실측·썸네일은 분리 전 통합판 분석을 보존했다. 측정·렌더 기준

어긋남 (의도) 구현 방향에 맞춰 규약을 고칠 대상 정본 없음 규약 보충 필요 일치 현재 규약과 같음 열린 문제 해석·표기 결정 필요
#규칙변경현행 v0.5.6 대조Rust PR
1문자열 필드period: 2018년 → 2018년어긋남 (의도)
P3의 이름: 값 규정이 그대로다. 값만 옮기려면 규약 수정이 필요하다.
#1487
1b빈 문자열·공백빈 항목·빈 bullet → 이동하지 않음정본 없음
P3에 빈 문자열 제외 규정은 아직 없다.
#1488
2value 접두값: 70억원 → 70억원어긋남 (의도)
P3는 접두를 붙인다. value만의 접두 제거 예외도 없다.
#1484
3표 머리글열 4: 연락 → 연락
실제 머리글·사용자 콜론은 보존
일치
실제 머리글
정본 없음
머리글 없음·빈 머리글
P4는 실제 열이름을 보존한다. 머리글 없음·빈 머리글의 예외는 미정이다.
#1458 merged
4평탄화 접두value: 42% → 42%
label·값을 한 줄로 합칠지는 미결정
열린 문제
§8.7 예시는 label·값을 한 줄로 적는다. 일반 줄 표기는 여전히 결정이 필요하다.
#1485
5측정값target: 80 등 기존 표기 유지어긋남 (의도) 열린 문제
P5의 나머지 필드는 P3를 따른다. 같은 카테고리(tier 1)의 Frame 표기는 규정하지 않는다.
범위 밖
6신호 필드emphasis·weight·avatar를 글로 옮기지 않음어긋남 (의도) 열린 문제
§2는 weight·avatar를 내용으로 분류한다. §3.5의 weight 처리도 엣지마다 다르다.
#1486
7관계 설명교집합: 설명 → 설명
빈 desc는 건너뜀
일치
P7의 desc만 이동하는 원칙과 일치한다. 빈 desc 생략은 별도의 구현 방어다.
#1458 merged
1

문자열 내용 필드는 값만 옮긴다

period · speaker · author · source · organization
전period: 2018년→ 후2018년

어디서 생기나

  • 정렬 — 후보에 그 슬롯이 없으면 items 로 옮긴다
    align.rs:718 move_field_into_items · text.rs:57 p3_text
  • 투영 P3 — fallback 도착이 그 필드를 안 읽는다
    visual_summary/projection.rs:440 move_unread_content

정본과 대조

어긋남 (의도)
mordor-wiki capability-table.md:286 · §3.4 P3
도착이 안 읽는 내용 필드는 그 entity 의 items 맨 뒤에 이름: 값 으로 붙인다.

정본대로면 period: 2018년 이 화면에 그대로 찍힌다. 필드 이름은 매핑 메타데이터(moves)에만 남긴다.

구현 범위: p3_text를 유지해 신호 필드의 기존 표기는 바꾸지 않는다. 신호 제외는 규칙 6에서 따로 처리한다.

2.6판 영향 범위 · 분리 전 측정 — 2.6판에서 그 필드 슬롯이 없고 글 자리(label·items)가 있는 행 — 선언 카테고리 안에서: period(Timeline·ResumeCV) 1,837행, speaker 123행, author 922행, source 1,836행, organization 5,268행. 카테고리와 상관없이 세면 20만 행 안팎이다(검증기가 필드를 카테고리로 막지 않는다).

사례 4개 · YAML·전후 이미지

기간 슬롯이 없는 Timeline

V3 생성 기록 2.6판 13482509 · Group_2 · tier 1 · Timeline (투영 없음)
쿼리 YAML
version: "0.5"
title: 소프트웨어개발기록
components:
  - type: TimelineSchedule.Timeline
    structure:
      entities:
        - label: v1
          period: "2018년"
        - label: v2
          period: "2019년"
        - label: v3
          period: "2024년"
전
전 · 962dde1f5
후
후 · 분리 전 통합판 4634def6e
슬롯전후
items
period: 2018년
2018년
items
period: 2019년
2019년
items
period: 2024년
2024년

출처 슬롯이 없는 QuoteTestimonial

합성 문서 2.6판 13050011 · VStack_0 · tier 1 · QuoteTestimonial (투영 없음)

author 는 슬롯이 있어 제자리에 가고, source 만 옮겨진다.

쿼리 YAML
version: "0.5"
title: 고객 후기
components:
  - type: Utterance.QuoteTestimonial
    structure:
      entities:
        - label: 배송이 빠르고 포장이 꼼꼼해서 다음에도 이용하고 싶어요
          author: 김민지
          source: 2025 고객 만족도 조사
전
전 · 962dde1f5
후
후 · 분리 전 통합판 4634def6e
슬롯전후
label
* 배송이 빠르고 포장이 꼼꼼해서 다음에도 이용하고 싶어요
* source: 2025 고객 만족도 조사
* 배송이 빠르고 포장이 꼼꼼해서 다음에도 이용하고 싶어요
* 2025 고객 만족도 조사

QuoteTestimonial → HighlightedMessage (tier 2)

합성 문서 2.6판 13556260 · Group_8 · tier 2 · QuoteTestimonial → HighlightedMessage

author·source 슬롯이 둘 다 없는 Quote 304행만으로는 tier 1 결과가 0건이라 tier 2 로 그렸다.

쿼리 YAML
version: "0.5"
title: 고객 후기
components:
  - type: Utterance.QuoteTestimonial
    structure:
      entities:
        - label: 배송이 빠르고 포장이 꼼꼼해서 다음에도 이용하고 싶어요
          author: 김민지
          source: 2025 고객 만족도 조사
전
전 · 962dde1f5
후
후 · 분리 전 통합판 4634def6e
슬롯전후
items
author: 김민지
김민지
items
source: 2025 고객 만족도 조사
2025 고객 만족도 조사

organization 슬롯이 없는 ProfileCard

합성 문서 2.6판 13514020 · HStack_1 · tier 1 · ProfileCard (투영 없음)
쿼리 YAML
version: "0.5"
title: 프로젝트 팀 소개
components:
  - type: PortraitProfile.ProfileCard
    structure:
      entities:
        - label: 김하늘
          organization: 미리디 디자인팀
          items:
            - 브랜드 경험 설계
        - label: 이도윤
          organization: 미리디 개발팀
          items:
            - 편집기 성능 개선
전
전 · 962dde1f5
후
후 · 분리 전 통합판 4634def6e
슬롯전후
items
* 브랜드 경험 설계
* organization: 미리디 디자인팀
* 브랜드 경험 설계
* 미리디 디자인팀
items
* 편집기 성능 개선
* organization: 미리디 개발팀
* 편집기 성능 개선
* 미리디 개발팀
1b

빈 문자열·공백뿐인 값은 옮기지 않는다 (보강)

period · speaker · author · source · organization 의 빈 값·공백
전빈 항목 '' · 빈 bullet * → 후옮기지 않는다

어디서 생기나

  • 정렬 — 슬롯 없는 필드를 items 로 옮길 때
    align.rs:718 move_field_into_items
  • 투영 P3
    visual_summary/projection.rs:440 move_unread_content
  • 용량 사전 필터
    capacity_prefilter.rs query_unit

정본과 대조

정본 없음

통합판에서 키를 떼고 값만 옮기자 빈 항목이 드러났다. 분리 후에는 접두 제거(규칙 1)와 독립적으로 빈 문자열 자체를 이동 대상에서 제외한다. 접두를 붙이기 전에 공백을 제외하고 빈 값인지 검사하므로 접두 제거에 의존하지 않는다. 비어 있지 않은 값의 표기는 이 규칙이 바꾸지 않는다. 정본은 빈 값을 다루지 않는다.

MOR-2778. 이 사례만 전 = 분리 전 통합판의 보강 전 head cb3645e60, 후 = 접두 제거와 빈 값 보강이 함께 든 4634def6e다. 이번 빈 문자열 PR의 단독 렌더는 아니다. 빈 bullet 이 붙으면 글상자가 목록 모양이 되어 왼쪽 위로 밀린다.

PR #1488 고정 근거: 정본 P3에는 빈 값 처리가 없다(MOR-2770). 정렬, 투영 P3, 용량 사전 필터가 접두어를 붙이기 전에 빈 값을 거른다. 다섯 빈 문자열 필드 회귀 테스트는 비어 있지 않은 필드의 접두 표기에 의존하지 않아 문자열 P3 PR과도 독립이다.

2.6판 영향 범위 · 분리 전 측정 — 다섯 필드 중 하나라도 슬롯이 없고 items 가 있는 2.6판 행 174,648. 기간 슬롯 없는 Timeline 중 items 있는 행 1,461.

사례 1개 · YAML·전후 이미지

기간 슬롯이 없는 Timeline 에 period ""

합성 문서 2.6판 13579287 · Graph_1 · tier 1 · Timeline (투영 없음)

바뀐 칸 근처만 잘라 그렸다.

쿼리 YAML
version: "0.5"
title: 서비스 출시 일정
components:
  - type: TimelineSchedule.Timeline
    structure:
      entities:
        - label: 베타 오픈
          period: "2025년 3월"
          items:
            - 초대 사용자 대상
        - label: 정식 출시
          period: ""
          items:
            - 전체 공개
        - label: 해외 진출
          period: "2026년"
          items:
            - 일본·대만
전
전 · cb3645e60
후
후 · 분리 전 통합판 4634def6e
슬롯전후
items
* 전체 공개
전체 공개
2

value 이동에 「값:」을 붙이지 않는다

value (+ unit)
전값: 70억원→ 후70억원

어디서 생기나

  • 투영 P3 — 도착이 value 를 안 읽는다
    visual_summary/projection.rs:440 move_unread_content

정본과 대조

어긋남 (의도)
mordor-wiki capability-table.md:286 · §3.4 P3
… items 맨 뒤에 이름: 값 으로 붙인다.

검색 경로에서는 닿지 않는다. ① value 를 reads.content 로 선언한 카테고리는 BigNumber(measure?)·Gauge(measure) 둘뿐이다(vocab.json 45종·kernel 41종). ② 선택 dataset 도 dataset 을 가진 것으로 보니(capability_data.rs:136 has_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)로만 확인했다.

2.6판 영향 범위 · 분리 전 측정 — 0 — 검색 경로에서 닿지 않는다.

이 규칙은 썸네일 사례가 없다.

3

표를 펼칠 때 실제 머리글만 남기고 「열 N」을 만들지 않는다

matrix 열 · entities+columns
전열 4: 연락→ 후연락 (실제 머리글 원인: 생활관리 는 그대로)

어디서 생기나

  • 평탄화 — 표 행을 글 줄로 편다
    visual_summary/summary_content.rs:389 cell_line
  • 투영 P4 — 도착이 matrix 를 못 읽는다
    visual_summary/projection.rs:398 unfold_matrix_rows

정본과 대조

일치
mordor-wiki capability-table.md:287 · §3.4 P4
… 첫 열이 label, 나머지 열이 열이름: 값 으로 items 에 들어간다.

머리글이 있는 열은 정본대로 열이름: 값 을 남긴다.

정본 없음

빈 머리글이나 대응하는 열 정의가 없는 여분 값의 표기는 정본이 다루지 않는다. 현재 구현은 지어낸 열 N 대신 값만 남긴다. 기존 P4와 충돌하지 않지만, 이 예외 처리를 정본이 이미 정한 것은 아니다.

구현 근거: 정본 P4의 실제 열이름: 값은 보존한다. 정본이 정하지 않은 빈 머리글·여분 열에서만 임의의 열 N을 만들지 않는 구현으로 보강했다.

2.6판 영향 범위 · 분리 전 측정 — matrix 를 못 읽는 fallback·tier 3 도착(Versus·List·Steps·HighlightedMessage·LongForm·Timeline)의 items 행 118,431.

보충할 규칙: 실제 머리글이 있으면 열이름: 값을 유지하고, 머리글이 없거나 공백뿐이면 열 N이나 콜론을 생성하지 않고 값(단위가 있으면 단위 포함)만 보존한다. entities+columns 평탄화에도 같은 규칙을 명시해야 한다. 이 예외를 규약에 보충하는 작업은 아직 남아 있다.

사례 1개 · YAML·전후 이미지

열 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 이 이 변화를 잠근다.

2.6판 영향 범위 · 분리 전 측정 — 종단 세 카테고리의 items 행 107,398. peel 자식은 어느 카테고리든 되므로 상한은 items 행 전체 174,648.

사례 1개 · YAML·전후 이미지

중첩 컴포넌트를 벗기는 peel (stage N3)

합성 문서 2.6판 13631655 · VStack_3 · tier 1 · List (투영 없음)

안쪽 컴포넌트의 value·period 가 부모 items 줄로 펼쳐진다.

쿼리 YAML
version: "0.5"
title: 하반기 영업 성과
components:
  - type: TimelineSchedule.Timeline
    structure:
      entities:
        - label: 하반기 신규 계약
          period: "2025 하반기"
          value: 42
          unit: 건
          components:
            - type: Enumeration.List
              structure:
                entities:
                  - label: 대기업
                    items:
                      - 제조·유통 3곳
                  - label: 중견기업
                    items:
                      - IT 서비스 12곳
전
전 · 962dde1f5
후
후 · 분리 전 통합판 4634def6e
슬롯전후
items
* 제조·유통 3곳
* 하반기 신규 계약
* value: 42건
* period: 2025 하반기
* 제조·유통 3곳
* 하반기 신규 계약
* 42건
* 2025 하반기
5

측정값 — MOR-2516 범위 밖

measure 의 min · max · target · delta · thresholds
전target: 80 · threshold: 50 주의 (warn)→ 후그대로 (main 과 같다)

어디서 생기나

  • 쿼리 Frame 구성 — tier 1 에서도 부속값을 items 로 편다 (Frame 에 min·target 칸이 없다)
    query_frame.rs:429 build_frame_for_structure → summary_content.rs:241 materialize_measure
  • 투영 P5 — measure 를 못 읽는 도착 (→ HighlightedMessage·List)
    visual_summary/projection.rs:133 · :518 threshold_line
  • 투영 — measure 가 남는 엣지 (Gauge → BigNumber)
    visual_summary/projection.rs:244 move_unread_measure_fields · summary_projection.rs:96 drop_thresholds

정본과 대조

어긋남 (의도)
mordor-wiki capability-table.md:288 · §3.4 P5
measure 를 못 읽는 곳으로 가면 value 와 unit 을 entity 로 옮긴다. 나머지 필드는 P3 을 따른다

P3 을 따르니 정본대로면 target: 80 이다. fallback 엣지(P5·Gauge→BigNumber)는 이 조항과 어긋난다.

정본 없음

tier 1(Gauge → Gauge)에서 부속값이 items 글이 되는 것은 정본이 다루지 않는다. §3.4 는 「fallback 은 카테고리를 바꾸는 일이므로」 엣지만 말한다. Frame 에 measure 칸이 없어 생긴 구현 사정이다.

측정값은 접두만 없애면 무엇이 목표·상한·임계값인지 알 수 없어 이번 변경에서 제외했다. 통합판 4634def6e의 결과 목록·순위·cost는 당시 main과 같았다. 당시 V3 생성 프롬프트에는 KPI 타입이 없었다.

2.6판 영향 범위 · 분리 전 측정 — items 행: Gauge 239, BigNumber 5,314, HighlightedMessage 10,266, List 69,014 (합집합 84,613).

사례 5개 · YAML·전후 이미지

Gauge → Gauge, fallback 없음

합성 문서 2.6판 12821819 · VStack_2 · tier 1 · Gauge (투영 없음)
쿼리 YAML
version: "0.5"
title: 상반기 목표 달성률
components:
  - type: KPIKeyMetric.Gauge
    structure:
      entities:
        - label: 상반기 목표 달성률
      dataset:
        shape: measure
        value: 87
        unit: "%"
        min: 0
        max: 100
        target: 80
지금
기존 렌더 · 당시 main과 통합판 동일 (모든 PR 범위 밖)

Gauge → BigNumber (tier 2)

합성 문서 2.6판 13602576 · Group_7 · tier 2 · Gauge → BigNumber
쿼리 YAML
version: "0.5"
title: 상반기 목표 달성률
components:
  - type: KPIKeyMetric.Gauge
    structure:
      entities:
        - label: 상반기 목표 달성률
      dataset:
        shape: measure
        value: 87
        unit: "%"
        min: 0
        max: 100
        target: 80
지금
기존 렌더 · 당시 main과 통합판 동일 (모든 PR 범위 밖)

Gauge → BigNumber 의 임계값

합성 문서 2.6판 13606965 · VStack_2 · tier 2 · Gauge → BigNumber
쿼리 YAML
version: "0.5"
title: 서버 사용률
components:
  - type: KPIKeyMetric.Gauge
    structure:
      entities:
        - label: CPU 사용률
      dataset:
        shape: measure
        value: 72
        unit: "%"
        min: 0
        max: 100
        thresholds:
          - at: 50
            label: 주의
            state: warn
          - at: 90
            label: 위험
            state: danger
지금
기존 렌더 · 당시 main과 통합판 동일 (모든 PR 범위 밖)

Gauge → HighlightedMessage (P5)

합성 문서 2.6판 13579650 · Group_3 · tier 2 · Gauge → HighlightedMessage
쿼리 YAML
version: "0.5"
title: 상반기 목표 달성률
components:
  - type: KPIKeyMetric.Gauge
    structure:
      entities:
        - label: 상반기 목표 달성률
      dataset:
        shape: measure
        value: 87
        unit: "%"
        min: 0
        max: 100
        target: 80
지금
기존 렌더 · 당시 main과 통합판 동일 (모든 PR 범위 밖)

Gauge → List (P5)

합성 문서 2.6판 13636373 · VStack_2 · tier 2 · Gauge → HighlightedMessage
쿼리 YAML
version: "0.5"
title: 상반기 목표 달성률
components:
  - type: KPIKeyMetric.Gauge
    structure:
      entities:
        - label: 상반기 목표 달성률
      dataset:
        shape: measure
        value: 87
        unit: "%"
        min: 0
        max: 100
        target: 80
지금
기존 렌더 · 당시 main과 통합판 동일 (모든 PR 범위 밖)
6

신호 필드는 글로 옮기지 않는다

emphasis · weight · avatar
전true · weight: 0.2 · avatar: a.png→ 후실리지 않는다 (강조 슬롯이 있으면 빈 필드)

어디서 생기나

  • 투영 P3 — 도착이 안 읽으면 버린다
    visual_summary/projection.rs:440 move_unread_content
  • 평탄화 — 줄로 내지 않는다
    visual_summary/summary_content.rs:18 entity_lines
  • 정렬 — 같은 슬롯·별칭의 쿼리와 호스트·items 이동·폴백 어디에도 싣지 않는다 (tier 1 포함)
    frame.rs:72 Field::is_signal · align.rs:647 별칭 호스트 · capacity_prefilter.rs query_unit

정본과 대조

어긋남 (의도)
mordor-wiki capability-table.md:65 · §2 머리 표
선택 내용 — 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·파일 이름이 찍혔다.

별칭 호스트도 신호 필드를 제외한다

적재는 FIELD_ORDER 순으로 같은 Text 노드의 첫 필드를 호스트로 잡는다. emphasis·weight가 speaker·author·source·organization보다 먼저 잡으면 본문 필드는 그 신호 슬롯의 별칭이 된다. pass 1.5는 쿼리 신호 필드를 걸렀지만 호스트에서는 Marker만 제외해, 일반 본문이 강조·가중치 칸에 들어갈 수 있었다.

호스트에도 !host.is_signal()을 적용했다. 신호 칸은 빈 필드로 남고, 본문은 다음 일반 별칭 호스트 또는 기존 items·폴백 경로를 따른다. 저장 데이터의 손상이 아니라 화면의 대치 위치가 잘못되는 문제다. 검색 후 용량 게이트는 정렬 결과를 다시 보므로 이번 누락으로 용량 초과 후보가 검사를 우회하는 것은 아니다.

2.6판 영향 범위 · 분리 전 측정 — BigNumber 중 emphasis 슬롯 있음 158 / 없음 8,063, Pyramid 중 weight 슬롯 있음 2 / 없음 360, ProfileCard 중 avatar 슬롯 0 (글 자리 있는 행 7,284).

사례 4개 · YAML·전후 이미지

ProfileCard 의 avatar

합성 문서 2.6판 13470888 · VStack_4 · tier 1 · ProfileCard (투영 없음)

organization 은 슬롯이 있어 제자리에 간다.

쿼리 YAML
version: "0.5"
title: 프로젝트 팀 소개
components:
  - type: PortraitProfile.ProfileCard
    structure:
      entities:
        - label: 김하늘
          organization: 미리디 디자인팀
          avatar: avatar-kim.png
          items:
            - 브랜드 경험 설계
        - label: 이도윤
          organization: 미리디 개발팀
          avatar: avatar-lee.png
          items:
            - 편집기 성능 개선
전
전 · 962dde1f5
후
후 · 분리 전 통합판 4634def6e
슬롯전후
items
* 브랜드 경험 설계
* avatar: avatar-kim.png
브랜드 경험 설계
items
* 편집기 성능 개선
* avatar: avatar-lee.png
편집기 성능 개선

강조 슬롯이 있는 BigNumber

합성 문서 2.6판 12793308 · VStack_2 · tier 1 · BigNumber (투영 없음)

강조 칸에 true 가 찍히던 것이 빈 필드(임시 문구 「강조」)가 된다.

쿼리 YAML
version: "0.5"
title: 3분기 핵심 지표
components:
  - type: KPIKeyMetric.BigNumber
    structure:
      entities:
        - label: 신규 가입자
          value: 1200
          unit: 명
        - label: 재방문율
          value: 64
          unit: "%"
          emphasis: true
        - label: 평균 체류 시간
          value: 12
          unit: 분
전
전 · 962dde1f5
후
후 · 분리 전 통합판 4634def6e
슬롯전후
emphasis
true
(빈 필드 · 임시 문구)

weight 슬롯이 없는 Pyramid

합성 문서 2.6판 13616844 · Group_5 · tier 1 · Pyramid (투영 없음)
쿼리 YAML
version: "0.5"
title: 학습 단계
components:
  - type: Hierarchy.Pyramid
    structure:
      entities:
        - label: 응용
          weight: 0.2
        - label: 이해
          weight: 0.5
        - label: 기억
          weight: 0.8
전
전 · 962dde1f5
후
후 · 분리 전 통합판 4634def6e
슬롯전후
label
* 응용
* weight: 0.2
응용
label
* 이해
* weight: 0.5
이해
label
* 기억
* weight: 0.8
기억

강조 슬롯이 없는 BigNumber

합성 문서 2.6판 13549097 · VStack_4 · tier 1 · BigNumber (투영 없음)

emphasis: true 가 items 에 붙던 것이 사라진다.

쿼리 YAML
version: "0.5"
title: 3분기 핵심 지표
components:
  - type: KPIKeyMetric.BigNumber
    structure:
      entities:
        - label: 신규 가입자
          value: 1200
          unit: 명
          emphasis: true
        - label: 재방문율
          value: 64
          unit: "%"
전
전 · 962dde1f5
후
후 · 분리 전 통합판 4634def6e
슬롯전후
label
* 신규 가입자
* emphasis: true
신규 가입자
7

관계는 종류 없이 desc 만 옮긴다

relations (intersects · compares)
전교집합: 겹치는 부분은…→ 후겹치는 부분은…

어디서 생기나

  • 정렬 — 관계 desc 를 그 유닛 items 뒤에 붙인다
    align.rs:1187 align_relations

정본과 대조

일치
mordor-wiki capability-table.md:290 · §3.4 P7
도착이 관계를 못 그리면 relation.desc 를 of 첫 항목의 items 맨 뒤로 보낸다

이번엔 코드가 정본에 맞춘 쪽이다. TS relationLines 는 2026-09-13 부터 이미 desc 만 옮겼고, Rust 정렬만 종류를 붙이고 있었다.

V3 가 실제로 만드는 relations 에서 나는 누출이라 운영 결과가 바뀐다.

빈 관계 설명: 정렬도 Rust relation_lines·TS relationLines처럼 빈 desc를 건너뛴다. 회귀 테스트에서 본문·대치 종류·내용 손실이 관계 없음과 동일함을 확인했다. 이 보강은 빈 문자열 필드 PR #1488과 구분한다.

2.6판 영향 범위 · 분리 전 측정 — Versus·Venn 의 글 자리 행 3,128. 관계 desc 는 어느 후보의 items 에도 붙으니 상한은 글 자리 행 전체 205,288.

사례 2개 · YAML·전후 이미지

Versus 의 compares

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 (투영 없음)
쿼리 YAML
version: "0.5"
title: 끈기와 적응력
components:
  - type: Enumeration.List
    structure:
      entities:
        - label: 끈기
        - label: 적응력
      relations:
        - type: intersects
          of: [끈기, 적응력]
          desc: 겹치는 부분은 문제해결력이다.
전
전 · 962dde1f5
후
후 · 분리 전 통합판 4634def6e
슬롯전후
label
* 끈기
* 교집합: 겹치는 부분은 문제해결력이다.
* 끈기
* 겹치는 부분은 문제해결력이다.

티켓 담당과 작업 순서

규약·Eregion 구현 → iUi 동기화 → TS·Rust 통합 검증. MOR-2776은 앞선 구현을 받아 동기화·검증하는 단계다. 아래는 2026-10-18 Jira에 반영한 담당 범위이며, 구현 완료나 merged 상태를 뜻하지 않는다.

최신 원본 확인: Eregion의 P3 구현에는 이름: 값·값: 접두와 신호 필드의 텍스트 이동이 남아 있다. v0.5.6 확인만으로 이 후속 구현이나 MOR-2776 동기화가 완료된 것은 아니다.

티켓담당 작업경계·의존
MOR-27701·1b·2의 P3 규약·Eregion 구현·단위 테스트. §2 신호 정의와 강조 슬롯 정책 검토.빈 값 방어도 여기서 구현하고, 머지 결과를 2776에 넘긴다.
MOR-27716의 §3.5 엣지 표·Eregion 신호 제외 구현·단위 테스트.2770의 신호 정의를 따른다.
MOR-27781b의 빈 문자열 버그·재현·Rust #1488 추적.규약·Eregion 구현은 2770, iUi 동기화는 2776.
MOR-2776iUi 동기화·TS/Rust 통합 검증·결과 기록.규칙 구현은 선행 티켓에서 받는다. 새 정책을 정하지 않는다.
MOR-27793의 P4·entities+columns 머리글 없음 예외 규약 보충.실제 머리글 보존과 예외 처리를 구분한다.
MOR-27774의 평탄화 줄 표기 결정·Rust/TS 본문 평탄화 코드·골든 수정.#1485의 접두 제거만으로 완료되지 않는다.
MOR-27695의 측정값 표기 결정·P5 규약·코드·골든 수정.측정값 접두·state의 처리 정책을 먼저 정한다.
MOR-2776 동기화·검증 절차
  1. 입력 확정. 2770·2771에서 규약·Eregion 원본·단위 테스트를 마친 머지 커밋을 받는다.
  2. 동기화. 벤더링 정책에 따라 sync-eregion으로 사본과 VENDOR.json을 갱신한다. 벤더 파일을 직접 고치지 않는다.
  3. 통합 검증. sync-eregion --check와 벤더 밖 TS/Rust 대조 테스트를 실행한다. 대응 경로의 structure·params·rules·losses를 비교하고 동기화 커밋·Rust 기준 커밋·결과를 기록한다.

대조 항목: 문자열 값만 이동, 빈 항목·빈 bullet 방지, value의 값·0·단위 보존, emphasis·weight·avatar 제외. 규칙 구현 결함은 2770·2771에서, 동기화·검증 문제는 2776에서 고친다.

통합 후 배포

LOGIC_ID 유지·(b) 검증 블록이 있는 서빙 판 재굽기 방침이다. stg/prd 배포 전에 판 재굽기와 태그·환경별 짝 증명서 갱신이 필요하다. 이 문서에서는 배포 완료를 확인하지 않았다.

채움 글(항목·속성 N·값 없음 등)은 별도 MOR-2768 범위다.

검증 기록 · PR별 head와 로컬 결과

기존 head에서 실행한 로컬 결과다. 머지 후 main에서 재실행한 결과나 개별 PR의 최종 렌더 결과를 뜻하지 않는다.

PR검증 headRust 통과TS 통과
#1458 merged6b99594353888개2,532개 · 51 skip
#148833cfb07bf8891개2,532개 · 51 skip
#1487bec77cb1bd891개2,532개 · 51 skip
#1484aa58b8a6d0888개2,532개 · 51 skip
#14852e75e0f91a889개2,533개 · 51 skip
#14862f6f0a4950894개2,533개 · 51 skip

공통 검사: Rust 전체 테스트·fmt·workspace Clippy(--all-targets --all-features -- -D warnings), TS 132파일, 저장소 format:check·lint(오류 0·기존 경고 238)·앱 tsc·diff 검사. 분리·충돌 해소 후 별도 코드 리뷰에서도 추가 결함이 없었다.

이전 기록·출처·렌더 기준

PR 분리: 통합 PR #1483 닫힘 · 미머지은 닫고 후속 정책을 독립 PR로 나눴다. 빈 문자열 필드는 마지막으로 #1488에 분리했다. 커밋별 수정·검증 내역은 정리 전 기록에 보관했다.

담당 재정리: 2778과 겹치던 P3 규약·Eregion 구현은 2770에 모으고, 2776은 동기화·통합 검증만 맡도록 했다. 미결정인 측정값 정책은 2769에 남겼다. 당시 대조는 분리 전 기록에서 확인할 수 있다.

Jira 근거: PR 범위·검증·배포 조건 정정 · period 문제의 담당 PR 보충.

정본: mordor-wiki 규약·schema-v0.5.md. Eregion: 원본 TS 구현. 두 원천의 2026-10-18 origin/main을 다시 확인했다. 카드의 코드 위치·실측은 각 사례 당시 기준이다. 별도 origin/main 대조 기록.

규칙 카드의 기존 18개 사례 썸네일은 분리 전 통합판의 역사적 비교다. 전 = 당시 origin/main 962dde1f5(1b만 cb3645e60), 후 = 별칭 리뷰 보강 전 4634def6e(18개 사례). 이후 통합 head ca5d4c555의 별칭 호스트 수정은 당시 회귀 테스트로 확인했다. 기존 18개 사례는 그대로 보존했다. 개별 PR의 새 렌더 5쌍은 2.6 전수 조사에서 별도 비교한다. 두 판의 comp-pass-logic::run_document_search 를 2.6판 후보 풀(excluded=false)에 돌리고, comp-frame-client buildFrameReplacement 로 대치해 preview 렌더러로 그렸다(글자 축소 끔). 문서 제목(pageTitle)은 넘기지 않아 경계 밖 제목 자리는 임시 문구다 — 전·후 조건은 같다. 「V3 생성 기록」은 iui.visual_summary_generations 의 YAML 그대로, 「합성 문서」는 V3 가 만들지 않는 필드를 보이려고 손으로 쓴 최소 v0.5 문서다. 재현 스크립트: ~/Documents/miricanvas-iui-pr-assets/mor-2516/scripts/.

예시 이미지 확대

2배 확대 후 스크롤로 살펴볼 수 있습니다. 바깥 영역이나 Esc 키로 닫습니다.