# Output Consistency for Multi-Campus Batch Processing

**Lesson learned**: 2026-06-30 — 跃龙路 vs 解放中路/星月等7校区

## Root Cause: LLM Context Anchoring

LLM output style is heavily influenced by what's in the context window:
- **Consecutive processing** (same session, same time window): previous campus outputs are still in context → LLM naturally "copies the style" → consistent output
- **Separated processing** (different session, different time): previous outputs are gone → LLM generates with its own default style → drift

This is NOT a workflow bug or a rules problem. The rules were the same. The output format specification was the same. But the LLM produced different styles because the **contextual anchor** was different.

Maggie's concern (verbatim): "金额，风险，模版对比各列内容的审查和修改意见表达都不一样了...第一批里从解放中路到星月的审查逻辑和表达都是一致的，为什么到跃龙路又变掉了？"

## Three-Layer Defense

### Layer 1: Fixed Templates in Workflow Prompt (hardest constraint)

Embed complete output examples + "禁止" (prohibited) rules directly in the data-extractor role's procedure section. Example structure:

```yaml
H列格式规范:
  风格: 段落式叙述
  结构: 【租金】→【付款推算】→【押金】→【物业费】→【违约金】
  禁止:
    - bullet符号（•、-、*）
    - "【大类·条款号】"合并标题
    - 过度拆分为逐行小条目

K列格式规范:
  风格: 先【整体评价】段落，再❗【需客户核实】编号列表
  禁止:
    - "10项风险（3高/5中/2低）："统计式开头
    - "1.【高·第十条】"标签格式
    - markdown表格列风险

L列格式规范:
  风格: 一句话说明+编号列表
  禁止:
    - "34处差异（16缺失/15修改/3新增）vs 07模版："统计式开头
    - "【核心缺失】"分类小标题
    - "vs"分隔模版和合同
```

Updated in nantong-lease-audit.yaml v2 (hash: `C77579MQ9QPKE`).

### Layer 2: Load Previous Campus Output as Reference

Before generating data for a new campus, read the most recent completed campus xlsx and extract H/K/L column content as style reference:

```bash
REF_XLSX=$(ls -t /path/to/campuses/*/*梳理*.xlsx 2>/dev/null | head -1)
```

Use openpyxl to read H/K/L values from the first data row, inject into the data-extractor prompt context.

### Layer 3: Post-Processing Validation Script

Run `scripts/output-style-check.py <row-data.json>` after data extraction:
- Checks 8 rules across H/K/L/J columns
- Exit 0 = pass, exit 1 = fail (lists specific issues)
- If fail → fix the specific issues before proceeding to xlsx generation

## Key Insight

Rules alone are insufficient to prevent style drift. The LLM needs **concrete examples in context** at the moment of generation. Three layers provide redundancy: if Layer 1 is imperfectly followed, Layer 2 gives a fresh anchor, and Layer 3 catches what slips through.
