id: R8
version: 3
bundle: search
name: 경계 밖에 글이나 차트, 표를 가진 후보가 상위에 옴
gold: false
status: rule
unit: component
sample:
  conditions:
  - O
  - O_v10
  - a1
  - a
  - c
  scope: top10
question: |
  이 후보는 부분 매치(경계가 DO 의 root 가 아님)이고, 경계 밖(같은 DO 에 함께 들어가는 나머지)에 사용자 글을 받지 못하는 요소가 있는가.
  - outside_data: 경계 밖에 차트나 표 요소가 있어 템플릿 수치, 범례가 그대로 들어간다. 차트 노드 없이 도형으로 그린 차트(간트 막대 등)도 형제 경계의 차트 카테고리로 잡는다.
  - outside_template: 경계 밖 글 노드가 대치되지 않아 템플릿 원문이 남는다.
  - outside_placeholder: 위 둘은 없고 경계 밖 글이 임시 문구로 바뀐다(위성 임시 문구 포함, 관찰값).
  - none: 경계 밖에 그런 요소가 없다.
  outside_data, outside_template 인 후보는 검색이 피할 수 있었는지로 둘로 가른다(rule_extra outside_avoidable).
  - ① 피할 수 있었는데 못 피함(avoidable, 결함): 같은 질의, 같은 슬롯의 상위 10 안 아래 순위에 경계 밖 결함이 없고(none 또는 outside_placeholder) 온전한(R4 판정 exact) 후보가 있었다.
  - ② 공급 부족(supply, 관찰값, 결함 아님): 아래 순위에 그런 후보가 없었다. 순위 11 이하는 보이지 않으므로 ① 은 하한값이다.
  규칙(outside_element_left, outside_avoidable)이 답을 정한다. LLM 을 부르지 않는다(model rule, 비용 0).
inputs:
- outside_nodes
answers:
  kind: categorical
  options:
  - key: none
    label: 경계 밖 요소 없음
  - key: outside_placeholder
    label: 경계 밖 임시 문구(관찰)
  - key: outside_template
    label: 경계 밖 템플릿 원문 글
  - key: outside_data
    label: 경계 밖 차트, 표 데이터
defect:
  bad:
  - outside_data
  - outside_template
  rule_extra: outside_avoidable
  rule_exempt_extra:
  - supply
aggregate: ratio
truth:
  kind: rule
  rule: outside_element_left
allowed:
- 경계 밖 글이 임시 문구로 바뀌는 것은 대치 규약대로다(mor-2627 설계 127-128). 결함이 아니라 관찰값(outside_placeholder)으로 센다. 그 수는 규칙 근거 글(evidence)에 남는다. 위성 임시 문구는 MOR-2674 결정 전까지 결함이 아니다.
- 경계 밖의 Marker, Decoration, Separator, Annotation 원문과 구조 토큰, 문서 제목 구제로 들어간 사용자 글은 결함이 아니다.
- 상위 10 안 아래 순위에 경계 밖 결함이 없는 온전한 후보가 없었던 공급 부족(rule_extra supply)은 결함이 아니다(평가틀 47 결정 1, R4 의 공급 부족 제외와 같은 모양).
sources:
- 37-residue-attribution.md §2.3, §2.4, §3, §6 제안 5
- iui packages/comp-frame-client/src/replacement.ts:557-561(대치 입력 = DO sheet 전체)
- iui packages/comp-frame-shared/src/outsideText.ts:120-145(경계 밖 목록은 글 노드만)
- iui rust/comp-pass/crates/comp-frame-core/src/rank.rs:387-394(경계 밖 벌점은 글 노드만)
- iui docs/superpowers/specs/2026-10-12-mor-2627-replacement-policy-design.md:460-461(차트 비우기는 정책 범위 밖)
threshold:
  basis: a1
  value: null
model:
  default: rule
  current: rule
reps: 1
observe_only: false
purpose: "부분 매치 후보의 경계 밖(같은 DO 에 함께 들어가는 나머지)에 사용자 글을 받지 못하는 차트, 표 데이터나 대치되지 않는 템플릿 글이 있어, 이 장 내용과 무관한 것이 결과에 남는 일을 잡는다. 경계 밖 데이터 요소의 책임은 검색과 대치 둘 다이고, 검색은 피할 수 있었는데(풀에 그런 요소 없는 온전한 후보가 있었는데) 못 피한 것이 결함이다(평가틀 47 결정 1). 그래서 결함은 ① 같은 질의, 같은 슬롯의 상위 10 안 아래 순위에 경계 밖 결함이 없고 R4 판정 exact 인 후보가 있었던 것만 세고, ② 그런 후보가 없었던 공급 부족은 결함이 아니라 관찰값으로 남긴다(R4 의 공급 부족 제외와 같은 모양, 유저 결정 10/27, 기본품질 14 결정 4). 순위 11 이하는 export 에 없어 보이지 않으므로 ① 은 하한값이다. 원인 메모: 검색의 경계 밖 벌점(iui rank.rs:387-394, outsideText)은 글 노드만 세고 차트, 표 데이터 요소는 벌점에 없어, 순위 함수가 데이터 요소를 피할 수단이 없다. 그래도 결정 1 은 결과 순위로 「피할 수 있었는가」를 묻기에 그대로 센다. 검색 링크의 책임이고 후보의 경계 밖 노드를 규칙으로 보며, 경계 밖 임시 문구는 관찰값이다. 유저가 받는 DO 전체에 보이는 잔존은 E3 몫이다."
changelog:
- 'v1 (2026-10-20): 신설(37 문서 6절 제안 5). 규칙으로만 재는 관찰 카드. 결함 = 경계 밖 차트, 표 데이터 요소 수 > 0 또는 경계 밖 템플릿 원문 글 > 0. 경계 밖 임시 문구(위성 포함)는 분해값으로 따로 센다. 경계 밖 차트를 검색 결함으로 확정할지는 결정 D1 뒤에 정한다(그 전까지 observe_only).'
- 'v2 (2026-10-20): 데이터 요소에 「경계 밖 형제 경계의 색인 카테고리가 차트(DATASET-ONLY 16종에서 글 격자 표 셋을 뺀 13종)인데 그 아래 Chart, Table 노드가 없는 경우」를 더했다(도형으로 그린 간트). 37 문서의 형제 경계 카테고리 셈과 맞대어 R8 이 놓친 단위 2 개(O 전체)를 찾은 결과다(43 문서 3절). 37 문서의 302 장과 R8 441 의 차이는 정의 차이다(302 = 경계 밖 글이 없어 벌점 0 인 부분집합, 단위도 single 항목 대 상위 10 장).'
- 'purpose 추가(10/24)'
- 'v3 (2026-10-27): 유저 결정 10/27 03시(기본 카드로 올림). 평가틀 47 결정 1 의 「피할 수 있었는데 못 피한 것이 결함」 조건을 R4 의 공급 부족 제외와 같은 층, 같은 모양으로 넣었다(기본품질 14 결정 4). rule_extra 를 outside_placeholder_count 에서 outside_avoidable(clean, avoidable, supply)로 바꾸고 defect.rule_exempt_extra: [supply] 로 공급 부족을 보드 규칙값의 결함에서 뺀다(분모에는 남는다). 대안 = 같은 질의, 같은 슬롯, 이 순위 아래(상위 10 안) 후보 가운데 R8 판정이 none 또는 outside_placeholder 이고 R4 판정이 exact 인 것(결정 1 의 「그런 요소 없는 온전한 후보」, 온전 = R4 exact 는 14 문서 Q7). 아래 순위를 훑는 함수는 R4 의 것(clean_in_pool_but_unclean.first_below)을 같이 쓴다. 순위 11 이하는 보이지 않아 하한값이다. 원인 메모: 검색 벌점(rank.rs:387-394)은 글 노드만 세고 차트, 표 데이터 요소에는 벌점이 없다. observe_only 를 내렸다. 경계 밖 판정(outside_element_left, _outside.py)은 그대로라 R8 답과 E3 입력, D6, P2 값은 바뀌지 않는다. O2k: v2 결함 719(2.53%, 전부 outside_data) -> v3 ① 493(1.73%), ② 공급 부족 226.'
