
    $[j&(                     |   d Z ddlZddlZddlZddlZddlZddlZddlZddlZej                  j                  d      Zd Zg dZdZdZej                  j!                  ed      Zej                  j!                  ed	      Zd
Zej                  j!                  ed      Z ej*                  d      Z ej*                  d      Zd Zd Zd Zd Zd Zedk(  rf eej>                        dkD  rej>                  d   ndZ e dk(  r e        y e eej>                        dkD  r e!ej>                  d         nd       yy)uI  
question_forge.py — 역질문 캡처 엔진 [CEO 혁신①: 자율주행 그림자모드 이식, 2026-07-19]

사상: 암묵지를 기다리지 말고 캐낸다. 지식 전체에서 '구멍'([확인요청]·미확인·기록없음)을
      찾아 '가치 높은 순'으로 CEO에게 하루 몇 개씩만 묻는다. CEO 답 → ①구멍 메움 ②증류쌍(파인튜닝 교재).
      평범한 문서 100개보다 정확히 겨눈 질문 1개가 값지다.

동작:
  scan  : 지식(md) 전체에서 구멍 채집 → 가치순 랭크 → 질문큐 md 생성 (CEO가 그 파일에 답만 적음)
  intake: CEO가 답을 적은 질문큐를 읽어 → 답변 지식 md + 증류쌍 jsonl로 흡수, 답한 항목은 큐에서 제거

실행: python question_forge.py scan [개수]     (기본 20개)
      python question_forge.py intake
    Nz~\.local\bin\claude.exec                    d| d   d| d   d| d   }t        j                  t        ddd	g|j                  d
      dd      }|j                  j                  d
d      j                         j                  d      d   j                         }|rt        |      dkD  r|dd S t        |       S # t        $ r Y t        |       S w xY w)uX   페이블로 구멍을 정확한 한 문장 질문으로. 실패하면 템플릿 폴백.u  너는 용접공정 코파일럿 SHIN이다. 아래는 도진웍스 지식에서 발견한 "구멍"(미확정 항목)이다. 대표(장인)에게 물어 이 구멍을 메울, 딱 한 문장짜리 구체적 질문을 한국어로 만들어라. 맥락에 있는 제품·부위·수치 종류를 반영해서 대표가 바로 답할 수 있게. 질문 문장만 출력.

[제품/맥락] productu   
[구멍이 있는 문장] gap_lineu   
[주변 문맥] ctxz-pz--modelzclaude-fable-5utf-8TZ   )inputcapture_outputtimeoutignore)errors
r      N   )
subprocessrun
CLAUDE_EXEencodestdoutdecodestripsplitlen	Exceptionphrase)gpromptrouts       question_forge.pysharp_questionr!      s    
 ]^^g\hjklvjwyz  |A  zBC NNJi9IJ!'w!7VXZhhoogho7==?EEdKANTTV3s8a<DS	!1 !9  !9s   B#B0 0	CC)u   E:\VLA시스템u+   E:\지식정제시스템\05_KNOWLEDGE\seedsu   E:\옵시디언)
EMBEDDINGSMODELSOUTPUTFINETUNEz	.obsidianz.trashu	   _QA뱅크_forgeu$   E:\VLA시스템\KNOWLEDGE\_역질문u   질문큐.mdu   _CEO답변_흡수본.mdu8   E:\VLA시스템\FINETUNE\distill_pairs\ceo_answers.jsonlz_asked_state.jsonu   \[?\s*(확인\s*요청|확인\s*필요|CEO\s*확인|미확인|미언급|기록에?\s*(없|남아있지 않)|지어내지)\s*\]?ur   용락|크랙|균열|전류|전압|갭|각장|용입|변형|예열|토치각|불량|안전|방향|치수|리비전c                 :   | j                  dd      j                  d      }dD ]:  }||v s|j                  |      }dj                  d ||dz   |dz    D              c S  t        j
                  j                  t        j
                  j                  |             S )N/\)seeds	KNOWLEDGEu   VLA시스템z / c              3   D   K   | ]  }|j                  d       r|  yw).mdN)endswith).0ps     r    	<genexpr>zproduct_of.<locals>.<genexpr>6   s     U);A1::eCTa);s           )replacer   indexjoinospathbasenamedirname)r8   partsanchoris       r    
product_ofr>   1   s    LLd#))$/E8U?F#A::Uq1uQU);UUU 9 77BGGOOD122    c                 x    t        j                  t        j                  | d            S # t        $ r |cY S w xY w)Nr   encoding)jsonloadioopenr   )r0   ds     r    	load_jsonrH   :   s+    		"''!g67	7Qhs   )+ 99c                 T
   t        t        t        dg i      j                  dg             }g }t        D ]  }t        j                  |      D ]  \  }}t        fdt        D              r!|D ]z  }|j                  d      st
        j                  j                  |      }t        j                  |dd      j                         j                  d      }t#        |      D ]  \  }	}
t$        j'                  |
      sdj                  d	 |t)        d
|	dz
        |	dz    D              d d }t
        j                  j+                  |      dz   t-        j.                  dd|
      d d z   }||v rdt1        t2        j5                  |            dz  z   }d|v r|dz  }d|v sd|v r|dz  }d|v r|dz  }|j7                  ||t9        |      ||
j;                         d d |d        }   t               g }}t=        |d       D ]F  }t-        j.                  dd|d         d d }||v r%|j?                  |       |j7                  |       H |d |  }t        j@                  tB        d       d d!t1        |      z  d"d#dd$tE        jF                  d%      t1        |      t1        |      fz  dd&dg	}t
        j                  jI                  tJ              xr d'tL        jN                  v}i }t#        |d      D ]N  \  }}|rtQ        |      n
tS        |      }|||d(   <   |d)||fz  d*|d+   xs d,z  d-|d.   z  d/|d0   z  dd1dd&dg	z  }P t        j                  tT        d2d3      jW                  dj                  |             g }t#        |d      D ]h  \  }}|j7                  d4tY        tE        jD                               d5z  |fz  |j                  |d(         xs tS        |      |d+   |d0   |d.   d6d7       j t        j                  t
        j                  j                  tB        d8      d2d3      jW                  t[        j\                  tE        jF                  d9      |d:d6d;             t_        ||D ch c]  }|d(   	 c}z        tE        jF                  d9      d<}t        j                  t        d2d3      jW                  t[        j\                  |d6=             ta        d>tT        t1        |      t1        |      fz         y # t         $ r Y w xY wc c}w )?Naskedc              3   &   K   | ]  }|v  
 y wN )r/   sdps     r    r1   zscan.<locals>.<genexpr>D   s     )Dq17Ds   r-   r   r   )rB   r   r    c              3   ^   K   | ]%  }|j                         s|j                          ' y wrL   )r   )r/   xs     r    r1   zscan.<locals>.<genexpr>L   s%     "^6PTUT[T[T]17796Ps   --r      r2   i,  |z\s+ <   GOLDr3   u	   공정서u   불량   u	   브리핑r   )keyscorer   srcr   r   c                     | d    S )NrZ   rM   )rR   s    r    <lambda>zscan.<locals>.<lambda>W   s
    7r?   )rY   r   P   Texist_oku2   # SHIN 역질문 큐 — 대표님께 묻습니다u[   > SHIN이 지식에서 발견한 "구멍"을 가치 높은 순으로 %d개 뽑았습니다.u   > 각 질문 아래 **답:** 줄에 한 줄만 적어주세요. 모르면 비워두면 다음에 다시 안 묻습니다(스킵하려면 "스킵").up   > 다 적으신 뒤 저에게 "역질문 흡수해"라고 하시면 지식에 넣고 이 큐에서 지웁니다.u:   _생성: %s | 미해결 구멍 총 %d개 중 상위 %d개_z%Y-%m-%dz---z--fastrY   z
## Q%d. %su   - 제품/맥락: %sr      —u   - 근거 문장: "%s"r   u   - 출처: `%s`r[   u	   **답:** wrA   zQ%d_%di F)idqr   r[   r   answeredu   질문큐.json%Y-%m-%d %H:%M)tsitems)ensure_asciiindent)rJ   rg   ri   u4   [역질문] 큐 생성: %s (%d개, 총 구멍 %d개))1setrH   STATEgetROOTSr7   walkanySKIPr.   r8   r6   rE   rF   readr   r   	enumerateGAP_PATsearchmaxr9   resubr   HOTfindallappendr>   r   sortedaddmakedirsOUT_DIRtimestrftimeexistsr   sysargvr!   r   QUEUEwriteintrC   dumpslistprint)nrJ   gapsroot_fnsfnr0   linesr=   lnr   rY   rZ   seenuniqr   htopr   	use_sharp_q_cacheidxrd   qjsonstrO   s                             @r    scanr   ?   s   	%'2/33GR@AED''$-JB3)D))8{{5)8GGLLR(WWQJOOQWWX\]U&u-EAr">>"-x(("^eC1q5M!a%6P"^^_c`cdC77++A.4rvvfb"7Mcr7RRCe|XCKK$4 5 99E|UaZU"b(HNEQJE"b(%1*%KKe
ST()rxxz$37GPS!U V .  ( ( $DD34FF62qx("-9hT[[^ 5 r(CKK$'?hknorkss a}  @BG4==YcKdfijnfoqtuxqyJzz|~  AF  HJ	KC
 z*Gxsxx/GIHC#Q!*N1q	5Qx'%9)>?'!J-7 1U8+E2 	 $ GGE3)//		#?EC#QHDIIK(86(A3'GG#<<%1>VAY!"9ah"#J-UD 	E $
 GGBGGLL"23S7KQQ

$--(89EJY^ghik 3 73a53 778N^@_	`BGGE3)//

2E0RS	
@E3s8UXY]U^C_
_`e !*(*` !8s   '5TT%
	T"	!T"	c                    | d   }| d   r| d   j                  d      d   ndj                         }t        j                  d|      rd|z  S t        j                  d|      rd	|z  S t        j                  d
|      rd|z  S t        j                  d|      rd|z  S t        j                  d|      rd|z  S t        j                  d|      rd|z  S t        j                  dd| d         j                  d      dd }|d|xs ddS )uV   구멍 문맥을 사람이 답하기 쉬운 질문으로. 템플릿 기반(결정적).r   r   r(   u
   이 부품u   전류|전압|조건u=   %s 용접조건(전류·전압)은 실제로 얼마였나요?u   갭u!   %s의 갭은 몇 mm로 잡나요?u   각장u'   %s의 각장 기준은 얼마인가요?u   방향|좌우|리비전u5   %s의 방향/리비전 확정 값은 무엇인가요?u   치수|높이|기준값u'   %s의 기준 치수는 얼마인가요?u   예열|열처리u?   %s는 예열이 필요한가요? 필요하면 몇 도인가요?u<   \[?\s*(확인요청|확인 필요|CEO확인|미확인)\s*\]?rU   r   z .-:Nr^   u    관련 — "u
   이 항목u3   ", 이 부분 실제 값/사실은 무엇인가요?)r   r   rx   rv   ry   )r   r   prodfrags       r    r   r   ~   s   
E(C+,Y<AiLs#B'\PPRD	yy(#.7vy}7}0}	yy&ID&PP	yyC )RUY)Y"Y	yy+S1:qtx:x3x	yy+S1:cfj:j3j	yy$c*3tw{3{,{66QSUWXYcWdekklrstwuwxDUY[_[oco[oppr?   c                     t         j                  j                  t              st	        d       y t        j                  t        d      j                         } t        j                  d|       }d}t        j                  t         j                  j                  t              d       dd	t        j                  d
      z  dg}|dd  D ]W  }|j                  dd      d   j                         }t        j                   d|      }t        j                   d|      }t        j                   d|      }|sl|j#                  d      j                         }	|	r|	dv r|dz  }|d|z  d|	z  d|r|j#                  d      ndz  dgz  }t        j                  t        dd      5 }
|
j%                  t'        j(                  t        j                  d      d|r|j#                  d      j                         nd||	|r|j#                  d      nddd      dz          d d d        Z |rt        j                  t*        dd      5 }
|
j%                  dj-                  |             d d d        t        j                  t        dd      j%                  d|t        j                  d
      fz         t	        d|t*        t        fz         y t	        d       y # 1 sw Y   xY w# 1 sw Y   xY w)Nu,   [역질문] 질문큐 없음 — 먼저 scanr   rA   z\n## Q\d+\.r   Tr_   rU   u   ## 흡수 %srf   r2   r   u   \*\*답:\*\*\s*(.+)u   출처: `([^`]+)`u   제품/맥락: (.+))u   스킵skip-z	**Q: %s**z- A(CEO): %su   - 출처: %sra   az%Y-%m-%d %H:%M:%Squestion_forge)rg   viar   rd   r   r[   Frk   rb   ul   # 역질문 큐 — %d개 흡수 완료(%s). 남은 미답 항목은 다음 scan에서 새로 채웁니다.
u6   [역질문] 흡수 완료: %d개 → %s + 증류쌍 %su1   [역질문] 답이 적힌 항목이 없습니다.)r7   r8   r   r   r   rE   rF   rs   rx   r   r   r:   DISTILLr   r   r   rv   groupr   rC   r   
ANSWERS_MDr6   )txtblockspicked	ans_linesbqlinemr[   r   ansfs              r    intaker      se   77>>% <=v
''%'
*
/
/
1CXXnc*FFKK(48^dmm4D&EErJIABZa #))+II,a0ii,a0yy/3(ggaj c44h!kE)>C+?$		!GM 	M	WWWcG4GGDJJdmm4G&HQaEIDJJqM,?,?,Ar%*cciilWY \ -23 6:: ; 54   WWZw71GGDIIi() 8 	sW-33{T]]#3456	7 	F&R\^eIffgAB 54 87s   !A8K!K!K	!K*__main__r2   r   r   rS      )"__doc__r7   rE   rx   r   globrC   r   r   r8   
expanduserr   r!   ro   rr   r   r6   r   r   r   rm   compileru   rz   r>   rH   r   r   r   __name__r   r   cmdr   rM   r?   r    <module>r      s2   5 4 4 4WW :;
 	ac
1
Wn-WW\\'#<=

E
W12
"**  X  Ybjj  G  H3
<a~q!CH zSXX*#((1+C
hSXX!2S!; r?   