# Round 13 — Tower Floors J10-J12 · Quality & Context Wing

**Date**: 2026-04-30
**Status**: ✅ COMPLETE

---

## 🏛️ Quality Wing Layout

```
J09.5 (5W Aggregator)
        │
        ▼
   J10 Vector Search   ←─── pgvector cosine on 31,590 articles
        │
        ▼
   J11 FactCheck       ←─── cross-reference + external APIs
        │
        ▼
   J12 Tone Analyzer   ←─── Maariv brand voice
        │
        ▼
   J13-J17 Writers Wing
```

3 קומות **רציפות** (sequential, לא parallel). הסיבה: J11 צריך נתונים מ-J10, J12 מ-J11.

---

## 🔍 J10 · Vector Search (Context Discovery)

**תפקיד**: מצא 5-12 כתבות דומות מ-archive.

**Algorithm**:
```python
# pgvector cosine search
context = await db.fetch("""
    SELECT id, title, body, lead, image_url, published_at,
           1 - (vector_5w <=> $1::vector) as similarity
    FROM jason_items
    WHERE tenant_id = $2 AND status = 'published'
    ORDER BY vector_5w <=> $1::vector
    LIMIT $3
""", embed_5w(envelope.w5), tenant_id, top_k)
```

**Output**:
```json
{
  "matches": [
    {
      "id": 28391,
      "title": "כיפת ברזל - היסטוריה של מערכת",
      "similarity": 0.92,
      "image_url": "https://assets.clastop.app/img/maariv/...",
      "published_at": "2025-12-14",
      "desk": "security"
    },
    /* ... 5-12 matches */
  ],
  "total": 7,
  "avg_similarity": 0.85
}
```

**Cost**: 0.00001$ · 80ms (pgvector מהיר במיוחד)

**A2UI** (streaming, per match):
```json
{"updateComponents":{"components":[
  {"id":"ctx-1","component":"ContextCard","mode":"compact","title":"...","score":0.92,"image":"..."}
]}}
{"updateComponents":{"components":[
  {"id":"ctx-2","component":"ContextCard",...}
]}}
```

---

## ✓ J11 · FactCheck

**תפקיד**: לבדוק טענות ב-press release מול:
1. Context articles (מ-J10)
2. Wikipedia API (entities)
3. Government data sources (open data)
4. Past press releases מ-MOD/IDF feeds

**Algorithm**:
```python
claims = extract_claims(envelope.input.text)  # via LLM
for claim in claims:
    sources = []
    sources.append(check_against_context(claim, j10_results))
    sources.append(check_wikipedia(claim))
    sources.append(check_gov_data(claim))

    verdict = aggregate_verdict(sources)
    yield {"claim": claim, "verdict": verdict, "sources": sources}
```

**Output**:
```json
{
  "claims": [
    {
      "claim": "12 סוללות כיפת ברזל",
      "verdict": "supported",
      "sources": ["context:28391", "wiki:Iron_Dome"],
      "confidence": 0.94
    },
    {
      "claim": "5 מיליארד שקל",
      "verdict": "unverified",
      "sources": [],
      "confidence": 0.6,
      "needs_editor": true
    }
  ]
}
```

**Cost**: 0.001$ · 1.5s (LLM extraction + 3-5 API calls)

**A2UI**: per-claim `FactCheckFlag` inline ב-article body.

---

## 🎭 J12 · Tone Analyzer

**תפקיד**: לבדוק שהטקסט תואם **brand voice** של ה-tenant.

**Maariv brand voice** (מ-`maariv.theme.jason.json`):
- Formality: 0.7 (semi-formal)
- Drama: 0.6 (moderate emphasis on impact)
- Israeli-centric framing: 0.8
- Avoid: hyperbole, sensationalism, foreign loanwords

**Algorithm**:
- score על 5 dimensions (formality, clarity, drama, neutrality, brand-fit)
- LLM-based scoring + rule-based filters

**Output**:
```json
{
  "scores": {
    "formality": 0.72,
    "drama": 0.55,
    "clarity": 0.81,
    "neutrality": 0.65,
    "brand_fit": 0.88
  },
  "overall": 0.74,
  "matches_tenant_voice": true,
  "warnings": []
}
```

**Cost**: 0.0002$ · 400ms

**A2UI**: `BrandVoiceIndicator` (gauge 0-100).

---

## ⏱️ Timing מצטבר

| Floor | Time | Cost |
|---|---|---|
| J10 Vector | 80ms | 0.00001$ |
| J11 FactCheck | 1500ms | 0.001$ |
| J12 Tone | 400ms | 0.0002$ |
| **Sequential total** | **~2s** | **0.00121$** |

ה-J11 הוא ה-**bottleneck**. עתידית — paralleliz הclaims בתוך J11 → 700ms.

---

## ✅ Closure

✅ Round 13 closed. **Quality wing = ~2s, 0.0012$**.
