아카이브 · 당시 기준

2026-09-13 원본에서 평가 계약·구현·코퍼스가 달라진 것을 확인해 당시 기록으로 보관했습니다. 본문과 자동 동기화 표는 보관 당시 내용입니다.

현재 기준과 원본 보기 → · 보관 목록

← 미리디 기술 사전 / Visual Summary

내용시각화comp-sign 4.3.8코드 추적 · 2026-09-08

Visual Summary 검색·대치
텍스트는 어디서 개입하나

Signature → retrieval → score → reranking → 최종 match를 앞에서부터 추적했다. 원문이 해시에 없는 것과 텍스트 파생 정보가 검색에 쓰이지 않는 것을 구분한다.

기준 커밋 988a4c89a기본 v3.4 / v2선택 v3.4-sig3빌더 버전 41 / 후보 51
§0

30초 요약

  • Signature검색 키는 RLSC를 변환한 트리 구조를 해시한다. sig3는 H와 [table]/[chart]를 더한다. 저장 행에는 용량·스타일·기하·원문 지문도 담는다.
  • Retrieval텍스트를 사용한다. 최초 DB 후보 조회부터 입력의 글자 수·강제 줄 수로 용량 하한을 건다. sig3는 같은 트리 경로의 노드별 용량까지 비교한다.
  • 최초 사용reranking보다 앞선다. 질의는 파싱·키:값 변형에서 이미 문자열을 읽는다. 색인 생성도 반복 그룹의 글자 수, 대표 스타일의 글자 수 가중치 등을 사용한다.
  • Reranking줄 수 초과, 문자 종류·공백을 반영한 예측 크기, 미매핑 슬롯을 본다. 원문 지문에 따른 중복 제거도 최종 후보를 바꾼다.
  • 역할문장을 슬롯 구조로 연결하고, 들어갈 분량과 배치 적합성·결과 다양성을 판단한다. 확인한 경로에는 질의와 템플릿 원문의 주제·문장 의미 유사도를 비교하는 점수가 없다.

“text used”의 범위를 먼저 고정한다

이 문서는 원문 문자열뿐 아니라 구문, 글자 수, 문자 종류, 스타일 선택 가중치, 렌더된 글자 영역, 원문 해시도 텍스트 사용으로 센다. 다만 이 중 어느 것도 그 자체로 문장 의미 유사도 비교를 뜻하지는 않는다.

§1

흐름 한 장 — 두 입력이 검색에서 만난다

요청한 흐름을 따라 읽되, Visual Tree 자체를 그대로 해시하는 구조는 아니다. 컴포넌트의 doc + RLSC와 사용자의 markdown이 각자 준비되어 조회에서 만난다.

색인 측 · 미리 계산

doc + RLSC

doc → Visual Tree·기하·스타일·용량
RLSC → signature forest → structure_hash

질의 측 · 매 검색

입력 markdown

parseSummaryTree → 구문·계층 트리
변형 해시 + 경로별 text + demand

  1. ① Visual Tree 구성

    기하 포함 관계 + 반복 그룹 판정. 글자 수 비율을 사용하며 VT2 tight box는 렌더된 텍스트의 기하다.

    TEXT USED?YES · 원본 텍스트 파생
  2. ② Signature 생성

    RLSC → signature forest → 구조 해시. Visual Tree는 별도로 저장·채점에 기여한다. 용량·스타일·fingerprint도 생성한다.

    TEXT USED?YES · 저장 행 / 생성 과정
  3. ③ Candidate retrieval

    질의 트리의 변형 해시와 일치하는 행을 조회하면서 cap_chars·cap_lines를 필터링한다. sig3는 노드별 벡터도 비교한다.

    TEXT USED?YES · 질의 구문과 분량
  4. ④ Filter / score

    줄 수 초과, 대치 후 예측 박스의 축소, 미매핑 노드를 채점한다. 별도의 후보 원문 의미 비교는 없다.

    TEXT USED?YES · 길이·문자 종류·매핑
  5. ⑤ Reranking / dedupe

    채점 → fingerprint별 하나 유지 → tier·스마트블록 우선순위·총점 정렬. 중복 제거는 결과에 남는 후보를 바꾼다.

    TEXT USED?YES · 파생 점수와 원문 지문
  6. ⑥ 최종 match → 대치

    상위 N개를 고르고 variant와 text_map의 경로로 글을 넣는다. 미매핑 노드에 한해 원문 보존 패턴을 검사한다.

    TEXT USED?YES · 실제 입력 문자열

④·⑤는 별도 모델 두 개가 아니다. rankCompCandidates 안에 채점·중복 제거·정렬이 이어져 있어 설명을 위해 나눴다. 태그 필터는 활성화됐을 때 ③의 조회 조건에 함께 들어간다.

코드 근거 · build-comp-signatures.ts:131 · build-search-hashes.ts:125 · rank-candidates.ts:126

§2

Signature에 무엇이 들어가나

검색 키(structureHash)와 시그니처 저장 행(CompSignature)을 구분한다. 아래 “직접 입력”은 최종 해시 문자열의 토큰을 뜻한다. 토큰으로 없더라도 그 앞의 트리 생성·적재 자격에는 관여할 수 있다.

정보 축해시에 직접 들어감?저장 행 / 생성 과정출처
element / typev2: NO
sig3: 일부
Text role로 슬롯·계층을 만든다. sig3는 Title·Subtitle·Hl을 H로, Table/Chart를 별도 토큰으로 표시. 행에는 role, textNodeRoles.signatureTree.ts:1460
geometry / sizeNOtextMap.box, scoreFeatures.areaRatioR/pageWidth/pageHeight, 선택적 외곽선. 용량·렌더 크기의 근거다.helpers.ts:1694
position / layoutNO절대 위치·정렬, Visual Tree의 포함·반복 구조, visualSplitPairs. 좌표를 해시 토큰으로 직렬화하지는 않는다.helpers.ts:275
styleNO · 직접값 없음v2는 스타일 비교가 트리 변환에 관여. sig3는 role-only 트리를 만든 뒤 스타일 자격 게이트로 행 생성 여부를 결정. 행에는 styleKey·fontSize·lineSpacing·hAlign·vAlign.signatureTree.ts:992
signatureTree.ts:1374
text / content — 원문NO원문 전문을 검색 키나 textMap에 저장하지 않는다. 대신 슬롯의 원문(격자는 셀 원문)을 합친 fingerprint를 저장해 중복 제거에 사용한다.scoring.ts:565
text 파생 — 길이·줄·문자 구성NO · 직접값 없음원본 글자 수는 반복 판정·대표 스타일 선택에 사용. chars/lines/charsPerLine은 수용 용량이며 cap*로 합산·벡터화. 질의의 실제 글자·줄 수는 별도 demand다.textPredict.ts:15
matching.ts:850
hierarchy / Visual Tree 구조YES · RLSC 변환 구조RLSC → signature forest의 자식 수·순서를 해시한다. Visual Tree는 별도 트리로 id·component·outline·children을 저장하고 채점·대치에 사용.signatureTree.ts:1477
helpers.ts:362
semantic 정보role: 간접
태그·embedding: NO
상류에서 전달받은 role은 트리 변환에 사용. semantic_tags는 빌더 반환값 밖의 별도 DB 컬럼. 이 검색 경로에 문장 embedding·cosine similarity·의미 reranker는 없다.build-comp-signatures.ts:38
build-comp-signs.sql:541

CompSignature는 공통 필드 9개와 sig3 선택 필드 capLinesArr/capCharsArr를 선언한다. “원문 문자열을 저장하지 않는다”는 이 반환값에 대한 설명이며 원본 sheetJson에는 텍스트가 있다.

§3

해시에 없는 것과 생성에 쓰이지 않는 것은 다르다

최종 직렬화만 보면 단순하다. v2는 자식 수와 괄호, sig3는 여기에 헤딩·격자 토큰을 더한다.

해시 직전 문자열 · 설명용 예
v2    : 2(2(0)(0))(0)
sig3  : 1(H2(0)([table]))
        ↓ xxhash64 → signed int64의 10진 문자열
        structure_hash

직렬화에 없다는 사실만으로 전체 생성 과정을 TEXT NO로 둘 수 없다

v2는 RLSC의 role·계층과 doc의 스타일 비교로 forest를 변환한다. sig3는 role-only 변환 후 textStyleOf를 사용하는 스타일 게이트를 거친다. 이 대표 스타일은 fontSize × 글자 수 가중치로 고른다. 글자 수를 해시에 붙이지 않아도 어떤 시그니처 행이 만들어지는지에 영향이 생길 수 있다.

질의 준비에서 읽는 텍스트검색에 미치는 영향현재 경로의 조건
헤딩·목록·들여쓰기·파이프 표parseSummaryTree가 계층과 head/grid를 만든다. 같은 의미의 글이라도 작성 구조가 다르면 해시가 달라질 수 있다.기본 파싱. sig3는 단일 루트를 헤딩으로 간주하는 규칙도 있다.
키: 값 문자열 패턴leaf 형제 전부가 이 구문이면 key 부모 + value 자식으로 쪼갠 추가 검색 변형을 생성한다.expandKeyValue가 켜졌을 때. 원본 검색도 유지한다.
표 셀의 숫자·문장·빈 값chartlike를 계산하고, 코어의 자동 모드에서는 차트 토큰 변형을 추가할지 결정한다.현재 /comp-match UI는 표/차트 종류로 gridStream을 강제한다. 이 UI에서 숫자 판정이 항상 후보를 가른다고 쓰면 안 된다.

코드 근거 · signatureTree.ts:543 · summaryTree.ts:59 · matching.ts:329 · summaryTree.ts:198 · useMatchSearch.ts:473

§4

텍스트 파생 feature — 수요와 용량을 구분한다

text_map.chars/lines는 원본 문자열 길이·실제 렌더 줄 수가 아니라 슬롯의 수용 용량이다. 그러나 “박스만 같으면 텍스트와 완전히 무관하다”도 정확하지 않다.

feature어떻게 산출하나쓰이는 곳
질의 demand.charsΣ text.length. JS의 UTF-16 코드 단위 수이며 화면상 글자 수나 토큰 수와는 다르다.첫 DB 조회의 cap_chars 하한
질의 demand.lines일반 텍스트 경로마다 1 + 개행(\n) 수. 아직 박스 폭에 의한 자동 줄바꿈은 세지 않는다.첫 DB 조회의 cap_lines 하한
노드별 demand 벡터변형 경로의 DFS 순서로 위 수요를 나열하고 각각 허용 배수로 나눈 뒤 floor.sig3의 cap_lines_arr·cap_chars_arr와 경로별 비교
색인 charsPerLinemax(1, floor(width / (0.8597 × 대표 fontSize))). 평균 글자폭 계수는 고정.줄 수 초과 예측 + 용량 합산
색인 lines / chars부모·형제 경계와 정렬을 보고 확장한 높이 ÷ 줄 높이. chars = charsPerLine × lines. 추출 여백 24px.textMap → cap 합계·벡터
대표 fontSize / style비어 있지 않은 leaf의 fontSize × text.length 가중치. fontSize 대표값은 최대 leaf, sig3 게이트용 스타일은 같은 스타일 그룹의 합산 가중치.용량·스타일 게이트·fontSize 기반 점수에 간접 반영
원문 fingerprint시그니처 슬롯 경로 순서의 원문 조각(표/차트 셀 포함)을 연결해 해시.후보끼리 중복 제거. 질의와 유사도 비교하는 값은 아님
tight box / 반복 판정렌더된 글자 영역 또는 원본 글자 수 비율. 원문 길이 값 자체를 저장하지 않아도 파생 구조에 영향.Visual Tree 및 그 파생 feature

용량 모델에서 제거된 의존과 남은 의존

v28 이후 원본 글의 한글/라틴 구성에 따른 평균 폭 계수는 사용하지 않는다. 하지만 대표 fontSize는 여전히 글자 수 가중치로 선택하므로, 여러 크기가 섞인 텍스트에서는 부분별 길이가 바뀌면 용량도 바뀔 수 있다. 같은 박스뿐 아니라 대표 폰트 크기·줄간격·정렬·주변 경계까지 고정해야 같은 용량을 기대할 수 있다.

코드 근거 · matching.ts:850 · matching.ts:873 · helpers.ts:1581 · textPredict.ts:15 · nodeStyle.ts:54 · signatureTree.ts:518

§5

Candidate retrieval — 첫 조회부터 분량 필터

최초 candidate retrieval은 TEXT USED? YES. UI의 fetchHashRows는 변형 해시를 조회할 때 그 변형에 배정된 텍스트의 수요도 함께 필터링한다. “해시로 전부 가져온 뒤 reranking에서 처음 텍스트를 본다”는 흐름이 아니다.

현재 조회 조건의 요약 · multiplier = 초과 허용 배수
minChars = floor(demand.chars / multiplier)
minLines = floor(demand.lines / multiplier)

WHERE structure_hash = variant.hash
  AND cap_chars >= minChars
  AND cap_lines >= minLines

sig3 추가: 모든 경로 i에서
  cap_chars_arr[i] >= floor(text[i].length / multiplier)
  cap_lines_arr[i] >= floor((1 + 개행 수[i]) / multiplier)
조회 방식실제 동작해석
v3.4 / v3.2 (v2)해시별 select + 합산 용량 하한. source·merged·header/footer 등 조건과 조회 한도도 적용.텍스트 총분량이 후보 풀에 직접 관여한다.
v3.4-sig3comp_match_rows_sig3 RPC에 합산 + 노드별 하한을 전달. SQL에서 배열 원소별 부족 여부를 검사.총합은 충분해도 특정 슬롯이 부족하면 후보에서 제외될 수 있다.
표·차트 grid leafdemand 합계에서 제외, 노드별 벡터에는 자리를 유지하며 0을 넣는다.표 markdown을 일반 텍스트 박스에 넣는 것으로 계산하지 않는다.
컴포넌트 key 직접 지정design_object_id로 행을 읽고 변형 해시를 로컬 대조. 태그·pool·overflow 조건은 건너뜀.일반 검색의 분량 prefilter 결론에 대한 명시적 예외. 이후 채점·대치는 계속된다.

조회 순서와 후보 수 한도로 어떤 후보를 실제 받아 오는지도 달라진다. v2는 template_idx·id 내림차순, sig3 SQL은 스마트블록 우선을 더한다. 이것을 텍스트 의미 검색 순위로 해석하면 안 된다.

코드 근거 · useMatchSearch.ts:789 · useMatchSearch.ts:888 · build-comp-signs.sql:920 · useMatchSearch.ts:1338

§6

Semantic tags — 구현된 기능과 현재 활성 상태

현재 /comp-match에서는 태그 경로가 비활성

SEMANTIC_TAG_UI_ENABLED = false이고, CompMatch는 태그를 사용할 수 없으면 tier0Tags/tier1Tags에 빈 배열을 전달한다. 따라서 현재 화면이 사용자 글을 LLM으로 자동 분류해 의미 태그로 검색한다고 설명할 수 없다.

구현된 지원 경로는 별도로 있다. semantic_tags는 시그니처 해시 밖의 DB 컬럼이며 public.design_object_semantic_tags에서 옮겨 담는다. 태그가 활성화되어 호출자에게서 들어오면 다음처럼 후보 조회·정렬에 관여한다.

군조건TEXT USED?
0군호출자가 사용자 지정 태그로 전달한 값과 일치하는 후보.태그 사용 YES. 사용자가 직접 골랐다면 텍스트에서 자동 추론한 값은 아니다.
1군호출자가 추정 태그로 전달한 값. 0군과 중복 태그는 제외.외부에서 글을 읽어 만든 값이면 텍스트의 의미 파생 정보. 이 함수가 LLM을 호출하지는 않는다.
2군0·1군 태그가 없는 후보. 해시·용량 등 나머지 조회 조건은 유지.태그 불일치를 최종 탈락시키기보다 후순위 풀로 둔다.

태그를 쓰는 경로에서는 tier가 점수보다 먼저이고, 목표 후보 수를 채우면 뒤 군을 생략한다. 이는 표현 형식 태그의 일치 정책이다. 질의와 템플릿 문장의 embedding을 비교하는 의미 유사도 점수와는 구분해야 한다.

코드 근거 · semanticTagUi.ts:7 · CompMatch.tsx:1165 · useMatchSearch.ts:426 · useMatchSearch.ts:1450 · build-comp-signs.sql:541

§7

Score → reranking — 무엇으로 순위를 정하나

computeScoreBreakdown의 16개 항목 중 질의 경로의 text 값 또는 매핑 여부를 직접 사용하는 항목은 3개다. 하지만 파생 feature까지 포함하면 “텍스트와 관련된 것은 셋뿐”이라고 제한할 수 없다.

항목일반 기본 가중치텍스트 사용 방식판정 기준
textDiff4직접 · 길이·개행슬롯 폭(charsPerLine) 기준 Σ max(1, ceil(각 개행 구간 길이 / cpl))를 계산. 용량 lines 초과분의 제곱근 감점. 스마트블록은 면제.
textShrinkPenalty50직접 · 문자 종류·공백·개행classifyChar → simulateWrap → predictTextBbox. 한글/영문 대·소문자/숫자/공백/부호별 폭과 줄바꿈으로 예측한 박스가 원래 박스보다 작아지는 폭·높이를 감점.
placeholderPenalty5직접 · 매핑 존재Marker/Deco를 빼고 입력이 매핑되지 않은 텍스트 노드 수. 원문 보존 대상도 포함될 수 있다. 입력 의미를 읽지는 않는다.
styleMismatch2저장 feature같은 depth 노드 사이 styleKey 불일치 감점.
parentChildSameStyle1저장 feature부모·자식의 동일 스타일 감점.
fontSizeBonus0.5저장 feature · 길이 간접부모·자식 대표 글꼴 크기 차이. 대표값 생성에 원본 글자 수가 관여한다.
areaRatio40저장 용량·기하컴포넌트 면적 비율과 시그니처 용량 기반 임계. 스마트블록은 별도 완화.
visualSiblingSplit3저장 기하·계층시그니처 비형제지만 화면상 형제인 쌍 수.
illustrationBonus2저장 VT feature그림이 항목마다 있는 패턴. VT 반복 그룹 판정에는 원본 길이도 관여.
titleFontSizePenalty5저장 feature · 길이 간접최상위 제목의 대표 fontSize가 임계보다 작은 정도.
expansionPenalty5질의 변형추가 빈 자식 노드 수만큼 감점.
unwrapPenalty5질의 변형단일 루트 제목 제외 변형 감점.
keyValueSplitBonus+5구문 파생 flag키:값 분리 변형 가점. flag만 읽지만 그 flag는 입력 문자열 패턴에서 왔다.
mergeChildrenPenalty1질의 변형자식 병합 step에 대해 step(step+1)/2 감점.
gridPromotedPenalty10질의 변형격자 부모·형제를 버리는 승급 변형 감점.
gridIndexPenalty5질의 변형격자 위치 이동 변형 감점.

textShrinkPenalty는 폰트 축소율 점수가 아니다

여기서 shrink는 대치 후 예측 텍스트 영역이 원래 박스보다 작아져 생기는 여백을 뜻한다. 실제 렌더러의 auto-fit 폰트 축소 결과를 측정하지 않는다. 같은 글자 수여도 문자 종류와 공백 배치가 다르면 예측 박스가 달라질 수 있다.

rankCompCandidates 내부의 실제 순서
variant로 paths 복원
  → 16개 항목 채점·총점 합산
  → fingerprint별 후보 하나 유지 (dedupe 기본 true)
  → tier 오름차순 → 스마트블록 우선(기본 true) → score 내림차순
  → topN

fingerprint는 원문을 질의와 비교하지 않지만 최종 후보 선택에는 사용된다. 같은 지문을 가진 후보 중 우선순위·점수가 높은 하나를 남기므로, “중복 제거 전용이니 선택과 무관하다”는 설명은 틀리다. 점수는 높을수록 좋고 가점도 있어 0이 절대 최고점은 아니다.

코드 근거 · scoring.ts:446 · helpers.ts:1766 · predictTextBbox.ts:81 · predictTextBbox.ts:113 · rank-candidates.ts:191 · scoringWeights.ts:58

§8

최종 match → 내용 대치

최종 match는 고른 컴포넌트와 그 컴포넌트에 맞았던 variant·textMap이다. buildContentReplacement는 variant로 paths를 복원하고 path → 노드 id 대응으로 실제 입력 문자열을 넣는다. 의미가 가까운 문장을 찾아 슬롯에 배정하는 단계는 없다.

대상실제 처리주의점
입력이 매핑된 일반 슬롯사용자 문자열을 바로 attach.원래 값이 VS·숫자여도 먼저 매핑됐으면 이 분기에서 대치된다.
미매핑 Text 슬롯원본이 한 글자 이하·VS·TAM/SAM/SOM·숫자/단위 패턴이면 보존. 그 외는 role·용량에 맞는 placeholder.shouldPreserveText는 미매핑 분기에서만 호출한다.
Marker / Deco일반 텍스트 대치 루프에서 제외.role 기반 처리다.
격자 슬롯입력 표 markdown을 격자 노드에 전달. 미매핑 셀을 개별 placeholder로 덮지 않는다.렌더러가 표/차트를 다시 그리는 계약.

대치에서는 실제 문자열을 사용하지만, 원문을 읽는 최초 단계는 아니다. 파싱·키:값 변형, 문자 폭 예측, fingerprint 생성에서도 이미 문자열을 읽었다.

코드 근거 · build-replacement.ts:116 · helpers.ts:708 · signatureTree.ts:361

§9

Visual Tree와 RLSC는 서로 다른 입력 경로

빌더의 두 갈래를 정확히 그리면 다음과 같다. 이 함수는 이미 만들어진 RLSC를 받는다. 상류에서 RLSC role을 어떤 방식으로 추론했는지는 이번 확인 범위 밖이다.

buildSignatures(doc, rlsc)
rlsc + doc → buildSignatureTree / buildSignatureTreeRoleOnly
           → signature forest → structureHash + textMap의 경로

doc → computeVisualBundle → raw VT1 / 선택적 VT2 → 반복 그룹
    → visualTree 저장 + hasIllustration
    → raw VT1 부모맵 + textMap → visualSplitPairs

doc → buildNodeCapacityMap → 별도 VT1 경계 + 대표 fontSize
    → textMap의 용량 → cap 합계 / sig3 벡터
구간TEXT USED?어떻게 / 어디까지
기하 포함 관계만 보기NO · 의미/문자 직접 비교
YES · 텍스트 렌더 기하 조건부
박스·외곽선을 사용. VT2의 tight box가 들어오면 텍스트가 실제 그려진 영역을 포함 관계에 사용한다.
반복 그룹 만들기YESsimilarPairedLayout → similarTextLength가 글자 수 비율(최대 3배)을 검사. 대칭 판정에도 길이를 사용. “VT 전체는 텍스트를 안 본다”는 결론은 불가.
구조 해시와 연결직접 직렬화 NO이 빌더에서 grouped Visual Tree를 구조 문자열 함수에 전달하지 않는다. RLSC 변환 forest와 Visual Tree는 서로 다른 트리다.
용량과 VT2원본 길이 간접 YES용량은 buildNodeCapacityMap(doc)의 별도 VT1 + 글자 수 가중 fontSize로 계산한다. 옵션 VT2 grouped 트리가 용량 경계를 곧바로 대체하는 구조는 아니다.
저장 형식원문 전문 NOStoredVisualNode는 id·component·outline·children만 저장. 텍스트가 직접 저장되지 않아도 생성된 구조가 텍스트에 의존할 수 있다.

코드 근거 · build-comp-signatures.ts:140 · helpers.ts:275 · utils.ts:733 · utils.ts:817 · helpers.ts:346

§10

결론 다섯 줄

  • Signature검색 키는 RLSC를 변환한 트리 구조를 해시한다. sig3는 H와 [table]/[chart]를 더한다. 저장 행에는 용량·스타일·기하·원문 지문도 담는다.
  • Retrieval텍스트를 사용한다. 최초 DB 후보 조회부터 입력의 글자 수·강제 줄 수로 용량 하한을 건다. sig3는 같은 트리 경로의 노드별 용량까지 비교한다.
  • 최초 사용reranking보다 앞선다. 질의는 파싱·키:값 변형에서 이미 문자열을 읽는다. 색인 생성도 반복 그룹의 글자 수, 대표 스타일의 글자 수 가중치 등을 사용한다.
  • Reranking줄 수 초과, 문자 종류·공백을 반영한 예측 크기, 미매핑 슬롯을 본다. 원문 지문에 따른 중복 제거도 최종 후보를 바꾼다.
  • 역할문장을 슬롯 구조로 연결하고, 들어갈 분량과 배치 적합성·결과 다양성을 판단한다. 확인한 경로에는 질의와 템플릿 원문의 주제·문장 의미 유사도를 비교하는 점수가 없다.

오늘의 질문에 대한 답

“텍스트 정보로 매칭을 판단하는 것은 reranking뿐인가?” → 아니다. 입력 구문이 조회할 구조를 만들고, 분량이 최초 DB 후보를 자르며, 텍스트 파생 스타일·기하가 채점에 기여하고, 원문 지문이 최종 중복 후보를 줄인다. 다만 질의와 템플릿의 문장 의미를 비교하는 matching은 확인한 경로에 없다.

다음에 Visual Summary → Visual Tree → RLSC/Search를 연결할 때는 입력의 내용·구문 구조, RLSC의 역할 구조, Visual Tree의 시각적 포함·반복 구조를 각각 놓고, 어디서 변환하거나 서로 참조하는지 확인하면 된다. 별도 comp-frame 경로의 동작으로 이 comp-sign 경로를 대신 설명하지 않는다.

§11

코드 색인과 확인 범위

기준은 miricanvas-iui 커밋 988a4c89ab5bcf56e8e555548ca78d819a82d925이다. 인용한 파일은 git diff HEAD -- 해당 파일에 변경이 없는지 확인하고, 링크는 해당 커밋과 실제 줄 번호로 고정했다.

확인 범위와 현재 기본값

이번 결론은 TypeScript comp-sign 빌더 + /comp-match의 일반 후보 검색·채점·대치를 직접 읽은 결과다. UI 기본 세트는 v3.4(v2)이고 v3.4-sig3는 선택 경로다. Rust comp-pass 서버 내부, 새 comp-frame, 상류 Visual Summary/RLSC 생성기, 실제 운영 DB 적재 상태의 동일성까지 검증한 것은 아니다.

코드에 존재하는 기능과 현재 활성 상태를 분리했다: 태그 UI false, v2의 군 전체 RPC USE_RPC=false, sig3의 해시별 RPC는 별도로 사용. 컴포넌트 key 지정은 일반 검색 필터의 예외다.

코드 근거 · signatureSet.ts:24 · useMatchSearch.ts:200 · CompMatch.tsx:1250

저장소 상대 경로고정 커밋 링크확인한 함수 / 분기
packages/comp-sign/src/build-comp-signatures.tsbuild-comp-signatures.ts:131function buildSignatures(
packages/comp-sign/src/build-search-hashes.tsbuild-search-hashes.ts:125export async function buildCompSearchData(
packages/comp-sign/src/rank-candidates.tsrank-candidates.ts:126export function rankCompCandidates
packages/comp-sign/src/comp-sign/signatureTree.tssignatureTree.ts:1460export function buildMarkedStructureStringOfRlsc
packages/comp-sign/src/comp-match/helpers.tshelpers.ts:1694export function buildEnrichedNodeData(
packages/comp-sign/src/comp-match/helpers.tshelpers.ts:275export function computeVisualBundle(
packages/comp-sign/src/comp-sign/signatureTree.tssignatureTree.ts:992export function buildSignatureStages(
packages/comp-sign/src/comp-sign/signatureTree.tssignatureTree.ts:1374export function checkSignatureStyleGate(
packages/comp-sign/src/comp-match/scoring.tsscoring.ts:565export function buildTextFingerprint(
packages/comp-sign/src/comp-match/textPredict.tstextPredict.ts:15export function representativeFontSize(
packages/comp-sign/src/comp-match/matching.tsmatching.ts:850export function demandOfPaths(
packages/comp-sign/src/comp-sign/signatureTree.tssignatureTree.ts:1477export function buildStructureString
packages/comp-sign/src/comp-match/helpers.tshelpers.ts:362export function serializeVisualTree(
packages/comp-sign/src/build-comp-signatures.tsbuild-comp-signatures.ts:38export type CompSignature =
scripts/build-comp-signs.sqlbuild-comp-signs.sql:541-- semantic_tags 컬럼
packages/comp-sign/src/comp-sign/signatureTree.tssignatureTree.ts:543export function textStyleOf(
packages/comp-sign/src/comp-match/summaryTree.tssummaryTree.ts:59export function parseSummaryTree(
packages/comp-sign/src/comp-match/matching.tsmatching.ts:329export function parseKeyValueText(
packages/comp-sign/src/comp-match/summaryTree.tssummaryTree.ts:198export function isChartlikeTableCells(
src/comp-match/useMatchSearch.tsuseMatchSearch.ts:473gridStream: searchKind
packages/comp-sign/src/comp-match/matching.tsmatching.ts:873export function demandVectorsOfPaths(
packages/comp-sign/src/comp-match/helpers.tshelpers.ts:1581export function buildNodeCapacityMap(
packages/comp-sign/src/comp-match/nodeStyle.tsnodeStyle.ts:54export function nodeStyleOf(
packages/comp-sign/src/comp-sign/signatureTree.tssignatureTree.ts:518function collectLeafEntries(
src/comp-match/useMatchSearch.tsuseMatchSearch.ts:789const fetchHashRows = async (
src/comp-match/useMatchSearch.tsuseMatchSearch.ts:888.gte('cap_lines', minCapLines)
scripts/build-comp-signs.sqlbuild-comp-signs.sql:920create or replace function iui.comp_match_rows_sig3(
src/comp-match/useMatchSearch.tsuseMatchSearch.ts:1338if (componentKeyDoIds != null
src/comp-match/semanticTagUi.tssemanticTagUi.ts:7export const SEMANTIC_TAG_UI_ENABLED
src/comp-match/CompMatch.tsxCompMatch.tsx:1165tier1Tags: semanticTagAvailable
src/comp-match/useMatchSearch.tsuseMatchSearch.ts:426const tier1 = useMemo(
src/comp-match/useMatchSearch.tsuseMatchSearch.ts:1450await fillTier(tier0, 0);
packages/comp-sign/src/comp-match/scoring.tsscoring.ts:446export function computeScoreBreakdown(
packages/comp-sign/src/comp-match/helpers.tshelpers.ts:1766export function wrappedLineCount(
packages/comp-sign/src/text-metrics/predictTextBbox.tspredictTextBbox.ts:81export function classifyChar(
packages/comp-sign/src/text-metrics/predictTextBbox.tspredictTextBbox.ts:113export function simulateWrap(
packages/comp-sign/src/rank-candidates.tsrank-candidates.ts:191const pool =
packages/comp-sign/src/comp-match/scoringWeights.tsscoringWeights.ts:58export const DEFAULT_SCORING_WEIGHTS
packages/comp-sign/src/build-replacement.tsbuild-replacement.ts:116export function buildContentReplacement(
packages/comp-sign/src/comp-match/helpers.tshelpers.ts:708export function buildNodeTextMapFromRoles(
packages/comp-sign/src/comp-sign/signatureTree.tssignatureTree.ts:361export function shouldPreserveText(
packages/comp-sign/src/build-comp-signatures.tsbuild-comp-signatures.ts:140const bundle = computeVisualBundle(
packages/comp-sign/src/node-labeler/utils.tsutils.ts:733function similarTextLength(
packages/comp-sign/src/node-labeler/utils.tsutils.ts:817function sameIndividualStructure(
packages/comp-sign/src/comp-match/helpers.tshelpers.ts:346export type StoredVisualNode =