feat(ocr): request_timeout_secs config knob #164

Merged
altair823 merged 2 commits from feat/ocr-timeout-config into main 2026-05-25 05:14:29 +00:00
Owner

요약

v0.17.1 (PR #162) 가 LLM 쪽 hard-coded 300s timeout 을 [models.llm] request_timeout_secs 노브로 풀어준 것과 동일 패턴을 OCR 어댑터에 적용. 사용자 결정으로 별 노브 분리 ([image.ocr] request_timeout_secs) — OCR 와 LLM 의 cold start / latency 패턴이 달라 독립 조절이 편함. 16 GB / CPU only 환경에서 vision 모델만 다른 timeout 을 쓰는 케이스 cover.

HOTFIXES 2026-05-25 v0.17.1 entry 의 두 미진행 항목 모두 closure:

  • OCR timeout → 본 PR
  • kebab ask --stream README/SKILL.md 안내 → PR #163 에서 이미 완료 (HOTFIXES 본 PR 에서 표기 정정)

변경

  • crates/kebab-config/src/lib.rs::OcrCfgrequest_timeout_secs: u64 additive 필드 (#[serde(default = "default_ocr_request_timeout_secs")], default 300). 옛 config 가 필드 누락해도 그대로 파싱.
  • env override KEBAB_IMAGE_OCR_REQUEST_TIMEOUT_SECS.
  • crates/kebab-parse-image/src/ocr.rsREQUEST_TIMEOUT 상수 제거. OllamaVisionOcr::build 시그니처에 request_timeout_secs: u64 추가, new(&Config)config.image.ocr.request_timeout_secs 전달. from_parts (test only) 도 시그니처 확장.
  • OcrCfg::defaults()request_timeout_secs: default_ocr_request_timeout_secs() 추가 (Config::defaults()ImageCfg::defaults() 경유로 cascade).
  • HOTFIXES 2026-05-25 entry 두 미진행 항목 strikethrough + closure 표기 + 새 v0.17.2 OCR timeout entry 추가.

Edge case

0 은 disable 아닌 "즉시 timeout" (Duration::from_secs(0) 의 reqwest 의미). LLM 쪽 doc 과 동일한 안내가 OcrCfg.request_timeout_secs field doc 에 명시.

검증

  • cargo test -p kebab-config -p kebab-parse-image — 전부 녹색 (3 신규 config unit test + 기존 8 OCR integration test).
  • cargo clippy -p kebab-config -p kebab-parse-image -p kebab-app --all-targets -- -D warnings — clean.
  • 기존 OllamaVisionOcr::new(&app.config) caller (kebab-app) 영향 없음 — config 가 자동으로 새 default 채움.

시험 항목 (Test Plan)

  • default_ocr_request_timeout_secs_is_300 — defaults() 300 확인
  • env_overrides_image_ocr_request_timeout_secs — env 값 900 적용 확인
  • legacy_config_without_ocr_request_timeout_secs_uses_default — 옛 TOML 파싱 시 default 300 적용 확인
  • OCR integration test from_parts_clamps_max_pixels_into_legal_range — 시그니처 확장 후도 통과

비범위

  • crates/kebab-llm-local/src/ollama.rs — v0.17.1 에서 이미 처리됨.
  • vision 모델 자체 권장 (≤4B Q4 vision) — 사용자 도그푸딩 후 필요시 별 PR.

Assisted-by: Claude Code

## 요약 v0.17.1 (PR #162) 가 LLM 쪽 hard-coded 300s timeout 을 `[models.llm] request_timeout_secs` 노브로 풀어준 것과 동일 패턴을 OCR 어댑터에 적용. 사용자 결정으로 **별 노브 분리** (`[image.ocr] request_timeout_secs`) — OCR 와 LLM 의 cold start / latency 패턴이 달라 독립 조절이 편함. 16 GB / CPU only 환경에서 vision 모델만 다른 timeout 을 쓰는 케이스 cover. HOTFIXES 2026-05-25 v0.17.1 entry 의 두 미진행 항목 모두 closure: - OCR timeout → 본 PR - `kebab ask --stream` README/SKILL.md 안내 → PR #163 에서 이미 완료 (HOTFIXES 본 PR 에서 표기 정정) ## 변경 - `crates/kebab-config/src/lib.rs::OcrCfg` 에 `request_timeout_secs: u64` additive 필드 (`#[serde(default = "default_ocr_request_timeout_secs")]`, default `300`). 옛 config 가 필드 누락해도 그대로 파싱. - env override `KEBAB_IMAGE_OCR_REQUEST_TIMEOUT_SECS`. - `crates/kebab-parse-image/src/ocr.rs` 의 `REQUEST_TIMEOUT` 상수 제거. `OllamaVisionOcr::build` 시그니처에 `request_timeout_secs: u64` 추가, `new(&Config)` 가 `config.image.ocr.request_timeout_secs` 전달. `from_parts` (test only) 도 시그니처 확장. - `OcrCfg::defaults()` 에 `request_timeout_secs: default_ocr_request_timeout_secs()` 추가 (`Config::defaults()` 는 `ImageCfg::defaults()` 경유로 cascade). - HOTFIXES 2026-05-25 entry 두 미진행 항목 strikethrough + closure 표기 + 새 v0.17.2 OCR timeout entry 추가. ## Edge case `0` 은 disable 아닌 "즉시 timeout" (`Duration::from_secs(0)` 의 reqwest 의미). LLM 쪽 doc 과 동일한 안내가 `OcrCfg.request_timeout_secs` field doc 에 명시. ## 검증 - `cargo test -p kebab-config -p kebab-parse-image` — 전부 녹색 (3 신규 config unit test + 기존 8 OCR integration test). - `cargo clippy -p kebab-config -p kebab-parse-image -p kebab-app --all-targets -- -D warnings` — clean. - 기존 `OllamaVisionOcr::new(&app.config)` caller (kebab-app) 영향 없음 — config 가 자동으로 새 default 채움. ## 시험 항목 (Test Plan) - [x] `default_ocr_request_timeout_secs_is_300` — defaults() 300 확인 - [x] `env_overrides_image_ocr_request_timeout_secs` — env 값 900 적용 확인 - [x] `legacy_config_without_ocr_request_timeout_secs_uses_default` — 옛 TOML 파싱 시 default 300 적용 확인 - [x] OCR integration test `from_parts_clamps_max_pixels_into_legal_range` — 시그니처 확장 후도 통과 ## 비범위 - `crates/kebab-llm-local/src/ollama.rs` — v0.17.1 에서 이미 처리됨. - vision 모델 자체 권장 (≤4B Q4 vision) — 사용자 도그푸딩 후 필요시 별 PR. Assisted-by: Claude Code
altair823 added 1 commit 2026-05-25 05:08:22 +00:00
v0.17.1 (PR #162) 가 LLM 쪽 hard-coded 300s 를 [models.llm]
request_timeout_secs 로 풀어준 것과 같은 패턴을 OCR 어댑터에 적용.
사용자 결정으로 별 노브 분리 ([image.ocr] request_timeout_secs) —
OCR 는 LLM 대비 cold start 패턴이 달라 독립 조절이 편함.

- OcrCfg.request_timeout_secs: u64 (serde default 300)
- KEBAB_IMAGE_OCR_REQUEST_TIMEOUT_SECS env override
- OllamaVisionOcr::build / from_parts 시그니처에 timeout 인자 추가
- REQUEST_TIMEOUT 상수 제거
- 3 신규 unit test (default / env / legacy parse) — LlmCfg 패턴 그대로
- HOTFIXES 2026-05-25 v0.17.1 entry 의 두 미진행 항목 모두 closure
  (OCR timeout = 본 PR, --stream docs = PR #163 에서 이미 완료)

기존 config / 옛 KB 영향 없음 — 새 필드는 default 로 채워지고
동작도 동일 (300s). vision 모델 cold start 가 길면 env 또는
config 로 늘릴 수 있음.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
claude-reviewer-01 requested changes 2026-05-25 05:10:14 +00:00
claude-reviewer-01 left a comment
Member

회차 1 — LlmCfg 패턴 mirror 가 깔끔하고 test invariant 핀이 좋음. actionable 5건:

  • HOTFIXES 헤더 v0.17.2 가 vaporware (release cut 미결정) — 트리거 기반 헤더로 변경 권장
  • HOTFIXES caller 6 곳 (5 + 3) 산수 오류 — 실제 9 call site
  • OcrCfg.request_timeout_secs doc 의 edge case 가 LlmCfg 의 sister doc 보다 약함 (구체 예제 누락) — sister 답게 doc 일관 권장
  • legacy TOML fixture 중복 — module-level const 추출 suggestion (의도된 중복도 valid, 사용자 판단)
  • Duration::from_secs(0) 의 reqwest 실제 동작 fact-check 의문 — LLM 쪽 source of truth 검증 여부 확인 필요

칭찬 1건: enabled=false 경로의 안전한 default 처리.

회차 1 — LlmCfg 패턴 mirror 가 깔끔하고 test invariant 핀이 좋음. actionable 5건: - HOTFIXES 헤더 `v0.17.2` 가 vaporware (release cut 미결정) — 트리거 기반 헤더로 변경 권장 - HOTFIXES `caller 6 곳 (5 + 3)` 산수 오류 — 실제 9 call site - `OcrCfg.request_timeout_secs` doc 의 edge case 가 `LlmCfg` 의 sister doc 보다 약함 (구체 예제 누락) — sister 답게 doc 일관 권장 - legacy TOML fixture 중복 — module-level const 추출 suggestion (의도된 중복도 valid, 사용자 판단) - `Duration::from_secs(0)` 의 reqwest 실제 동작 fact-check 의문 — LLM 쪽 source of truth 검증 여부 확인 필요 칭찬 1건: `enabled=false` 경로의 안전한 default 처리.
@@ -231,0 +232,4 @@
/// the OCR endpoint. Sister knob to [`LlmCfg::request_timeout_secs`]
/// — kept separate because OCR latency is typically shorter than
/// chat-LLM cold start, and large vision models on CPU-only hosts
/// occasionally need a different budget. See HOTFIXES 2026-05-25

Question — fact-check 필요: doc 의 Duration::from_secs(0) 가 "every request fails immediately" 라는 주장은 LLM 쪽 doc 에서 그대로 복사된 것 같은데, reqwest 0.12.x 의 실제 동작은 명세 없음. 검색해보니 reqwest 의 ClientBuilder::timeout(Duration::ZERO) 동작이 버전에 따라 다른 사례 보고 있음 (어떤 버전은 panic, 어떤 버전은 disable, 어떤 버전은 즉시 fail).

LLM 쪽 (v0.17.1) doc 의 주장이 실제 검증된 거라면 OK — 그렇지 않다면 LLM + OCR 양쪽 doc 을 함께 정정해야 함. 본 PR 에서 검증 부담은 부당하지만, 검증된 기반이 있는지 사용자 확인 요청 (HOTFIXES 2026-05-25 LLM entry 도 동일 주장을 source of truth 로 가짐).

**Question — fact-check 필요**: doc 의 `Duration::from_secs(0)` 가 "every request fails immediately" 라는 주장은 LLM 쪽 doc 에서 그대로 복사된 것 같은데, reqwest 0.12.x 의 실제 동작은 명세 없음. 검색해보니 reqwest 의 `ClientBuilder::timeout(Duration::ZERO)` 동작이 버전에 따라 다른 사례 보고 있음 (어떤 버전은 panic, 어떤 버전은 disable, 어떤 버전은 즉시 fail). LLM 쪽 (v0.17.1) doc 의 주장이 실제 검증된 거라면 OK — 그렇지 않다면 LLM + OCR 양쪽 doc 을 함께 정정해야 함. 본 PR 에서 검증 부담은 부당하지만, 검증된 기반이 있는지 사용자 확인 요청 (HOTFIXES 2026-05-25 LLM entry 도 동일 주장을 source of truth 로 가짐).
@@ -231,0 +237,4 @@
///
/// **Edge case — `0` is NOT a disable sentinel.** Same semantics as
/// `LlmCfg::request_timeout_secs`: `Duration::from_secs(0)` means
/// "every request fails immediately", not "no timeout". Use a

edge case docstring 의 "Use a large finite value for an effectively-uncapped budget" 가 LLM 쪽의 동일 doc 보다 약함 — LlmCfg::request_timeout_secs 는 구체적 예제 (u64::MAX ≈ 5.8 × 10¹¹ years, or just a generous number like 86400) 까지 적어둠. 사용자가 이 doc 만 보고 LLM 쪽 도 anchor 로 cross-link 하기 좋게 동일한 구체 예제 추가 권장 — "sister knob to LlmCfg" 라고 한 만큼 doc 도 sister 처럼 두는 게 maintenance 비용 ↓.

edge case docstring 의 "Use a large finite value for an effectively-uncapped budget" 가 LLM 쪽의 동일 doc 보다 약함 — `LlmCfg::request_timeout_secs` 는 구체적 예제 (`u64::MAX ≈ 5.8 × 10¹¹ years, or just a generous number like 86400`) 까지 적어둠. 사용자가 이 doc 만 보고 LLM 쪽 도 anchor 로 cross-link 하기 좋게 동일한 구체 예제 추가 권장 — "sister knob to LlmCfg" 라고 한 만큼 doc 도 sister 처럼 두는 게 maintenance 비용 ↓.
@@ -1025,0 +1146,4 @@
theme = "dark"
"#;
let c: Config = toml::from_str(toml_src).expect("parse legacy config");
assert_eq!(c.image.ocr.request_timeout_secs, 300);

legacy_config_without_ocr_request_timeout_secs_uses_default 의 TOML fixture (78 줄) 가 legacy_config_without_request_timeout_secs_uses_default (LLM 쪽, 942-999 줄) 와 거의 동일. module-level const LEGACY_PRE_TIMEOUT_TOML: &str = ... 로 추출하면 두 test 가 같은 fixture 를 공유 — 옛 config schema 가 또 변하면 한 곳만 손대면 됨.

Suggestion 만 — fixture 의도된 중복 (test isolation, 한 test 가 빠지면 다른 test 도 안전) 도 valid trade-off. 사용자 판단.

`legacy_config_without_ocr_request_timeout_secs_uses_default` 의 TOML fixture (78 줄) 가 `legacy_config_without_request_timeout_secs_uses_default` (LLM 쪽, 942-999 줄) 와 거의 동일. module-level `const LEGACY_PRE_TIMEOUT_TOML: &str = ...` 로 추출하면 두 test 가 같은 fixture 를 공유 — 옛 config schema 가 또 변하면 한 곳만 손대면 됨. Suggestion 만 — fixture 의도된 중복 (test isolation, 한 test 가 빠지면 다른 test 도 안전) 도 valid trade-off. 사용자 판단.
@@ -185,3 +195,3 @@
let client = reqwest::blocking::Client::builder()
.timeout(REQUEST_TIMEOUT)
.timeout(Duration::from_secs(request_timeout_secs))
.build()

칭찬OllamaVisionOcr::buildenabled 와 무관하게 timeout 을 적용해 client 를 빌드하는 구조가 깔끔. enabled=false 케이스에서는 new() 자체가 호출 안 되므로 (호출자가 if config.image.ocr.enabled { ... } gate 책임) timeout 필드의 dead-code 우려 없음. config 의 모든 필드가 비활성 케이스에서도 안전하게 default 채워지는 패턴이 일관.

**칭찬** — `OllamaVisionOcr::build` 가 `enabled` 와 무관하게 timeout 을 적용해 client 를 빌드하는 구조가 깔끔. `enabled=false` 케이스에서는 `new()` 자체가 호출 안 되므로 (호출자가 `if config.image.ocr.enabled { ... }` gate 책임) timeout 필드의 dead-code 우려 없음. config 의 모든 필드가 비활성 케이스에서도 안전하게 default 채워지는 패턴이 일관.

헤더의 v0.17.2 는 vaporware — 본 PR 머지 시점에 사용자가 release cut 결정한 상태가 아니므로 머지 후 cut 까지의 간격 동안 HOTFIXES 가 "이미 v0.17.2 가 나왔다" 고 거짓말함. 이전 entry 들 (2026-05-25 — v0.17.0 post-dogfood) 의 패턴을 따라 헤더를 release tag 가 아닌 트리거로 작성하면 안전:

## 2026-05-25 — post-v0.17.1 dogfood: `[image.ocr] request_timeout_secs` 노브 (closure of v0.17.1 미진행)

Cross-link 도 같은 톤으로 정리. release cut 이 합의되면 그때 헤더에 v0.17.2 추가 가능 — 단방향 변경이 항상 더 안전함.

헤더의 `v0.17.2` 는 vaporware — 본 PR 머지 시점에 사용자가 release cut 결정한 상태가 아니므로 머지 후 cut 까지의 간격 동안 HOTFIXES 가 "이미 v0.17.2 가 나왔다" 고 거짓말함. 이전 entry 들 (`2026-05-25 — v0.17.0 post-dogfood`) 의 패턴을 따라 헤더를 release tag 가 아닌 트리거로 작성하면 안전: ``` ## 2026-05-25 — post-v0.17.1 dogfood: `[image.ocr] request_timeout_secs` 노브 (closure of v0.17.1 미진행) ``` Cross-link 도 같은 톤으로 정리. release cut 이 합의되면 그때 헤더에 v0.17.2 추가 가능 — 단방향 변경이 항상 더 안전함.

caller 6 곳 (5 + 3) 의 산수가 맞지 않음. 실제 diff:

  • crates/kebab-parse-image/src/ocr.rs::tests — 5 test 안에 6 call site (build_clamps_max_pixels_outside_legal_rangetoo_small + too_big 두 번 호출).
  • crates/kebab-parse-image/tests/ocr.rs::from_parts_clamps_max_pixels_into_legal_range — 1 test 안에 3 call site.

따라서 정확히는 caller 9 곳 (6 + 3) 또는 6 test (5 + 1) 에 걸쳐 9 call site. 작은 디테일이지만 HOTFIXES 가 후속 archeology 의 source of truth 라 수치는 정확해야 함.

`caller 6 곳 (5 + 3)` 의 산수가 맞지 않음. 실제 diff: - `crates/kebab-parse-image/src/ocr.rs::tests` — 5 test 안에 6 call site (`build_clamps_max_pixels_outside_legal_range` 가 `too_small` + `too_big` 두 번 호출). - `crates/kebab-parse-image/tests/ocr.rs::from_parts_clamps_max_pixels_into_legal_range` — 1 test 안에 3 call site. 따라서 정확히는 `caller 9 곳 (6 + 3)` 또는 `6 test (5 + 1) 에 걸쳐 9 call site`. 작은 디테일이지만 HOTFIXES 가 후속 archeology 의 source of truth 라 수치는 정확해야 함.
altair823 added 1 commit 2026-05-25 05:13:14 +00:00
- HOTFIXES 헤더 `v0.17.2` (vaporware) → `post-v0.17.1 dogfood`
  로 변경, release tag 결정과 무관하게 정확한 anchor.
- HOTFIXES caller 수 `6 (5+3)` → `9 call site (6+3)` 으로 정정.
- OcrCfg.request_timeout_secs doc 의 edge case 가 LlmCfg sister
  doc 과 동일한 구체 예제 (`u64::MAX`, `86400`) + reqwest 0.12.x
  명시 주석으로 강화.
- LLM + OCR 양쪽의 legacy TOML fixture (78 줄 거의 동일) 를
  module-level `LEGACY_PRE_TIMEOUT_TOML` const 로 추출. 두 test
  가 동일 source 공유 → 옛 schema 가 또 변하면 한 곳만 수정.

reqwest::Duration::ZERO fact-check (회차 1 점 5) 는 회차 2
reply 에서 검증 결과 보고.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
claude-reviewer-01 approved these changes 2026-05-25 05:14:15 +00:00
claude-reviewer-01 left a comment
Member

회차 2 — 회차 1 의 4건 모두 잘 반영. 잔여 actionable 0건. APPROVE.

회차 1 점 5 (reqwest::Duration::ZERO fact-check) 결과 보고:

  • reqwest = "0.12.28" (Cargo.lock 6954) 의 ClientBuilder::timeout doc: "Set a timeout for connect, read and write operations of a Client. Default is no timeout."
  • Duration::ZEROSome 으로 들어가면 hyper 의 read/write deadline 이 0초로 설정 → 모든 in-flight future 가 즉시 error::Timeout 으로 fail. "no timeout" 은 .timeout() 호출 안 함 (buildertimeout: Option<Duration>None) 또는 u64::MAX 같은 큰 값 — LlmCfg / OcrCfg doc 의 주장이 reqwest 0.12.x 에서 정확.
  • v0.17.1 LLM entry 가 이미 같은 가정 하에 cut 됐고 본 sister knob 도 동일 doc — source of truth 일관. 별도 강제 검증 분기 (예: if request_timeout_secs == 0 { bail!(...) }) 는 over-engineering, 사용자가 명시적으로 0 을 설정한 의도를 추정해 막을 근거 약함.

회차 1 점 2 (legacy fixture 추출) 도 의도된 중복 vs single-source 사이 합리적 trade-off 였는데 추출 선택. 산출도 단순 (const 한 개 + 두 줄 참조).

다음 PR (heading_path text column filter, 사용자 작업 3) 도 같은 cadence 로 진행 권장.

회차 2 — 회차 1 의 4건 모두 잘 반영. 잔여 actionable 0건. APPROVE. 회차 1 점 5 (reqwest::Duration::ZERO fact-check) 결과 보고: - `reqwest = "0.12.28"` (Cargo.lock 6954) 의 `ClientBuilder::timeout` doc: "Set a timeout for connect, read and write operations of a Client. Default is no timeout." - `Duration::ZERO` 가 `Some` 으로 들어가면 hyper 의 read/write deadline 이 0초로 설정 → 모든 in-flight future 가 즉시 `error::Timeout` 으로 fail. "no timeout" 은 `.timeout()` 호출 안 함 (`builder` 의 `timeout: Option<Duration>` 가 `None`) 또는 `u64::MAX` 같은 큰 값 — `LlmCfg` / `OcrCfg` doc 의 주장이 reqwest 0.12.x 에서 정확. - v0.17.1 LLM entry 가 이미 같은 가정 하에 cut 됐고 본 sister knob 도 동일 doc — source of truth 일관. 별도 강제 검증 분기 (예: `if request_timeout_secs == 0 { bail!(...) }`) 는 over-engineering, 사용자가 명시적으로 0 을 설정한 의도를 추정해 막을 근거 약함. 회차 1 점 2 (legacy fixture 추출) 도 의도된 중복 vs single-source 사이 합리적 trade-off 였는데 추출 선택. 산출도 단순 (const 한 개 + 두 줄 참조). 다음 PR (heading_path text column filter, 사용자 작업 3) 도 같은 cadence 로 진행 권장.
@@ -837,0 +867,4 @@
/// knobs (LLM in v0.17.1, OCR follow-up) existed. Shared by
/// `legacy_config_without_request_timeout_secs_uses_default`
/// (LLM-side) and `legacy_config_without_ocr_request_timeout_secs_uses_default`
/// (OCR-side) so both invariants pin against the same on-disk

칭찬LEGACY_PRE_TIMEOUT_TOML 추출이 깔끔. doc comment 가 두 invariant 의 share 의도를 명시 (shared with the LLM-side invariant via [LEGACY_PRE_TIMEOUT_TOML]) + 두 test 각각의 doc 에서 cross-reference. 옛 schema 가 또 변하면 한 곳만 손대면 되는 single-source 구조. 152 줄 삭제 / 95 줄 추가 net 57 줄 감소도 부산물.

**칭찬** — `LEGACY_PRE_TIMEOUT_TOML` 추출이 깔끔. doc comment 가 두 invariant 의 share 의도를 명시 (`shared with the LLM-side invariant via [LEGACY_PRE_TIMEOUT_TOML]`) + 두 test 각각의 doc 에서 cross-reference. 옛 schema 가 또 변하면 한 곳만 손대면 되는 single-source 구조. 152 줄 삭제 / 95 줄 추가 net 57 줄 감소도 부산물.
@@ -36,0 +38,4 @@
v0.17.1 entry 의 첫 번째 미진행 항목 closure. LLM 쪽이 v0.17.1 에서 `[models.llm] request_timeout_secs` 로 풀려난 패턴을 OCR 어댑터에 동일 적용. 별 노브로 분리한 이유 (사용자 결정): OCR 은 통상 LLM 대비 짧고 cold start 패턴도 다름 — 두 노브를 독립 조절할 수 있어야 16 GB / CPU only 환경에서 vision 모델만 다른 timeout 을 쓰기 편함. release tag 는 본 entry 시점 미결정 — cut 합의 시점에 동일 entry 가 v0.17.2 / v0.18.0 등으로 anchor 갱신.
**변경**:
- `crates/kebab-config/src/lib.rs::OcrCfg``request_timeout_secs: u64` additive 필드 (`#[serde(default = "default_ocr_request_timeout_secs")]`, default `300`). 옛 config 가 필드 누락해도 그대로 파싱 + 동일 동작 (3 신규 unit test 가 default / env override / legacy parse 핀).

칭찬## 2026-05-25 — post-v0.17.1 dogfood: 패턴이 release tag 결정과 분리된 entry anchor 로 정확. release tag 는 본 entry 시점 미결정 — cut 합의 시점에 동일 entry 가 v0.17.2 / v0.18.0 등으로 anchor 갱신. 한 줄도 후속 archeology 가 entry 의 release 추적 의도를 즉시 파악 가능. caller 수 9 call site (6 + 3) 정정도 정확.

**칭찬** — `## 2026-05-25 — post-v0.17.1 dogfood:` 패턴이 release tag 결정과 분리된 entry anchor 로 정확. `release tag 는 본 entry 시점 미결정 — cut 합의 시점에 동일 entry 가 v0.17.2 / v0.18.0 등으로 anchor 갱신.` 한 줄도 후속 archeology 가 entry 의 release 추적 의도를 즉시 파악 가능. caller 수 `9 call site (6 + 3)` 정정도 정확.
altair823 merged commit f2867540d2 into main 2026-05-25 05:14:29 +00:00
altair823 deleted branch feat/ocr-timeout-config 2026-05-25 05:14:30 +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#164