$schema: "merge-topology-gate-schema-v1"
description: "Merge Topology Gate 7 metadata schema (회장 §1, 2026-05-08)"

# 참조: memory/feedback/feedback_merge_topology_gate_260508.md §1
# 적용: 모든 dispatch task는 아래 7 필드를 task spec YAML 블록에 명시해야 한다.

fields:
  expected_files:
    type: list
    item_type: string
    required: true
    item_regex: '^[\w/.\-+*]+$'
    description: "본 task가 변경할 예상 파일 목록. 비어있을 수 없다."

  risk_area:
    type: string
    required: true
    enum:
      - verifier_layer
      - ssot
      - ci_workflow
      - migration
      - lifecycle_state
      - dispatch_layer
      - governance
      - parallel_policy_enforcement
      - content
      - other
    description: "변경 영향 risk 영역. 복수 영역은 '/' 구분 문자열로 기재 가능 (파싱 시 split 처리)."
    extensible: true

  dependency:
    type: list_or_none
    item_type: string
    required: true
    none_value: "none"
    item_regex: '^task-\d+(\.\d+)?(\+\d+)?\.merged$'
    description: "선행 PR/task 머지 필요 여부. 없으면 'none'. 각 항목은 task-XXX.merged 또는 task-XXX.N+M.merged 형식."

  parallel_policy:
    type: string
    required: true
    enum:
      - parallel_safe
      - limited_parallel
      - serial_only
    description: "병렬 허용 분류. parallel_safe=교집합 0 안전 병렬, limited_parallel=순서 있는 제한 병렬, serial_only=직렬 전용."

  merge_queue_position:
    type: int_or_na
    required: true
    min_int: 1
    na_value: "n/a"
    description: "머지 순서 강제. parallel_safe → 'n/a' 강제. limited_parallel|serial_only → 양의 정수 강제."

  stale_recheck_required:
    type: bool
    required: true
    description: "main 변경 시 재검증 의무 여부. true=main 변경 발생 시 dispatch 이전 재검증 필수."

  cherry_pick_allowed:
    type: string
    required: true
    enum:
      - "false"
      - recovery_only
    # 주의: YAML 파싱 시 boolean false로 파싱될 수 있음. 파서는 bool False도 "false"로 처리해야 한다.
    description: "체리픽 허용 여부. 'false'=정상 경로 (기본값). 'recovery_only'=복구 경로 + 회장 명시 승인 evidence 필수."

validation_rules:
  - "expected_files 항목은 비어있을 수 없다"
  - "parallel_policy=parallel_safe면 merge_queue_position=n/a 강제"
  - "parallel_policy=limited_parallel|serial_only면 merge_queue_position 양의 정수 강제"
  - "cherry_pick_allowed=recovery_only면 회장 명시 승인 evidence 필수 (REQUIRE_CHAIR_OVERRIDE)"
  - "dependency 항목은 'none' 단일값 또는 task-XXX.merged 패턴 리스트"
  - "risk_area가 '/' 구분 복수값인 경우 각 부분이 enum에 포함되어야 한다"
  - "stale_recheck_required는 bool (true/false)"
