# SPEC-COVERAGE-A4A5 — Phase 2B spec-fedés a Riport-ágra

**Dátum.** 2026.05.25 · **Phase.** 2B (lezárva — Batch 1+2+3 mind kész)
**Hatókör.** A4 Dashboard (`/fooldal`) + A5 archívum-lista (`/riportok`) + A5 adatlap (`/riportok/details/<id>`)
**Forrás.** `uploads/urbino-docs/00_domain_model.md` §2.4 (`WeeklyReport` entitás) + §2.5 (`WeeklyReportRecipient`) + `20_admin_felulet/40_riport.md` (teljes; különös tekintettel §3.2 + §3.2.1–3.2.2 + §3.6.1 + §4.2 + §4.3 + §4.4) — összesen 9 SD-49…SD-57 spec-döntés + 43 AC.
**Screen-mock-ok.** `manager-system/preview/screens/a4-fooldal.html` · `a5-riportok-lista.html` · `a5-riportok-adatlap.html`

> **Módszertan.** Forward pass (spec → screen) + backward pass (screen → spec). Mező-szinten. A mock-doksi-réteg (`screen-header`, `DesignCanvas`, `DCArtboard` label, `State<X>` komponens) a backward-pass-on **kizárva** (`SCREEN-CONVENTIONS.md` §5). Az `AUDIT-2.md` 3.3 **A5 RIPORT-ADATLAP `RecipientsCard` INLINE-PÓTLÁS** dokumentált — a backward-pass-on **NEM tekintjük UI-találmánynak**, hanem mock-szintű kényelmes-pótlásnak (a kanonikus `RecipientList` + `WeeklyReportCard` helyett); a HANDOFF.md-ben átadási megjegyzés.
>
> **4 lista.** ✅ Spec + screen-en megvan · ⚠ Spec-ben van, screen-en nincs · 🟡 Screen-en van, spec-ben nincs, DE D-X rögzíti · 🔍 Screen-en van, spec-ben nincs, NEM dokumentált (UI-találmány). A `⚠` és `🔍` tételek **külön** szerepelnek a `SPEC-FEEDBACK.md` `## A4+A5 spec-szelídítések` fejezetében.

---

## Batch-térkép

| Batch | Tartalom | Mezők / elemek | Státusz |
|---|---|---|---|
| **1** | A4 Dashboard (`/fooldal`) — `DashboardDto` (KPI + team + latestReport) + §4.2 UI-szerződés | 14 mező + 5 UI-blokk | ✓ lezárva |
| **2** | A5 archívum-lista (`/riportok`) — `WeeklyReportListDto` oszlopok + §4.3 viselkedés | 7 oszlop + 6 állapot | ✓ lezárva |
| **3** | A5 adatlap (`/riportok/details/<id>`) — `WeeklyReportDto` + `snapshotData` + §4.4 szekciók + akciók | 18 elem + 4 állapot | ✓ lezárva |

**Forrás-volument.** 9 spec-döntés (SD-49..57) a `40_riport` modulon belül, 43 acceptance criterion (AC-A1..A9 + AC-B1..B11 + AC-C1..C9 + AC-D1..D10 + AC-E1..E7 + AC-F1..F6). A `40_riport.md` v1.0 (2026.05.20) **a Phase 2A-hoz képest kevesebb mezőt vezet be, de szigorúbban prescriptív** a UI-megjelenítésre — a backward-pass UI-találmány-kategória ennek megfelelően arányosan nagyobb.

---

# Batch 1 — A4 Dashboard

## Forward pass — `DashboardDto` 14 mező + §4.2 UI-szerződés

### ✅ Spec-ben + screen-en is megvan

| Spec-mező / UI-blokk | Spec-forrás | Screen-evidence |
|---|---|---|
| `kpi.openCount` | `40` §3.2 + §3.2.1 (SD-51: `status ∈ {New, Assigned, InProgress}`) | A4 `KPIS_NORMAL[0]` `label='Nyitott ügyek'`, `value=34`, `hint='Új, Kiosztva és Folyamatban együtt'`; `KPIS_HEALTHY[0].value=18`; first-time `a4-kpi-empty` value `0`. |
| `kpi.newToday` | `40` §3.2.1 (`createdAt ∈ [ma_kezdete, ma_vege)`, **státusztól függetlenül** — EC-12) | A4 `KPIS_NORMAL[1]` `value=6, hint='Ma érkezett bejelentések'`. A `createdAt`-szűrés (nem `New`-szűrés) explicit a hint-szövegben. |
| `kpi.overdueCount` + danger-tone | `40` §3.2.1 (SD-30 #1: `status ∈ {nyitott} ∧ dueDate < ma_kezdete`); §4.2 ("**figyelemjelölés**, ha `> 0`") | A4 `KPIS_NORMAL[2]` `value=3, tone='danger', hint='Határidőn túli nyitott ügy'`. A `KpiCard` organism `mgr-kpi--danger` modifier piros bal-border + piros érték (D-12). Healthy state `value=0`, `tone` nem aktivált — **AC-A4/A5 helyesen tükrözve**. |
| `kpi.resolvedToday` | `40` §3.2.1 (`resolvedAt ∈ [ma_kezdete, ma_vege)`) | A4 `KPIS_NORMAL[3]` `value=8, hint='Ma megoldott bejelentések'`. |
| `team[].userId` | `40` §3.2.2 (`TenantUser.id`) | A4 `TEAM_ROWS[].id` (3, 6, 5, 9). |
| `team[].displayName` | `40` §3.2.2 | `TEAM_ROWS[].displayName` ('Szabó Zoltán', 'Varga Eszter', 'Horváth Pál', 'Kovács Zoltán'). |
| `team[].resolvedThisWeek` | `40` §3.2.2 (SD-54: `resolvedAt ∈ [het_kezdete, het_vege) ∧ assignedUserId == userId`) | `TEAM_ROWS[].closedThisWeek` (12, 7, 3, 0). Mock-prop névkonvenció a TeamPerformanceTable JSX-belső (sor 73: `r.closedThisWeek`) szerint — a DTO-camelCase-re az Angular-portoláskor átmappelhető. |
| `team[].inProgressCount` | `40` §3.2.2 (`status == InProgress ∧ assignedUserId == userId`) | `TEAM_ROWS[].inProgress` (3, 2, 1, 0). |
| `team[].averageResolutionDays` + `null → "—"` | `40` §3.2.2 + EC-1 (AC-B7) | `TEAM_ROWS[].avgResolutionDays` (1.8, 2.4, 3.1, **null**); a `formatAvg()` helper (`team-performance-table.jsx:28`) `null → '—'`-t ad (AC-B7 helyesen), `1.8 → '1,8 nap'` (magyar tizedes-vessző). |
| TPT default rendezés `resolvedThisWeek DESC` | `40` §3.2.2 ("Default rendezés") | `TEAM_ROWS` 12 → 7 → 3 → 0 sorrendben. |
| TPT munkatárs-lefúrás (Wow #2) | `40` §3.2.2 + §4.2 + 4.2-MH-R3 (`/bejelentesek?assignee=<userId>`) | `defaultHref(userId)` `team-performance-table.jsx:34` `URLSearchParams({ assignedUserId: String(userId) })` — a manager-side DTO-mező-név (`assignedUserId`) vs. spec-query-param-név (`assignee`) eltérés egy minimális mapping-kérdés (lásd `⚠ #1`). |
| `latestReport.available` | `40` §3.2 + §4.2 ("ha `false`, a gomb tiltott, és tooltip jelzi: 'Az első heti riport hétfőn készül el.'") | A4 `HeadRow` `reportAvailable` prop: Normal/Healthy `true` → primer gomb; First-time `false` → `u-btn--secondary` `disabled` + `title='Az első heti riport hétfőn készül el.'` — **a spec literal-i18n-szövegét pontosan tükrözi**. |
| "Heti riport letöltése" CTA pozíció: PageHeader jobb | `40` §4.2 ("jobbra a 'Heti riport letöltése' gomb") | A4 `HeadRow` `a4-head__cta-block` flex-end pozícióban; az `<Icon name='file-text' />` + "Heti riport letöltése" szöveg. **Spec literal-text egyezik.** |
| TPT empty: "Még nincs aktív terepi dolgozó" | `40` §4.2.1 ("Még nincs terepi munkatárs felvéve.") + §4.2.1 üres-állapot | A4 `StateFirstTime` `a4-tpt-empty` "Még nincs terepi munkatárs felvéve." + "A Beállítások / Felhasználók oldalon hívj meg egy terepi munkatársat. A heti teljesítményük itt jelenik majd meg." — **spec literal-text közel pontosan tükrözve** (a TPT-organism saját `mgr-tpt__empty` fallback szövege ettől eltér, de a screen-mock felülírja). |
| KPI snapshot (nincs delta, nincs hét-váltó) | `40` §3.2 + §3.2.1 (a 4 KPI snapshot-szám, nem trend); D-16 (delta + hét-választó **törölve**) | A4 `KPIS_NORMAL` nem ad át `delta`-propot; az `a4-head` blokkban nincs hét-választó nyíl. **D-16 D-12-revíziója helyesen átvezetve.** |


### ⚠ Spec-ben van, screen-en nincs — hiányosság

#### ⚠ #1 — `team[].isTopPerformer` vizuális jelölés a TeamPerformanceTable organism-ben hiányzik
- **Spec.** `40` §3.2.2 — `isTopPerformer: true` annál az **egy** sornál, amelynek `resolvedThisWeek` szigorúan max ÉS `> 0`; SD-55/a. D-16 vizuális rögzítés: *"a sor jobb-szélén egy csillag-glyph + 'A hét teljesítménye' tooltip"*. AC-B8/B9/B10 3 acceptance criterion erre épül.
- **Screen.** A4 `TEAM_ROWS[0]` (Szabó Zoltán) mock-adata `isTopPerformer: true`-t **átadja**, de a `team-performance-table.jsx` organism **JSX-render-függvénye nem olvassa be** a propot — sehol nincs `r.isTopPerformer`-utalás (sor 38–88 ellenőrizve). A 4-oszlopos grid-row változatlanul renderel; **vizuális jelölés nincs**, holott a mock-prop átadja. A `mgr-tpt__row--top-performer` modifier sincs a `_styles.css`-ben.
- **Hatás.** D-16 deklarációja **félre-implementált**: a prop a DTO-szerződés szerint érkezik, a screen-fájl továbbadja az organism-nek, az organism elhallgatja. Az Angular-portoláskor **a fejlesztő nem fog észrevenni rést** — a backend mező pontosan érkezik, a render-réteg hallgat.
- **Döntés.** **JAVÍTANDÓ** — a `team-performance-table.jsx` organism `row` JSX-éhez `{r.isTopPerformer && <span className="mgr-tpt__star" title="A hét teljesítménye">★</span>}` (vagy `<Icon name="star" />`) elem felvétele; `_styles.css`-be `.mgr-tpt__star` szabály (15px, `--u-amber-500` szín, `margin-left: 8px`). **SPEC-FEEDBACK SF-18** (organism-pótlás, NEM spec-szelídítés).

#### ⚠ #2 — "Aznap lezárt" KPI lefúrás `resolvedFrom/resolvedTo` paraméter — VF-R1 visszacsorgó jelzés
- **Spec.** `40` §4.2 ("Az 'Aznap lezárt' az egyetlen, amelyhez a `10` lista bővítése kell: egy `resolvedAt` 'lezárás dátuma' szűrő — ez a **VF-R1 visszacsorgó jelzés** a `10` feature-spec felé. Amíg a VF-R1 nincs átvezetve, az 'Aznap lezárt' átmenetileg a `/bejelentesek?tab=lezart`-ra fúr le dátum-szűrő nélkül.").
- **Screen.** A4 `KPIS_NORMAL[3].href = '/bejelentesek?tab=lezart&resolvedFrom=ma&resolvedTo=ma'` — **a teljes URL-t rajzolja**, mintha a `resolvedFrom/To` szűrő a `10` listán már létezne. Az SF-1 (Phase 2A) jelenleg 6 oszlopra szűkítette a `10` listát; sem a `resolvedFrom/To` query-paraméter-elfogadás, sem a UI-szűrő-mező nem implementált.
- **Hatás.** A vezető rákattint a kártyára → a `/bejelentesek` lista a `tab=lezart` szűrést alkalmazza, a `resolvedFrom/To` query-paraméter **csendben elnyelődik** (vagy hibásan értelmezve mindent eldob). A demo-élmény eltér a `40` §4.2 átmeneti viselkedés-leírásától.
- **Döntés.** **JAVÍTANDÓ** — két lehetőség:
  - **(a) Pilot-átmeneti:** a screen-mock `href`-jét `'/bejelentesek?tab=lezart'`-ra szűkíteni (a `40` §4.2 átmeneti viselkedését pontosan tükröző), amíg a VF-R1 nincs a `10`-en átvezetve.
  - **(b) VF-R1 átvezetése a `10`-en:** a `10_bejelentes_lista_es_adatlap.md` 4.2 oszlop-katalógusát egy `resolvedAt`-szűrővel bővítendő (`resolvedFrom`/`resolvedTo` query-paraméterekkel).
- Az (a) opció **mock-szintű**, az (b) **spec-feedback**. **SPEC-FEEDBACK SF-19** (kettős): mock-átmeneti törlés + `10` 4.2 emlékeztető. A `40` 8.3 VF-R1 már rögzíti — a jelen Phase csak újraértékesíti.

#### ⚠ #3 — `latestReport.year` / `latestReport.isoWeek` csak közvetve ("Múlt heti riport · 20. hét" CTA-hint)
- **Spec.** `40` §3.2 `DashboardDto.latestReport: { weeklyReportId, year, isoWeek, available }` — a `year` és `isoWeek` mezők a CTA-feliratban / -tooltipben hasznosíthatóak. A spec §4.2 viszont nem ír explicit megjelenítés-kötelezettséget — csak az `available` mezőre.
- **Screen.** A4 `HeadRow` `reportMeta="Múlt heti riport · 20. hét"` (a `a4-head__cta-hint` mono-stringben). A "20. hét" formátum a `latestReport.isoWeek`-ből számítható; a year nincs megjelenítve. Mock-statikus érték — nincs DTO-prop-injektálás.
- **Döntés.** **NEM hiányosság, csak felmérési pontosság.** A CTA-hint a `latestReport.year + isoWeek` fogyasztója lehetne (DTO-prop-mappelendő). A spec §4.2 nem explicit kötelez; D-16 nem említi. **🟡 → 🔍 határeset; a 🔍 #4-be olvasztva** (lásd ott).


### 🟡 Screen-en van, spec-ben nincs, DE D-X rögzíti

| Screen-elem | Hol jelenik meg | D-X hivatkozás |
|---|---|---|
| KPI 4×1 grid (CSS-szinten `repeat(4, 1fr)`, 960px alatt 2×2) | A4 `.mgr-dash__kpi-grid` | **D-12** ("KPI 4×1 grid, 960px alatt 2×2 — CSS media-query bevarrt szabály") |
| KPI egész kártya kattintható + always-chevron | `KpiCard` organism `Tag = href ? 'a' : 'button'` + `mgr-kpi__chev` always-visible | **D-12** ("hover-on chevron-affordance — konzisztens a TriageBar always-chevron mintával D-4/T-2B") |
| KPI `tone='danger'` piros bal-border + piros érték | `mgr-kpi--danger` modifier | **D-12** ("Danger tone = piros bal-border + piros érték a Késésben KPI-hoz") |
| KPI `value` `tabular-nums` `--u-font-display` | `mgr-kpi__value` | **D-12** ("Az érték `tabular-nums` family-font") |
| TPT saját grid-row (NEM generikus `DataTable`) | `mgr-tpt__head` + `mgr-tpt__row` | **D-12** ("TPT saját stílusú grid-row; nem a generikus DataTable, mert a 4-oszlopos numerikus fókusz speciális Wow #2 név-link + szám-link cellánként") |
| TPT magyar tizedes-vessző (`2,3 nap`) | `formatAvg(days).replace('.', ',')` | **D-12** ("vesszős magyar tizedessel") |
| `null → '—'` `mgr-tpt__num--muted` | `team-performance-table.jsx:84` | **D-12** ("hiányzó adatra `—` (mute)") |
| Section-fejléc "Ez a hét" | A4 `.a4-sect-head__title` | **D-12** + spec §4.2 ("'Ez a hét' blokk") — kettős fedés, **spec rögzíti**, így valójában ✅. (Tisztán dokumentációs ok itt lévő rögzítés.) |
| Section-fejléc "Terepi csapat-teljesítmény" | A4 `.a4-sect-head__title` | **D-16** ("'Terepi csapat-teljesítmény' elnevezés — pontosabb, mint a generikus 'Csapat'") + spec §3.2.2 ("a `roles ∋ field_worker AND status = Active` szűrésre") |
| "Heti riport letöltése" CTA pozíció: PageHeader jobb | A4 `HeadRow.a4-head__cta-block` | **Spec §4.2 RÖGZÍTI** — *"a tenant neve … és jobbra a 'Heti riport letöltése' gomb"*; D-16 megerősíti. → A prompt explicit utasítása szerint **ha spec rögzíti → ✅**, **ha csak D-16 → 🟡**. A spec rögzíti, tehát **valójában a fenti ✅-blokkba tartozik** — itt csak referenciálisan rögzítve, hogy ez a fedés D-16-nak is része. |
| TPT-empty informatív szöveg ("A Beállítások / Felhasználók oldalon hívj meg…") | A4 `StateFirstTime` `a4-tpt-empty__desc` | **D-12** ("Empty team-table: informatív, 'Még nincs aktív terepi dolgozó.' üzenettel — pilot-élmény") + spec §4.2.1 i18n-kulcs (`dashboard.team.empty`) |
| KPI hint-szöveg ("Új, Kiosztva és Folyamatban együtt", "Ma érkezett bejelentések", "Határidőn túli nyitott ügy", "Ma megoldott bejelentések") | `KpiCard.hint` prop | **D-12** általános bake-in — a `hint`-prop az organism-API része; a konkrét szövegek spec-vetület-újrafogalmazások (a spec §3.2.1 prózai meghatározásait kondenzálják). i18n: `dashboard.kpi.*` hint-kulcsok várhatóak — pilotra accepted. |
| First-time empty KPI-k (dashed border, `a4-kpi-empty__value` `--u-fg-4` muted) | A4 `StateFirstTime` 4× `a4-kpi-empty` | **D-12** általános bake-in (üres-állapot a 'KPI = 0' AC-A8 esete) + EC-1; vizuális kódolás (dashed + muted) screen-mock-szintű. |


### 🔍 Screen-en van, spec-ben nincs, NEM dokumentált — UI-találmány

#### 🔍 #1 — Hét-eyebrow ("FŐOLDAL · 2026. 21. HÉT · SZERDA, 05.20")
- **Hol.** A4 `HeadRow.a4-head__eyebrow` — `font-mono`, `letter-spacing: 0.06em`, `text-transform: uppercase`, color `--u-fg-3`. Mind a 3 állapot-screenen szerepel.
- **Spec.** `40` §4.2 a fejlécre **kizárólag a tenant nevét** írja ("Főoldal — <tenant neve>"); a NavStore breadcrumb-ja "Főoldal" stringet ad (`90_sitemap_v3.md` 2.1). A passzív hét-jelzés (ALL CAPS mono-eyebrow) sehol nem dokumentált. **D-16 explicit törli a hét-választó nyilakat**, de a passzív hét-eyebrow szürke zónát foglal el — D-16 nem érinti közvetlenül, viszont ugyanannak a logikának a halvány maradéka: ha a dashboard "mindig az aktuális hét snapshot-ját" mutatja (D-16), akkor a heti hét-szám kiírása redundáns.
- **Döntés.** **🔍 UI-találmány → TÖRLÉS JAVASLANDÓ.** A fejléc a spec szerint a tenant neve + CTA — az eyebrow elem ennél többet ad, és a D-16 "nincs hét-választó" elvével konceptuálisan ütközik. **SPEC-FEEDBACK SF-20** (része egy 3-eleműes A4-fejléc-egyszerűsítés-csomagnak).

#### 🔍 #2 — Greeting headline ("Jó reggelt, Béla!" / "Szép munka, Béla!" / "Üdv a Urbino-ban, Béla!")
- **Hol.** A4 `HeadRow.a4-head__title` — `font-display`, 26px, `font-weight: 700`.
- **Spec.** `40` §4.2 a `<h1>` címnek **kizárólag a tenant nevét** írja ("Főoldal — Balatonalmádi Önkormányzat"). A személyre szabott üdvözlés sehol nem dokumentált. A **tone-of-voice** (DS `TONE-OF-VOICE.md`) a manager-felületen 30/70 warm/official ratio-t ír — a "Jó reggelt, Béla!" jelentősen túlcsordul a warmth-en (ez a citizen-side `Jó napot, Gergő! 👋` greeting analóg-mintája, ami a citizen-app home-screenjére specifikus, NEM manager-felületre).
- **Döntés.** **🔍 UI-találmány → TÖRLÉS JAVASLANDÓ.** A spec által rögzített tenant-név-cím (vagy egyszerű "Áttekintés" / "Mai nap") a manager-tone-konform megoldás. **SPEC-FEEDBACK SF-20**.

#### 🔍 #3 — Prózai összegző sor a fejlécben ("**34 nyitott** ügy van Balatonalmádi-ban — **3 közülük már határidőn túl**. Ma 6 új bejelentés érkezett, 8-at pedig lezártatok.")
- **Hol.** A4 `HeadRow.a4-head__sub` — 13.5px, `--u-fg-2`, `text-wrap: pretty`.
- **Spec.** `40` §4.2 a 4 KPI-kártyát teszi az "elsődleges" számbevezetésnek; a fejlécben **csak a tenant-név + CTA** szerepel. A prózai narratíva a 4 számot **megduplázza** szöveges formában — felesleges redundancia, és a tone-of-voice (`TONE-OF-VOICE.md` "Direct, not circumlocutory — One sentence = one thought") szellemével ütközik.
- **Healthy-state-variáns** ("A heti riport pénteken 06:00-kor megy ki a 4 címzetthez.") további szabad-szöveg, ami **nem szerepel** sem a `DashboardDto`-ban, sem a §4.2 i18n-kulcs-csoportban.
- **Döntés.** **🔍 UI-találmány → TÖRLÉS JAVASLANDÓ.** A 4 KPI-kártya önmagában elegendő — a prózai narratíva a manager-density elvével (DS `density.css` Header/Canvas/Work/Data) is ellentétes. **SPEC-FEEDBACK SF-20**.

#### 🔍 #4 — "Múlt heti riport · 20. hét" CTA-hint a gomb felett
- **Hol.** A4 `HeadRow.a4-head__cta-hint` — `font-mono`, 11.5px, `--u-fg-3`.
- **Spec.** `40` §4.2 a CTA-ra **csak** a "Heti riport letöltése" feliratot és a disabled-tooltipet ("Az első heti riport hétfőn készül el.") rendeli. A "melyik hét riportját kapod le" előzetes-jelzés (`latestReport.year + isoWeek`-ből számítva) nincs spec-rögzítve. A `dashboard.downloadReport.*` i18n-kulcs-csoport (§4.6) `disabledHint`-et tartalmaz, de "lastReportHint"-et nem.
- **Hasznosság.** A felhasználó-élmény szempontjából **érdemi információ** — a vezető tudja, hogy a múlt-heti riportot kapja, nem a jelen-hetit. A `latestReport.year/isoWeek` mezők erre adottak.
- **Döntés.** **🔍 UI-találmány — formalizálás VAGY törlés**. Két opció:
  - **(a) Formalizálás:** a `40` §4.2 + §4.6 a `dashboard.downloadReport.latestHint` i18n-kulccsal bővítve (paraméterek: `{year}`, `{isoWeek}`), formázás "Múlt heti riport · {isoWeek}. hét" — a `DashboardDto.latestReport.{year,isoWeek}` mezők szabványos fogyasztói lesznek.
  - **(b) Törlés:** a CTA önmagában elegendő; az "Az első heti riport hétfőn készül el." tiltott-állapot-tooltip a kontextust biztosítja.
- Az **(a)** preferált — a `latestReport.{year,isoWeek}` mezők enélkül csak a `available`-flag-számolására lennének (vékony hozzáadott érték). **SPEC-FEEDBACK SF-21** — spec §4.6 i18n-bővítés.

#### 🔍 #5 — Section-subtitle ("Klikkre a számon: /bejelentesek listára visz előszűrve."; "Aktív terepi munkatársak heti tevékenysége. A névre kattintva a hozzá rendelt ügyek listája.")
- **Hol.** A4 `.a4-sect-head__sub` mindkét section-fejléc alatt.
- **Spec.** `40` §4.2 a "Ez a hét" és a TPT szekció-fejlécet rögzíti, de **leíró sub-szöveg sehol nem szerepel**. Ezek a `a4-sect-head__sub` szövegek **a screen-mock dokumentáló-jellegű annotációi** — mintha a vezetőnek tutorialt adnánk, hogyan használja a kártyákat.
- **Hasonlóság más screen-fájlokhoz.** Az A1 lista TabFilter-leíró-sub-szövegek (Phase 2A `🔍`-blokkban szintén nem szerepelnek, de hasonló minta) — esetleg konzisztencia-érv.
- **Tone-of-voice.** A "Klikkre a számon: /bejelentesek listára visz előszűrve." szöveg **mock-developer-vetület**, nem a vezetőnek szól (a vezető nem tudja, mi a "/bejelentesek lista" path). Ez **a screen-mock-fájl mock-doksi-rétegéhez tartozik**, NEM az Angular-portolásra szánt UI-elem.
- **Döntés.** **🔍 UI-találmány → TÖRLÉS JAVASLANDÓ.** A section-fejlécek (eyebrow-szintű) önmagukban elegendőek; a "Wow #2 lefúrás" affordance-a a chevron + hover-state (a `KpiCard` és a `TeamPerformanceTable` name-link már jelzi). **SPEC-FEEDBACK SF-22**.


---

# Batch 2 — A5 archívum-lista (`/riportok`)

## Forward pass — `WeeklyReportListDto` 7 oszlop + §4.3 viselkedés

### ✅ Spec-ben + screen-en is megvan

| Spec-mező / UI-elem | Spec-forrás | Screen-evidence |
|---|---|---|
| Oszlop: Hét (`year + isoWeek`, "2026. 28. hét") | `40` §4.3 (1. oszlop, `year DESC, isoWeek DESC` rendezés) | A5 `WeekCell` `a5-week` "{row.year}. {row.isoWeek}. hét"; `columns[0]` `sortable: true, defaultSortDir: 'desc'`. |
| Oszlop: Időszak (`periodFmt`, "máj. 18. – máj. 24.") | `40` §4.3 (2. oszlop "júl. 6. – júl. 12." magyar dátum) | `WeekCell` második sora `{row.periodFmt}` — **a "Hét" cella alá olvasztva**, NEM külön oszlop (lásd `⚠ #4`). |
| Oszlop: Generálás állapota | `40` §4.3 (3. oszlop, `generationStatus` badge) | `columns[2]` `key='generation', label='Állapot'`; `GenChip` 4-érték badge (completed/failed/generating/pending). |
| Oszlop: Kézbesítés | `40` §4.3 (4. oszlop, `deliveryStatus` badge) | `columns[3]` `key='delivery', label='Kézbesítés'`; `DelChip` 4-érték (allsent/partial/allfailed/pending) + `(N)` recipient-count suffix. |
| Oszlop: Generálva (`generatedAt`, tenant-időzónás dátum+idő) | `40` §4.3 (5. oszlop) | `columns[1]` `key='generatedAt'` `sortable: true, defaultSortDir: 'desc'`; `a5-date` mono-formázott "2026.05.25 · 06:00". |
| `recipientCount` mint a DelChip suffix | `40` §2.2 (`recipientCount` mező); §4.3 nem explicit kötelez, de spec §3.5 SD-56 ez a "részben-sikertelen kontextus" mező | `DelChip` `count > 0 && status !== 'pending'` esetén `(N)` mono-suffix. |
| Default rendezés `year DESC, isoWeek DESC` | `40` §3.3 R-2 + §4.3 | A5 `sortKey='isoWeek', sortDir='desc'`. |
| Sor-klikk → adatlap | `40` §4.3 ("sorra kattintás → riport-adatlap") | A5 `DataTable` `onRowClick={() => {}}` (mock-noop) — a `DataTable` organism `is-clickable` modifier-rel renderel sor-szinten. |
| Üres állapot: "Még nem készült heti riport. Az első riport hétfőn 06:00-kor generálódik…" | `40` §4.3.1 ("Még nem készült heti riport. Az első riport hétfőn generálódik.") | `StateEmpty` `a5-empty__title` "Még nem készült heti riport." + `a5-empty__desc` "Az első heti riport **hétfőn reggel 06:00-kor** generálódik automatikusan az előző naptári hétre." — **spec szöveg + screen finomítás (06:00 időpont)**; a spec §3.6 "tenant-időzónás 7:00 körül" — a 06:00 demo-feltevés, valós deployment-időpont fejlesztői döntés (§3.6). Spec-konzisztens. |
| NEM "Új riport" gomb, NEM bulk-művelet, NEM DELETE | `40` §3.3 + §4.3 ("Eltérés a mintától — A `WeeklyReport` lista csak olvasható") | A5 `A5Screen` `PageHeader.actions` **csak** a "Legutóbbi riport letöltése" CTA-t hordozza (lásd `🔍 #6`); nincs "Új riport" gomb (nincs `R-1 POST /v1/weekly-reports` a 6-route-listán, AC-C9). Bulk-checkbox-oszlop nem renderelt. |
| FilterPillBar: Év szűrő + Kézbesítés szűrő (state-driven) | `40` §4.3 (Időszak ✓ dátum-tartomány-szűrhető; Generálás + Kézbesítés ✓ enum-szűrhető) | A5 `FilterPillBar` 2 pill: `{ key: 'year', value: '2026' }` + `{ key: 'delivery', value: 'Bármi' }`; `StateFailedOnly`-ban `delivery` active-pill "Probléma". |
| Pagination | `40` §3.3 R-2 standard CRUD `BaseController` (offset-paginated SD-11) | A5 `DataTable.pagination={{ page: 1, total: REPORTS.length, perPage: 20, onChange: () => {} }}`. |
| 9 hetes archívum-mock (a pilot ~negyedéves élete) + 1 részben sikertelen + 1 generálás-failed sor | `40` §8.2 (pilot-volumen `~100 bejelentés/hó` SD-11; az archívum heti-egy ráta) + AC-E2 (PartialFailure) + AC-D7 (Failed S3) | A5 `REPORTS` 9 entry: 7× `completed+allsent`, 1× `completed+partial`, 1× `failed+pending` — **mind a 3 generation-status és mind a 4 delivery-status reprezentált** (`completed` 8×, `failed` 1×; `allsent` 7×, `partial` 1×, `pending` 1×, **`allfailed` sehol** — l. lent). |


### ⚠ Spec-ben van, screen-en nincs — hiányosság

#### ⚠ #4 — "Időszak" mint külön szortolható + szűrhető oszlop hiánya
- **Spec.** `40` §4.3 oszlop-katalógusa az "Időszak"-ot **külön oszlopként** rögzíti: ✓ szűrhető (dátum-tartomány), ✓ rendezhető, ✓ alap-látható.
- **Screen.** A5 `columns` (sor 211–217) **5 oszlopot** definiál: Hét / Generálva / Állapot / Kézbesítés / Letöltés. Az "Időszak" cella nincs külön — a `WeekCell`-be (Hét-oszlop) van olvasztva második sorként (`{row.periodFmt}` 11px szürke). A szortolás és a szűrhetőség egyetlen `WeekCell`-en át **nem** különíthető a hét-szám-szortolástól.
- **Hatás.** A spec szerinti `TableStateConfig` "alap-látható" lista 5 oszlopot ír, a screen 5 oszlopa **funkcionálisan eltér**: a "Hét" oszlop sűrítve hordozza az Időszakot, és a "Letöltés" oszlop pótolja a Generálva-utáni 6. oszlopot. Strukturálisan: 6 → 5 oszlop, az "Időszak" oszlop-szintű szortolási affordance elveszik.
- **Megítélés.** Pilot-volumenen (9 sor / ~hét) a "Hét DESC" szortolás funkcionálisan ekvivalens az "Időszak DESC" szortolással (1:1 leképezés). A vizuális elrendezés (Hét + Időszak egy cellában) **density-szempontból jobb** — kevesebb oszlop, jobb áttekintés.
- **Döntés.** **JAVÍTANDÓ-MERLEGELÉS** — két opció:
  - **(a) Spec-konform szétválasztás:** Hét és Időszak két különálló oszlop, mindkét fejléc szortolható + szűrhető.
  - **(b) Spec-szelídítés:** a `40` §4.3 oszlop-tábla "Időszak" sorát törölni, mert a Hét hordozza; a `TableStateConfig`-vázlat alap-látható listája 4-re csökken.
- A **(b)** vélelmezhetően jobb pilot-élmény. **SPEC-FEEDBACK SF-23** — spec §4.3 oszlop-tábla revízió.

#### ⚠ #5 — `allfailed` `deliveryStatus`-szal állapotú `WeeklyReport` mock-data hiánya
- **Spec.** `40` §2.3 `ReportDeliveryStatus` **4 érték**: `Pending` / `AllSent` / `PartialFailure` / `AllFailed`. AC-E3 explicit acceptance: `AllFailed` esetén a `generationStatus == Completed` változatlan.
- **Screen.** A5 `REPORTS` (9 sor) **NEM tartalmaz `allfailed` deliveryStatus-szal állapotú sort** — 7× `allsent`, 1× `partial`, 1× `pending` (mert `failed` generation után a delivery `pending`). A `DelChip` CSS-szabálya (`a5-st--allfailed`) viszont definiált (sor 79–80, piros háttér), tehát a vizuális vetület ki van dolgozva — csak a mock-adatban nincs eset.
- **Hatás.** A vezető demo-élménye nem mutatja a "minden címzettnek failed" állapotot — pedig ez a kritikus eset, ahol a `resend` akció a leghasznosabb. AC-E3 nem demonstrált.
- **Döntés.** **JAVÍTANDÓ MOCK-SZINTEN** — egyetlen sor cseréje a `REPORTS` tömbben (pl. ID 17 `delivery: 'allsent'` → `delivery: 'allfailed'`). NEM spec-szelídítés. **HANDOFF.md átadási megjegyzés**.


### 🟡 Screen-en van, spec-ben nincs, DE D-X rögzíti

| Screen-elem | Hol jelenik meg | D-X hivatkozás |
|---|---|---|
| "Letöltés" oszlop direkt PDF-gombbal (kebab helyett) | A5 `columns[4]` `DlBtn`; `disabled` ha `generation !== 'completed'` | **D-3** ("DataTable sor-end: chevron-only, kebab nélkül — egyetlen-elemű kebab anti-pattern"). A `40` §4.3 a "kebab-menü: PDF letöltése + Megnyitás" formát írja, ami D-3 alatt **csendben átszerelődik** dedikált oszlopra. A "Megnyitás" mint sor-klikk a `chevron-only` mintával. |
| `countLabel` "**9** riport · 2026-ban" / "**N** probléma a 2026-os riportokban" | A5 `DataTable.countLabel` prop | **D-13** (DataTable contract-bővítés, `countLabel` hook a footer-felett — `01_kozos_mintak.md` "TableStateConfig" felirat-pattern) |
| `sortKey="isoWeek", sortDir="desc"` controlled sort | A5 `DataTable` controlled sort propok | **D-13** (DataTable contract-bővítés, `sortKey/sortDir/onSortChange` propok) |
| FilterPillBar "Probléma" `active=true` szűrő-állapot a `StateFailedOnly`-ban | A5 `FilterPillBar` `hasActive` flag | **D-13** általános bake-in (FilterPillBar `active` modifier — Tier-2 UX-explorer) |
| `DelChip` "(N)" mono-suffix a recipient-count megjelenítésére | A5 `DelChip` `count > 0 && status !== 'pending'` | **Spec §2.2** `recipientCount` mező + **D-13** általános bake-in (a "kontextus a kézbesítés-állapothoz") — a fedés a Forward-pass ✅-blokkban, itt csak a megjelenítés-választás (mono-zárójeles) D-13 alapú. |


### 🔍 Screen-en van, spec-ben nincs, NEM dokumentált — UI-találmány

#### 🔍 #6 — "Legutóbbi riport letöltése" CTA a `/riportok` lista PageHeader-jében (R-5)
- **Hol.** A5 `LatestCta` button a `PageHeader.actions` slotban (`A5Screen.showCta=true`, default).
- **Spec.** `40` §4.2 az R-5 (`GET /v1/weekly-reports/latest/pdf`) CTA-elhelyezést a **Dashboard** (`/fooldal`) fejlécbe köti. A §4.3 (`/riportok` lista) **nem írja elő** ezt a CTA-t a fejlécbe — sőt, a "Eltérés a mintától: a `WeeklyReport` lista csak olvasható — nincs 'Új riport' gomb" rész a PageHeader-akciókat **implicit kizárja** (nincs írásművelet).
- **Hasznosság.** A vezető a `/riportok` listán is gyors letöltést akarhat; a `Hét` oszlop legfelső sora a `Completed` legutóbbi — a `Letöltés`-cella minden sornál ott van. A PageHeader-CTA tehát **redundáns** a listán (a top-row letöltés-gombja egyenértékű).
- **Döntés.** **🔍 UI-találmány — TÖRLÉS JAVASLANDÓ vagy formalizálás**. Két opció:
  - **(a) Törlés:** a `/riportok` lista PageHeader-je akció-üres (vagy egy "Beállítások" link a címzettekhez). A vezető a sor `Letöltés`-cellájával éri el ugyanazt.
  - **(b) Formalizálás:** a `40` §4.3 a PageHeader-akcióban explicit rögzíti a "Legutóbbi riport letöltése" R-5-CTA-t, ugyanúgy mint a §4.2-ben. Indok: konzisztens vezetői élmény ("a CTA mindig elérhető").
- Az **(a)** preferált — a CTA a Dashboard-jellegű "azonnal akcióképes" felület része; a `/riportok` archívum-tabula. **SPEC-FEEDBACK SF-25**.

#### 🔍 #7 — "📄" emoji ikon az empty state-en
- **Hol.** A5 `StateEmpty` `a5-empty__icon` `<div>📄</div>` 26px emoji.
- **Spec / DS.** A `README.md` "Emoji — a rule" szakasz **explicit**: *"Default: no emoji. Not in buttons, not in status chips, not in form labels, not in error messages."* Két funkcionális kivétel: **citizen-side** report-categories és **citizen-side** home-screen greeting wave 👋. A manager-felületen **emoji-tilalom**.
- **Megítélés.** A "📄" PDF-irreleváns emoji egy **state-icon** szerepben (DS szerint a state-ikonok kizárólag stroke-Lucide-családból jönnek). A `lucide-file-text` (Icon) drop-in csere.
- **Döntés.** **🔍 → DS-konformitás-javítás**: `<Icon name="file-text" size={26} />` (vagy DS-promóciós Urbino-mark — l. lent). **SPEC-FEEDBACK SF-24** — mock-szintű korrekció, NEM spec-szelídítés.


---

# Batch 3 — A5 adatlap (`/riportok/details/<id>`)

## Forward pass — `WeeklyReportDto` + `snapshotData` + §4.4 szekciók + akciók

### ✅ Spec-ben + screen-en is megvan

| Spec-mező / §4.4 szekció | Spec-forrás | Screen-evidence |
|---|---|---|
| `year` + `isoWeek` | `00_domain_model.md` §2.4; `40` §4.4 ("Hét '2026. 28. hét'") | A5d `a5d-head__week` "{report.year}. {report.isoWeek}. hét" (2026. 20. hét); breadcrumb `[Riportok, '2026. 20. hét']`. |
| `periodStart` + `periodEnd` (`periodFmt` — magyar dátum-tartomány) | `00_domain_model.md` §2.4; `40` §4.4 ("Időszak") | A5d `a5d-head__period` "{report.periodFmt}" ("máj. 11. – máj. 17."). |
| `generationStatus` (4-érték enum) | `00_domain_model.md` §2.4; `40` §2.3 + §4.4 ("Generálás állapota") | A5d `MetaCard` "Generálás" sorral; `a5d-status--{completed/failed/generating}` 3-érték renderelhető (pending nem mock-renderelt — backward-flow szerint pending csak addig amíg pre-generating, gyorsan átkapcsol). |
| `generatedAt` | `00_domain_model.md` §2.4; `40` §4.4 | A5d `a5d-head__meta` "Generálva: {generatedAt} · Urbino rendszer"; `MetaCard` "Generálva" sor. |
| `snapshotData.weekNumbers.resolvedCount` | `40` §2.4 + §3.6.1 + §4.4 ("Lezárt ügyek") | A5d `NumbersCard` "Lezárt" sor: `{numbers.resolved}` (22). |
| `snapshotData.weekNumbers.averageResolutionDays` | `40` §2.4 + §3.6.1 + §4.4 ("Átlagos lezárási idő") | A5d `NumbersCard` "Átlagos lezárási idő" sor: `{numbers.avgDays.toString().replace('.', ',')} nap` (2,1 nap). |
| `snapshotData.weekNumbers.newCount` | `40` §2.4 + §3.6.1 + §4.4 ("Új bejelentés") | `NumbersCard` "Új bejelentés" sor: 28. |
| `snapshotData.weekNumbers.openAtWeekEnd` | `40` §2.4 + §3.6.1 + §4.4 ("Hét végén nyitott"); MH-R2 közelítés | `NumbersCard` "Hét végén nyitott" sor: 34. |
| `snapshotData.weekNumbers.highPriorityOpenAtWeekEnd` | `40` §2.4 + §3.6.1 + §4.4 ("ebből magas prioritású") | `NumbersCard` "Magas prio. nyitott" sor: 3. |
| `deliveryStatus` | `00_domain_model.md` §2.4; `40` §2.3 + §4.4 ("Kézbesítés állapota") | A5d `RecipientsCard` fejlécben `a5d-status--{allsent/partial/allfailed/pending}` chip + "Mind kiküldve / Részben sikertelen / Sikertelen / Még nem ment ki" magyar i18n-szöveg. |
| "Címzettek" szekció címe + `WeeklyReportRecipient.name` + `email` + "A címzett-listát a Beállítások / Általános oldalon módosíthatod." link | `40` §4.4 + SD-57 ("A `50_konfig` aktuális címzett-listája olvasásra. Bevezető: 'A riport a Beállítások / Általános oldalon megadott címzetteknek megy. Jelenlegi címzettek:' — utána a lista. A szerkesztés a Beállításokra mutató link.") | A5d `RecipientsCard.a5d-rec-row` 4 sor (`name + email`) + `a5d-rec-row__email` mono-formátum; szekció-bevezető link "A címzett-listát a [Beállítások / Általános](#) oldalon módosíthatod." — **a spec literal SD-57 szöveget kondenzálja**. (**AUDIT-2 3.3 inline-pótlás** — a kanonikus `RecipientList` + `WeeklyReportCard` helyett inline `RecipientsCard`; ez NEM UI-találmány, hanem **mock-szintű kényelmes-pótlás**, l. methodológia.) |
| "Letöltés" akció-gomb (R-4) — csak `Completed` esetén aktív | `40` §4.4 + R-4 (`GET /v1/weekly-reports/{id}/pdf`) | A5d `a5d-head__cta` `generation === 'completed'` esetén: `u-btn--secondary` "Letöltés"; `generation === 'failed'` esetén `disabled` + `title="A riport még nem készült el — letöltés nem lehetséges"`. **AC-C5 (`409 not_generated`) UI-vetülete tükrözve**. |
| "Riport újraküldése" akció-gomb (R-6) — csak `Completed` esetén aktív | `40` §4.4 + R-6 (`POST /v1/weekly-reports/{id}/resend`) | A5d `a5d-head__cta` `generation === 'completed'` esetén: `u-btn--primary` "Újraküldés"; `generation === 'failed'` esetén nincs gomb (nem disabled — egyszerűen nincs). |
| Üres-állapot `generationStatus = Failed`: "A riport generálása sikertelen volt. A rendszer a következő futáskor automatikusan újrapróbálja." | `40` §4.4.1 ("A riport generálása sikertelen volt. A rendszer a következő futáskor újrapróbálja.") | A5d `StateFailed` `a5d-failed` "A riport generálása sikertelen volt." + `a5d-failed__desc` "A rendszer a következő futáskor (jövő hétfő 06:00) **automatikusan újrapróbálja**. Ha továbbra is hibázik, az Urbino csapatának jelezd." — **spec literal-text + screen-finomítás** (06:00 + escalation-instrukció). |
| Üres-állapot `generationStatus = Generating`: "A riport generálása folyamatban." | `40` §4.4.1 | A5d `StateGenerating` `a5d-gen-skel__title` "A riport generálása folyamatban." + `a5d-gen-skel__desc` "A háttér-job most rajzolja a PDF-et és tölti fel. Ez 1-2 percet vehet igénybe; frissítsd az oldalt utána." — **spec literal-text + screen-finomítás**. |
| 4 állapot-mock (Completed+AllSent, Completed+PartialFailure, Failed, Generating) | `40` §2.3 + §4.4.1 | A5d 4 `DCArtboard`. |


### ⚠ Spec-ben van, screen-en nincs — hiányosság

#### ⚠ #8 — "Kategória szerinti bontás" külön adatlap-szekció hiánya
- **Spec.** `40` §4.4 explicit **3. szekció**: *"**Kategória szerinti bontás** — a `snapshotData.categoryBreakdown` sorai (gyökér-kategória + lezárt szám)"*. Olvasásra rendezve, a vezető PDF-letöltés NÉLKÜL látja a kategóriás bontást — az SD-49 archívum-élmény-érték.
- **Screen.** A5d `REPORT_W20.categoryBreakdown` mock-adat **megvan** (4 sor: Utak és járdák / Közvilágítás / Hulladék / Közterület), de **kizárólag a PDF inline preview-stubban** renderelt (a baloldali iframe-mock `a5d-pdf__bars` blokkban — sor 451–461). A sidebar-szekciók közt (MetaCard / NumbersCard / RecipientsCard) **nincs `CategoryBreakdownCard`**.
- **Hatás.** Ha a vezető a PDF-letöltést kihagyná (mert a UI-szekciók szövegre rendezettek), a `categoryBreakdown` `snapshotData` mező **láthatatlan**. A spec §4.4 azzal érvel, hogy az adatlap a PDF-letöltést **alternatív vetületként** kínálja a vezetőnek — a kategória-bontás ennek része.
- **Megítélés.** A PDF inline preview-mock-ja önmaga **🔍 UI-találmány** (l. lent #11), így a "kategória-bontás csak a PDF-stubban renderel" érv **körkörös**.
- **Döntés.** **JAVÍTANDÓ** — egy 4. sidebar-kártya (`CategoryBreakdownCard`) a `NumbersCard` és a `RecipientsCard` közé:
  ```jsx
  <CategoryBreakdownCard categories={REPORT_W20.categoryBreakdown} resolvedTotal={REPORT_W20.numbers.resolved} />
  ```
  Minden sor: gyökér-kategória név + lezárt szám + opcionálisan kis bar a `count / resolvedTotal * 100` szélességgel. **SPEC-FEEDBACK SF-26**.

#### ⚠ #9 — "Audit" szekció (Létrehozva / Módosítva) hiánya
- **Spec.** `40` §4.4 explicit **5. szekció**: *"**Audit** — Létrehozva / Módosítva (a standard `AuditableEntity`-minta, tenant-időzóna)."* A `WeeklyReport` `AuditableEntity` (§2.2); a `resend` akció az `updatedBy`-t rögzíti — a vezető láthatja, ki indított utolsó újraküldést, mikor (audit-pontosság).
- **Screen.** A5d sehol nem renderel "Audit" szekciót — sem a sidebar-ban, sem a fejlécben. A `generatedAt` és a `Riport adatai` MetaCard megvan, de a `createdAt/By` és `updatedAt/By` mezők kimaradnak.
- **Hatás.** A pilot-volumenen ritkán használt, de a `resend`-aktivitás visszakeresése (ki és mikor indított manuális újraküldést) elveszik.
- **Döntés.** **JAVÍTANDÓ ENYHE** — a `MetaCard`-hoz 2 sor hozzáadása ("Létrehozta", "Módosította"). NEM kritikus. **SPEC-FEEDBACK SF-27** (alacsony prioritás).

#### ⚠ #10 — Resend megerősítő-dialog 5. mock-state hiánya (SD-57)
- **Spec.** `40` §4.4 + SD-57: *"'Riport újraküldése' — az R-6-ot (`resend`) hívja; csak `Completed` esetén aktív. Megerősítő párbeszéd a **konkrét címzettek** felsorolásával: 'Újraküldöd a riportot a következő címzetteknek: <címzett-lista>?'"*
- **Screen.** A5d-ben a "Újraküldés" gomb létezik (`StateCompleted` és `StatePartial`-ban), de **a confirm-dialog-mock-state nincs renderelve** — sem 5. DCArtboard-ként, sem placeholder-overlay-ként. A `ConfirmDialog` organism (Tier-1) létezik, az integráció `onClick`-flow-szerű, de a screen-mock-szinten a flow-pillanat (dialog nyitva, 4 címzett-listával, "Mégse" + "Újraküldés a 4 címzettnek") **nem demonstrált**.
- **Hatás.** A vezető-élmény SD-57-szintű "konkrét címzett-lista a confirm-on" pontossága nincs vizualizálva.
- **Döntés.** **JAVÍTANDÓ ENYHE** — 5. `DCArtboard` a Resend-confirm-dialog mock-state-tel; a `ConfirmDialog` organism + 4-soros címzett-felsorolás a body-ban. **SPEC-FEEDBACK SF-28** (alacsony prioritás).


### 🟡 Screen-en van, spec-ben nincs, DE D-X rögzíti

| Screen-elem | Hol jelenik meg | D-X hivatkozás |
|---|---|---|
| `RecipientsCard` inline-implementáció a kanonikus `RecipientList` + `WeeklyReportCard` helyett | A5d `RecipientsCard` (sor 382–407) | **AUDIT-2.md 3.3** — *"A5 RIPORT-ADATLAP `RecipientsCard` INLINE-PÓTLÁS — meglévő organism létezik, a screen-mock inline-pótolja. A HANDOFF.md-ben átadási megjegyzésként szerepel."* **NEM UI-találmány, hanem mock-szintű kényelmes-pótlás.** A spec-fedettség (✅ Címzettek szekció) ettől független — a *megjelenítés* spec-konform, a *kód-úton-keresztüli megvalósítás* a kanonikus organismet kerüli. |
| 2-oszlopos layout (bal: PDF-preview, jobb: sticky-sidebar 320px) | A5d `.a5d-twocol` `grid-template-columns: minmax(0, 1fr) 320px` | **🔍 #11-höz tartozik** (a PDF inline preview-vel együtt egy döntés); ha a #11 formalizálódik új D-X-be (Q2=A → D-18), akkor 🟡 lesz. Jelenleg explorer-szintű hivatkozás "Q2=A inline iframe + sidebar adatok + akciók" a screen-header-refsben, de **a Q2-explorer NEM rögzített D-X-ként a DECISIONS.md-ben**. |
| "Vissza az archívumhoz" back-link | A5d `a5d-back` a content tetején, breadcrumb alá | **A1 adatlap mintával konzisztens** (a `a1-detail-back` analóg); általános manager-pattern. **Nincs explicit D-X**, de a Phase 2A a4 backward-pass-on hasonló pattern szerepel — Phase 3 átadásakor a HANDOFF.md "általános adatlap-pattern" szekcióját nyitja. Itt **🟡 → 🔍 határeset**; a HANDOFF.md a pattern-t formalizálja. |
| `MetaCard` "Riport adatai" → 3-sor (Generálás-status + Generálva-időpont + PDF-méret) | A5d `MetaCard` (sor 471–488) | A 3-blokk-sidebar (Meta + Numbers + Recipients) **csak részben** D-X-fedett; a 3-kártya-strukturáció a `40` §4.4 5-szekciós listáját (Alapadatok / A hét számai / Kategória / Címzettek / Audit) **átszervezi**. A spec §4.4 strukturális rögzítés-szintje nem dogmatikus ("olvasásra rendezve, szekciókkal"). **🟡 elfogadható UX-választás**; az "Alapadatok" szekció helyett "Riport adatai"-kártya + fejléc-cím-blokk. |


### 🔍 Screen-en van, spec-ben nincs, NEM dokumentált — UI-találmány

#### 🔍 #11 — PDF inline preview iframe-stub (a teljes bal oszlop, ~860×1080) — KRITIKUS
- **Hol.** A5d `PdfInlineStub` komponens (sor 396–467) az `a5d-twocol` bal-oszlopban. **A teljes 1100px-magasság ~80%-át kitölti.** A stub 4 sub-blokkot renderel:
  - Toolbar (sor 397–404): fájlnév + "1/3 oldal · 247 KB" + zoom + lapozó-gombok
  - PDF-header (sor 408–414): logó + tenant-név + hét-meta
  - **"A hét számai" PDF-szekció** (sor 416–425) — `report.numbers` 5 értékkel — **a NumbersCard-ot duplikálja**
  - **"A múlt héthez képest" PDF-szekció** (sor 427–449) — egy 3-soros comparison-tábla, ami a **`prevWeek` mock-adatból** vezet `+/− delta`-értékeket
  - **"Kategória szerinti bontás" PDF-szekció** (sor 451–462) — bar-chart vizuális, NEM táblázat
  - Footer (sor 464–467)
- **Spec.** `40` §4.4 a riport-adatlap 5 szekcióját rögzíti (Alapadatok / A hét számai / Kategória / Címzettek / Audit). **PDF inline preview-t NEM ír.** A "Letöltés" gomb a R-4 endpoint **bináris** PDF-output-ját adja (Content-Type: application/pdf, Content-Disposition: attachment) — a böngésző `<iframe src="...pdf">` natívan rendereli, de **a screen-mock-fájl egy custom HTML-renderelést készít a PDF-tartalom-stubjaként**. Ez:
  - **Funkcionálisan duplikálja** a `NumbersCard` szekciót (a "hét számai" kétszer renderel).
  - **A `prevWeek` mock-adatot vezeti be** (`REPORT_W20.prevWeek: { resolved: 18, avgDays: 2.4, newCount: 24 }`) — a `WeeklyReport` entitás **nem hordoz `prevWeek` mezőt**. A spec szerint a "múlt héthez képest" a generálás-időben számolódik a két `snapshotData`-ból (`40` §2.4 — *"A PDF generálásakor a job a `(year, isoWeek)` alapján megkeresi az **előző hét** `WeeklyReport`-ját…"*). A `prevWeek` mező a screen-mockban **kitalált DTO-vetület**, ami a PDF-tartalom-renderelést mock-kompatibilissé tegye.
  - **Q2=A explorer-hivatkozás** a screen-headerben — DE a Q2 **NEM rögzített D-X-ként** a `DECISIONS.md`-ben (D-1..D-17 áttekintve). Ez egy 8. lépés-belüli explorer-jegyzet, ami nem emelkedett kanonikus döntésre.
- **Megítélés.** A PDF inline preview **vezetői-élmény-érték**: a vezető a `Resend` akció előtt 1 kattintással ellenőrizheti, mit fog újraküldeni. Ez **érdemi** funkcionális hozzáadás. DE:
  - A stub **nem valódi PDF-renderelés** (egy custom HTML-másolat) — a tartalom-eltérés a valós PDF-től észrevétlen lehet.
  - A spec-szelídítés helyett egy `<iframe src="/v1/weekly-reports/{id}/pdf">` natív renderelés (a böngészők beépített PDF-viewer-ével) **ugyanazt az élményt** adná, **valódi PDF-tartalommal**, fejlesztési költség minimális.
- **Döntés.** **🔍 KRITIKUS UI-találmány — formalizálás VAGY visszavágás.** Két opció:
  - **(a) Visszavágás:** a PDF inline preview-stub TÖRLÉSE; a baloldali oszlop tartalma egy **valódi `<iframe src="...{id}/pdf">`** placeholderré (vagy egy `EmptyState`-szerű "PDF-előnézet betölt..."-blokká) válik, ami a R-4 binary-endpoint-nak megfelelő böngészős natív PDF-renderelést szuggerálja. A `NumbersCard` sidebar-szekciók a `snapshotData` egyetlen forrása maradnak.
  - **(b) Formalizálás:** új **D-18** rögzíti a "PDF inline preview az adatlap baloldalán a vezető-Resend-élmény gyorsításáért" UX-választást. A `40` §4.4 szekcióit egy 6. szekcióval (`PdfPreview`) bővíteni. A `prevWeek`-mező a `WeeklyReportDto`-ra emelendő (spec §2.2 bővítés — denormalizálva mentés-időben, csak a `weekNumbers` 5 értéke), vagy a kliens a R-3 `WeeklyReportDto`-t kétszer hívja (előző hétre is) — kliens-side computation.
- **Preferált:** a **(a) visszavágás** — a custom HTML-stub a valós PDF-tartalmat nem reprezentálja, és a sidebar `NumbersCard` + javasolt `CategoryBreakdownCard` (l. #8) a `snapshotData` teljes tartalmát olvashatóan adja. A natív iframe-PDF-renderelés a fejlesztő-implementáció dolga. **SPEC-FEEDBACK SF-29** — kritikus.

#### 🔍 #12 — Címzettenkénti per-recipient delivery-status (✓/✕ ikon + "Bounce — szerver elérhetetlen" reason) — KRITIKUS
- **Hol.** A5d `RecipientsCard.a5d-rec-row` mindegyik soron `a5d-rec-row__icon` `{r.sent ? '✓' : '✕'}` + `r.reason` szöveg piros tónussal. `REPORT_PARTIAL.recipients[1]` `sent: false, reason: 'Bounce — szerver elérhetetlen'` mock-data — a screen-mock **címzettenkénti kézbesítés-eredményt** mutat.
- **Spec — EXPLICIT KIZÁRJA EZT.** `40` §2.2 SD-56 + §8.1 iterational item:
  > *"Címzettenkénti kézbesítés-státusz (egy `WeeklyReportDelivery` aldetail) — ha a pilot kívánja"*
  
  A `WeeklyReport` entitás **csak az összesített** `deliveryStatus` (enum: `AllSent` / `PartialFailure` / `AllFailed`) és a `recipientCount`-ot tárolja. A `WeeklyReportRecipient` entitás (`30_beallitasok.md` §2.2) **nem hordoz** `lastDeliverySuccess` vagy `lastDeliveryReason` mezőt — a spec szerint *"a generáló job a riport keletkezésekor lekéri az aktuális aktív címzetteket, kiküldi a PDF-et, és csak az összesített `deliveryStatus`-t és `recipientCount`-ot írja a `WeeklyReport`-ra"* (`30_beallitasok.md` §2.2 + `00_domain_model.md` §2.5 — *"`WeeklyReportRecipient` és a `WeeklyReport` közt logikai fogyasztás van, nem FK"*).
- **Hatás — KRITIKUS.** A screen-mock **azt szuggerálja**, hogy a vezető **név szerint** látja, ki kapta meg / ki nem — pedig a spec szerint csak az aggregátum-arány érhető el. Az Angular-portoláskor a fejlesztő:
  - **(a)** vagy észreveszi a spec-eltérést, és a per-recipient ikont leveszi (a screen-mock élményét lebontja);
  - **(b)** vagy a spec-bővítést érvényesíti (új DTO + új entitás `WeeklyReportDelivery`) — pilot-volumenen nem indokolt;
  - **(c)** vagy hamis adatot mutat (mindenkit ✓-vel jelez, a `PartialFailure`-aggregátum ellenére) — UX-bug.
- **Döntés.** **🔍 KRITIKUS — visszavágás VAGY spec-bővítés**. Két opció:
  - **(a) Visszavágás:** `RecipientsCard` `a5d-rec-row__icon` levétele; a `r.sent`-mező a mock-data-ból eltávolítva. A `deliveryStatus` aggregátum a kártya-fejlécben elegendő (mind 4 sor "✓ Mind kiküldve" vagy "⚠ Részben sikertelen — 1 címzettnek nem ment").
  - **(b) Spec-bővítés:** a `WeeklyReport`-hoz egy `WeeklyReportDelivery` aldetail entitás (a §8.1 iterational item-et pilot-szintre emelő), `recipientId + sent + reason` mezőkkel, és a `WeeklyReportDto`-ban a `deliveries: WeeklyReportDeliveryDto[]` mező.
- **Preferált:** **(a) visszavágás** — pilot-volumenen a `WeeklyReportDelivery` aldetail jelentős domain-bővítés (FK + új tábla + új DTO + új migrace), és a spec §8.1 explicit "iterational" kategóriába helyezi. A pilot-élmény a deliveryStatus + recipientCount aggregátummal **teljes**: ha a vezető a `PartialFailure`-t látja, a `resend` akció segít (R-6 az aktuális címzett-listának küld újra). **SPEC-FEEDBACK SF-30** — kritikus.

#### 🔍 #13 — `MetaCard` "PDF méret" sor (247 KB)
- **Hol.** A5d `MetaCard` sor 478–479: `<span>PDF méret</span> <span>{report.pdfSize}</span>` — `REPORT_W20.pdfSize: '247 KB'`.
- **Spec.** `WeeklyReport` entitás (`00_domain_model.md` §2.4) **nem hordoz `pdfSize` mezőt** — csak `pdfFileRef` (az S3-link). A PDF méret a S3-object-metadata-ban lekérdezhető, de **nincs a `WeeklyReportDto`-ban**. A spec §4.4 nem írja elő a méret-megjelenítést.
- **Hasznosság.** Alacsony — a vezető a méret-tudat ritkán informatív; a "Letöltés" gomb mellett a böngésző natív "Save as…" dialog mutatja.
- **Döntés.** **🔍 → TÖRLÉS JAVASLANDÓ**. A `MetaCard` 3 → 2 sorra szűkítendő (Generálás + Generálva). NEM kritikus. **SPEC-FEEDBACK SF-31**.

#### 🔍 #14 — Spinning "⟳" emoji + "!" emoji ikon a state-üzeneteken
- **Hol.** A5d `StateGenerating` `a5d-gen-skel__icon` "⟳" 26px Unicode spinner; `StateFailed` `a5d-failed__icon` "!" 26px Unicode.
- **Spec / DS.** Manager-felület emoji-mentes (DS `README.md` "Emoji — the rule"). A state-ikonok stroke-Lucide-családból kötelezőek.
- **Döntés.** **🔍 → DS-konformitás-javítás**: `<Icon name="loader-2" size={26} />` (spinner; CSS `animation: spin 1.6s linear infinite`-tel) és `<Icon name="alert-triangle" size={26} />` (failed). **SPEC-FEEDBACK SF-24-be olvasztva** (a "📄" emoji-csere mellé) — mock-szintű korrekció.


---

# Záró összegzés — Batch 1+2+3

## Statisztika

| Lista | Batch 1 (A4) | Batch 2 (A5 lista) | Batch 3 (A5 adatlap) | **Összesen** |
|---|---|---|---|---|
| ✅ Spec + screen-en megvan | 15 | 12 | 14 | **41** |
| ⚠ Spec-ben van, screen-en nincs | 3 | 2 | 3 | **8** |
| 🟡 D-X rögzíti | 12 | 5 | 3 | **20** |
| 🔍 UI-találmány | 5 | 2 | 4 | **11** |
| **Vizsgált elem** | 35 | 21 | 24 | **80** |

## Tételek tömör-jegyzéke a `SPEC-FEEDBACK.md`-be

A `⚠` és `🔍` 19 tétel a `SPEC-FEEDBACK.md` `## A4+A5 spec-szelídítések` fejezetébe csatolva. A `🟡` 20 tétel **nincs** ott — azok D-X-szel rögzített UX-választások, dokumentáltak.

| SF-# | Forrás (jelen ⚠/🔍) | Kategória | Súly |
|---|---|---|---|
| SF-18 | ⚠ #1 — `isTopPerformer` vizuális jelölés organism-pótlás | organism-bővítés | közepes |
| SF-19 | ⚠ #2 — "Aznap lezárt" lefúrás URL VF-R1-konform átmeneti törlés VAGY VF-R1 `10`-átvezetés | mock-korrekció + spec-emlékeztető | közepes |
| SF-20 | 🔍 #1+#2+#3 — A4 fejléc-egyszerűsítés: hét-eyebrow + "Jó reggelt, Béla!" greeting + prózai summary TÖRLÉS | mock-korrekció | **közepes** |
| SF-21 | 🔍 #4 — "Múlt heti riport · 20. hét" CTA-hint formalizálása új i18n-kulcsra VAGY törlés | spec-i18n-bővítés VAGY mock-korrekció | alacsony |
| SF-22 | 🔍 #5 — A4 section-subtitle ("Klikkre a számon…") törlése | mock-korrekció | alacsony |
| SF-23 | ⚠ #4 — A5 lista "Időszak" külön oszlop spec-szelídítés (Hét hordozza) | spec-szelídítés | alacsony |
| SF-24 | 🔍 #7 + 🔍 #14 — A5 lista "📄" emoji + A5 adatlap "⟳" + "!" emoji-csere stroke-Lucide-ra | mock-korrekció (DS-konformitás) | alacsony |
| SF-25 | 🔍 #6 — A5 lista "Legutóbbi riport letöltése" PageHeader-CTA formalizálása VAGY törlés | spec-bővítés VAGY mock-korrekció | közepes |
| SF-26 | ⚠ #8 — A5 adatlap "Kategória szerinti bontás" külön sidebar-kártya | mock-korrekció + organism-bővítés | **közepes** |
| SF-27 | ⚠ #9 — A5 adatlap "Audit" szekció hiánya | mock-korrekció | alacsony |
| SF-28 | ⚠ #10 — A5 adatlap Resend confirm-dialog 5. mock-state hiánya | mock-korrekció | alacsony |
| SF-29 | 🔍 #11 — A5 adatlap PDF inline preview-stub visszavágás VAGY formalizálás (új D-18) | **kritikus**: mock-korrekció VAGY DECISIONS-bővítés | **kritikus** |
| SF-30 | 🔍 #12 — A5 adatlap per-recipient delivery-status visszavágás VAGY spec-bővítés (`WeeklyReportDelivery` aldetail) | **kritikus**: mock-korrekció VAGY spec-bővítés | **kritikus** |
| SF-31 | 🔍 #13 — A5 adatlap `MetaCard` "PDF méret" sor törlése | mock-korrekció | alacsony |
| ⚠ #5 | A5 lista `allfailed` deliveryStatus mock-data hiánya (mock-data-egyetlen-sor-csere) | mock-data-pótlás | alacsony |

15 SF-tétel + 1 mock-data-pótlás. A Phase 3 a HANDOFF.md átadási megjegyzéseit és a spec-csapatnak feltett kérdéseket konszolidálja.

## A prompt explicit kérdéseire válasz

- **Az A4 4 KPI-ja (Nyitott / Aznapi új / Késésben / Aznap lezárt) megegyezik-e a 40_riport.md §4.2 listájával?** **Igen, mind a 4 mező pontosan tükröződik** — label, value-mezők, hint-szövegek a spec §3.2.1 (predikátum-szintű) és §4.2 (UI-szintű) konzisztensek. AC-A1..A6 + EC-12 mind reprezentálva a Normal + Healthy + First-time állapotokban.

- **A backward-pass-on a „greeting" + „summary" + „hét-eyebrow" bevezetése valószínűleg UI-találmány (D-16 NEM rögzíti); itt 🔍-be kerül vagy explicit törlés javaslandó.** **Megerősítve.** Mind a 3 elem (🔍 #1+#2+#3) **UI-találmány**, D-16 nem rögzíti, **SPEC-FEEDBACK SF-20 explicit törlés javaslandó**.

- **Az A5 inline-pótlás NEM számít UI-találmánynak.** **Megerősítve.** A `RecipientsCard` inline-implementáció **AUDIT-2.md 3.3** alatt dokumentált; a backward-pass 🟡-blokkban szerepel (NEM 🔍), és a Címzettek-szekció spec-fedése a Forward-pass ✅-blokkban (a megjelenítés spec-konform, csak a kód-úton-keresztüli megvalósítás kerüli a kanonikus `RecipientList` + `WeeklyReportCard` organismet). A HANDOFF.md átadási megjegyzésként szerepel — ez **NEM SPEC-FEEDBACK-tétel**.

- **Az A4 „Heti riport letöltése" CTA-elhelyezése a 40_riport §4.2 alapján spec-rögzített vagy D-16 nyom: ha spec rögzíti → ✅, ha csak D-16 → 🟡.** **Spec §4.2 RÖGZÍTI** (literal: *"a tenant neve … és jobbra a 'Heti riport letöltése' gomb"*) → **✅**. A D-16 megerősíti (a CTA pozíciójának D-12-revíziójaként), de a spec az elsődleges forrás. A `🟡`-blokkban referenciálisan rögzítve a kettős fedés.

---

*Phase 2B lezárva. A Phase 2C (A6+A7+A8+A9 Beállítás-ág) következik a `REVIEW.md` Chat 4-prompt szerint.*
