
    Ojz*                        d Z ddlmZ ddlZddlmZmZmZmZm	Z	 ddl
mZ ddlmZ dZej                   Z G d d	e      Zdd
ZddZ	 	 ddZddZddZ	 	 ddZddZ	 	 	 	 ddZ	 	 ddZ	 	 ddZy)u  조사 결과 → **묶음 멤버**. ★여기서 의무를 만들지 않는다.

## 무엇을 하나 / 안 하나

Codex BLOCK (2026-09-01) — 「bundle projection 이 acquisition 완료 뒤 context
멤버를 **발명하면 안 됩니다**. 중앙 참조 조사 **전에** reference obligation
plan 을 만드십시오.」

    앞 판   조사 끝난 뒤 맥락 멤버를 지어냈다 → 같은 조사 결과·같은 사진에
            쓰임만 다시 적었다. 부모가 비대상이면 복구도 못 했다.
    지금    의무는 `grounding_reference_obligations.plan` 이 **조사 앞에서**
            세운다. 여기는 그 결과를 **옮기기만** 한다.

## 못 구한 것도 남긴다

`reference_unavailable` 인 의무는 이미지 required 를 안 만들지만, **논리
의무와 처지는 durable 하게 남는다** — 나중 UI 가 「무엇이 없었는지」를 찾을 수
있어야 한다 (Codex · 09-01).
    )annotationsN)AnyDictListOptionalSequence)grounding_entity_contract)PURPOSE_DETAILz4.202609020800c                      e Zd ZdZy)ProjectionErroruD   묶음으로 옮길 수 없다. ★조용히 건너뛰지 않는다.N)__name__
__module____qualname____doc__     f/Users/manta/Documents/Projects/TheRoad-I1/backend/app/modules/pipeline/grounding_bundle_projection.pyr   r   &   s    Nr   r   c                d    t        | j                  d      xs i j                  |      xs d      S )N
ledger_row )strget)rownames     r   
_row_fieldr   *   s+    %+006<"==r   c                J    | j                  d      xs i j                  d      S )Nr   purpose)r   )r   s    r   _purposer   .   s!    GGL!'R,,Y77r   c                  ddl m} g }| D ]d  }t        |      }|st        |d      }|st	        |j                  d      d      t        |j                  d      xs i j                  d      xs |g      }t        |j                  d      xs d	      }	|t        |      ||	t        |j                  d
      xs d	      |j                  d      t        |j                  d      xs d	      |j                  d      xs i j                  d      d}
t        |      s%|j                  i |
dddt        |             :|j                  i |
t        ||t        |      ||             g |S )u  중앙 조사 결과 줄들 → `plan_bundle` 멤버들. ★쓰임은 **의무가 정했다**.

    Args:
        rows: `grounding_central_acquisition.run(...)["rows"]`. 그 `ledger_row`
            는 `grounding_reference_obligations.plan` 이 낸 의무다.
        content_sha_of: `(row) -> str|None`. 고른 사진의 내용 해시.
            ★이 모듈이 파일을 안 읽는다 — 읽는 자리는 부르는 쪽이다.
        coordinate_of: `(row) -> {"source": …, "asset_id"|"path": …}`.

    Returns:
        멤버 목록. ★`selected` 가 아닌 것도 **논리 의무로 남는다** —
        `plan_bundle` 이 이미지 required 를 안 만들 뿐이다.
    r   grounding_reference_bundlefinal_idresearch_subject_idu     의무에 `final_id` 가 없다r   coversoutcomer   whywhy_unboughtcontext_owner)subject_final_idr   r$   r%   r&   r'   obligation_subject_idr(   Nmember_identitycontent_sha256)app.modules.pipeliner!   r   r   r   r   listr   _usableappend_why_not	_selected)rowscontent_sha_ofcoordinate_ofrboutrr   subjectr$   r%   bases              r   members_from_rowsr<   2   s     F "C1+Q
+!55./22RSU Uquu\*0b55h?LG9MaeeI&,"- 'CLquuU|)r*EE.1%(/D)E)K%LeeL17R<<_M
 qzJJ '$ '4*.'"1+' ( 

 Hd Hi7CL(6G H 	I3 6 Jr   c                0    ddl m} |j                  |       S )u  이 줄을 **붙여도 되나**. ★뜻을 여기서 다시 적지 않는다.

    ★★★실측 (Codex 재리뷰 2026-09-02): 집행자가 **둘**인데 정책 lane 하나만
    막아 두고 「붙는 것 0」이라고 보고했다. 배경 sidecar 는 `outcome ==
    selected` 만 보고 그대로 붙이고 있었다 — 아무도 안 본 사진이 그림의
    근거가 된다. 판단은 `reference_acquisition` **한 곳**이 한다.
    r   reference_acquisition)r.   r?   usable_as_referencer   ras     r   r0   r0   c   s     A!!#&&r   c                    ddl m} t        | j                  d      xs d      |j                  k7  rddiS |j
                  |j                  |       ddS )	uP   왜 안 붙었나 — **못 구한 것**과 **아직 안 본 것**을 가른다.r   r>   r%   r   not_attachedNu|   거친 종류로는 골랐지만 **그 시대·그 지역 것인지는 아무도 안 봤다**. 논리 의무로만 남는다)rD   fidelityu   ★means)r.   r?   r   r   STATUS_SELECTEDFIDELITY_UNVERIFIEDfidelity_ofrA   s     r   r2   r2   p   sX    @
3779#$(:(::%%22s+OQ Qr   c                    ddl m} t        | j                  d      xs d      }|st	        | d| d       ||       }|st	        | d| d       ||||      |d	 ||       d
t        | d
      xs d iS )Nr   )r,   identityr   /uU    에 획득 신원이 없다 — 무엇으로 조사했는지가 값에 안 실린다u,    가 selected 인데 내용 해시가 없다)r)   r   acquisition_identityr+   parent_final_id)+app.modules.pipeline.grounding_host_contextr,   r   r   r   r   )r   r:   r   r5   r6   r,   identshas           r   r3   r3   |   s    K
#)r*Eiq	 "# #$ 	$ 
Ciq	!MNP 	P +$g!&( 	
 
 	Js,=>F$ r   c                   ddl m} | j                  d      xs i }t        |j                  d      xs d      dk7  ryt        | j                  d      xs |j                  d      xs d      }t        | j                  d	      xs |j                  d	      xs d      }|r|sy ||      dk7  ry ||      d
k7  ry| | S )u  아웃룩 줄 → 기존 **인물 아웃룩 참조 신원** `C##O##`. 못 만들면 `None`.

    ★★★**검증된 결속에서만** 만든다 (Codex 2026-09-01) — 이름·부분문자열 0.
    `grounding_outlook_binding` 이 이미 phase3 로 확인한 `parent_final_id`
    (인물)와 `final_id`(아웃룩)를 **그대로 잇는다**. 둘 중 하나라도 없거나
    갈래가 안 맞으면 **안 지어낸다**.
    r   )owner_of_final_idr   
owner_typer   outlookNr"   rM   	character).app.modules.pipeline.grounding_entity_contractrR   r   r   )r   rR   ledoidcids        r   outlook_ref_idrZ      s     '',

%2C
377< &B'94
cggj!>SWWZ%8>B
?C
cgg'(LCGG4E,FL"
MCc*,U3%=r   c                  ddl m} |xs dD ch c]+  }t        |xs d      j                         s!t        |      - }}g }| D ]  }t	        |      }	|	r|	|vrt        |j                  d      xs d      }
d|	dt        d|	gd|
d	t        |j                  d	      xs d      d
|j                  d
      dt        |j                  d      xs d      dd|j                  |j                  |j                  |j                  i
}t        |      s$|j                  i |dddt        |             |j                  i |t        ||	t        ||              |S c c}w )u  아웃룩 조사 결과 → **인물 아웃룩 자리**에 붙을 멤버들.

    Args:
        required_ref_ids: 이 컷의 카드가 **이미 요구하는** `C##O##` 들.
            ★★이것이 「그 복장이 이 컷에서 실제로 쓰이나」의 정본이다 —
            조사 결과가 **새 짝을 만들지 않는다** (Codex 2026-09-01).
            카드에 없는 짝이면 그 사진은 이 컷에 안 붙는다.

    ★새 슬롯도 새 구매자도 만들지 않는다 — 기존 `character_outlook` 자리에
    **덧붙이고**, 값이 `grounding:…` 앞머리라 기존 합성본과 안 겹친다.
    그래서 합성본이 붙어 있다고 고증 참조가 채워진 것이 되지 않는다.
    r   r    r   r   r%   r)   r   r$   r&   r'   r*   r#   r(   Nr+   )r.   r!   r   striprZ   r   r
   MEMBER_KIND_KEYOUTLOOK_KINDMEMBER_ROLE_KEYOUTLOOK_ROLEr0   r1   r2   r3   )r4   required_ref_idsr5   r6   r7   xwantr8   r9   ref_idr%   r;   s               r   outlook_members_from_rowsre      sw     F-33M3qAG8J8J8LCF3DM "C"t+aeeI&,"- ~vh	73quuU|)r*AEE.1#S/D)E)K%LT
 qzJJ '$ '4*.'"1+' ( 

 Hd Hi6>(6G H 	I/ 2 J7 Ns
   "EEc                    ddl m} | D cg c]B  }t        |j                  d      xs d      |j                  k7  rt        j                  |      D c}S c c}w )u9  ★**공개 끝점** — 붙을 사진이 없는 논리 의무들.

    ★2026-09-02: **「골랐지만 아직 아무도 안 본 것」은 여기 안 든다** —
    갈래가 다르다(`unverified_members`). 못 구한 것과 섞으면 사람 검토
    화면이 무엇을 봐야 하는지 못 고른다.
    r   r    r%   r   )r.   r!   r   r   OUTCOME_SELECTEDcopydeepcopy)membersr7   ms      r   unavailable_membersrl      sY     F&- Cg155#)r*b.A.AA MM!g C C Cs   AAc                    ddl m} | D cg c]5  }|j                  d      |j                  k(  rt	        j
                  |      7 c}S c c}w )u   ★**공개 끝점** — 골랐지만 **고증을 아무도 안 본** 것들.

    못 구한 것과 **섞지 않는다** — 사람 검토 화면이 볼 것은 이쪽이다.
    r   r>   rD   )r.   r?   r   rG   rh   ri   )rj   rB   rk   s      r   unverified_membersrn      sO     A&- @guu^$(>(>> MM!g @ @ @s   :A)r   Dict[str, Any]r   r   returnr   )r   ro   )r4   Sequence[Dict[str, Any]]rp   List[Dict[str, Any]])r   ro   rp   bool)r   ro   rp   ro   )r   ro   r:   r   r   r   rp   ro   )r   ro   rp   zOptional[str])r4   rq   ra   zSequence[str]rp   rr   )rj   rq   rp   rr   )r   
__future__r   rh   typingr   r   r   r   r   r.   r	   _gcrN   r
   PROJECTION_CONTRACT_VERSIONENFORCE_BY_BACKGROUND_SIDECARENFORCES_GATERuntimeErrorr   r   r   r<   r0   r2   r3   rZ   re   rl   rn   r   r   r   <module>r{      s   & #  6 6 A F
 /  11Ol O>8.(<.b
'	Q0>.2-0=- 1E-`C1C	@0	@r   