
    iL                        d Z ddlmZ ddlmZ ddlmZ ddlmZm	Z	m
Z
  ed       G d	 d
             ZddZddZddZ	 	 	 	 	 	 ddZy)u  Draft markdown writer for cycle_advancer PoC.

YAML frontmatter 스키마 (cycle_advancer/v1)
-------------------------------------------

::

    ---
    schema: cycle_advancer/v1
    source_task_id: task-2485
    proposed_task_id: task-2486
    classification: MERGE_PENDING_DEPENDENCY
    proposal_only: true
    ready_for_dispatch: false
    chairman_required: false       # 합의 시 false, 충돌 시 true
    conflict_summary: null         # 충돌 시 채움
    generated_at: 2026-05-08T00:00:00Z
    generator: cycle_advancer/v1-mock
    deterministic_seed: cycle_advancer-v1-mock
    ---

본 PoC는 **draft md 파일만** 생성한다. 실제 ``.done`` / ``.escalate`` /
``.fail`` 파일이나 dispatch 호출은 절대 수행하지 않는다.
    )annotations)	dataclass)Path   )DETERMINISTIC_SEEDGENERATOR_IDSCHEMA_VERSIONT)frozenc                      e Zd ZU dZded<   ded<   ded<   ded<   ded	<   ded
<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   y)DraftPayloaduK  draft md를 구성하는 모든 필드.

    Attributes:
        source_task_id: 입력 evidence의 task_id.
        proposed_task_id: cycle_advancer가 제안한 다음 task_id.
        classification: 입력 task의 본질 분류.
        chairman_required: 충돌 시 ``True``.
        conflict_summary: 충돌 사유 (없으면 ``None``).
        generated_at: ISO8601 UTC timestamp (``Z`` 접미사 포함).
        consensus_root_cause: 합의된 root cause 요약 (1단계).
        candidate_root_causes: 마아트/외부 AI 후보 (3개 권장).
        evidence_summary: 입력 evidence 요약 (분류/PR/blocker).
        scope: 제안 범위 한 줄.
        affected_files: 다음 task가 건드릴 파일.
        allowed_resources: 격리 리소스 화이트리스트.
        next_steps: chain 의존 다음 단계 설명.
    strsource_task_idproposed_task_idclassificationboolchairman_requiredz
str | Noneconflict_summarygenerated_atconsensus_root_causeztuple[str, ...]candidate_root_causesevidence_summaryscopeaffected_filesallowed_resources
next_stepsN)__name__
__module____qualname____doc____annotations__     =/home/jay/workspace/tools/poc/cycle_advancer/output_writer.pyr   r   "   sV    $   **%%J##&&r"   r   c                J    | yt        | t              r| rdS dS t        |       S )u   YAML 스칼라 직렬화 (frontmatter 한정, 안전한 케이스만 처리).

    PoC 범위에서 frontmatter에 들어가는 값은 결정적이고 단순하므로
    별도 PyYAML 의존성을 두지 않고 직접 직렬화한다.
    nulltruefalse)
isinstancer   r   )values    r#   _yaml_scalarr*   E   s-     }%v+G+u:r"   c                   ddt          dt        | j                         dt        | j                         dt        | j                         dddt        | j
                         d	t        | j                         d
| j                   dt         dt         dg}dg}|j                  d       |j                  d       |j                  d| j                          |j                  d       | j                  D ]  }|j                  d|         |j                  d       |j                  d       |j                  d       | j                  D ]  }|j                  d|         |j                  d       |j                  d       |j                  d       |j                  d| j                          |j                  d       | j                  D ]  }|j                  d| d        |j                  d       | j                   D ]  }|j                  d|         |j                  d       |j                  d       |j                  d       |j                  d       |j                  d       |j                  dt        | j
                                | j                  |j                  d       n/|j                  d       |j                  d | j                          |j                  d       |j                  d!       |j                  d       | j"                  D ]  }|j                  d|         |j                  d       d"j%                  ||z         S )#u#  draft md 본문 문자열을 결정적으로 렌더링한다.

    동일 ``payload`` → 동일 출력 (줄바꿈/공백/순서 모두 고정).

    Args:
        payload: 렌더링할 :class:`DraftPayload`.

    Returns:
        frontmatter + 5개 섹션을 포함한 markdown 본문.
    z---zschema: zsource_task_id: zproposed_task_id: zclassification: zproposal_only: truezready_for_dispatch: falsezchairman_required: zconflict_summary: zgenerated_at: zgenerator: zdeterministic_seed:  u   ## 본 task의 본질z- consensus root cause: u5   - mock 후보 (마아트 facts + 외부 AI strategy):z  - u   ## 입력 evidence 요약z- u   ## 제안 범위z	- scope: z- affected files:z  - ``z- allowed resources:u   ## 합의 vs 충돌z- proposal_only: truez- ready_for_dispatch: falsez- chairman_required: u6   - 상태: 합의 (마아트/외부 AI critique 일치)u   - 상태: 충돌z- conflict_summary: u   ## 다음 단계
)r	   r*   r   r   r   r   r   r   r   r   appendr   r   r   r   r   r   r   join)payloadfrontmatter_lines
body_lines	candidatelinepathresourcesteps           r#   render_draftr9   S   sl    	
>"#
<(>(>?@A
\'*B*BCDE
<(>(>?@A#
l7+D+DEFG
\'*B*BCDE
--./
l^$
123   DJ-.b01M1M0NOPMN22 .	D,-.b12b(( 'Btf+&'b()b	'--12)*&& +E$q/*+,--- -D
+,-b+,b-.34
W-F-F GHI 'RS,-01I1I0JKLb()b"" 'Btf+&'b99&344r"   c                8    |j                  dd      }d|  d| dS )u  draft md 파일명을 결정적으로 산출한다.

    예: ``proposed_task_id='task-2486'``,
    ``fixed_timestamp='2026-05-08T00:00:00Z'``
    → ``draft-task-2486-2026-05-08T00-00-00Z.md``.

    Args:
        proposed_task_id: 제안된 다음 task_id.
        fixed_timestamp: ISO8601 (``Z`` 접미사) timestamp.

    Returns:
        파일시스템에 안전한 파일명 (``:`` → ``-`` 치환).
    :-zdraft-z.md)replace)r   fixed_timestampsafe_tss      r#   filename_forr@      s-     %%c3/G$%Qwis33r"   c                    |j                  dd       |t        | j                  | j                        z  }|j	                  t        |       d       |j                         S )u  draft md를 출력 디렉토리에 기록하고 그 경로를 반환한다.

    Args:
        payload: 렌더링할 :class:`DraftPayload`.
        output_dir: 출력 디렉토리 (없으면 생성).

    Returns:
        실제로 기록된 파일의 절대 경로.
    T)parentsexist_okzutf-8)encoding)mkdirr@   r   r   
write_textr9   resolve)r1   
output_dirtargets      r#   write_draftrJ      s`     TD1,  '"6"6 F l7+g>>>r"   N)r)   zstr | bool | Nonereturnr   )r1   r   rK   r   )r   r   r>   r   rK   r   )r1   r   rH   r   rK   r   )r   
__future__r   dataclassesr   pathlibr   r,   r   r   r	   r   r*   r9   r@   rJ   r!   r"   r#   <module>rO      sj   2 # !  > > $     DJ5Z4$ 
r"   