# integration（技术计划）

## 1. 计划目标

实现对外统一入口 `wrapText()`（纯函数风格），把已完成的子模块串成可复用算法模块，供 Home（APP）与 Widget（WIDGET）调用：

- 参数口径统一：`lang/context/availableWidth/maxLines/overflowMode/lineMode/configVersion/debug`
- 输出统一：`lines[]/wrappedText/meta`，且 meta 可用于治理与 UI 兜底
- 当 `meta.fallback_type=SYSTEM_DEFAULT` 时，UI 可选择交给系统排版（算法层仅标记，不擅自改变 UI 行为）

## 2. 入口签名（与大 spec 对齐）

实现并导出：

```ts
wrapText({
  text,
  lang,
  availableWidth,
  maxLines,
  context,
  fontSpec?,
  overflowMode?,
  lineMode?,
  constraints?,
  configVersion?,
  debug?
}) => { lines, wrappedText, meta }
```

## 3. 组装流程（按执行顺序）

1. **normalizeWhitespace**（core-contract）
2. **tokenize**
   - EN：tokenizeEN
   - TC：segmentGraphemes → Token[]
3. **breakpoint-candidates**
   - generateBreakpoints（传入 constraints.forbiddenBreakRanges）
4. **search**
   - APP：searchBestLayoutApp（DP+TopK，测量优先）
   - WIDGET：searchBestLayoutWidget（Beam，默认 APPROX；可选 MEASURE）
5. **overflow-fallback**
   - 当搜索失败或未覆盖到 N：按 overflowMode 执行（ELLIPSIS/CLIP/SYSTEM_DEFAULT）
6. **meta 汇总**
   - breaks（若可得）
   - scoreTopTerms（debug=true 时）
   - fallback_type/overflow_type/reason
   - configVersion

## 4. 默认值与映射（固定，确定性）

- `overflowMode`：
  - APP 默认 `CLIP`
  - WIDGET 默认 `ELLIPSIS`
- `lineMode`：默认 `AUTO`
- `configVersion`：默认 `'v1'`（若调用方未传）
- WIDGET widthMode：默认 `APPROX`

## 5. 代码落位（客户端）

- `client/src/features/textWrap/`
  - `wrapText.ts`（入口实现）
  - `types.ts`（对外输入/输出类型）
  - `index.ts`（统一导出）

## 6. 测试与回归

- 将 `golden-tests` 的测试入口从测试 harness 切换为正式 `wrapText()`（期望不变）
- 增加 1 个 integration 单测：验证 `SYSTEM_DEFAULT` meta 语义不变

## 7. 完成定义（DoD）

- `wrapText()` 可在 APP/WIDGET 两种 context 下运行
- 输出 meta 字段可用于 UI 治理与回溯（含 configVersion）
- 全量 `npm test` 与 `tsc --noEmit` 通过
- overview 更新记录变更文件

