# Plan 08: Track Synthesizer Novel Content in Attribution

## Branch: `feature/attribution-novel-content`

## Problem
Attribution contribution percentages don't sum to 100%. In the last run, only 69% of final sentences were attributed (14+15+26 out of 80). The remaining 31% are novel content generated by the synthesizer — this should be tracked explicitly.

## Changes

### 1. `src/mar/models.py` — Add fields to `AttributionReport`
```python
class AttributionReport(BaseModel):
    providers: list[ProviderAttribution] = Field(default_factory=list)
    similarity_threshold: float = 0.6
    sentence_count_final: int = 0
    novel_sentences: int = 0  # NEW — sentences not matching any provider
    novel_pct: float = 0.0  # NEW — percentage
    synthesis_provider: str = ""  # NEW — which provider did synthesis
```

### 2. `src/mar/analysis/attribution.py` — Compute novel content

In `analyze()`, after computing per-provider attributions, count unattributed sentences:

```python
def analyze(self, result: DebateResult) -> AttributionReport:
    ...
    # After computing attributions
    total_attributed = sum(a.contributed_sentences for a in attributions)
    novel = len(final_sentences) - total_attributed
    novel_pct = (novel / len(final_sentences) * 100) if final_sentences else 0.0

    return AttributionReport(
        providers=attributions,
        similarity_threshold=self.threshold,
        sentence_count_final=len(final_sentences),
        novel_sentences=novel,
        novel_pct=round(novel_pct, 1),
    )
```

### 3. `src/mar/display/renderer.py` — Show novel content in attribution table

Add a row at the bottom of the attribution table:
```python
def show_attribution(self, report: AttributionReport) -> None:
    ...
    # After provider rows
    table.add_row(
        "[dim]Synthesizer (novel)[/dim]",
        "[dim]-[/dim]",
        f"[dim]{report.novel_pct:.1f}% ({report.novel_sentences}/{report.sentence_count_final})[/dim]",
        "[dim]-[/dim]",
        "[dim]-[/dim]",
    )
    self.console.print(table)
```

### 4. `src/mar/output/writer.py` — Add novel row to attribution.md

Add after provider rows in the summary table:
```python
lines.append(
    f"| *Synthesizer (novel)* | - "
    f"| {report.novel_pct:.1f}% ({report.novel_sentences}/{report.sentence_count_final}) "
    f"| - | - |"
)
```

## Verification

1. **Percentage check**: Run a debate. Sum all provider contribution_pct + novel_pct. Should equal ~100% (may be slightly off due to rounding).
2. **Non-zero novel**: In most runs, novel_pct should be > 0 since the synthesizer adds its own phrasing.
3. **Display**: Verify the "Synthesizer (novel)" row appears in both terminal table and attribution.md.
4. **Edge case**: If no final answer, novel should be 0/0%.
