배경#
Problem/Decision → Project/Person 관계 recall이 바닥이던 문제(root cause: missing_graph_endpoint — 관계 엔드포인트가 활성 그래프 노드로 해소 안 됨). 프로젝트 추론은 원문에 없어 불가능, 신뢰 가능한 신호는 화자(제기자) — 결정론적. 여기서 RAISED_BY(Problem/Decision → Person, "누가 발언했나") 도입.
Stage 1-3 (이전 배포, 커밋 3239e8a/06910cb)#
- verbatim 근거 계약:
locate_verbatim_span()— 근거가 원문의 유일한 축자 substring일 때만 offset 반환. RKA_VERBATIM_EVIDENCE 기본 ON(A/B 증명 후). speaker_linking_pass: verbatim 근거 위치 → 직전[화자][mm:ss]라벨 → 유일 참석자 Person 해소 → RAISED_BY 방출. not_verbatim/화자N/다중화자/모호 Person이면 추측 없이 skip.DETERMINISTIC_ONLY_GRAPH_RELS={RAISED_BY}— LLM 관계 어휘에서 제외, 화자 패스만 생성.- feedback.py step 2.5: promote 직전 RAISED_BY 생성 → 엔드포인트와 같은 batch 승격.
③ RAISED_BY 답변 활용 — person_ongoing_work 스킬 연결 (2026-07-24)#
- 변경:
rka/ontology/knowledge_skills.yamlperson_ongoing_work. Person <-RAISED_BY- Problem/Decision traverse(direction: in, rel_types: [RAISED_BY]) 2스텝(raised_problems, raised_decisions) 추가, problem_pool·decision_pool inputs 맨 앞 합류. 결정론적 귀속이라 provenance 공동출현보다 신뢰 높아 pool 앞. - project_status 미포함: RAISED_BY는 본질적으로 Person 엣지, 프로젝트 문맥 문제의 제기자는 답변 1홉 확장에서 자동 노출. 과설계 회피.
- 커밋
1208c31. 4개 앱 서비스(console/ask-api/mcp/slackbot) 재배포 healthy. 배포 이미지에서 raised_problems/raised_decisions 스텝 확인.
정직한 caveat (검증됨)#
- 배포 직후 그래프 RAISED_BY 엣지 = 0. 기존 노드 근거는 paraphrase라 소급 불가(측정: 기존 근거 2/220만 verbatim = 0%). 효과는 배포 이후 처리되는 새 회의부터 누적. 실제 QA 검증은 다음 실제 회의 처리 후.
- Stage 2 A/B(0703 회의): verbatim OFF→ON 시 P/D locatable 0%→100%, recall 손실 없음. 단 speaker 해소는 3/12(나머지 9 = 화자N diarization 한계) — 병목이 verbatim(해결)에서 diarization으로 이동.
다음 할 일#
- ① diarization 개선(화자N 감소 → RAISED_BY 수율↑) — H100 영역.
- ② 다음 실제 회의로 end-to-end 검증(verbatim + speaker 패스).
- ④ 소급 불가(deferred).
관련 테스트 37개 통과(knowledge_skills/context_executor/ontology/speaker_linking_pass/locate_verbatim_span).
Sagwan Revalidation 2026-07-24T09:21:52Z#
- verdict:
ok - note: 최신 배포·한계·후속조건이 명시돼 현재 재사용 가능함
Sagwan Revalidation 2026-07-26T11:50:29Z#
- verdict:
ok - note: 이전 검증 후 이틀뿐이며 배포·caveat·권장안 모두 여전히 유효함
음성지문 앵커 구축 — 사용자 귀 검증 (2026-07-28)#
enrollment 오염 대책으로 사람당 불변 클린 앵커를 만드는 중. 사용자가 후보 구간을 귀로 검증.
확정 9명 앵커 (data/meetings/_anchor_verify.md): 권우현(081552Z 0:00–1:15 자기소개), 김인수(083315Z 6:39–8:00), 무르타자(082632Z 21:44–23:10 영어), 신현주(083315Z 42:46–44:10), 최인호(081552Z 4:42–6:05), 임동성(081552Z 3:06–4:10), 문승연(012430Z 11:18–13:00 + 20260720 3:32–4:40), 송세경(083315Z 70:13–71:45, 73:16+ 오염 제외), 이호준(083211Z 5:10–7:15). 신현미=제외(단일 장발화 없음).
교훈들: 1. 앵커 길이는 ASR 전사 텍스트가 아니라 voiced audio(파형) 기준으로 재야 함. 글자밀도 필터는 조용하지만 발화 있는 구간(전사가 "."로 나옴)을 과소평가 → 임동성 3:06–4:10(~64s)을 21s로 오판했음. 음성 앵커는 파형을 임베딩하므로 전사 실패 무관. 2. 유사목소리군 {문승연·임동성·최인호(+송세경 대표는 별도)}는 회의 간 라벨이 서로 뒤바뀜 — 격리된 3뱅크(문승연·최인호·무르타자)와 일치. 자동 후보 선정이 오염을 그대로 노출. 사람 귀가 유일한 ground truth. 3. transcript 라벨 오염이 그래프 지식 귀속까지 전파되진 않았음: "자비스 UI 애니메이션" Task는 최인호(ASSIGNEE)로 정상. 삭제할 오귀속 없음(문승연엔 NoMachine GUI 인프라만). 4. 송세경(대표) 뱅크의 717초 "네네네/선물선물" 구간 = 과병합 오염, 앵커 금지.
다음(구현: codex, 검토: 나): (a) 앵커 저장 스키마 {name}_anchor.npy 불변, (b) enroll_from_map.py에 앵커 대비 코사인 게이트(τ_abs + 경쟁마진) 추가 후 통과분만 흡수·실패는 quarantine, (c) 격리 3뱅크 앵커로 재건. H100 = 공유 프로덕션이라 스테이징 주의.
전처리 A/B — 화자 임베딩 분리도 (2026-07-28)#
단일 지향성 마이크(작고 울림) 환경에서 남성 클러스터 혼동(clean 앵커끼리 0.72~0.77)을 전처리로 줄일 수 있는지 측정. H100 diar-env(torchaudio/scipy/soundfile만; nara_wpe·DeepFilterNet·noisereduce 없음)에서 numpy/scipy 직접 구현. 앵커+테스트 동일 적용. 스크립트 tools/anchors/preproc_ab.py.
결과 (raw→combo): 남성클러스터 mean offdiag 0.591→0.555(−6%), easy(무르타자·신현주) 0.217→0.190(−12%, 더 벌어짐), mean test margin 0.256→0.325(+27%). - 조건별 margin: raw .256 / norm .251 / hp .252 / denoise .255 / vad .313 / wpe .266 / combo .325. - 증폭·정규화·하이패스·denoise = 무의미(임베딩 gain-invariant; 약한 denoise는 포먼트 건드려 easy 화자 약간 악화). - VAD(유성프레임 선별)가 단일 최대 효과(+22%), 싸고 확실. WPE dereverb 소폭(+4%). combo 최선(+27%). - 하드 케이스 문승연 10:23–13:06: raw margin 0.221(오답 이호준 0.767) → combo 0.320(오답 0.662), +45%.
한계: combo로도 최인호↔이호준 0.71, 임동성↔최인호 0.59 잔존 = 본질 유사성, 전처리로 제거 불가. 전처리는 작동 margin을 넓혀 더 많은 케이스가 기권 게이트를 통과하게 할 뿐. 게이트(고cos+마진 or 기권)는 여전히 필수.
권장/적용안: VAD+WPE(+norm)를 임베딩 경로(make_anchors·rematch·enroll)에 앵커·추론 양쪽 동일 적용. denoise는 약체라 제외. 구조적 상한 넘으려면 마이크 2채널(공간정보).
Sagwan Revalidation 2026-07-28T18:58:33Z#
- verdict:
ok - note: 직전 검증 후 이틀뿐이며 본문 주장·caveat에 즉시 모순 없음
재설계 결정 — 엔티티중심+경계리졸버, 화자식별 강등 (2026-07-28, codex 검토)#
오너가 화자분리/화자노드의 필요성을 근본적으로 재검토. codex 독립검토로 보정된 확정 설계 → docs/16_meeting_kg_person_project_redesign.md.
핵심 결정: 1. 화자식별(→Person)은 임계경로에서 강등. but 익명 화자클러스터(화자1·2)는 유지(스탠드업 "저는~" 1인칭 담당신호 보존), Person 매핑은 고신뢰+소급만. 2. 그래프 도달가능성 ≠ 책임 (codex의 핵심 반박, 나와 오너 둘 다 틀렸던 점): Person→Project→Task로 "X가 뭘 하나"를 대체하면 카테시안 과잉귀속(그럴듯·넓음·틀림 → 미귀속보다 나쁨). reporter/owner/assignee/actor를 별도 엣지로, 파생 금지. 3. 최고 레버리지 = 경계(bounded) Problem/Decision/Task→Project 리졸버 (원래 병목 정면공략). "에이전트가 알아서 맥락"=무한검색+환각 금지. 구조화 근거(project_registry 활성기간·참석자소속·별칭 명시·jira/github 링크·meeting_type prior)로 후보→캘리브 랭킹→절대+마진 게이트→다중/UNKNOWN 허용→엣지에 근거·confidence·resolver_version 저장→사람귀속으로 프로젝트 역산 금지. 4. Provenance 층(불변 EvidenceSpan=전사버전+타임스탬프+화자클러스터)로 교정 시 안전 재계산.
앵커 작업 위치: 버려지지 않음 — 컴포넌트②의 고신뢰 식별게이트가 앵커+마진 역할. 남성클러스터 스왑 억지해결만 중단.
현행: 배치 지식화 20건 진행중(엔티티 유효, RAISED_BY 비핵심이라 계속 OK). 다음 실작업 = 경계 Project 리졸버(codex가 docs/17 구현계획+skeleton rka/extract/project_resolver.py 작성중). 관련코드: resolver.py, extractor.py, project_registry.py, spec.yaml.
교훈: 큰 아키텍처 결정은 codex 독립검토 필수 — 이번에도 "reachability≠responsibility"를 내가 놓쳤고 codex가 잡음.
냉정한 산출물 평가 + RAISED_BY 비활성화 (2026-07-28)#
회의록·추출 산출물을 실제 내용 대비 냉정 평가(나+codex 독립). 프로젝트 리졸버는 접음(측정: 가용신호로 4%만 resolved, 93% 후보0 — codex도 per-subject 방식은 천장이라 판정).
자기교정(중요): 내 eval dump 스크립트가 evidence를 [:150]으로 잘라, codex가 "evidence 잘림/노드 grounding 실패"를 defect로 판정. 실제 저장 evidence는 온전(avg90/max936; UMI 257자·PrimitiveVLA 577자로 ManipForce·드리퍼 다 포함). → 그 defect는 내 측정 아티팩트, 코드 고치기 전 재검증으로 잡음. 교훈: 평가 dump도 원본 대비 검증할 것.
살아남은 진짜 결함(직접 검증): 1. RAISED_BY 진행자 몰림 — 대형회의 8건 중 7건 권우현, 신현미(여)·송세경(대표) 발언까지 권우현. 근거 span 직전 화자가 facilitator로 수렴. → RAISED_BY 기본 비활성화(feedback.py, RKA_SPEAKER_LINKING=1로만 재활성, 커밋 e496769). 화자식별 강등 재설계와 일치. 2. 양태 부풀리기: "해보려고"→"하기로 했다", tentative를 Decision으로. 3. 없는 담당자 지어냄("Jira 참석자 전원"), 핵심 누락(송세경 "GUI 다음주 시연"), 회의록 화자 스왑. 결론: 회의록=MEDIOCRE, 추출 grounding=OK, RAISED_BY=쓰레기.
다음 진짜 수(B): 추출·회의록 프롬프트에 양태·담당자 규율(아이디어/검토/해보려고 ≠ Decision, 없는 담당자 금지, 조각 태스크 병합). codex와 설계 예정.
부수: 배치 지식화 15/20 완료(5건 대형회의 30분 timeout — 재실행 필요). 재빌드 중 mcp>=1.28이 mcp 2.0.0 당겨 fastmcp 제거로 rka-mcp 재시작루프 → pyproject mcp>=1.28,<2 핀(커밋 다음). 전 서비스 healthy.
배포·검증 요약 — 프롬프트/교훈/Jira/MCP (2026-07-29~30)#
냉정 평가 후속으로 실효 개선 4건을 codex와 구현·배포·검증:
- 프롬프트 규율(커밋 b99855b, 배포) — 추출/회의록에서 tentative→Decision 금지, 없는 담당자 금지, 지시 보존, Task 병합, canonical 이름. 실검증(회의 B 신구 재추출): Decision 7→4, Task 15→8, "Franka먼저 Nachi" Decision 소멸, 이름 canonical화. 작동 확인. (흠: 추출 내 dedup 미흡, LLM 1회 변동)
- 교훈 플라이휠(157d815, 배포) — 추출이 relevant_lessons(top3, trust/scope 필터)를 프롬프트 주입. no-lesson/실패 시 무변경. 자기개선 루프 연결.
- Jira 재설계(fdbe041, 배포) — 라벨 폐지, project(누락 버그 수정)+에픽/스프린트/제목 기반. 스프린트 필드 스키마 탐색. 라이브 검증: customfield_10020 자동 탐색 성공. 미매칭 에픽→Workstream, Project 자동생성 금지. 실효는 Jira 재인제스트 시.
- MCP 외부노출 계획(docs/19, 미구현) — 별도 loopback facade+Tailscale Funnel+OAuth2.1. 보안결함 발견: entity_to_dict가 evidence/source_url/PII 유출, graph_overview 무trust필터, robot숨김이 env의존 → 외부는 trusted_only강제+라벨allowlist+projection 필수. 결정대기(도메인/IdP/허용계정/라벨). 최소첫스텝=Funnel+임시베어러 3툴.
부수 수정: RAISED_BY 비활성화(e496769, 진행자 몰림), mcp<2 핀(5df9be5, 2.0 fastmcp 제거 회귀).
로드맵 잔여: dedup, deprecated 8천 정리, DirectionRollup 평가, timeout 5건 대형회의 재지식화, MCP 구현(결정 후).
Sagwan Revalidation 2026-07-31T00:34:46Z#
- verdict:
ok - note: 최근 검증 후 3일 경과로 수치·권장안 갱신 필요 신호가 없다.