# search-engine-app（子模块规范）

## 子模块名称

search-engine-app（APP 搜索器：DP + TopK）

## 目标描述

在 APP 场景实现多行换行的确定性组合搜索：

- 使用 DP + TopK 生成候选 layout
- 对每个候选应用硬约束过滤
- 调用 `scoring-tiebreak` 计算评分与 tieKey
- 保留 TopK 并在结束时选最优

要求性能可控且输出完全确定性。

## 输入/输出定义

### 输入

- `tokens: Token[]`
- `breakpoints: Breakpoint[]`（来自 `breakpoint-candidates`）
- `availableWidth: number`
- `maxLines: number`
- `lineMode: 'AUTO' | 'FIXED'`
- `context: 'APP'`
- `measure: { measureWidth?: fn; fontSpec?: any; cache: ... }`（来自 `width-measurement` 的实现）
- `config: { topK: number }`

### 输出

- `bestLayout: { breaks: number[]; lines: string[]; wrappedText: string; meta?: { breaks: number[]; scoreTopTerms?: ... } }`
- 若无解：返回可解释的 fallback（由 `overflow-fallback` 统一处理语义）

## 验收标准（可验证）

- **确定性**：同输入（tokens/breakpoints/availableWidth/maxLines/configVersion）必定同输出（breaks 与 lines 完全一致）
- **TopK 维护一致**：
  - K 默认 10（可配置但必须固定）
  - 排序：score desc；tieKey 逐项比较
  - 去重：同 breaks 序列只保留最高分
- **lineMode=FIXED 行为**：
  - 优先选刚好 `maxLines` 的解；无解时按固定降级链路处理并打点
- **复杂度可控**：超长输入触发裁剪/兜底并返回 reason（如 `TOO_LONG`）

## 依赖与关联

- **依赖**：`core-contract`、`width-measurement`、`breakpoint-candidates`、`scoring-tiebreak`、`overflow-fallback`
- **被依赖**：`integration`、`golden-tests`

