refactor: audit-tail 정리 — FusionPolicy inline + dual-YAML 통일 + NLI required #222

Merged
altair823 merged 2 commits from refactor/audit-tail-micro-cleanups into main 2026-06-27 02:53:18 +00:00
Owner

요약

ponytail-audit 의 작은 over-engineering 잔여 3건을 한 PR 로 마무리한다. 셋 다 output/동작 불변 (RRF 수식·YAML 파싱·prod NLI 동작 그대로).

audit cleanup arc 의 마지막 코드 PR. (tier2_shared 인라인은 3 callsite 의 정당한 DRY 라 over-engineering 아님 → 제외.)

변경

  1. FusionPolicy 1-arm enum 제거 [kebab-search] — enum FusionPolicy { Rrf { k_rrf } } 는 변종 하나뿐이고 kebab-search 외부 importer 0. HybridRetrieverk_rrf: u32 를 직접 보유하도록 inline, parse_fusionu32 반환. RRF 점수 Σ 1/(k_rrf+rank) byte-identical, 기존 fusion 테스트 무수정 통과.
  2. dual YAML 통일 [Cargo.toml + 2 site] — workspace 가 serde_yaml(0.9) + serde_yaml_ng(0.10, maintained fork) 둘을 끌던 걸 ng 하나로. k8s manifest chunker + eval golden loader 2 site 를 ng 로 마이그레이션(API drop-in), serde_yaml workspace dep 제거. 파싱 결과 불변.
  3. NliVerifier::hypothesis_token_count Ok(0) default 제거 → required [kebab-nli] — prod OnnxNliVerifier 가 이미 override 라 prod 동작 불변. MockNliVerifier 에 explicit Ok(0) 추가(SpyNliVerifier 는 이미 보유). backward-compat shim default 제거.

비범위 / 가드레일

  • RRF normalizer(/(2/(k_rrf+1)))는 pre-existing — 본 PR 미변경(순위 보존).
  • serde_yaml_ng 는 dtolnay 의 archived serde_yaml 의 API-호환 fork — k8s invalid-yaml 테스트는 구조적 에러(unclosed flow seq) 라 leniency 차이 무관, 무수정 통과.
  • kebab-parse-mdserde_yaml fork-선택 rationale 주석(설명용)은 그대로 유지.

검증

  • cargo test -p kebab-search -p kebab-chunk -p kebab-eval -p kebab-nli -p kebab-rag 전부 녹색 (RRF formula·k8s manifest·golden loader·multi-hop NLI 테스트 포함). cargo build --workspace 성공(serde_yaml 완전 제거, Cargo.lock 반영). cargo clippy -D warnings 클린.
  • 적대적 검증 2렌즈: output-identity(RRF 수식 불변 + YAML drop-in + prod NLI override 확인) + completeness-build(FusionPolicy 0 refs, serde_yaml dep 0, 모든 NliVerifier impl 보유) 통과. 후자가 잡은 search/eval/parse/ARCHITECTURE 문서의 stale 참조 정정 완료.
  • net −37줄.

시험 항목 (Test Plan)

  • kebab search --mode hybrid 결과 순위가 이전과 동일 (RRF 수식 불변).
  • kebab eval run (golden YAML 로드) 정상.
  • kebab ask --multi-hop 의 NLI 검증 동작 불변.

Assisted-by: Claude Code

## 요약 ponytail-audit 의 작은 over-engineering 잔여 3건을 한 PR 로 마무리한다. 셋 다 **output/동작 불변** (RRF 수식·YAML 파싱·prod NLI 동작 그대로). audit cleanup arc 의 마지막 코드 PR. (tier2_shared 인라인은 3 callsite 의 정당한 DRY 라 over-engineering 아님 → 제외.) ## 변경 1. **FusionPolicy 1-arm enum 제거** [kebab-search] — `enum FusionPolicy { Rrf { k_rrf } }` 는 변종 하나뿐이고 kebab-search 외부 importer 0. `HybridRetriever` 가 `k_rrf: u32` 를 직접 보유하도록 inline, `parse_fusion` 은 `u32` 반환. RRF 점수 `Σ 1/(k_rrf+rank)` **byte-identical**, 기존 fusion 테스트 무수정 통과. 2. **dual YAML 통일** [Cargo.toml + 2 site] — workspace 가 `serde_yaml`(0.9) + `serde_yaml_ng`(0.10, maintained fork) 둘을 끌던 걸 ng 하나로. k8s manifest chunker + eval golden loader 2 site 를 ng 로 마이그레이션(API drop-in), `serde_yaml` workspace dep 제거. 파싱 결과 불변. 3. **NliVerifier::hypothesis_token_count `Ok(0)` default 제거 → required** [kebab-nli] — prod `OnnxNliVerifier` 가 이미 override 라 **prod 동작 불변**. `MockNliVerifier` 에 explicit `Ok(0)` 추가(`SpyNliVerifier` 는 이미 보유). backward-compat shim default 제거. ## 비범위 / 가드레일 - RRF normalizer(`/(2/(k_rrf+1))`)는 pre-existing — 본 PR 미변경(순위 보존). - serde_yaml_ng 는 dtolnay 의 archived serde_yaml 의 API-호환 fork — k8s invalid-yaml 테스트는 구조적 에러(unclosed flow seq) 라 leniency 차이 무관, 무수정 통과. - `kebab-parse-md` 의 `serde_yaml` fork-선택 rationale 주석(설명용)은 그대로 유지. ## 검증 - `cargo test -p kebab-search -p kebab-chunk -p kebab-eval -p kebab-nli -p kebab-rag` 전부 녹색 (RRF formula·k8s manifest·golden loader·multi-hop NLI 테스트 포함). `cargo build --workspace` 성공(serde_yaml 완전 제거, Cargo.lock 반영). `cargo clippy -D warnings` 클린. - 적대적 검증 2렌즈: **output-identity**(RRF 수식 불변 + YAML drop-in + prod NLI override 확인) + **completeness-build**(FusionPolicy 0 refs, serde_yaml dep 0, 모든 NliVerifier impl 보유) 통과. 후자가 잡은 search/eval/parse/ARCHITECTURE 문서의 stale 참조 정정 완료. - net −37줄. ## 시험 항목 (Test Plan) - [ ] `kebab search --mode hybrid` 결과 순위가 이전과 동일 (RRF 수식 불변). - [ ] `kebab eval run` (golden YAML 로드) 정상. - [ ] `kebab ask --multi-hop` 의 NLI 검증 동작 불변. Assisted-by: Claude Code
altair823 added 1 commit 2026-06-27 02:44:40 +00:00
ponytail-audit 의 작은 over-engineering 잔여 3건 (output/동작 불변):

1. FusionPolicy 1-arm enum 제거 — kebab-search 내부 전용(외부 importer 0)이던
   `enum FusionPolicy { Rrf { k_rrf } }` 를 `HybridRetriever.k_rrf: u32` 로 inline.
   parse_fusion 은 u32 반환. RRF 수식 `Σ 1/(k_rrf+rank)` byte-identical.
2. dual YAML 통일 — serde_yaml(0.9) 를 maintained fork serde_yaml_ng(0.10) 로 일원화.
   k8s manifest chunker + eval golden loader 2 site 마이그레이션(API drop-in),
   workspace dep 에서 serde_yaml 제거. parse 결과 불변.
3. NliVerifier::hypothesis_token_count 의 `Ok(0)` default 제거 → required.
   prod OnnxNliVerifier 가 이미 override 라 동작 불변, MockNliVerifier 에 explicit 추가.

문서 동기화: search/eval/parse component README + ARCHITECTURE 의 FusionPolicy/
serde_yaml 참조를 현 상태로 갱신. net −37줄. 적대적 검증 2렌즈(output-identity +
completeness-build) 통과, 영향 crate 테스트 + clippy -D warnings 클린.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Mc6W1fgsrbFKTsqA6P8La
altair823 added 1 commit 2026-06-27 02:50:49 +00:00
리뷰 nit: dropped serde_yaml 은 workspace-pinned 였는데 대체 serde_yaml_ng 가
3 crate 에 개별 "0.10" 하드코딩이라 single-version-pin invariant 깨짐.
`[workspace.dependencies]` 에 serde_yaml_ng = "0.10" 추가 + kebab-chunk/eval/
parse-md(사전존재 하드코딩 포함) 를 { workspace = true } 로 통일 — 워크스페이스의
다른 공유 dep 과 동일 컨벤션. 빌드 dep resolution 불변(0.10.0 단일).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Mc6W1fgsrbFKTsqA6P8La
claude-reviewer-01 approved these changes 2026-06-27 02:51:03 +00:00
claude-reviewer-01 left a comment
Member

회차 2 — 회차 1 의 actionable nit(serde_yaml_ng workspace pin 복원) 반영 확인. info 항목(required method = trait-API break)은 단일 바이너리 monorepo 라 외부 구현자 0 → 무영향, non-actionable.

독립 검증 요지:

  • FusionPolicy: carrier 타입만 enum→field, RRF 수식(normalizer·rank loss·tiebreak·cast)·parse_fusion k 흐름 byte-identical. FusionPolicy 코드 0 refs.
  • dual-YAML: serde_yaml_ng drop-in(k8s invalid-yaml 은 구조적 에러라 leniency 무관), serde_yaml + transitive unsafe-libyaml 제거. 이제 workspace-pinned 단일.
  • NLI: prod OnnxNliVerifier override 라 동작 불변, footgun 을 compile-time 보장으로 전환. 3 impl 전부 보유.
  • 영향 5 crate 테스트 + clippy -D warnings 클린.

머지 동의합니다.

회차 2 — 회차 1 의 actionable nit(serde_yaml_ng workspace pin 복원) 반영 확인. info 항목(required method = trait-API break)은 단일 바이너리 monorepo 라 외부 구현자 0 → 무영향, non-actionable. 독립 검증 요지: - FusionPolicy: carrier 타입만 enum→field, RRF 수식(normalizer·rank loss·tiebreak·cast)·parse_fusion k 흐름 byte-identical. FusionPolicy 코드 0 refs. - dual-YAML: serde_yaml_ng drop-in(k8s invalid-yaml 은 구조적 에러라 leniency 무관), serde_yaml + transitive unsafe-libyaml 제거. 이제 workspace-pinned 단일. - NLI: prod OnnxNliVerifier override 라 동작 불변, footgun 을 compile-time 보장으로 전환. 3 impl 전부 보유. - 영향 5 crate 테스트 + clippy -D warnings 클린. 머지 동의합니다.
altair823 merged commit fef06e246f into main 2026-06-27 02:53:18 +00:00
altair823 deleted branch refactor/audit-tail-micro-cleanups 2026-06-27 02:53:20 +00:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: altair823-org/kebab#222