CODE WALKTHROUGH · 2026.09.19

표·차트는
어디에서 대치되는가

aippt-prisonbreak와 comp-frame의 입력 변환, 대상 노드 선택, 실제 데이터 반영을 이어서 본다. 같은 matrix여도 경로에 따라 텍스트 목록이 되거나 표·차트 전체 데이터가 된다.

규약 bbabab9faippt 9f2ee87fiui 8dd09206 · PR #1117렌더 참조 web-2 9f70d675

코드 스냅샷을 설명하는 문서다. iui는 이번 수정 커밋을 기준으로 한다. web-2는 표·차트 분기가 있는 origin/feature/UNICORN-73380_의 로컬 Git 스냅샷을 직접 읽었다. 운영·preview 배포 버전과의 일치는 확인하지 않았다.

01

“대치”라는 이름 아래 네 경로가 있다

comp-frame은 TableItem 또는 ChartItem 하나에 표 문자열을 전달한다. aippt의 Visual Summary PoC와 CSV 도구는 서로 다른 구현이다.

경로입력 → 대치 단위실제로 바꾸는 것코드
aippt RLSC PoC
component-tag / iis-node
투영된 entities → Title·Description 등 Text 슬롯RLSC Text.content → sheet의 textTree. 차트 dataset 주입은 구현 범위 밖.entityContents·bindComponentToRlsc
IIS 경계 대치
미채움 제거·dataset 미지원 고지
aippt comp-sign 비교matrix → 중첩 Markdown 리스트 → 텍스트 노드 map바뀐 텍스트를 fills로, 보정 박스를 bboxes로 적용. 이 브리지는 4.3.5를 사용하며 grid Markdown을 만들지 않는다.structureToMarkdown·tableAsList
comp-sign 결과 → fills·bboxes
comp-sign bridge 버전 4.3.5
aippt CSV 도구
/replace-content
사용자가 지정한 ID + CSV표: 기존 셀 텍스트를 순차 대치.
차트: chartProps.dataSource 전체 교체. XML 경로도 별도 존재.
CSV 대치 도구의 호출부
JSON 표 CSV 대치
JSON 차트 CSV 대치
iui comp-frame
로컬 TS / 원격 Rust 검색
matrix → pipe-table Markdown → field:'grid' binding 하나클라이언트는 nodeTextMap[gridId]를 만들고, 렌더러가 노드 타입에 따라 표 셀 또는 차트 데이터를 갱신.matrix → pipe-table Markdown
grid 단일 binding
Text·Chart·Table 분기

책임의 경계: 검색·정렬 코드는 “어느 노드에 어떤 내용”을 결정한다. 표의 행·열 생성과 셀 크기 계산, 차트 데이터 적용은 렌더러가 맡는다. nodeTextMap이라는 이름이 모든 대상이 일반 TextItem이라는 뜻은 아니다.

02

의미 카테고리와 실제 요소 타입은 다르다

ListingTable은 내용 표현의 카테고리다. 실제 캔버스가 native TableItem인지, 텍스트와 도형으로 만든 표 모양인지까지 보장하지 않는다.

대응 모델

RLSC / Frame

RLSC는 의미 노드 트리다. Frame은 질의 텍스트와 디자인 노드 참조를 같은 슬롯 모델로 맞춘다. dataset.kind:'matrix'는 표와 차트를 함께 나타낸다.

규약이 여는 두 가지 표 입력

A. 평평한 matrix

dataset:
  shape: matrix
  columns:
    - { label: 지역, role: category }
    - { label: 매출, role: value }
  rows:
    - [서울, 12]
    - [부산, 9]

첫 열은 범주, 나머지 열은 계열이다. 표와 차트가 이 데이터 모양을 공유한다. 숫자 열의 타입 조건은 establish 단계에서 검사한다.

B. columns + entities

columns:
  - { label: 지역 }
  - { label: 매출 }
entities:
  - { label: 서울, values: [12] }
  - { label: 부산, values: [9] }

ListingTable·ComparisonTable의 대안 경로. 부모·자식 행은 children으로 담는다. 규약 예시처럼 첫 열 헤더까지 포함한 입력이며, 아래에서 구현 차이를 비교한다.

P4 · matrix → entities

표를 못 읽는 카테고리로 이동

각 행의 첫 셀 → label
나머지 셀 → 열 이름: 값 items

P6 · entities → matrix

격자가 필요한 카테고리로 이동

label → 첫 열
items → 나머지 열
구체적 행·열 방향은 양쪽 구현이 다르다.

↓ 카테고리 확정·fallback에 따른 입력 투영

투영은 데이터의 모양을 바꾼다

캔버스의 셀 좌표를 정하는 단계와 구분해야 한다. 표 카테고리에 도착했어도 이후 대치 경로가 dataset을 소비해야 데이터가 반영된다.

measure는 값 하나와 target·delta 등의 부속이다. comp-frame은 이를 value·items 텍스트로 옮기며 matrix로 만들지 않는다. measure → 값·텍스트

03

같은 데이터, 서로 다른 전달 형태

앞의 “지역 / 매출, 서울 12, 부산 9”를 현재 코드의 순수 함수에 직접 입력한 결과다. 아래 표와 트리는 데이터 설명용이며 실제 미캔 렌더 화면은 아니다.

행 전체를 grid 노드 하나에 전달

| 지역 | 매출 |
| --- | --- |
| 서울 | 12 |
| 부산 | 9 |
지역매출
서울12
부산9

cols:2, rows:2. query의 rows는 데이터 행 수이고, 전달 문자열은 헤더를 포함해 3행이다. map의 대상은 셀 6개가 아니라 표 또는 차트 ID 하나다.

RLSC PoC 자체에 raw matrix만 넣으면? entityContents는 entities만 읽는다. Chart 노드에 matrix를 넣은 최소 재현에서는 entitiesTotal:0, slotsFilled:0이며 기존 chart data가 유지됐다. 코드도 “차트 데이터 주입은 PoC 범위 밖”이라는 note를 반환한다. P4로 entities로 전환된 경우에는 그 텍스트를 채울 수 있다. entityContents·bindComponentToRlsc 미채움 제거·dataset 미지원 고지

04

aippt-prisonbreak: 호출 경로를 나눠 읽는다

A. Visual Summary RLSC PoC · 전체 또는 IIS 경계

검증·카테고리·projection→후보 RLSC 선택→Text.content 대치→diffSlots → fills

component-tag는 컴포넌트 전체, iis-node는 매칭된 경계 서브트리를 bindComponentToRlsc에 넘긴다. IIS도 표·차트 전용 바인더를 추가하는 것이 아니라 같은 텍스트 바인더의 범위를 좁힌다.

label → Title, value → Subtitle/Description, items → Description으로 배정한다. 남은 단위 안 텍스트는 비운다. entity.values[]와 dataset.rows를 셀 좌표로 대응시키는 루프는 이 함수에 없다.

B. 같은 화면의 comp-sign 비교 브리지

structureToMarkdown→comp-sign 4.3.5 검색·대치→nodeTextMap → fills→nodeBboxMap → bboxes

matrix와 entities 표를 중첩 리스트로 직렬화한다. 이 코드의 주석과 package alias가 4.3.5 제약을 명시한다. 다른 저장소의 최신 comp-sign에 grid 기능이 있어도 이 브리지가 자동으로 그 경로를 쓰는 것은 아니다.

01 · API

POST /visual-summary/sheet

nodeId로 textTree 노드를 찾는다. ID로 못 찾았을 때 before 원문이 유일하게 일치하면 보조 매칭한다.

02 · MUTATION

텍스트 먼저, box 나중

전체 텍스트를 첫 string leaf에 넣고 다른 string leaf는 비운다. 그 다음 bboxes를 적용한다.

03 · VIEW

PageRootView

이미 수정된 sheetJson을 인라인 미캔 엔진에 전달한다. 이 렌더 컴포넌트에 dataset 변환을 맡기지 않는다.

수요 평가의 demand/logic-replace.ts도 comp-sign 2.5.0 결과를 같은 fills·box 유틸로 반영한다. 이 문서의 “aippt comp-sign 비교”는 위 Visual Summary 4.3.5 브리지를 가리키며, 저장소의 모든 comp-sign 소비처가 같은 버전이라는 뜻은 아니다. 수요 평가용 comp-sign 대치

C. CSV 직접 대치 도구 · 위 파이프라인과 별도

표: 고정된 기존 셀을 순차 채움

CSV를 최대 열 수에 맞춰 빈 문자열로 패딩하고 행 우선으로 편다. JSON은 TableItem.childNodeIds에 속한 TextItem을 json.nodes 배열 순서로 골라 새 텍스트를 넣는다.

입력이 더 많으면 남는 데이터는 쓰지 않고, 기존 셀이 더 많으면 나머지를 비운다. 행·열 크기나 셀 개수를 재구성하지 않는다. XML도 기존 GRID.CELL[i]를 같은 방식으로 채운다.

05

comp-frame: grid 한 개를 찾고, 한 번 보낸다

입력 쪽 · QUERY

Visual Summary → query Frame

matrix 또는 columns+entities → pipe-table Markdown.
dataset.slot.text에 표 전체를 보관한다.
행마다 일반 텍스트 unit을 요구하지 않는 경로가 있다.

공급 쪽 · INDEX

RLSC + sheetJson → component Frame

해당 경계 안의 실제 Table·Chart를 검출한다.
선택한 격자 ID를 dataset.slot.node에 저장.
셀 TextItem은 격자와 중복된 일반 슬롯이 되지 않도록 제외한다.

↓ 텍스트와 노드 참조가 같은 Frame 모델에서 만남
01 · SEARCH

후보 조회 → align → rank

카테고리·shape·unit 수·dataset kind 등으로 후보를 거른다. matrix끼리 만나면 unit:null, field:'grid', index:0인 direct binding 하나를 만든다. grid 자체는 일반 텍스트 용량 모델로 평가하지 않는다.

↓ binding.text + binding.sheet_id
02 · PAYLOAD

셀 소유권 보호 → nodeTextMap

grid 대상 표의 자손 셀에 중복 텍스트를 보내지 않는다. native 표 셀의 blank·잔여·별도 bbox 지시를 제거한다. 남은 binding은 map으로, 일반 빈 슬롯·경계 안 잔여는 정책에 따른 임시 문구로 변환한다.

↓ COMPONENT_THUMBNAIL
03 · RENDER

sheetJson + maps → web-2 iframe

nodeTextMap[tableOrChartId].text에 전체 표 문자열을 싣는다. 실제 표·차트 변경은 다음 절의 엔진 분기에서 수행한다.

공급 쪽에서 grid를 고르는 정확한 규칙

로컬 UI는 resultMaps.ts, 원격 UI는 클라이언트 패키지의 buildFrameReplacement로 payload를 만든다. 두 경로 모두 셀 소유권을 먼저 적용하고, 제목 선택·원문 보존·형제 그룹 규칙은 공유 구현을 쓴다. 로컬·원격 UI의 대치 경로 buildFrameReplacement

조건현재 코드 동작근거
sheetJson 있음RLSC의 Table·Chart 후보 ID로 실제 속성을 조회. 표는 layoutProps.cellProps 또는 legacy cellProps, 차트는 chartProps.dataSource 또는 dataVizProps.datasource. 실제 격자가 최소 2×2여야 채택.실제 Table·Chart 격자 검출
실제 속성으로 격자 없음RLSC가 Table/Chart라고 적어도 matrix로 확정하지 않는다. doc이 있는데 실패한 경우 RLSC-only 판정으로 되돌아가지 않는다.doc 우선 격자 판정
sheetJson 자체가 없음RLSC 타입으로 fallback. rowCount·columnCount가 없거나 작으면 2로 잡는다. detectedFrom:'rlsc'는 실제 속성 확인보다 약한 근거다.doc 우선 격자 판정
경계 안 격자 여러 개cols, 다음 rows 오름차순의 첫 격자만 slot. 나머지는 extraGrids 감점으로 넘긴다. 자동으로 모든 표를 채우는 모델이 아니다.격자 정렬: cols → rows
첫 grid → dataset.slot
extraGrids 감점 입력

“유닛 전부 blank”의 해석: raw matrix만 있는 입력이나 P6 결과는 entities가 없을 수 있다. columns+entities 경로도 query units를 비우고 grid에 행 전체를 보관한다. 따라서 일반 unit만 보면 전부 blank여도 binding[field='grid'].text에는 내용이 들어 있다. 그 문자열과 sheet_id를 함께 확인해야 한다. query Frame units·dataset 분리 comp-frame P6 행 재구성 grid 단일 binding

06

실제 표와 차트는 렌더러에서 갈라진다

여기는 comp-frame의 검색 코드가 아니라 web-2의 preview 호스트 코드다. 9f70d675에서 확인한 구현이며 현재 배포 엔진과 동일하다고 단정하지 않는다.

SHARED · buildComponentThumbnailPage

sheet 복제 → PageBuilder → bbox → 내용

페이지를 만든 뒤 nodeBboxMap을 먼저 반영하고, 기준 박스를 저장한 뒤 applyMarkdownToNodes를 실행한다. aippt sheet API의 “텍스트 → bbox” 순서와 다르다.

↓ 대상 노드의 실제 타입으로 분기
TABLE ITEM

parse → pasteCellContent(fit:true)

표 Markdown을 2차원 셀 문자열로 바꾼다. 시작 셀 (0,0)에 붙이고 입력 행·열 개수에 맞춰 표를 축소·확장한다. 새 데이터에 병합 정보를 따로 전달하지 않는다.

↓

폰트 → 열 너비 → 행 높이

셀 폰트 크기를 기본값으로 정규화한 뒤 열 너비를 재배분하고 행 높이를 정착시킨다. 줄바꿈이 바뀌므로 이 순서가 중요하다.

CHART ITEM

스타일 정리 → updateData(matrix)

기존 색 필드를 제거하고 라벨 표시를 정규화하며 data·series 폰트 크기를 초기화한다. 표 문자열을 2차원 배열로 읽어 getDataUnit().updateData()에 전달한다.

↓

차트 행렬 정규화

데이터가 비거나 헤더만 있으면 빈 행을 보충한다. 행 길이가 다르면 최대 열 수에 맞춰 빈 문자열로 채운다. 입력 카테고리로 차트 타입을 재설계하는 코드는 이 분기에 없다.

↓ 이후 공통 shrink·렌더 단계

대치된 페이지

내용이 바뀌었다는 것과 적절한 위치·크기로 보인다는 것은 다른 검증이다. 표의 레이아웃 계산 후 셀을 일반 텍스트처럼 다시 덮으면 데이터는 맞아도 배치가 깨질 수 있다.

일반 TextItem은 같은 map의 문자열을 TextItemPropsBuilder.buildFromMarkdown으로 처리한다. 표 셀도 TextItem이므로 부모 표와 셀을 동시에 대상으로 보내지 않는 것이 중요하다. Text·Chart·Table 분기

07

이번 문제는 데이터 전달과 셀 소유권이 충돌했다

처음 보고한 현상은 matrix 경로에서 일반 유닛이 전부 blank로 보이고, 일부 ListingTable의 내용은 들어갔지만 컴포넌트 구성이 뭉개지거나 위치가 어긋나는 것이었다. 아래는 이번 PR에서 확인·수정한 내용이다.

표 전체와 셀을 동시에 대치하던 경로와 수정 후 경로수정 전에는 grid Markdown과 셀 placeholder 및 확장 bbox가 함께 표에 들어갔다. 수정 후에는 표 노드에 grid 하나를 전달하고 표 엔진이 자손 셀을 관리한다. 수정 전 · 서로 다른 두 주체가 같은 셀을 변경 grid → 표 전체 Markdown내용 데이터는 정상 전달 셀별 placeholder + 확장 bbox자손을 잔여·일반 Text로 취급 TableItem데이터임시 문구이동된 박스× 수정 후 · 표 엔진이 자손 셀을 관리 grid → 표 ID 하나셀 텍스트·bbox 중복 지시 제외 TableItem → paste → 셀 크기 정착행·열 내용과 레이아웃을 같은 표 엔진에서 처리 이 도식은 코드의 소유권을 설명한다. 원본 스크린샷과 같은 후보의 전후 렌더 이미지는 아니다.
12같은 질의의 native 표 후보
207검사한 기존 표 셀
0수정 후 별도 셀 텍스트·bbox 지시

이 수치는 이번 문서용 예제가 아니라 앞선 수정 작업의 실데이터 payload 검증 기록이다. 모든 후보의 matrix 문자열은 유지됐다. 원래 스크린샷에는 후보 ID가 없어 동일 후보라고 단정하지 않으며, preview가 당시 404여서 최종 렌더 전후 비교는 수행하지 못했다. PR #1117 원인·검증·적용 범위

수정 적용 범위: PR #1117의 화면·클라이언트 보호는 기존 결과의 셀 중복 지시를 걸러낸다. 이미 DB·스냅샷에 저장된 잘못된 grid ID와 감점 메타데이터는 수정된 빌더로 재적재·스냅샷 재생성해야 바뀐다. 이 문서 작성으로 재적재나 배포를 수행하지 않았다. 검증·적용 범위 기록

리뷰 후속 커밋과 최신 main의 원격 대치·공개 타입 정리까지 통합한 기준이다. legacy 표의 원문 읽기도 자식 연결을 따라가도록 보완했다. 관련 2,414개 테스트와 후속 클라이언트·오라클·Rust 검사를 통과했고, 로컬·원격 UI에 실제 전달되는 payload에서 셀 중복 지시가 빠지는지 확인했다. legacy 셀 원문 읽기 통합 후 검증

08

코드와 규약 사이에 남아 있는 차이

아래는 이번 문서를 위해 확인한 동작과 제한이다. 이번 PR에서 모두 수정했다는 뜻은 아니다.

실행으로 확인한 추가 차이: entities 헤더와 CSV 셀 순서

전체 헤더를 준 entities 입력

§2의 columns:[지역,매출], label:서울, values:[12] 입력을 그대로 넣었다. comp-frame은 “지역 / 매출” 표를 만들지만 aippt 브리지는 columns 앞에 빈 헤더를 덧붙여 아래 결과를 만든다.

- 서울
  - 지역: 12
  - 매출: -
- 부산
  - 지역: 9
  - 매출: -

현재 aippt 코드의 [{label:''}, ...structure.columns]와 [e.label,...e.values] 조합에서 나온 결과다. 양쪽의 columns 해석을 통일할 필요가 있다. structureToMarkdown·tableAsList matrix → pipe-table Markdown

JSON nodes 순서가 다른 표

table.childNodeIds = [cell-a, cell-b]
json.nodes 내 실제 순서 = [table, cell-b, cell-a]
CSV = "A,B,C"

실제 결과:
  cell-b ← A
  cell-a ← B
  C      ← 쓸 기존 셀 없음

합성 최소 재현의 결과다. CSV 표 유틸은 childNodeIds를 집합 필터로만 쓰고 그 순서로 정렬하지 않는다. 물리 셀 좌표 기반 대응이나 행·열 증가도 수행하지 않는다. JSON 표 CSV 대치

규약은 설계 의도, 코드는 현재 동작: 위키 §7의 dataset.matrix → Chart data는 대응 방향을 설명한다. 그것만으로 aippt의 RLSC PoC에서 차트 주입이 완료됐다고 볼 수 없다. 별도 binding 계약 문서도 표의 행·열 대응 확인을 열린 항목으로 남겨두고 있다. RLSC 대응 설계 표 행·열 대응의 열린 항목 미채움 제거·dataset 미지원 고지

09

어떤 코드를 읽었고, 어디까지 확인했나

소스고정 기준읽은 범위
mordor-wikibbabab9f1b207e97e6957dd6aa3231cb76a7e1bb사용자가 지정한 projects/mordor/visual-summary/spec·design. 규약과 구현을 혼동하지 않도록 비교.
aippt-prisonbreak9f2ee87f8136ae0e00091c5aec339af4f782a953Visual Summary 바인더·projection·브리지·sheet API·CSV 도구·호출부. README와 함수 목록도 확인.
miricanvas-iui8dd09206b94b3e2a83b23c2a7dbea68d394aa0d8PR #1117의 리뷰 후속 및 main f58687094 통합 포함. shared/index/client, 로컬·원격 UI의 query·align·payload와 Rust 대응.
miricanvas-web-29f70d6757d5976cb81a749455ad7d8a7dd8a9155origin/feature/UNICORN-73380_의 Git 객체를 직접 읽음. 현재 체크아웃 HEAD나 실서비스 전체를 대표하지 않는 preview 렌더 참조.

aippt의 docs 서브모듈 로컬 HEAD는 f3c93dcc로 별도 wiki 체크아웃과 다르다. schema·capability 파일 차이를 확인했고, 본문의 규약 인용은 사용자가 지정한 wiki의 bbabab9f로 고정했다. comp-frame 내부 vendor도 aippt HEAD와 동일한 사본이 아니라 3d5a05d2 기준이므로, 어댑터를 포함한 실제 코드로 동작을 판정했다. aippt vendor 기준 SHA

확인함

코드·최소 실행·문서 검사

matrix 직렬화, entities 헤더 차이, RLSC raw matrix 미주입, CSV 숫자·셀 순서를 로컬 함수 호출로 확인했다. 코드 링크는 커밋과 파일·줄 번호를 대조했다. 목차·사이드바·로컬 링크, 데스크톱·모바일·다크모드, 예제 탭·코드 검색 동작도 검사했다.

범위 밖

운영 전체의 E2E 보증

새로운 DB 검색·재적재·배포는 하지 않았다. 이번 문서에 그린 표·차트·소유권 그림은 설명용이다. 실제 preview 최종 렌더의 전후 이미지와 배포 SHA 일치 여부는 미확인이다.

코드 바로 찾기

링크는 모두 GitHub의 고정 커밋·줄 번호다. 사내 저장소 접근 권한이 필요하다. 저장소 이름, 함수, 경로로 좁힐 수 있다.

저장소함수·코드 위치
mordor-wikimatrix·entities 표 규약
projects/mordor/visual-summary/spec/schema-v0.5.md:518
mordor-wikiColumn 메타데이터
projects/mordor/visual-summary/spec/schema-v0.5.md:277
mordor-wikiRLSC 대응 설계
projects/mordor/visual-summary/spec/schema-v0.5.md:740
mordor-wikiP4·P6 projection 규칙
projects/mordor/visual-summary/spec/capability-table.md:278
mordor-wiki표 행·열 대응의 열린 항목
projects/mordor/visual-summary/design/content-binding-contract.md:231
aippt-prisonbreak검색 엔진별 bind·diffSlots
src/app/api/visual-summary/service.ts:160
aippt-prisonbreakentityContents·bindComponentToRlsc
src/lib/visual-summary/binding.ts:52
aippt-prisonbreak미채움 제거·dataset 미지원 고지
src/lib/visual-summary/binding.ts:202
aippt-prisonbreakIIS 경계 대치
src/lib/visual-summary/iis/nodeBinding.ts:81
aippt-prisonbreakstructureToMarkdown·tableAsList
src/lib/visual-summary/markdown.ts:42
aippt-prisonbreakaippt P4·P6
src/lib/visual-summary/projection.ts:200
aippt-prisonbreakcomp-sign 결과 → fills·bboxes
src/app/api/visual-summary/compSignService.ts:341
aippt-prisonbreakcomp-sign bridge 버전 4.3.5
package.json:197
aippt-prisonbreakapplySheetTextFills
src/lib/visual-summary/sheet.ts:87
aippt-prisonbreaksheet API 적용 순서
src/app/api/visual-summary/sheet/route.ts:125
aippt-prisonbreakPageRootView 인라인 렌더
src/components/pages/VisualSummaryPocPage/McInlineCanvas.tsx:136
aippt-prisonbreakCSV 대치 도구의 호출부
src/app/replace-content/page.tsx:145
aippt-prisonbreakJSON 표 CSV 대치
src/lib/replaceContent/replaceJsonTableDataWithCsv.ts:13
aippt-prisonbreakJSON 차트 CSV 대치
src/lib/replaceContent/replaceJsonChartDataWithCsv.ts:12
aippt-prisonbreakCSV 숫자 변환
src/lib/replaceContent/extractDataFromCsv/extractJsonChartDataFromCsvData.ts:12
aippt-prisonbreakCSV 표 행 우선 평탄화
src/lib/replaceContent/extractDataFromCsv/extractTableDataFromCsvData.ts:35
aippt-prisonbreakXML GRID.CELL 대치
src/lib/replaceContent/replaceXmlTableDataWithCsv.ts:14
aippt-prisonbreakXML ChartData 대치
src/lib/replaceContent/replaceXmlChartDataWithCsv.ts:13
aippt-prisonbreakXML 열 → series 변환
src/lib/replaceContent/extractDataFromCsv/extractXmlChartDataFromCsvData.ts:25
aippt-prisonbreak수요 평가용 comp-sign 대치
src/lib/demand/logic-replace.ts:146
miricanvas-iuimatrix → pipe-table Markdown
src/comp-frame/query-frame.ts:177
miricanvas-iuiquery Frame units·dataset 분리
src/comp-frame/query-frame.ts:313
miricanvas-iuitableRows·계층 행 평탄화
src/comp-frame/summary-content.ts:243
miricanvas-iuimeasure → 값·텍스트
src/comp-frame/summary-content.ts:198
miricanvas-iuicomp-frame P6 행 재구성
src/comp-frame/summary-projection.ts:117
miricanvas-iui실제 Table·Chart 격자 검출
packages/comp-frame-shared/src/forked/gridExtract.ts:135
miricanvas-iuilegacy 포함 표 셀 ID 수집
packages/comp-frame-shared/src/forked/gridExtract.ts:176
miricanvas-iuilegacy 셀 원문 읽기
packages/comp-frame-shared/src/forked/gridExtract.ts:93
miricanvas-iuidoc 우선 격자 판정
packages/comp-frame-index/src/frame/component-frame.ts:215
miricanvas-iui첫 grid → dataset.slot
packages/comp-frame-index/src/frame/component-frame.ts:336
miricanvas-iui격자 정렬: cols → rows
packages/comp-frame-shared/src/forked/sortGrids.ts:4
miricanvas-iuiIIS 경계 안 격자 탐색
packages/comp-frame-index/src/frame/component-frame.ts:1037
miricanvas-iuirule fallback의 동일 경계
packages/comp-frame-index/src/frame/component-frame.ts:1514
miricanvas-iuidataset kind 하드 필터
src/comp-frame/filter.ts:123
miricanvas-iuigrid 단일 binding
src/comp-frame/align.ts:747
miricanvas-iuigrid는 글자 용량 계산 제외
src/comp-frame/cost.ts:264
miricanvas-iuiextraGrids 감점 입력
src/comp-frame/rank.ts:316
miricanvas-iuibinding·blank → nodeTextMap
src/comp-frame/resultMaps.ts:212
miricanvas-iui표 셀 중복 쓰기·박스 제외
packages/comp-frame-shared/src/tableOwnership.ts:1
miricanvas-iuigrid 자손의 잔여 제외
packages/comp-frame-shared/src/insideResidue.ts:69
miricanvas-iui셀 bbox override 제외
src/visual-summary/useResultAssets.ts:158
miricanvas-iuiiframe payload 전송
src/comp-frame/FrameThumbnail.tsx:759
miricanvas-iuiiframe URL·wire contract
src/comp-frame/previewProtocol.ts:33
miricanvas-iuibuildFrameReplacement
packages/comp-frame-client/src/replacement.ts:497
miricanvas-iui로컬·원격 UI의 대치 경로
src/comp-frame/FrameResultCard.tsx:636
miricanvas-iui없는 IIS 경계 행 건너뛰기
packages/comp-frame-index/src/bin/build-comp-frames.ts:805
miricanvas-iuiRust grid 정렬 대응
rust/comp-pass/crates/comp-frame-core/src/align.rs:992
miricanvas-iuiaippt vendor 기준 SHA
packages/comp-frame-shared/src/eregion/VENDOR.json:1
miricanvas-iuiPR #1117 원인·검증·적용 범위
docs/comp-frame-matrix-table-fix-2026-09-19.md:1
miricanvas-web-2Text·Chart·Table 분기
packages/engine/editor/src/test/component-thumbnail/buildComponentThumbnailPage.ts:121
miricanvas-web-2bbox → 내용 → shrink 순서
packages/engine/editor/src/test/component-thumbnail/buildComponentThumbnailPage.ts:183
miricanvas-web-2차트 파서·스타일 정규화
packages/engine/editor/src/test/component-thumbnail/buildComponentThumbnailPage.ts:49
miricanvas-web-2표 paste·fit·셀 크기 정착
packages/engine/editor/src/node/item/component/componentTableContentUtil.ts:138
miricanvas-web-2표 파서: 개행·파이프 제한
packages/engine/editor/src/node/item/table/util/TableMarkdownParser.ts:24
miricanvas-web-2열 너비 → 행 높이 순서
packages/engine/editor/src/node/item/table/util/TableCellSizeSettler.ts:5
miricanvas-web-2차트 행렬 정규화
packages/engine/editor/src/node/item/chart/units/ChartMatrixDataUnit.ts:15