실측 (2026-08-07)
run 31149750083 (05:10) / 31155489978 (06:52) / 31158763974 (07:43 트리거, Data Sync 완료 직후) 3회 연속 동일 실패. 실패 step 은 모두 Audit source/no-answer canary pack 이고 이후 ops gate·cutover 평가가 연쇄 실패, promote 2단계는 스킵.
evidence artifact (search-index-build-evidence-31158763974) 의 searchCanary.build.json:
- metrics: passRate 0.8 (4/5), sourceHitRate 1.0, sourceRefHitRate 0.0, noAnswerFalseAccept 0.0
- 실패 row 1건: query "공시 원문 주요사항보고서(유상증자결정) 6.4 주식회사 벡트 정 정 신 고", expectedSourceRef
dart:allFilings:20260806000547#section=0, failureType sourceRefMiss
- top10 은 전부 allFilings 이되 rcept 가 20260722 이전. 세 run 의 top10 이 완전 동일 (결정론, flaky 아님)
- 같은 artifact 의
searchProofBundle.build/localIndexInfo.json: 러너가 pull 한 인덱스는 builtAt 2026-08-04T17:45:19, dataAsOf 20260804, hasDelta true, nDocs 590731
즉 canary 는 08-06 공시를 기대하는데 러너 로컬 인덱스 본체는 08-04 까지다.
구조 (코드 직독)
- canary 팩은 manifest 소유이고 인덱스 아티팩트 자신의 meta 에서 생성된다 (
fieldIndexRebuild.py:1142, delta 반영은 localUpdate.py).
- 평가는
evaluateSearchCanary.py 의 _injectRefResolution 이 러너 로컬 인덱스의 effective meta (main+delta, tombstone 반영) 를 직독해 _refResolved 결정론 신호를 주입하고, canaryPack.py 가 _refResolved False 를 sourceRefMiss 로 판정한다. 랭킹 top-K 멤버십은 무결성 proxy 로 쓰지 않는 것이 이미 확립된 설계다 (bigram 토크나이저의 보일러플레이트 self-retrieval 구조 한계).
유력 원인 2갈래
- 버전 skew (유력): full build 의 pull 단계가 delta 갱신된 manifest (canary 팩에 08-06 문서 포함) 와 08-04 본체 세그먼트를 함께 두면서 delta 세그먼트가 로컬에 없거나 적용되지 않음. effectiveMeta 에 08-06 문서가 없어
_refResolved False. 결정론 실패 패턴과 정합.
- 주입 폴백:
_injectRefResolution 이 예외를 삼키고 BM25 폴백으로 진행하면 (evaluateSearchCanary.py except 절) 보일러플레이트 self-retrieval 구조 실패가 그대로 RED 로 나온다. 현재 report 에 주입 성공/폴백 여부가 기록되지 않아 로그만으로는 1과 구분 불가.
다음 검증 (완료 조건)
실측 (2026-08-07)
run 31149750083 (05:10) / 31155489978 (06:52) / 31158763974 (07:43 트리거, Data Sync 완료 직후) 3회 연속 동일 실패. 실패 step 은 모두
Audit source/no-answer canary pack이고 이후 ops gate·cutover 평가가 연쇄 실패, promote 2단계는 스킵.evidence artifact (
search-index-build-evidence-31158763974) 의searchCanary.build.json:dart:allFilings:20260806000547#section=0, failureType sourceRefMisssearchProofBundle.build/localIndexInfo.json: 러너가 pull 한 인덱스는 builtAt 2026-08-04T17:45:19, dataAsOf 20260804, hasDelta true, nDocs 590731즉 canary 는 08-06 공시를 기대하는데 러너 로컬 인덱스 본체는 08-04 까지다.
구조 (코드 직독)
fieldIndexRebuild.py:1142, delta 반영은localUpdate.py).evaluateSearchCanary.py의_injectRefResolution이 러너 로컬 인덱스의 effective meta (main+delta, tombstone 반영) 를 직독해_refResolved결정론 신호를 주입하고,canaryPack.py가_refResolvedFalse 를 sourceRefMiss 로 판정한다. 랭킹 top-K 멤버십은 무결성 proxy 로 쓰지 않는 것이 이미 확립된 설계다 (bigram 토크나이저의 보일러플레이트 self-retrieval 구조 한계).유력 원인 2갈래
_refResolvedFalse. 결정론 실패 패턴과 정합._injectRefResolution이 예외를 삼키고 BM25 폴백으로 진행하면 (evaluateSearchCanary.pyexcept 절) 보일러플레이트 self-retrieval 구조 실패가 그대로 RED 로 나온다. 현재 report 에 주입 성공/폴백 여부가 기록되지 않아 로그만으로는 1과 구분 불가.다음 검증 (완료 조건)
_refResolved값과 주입 모드 (deterministic / bm25Fallback) 를 echo 해 두 갈래를 로그에서 구분 가능하게Pull existing content index from HF가 delta 세그먼트 파일까지 가져오는지 실측 (파일 목록)