# SPEC-FEEDBACK — visszacsatolás a spec-csapatnak

**Dátum.** 2026.05.25 · **Verzió.** v0.5 (Phase 2A + 2B + **2C LEZÁRVA**; A1+A2+A3 SF-1..SF-17 · A4+A5 SF-18..SF-32 · **A6+A7+A8+A9 SF-33..SF-61** + SF-41 scope-finomítás)
**Cél.** A Phase 2 spec-fedés review során feltárt `⚠` (spec-ben van, screen-en nincs — hiányosság) és `🔍` (screen-en van, spec-ben nincs, NEM dokumentált — UI-találmány) tételek konszolidált listája. **A Phase 3 elején a spec-csapatnak visszacsatolva** — javasolt változások a spec dokumentumokban vagy az adatmodellben.
**NEM tartalmaz.** A `🟡` kategória tételeit (azokat D-X döntés rögzíti — dokumentált UX-választás, NEM spec-szelídítés). Az AUDIT-2.md 3.3 inline-organism-pótlás-jegyzéke szintén NEM ide tartozik (azok mock-szintű implementációs kényelmes-pótlások, a HANDOFF.md-ben átadási megjegyzések).

> **Olvasási útmutató.** Minden tétel: forrás-screen / spec-hivatkozás / a probléma / javaslat (a → b) / döntés-státusz. A spec-csapat a `## Döntés-státusz` mezőt tölti vissza:
> - `accepted` — a spec módosul a javaslat szerint
> - `rejected` — a spec változatlan, a screen-mock pótolja
> - `deferred` — pilot utáni iter
> - `under-review`

---

# Bevezetés a Phase 2A-hoz

A Phase 2A (Bejelentés-ág, A1+A2+A3) spec-fedés-review **lezárult** (52 elem mező-szinten vizsgálva). **17 SF-tétel** keletkezett, amelyek 3 osztályba sorolódnak:

- **Érdemi spec-szelídítések** (a spec-dokumentum módosul): SF-2, SF-7, SF-9, SF-16, SF-17 — 5 db
- **Mock-szintű korrekciók** (NEM spec-szelídítés, HANDOFF.md átadási megjegyzés): SF-3, SF-5, SF-6, SF-8, SF-10, SF-13, SF-15 — 7 db
- **Organism / DTO-bővítések** (kanonikus organism-API vagy DTO-prop): SF-4, SF-11, SF-12, SF-14 — 4 db
- **Hatókör-pontosítás** (meglévő SF kibővítve): SF-1 — 1 db

**SF-tételek áttekintése:**

| # | Tétel | Kategória | Súly |
|---|---|---|---|
| SF-1 | `priority` + **bélyegkép** oszlopok az A1 listán | ⚠ | közepes |
| SF-2 | `TicketListDto.assigneeType` mező bővítés | ⚠ | közepes (**spec-DTO-bővítés**) |
| SF-3 | "(javasolt)" lista-oldali fallback mock-data-pótlás | ⚠ | alacsony |
| SF-4 | `resolutionNote` Resolved-adatlap dedikált blokk | ⚠ | közepes |
| SF-5 | Resolved Description.attrs 4 strukturált mező törlése | 🔍 | közepes (mock-korrekció) |
| SF-6 | A1 adatlap MapMini → MapWidget (`view` mode) lat/lng-prop | ⚠ | közepes |
| SF-7 | **`originalTicketId` redukált duplikátum-nézet (SD-29) — új 5. A1 adatlap-state** | ⚠ | **kritikus** |
| SF-8 | A1 adatlap PhotoGallery `caption` mező törlése | 🔍 | alacsony |
| SF-9 | A2 `PhoneBanner` (Manual-eredet) → D-7 retrofit vagy új D-18 | 🔍 | közepes (**DECISIONS.md-bővítés**) |
| SF-10 | A2 `ValidationBanner` törlése (`[validationForm]` per-field-error elegendő) | 🔍 | alacsony (mock-korrekció) |
| SF-11 | ActivityLog 3 hiányzó eseménytípus mock-bővítés (`Rejected`/`Reopened`/`Merged`) | ⚠ | közepes |
| SF-12 | **ActivityLog stable-ID DTO-szerződés vs. magyar-szöveg mock** | ⚠ | **kritikus** (HANDOFF.md) |
| SF-13 | `SimilarTicketDto.updatedAt` mock-bővítés (concurrency-token a szerep-csere flow-hoz) | ⚠ | közepes |
| SF-14 | `InternalNotesPanel` edit/delete organism-bővítés (TicketNote CRUD a pilotra) | ⚠ | közepes |
| SF-15 | ActivityLog `Reassigned` event mock-bug törlés vagy csere | 🔍 | alacsony |
| SF-16 | **`SimilarTicketDto.attachmentCount` spec-bővítés (D-6 indokolja)** | 🔍 | közepes (**spec-DTO-bővítés**) |
| SF-17 | **`TicketNote.authorRole` spec-bővítés** | 🔍 | közepes (**spec-DTO-bővítés**) |

---

## A1+A2+A3 spec-szelídítések

### SF-1 — `priority` + **bélyegkép** oszlopok az A1 listáról hiányoznak

- **Forrás.** `manager-system/preview/screens/a1-bejelentes-lista.html` `ticketColumns` (6 oszlop, Prioritás és Bélyegkép nélkül).
- **Spec.** `uploads/urbino-docs/20_admin_felulet/10_bejelentes_lista_es_adatlap.md` 4.2 — *"Prioritás | priority | badge (Alacsony/Normál/Magas) | ✓ szűrhető | ✓ rendezhető | ✓ alap-látható"* + *"Bélyegkép | thumbnailRef + attachmentCount | kis kép + 📷-szám badge | — szűrhető | — rendezhető | ✓ alap-látható"*.
- **Probléma.** A spec szerinti `TableStateConfig` 9 alap-látható oszlopot ír elő (Azonosító, Bélyegkép, Cím, Kategória, Prioritás, Határidő, Felelős, Állapot, Beérkezett). A screen-mock 6 oszlopot rajzol (Cím, Kategória, Állapot, Felelős, Határidő, Beérkezett) — kimarad **Azonosító** (a TitleCell-be olvasztva `ALM-ID`-ként), **Bélyegkép** és **Prioritás**. A Prioritás a triage-szempontból érdemi (Magas-ügyek vizuális kiemelése); a Bélyegkép a 30 mp-anatómia része.
- **Hatókör-pontosítás (Batch 2).** A `⚠ #7` (bélyegkép-oszlop hiánya, Batch 2) **az SF-1-be olvad** — nem új SF, hanem **SF-1 hatókör-bővítés**.
- **Javaslat.** Két opció:
  - **(a) Spec-oldali szigorítás MEGTART.** A screen-mock 3 hiányzó oszloppal kibővítendő (Bélyegkép kis kép + 📷-badge; Prioritás 3-érték badge; Azonosító mono `displayId`-vetülettel külön cellában). Implementáció Phase 3-ban, Angular-portoláskor.
  - **(b) Spec-oldali enyhítés.** A `TableStateConfig` "alap-látható" listája szelektálható, és a Prioritás+Bélyegkép az alapból `rejthető`-ként kódolt. A screen-mock jelen állapota igazodik.
- **Javasolt megoldás.** **(a)** — mind a Prioritás triage-szempontból érdemi, mind a Bélyegkép a 30 mp-anatómia része.
- **Hatás.** `10` 4.2 `TableStateConfig`-vázlat módosulása NEM kell — a spec már most ezt írja elő, a screen-mock nem implementálta. Helyette **HANDOFF.md átadási megjegyzés**: az Angular-portoláskor a 3 hiányzó oszlop felvétele.
- **Döntés-státusz.** `under-review`

### SF-2 — `TicketListDto.assigneeType` mező hiánya

- **Forrás.** `a1-bejelentes-lista.html` `AssigneeCell` csak `User`-felelőst renderel (`UserChip name + role`); `assignedGroupId` esetén `userById` `undefined`-et ad, és `—` jelenik meg.
- **Spec.** `10` 3.2.1 `TicketListDto.assigneeLabel: string?` egyetlen denormalizált string. A `10` 3.2.2 detail-DTO viszont `assigneeType: "group"|"user"|null` mezőt ad.
- **Probléma.** A lista a denormalizált label-t kapja, de a kliens **nem tudja**, csoport vagy személy név-e — emiatt a rendering típus-érzéketlen kell legyen. A jelenlegi `UserChip name + role` minta személy-specifikus (a `role` mezőt csoportnak nem értelmezzük); a csoport-renderelés más glyph-et és nincs-role-mezőt igényel.
- **Javaslat.** **A `TicketListDto`-ba `assigneeType: "group"|"user"|null` mező hozzáadása** (`10` 3.2.1 bővítés) — a detail-DTO-val konzisztensen. Implementáció: AutoMapper `ProjectTo<TicketListDto>()` egy `Switch`-szel olvassa az `assignedGroupId` / `assignedUserId` xor-t és állítja az `assigneeType`-ot.
- **Hatás.** Minimal — egy enum-mező a list-DTO-ra, nem új tárolt mező. A screen-fázis fejlesztője `assigneeType`-szerinti CellRenderer-t épít (UserChip vs. GroupChip / Lucide `users` ikon).
- **Döntés-státusz.** `under-review`

### SF-3 — `categoryLabel` lista-oldali "(javasolt)" fallback nincs renderelve

- **Forrás.** `a1-bejelentes-lista.html` `CategoryCell` csak a confirmed kategóriát ismeri; `categoryId == null && citizenSuggestedCategoryId != null` esetén `—`-t mutat.
- **Spec.** `10` 3.2.1 `TicketListDto.categoryLabel` — *"`categoryId` neve, ha kitöltött; különben `citizenSuggestedCategoryId` neve "(javasolt)" jelöléssel; különben `null` (SD-30)"*. A spec-szerződés szerint a SZERVER ad "(javasolt)" suffix-szel kombinált stringet.
- **Probléma.** Ha a szerver-DTO valóban a spec szerint adja vissza (`"Utak és járdák (javasolt)"`), akkor a CellRenderer rendben rajzolja — ez **NEM ⚠ a screen-mock-on, hanem mock-data-rés**: a TICKETS mock `category` integer-ID-t hordoz (`category: 'utak'`), a `CATS[id]` feloldja nevet — de **a javasolt-eset egyáltalán nincs reprezentálva a mock-adatban**.
- **Javaslat.** **Spec-oldal változatlan** (a "(javasolt)" suffix szervere a TicketListDto-DTO-ban). **A mock-data bővíthető**: legalább 1-2 `Új` ügy `categoryId === null && citizenSuggestedCategoryId !== null` állapotban, és a `categoryLabel` mock-érték `"Utak és járdák (javasolt)"`-szerű string. Külön visual-styling (italic? amber?) az SD-30 szellemében — a fejlesztő dönti.
- **Hatás.** Mock-adat bővítése; HANDOFF.md átadási megjegyzés a vizuális finomításra (italic vagy halvány szín a "(javasolt)" suffix-en, hogy a fejléc-szín-kontextus pontos legyen).
- **Döntés-státusz.** `under-review`

### SF-4 — `resolutionNote` dedikált megjelenítése a Resolved-adatlapon nincs

- **Forrás.** `a1-bejelentes-adatlap.html` `StateResolved` — a `Description`-blokk a polgár leírását ismétli, és 4 strukturált meta-attrs (Lezárta / Munkaidő / Felhasznált anyag / Várt visszajelzés) mellette áll. **A `resolutionNote` szabad szöveg mező mint önálló blokk nincs rajzolva.**
- **Spec.** `00_domain_model.md` §1.2.3 — *"`resolutionNote` (string ≤2000) — A lezárás szöveges dokumentációja"*. `10` 4.3 layout-blokkok: *"Bal: fotók, leírás, belső jegyzetek"* — implicit, hogy a Resolved-state-en a lezárás-megjegyzés valahol megjelenik.
- **Probléma.** A spec szerint `Resolved` állapotba lépéshez legalább egy `ResolutionPhoto` vagy `resolutionNote` kötelező; a screen-mock a fotókat mutatja, de a szövegmező renderelése hiányzik. Pilot-szinten a `resolutionNote` az SLA-dokumentálás egyik fontos forrása — a polgári `screen_bejelentes_adatlap_2` később ezt is mutathatja a polgárnak (NY-bej-3 rokon).
- **Javaslat.** **Mock-szintű bővítés** (NEM spec-szelídítés): a Resolved-state-re egy új `mgr-resolution-note` szekció kerüljön a `Description` után, ami a `resolutionNote` szabad szövegét rajzolja. Konkrét tartalom (mock): `"A kátyú betömve macskakő-aljzattal és zsalukő-szerkezettel. A munkaidő 6 óra volt 2 nap alatt elosztva, a polgár nem panaszkodott."` — a strukturált attrs törölve.
- **Hatás.** A `🔍 #1` (Lezárta / Munkaidő / Felhasznált anyag / Várt visszajelzés) törlésével együtt megoldva — lásd SF-5.
- **Döntés-státusz.** `under-review`

### SF-5 — Resolved Description.attrs 4 strukturált mezeje (UI-találmány)

- **Forrás.** `a1-bejelentes-adatlap.html` `StateResolved` `Description.attrs`:
  - "Lezárta: Szabó Zoltán · 2026.05.19. 16:42" — származtatott `resolvedAt` + `Resolved`-esemény `actorId` → **OK**, megtartható
  - "Munkaidő: 6 óra (2 nap)" — **NINCS spec-mező**
  - "Felhasznált anyag: 2 m³ macskakő-aljzat + 5 db zsalukő" — **NINCS spec-mező**
  - "Várt visszajelzés: Nincs panasz a polgártól" — **NINCS spec-mező**
- **Spec.** `00_domain_model.md` §1.2.3 — egyetlen szabad szöveges `resolutionNote`. Pilotra `workHours`, `materialUsed`, `citizenFeedback` strukturált mezők NEM léteznek.
- **Javaslat.** **Törlés a screen-mockból.** A 4 strukturált attrs törölve, a Resolved-state-re egy szabad szöveges `resolutionNote`-blokk (SF-4 szerint). A "Lezárta" sor megtartható mint származtatott meta-attribútum (a `Description.attrs` 1 elemre rövidül), VAGY teljes `Description.attrs` törölve és a "Lezárta" a `TicketMetaBar`-ba/`ActionBar.hint`-be olvasztva (az `ActionBar.hint` jelenleg "Lezárva 3 napja · Szabó Zoltán." — ez már redundánsan tartalmazza).
- **Hatás.** A `🔍 #1` lezárása. NEM spec-szelídítés, hanem mock-szintű korrekció. **HANDOFF.md átadási megjegyzés** az Angular-portolásra: a `Description.attrs` 4 mezeje NEM kerül az Angular-komponensbe.
- **Döntés-státusz.** `accepted-pending-mock-update` (a screen-mock-fájl módosítása later iter — a SCREEN-CONVENTIONS.md "ez a fájl NEM régi javításához" elve miatt a mock most változatlan, de a HANDOFF.md ezt explicit kihagyja).

### SF-6 — A1 adatlap MapMini → kanonikus MapWidget (`view` mode)

- **Forrás.** `a1-bejelentes-adatlap.html` `MapMini` komponens — CSS-pseudo-elemekkel rajzol fix pin-t és fix gradient-hátteret; **a `lat`/`lng` prop nincs definiálva**, csak `status` és `address`.
- **Spec.** `00_domain_model.md` §1.2.4 `latitude`/`longitude` mező a `Ticket`-en; `10` 4.3 layout-blokkok **"Jobb: térkép"** explicit szekció. A `20_duplikacio` 2.5 a duplikáció-heurisztika térbeli jelét ezekre alapozza.
- **D-7 alatti döntés.** A `MapWidget` organism a D-7/Iter 4 során lett kiemelve önálló fájlba a `LocationPicker` miatt. Props: `mode` ('view'|'picker'), `lat`, `lng`, `status`, `popupContent`, `zoom`, `containerClass`, `onLocationChange`. **Két fogyasztó** rögzítve: SimilarTicketsBox és LocationPicker; a D-7 explicit megemlíti, hogy "jövőben adatlap-térkép" — vagyis az A1 adatlap MapMini-jét **eredetileg is** a `MapWidget`-tel kellett volna fogyasztani.
- **Probléma.** A `MapMini` szándékos CSS-stub, nem valódi térkép-vetület. A 4 A1 adatlap-state egyikében sincs valódi koordináta-rajzolt térkép.
- **Javaslat.** **Mock-szintű korrekció (Angular-portoláskor):** a `MapMini` cserélje le a `MapWidget` `mode='view'` változata, és kapja meg a `lat`/`lng`/`status`/`addressText` propokat. A Leaflet-integráció már fut az A2-n; ugyanaz a komponens szolgálja ki az adatlapot is.
- **Hatás.** Spec változatlan; HANDOFF.md átadási megjegyzés. A screen-mock-szinten most NEM kötelező (SCREEN-CONVENTIONS.md scope).
- **Döntés-státusz.** `accepted-pending-implementation`

### SF-7 — `originalTicketId` redukált duplikátum-nézet (SD-29) — új 5. A1 adatlap-state **KRITIKUS**

- **Forrás.** `a1-bejelentes-adatlap.html` 4 állapot-screen (`StateFolyamatban`, `StateNew`, `StateResolved`, `StateRejected`) **egyike sem** reprezentálja a duplikátum-vetületet. Az `originalTicketId`/`originalTicketDisplayId` mezőket egyetlen mock-ticket sem hordozza; a `Duplicate`-reason + originalTicket-link kombináció vizuálisan nem renderelt.
- **Spec.**
  - `00_domain_model.md` §1.2.6 `originalTicketId` (self-FK, F-feltételes); `originalTicketDisplayId` DTO-derived (SD-48)
  - **`10` 4.3 SD-29** kiemelt szekció: *"Ha `originalTicketId` kitöltött: redukált, csak-olvasható nézet — a polgári nyersanyag (cím, leírás, fotók, helyszín) + hangsúlyos link az eredetire. **Nincs triage-sáv, nincs akció-gombsor, nincs duplikáció-doboz.**"*
  - `10` AC-C4: *"egy ügy `originalTicketId`-ja kitöltött → adatlap betöltődik redukált nézettel."*
- **Probléma — KRITIKUS.** A duplikáció-feature (`20_duplikacio_es_osszevonas`) **fő mellékhatása** a duplikátum-oldali adatlap-megjelenítés. A pilot Wow #4 első fele ezen áll. **A teljes vizuális vetület hiányzik a mock-szintről** — sem a fejlesztő, sem a code-review nem tudja vizualizálni, hogy ez hogy néz ki Angular-felületen. Ez az **egyetlen** olyan tétel a Phase 2A-ban, ami **érdemi screen-mock-bővítést** igényel.
- **Javasolt 5. state-artboard tartalom — `StateDuplicate`:**
  - **`TicketMetaBar`** lockolt nézet, `status='elutasitva'`, +1 új vizuális elem: a fejlécben egy "Duplikátum" tag (vagy a státusz-chip mellett `mgr-duplicate-badge`)
  - **NINCS** `TriageBar` (SD-29 expl.)
  - **NINCS** `ActionBar` — vagy egy `ActionBar` `lockedNote`-szerű üzenettel: *"Ez a bejelentés egy másik ügy duplikátuma. Az ügyintézést az eredeti bejelentésen folytasd. → ALM-1052"*
  - **NINCS** `SimilarTicketsBox` (SD-29 expl.)
  - **VAN** új `mgr-original-link` blokk a TicketMetaBar alatt: hangsúlyos link az eredetire (Lucide `corner-up-right` + "Eredeti bejelentés: ALM-1052 — Felázott útburkolat a Hősök terén")
  - **VAN** a polgári nyersanyag: `PhotoGallery` + `Description` + `MapWidget` (mind read-only)
  - **VAN** `ActivityTimeline` a `Merged`-eseménnyel: *"Tóth Béla összevonta az ALM-1052 ügybe — 2026.05.19. 09:15"* (D-5/AT-2B esemény-vizualizáció `Merged` esetén violet)
  - **VAN** `StatusTrackBranched` egy variánssal: `reason.title='Duplikáció'` + `reason.text=<>Ez a bejelentés a(z) <strong>ALM-1052</strong> ügy duplikátuma. Az értesítéseket az eredeti ügy bejelentője az aktuális státusz-frissítésekkel együtt kapja.</>`
- **Javaslat — kétlépcsős.**
  - **(a) Mock-szinten** — a screen-fázis fejlesztője a 9. lépés HANDOFF-csomag mintaprojektjében (`starter/`) építse meg ezt az 5. state-et. A jelen iteráció (Phase 2A) **NEM nyitja újra** a screen-mockot a SCREEN-CONVENTIONS.md scope miatt.
  - **(b) Spec-szinten** — `10` 4.3 SD-29 szekció kibővülhet egy expicit "5. állapot — duplikátum" mintajával (a fenti `StateDuplicate` tartalom-leírás). A spec jelen formájában elveket rögzít, nem konkrét layout-blokkot. Pontosítás javasolt.
- **Hatás.** HANDOFF.md kritikus átadási megjegyzés; a `10` 4.3 SD-29 szekció szelíden bővíthető explicit layout-mintával.
- **Döntés-státusz.** **`under-review`** (a spec-csapat döntse el, hogy a layout-minta a spec-be kerüljön-e, vagy a starter-mintaprojekt szabványosítsa)

### SF-8 — A1 adatlap PhotoGallery `caption` mező törlése

- **Forrás.** `a1-bejelentes-adatlap.html` `PHOTOS=[{id:1, caption:'Felülnézet'}, ...]` → `PhotoGallery` 4 képet renderel egy `.a1d-photo__caption` overlay-jel a bal-alsó sarokban.
- **Spec.** `00_domain_model.md` §1.3 `Attachment` mezők: `id`, `ticketId`, `kind`, `fileRef`, `fileName`, `contentType`, `sortOrder`. **`caption` mező NINCS.**
- **Probléma.** A polgári Flutter `screen_uj_bejelentes_2` egyetlen fotó-feltöltő gombot ad, **caption-input nélkül**. A `caption` ezért adatforrás-szempontból bizonytalan — fejlesztői mock-találmány a vizuális density növelésére.
- **Javaslat.** **Mock-szintű korrekció** — a `caption` mező törölve. A fotók aláírás nélkül jelennek meg. Esetleg a `sortOrder`-derived "1 / 4" számláló a jobb-alsó sarokban (ha vizuális density-re szükség van).
- **Hatás.** Spec változatlan; HANDOFF.md átadási megjegyzés (NEM spec-szelídítés).
- **Döntés-státusz.** `accepted-pending-mock-update`

### SF-9 — A2 `PhoneBanner` (Manual-eredet) → D-7 retrofit vagy új D-X

- **Forrás.** `a2-uj-bejelentes.html` `StatePhoneIntake` `PhoneBanner` 📞-ikonnal + amber-tinted blokk, ami explicit kódolja az `origin=Manual` magatartást.
- **Spec.** `00_architektura_v4.md` §6.1 a két create-utat rögzíti (`New` vagy azonnali `Assigned`), de a `Manual`-eredet **banner-figyelmeztetésével** nem foglalkozik. `10` 5.1 sem említi a banner-mintát.
- **D-X.** D-7-ben **nincs kódolva**. A D-7 6 explorer-kérdése (F-1, F-2, F-3, L-1, L-2, L-3) a form-elrendezést, két-submit-mintát és LocationPicker-magatartást rögzíti — a banner nem szerepel köztük.
- **Probléma.** A banner pedagógiai értéke nagy (a diszpécser tudja, hogy ezen az ágon a `reporterContactText` kötelezővé válik), de mint UI-elem a D-7 hatókörén túli találmány.
- **Javaslat.** **D-X formalizálás** — két opció:
  - **(a) D-7 retrofit F-4 új ponttal:** *"Manual-eredet vizuális kiemelése amber-tinted banner-rel a form fejlécében — 📞 ikon + 'Telefonos bejelentés-felvétel' cím + 2-3-mondatos magyarázat. Pedagogikai érték: a diszpécser tudja, hogy a bejelentő-mezőt szabad szöveggel tölti, és az `origin=Manual` az adatmodell-szinten rögzül."*
  - **(b) Új D-18** — saját döntés-naplótétel a banner-mintára.
- **Javasolt megoldás.** **(a) D-7 F-4 retrofit** — a D-7 az A2-feature záró iter-je volt, természetes helye az új pontnak. A `DECISIONS.md` v.minőszerűen módosulhat (régi D-7-bejegyzést NEM írjuk át, hanem új F-4 alpontot adunk a Hatás-szekció után — vagy egy mini-revízió-jelölés a Hatás-szekcióban).
- **Hatás.** `DECISIONS.md` D-7-bővítés.
- **Döntés-státusz.** `under-review`

### SF-10 — A2 `ValidationBanner` törlése

- **Forrás.** `a2-uj-bejelentes.html` `StateValidationError` `ValidationBanner` !-ikonnal + 2-elemes mező-hiba-lista.
- **Spec.** `10` 4.6 hibakezelési kulcs-csoport (`ticket.error.*`) — a szerver **mezőszintű** `fieldErrors`-t ad vissza, a meglévő `[validationForm]` minta szerint. Banner-szintű összesítő hiba-megjelenítés nincs spec-elve.
- **Probléma.** A `[validationForm]` mintában a hiba-megjelenítés a form-field szintjén történik (`<form-field>` jelenítteti meg az `fieldErrors[name]`-t). A banner egy plusz vizuális réteg, amit a spec nem ír elő — viszont a banner összesít. A2 4 form-mezős kontextusában az érték kétséges.
- **Javaslat.** **Mock-szintű korrekció** — a `ValidationBanner` törölve. A per-field-error a `<form-field>`-en a bejáratott pattern; a banner felesleges figyelem-konfliktust ad a per-field jelzéssel. A `<form-field>` Lucide `alert-circle` ikont mutathat, ha a mezőn hiba van — ez elegendő.
- **Hatás.** Spec változatlan; HANDOFF.md átadási megjegyzés.
- **Döntés-státusz.** `accepted-pending-mock-update`

---

### SF-11 — ActivityLog 3 hiányzó eseménytípus mock-bővítés (`Rejected`/`Reopened`/`Merged`)

- **Forrás.** `a1-bejelentes-adatlap.html` 4 állapot-screen ActivityTimeline-jai — a 7 `ActivityEventType` enum-ból csak 3 dedikált esemény-vetület renderelt (`Created`, `StatusChanged`, `Assigned`). A `Reassigned` mock-on rosszul címkézve (lásd SF-15); `Rejected`, `Reopened`, `Merged` egyik state-en sem szerepelnek.
- **Spec.** `00_domain_model.md` §1.4 `ActivityEventType` 7-értékű enum; `10` 4.6 i18n-sablonok mind a 7-re.
- **Probléma.** Az `ActivityTimeline` 7 dedikált ICONS-mapping-je (kék/piros/amber/violet háttér-tonok, D-5/AT-2B) **vizuálisan nem demonstrált**. A fejlesztő az Angular-portoláskor a 4 ikon-variánst látja, és a Rejected (piros X), Reopened (amber rotate), Merged (violet diagonal) ikonok valódi vizuális kontextusa hiányzik.
- **Javaslat.** **Mock-bővítés a 4 állapot-screenen:**
  - **`StateRejected`** `REJ_ACTIVITY[1].eventType='StatusChanged'` → cserélve `'Rejected'`-re; az ikon piros X lesz (helyette a kék nyíl), a szöveg változatlan ("indok: Magánterület").
  - **`StateResolved`** ActivityTimeline bővítve egy 8. eseménnyel: `{ id: 8, eventType: 'Reopened', actorName: 'Tóth Béla', occurredAt: '2026.05.20. · 14:30', relative: '2 napja', text: 'visszanyitotta a bejelentést — a polgár jelezte, hogy a kátyú újra megnyílt' }`. Ez demonstrálja az amber Reopened ikon-variánst.
  - **`StateDuplicate`** (új 5. state, SF-7) ActivityTimeline-ja tartalmazza a `Merged`-eseményt: `{ eventType: 'Merged', actorName: 'Tóth Béla', text: 'összevonta az ALM-1052 ügybe — eredeti maradt' }`. Ez demonstrálja a violet Merged ikon-variánst.
- **Hatás.** Spec változatlan; HANDOFF.md átadási megjegyzés (a `starter/` mintaprojekt az Angular-portoláskor ezt explicit fedi).
- **Döntés-státusz.** `accepted-pending-mock-update`

### SF-12 — ActivityLog stable-ID DTO-szerződés vs. magyar-szöveg mock **KRITIKUS (HANDOFF.md)**

- **Forrás.** `a1-bejelentes-adatlap.html` ActivityTimeline `events[].text` mező — magyar-szöveg-vetület (`'státusz: Jóváhagyva → Folyamatban'`).
- **Spec.** `00_domain_model.md` §1.4 + `10` 3.2.2 + **SD-30**: *"`activityLog.fromValue` / `toValue` — stabil, nyelvfüggetlen azonosítót hordoz (`enum`-név, vagy `type:id` referencia, pl. `'group:3'`), **nem magyar szöveget**. Az i18n-sablon (`ticket.activity.statusChanged` = `'{actor} módosította a státuszt: {from} → {to}'`) kliens-oldalon oldódik fel magyar szövegre."*
- **Probléma.** A screen-mock a magyar-szöveg-vetületet hordozza, **kihagyva a stable-ID-réteget**:
  ```
  Spec szerinti DTO          Mock-szerződés (HIBÁS)
  ─────────────────────      ─────────────────────────
  fromValue: 'Assigned'      text: 'státusz: Jóváhagyva
  toValue: 'InProgress'             → Folyamatban'
  i18n-feloldás kliens-old.  (magyar szöveg hardcoded)
  ```
  A 9. lépés Angular-portolásakor a fejlesztő ezt **NEM** veheti át literál módon — a sablon-feloldás kliens-oldali kell legyen az i18n-réteggel (`hu.json` `ticket.activity.*` kulcsok).
- **Javaslat.** **Kétlépcsős — HANDOFF.md kritikus átadási megjegyzés:**
  - **(a) Angular-portolásra** — a `ActivityTimelineDto.events[]` szerződése a stable-ID-triplet (`eventType` + `fromValue` + `toValue` + `note` + `actorId` + `occurredAt`); a komponens `i18n.translate('ticket.activity.' + camelCase(eventType), {actor, from, to, reason})`-feloldást használ.
  - **(b) Mock-on most NEM kötelező** — a mock-szintű `events[].text` magyar-szöveg-mező kényelmes hardcode a vizuális density-hez; **NE legyen átemelve** literál módon Angular-szintre. A SCREEN-CONVENTIONS.md "mock-data nem 1:1 DTO-szerződés" elve a HANDOFF.md új sora.
- **Hatás.** **HANDOFF.md kritikus átadási megjegyzés** — az `ActivityTimeline` az egyetlen organism, amelyik a screen-mockon **a DTO-szerződésnél lazább adat-modellt** használ. A Phase 3 fejlesztője ezt nem véletlen-szerűen veszi át.
- **Döntés-státusz.** `accepted-pending-implementation`

### SF-13 — `SimilarTicketDto.updatedAt` mock-bővítés (concurrency-token a szerep-csere flow-hoz)

- **Forrás.** `SIMILAR_FINDINGS` mock 7 mezővel (`id, displayId, title, statusKey, statusLabel, distanceMeters, ageLabel, categoryLabel, attachmentCount, thumbnailUrl`) — `updatedAt` NINCS.
- **Spec.** `20_duplikacio` 3.1.2 `SimilarTicketDto.updatedAt: DateTime` — *"A találat concurrency-tokene — ha a felhasználó az összevonás-párbeszédben megfordítja a szerepeket, a `merge` ezt küldi `expectedUpdatedAt`-ként."* SD-32 minta.
- **Javaslat.** **Mock-szintű korrekció** — a `SIMILAR_FINDINGS` `updatedAt: '2026-05-16T11:00:00Z'`-szerű ISO-stringgel bővítendő. A `SimilarTicketsBox.Thumb` nem rajzolja, de a `MergeDialog.onConfirm`-flow-nak szüksége lesz rá.
- **Hatás.** Spec változatlan; HANDOFF.md átadási megjegyzés.
- **Döntés-státusz.** `accepted-pending-mock-update`

### SF-14 — `InternalNotesPanel` edit/delete organism-bővítés

- **Forrás.** `internal-notes-panel.jsx` — `notes` lista csak read-only renderelést mutat; `editable` / `onEdit` / `onDelete` prop nincs.
- **Spec.** `00_domain_model.md` §1.5 *"A pilotra a `TicketNote` a létrehozás után **módosítható és törölhető** a szerző (és a vezető) által — standard CRUD."* `10` 3.5 + 3.8 `PUT /v1/ticket-notes/{id}` + `DELETE /v1/ticket-notes/{id}` jogosultsága `dispatcher`/`manager`.
- **Javaslat.** **Organism-bővítés:**
  - `InternalNotesPanel.notes[].editable: boolean` prop (kliens-oldali logika: `note.authorId === currentUser.id || currentUser.roles ∋ 'manager'`)
  - `editable === true` esetén a jegyzet-soron egy `mgr-notes__item-actions` kebab-menü ('Szerkesztés' · 'Törlés')
  - Új propok: `onEditNote(id)`, `onDeleteNote(id)`
- **Hatás.** Pilot-feature; **organism-API-bővítés**; HANDOFF.md átadási megjegyzés.
- **Döntés-státusz.** `accepted-pending-organism-extension`

### SF-15 — ActivityLog `Reassigned` event mock-bug

- **Forrás.** `a1-bejelentes-adatlap.html` `StateFolyamatban` `ACTIVITY[3]` (4. esemény) `eventType='Reassigned'`-pal címkézve, de a `text='határidő-módosítás: 2026.05.21 → 2026.05.23'`.
- **Spec.** `00_domain_model.md` §1.4 `Reassigned`-definíció: *"Felelős-váltás (nem státuszváltás)"*. `10` 3.3 + AC-D1: *"`PUT .../due-date` `200`, … nem keletkezik `ActivityLog`-bejegyzés"* — a `dueDate`-inline-edit **nem vált eseményt**.
- **Probléma.** Két spec-szabály megsérül: (a) `Reassigned` enum-érték más jelentésben használt, (b) a `dueDate`-edit nem generálható esemény mock-on.
- **Javaslat.** **Mock-szintű korrekció** — két opció:
  - **(a) Törlés** — a 4. esemény eltávolítva, mert spec-szerinti adat-forrás nincs.
  - **(b) Csere valódi `Reassigned`-re** — pl. `text='felelőst váltott: Kovács Anna → Szabó Zoltán'`, demonstratív érték.
- **Javasolt megoldás.** **(b)** — vizuális density-megőrzés + spec-konzisztencia. **HANDOFF.md átadási megjegyzés**.
- **Döntés-státusz.** `accepted-pending-mock-update`

### SF-16 — `SimilarTicketDto.attachmentCount` spec-bővítés **SPEC-DTO-BŐVÍTÉS**

- **Forrás.** `a1-bejelentes-adatlap.html` `SIMILAR_FINDINGS[*].attachmentCount=2 / 1` — a `SimilarTicketsBox.Thumb` `attachmentCount > 1` esetén Lucide `camera` + szám badge-et rajzol.
- **Spec.** `20_duplikacio` 3.1.2 `SimilarTicketDto` mezőlistája **NEM tartalmazza** az `attachmentCount`-ot. A 10-mezős DTO: `id, displayId, title, status, categoryLabel, distanceMeters, ageDifferenceDays, createdAt, updatedAt, thumbnailRef`.
- **D-X.** **D-6/SB-2A** expicit rögzíti a darabszám-badge UI-mintát — *"Bélyegkép balra 56×56; fotó-darabszám-badge jobb-alul."*
- **Konfliktus.** A D-6 előírja az UI-elemet, de a spec-DTO nem hordozza az adatot.
- **Javaslat.** **Spec-szelídítés** — `20_duplikacio` 3.1.2 `SimilarTicketDto` bővítendő:
  ```jsonc
  {
    // ... existing fields ...
    "thumbnailRef": "...",
    "attachmentCount": 2     // ← új mező
  }
  ```
  Az adat triviálisan számolható szerver-oldalon (`Attachment.WHERE ticketId=findId AND kind='ReportPhoto'.COUNT`); pilot-méreten ~3-4 hasonló ügyenként ~5-10 fotó-COUNT-lekérdezés, elhanyagolható költség.
- **Hatás.** `20_duplikacio` 3.1.2 DTO-séma + `SimilarTicketDto`-szerződés. AC-bővítés: `20_duplikacio` AC-...-be felvenni egy `attachmentCount`-megjelenítési kritériumot.
- **Döntés-státusz.** `under-review` (spec-csapat döntse el)

### SF-17 — `TicketNote.authorRole` spec-bővítés **SPEC-DTO-BŐVÍTÉS**

- **Forrás.** `a1-bejelentes-adatlap.html` `NOTES[*].role='diszpécser' / 'terepi dolgozó' / 'vezető'` — az `InternalNotesPanel` `.mgr-notes__item-role` cellán "· diszpécser" suffix-szel renderel.
- **Spec.** `00_domain_model.md` §1.5 `TicketNote` mezők: `id, ticketId, authorId, body` + `AuditableEntity`-örökölt. **`authorRole` mező NINCS.** `10` 3.2.2 `notes[]` beágyazás: `{ id, authorId, authorName, body, createdAt }` — szintén nincs.
- **Honnan jönne.** A `TenantUser.roles[]` (`enum[] TenantRole`, §2.3) — a jegyzet szerzőjének tenant-szintű szerepkörei. A megjelenítés `roles[0]` magyar-i18n-vetülete.
- **Probléma.** A role-suffix pedagogikai érték (a jegyzet kontextusa: "ki írta — diszpécser, terepi, vezető?") — de a `TicketNote`-DTO **nem hordozza ezt az adatot**. A kliens cross-lookup-pal a `TenantUser.roles`-ból kellene előállítania minden notes-betöltéskor.
- **Javaslat.** **Spec-szelídítés** — `10` 3.2.2 `notes[]` bővítendő:
  ```jsonc
  "notes": [
    {
      "id": 1,
      "authorId": 3,
      "authorName": "Kovács Anna",
      "authorRole": "Dispatcher",    // ← új mező, TenantUser.roles[0]
      "body": "...",
      "createdAt": "..."
    }
  ]
  ```
  A `authorRole` enum-érték (kódbeli `TenantRole`), a kliens i18n-feloldja (`hu.json` `roles.dispatcher` = "diszpécser"). Pilot-szinten kis költségű cross-DB join az AutoMapper-projekcióban.
- **Hatás.** `10` 3.2.2 detail-DTO + `00_domain_model.md` §1.5 mező-tábla bővítés (a `TicketNote` adatmodell-szinten ezt nem rögzíti — DTO-szintű derived projekció).
- **Döntés-státusz.** `under-review` (spec-csapat döntse el)

---

# Phase 2A — záró összegzés a SPEC-FEEDBACK-hez

A 17 SF-tétel **3 érdemi spec-szelídítést** ad (a spec-csapat döntésére):

| # | Spec-szelídítés | Hatókör |
|---|---|---|
| SF-2 | `TicketListDto.assigneeType: "group"\|"user"\|null` | `10` 3.2.1 |
| SF-16 | `SimilarTicketDto.attachmentCount: int` | `20_duplikacio` 3.1.2 |
| SF-17 | `notes[].authorRole: string` (detail-DTO bővítés) | `10` 3.2.2 |

**+ 1 DECISIONS.md-bővítés** (SF-9: D-7 retrofit F-4 új ponttal a Manual-eredet banner-mintára).

**+ 2 HANDOFF.md kritikus átadási megjegyzés** (SF-7 originalTicketId redukált nézet + SF-12 ActivityLog stable-ID DTO).

**A többi 11 SF mock-szintű korrekció** vagy organism-bővítés — NEM spec-szelídítés, csak átadási megjegyzés.

---

---

# Bevezetés a Phase 2B-hez

A Phase 2B (Riport-ág, A4 Dashboard + A5 archívum-lista + A5 adatlap) spec-fedés-review **lezárult** (`SPEC-COVERAGE-A4A5.md` 80 elem mező-szinten vizsgálva — 41 ✅ · 8 ⚠ · 20 🟡 · 11 🔍). **14 SF-tétel** keletkezett (SF-18..SF-31), amelyek 4 osztályba sorolódnak:

- **Érdemi spec-szelídítések** (a spec-dokumentum módosul): SF-23, SF-25(b), SF-30(b) — 3 db
- **Spec-i18n-bővítés**: SF-21(a) — 1 db
- **DECISIONS.md-bővítés** (új D-18, ha a PDF inline preview formalizálódik): SF-29(b) — 1 db (alternatíva, NEM preferált)
- **Mock-szintű korrekciók** (NEM spec-szelídítés, HANDOFF.md átadási megjegyzés): SF-19, SF-20, SF-22, SF-24, SF-27, SF-28, SF-29(a), SF-30(a), SF-31 — 9 db
- **Organism-bővítés** (kanonikus organism-API + DS-pótlás): SF-18, SF-26 — 2 db
- **Mock-data-pótlás**: SF-32 (a `⚠ #5` `allfailed` deliveryStatus-szal állapotú sor csere) — 1 db

**SF-tételek áttekintése:**

| # | Tétel | Kategória | Súly |
|---|---|---|---|
| SF-18 | `team[].isTopPerformer` vizuális jelölés a `TeamPerformanceTable` organism-ben hiányzik (D-16 deklarálja, az organism JSX-render nem rajzolja) | ⚠ organism-bővítés | közepes |
| SF-19 | A4 "Aznap lezárt" KPI lefúrás-URL VF-R1-konform átmeneti törlés ÉS `10`-átvezetés emlékeztető | ⚠ mock-korrekció + spec-emlékeztető | közepes |
| SF-20 | A4 fejléc-egyszerűsítés — hét-eyebrow + greeting + prózai summary törlés (3 elem összevont) | 🔍 mock-korrekció | **közepes** |
| SF-21 | A4 "Múlt heti riport · 20. hét" CTA-hint formalizálása új `dashboard.downloadReport.latestHint` i18n-kulcsra VAGY törlés | 🔍 spec-i18n-bővítés VAGY mock-korrekció | alacsony |
| SF-22 | A4 section-subtitle törlése (mock-developer-vetület, nem vezetőnek szól) | 🔍 mock-korrekció | alacsony |
| SF-23 | **A5 lista "Időszak" külön oszlop spec-szelídítés (a Hét cella hordozza)** | ⚠ **spec-szelídítés** | alacsony |
| SF-24 | A5 "📄" + "⟳" + "!" emoji-csere stroke-Lucide-ra (DS-konformitás) | 🔍 mock-korrekció | alacsony |
| SF-25 | A5 lista "Legutóbbi riport letöltése" PageHeader-CTA formalizálása `40` §4.3-ba VAGY törlés | 🔍 spec-bővítés VAGY mock-korrekció | közepes |
| SF-26 | A5 adatlap "Kategória szerinti bontás" sidebar-kártya bővítés (új `CategoryBreakdownCard` organism) | ⚠ mock-korrekció + organism-bővítés | **közepes** |
| SF-27 | A5 adatlap "Audit" szekció hiánya (Létrehozva / Módosítva) | ⚠ mock-korrekció | alacsony |
| SF-28 | A5 adatlap Resend confirm-dialog 5. mock-state hiánya (SD-57 konkrét címzett-felsorolás) | ⚠ mock-korrekció | alacsony |
| SF-29 | **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 | **A5 adatlap per-recipient delivery-status visszavágás VAGY spec-bővítés (`WeeklyReportDelivery` aldetail pilot-emelés)** | 🔍 **KRITIKUS** mock-korrekció VAGY spec-bővítés | **kritikus** |
| SF-31 | A5 adatlap `MetaCard` "PDF méret" sor törlése (`WeeklyReportDto` nem hordoz `pdfSize`-t) | 🔍 mock-korrekció | alacsony |
| SF-32 | A5 lista `allfailed` `deliveryStatus`-szal állapotú `WeeklyReport` mock-data hiánya | ⚠ mock-data-pótlás | alacsony |

---

## A4+A5 spec-szelídítések

### SF-18 — `team[].isTopPerformer` vizuális jelölés a `TeamPerformanceTable` organism-ben hiányzik

- **Forrás.** `manager-system/preview/screens/a4-fooldal.html` `TEAM_ROWS[0].isTopPerformer: true` (Szabó Zoltán) mock-data; `manager-system/organisms/team-performance-table.jsx` render-függvény (sor 38–88).
- **Spec.** `40_riport.md` §3.2.2 — *"`isTopPerformer: true` annál az **egy** sornál, amelynek `resolvedThisWeek` szigorúan max ÉS `> 0`. Holtverseny esetén vagy ha mindenki `0`: minden sor `false`."* + 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.
- **Probléma.** A `TeamPerformanceTable` JSX-render-függvénye **sehol nem olvassa be a `r.isTopPerformer` propot** — a 4-oszlopos grid-row változatlanul renderel, csillag/jelölés nincs. A `_styles.css`-ben a `mgr-tpt__row--top-performer` modifier sincs definiálva. A mock-prop a screen-fájlban átadva (`isTopPerformer: true`), az organism elhallgatja.
- **Hatás.** D-16 deklarációja **félre-implementált**: a backend DTO-mező (`isTopPerformer: bool`) pontosan érkezik, a render-réteg hallgat. Az Angular-portoláskor a fejlesztő **nem fog észrevenni rést** — a `DashboardDto.team[].isTopPerformer` mező a JSON-payload-ban szerepel, de a UI nem jeleníti.
- **Javaslat.** **Organism-pótlás:**
  ```jsx
  // team-performance-table.jsx, a .mgr-tpt__name-cell után, a row első cellájában:
  {r.isTopPerformer && (
    <span className="mgr-tpt__star" title="A hét teljesítménye">★</span>
  )}
  ```
  + `_styles.css`:
  ```css
  .mgr-tpt__star {
    display: inline-flex; align-items: center; justify-content: center;
    margin-left: var(--u-space-2);
    color: var(--u-amber-500);
    font-size: 15px;
    flex-shrink: 0;
  }
  ```
  Az ikon-stratégia D-16-konform: csillag-glyph; a tooltip i18n-kulcsa `dashboard.team.topPerformer.tooltip` (`40` §4.6 `dashboard.team.*` csoporthoz olvasztva).
- **Hatás.** Mock-szintű organism-pótlás; spec-szelídítés NEM kell. **HANDOFF.md átadási megjegyzés** és/vagy közvetlen organism-fix még a Phase 3 előtt.
- **Döntés-státusz.** `under-review`

### SF-19 — A4 "Aznap lezárt" KPI lefúrás-URL VF-R1-konform átmeneti törlés

- **Forrás.** `a4-fooldal.html` `KPIS_NORMAL[3].href = '/bejelentesek?tab=lezart&resolvedFrom=ma&resolvedTo=ma'`.
- **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."*
- **Probléma.** A screen-mock a teljes `resolvedFrom/To` URL-t rajzolja, mintha a szűrő a `10` listán már létezne — a Phase 2A SF-1 viszont 6 oszlopra szűkítette a `10` listát, a `resolvedFrom/To` query-paraméter sem oszlop-szinten, sem szűrő-szinten nem implementált.
- **Javaslat.** **Kettős:**
  - **(a) Mock-átmeneti törlés:** a `KPIS_NORMAL[3].href` `'/bejelentesek?tab=lezart'`-ra szűkíteni — a `40` §4.2 átmeneti viselkedés-leírásának pontos tükrözése.
  - **(b) Spec-emlékeztető:** a `10_bejelentes_lista_es_adatlap.md` 4.2 oszlop-katalógusa egy `resolvedAt`-szűrővel (dátum-tartomány, `resolvedFrom`/`resolvedTo`) bővítendő. A `40` §8.3 VF-R1 ezt már rögzíti — a SPEC-FEEDBACK-ben csak újra-jelölés.
- **Hatás.** Pilot-mock-élmény pontossága. **HANDOFF.md átadási megjegyzés** + `10` 4.2 oszlop-katalógus-bővítés-javaslat.
- **Döntés-státusz.** `under-review`

### SF-20 — A4 fejléc-egyszerűsítés: hét-eyebrow + greeting + prózai summary TÖRLÉS (3 elem összevont)

- **Forrás.** `a4-fooldal.html` `HeadRow`:
  - `.a4-head__eyebrow` "FŐOLDAL · 2026. 21. HÉT · SZERDA, 05.20" (font-mono uppercase)
  - `.a4-head__title` "Jó reggelt, Béla!" / "Szép munka, Béla!" / "Üdv a Urbino-ban, Béla!"
  - `.a4-head__sub` "**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." (és variánsok)
- **Spec.** `40_riport.md` §4.2 a fejlécre **kizárólag a tenant nevét** rögzíti (*"A tenant neve ('Főoldal — <tenant neve>', a tenant-név a `50_konfig` `/beallitasok/altalanos`-ból)"*) **és a 'Heti riport letöltése' gombot**. D-16 explicit **TÖRLI** a hét-választó nyilakat és a delta-mérést — ugyanennek a "snapshot, nem trend" elvnek a folytatása a passzív hét-eyebrow + greeting + prózai summary törlése. A `TONE-OF-VOICE.md` manager-felület 30/70 warm/official ratio-t ír — "Jó reggelt, Béla!" jelentősen túlcsordul.
- **Probléma.** 3 elem **UI-találmány**, D-16-konceptuális elvével ütközik, a 4 KPI-kártyát prózai narratívával **megduplázza**, és a NavStore breadcrumb-jával (egyszerű "Főoldal" string) inkonzisztens.
- **Javaslat.** **3-elemű törlés**:
  - `.a4-head__eyebrow` törlése (vagy a NavStore breadcrumb fedezi).
  - `.a4-head__title` "Jó reggelt, Béla!" stb. → **"Főoldal — Balatonalmádi Önkormányzat"** (a spec literal-cím; a tenant-név dinamikusan a `TENANT.name`-ből).
  - `.a4-head__sub` prózai összegző sor teljes törlése.
- **Hatás.** A fejléc tisztább, a 4 KPI-kártya válik az elsődleges szám-fókusszá (a spec szándéka szerint). A `latestReport.year/isoWeek` információ a CTA-hint-be költözik (SF-21).
- **Hatás.** **HANDOFF.md átadási megjegyzés**; mock-szintű korrekció.
- **Döntés-státusz.** `under-review`

### SF-21 — A4 "Múlt heti riport · 20. hét" CTA-hint formalizálása új i18n-kulcsra VAGY törlés

- **Forrás.** `a4-fooldal.html` `HeadRow.a4-head__cta-hint` "Múlt heti riport · 20. hét" (mono, statikus).
- **Spec.** `40_riport.md` §4.2 + §4.6 — a `dashboard.downloadReport.*` i18n-kulcs-csoport tartalmazza a CTA-feliratot és a `disabledHint`-et, **`latestHint`-et NEM**. A `DashboardDto.latestReport.{year,isoWeek}` mezők enélkül csak az `available`-flag számolására lennének (vékony hozzáadott érték).
- **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.
- **Javaslat.** **Kettős:**
  - **(a) Spec-i18n-bővítés:** a `40` §4.6 `dashboard.downloadReport.*` csoport bővítése: `latestHint` kulcs, paraméterek `{year}`, `{isoWeek}`, formátum "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ő; a disabled-tooltip biztosítja a kontextust.
- **Preferált.** **(a)** — a `latestReport.{year,isoWeek}` mezők enélkül indokolatlanok lennének a DTO-ban.
- **Hatás.** `40` §4.6 i18n-kulcs-bővítés (egyetlen kulcs).
- **Döntés-státusz.** `under-review`

### SF-22 — A4 section-subtitle törlése

- **Forrás.** `a4-fooldal.html` `.a4-sect-head__sub`:
  - "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."
- **Spec.** `40_riport.md` §4.2 a section-fejléceket rögzíti ("Ez a hét", "Terepi csapat-teljesítmény"), **leíró sub-szöveg sehol nem szerepel**.
- **Probléma.** A "/bejelentesek lista" path-utalás **mock-developer-vetület** (a vezető nem tudja, mi az). A "Wow #2 lefúrás" affordance-a a `KpiCard` chevron-jában és a TPT name-link-ben már jelzett.
- **Javaslat.** **Törlés** — a section-fejléc önmagában elegendő.
- **Hatás.** **HANDOFF.md átadási megjegyzés**; mock-szintű korrekció.
- **Döntés-státusz.** `under-review`

### SF-23 — A5 lista "Időszak" külön oszlop spec-szelídítés

- **Forrás.** `a5-riportok-lista.html` `columns` — 5 oszlop (Hét / Generálva / Állapot / Kézbesítés / Letöltés); az Időszak a `WeekCell` második sorként van a Hét-oszlopban.
- **Spec.** `40_riport.md` §4.3 oszlop-katalógusa az "Időszakot" **külön oszlopként** rögzíti: ✓ szűrhető (dátum-tartomány), ✓ rendezhető, ✓ alap-látható.
- **Probléma.** Pilot-volumenen (heti egy sor, ~13 sor / negyedév) a "Hét DESC" szortolás **1:1 leképezés** az "Időszak DESC"-re — a két oszlop közti különbség null. A vizuális elrendezés (Hét + Időszak egy cellában) **density-szempontból jobb** — kevesebb oszlop, jobb áttekintés. A "Generálva" oszlop dátum-tartomány-szűrhetősége ekvivalens az Időszak-oszlop szűrhetőségével (a generálás hétfőn 06:00 az `[periodStart, periodEnd)` után 0-X órával).
- **Javaslat.** **Spec-szelídítés** — a `40` §4.3 oszlop-tábla "Időszak" sorát törölni (a `WeeklyReportListDto.periodStart` + `periodEnd` mezők megmaradnak, csak nem külön oszlop-renderelést kapnak). A `TableStateConfig`-vázlat alap-látható listája 5-re csökken.
- **Hatás.** `40` §4.3 oszlop-tábla revízió. NEM DTO-szerződés-változás.
- **Döntés-státusz.** `under-review`

### SF-24 — A5 lista "📄" + A5 adatlap "⟳" + "!" emoji-csere stroke-Lucide-ra

- **Forrás.**
  - `a5-riportok-lista.html` `StateEmpty` `a5-empty__icon` "📄" 26px Unicode.
  - `a5-riportok-adatlap.html` `StateGenerating` `a5d-gen-skel__icon` "⟳" 26px Unicode (spinner) + `StateFailed` `a5d-failed__icon` "!" 26px Unicode.
- **Spec / DS.** `README.md` Emoji-szabály: *"Default: no emoji. Not in buttons, not in status chips, **not in form labels, not in error messages**."* Két kivétel: citizen-side report-categories + citizen-side home-screen wave. Manager-felület **emoji-tilalom**.
- **Javaslat.** **3 csere:**
  - A5 lista "📄" → `<Icon name="file-text" size={26} />` (vagy Urbino-mark white-on-blue).
  - A5 adatlap "⟳" → `<Icon name="loader-2" size={26} />` + `animation: spin 1.6s linear infinite` (a már megírt `@keyframes spin` reuse).
  - A5 adatlap "!" → `<Icon name="alert-triangle" size={26} />`.
- **Hatás.** Mock-szintű DS-konformitás-javítás; NEM spec-szelídítés. **HANDOFF.md átadási megjegyzés**.
- **Döntés-státusz.** `under-review`

### SF-25 — A5 lista "Legutóbbi riport letöltése" PageHeader-CTA formalizálása `40` §4.3-ba VAGY törlés

- **Forrás.** `a5-riportok-lista.html` `LatestCta` button a `PageHeader.actions` slotban (`A5Screen.showCta=true`).
- **Spec.** `40_riport.md` §4.2 az R-5 (`GET /v1/weekly-reports/latest/pdf`) CTA-elhelyezést a **Dashboard** fejlécbe köti. §4.3 (`/riportok` lista) nem írja elő ezt a CTA-t a fejlécbe — 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).
- **Probléma.** A `/riportok` listán 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 top-row letöltés-gombja egyenértékű).
- **Javaslat.** **Kettős:**
  - **(a) Törlés (preferált):** a `/riportok` lista PageHeader-je akció-üres (vagy egy "Beállítások / Címzettek" link a `50_konfig` oldalhoz). A vezető a sor `Letöltés`-cellájával éri el ugyanazt.
  - **(b) Formalizálás:** `40` §4.3 a PageHeader-akcióban explicit rögzíti a "Legutóbbi riport letöltése" R-5-CTA-t.
- **Hatás.** **HANDOFF.md átadási megjegyzés** VAGY `40` §4.3 spec-bővítés.
- **Döntés-státusz.** `under-review`

### SF-26 — A5 adatlap "Kategória szerinti bontás" sidebar-kártya bővítés

- **Forrás.** `a5-riportok-adatlap.html` `REPORT_W20.categoryBreakdown` (4 sor) megvan, de **kizárólag a PDF inline preview-stubban** renderelt (a `🔍 #11` UI-találmány része). A sidebar-szekciók közt (MetaCard / NumbersCard / RecipientsCard) **nincs `CategoryBreakdownCard`**.
- **Spec.** `40_riport.md` §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.
- **Probléma.** A `snapshotData.categoryBreakdown` mező a `WeeklyReportDto` része, de a screen csak a PDF-stubban használja. Ha az SF-29 alapján a PDF-stub visszavágódik, a `categoryBreakdown` **láthatatlanná válik**.
- **Javaslat.** **Új `CategoryBreakdownCard` sidebar-kártya** a `NumbersCard` és a `RecipientsCard` közé:
  ```jsx
  const CategoryBreakdownCard = ({ categories, resolvedTotal }) => (
    <div className="a5d-card">
      <div className="a5d-card__head">Kategória szerinti bontás</div>
      <div className="a5d-cat-list">
        {categories.map((c, i) => (
          <div key={i} className="a5d-cat-row">
            <span>{c.name}</span>
            <div className="a5d-cat-bar" style={{ width: `${(c.count / resolvedTotal) * 100}%` }} />
            <span className="a5d-cat-count">{c.count}</span>
          </div>
        ))}
      </div>
    </div>
  );
  ```
  Kis bar + count formátum a heti riport-PDF kategória-bontás-szakaszával vizuális analógia. NEM kanonikus organism (egyszeri használat — A5 adatlap-specifikus); a sidebar-kártya-mintába illeszkedik.
- **Hatás.** Mock-szintű organism-pótlás. **HANDOFF.md átadási megjegyzés**.
- **Döntés-státusz.** `under-review`

### SF-27 — A5 adatlap "Audit" szekció hiánya

- **Forrás.** `a5-riportok-adatlap.html` sehol nem renderel "Audit" szekciót.
- **Spec.** `40_riport.md` §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ő visszakeresheti, ki indított utolsó újraküldést, mikor.
- **Javaslat.** A `MetaCard`-hoz 2 sor hozzáadása ("Létrehozta", "Módosította" mezők, mindkettő `displayName + relatív-időbélyeg` formátum). Pilot-volumenen ritkán használt; NEM kritikus.
- **Hatás.** Mock-szintű korrekció. **HANDOFF.md átadási megjegyzés**.
- **Döntés-státusz.** `under-review`

### SF-28 — A5 adatlap Resend confirm-dialog 5. mock-state hiánya

- **Forrás.** `a5-riportok-adatlap.html` 4 `DCArtboard`-állapot (Completed+AllSent, Completed+Partial, Failed, Generating). **A Resend-confirm-dialog mock-state hiányzik** (sem 5. DCArtboard-ként, sem overlay-placeholderként).
- **Spec.** `40_riport.md` §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>?'"*
- **Javaslat.** **5. DCArtboard** a Resend-confirm-dialog-mock-state-tel: a `ConfirmDialog` organism (Tier-1) `MergeBody` mintát követő body-pal — 4-soros címzett-felsorolás + "Mégse" / "Újraküldés a 4 címzettnek" akciók. A SD-57 literal-text ("Újraküldöd a riportot a következő címzetteknek:") a body-bevezetőben.
- **Hatás.** Mock-szintű demonstráció-pótlás. **HANDOFF.md átadási megjegyzés**; alacsony prioritás.
- **Döntés-státusz.** `under-review`

### SF-29 — A5 adatlap PDF inline preview-stub visszavágás VAGY formalizálás (új D-18) — **KRITIKUS**

- **Forrás.** `a5-riportok-adatlap.html` `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 + PDF-header + "A hét számai" + "A múlt héthez képest" + "Kategória szerinti bontás" + footer.
- **Spec.** `40_riport.md` §4.4 a riport-adatlap **5 szekcióját** rögzíti (Alapadatok / A hét számai / Kategória szerinti bontás / 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ő natívan rendereli, de **a screen-mock-fájl egy custom HTML-renderelést készít a PDF-tartalom-stubjaként**.
- **Probléma.**
  - **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. A `prevWeek` mező a screen-mockban **kitalált DTO-vetület**.
  - **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.
- **Javaslat.** **Kettős:**
  - **(a) Visszavágás (preferált):** a `PdfInlineStub` komponens 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` + új `CategoryBreakdownCard` (SF-26) sidebar-szekciók a `snapshotData` egyetlen forrása maradnak. A `prevWeek` mock-mező eltávolítva.
  - **(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), vagy a kliens a R-3 `WeeklyReportDto`-t kétszer hívja (előző hétre is) — kliens-side computation.
- **Preferált:** **(a) visszavágás** — a custom HTML-stub a valós PDF-tartalmat nem reprezentálja, és a sidebar `NumbersCard` + javasolt `CategoryBreakdownCard` (SF-26) a `snapshotData` teljes tartalmát olvashatóan adja. A natív iframe-PDF-renderelés a fejlesztő-implementáció dolga.
- **Hatás.** Mock-szintű kritikus visszavágás VAGY DECISIONS.md D-18 + spec §4.4 + §2.2 bővítés.
- **Döntés-státusz.** `under-review`

### SF-30 — A5 adatlap per-recipient delivery-status visszavágás VAGY spec-bővítés — **KRITIKUS**

- **Forrás.** `a5-riportok-adatlap.html` `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'` — a screen-mock **címzettenkénti kézbesítés-eredményt** mutat.
- **Spec — EXPLICIT KIZÁRJA EZT.** `40_riport.md` §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) és `recipientCount`-ot tárolja. A `WeeklyReportRecipient` (`30_beallitasok.md` §2.2; `00_domain_model.md` §2.5) **nem hordoz** `lastDeliverySuccess` vagy `lastDeliveryReason` mezőt. Spec literal: *"A `WeeklyReportRecipient` és a `WeeklyReport` közt logikai fogyasztás van, nem FK"*.
- **Probléma — 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.
- **Javaslat.** **Kettős:**
  - **(a) Visszavágás (preferált):** `RecipientsCard.a5d-rec-row__icon` levétele; a `r.sent` + `r.reason` mező a mock-data-ból eltávolítva. A `deliveryStatus` aggregátum-chip a kártya-fejlécben elegendő (mind 4 sor "✓ Mind kiküldve" vagy "⚠ Részben sikertelen — 1 címzettnek nem ment, lásd e-mail-szerver-naplót"). A PartialFailure-esetben opcionálisan egy small-print hint a kártya-láblécében: *"A részletes kézbesítés-eredményt a tenant e-mail-szervere naplózza."*
  - **(b) Spec-bővítés:** a `WeeklyReport`-hoz egy `WeeklyReportDelivery` aldetail entitás (a §8.1 iterational item pilot-szintre emelve), `recipientId + sent + reason + attemptedAt` mezőkkel, és a `WeeklyReportDto`-ban a `deliveries: WeeklyReportDeliveryDto[]` mező. Új R-7 olvasó-végpont (`GET /v1/weekly-reports/{id}/deliveries`).
- **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 az 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).
- **Hatás.** Mock-szintű kritikus visszavágás VAGY spec-bővítés + új entitás + új végpont.
- **Döntés-státusz.** `under-review`

### SF-31 — A5 adatlap `MetaCard` "PDF méret" sor törlése

- **Forrás.** `a5-riportok-adatlap.html` `MetaCard` sor 478–479: `<span>PDF méret</span> <span>{report.pdfSize}</span>` — `REPORT_W20.pdfSize: '247 KB'`.
- **Spec.** `00_domain_model.md` §2.4 — a `WeeklyReport` entitás **nem hordoz `pdfSize` mezőt** (csak `pdfFileRef` S3-link). A PDF méret a S3-object-metadata-ban lekérdezhető, de **nincs a `WeeklyReportDto`-ban**. Spec §4.4 nem írja elő.
- **Probléma.** A mock-mező kitalált; alacsony hasznosság (a böngésző natív "Save as…" dialog mutatja).
- **Javaslat.** **Törlés** — a `MetaCard` 3 → 2 sorra (Generálás + Generálva). A `report.pdfSize` mock-mező eltávolítva.
- **Hatás.** Mock-szintű korrekció. **HANDOFF.md átadási megjegyzés**.
- **Döntés-státusz.** `under-review`

### SF-32 — A5 lista `allfailed` `deliveryStatus`-szal állapotú `WeeklyReport` mock-data hiánya

- **Forrás.** `a5-riportok-lista.html` `REPORTS` 9 sor — 7× `allsent`, 1× `partial`, 1× `pending` (a `failed` generation után); **`allfailed` nincs**.
- **Spec.** `40_riport.md` §2.3 `ReportDeliveryStatus` 4 érték (Pending / AllSent / PartialFailure / **AllFailed**). AC-E3 explicit acceptance: `AllFailed` esetén `generationStatus == Completed` változatlan. A `DelChip` CSS-szabálya (`a5-st--allfailed`) **kidolgozott**, csak a mock-data nem demonstrálja.
- **Javaslat.** Egyetlen sor cseréje: a `REPORTS` tömb ID 17 (vagy ID 14) `delivery: 'allsent'` → `delivery: 'allfailed'`, `recipientCount: 4` → `recipientCount: 0` (vagy `4`, ha a `recipientCount` a kísérlet-számot adja).
- **Hatás.** Mock-data-pótlás; NEM spec-szelídítés. **HANDOFF.md átadási megjegyzés**.
- **Döntés-státusz.** `under-review`

---

# Phase 2B — záró összegzés a SPEC-FEEDBACK-hez

A 15 SF-tétel (SF-18..SF-32) **3 érdemi spec-szelídítést** ad (a spec-csapat döntésére):

| # | Spec-szelídítés | Hatókör |
|---|---|---|
| SF-23 | `40` §4.3 oszlop-tábla "Időszak" sor törlése (a Hét cella hordozza) | `40` 4.3 |
| SF-25(b) (alternatíva) | `40` §4.3 PageHeader-akció "Legutóbbi riport letöltése" R-5-CTA rögzítése | `40` 4.3 (NEM preferált) |
| SF-30(b) (alternatíva) | `WeeklyReportDelivery` aldetail entitás + R-7 + `WeeklyReportDto.deliveries[]` | `40` 2.2 + 3.1 + új entitás (NEM preferált — pilot scope) |

**+ 1 i18n-bővítés** (SF-21(a): `40` §4.6 `dashboard.downloadReport.latestHint` kulcs).

**+ 2 KRITIKUS HANDOFF.md átadási megjegyzés:**
- **SF-29** — A5 adatlap PDF inline preview-stub visszavágás (preferált) — a custom HTML-stub elveszi a valós PDF-tartalmat, és a `prevWeek`-mock-mező kitalált DTO-vetület.
- **SF-30** — A5 adatlap per-recipient delivery-status visszavágás (preferált) — a spec EXPLICIT KIZÁRJA (§2.2 SD-56 + §8.1 iterational item); a screen-mock félrevezet.

**A többi 9 SF mock-szintű korrekció** vagy organism-pótlás — NEM spec-szelídítés, csak átadási megjegyzés.

**Phase 2A vs. 2B összegzés.**

| Metrika | Phase 2A (A1+A2+A3) | Phase 2B (A4+A5) |
|---|---|---|
| Vizsgált elem | 52 | 80 |
| ✅ Spec + screen-en | 28 | 41 |
| ⚠ + 🔍 SF-tétel | 17 | 15 |
| Érdemi spec-szelídítés (DTO/séma) | 3 | 3 |
| Kritikus HANDOFF.md tétel | 2 | 2 |

A Phase 2B **sűrűbb fedéssel** működik (41/80 = 51% ✅ szemben a 28/52 = 54% Phase 2A-val) — a spec §4.2 + §4.4 szigorúbban prescriptív, és a screen-mock több UI-találmányt vezet be (különösen az A5 adatlapon). A **2 kritikus tétel** (SF-29 PDF-stub + SF-30 per-recipient) **a Phase 3 HANDOFF.md főüzenete** lesz.

---

# Bevezetés a Phase 2C-hez

A Phase 2C (Beállítás-ág: A6 Kategóriák + A7 Csoportok + A8 Felhasználók + A9 Általános) spec-fedés-review **folyamatban** (`SPEC-COVERAGE-A6A7A8A9.md` Batch 1 — A6 — lezárva, 27 ✅ · 5 ⚠ · 10 🟡 · 4 🔍). A Batch 1 nyomán **6 SF-tétel** keletkezett (SF-33..SF-38), amelyek 4 osztályba sorolódnak:

- **Cross-cutting spec-szelídítés** (érvényes mind a 6 A6/A7/A8/A9 screenre): SF-38 — 1 db
- **Spec-szelídítések** (a spec-dokumentum módosul): SF-37 — 1 db
- **Mock-szintű korrekciók** (NEM spec-szelídítés, HANDOFF.md átadási megjegyzés): SF-33, SF-34 — 2 db
- **Mock-korrekció + organism-bővítés** (a kanonikus organism API/render-rétege módosul): SF-35, SF-36 — 2 db

**SF-tételek áttekintése (Phase 2C, Batch 1 — A6):**

| # | Tétel | Kategória | Súly |
|---|---|---|---|
| SF-33 | A6 mock-state-hiány klaszter (delete-guard kebab + 409-confirm, ImportDialog empty, IconPicker megnyitva, alkategória-create form) | ⚠ mock-state-pótlás | közepes |
| SF-34 | A6 alkategória-soron "Tenant-egyedi/Termékesített" Forrás-badge hiánya | ⚠ mock-korrekció + organism-bővítés | alacsony |
| SF-35 | A6 `CategoryTreeEditor` toolbar saját H2-cím "Kategóriák" — PageHeader-duplikáció | 🔍 organism-bővítés (mock-fix) | közepes |
| SF-36 | A6 "Új gyökér" CTA pozíció — organism-toolbar vs. PageHeader-actions (D-1 konvenció megerősítés) | 🔍 organism-bővítés + screen-fájl-szintű mock-korrekció | közepes |
| SF-37 | A6 §4.2.5 modal-form vs. screen inline-add-row vs. kettős-CTA — spec-szelídítés | 🔍 **spec-szelídítés** | közepes |
| SF-38 | **Cross-cutting** — D-14 Settings-nav Pattern N vs. spec §4.1 "lenyíló almenü" — spec-szelídítés | 🟡 → **spec-szelídítés** | közepes |

---

## A6+A7+A8+A9 spec-szelídítések

### SF-33 — A6 mock-state-hiány klaszter (4 unmocked workflow-state)

- **Forrás.** `manager-system/preview/screens/a6-beallitasok-kategoriak.html` 4 állapot (Normal / Empty / ImportOpen / HideInactive); az alábbi 4 spec-szerinti workflow-állapot egyik artboardon sem renderelt.
- **Spec.** `30_beallitasok.md` §3.1 + §4.2 — 4 különálló CRUD-flow:
  1. **Új alkategória create-form** (`POST /v1/categories`, §3.1.3 + §4.2.5 *"modal-űrlap: Név (kötelező), Ikon (opcionális)"*). AC-K2.1..K2.5 5 acceptance criterion.
  2. **Kebab-menü törlés-akció + `category_referenced` 409 delete-guard confirm-dialog** (§3.1.7 SD-63 + §4.2.2 "Törlés (rejtett kebab-menüben)"). AC-K6.1..K6.4 4 acceptance criterion.
  3. **ImportDialog "minden importálva" üres-állapot** (§4.2.4 *"Minden gyökér-kategória már importálva van. Az alkategóriák szabadon kezelhetők a gyökerek alatt."*). AC-K4.2.
  4. **IconPicker megnyitott popover-állapot** (§4.2.7 mezősablon + D-8 C-2A *"~280px-es 6×N paletta, outside-click + Escape zár"*).
- **Probléma.** Mind a 4 állapot **organism-szinten implementált** (a `CategoryTreeEditor` + `CategoryImportDialog` + `IconPicker` props-szerződése fogadja a state-átmeneteket), de a screen-fájl **egyik artboardon sem aktiválja**:
  - `onCreate({ parentId })` no-op handler — create-form-state nincs külön artboardon
  - `onKebabClick={() => {}}` no-op + nincs `ConfirmDialog` overlay-state delete-guard-eredménnyel
  - `AVAILABLE_DEFAULT_ROOTS` mind a 4 root non-empty — `availableRoots=[]` empty-eset nincs külön artboardon
  - `iconPickerOpenForId=null` mind a 4 state-ben — IconPicker megnyitott állapot demonálatlan
- **Hatás.** A fejlesztő az Angular-portoláskor a 4 spec-szerinti workflow-állapot **vizuális mintáját nem látja**. Az AC-K2 + AC-K4.2 + AC-K6 9 acceptance criterion vizuális tükre hiányzik. **A legkritikusabb a #2 (delete-guard 409-confirm)** — a `ConfirmDialog` `kind="danger"` body-variantját a `details.directTicketCount` + `details.descendantsWithTickets[]` magyar-szöveggé alakításával csak ez az A6 fedi.
- **Javaslat.** **Mock-state-pótlás — 4 új artboard** a `DCSection id="states"` szekcióban:
  - **5. `StateCreateChildForm`** — `RootSection`-en belül egy nyitott inline-textbox-state (vagy modal-overlay a §4.2.5-konform mintával) Név + Ikon-választó UI-val. Konkrét mock: "Utak és járdák" gyökér alatti új alkategória `'gyalogátkelő'` írva.
  - **6. `StateDeleteGuardConfirm`** — kebab-menü nyitva ("Szerkesztés / Sorrend / Törlés") + a Törlés-klikkre megjelenő `ConfirmDialog` `kind="danger"` body-pal: *"A 'Utak és járdák' kategóriához 23 nyitott ügy és 2 alkategória tartozik (kátyú: 18, járdaszint: 5). Először helyezd át vagy zárd le ezeket."* (literal-konform a §3.1.7 `details`-payload magyar-szöveggé alakításával).
  - **7. `StateImportEmpty`** — `CategoryImportDialog` `availableRoots=[]` + a spec literal-szöveg *"Minden gyökér-kategória már importálva van. Az alkategóriák szabadon kezelhetők a gyökerek alatt."*.
  - **8. `StateIconPickerOpen`** — `iconPickerOpenForId={11}` (a "kátyú" alkategória ikon-popoverje nyitva), 6×N paletta + outside-click affordance.
- **Hatás.** Mock-szintű kiegészítés; a SCREEN-CONVENTIONS.md "ez a fájl NEM régi javításához" elve miatt **NEM blokkoló**. **HANDOFF.md átadási megjegyzés** és/vagy a `starter/` mintaprojekt Angular-component-tesztjeibe vihető át.
- **Döntés-státusz.** `under-review`

### SF-34 — A6 alkategória-soron "Tenant-egyedi/Termékesített" Forrás-badge hiánya

- **Forrás.** `a6-beallitasok-kategoriak.html` `CategoryRow` (`category-tree-editor.jsx:67`-150) — a `mgr-cat__row` 7 vizuális elem-pozícióval (drag-grip + ikon + név + ticketCount + inaktív-tag + toggle + ceruza + kebab); **a `sourceCatalogId`-szerinti badge HIÁNYZIK**. A `RootSection` ezzel szemben rendereli a `"Default"` tag-et (`mgr-cat__root-tag`).
- **Spec.** `30_beallitasok.md` §4.2.2 oszlop-katalógus *"Forrás | `Category.sourceCatalogId != null` | Badge: 'Termékesített' / 'Tenant-egyedi'"* — a táblázat **nem differenciál gyökér/alkategória között**, az alkategória-szintű badge ugyanúgy kötelező lenne.
- **Probléma.** A vezető az alkategória-szinten nem tudja vizuálisan szétválasztani a default-import során bejött vs. a saját kezűleg felvett alkategóriát. A `30` §3.1.4 `from-default`-workflow §3. lépés explicit kitölti a leszármazottak `sourceCatalogId`-ját a Core-rekord-id-val ("Minden alkategória ugyanezzel: `parentId = <új gyökér tenant-id>`, `sourceCatalogId` kitöltve"). A pilot-volumenen a mock 7 alkategóriájából 7 `sourceCatalogId: null` (mind tenant-egyedi), de élesben a default-import után 50%-os arány lesz.
- **Javaslat.** **Mock-korrekció + organism-bővítés** — a `CategoryRow.mgr-cat__row` renderelje az alkategória-soron is a `mgr-cat__row-tag "Default" / "Saját"` badge-et a `cat.sourceCatalogId` szerint:
  ```jsx
  // category-tree-editor.jsx, a mgr-cat__count után:
  {cat.sourceCatalogId
    ? <span className="mgr-cat__row-tag mgr-cat__row-tag--default">Default</span>
    : <span className="mgr-cat__row-tag mgr-cat__row-tag--tenant">Saját</span>}
  ```
  A "Default" / "Saját" 2-2 karakteres tag (szemben a hosszabb "Termékesített"/"Tenant-egyedi"-vel) sűrűbb sor-elrendezésre alkalmas; tooltip-ben a teljes spec-szöveg. A `_styles.css`-be `.mgr-cat__row-tag` + 2 modifier (background `--u-blue-50` / `--u-amber-50`).
- **Hatás.** Mock-szintű organism-pótlás; NEM spec-szelídítés. **HANDOFF.md átadási megjegyzés**.
- **Döntés-státusz.** `under-review`

### SF-35 — A6 `CategoryTreeEditor` toolbar saját H2-cím "Kategóriák" — PageHeader-duplikáció

- **Forrás.** `manager-system/organisms/category-tree-editor.jsx:228` `<h2 className="mgr-cat__toolbar-title">Kategóriák</h2>` + a `A6Screen.PageHeader` szintén `title="Kategóriák"` propot ad át.
- **Spec.** `30_beallitasok.md` §4.1 a `/beallitasok/kategoriak` page-title-t **a NavStore-on át a PageHeader-be** rögzíti (i18n `settings.categories.title`); az organism-szintű saját cím a spec-en kívüli.
- **Probléma.** **Két "Kategóriák" cím egymás alatt** — a PageHeader H1-szintű címe + az organism `mgr-cat__toolbar-title` H2-szintű címe ~24-48px tipográfiai távolságra. Vezetői szempontból redundáns ("már tudom, hogy ezen az oldalon vagyok"), tipográfiai-rétegben strukturális hiba (H1+H2 azonos szöveggel).
- **Javaslat.** **Organism-bővítés** — a `CategoryTreeEditor.mgr-cat__toolbar` H2-cím **eltávolítása**; a stats-sor ("4 gyökér · 7 alkategória") önállóan, kisebb tipográfiával megmarad, esetleg a toolbar-spacer balján egy `__toolbar-stats-leader` text-2 színnel. A toolbar-jobb-szél a "Inaktívak mutatása" toggle + "Új gyökér" CTA-t hordozza (utóbbi pozíció — SF-36).
- **Hatás.** `category-tree-editor.jsx:227-232` H2-eltávolítása + CSS-jelenleg cleanup. **HANDOFF.md átadási megjegyzés** vagy közvetlen organism-fix még a Phase 3 előtt.
- **Döntés-státusz.** `under-review`

### SF-36 — A6 "Új gyökér" CTA pozíció: organism-toolbar vs. PageHeader-actions (D-1 konvenció)

- **Forrás.** `category-tree-editor.jsx:241-247` `<button className="u-btn u-btn--sm u-btn--primary">Új gyökér</button>` a `mgr-cat__toolbar` jobb-szélén. Az `A6Screen.PageHeader.actions` slot **üresen marad** mind a 4 állapotban.
- **Spec.** `30_beallitasok.md` §4.2.2 a "Új gyökér-kategória" gombot **lista-szintű akcióként** rögzíti, **a pozíciót nem köti meg**.
- **D-1 konvenció** (2026.05.21) — *"Minden screen-specifikus akció a cím mellett, jobbra"* a PageHeader-actions slotba. A Beállítás-ág 4 sub-page-ből **3 másik (A7/A8/A9) PageHeader-CTA-t használ**, az A6 az egyetlen kivétel.
- **Probléma.** Belső manager-pattern-szintű inkonzisztencia. A vezető szempontjából két különböző CTA-pozíciót lát ugyanazon a Beállítás-ágon belül: A7 "Új csoport" + A8 "Új felhasználó" + A9 (nincs page-CTA) — mind PageHeader-szintű; A6 "Új gyökér" — organism-toolbar-szintű.
- **Javaslat.** **Két opció:**
  - **(a) Pozíció-csere (preferált):** "Új gyökér" CTA átköltöztetve a `A6Screen.PageHeader.actions` slotba (`a6-beallitasok-kategoriak.html:200` környékére `actions={<button>...</button>}`); a `CategoryTreeEditor.mgr-cat__toolbar` jobb-szélén csak az "Inaktívak mutatása" toggle marad. Az `onOpenImport` callback a screen-fájl szintjén kötődik.
  - **(b) D-1 finomítás:** explicit kivétel-szabály *"ha az organism saját toolbar-relevante van, a CTA az organism-toolbarba mehet"*. A `CategoryTreeEditor.mgr-cat__toolbar` self-contained marad.
- **Javasolt:** **(a)** — a Beállítás-ági szintű konzisztencia (4 sub-page egyforma CTA-pozícióval) fontosabb, mint az organism-self-contained-toolbar elvonatkoztatás.
- **Hatás.** Screen-fájl `a6-beallitasok-kategoriak.html` `A6Screen.PageHeader.actions` slot kitöltése + `CategoryTreeEditor` toolbar-revízió (a "Új gyökér" button eltávolítása vagy az `onOpenImport` prop-szerződés a screen-szintre tolva). **DECISIONS.md D-1 megerősítés** (nincs új D-X, csak referenciálisan).
- **Döntés-státusz.** `under-review`

### SF-37 — A6 §4.2.5 modal-form vs. screen inline-add-row vs. kettős-CTA-redundancia — **spec-szelídítés**

- **Forrás.** `category-tree-editor.jsx:172-180` `RootSection` rendereli a `.mgr-cat__add-row` inline-add affordance-t **a children-lista végén** (*"+ Új alkategória „{root.name}" alatt"*), és **a header-en is** egy `+alkategória` button-t (`category-tree-editor.jsx:161-165`).
- **Spec.** `30_beallitasok.md` §4.2.5 — *"**Új alkategória — modal-űrlap**. A gyökér-csoport fejlécén az 'Új alkategória' gomb egyszerű modal-űrlapot nyit: Mezők: Név (kötelező, max 100), Ikon (opcionális — ikon-választó UI). A `parentId` kontextusból, nem szerkeszthető. Mentés gomb — `POST /v1/categories`."*
- **Probléma — kétpólusos:**
  - **(i) Modal vs. inline.** A spec **modal-űrlapot** ír; a screen-organism **inline-add-row** affordance-t rajzol (modal-megnyitás nélkül). A D-8 explicit nem dönt a modal-vs-inline kérdésben (a 4 sub-decision C-1A drag-drop, C-2A IconPicker-popover, C-3B preview-kártya, C-4A always-visible row-akciók — egyike sem rögzíti a create-form-megjelenítés-mintát).
  - **(ii) Kettős-CTA.** Két "Új alkategória" affordance ugyanazon a szekción belül (fejléc-button + lista-vég-add-row) — **vizuális redundancia**. A children-lista-vég affordance pedagógiailag jó (sok-alkategóriás csoportban gyors), de a fejléc-szintű button is megvan.
- **Javaslat — két aspektus külön döntéssel:**
  - **(i) Spec-szelídítés:** a `30` §4.2.5 *"modal-űrlap"*-megfogalmazás finomítása: *"inline-szerkesztés vagy modal-űrlap; pilot-megvalósításnál inline-szerkesztés preferált (a `K-026` inline-szerkesztés-elvvel és a D-8 IconPicker-popover-mintával konzisztensen)."*. A `name`-mező inline-textboxként, az `iconRef` inline-popoverként (D-8 C-2A reuse) — modal-overlay nélkül.
  - **(ii) Kettős-CTA-redukció:** a `RootSection.mgr-cat__root-actions` `+alkategória` header-button **eltávolítása** (a children-lista-vég `mgr-cat__add-row` egyetlen affordance marad — sűrűbb, kevesebb vizuális zaj). Üres gyökér esetén a `mgr-cat__empty` "Még nincs alkategória." üzenet helyett ugyanaz az add-row a fő affordance.
- **Hatás.** `30_beallitasok.md` §4.2.5 spec-szelídítés (1-mondat-átírás) + `category-tree-editor.jsx:158-165` `RootSection.mgr-cat__root-actions` egyszerűsítése. Az SF-33 #1 mock-state-hiány lezárását (5. artboard `StateCreateChildForm`) **az inline-minta szerint** kell megépíteni, nem modal-szerint.
- **Döntés-státusz.** `under-review` — **spec-csapat döntsön**: a modal-előírást megtartani (és a screen-organism inline-mintát visszavonni), vagy a spec-szövegét inline-irányba szelídíteni.

### SF-38 — Cross-cutting: D-14 Settings-nav Pattern N vs. spec §4.1 "lenyíló almenü" — **spec-szelídítés**

- **Forrás.** **Mind a 6 settings-screen** (`a6-beallitasok-kategoriak.html`, `a7-beallitasok-csoportok-lista/-adatlap.html`, `a8-beallitasok-felhasznalok-lista/-adatlap.html`, `a9-beallitasok-altalanos.html`) **`LeftNav 4-leaf` navigációval** él: az `AppShell.active="kategoriak|csoportok|felhasznalok|altalanos"` prop közvetlenül 4 egyenrangú nav-item-re mutat, a `<SettingsSubNav>` organism **NEM renderelt sehol** (sőt: A6 + A9 `<script src="...settings-sub-nav.jsx">` betöltődik, de a JSX-ben sehol nem fogyasztott — AUDIT-2 §3.4 dokumentált halott script-include).
- **Spec.** `30_beallitasok.md` §4.1 — *"A főnavigáció 'Beállítások' tételére kattintva **lenyíló almenü**, négy aloldal-linkkel — a tétel maga nem navigál. ... 'Beállítások' breadcrumb-elem nem klikkelhető link (nincs `/beallitasok` oldal), csak címke."* Az `00_architektura_v4.md` §3.2 + `90_sitemap_v3.md` §2.6 megerősítik a "Beállítások mint **szülő-csomópont** + alatta 4 sub-page" hierarchikus modellt. A `SettingsSubNav` organism (Tier-1, `ORGANISMS.md` §2 SettingsSubNav) explicit a `.u-tabs` default underline-variánsát fogyasztja: *"A `/beallitasok/*` top-tabs sávja: Általános · Kategóriák · Csoportok · Felhasználók."*
- **D-14** (2026.05.22) — *Pattern N választva*: *"LeftNav 4 leaf + SettingsSubNav törölve. A 4 sub-page egyenrangú navigációs leaf, közvetlenül a LeftNav-ban. Egy hely, egy kattintás. ... A `SettingsSubNav` redundáns. Implementációs egyszerűsítés: a `SettingsSubNav` organism-fájl megőrződik a kódban, de a screen-fájlok nem fogyasztják. A jövőbeli G-pattern-re visszatérés trivi."* A D-14 explicit megemlíti: *"Spec-szelídítés a `30_beallitasok` 4.1-hez: a spec tab-szerű sub-nav-ot javasol; a Pattern N spec-felé visszacsatolandó (a `SPEC-FEEDBACK.md` Phase 1.4 mellékterméke)."*
- **Probléma.** **Spec-deviáció a teljes Beállítás-ágon**: a `30` §4.1 "lenyíló almenü" + "Beállítások szülő-csomópont" + 'Beállítások' breadcrumb-jelzés mind a hierarchikus modellt feltételezi; a D-14 ezt felülírja LeftNav 4-flat-leaf modellel, ahol a "Beállítások" **nem létezik mint navigációs csomópont**, csak mint breadcrumb-prefix-label (akkor is csak a screen-mock `breadcrumb={['Beállítások', '<X>']}` prop-szinten, ami szintén lazább a spec-szövegnél — *"Beállítások › Kategóriák"* a spec, *"Beállítások / Kategóriák"* a mock).
- **Javaslat — Pattern N spec-szelídítés:**
  - **(a) Spec-szövegmódosítás `30` §4.1**: *"A LeftNav 4 egyenrangú leaf-fel hordozza a Beállítás-ág sub-page-jeit (Általános · Kategóriák · Csoportok · Felhasználók) — a 'Beállítások' önmagában **nem navigációs csomópont**, csak breadcrumb-prefix-label. A `/beallitasok` URL `/beallitasok/altalanos`-ra redirect-el. Ha a settings-sub-pagek száma 4-en túl bővül (pl. Webhook-ok, API-kulcsok, Pénzügy), akkor a hierarchikus modell (LeftNav 1 item + tab-szerű sub-nav) **újra-felülvizsgálandó**."*
  - **(b) `SettingsSubNav` organism státusza**: a `ORGANISMS.md` §2 SettingsSubNav-bejegyzés **deprecated-tag-gel** ellátva, vagy "rezerválva a jövőbeli G-pattern számára (4+ sub-page esetén)" jellegű megjegyzéssel. Az organism-fájl + a Tier-1 katalógus-specimen NEM törlendő (referencia-érték).
  - **(c) Halott `<script src="...settings-sub-nav.jsx">` include az A6 + A9 screenekben**: **AUDIT-2 P1-fix** (lásd AUDIT-2 §3.4) — eltávolítandó. Minor cleanup.
- **Hatás.** **Spec-dokumentum-módosulás** (`30_beallitasok.md` §4.1 + §4.5.1 navigációs leírások); az `ORGANISMS.md` SettingsSubNav-bejegyzés státus-frissítése (deprecated vagy "reserved"); 2 halott `<script>` tag-törlés.
- **Döntés-státusz.** `under-review` — **spec-csapat döntsön**: a Pattern N elfogadása (preferált, mert a pilot 4-sub-page-volument természetesen lefedi) vagy a spec-szöveg-megerősítés (akkor a 6 screen + organism-katalógus a hierarchikus modellre vissza kell konvertálni).

### SF-39 — A7-lista `Aktív` oszlop hiánya + `isActive` mock-data mezőbővítés

- **Forrás.** `a7-beallitasok-csoportok-lista.html` `columns` 4-tagú szett (`Csoport / Tagok / Létrehozta / Létrehozva`); a `GROUPS[*]` mock-rekord **nem hordoz `isActive` mezőt** (mind a 5 csoport implicit aktívnak feltételezett).
- **Spec.** `30_beallitasok.md` §4.3.1 4-oszlopos katalógus: *"`Aktív` | `GroupListDto.isActive` | igen (kapcsoló) | igen | 'Aktív' / 'Inaktív' badge"*. AC-G4.2 explicit: *"`Ticket.assignedGroupId` egy deaktivált `Group`-ra ... a felelős-mező az inaktív csoport nevét mutatja, nem `null`-ra állítódik"* — implicit lista-szintű state-megjelenítés.
- **Probléma.** A vezető a listán nem látja, melyik csoport deaktivált; a `deaktiválás/reaktiválás` row-akció (§4.3.1) visszacsatolása vizuálisan hiányzik.
- **Javaslat.** **Mock-korrekció + organism-bővítés:**
  - `columns` 5. oszlopként `Aktív`: `{ key: 'isActive', label: 'Aktív', sortable: true, defaultSortDir: 'desc', width: 110, render: (r) => <StatusBadge active={r.isActive} /> }`
  - `GROUPS[*]` mock-rekordra `isActive: true/false` mezőbővítés (legalább 1 inaktív csoport demonstratív állapotban — pl. "Veszélyhelyzeti tartalék" `isActive: false`).
  - StatusBadge: spec literal "Aktív" / "Inaktív" + `--u-status-uj-bg` neutral-color vs. `--u-fg-3` muted.
- **Hatás.** Mock-szintű organism-pótlás; NEM spec-szelídítés. **HANDOFF.md átadási megjegyzés**.
- **Döntés-státusz.** `under-review`

### SF-40 — A7-adatlap `MemberRow` `status` badge hiánya (kanonikus `GroupMemberList` API)

- **Forrás.** `a7-beallitasok-csoportok-adatlap.html` `MemberRow` (`AUDIT-2 §3.3 inline-pótlás a kanonikus GroupMemberList helyett`) — 3-oszlopos grid (`user/role/remove`); **`status` cella NEM renderelt**. A 4 mock-MEMBER mind implicit `Active`.
- **Spec.** `30_beallitasok.md` §3.2.2 `GroupDto.members[]` denorm display-DTO: *"`[{id, displayName, status, roles}]` a `TenantUser`-ből"*. A `status` (UserStatus enum: `Active`/`Invited`/`Disabled`, SD-37) a member-soron a tag-fiók állapotát közli.
- **Probléma.** A `30` §3.2.3 validáció *"csak Active TenantUser rendelhető csoportba (Invited/Disabled `400`)"* a hozzárendelés-időre szigorú; de a meglévő tagság-állapot változhat (pl. egy `Active` tag később `Disabled` lesz). A `GroupMemberList`-en a `status` vizuális jel a vezető-figyelmeztetésre.
- **Javaslat.** **Kanonikus `GroupMemberList` organism-bővítés** (a `MemberRow` AUDIT-2 §3.3 retirement-jével együtt):
  - `mgr-gml__member-row` rendezze a member-display-DTO `status` mezőjét
  - `Active` → nincs explicit badge (default-eset)
  - `Invited` → amber dot vagy "Meghívva" mini-chip az avatar-on
  - `Disabled` → szürke dot + sor halvány `opacity: 0.55` (mint az A6 inaktív kategória-sor mintával konzisztens)
- **Hatás.** `manager-system/organisms/group-member-list.jsx` (a kanonikus organism, AUDIT-2 §3.2 (c) szerint **halott** — 0 screen-fogyasztó) bővítendő; a Phase 3 fejlesztője az Angular-portoláskor a kanonikus organismet építi meg, NEM az `a7d-mrow` inline-pótlást. **HANDOFF.md átadási megjegyzés** (a `GroupMemberList` retirement-feladat része).
- **Döntés-státusz.** `under-review`

### SF-41 — Delete-guard 409-confirm mock-state-pótlás klaszter (A6 + A7)

> **2026.05.25 — scope-finomítás (Batch 3 felülvizsgálat):** Az eredetileg javasolt **A8-deaktiválás-confirm** rész **kihúzva** az SF-41 scope-ból. Indoklás: az A8-on a deaktiválás-flow NEM a `DELETE`-en megy, hanem a `POST /v1/users/{id}/deactivate`-en; a `cannotDeactivateSelf` + `cannotRemoveLastManager` invariánsok **proaktívan** (D-9 UD-4A: RoleEditor-locked + Deaktiválás-disabled+tooltip) blokkolják a saját-deaktiválás-kísérletet a kliens-szinten. ConfirmDialog-mintát az A8-on csak akkor használnánk, ha **másik-user deaktiválás**-flow-n a `cannotRemoveLastManager` szerver-szintű 400-as válasz felugorna — de a kliens-proaktívnak ezt **elkerülnie kell**; ha mégis felugrik, az **toast-szintű hiba-megjelenítés**, nem ConfirmDialog. Lásd Batch 3 ⚠ #4 + SF-50.

- **Forrás.** **2 settings-screen párhuzamos hiányosság:**
  - A6 (SF-33 #2): `DELETE /v1/categories/{id}` `category_referenced` 409 + kebab-menü "Törlés" — nincs mock-state.
  - **A7: `DELETE /v1/groups/{id}` `group_referenced` 409** — a `a7d-danger` zóna a "Csoport törlése" button-affordance-t rajzolja + magyarázó szöveggel ("a kiosztott bejelentések kapcsolata megszűnik"), DE a tényleges 409-confirm-dialog `ConfirmDialog` `kind="danger"`-rel nincs külön artboardon.
- **Spec.** `30` §3.1.7 SD-63 + AC-K6.1-K6.4 (A6) + `30` §3.2.4 SD-63 lábjegyzete + AC-G3.1 (A7). **Mindkét esetben** a `ConfirmDialog` `kind="danger"` body-variant a `details`-payload magyar-szöveggé alakításával.
- **Javaslat.** **2 mock-state-pótlás** a `ConfirmDialog`-mintát követő körkörös klaszterrel (Tier-1 `ConfirmDialog` organism reuse):
  - **A6 5. artboard**: kebab-menü nyitva + `ConfirmDialog kind="danger"` body: *"A 'Utak és járdák' kategóriához 23 nyitott ügy és 2 alkategória tartozik (kátyú: 18, járdaszint: 5). Először helyezd át vagy zárd le ezeket."*
  - **A7 5. artboard**: danger-zone klikkjére `ConfirmDialog kind="danger"` body: *"A 'Útkarbantartó csapat' csoporthoz 18 nyitott bejelentés van kiosztva. Először helyezd át a bejelentéseket más csoporthoz, vagy zárd le őket."*
- **Hatás.** Mock-szintű kiegészítés (2 új artboard összesen); a Tier-1 `ConfirmDialog` `kind="danger"` body-variant a 2 helyen demonstrálva — kanonikus pattern. **HANDOFF.md átadási megjegyzés**.
- **Döntés-státusz.** `under-review`

### SF-42 — A7-adatlap §4.3.2 modal vs. inline-szekció — **spec-szelídítés (analóg SF-37)**

- **Forrás.** `a7-beallitasok-csoportok-adatlap.html` `Section` × 2 (Alapadatok + Tagok) — D-10 G-1A explicit *"inline-szekciók (A8-konzisztens)"*.
- **Spec.** `30_beallitasok.md` §4.3.2 — *"`name` olvasásra (a 'Szerkesztés' gomb modal-űrlapba nyit)"*. A spec **modal-szerkesztést** ír.
- **D-10 G-1A** (2026.05.22) — *"A spec 4.3.2 modal-formát javasol, de a D-9 (A8 felhasználó-adatlap) inline-szekciónkénti szerkesztést kapott — a Beállítás-ág konzisztenciája fontosabb, mint a spec-literál pontosság. ... **Spec-szelídítés a 4.3.2-höz: a modal-form ugyanaz, csak inline-szekcióban élesedik.**"*
- **Probléma.** A D-10 explicit megnevezi a spec-szelídítés-igényt — itt formalizálom: a Beállítás-ági 3 sub-page (A7 + A8 + A9) **mind inline-szekciónkénti szerkesztés-mintával** működik (A7: 2 szekció, A8: 3 szekció, A9: 3 szekció). A spec 3 különböző helyen tartja a modal-előírást (`30` §4.3.2 + §4.4.1 + esetleg §4.2.5 az A6-ra) — egységesen szelídítendő.
- **Javaslat.** **Spec-szelídítés-csomag** (`30_beallitasok.md` 3 helyen 1-mondat-átírás):
  - **(a) §4.2.5** *"Új alkategória — modal-űrlap"* → *"Új alkategória — inline-szerkesztés (K-026 minta) vagy modal-űrlap; a pilot inline-mintát választ"* (SF-37 már fed).
  - **(b) §4.3.2** *"a 'Szerkesztés' gomb modal-űrlapba nyit"* → *"a 'Szerkesztés' gomb a szekciót edit-módba kapcsolja (inline-szerkesztés a Beállítás-ági pattern szerint, D-10 G-1A); modal-űrlap alternatív megvalósításként megengedett"*.
  - **(c) §4.4.1 általános "egyszerűsített elrendezés"** — pilotra OK, csak megerősítés.
- **Hatás.** **Spec-dokumentum-módosulás** (`30_beallitasok.md` 3 mondat-átírás). Az inline-pattern a `20_felhasznalokezeles` §4.3-ban D-9 alatt már bake-in (a felhasználó-adatlap szekciónkénti szerkesztése autoritatív minta).
- **Döntés-státusz.** `under-review` — **spec-csapat döntsön**: az SF-37 + SF-42 spec-szelídítés-csomag egységes átvezetése.

### SF-43 — **`Group.description` spec-bővítés + `slug`/`initials` mock-törlés** — `Group` entitás-bővítés

- **Forrás.** `a7-beallitasok-csoportok-adatlap.html` `GROUP.description = 'Aszfalt-, járda-, és útburkolat-karbantartás. Kátyúzás, padka-javítás, vízelvezetés.'` — renderelve a `GroupHead.a7d-head__sub`-on + Alapadatok grid "Leírás"-cellán (read + textarea-ban edit-mode-ban + italic-fallback empty-csoporton). `GROUP.slug = 'utkarb'` — mono-formátum "Azonosító" mind a lista `NameCell.a7-gn__sub`-on + adatlap-on. `GROUP.initials = 'ÚK'` — violet circle a list `a7-gn__ic`-en + adatlap `a7d-head__avatar`-on.
- **Spec.** `00_domain_model.md` §2.2 `Group` entitás: **4 mező** (`id`, `name`, `isActive`, `members`). `description`, `slug`, `initials` egyike sem létezik. `50_konfig_v2.md` 3.2 explicit: *"csoport = címke + taglista"* (K-016 pilot-scope minimum). A `30_beallitasok` §3.2 + §4.3.4 mezősablonok **csak `name` + `tenantUserIds`-t fednek**.
- **Probléma.** Két különálló UI-elem-csoport:
  - **(i) `description`** — szubsztanciális pedagogikai érték ("Útkarbantartó csapat — kátyúzás, padka, vízelvezetés" vs. csak puszta név). A vezető-élmény szempontjából érdemi. K-016 pilot-scope-on kívül, de **a K-007 "tenant tartalmat konfigurál" elv és a manager-tone-of-voice "concrete, names" alapelv mentén indokolt**.
  - **(ii) `slug` + `initials`** — vizuális enhancement-mezok. A `slug` (utkarb, kozvil, ...) URL-fragment-szándékkal — de a spec-routing numerikus id-val (`/beallitasok/csoportok/details/<id>`) operál, így a slug **mint URL nem értelmes**. Az `initials` (ÚK, KV) szerver-oldalon az első 1-2 szó kezdő-betűjéből származtatható helper-függvénnyel.
- **Javaslat — kétlépcsős:**
  - **(a) `Group.description` spec-bővítés** — `00_domain_model.md` §2.2 + `30_beallitasok.md` §3.2.3 + §4.3.4 mezősablon:
    ```
    | description | string (hosszú) | O | A csoport feladatkörének rövid leírása.
    | | | | Max 500 karakter. Plain text. A vezető szerkeszti az
    | | | | adatlap "Alapadatok" szekciójában. Pilot pedagogikai jellegű:
    | | | | "Mit csinál ez a csoport?" — opcionális, üresen hagyható.
    ```
    Az `[validationForm]`-mintába triviálisan illeszthető (textarea, max 500). A `GroupDto` egy újabb mezővel bővül.
  - **(b) `slug` + `initials` mock-szintű törlés** — a screen-mock `GROUP.slug` + `GROUP.initials` + `GROUPS[*].slug` + `GROUPS[*].initials` mezők eltávolítása. A list-`NameCell` ikon-cellája szerver-oldali `initials`-helper-függvénnyel pótolható (`name.split(' ').map(w => w[0]).slice(0,2).join('')`); a `slug` teljesen elhagyható (a numerikus `id` a routing-azonosító).
- **Hatás.**
  - **(a) Spec-bővítés** — `00_domain_model.md` §2.2 + `30_beallitasok.md` §3.2 + §4.3 + §4.3.4 mezősablon-bővülés. A `[ManyToManyConnection]` minta változatlan, csak 1 plusz mező.
  - **(b) Mock-korrekció** — `a7-beallitasok-csoportok-lista.html` + `a7-beallitasok-csoportok-adatlap.html` `slug` + `initials` mezők törlése; `a7-gn__sub` + `a7d-head__sub` + Alapadatok "Azonosító" sor + EditingBasic "Azonosító" input + magyarázó hint **mind eltávolítandó**. A `initials` az org-szintű helper-függvénnyel + screen-szintű mock-derivation-nel pótolható.
- **Döntés-státusz.** `under-review` — **spec-csapat döntsön** a (a) bővítésről; a (b) mock-korrekció független a (a)-tól.

### SF-44 — A7-lista `Létrehozta` (createdBy) oszlop spec-katalógusba felvétele

- **Forrás.** `a7-beallitasok-csoportok-lista.html` `columns[2]` `Létrehozta` (str, sortable, 160px) — `row.createdBy` "Tóth Béla" / "Kovács Anna" renderelve.
- **Spec.** `30_beallitasok.md` §4.3.1 4-oszlopos katalógus a `Létrehozta` (creator-displayName) oszlopot NEM tartalmazza; csak `Létrehozva` (timestamp). A `createdBy` az `AuditableEntity`-ből származó Core `User.id` FK.
- **Probléma.** A `30` §3.1.1 `Category` mintájához hasonlóan a `Group` createdBy-feloldása triviális (a Tenant DB-ben a `TenantUser.coreUserId == User.id` lookup-pal); pedagogikai érték a vezetőnek ("ki indította a csoportot?"). Spec-szerinti `AuditableEntity` audit-mezők (lásd §3.7) "ki/mikor utoljára"-szintű, az UI-megjelenítés szabadon hagyott.
- **Javaslat.** **Spec-szelídítés** — `30` §4.3.1 oszlop-katalógus bővítése:
  ```
  | Létrehozta | createdBy.displayName | igen (szöveg) | igen | denormalizált, opcionálisan rejthető
  ```
  Az AutoMapper `ProjectTo<GroupListDto>()` egy `Switch`-szel olvassa a `createdBy` Core-`User.displayName`-ét; ha cross-DB költség aggályos, a `GroupListDto.createdByDisplayName` denormalizált tárolt mező (vagy a `TenantUser.coreUserId`-n keresztül feloldva).
- **Hatás.** `30_beallitasok.md` §4.3.1 oszlop-tábla 1 sorral bővül. NEM DTO-szerződés-fő-változás (`createdBy` már létezik mint FK; csak a `displayName` derived).
- **Döntés-státusz.** `under-review`

### SF-45 — A7-lista FilterPillBar `Méret`-szűrő mock-törlés

- **Forrás.** `a7-beallitasok-csoportok-lista.html` `FilterPillBar.filters = [{key: 'creator', label: 'Létrehozta'}, {key: 'size', label: 'Méret'}]`.
- **Spec.** `30_beallitasok.md` §4.3.1 oszlop-szűrhetőség: `Név` (szöveg-szűrő) + `Aktív` (boolean-kapcsoló) — **csak ez a két szűrő spec-rögzített**. `Méret` (`memberCount`-szerinti) szűrő a spec-katalógusban nem szerepel; a `Létrehozta` SF-44 keretében felvehető.
- **Probléma.** Pilot-volumenen 5 csoportos listán a `Méret`-szűrő (`4+ fő`) **nem értelmes** — a vezető vizuálisan átlátja a számokat. A spec-katalógus szigorú leképezést ír elő: csak `Szűrhető=igen` oszlopok lehetnek FilterPillBar-on.
- **Javaslat.** **Mock-korrekció** — a `Méret` szűrő törlése; az `Aktív`-szűrő hozzáadása (SF-39-cel együtt), a `Létrehozta`-szűrő SF-44-cel együtt megmarad. A 2 új szűrő (`Aktív` + `Létrehozta`) + a `Név`-szövegkereső a teljes spec-szerinti szűrési-felület.
- **Hatás.** Mock-szintű korrekció. **HANDOFF.md átadási megjegyzés**.
- **Döntés-státusz.** `accepted-pending-mock-update`

### SF-46 — A7-lista First-time empty-card emoji 👥 + pedagogical exceeds spec literal

- **Forrás.** `a7-beallitasok-csoportok-lista.html` State 3 `.a7-empty__icon` "👥" (28px Unicode) + magyarázat *"A csoportok a bejelentés-kiosztáshoz kellenek: hozz létre egy 'Útkarbantartó csapat'-ot, vegyél fel 3-5 terepi munkást, és a kátyú-bejelentések automatikusan a csoport tagjaihoz kerülnek."*
- **Spec / DS.** `README.md` Emoji-szabály: *"Default: no emoji. ... Manager-felület emoji-tilalom."* `30_beallitasok.md` §4.5.2 literal: *"Még nincs csoport. Hozz létre egyet a 'Új csoport létrehozása' gombbal."* (egysoros, technikailag-faktuális, NEM pedagogikus).
- **Javaslat.** **Két csere** (analóg a Phase 2B SF-24-ben + SF-22-ben):
  - 👥 emoji → `<Icon name="users" size={28} />` (Lucide stroke-ikon).
  - Pedagogikus magyarázat redukálása az 1-mondatos spec-literal-ra; opcionálisan 2-mondatra bővítve: *"A csoportok a bejelentés-kiosztáshoz kellenek."* + spec-literal CTA-szöveg.
- **Hatás.** Mock-szintű DS-konformitás-javítás + pedagogikai-túlcsorgás visszavágása. **HANDOFF.md átadási megjegyzés**.
- **Döntés-státusz.** `accepted-pending-mock-update`

### SF-47 — A8-lista `UserInviteDialog` open-state mock-state-pótlás (AUDIT-2 §3.3 inline-pótlás retirement)

- **Forrás.** `a8-beallitasok-felhasznalok-lista.html` `InviteCta` button (`A8Screen.PageHeader.actions`) `onClick={() => {}}` no-op; `<script src="...user-invite-dialog.jsx">` betöltve, DE **a `<UserInviteDialog open=true>` overlay egyik artboardon sem renderelt**. Az `AUDIT-2 §3.3` explicit dokumentálja az inline-pótlást: *"a `UserInviteDialog` organism megépítve, de NEM rendererelt. ... HANDOFF.md átadási megjegyzés, NEM UI-találmány."*
- **Spec.** `20_felhasznalokezeles.md` §3.2 invite-workflow (`POST /v1/users/invitations` + invitedRoles[] + email-validáció + ütközés-409: `email_already_invited` / `email_already_user`). §4.2 lista-szintű akció: *"Új felhasználó meghívása — modal-dialógus (email + invitedRoles checkboxszett)"*. **D-9 UD-1A** (2026.05.22): *"Egyszerű dialog. Email mező + 4 checkbox a roles-szettre. Validáció szerver-oldali (email-uniqueness + `400 invalid_email`); UI-szinten csak az `email`-formátum-előellenőrzés."*
- **Probléma.** A fejlesztő az Angular-portoláskor az invite-workflow vizuális mintáját **csak az organism-spec-rétegből** (Tier-2 katalógus-specimen) látja, a screen-fájl-szintű composition-en át nem. AC-4.1 + AC-4.2 (a `20` §6.1 acceptance criteria) vizuális tükre az organism-fájlon át kerül lefedésre, **NEM a screen-mockon át**.
- **Javaslat.** **Mock-state-pótlás** — új 5. artboard `StateInviteOpen` az A8-lista screen-fájlon:
  - `<UserInviteDialog open=true onClose={() => {}} onSubmit={() => {}}>` overlay-vel (`.a6-modal-frame__backdrop` blur-overlay-decoration analóg mintával az A6 State3 ImportDialog-on)
  - Email-input (`<input type="email" placeholder="kollegam@balatonalmadi.hu">`)
  - 4-checkbox roles-szett (Vezető / Diszpécser / Terepi / Tartalomkezelő) — magyarázó 1-mondatos leírással UD-2A-konform
  - 2 footer-gomb: "Meghívó küldése" (`u-btn--primary` `disabled` ha az email-mező üres) + "Mégse" (`u-btn--ghost`)
- **Hatás.** Mock-szintű kiegészítés; **NEM blokkoló**. A SF-41 mock-state-pótlás-klaszterhez csatolva (A6 + A7 delete-guard + A8 invite-dialog = 3 mock-state-pótlás összesen). **HANDOFF.md átadási megjegyzés**.
- **Döntés-státusz.** `under-review`

### SF-48 — `User.language` UI-fedés szándékos kihagyás vagy spec-bővítés

- **Forrás.** `a8-beallitasok-felhasznalok-adatlap.html` Alapadatok grid (5 mező: Név / E-mail / Meghívva / Aktiválva / Letiltva) — **a `User.language` (en/hu/null) mező sehol nem renderelt**. A `USERS[*]` mock-rekord nem hordoz `language` mezőt.
- **Spec.** `00_domain_model.md` §3.1 `User.language: string?` mező (felhasználói nyelvválasztás per-user, citizen-felület + manager-felület i18n-kulcs feloldásához). `20_felhasznalokezeles.md` §4.3 adatlap-mezősablon a `language` mező UI-szintű kezelését **nem említi** — így a spec-szintű feloldás **definiálatlan**.
- **Probléma.** A vezető nem tudja módosítani egy másik user nyelv-preferenciáját (pl. ha egy magyarul nem beszélő terepi munkás `en`-t választott telepítéskor, de a vezető szeretné `hu`-ra állítani). Pilot-volumenen elhanyagolható (Balatonalmádi 100% magyar staff), de a spec szerinti mező UI-feloldása **nyitva marad**.
- **Javaslat — két opció:**
  - **(a) Spec-bővítés** — `20_felhasznalokezeles.md` §4.3-ba egy **"Beállítások" 4. szekció** (csak `language` mezővel a pilotra; a per-user-i18n későbbi bővítésre kész). A 4. szekció view-mode-on a `language` string-érték magyar-vetülettel (`hu` → "Magyar", `en` → "English", `null` → "—"), edit-mode-on `<select>` 2 opcióval.
  - **(b) Szándékos-kihagyás-megerősítés** — spec-megjegyzés *"a `language` UI-szinten **csak a saját profilról** szerkeszthető (Phase 2+); más felhasználó nyelvének módosítása nem támogatott a pilot-on. A vezető-adatlap-on a `language` mező rejtve."*
- **Javasolt:** **(b)** — pilot-volumenen a szándékos-kihagyás a spec-tisztaság érdekében preferált; a (a)-bővítés a Phase 2+ irányba tartogatva. A "saját profil" oldal a pilot-on **NEM létezik** (a vezető a `language`-t a Core Identity-szolgáltatás regisztrációs flow-ján állítja), így a UI-fedés-igény még nem keletkezik.
- **Hatás.** **Spec-megjegyzés-bővítés** (`20_felhasznalokezeles.md` §4.3 1-bekezdés) — szándékos-kihagyás dokumentálása.
- **Döntés-státusz.** `under-review` — **spec-csapat döntsön**: (a) bővítés vagy (b) szándékos-kihagyás.

### SF-49 — `UserInvitation.status` (Pending/Expired/Revoked) lejárt-meghívó differenciálás

- **Forrás.** `a8-beallitasok-felhasznalok-lista.html` `MeghívvaTab` State 3: az `Invited`-státuszú TenantUserek listája — a `UserInvitation.status` (Pending vs. Expired vs. Revoked) **nem differenciálódik vizuálisan**. Egy lejárt meghívó (`Expired`) ugyanúgy "Meghívva" tag-gel jelenik meg, mint egy érvényes (`Pending`). A `UserInvitation.expiresAt` sehol nem renderelt.
- **Spec.** `00_domain_model.md` §3.5 `UserInvitation` 7 mező: `id`, `email`, `invitedRoles[]`, `token`, `status: InvitationStatus`, `invitedAt`, `expiresAt`. **`InvitationStatus` enum**: `Pending` (érvényes, várja az aktivációt) / `Accepted` (a TenantUser `Active`-ra váltott) / `Expired` (7+ nap eltelt invitedAt óta) / `Revoked` (a vezető visszavonta).
- **Probléma.** A vezető nem látja, mely meghívók lejártak (a §3.5 spec szerint a meghívók **7-napos érvényességűek**, utána újraküldés szükséges). A "Meghívó újraküldése" akció a §3.3 `POST /v1/users/invitations/{id}/resend` ezt **kezelni tudja**, de a **vizuális információ a lista-oldalon hiányzik** ("ezek a meghívók még frissek; ezek lejártak").
- **Javaslat.** **Mock-korrekció + szelektív organism-bővítés:**
  - A `MeghívvaTab` lista-soron az `expiresAt` derived-mező megjelenítése: ha `< now()` → "lejárt" piros mini-tag (`u-chip--danger`); ha `now() + 24h` belül → "hamarosan lejár" amber mini-tag (`u-chip--warning`).
  - Az adatlap-on `InvitationStatus`-szerinti finomítás: `Expired`-on a "Meghívó újraküldése" gomb hangsúlyosabb (`u-btn--primary` helyett, vagy explicit pulzáló-affordance); a hint-szöveg *"Az eredeti meghívó {invitedAt}-i. A meghívó **lejárt** — küldj újat."*
  - A `USERS[*]` mock-rekord opcionális `invitationStatus: 'Pending' | 'Expired'` mező-bővítés (legalább 1 `Expired`-mock-rekord demonstratív állapotban).
- **Hatás.** Mock-szintű korrekció + esetlegesen `UserStatus`-szal komponált derived-status logika UI-szinten (a `TenantUser.status: Invited` + `UserInvitation.expiresAt < now()` → vizuálisan "lejárt-Invited"). **HANDOFF.md átadási megjegyzés**.
- **Döntés-státusz.** `under-review` — alacsony-közepes prioritás.

### SF-50 — LastManager Deaktiválás-tooltip invariáns-szöveg-keveredés

- **Forrás.** `a8-beallitasok-felhasznalok-adatlap.html` State 3 (LastManager-Béla) — a Deaktiválás-button tooltip-szövege: *"Te vagy az egyetlen vezető — nem deaktiválhatod magad."*
- **Spec — SD-38 két invariáns:**
  - **`cannotDeactivateSelf`**: *"A vezető a saját fiókját nem deaktiválhatja. Server-side guard: `400 cannot_deactivate_self`. UI proaktív előjelzés: Deaktiválás-button disabled saját adatlapon."*
  - **`cannotRemoveLastManager`**: *"Ha a deaktiválandó user az egyetlen `manager`-szerepkörű aktív TenantUser, a deaktiválás megakad: `400 last_manager`. UI proaktív előjelzés: a RoleEditor-on a `manager` checkbox `locked`."*
- **Probléma.** A tooltip-szöveg **két invariáns-magyarázatot összeolvaszt egy mondatba**:
  - "Te vagy az egyetlen vezető" — `cannotRemoveLastManager`-magyarázat
  - "nem deaktiválhatod magad" — `cannotDeactivateSelf`-állítás
- A két invariáns Béla esetében **mindkét feltétel-irányból** aktív (saját adatlap **és** egyetlen vezető), de a `cannotDeactivateSelf` **önmagában elegendő** a disabled-állapothoz — a "magad" rész az **autoritatív magyarázat**. A "egyetlen vezető" rész **felesleges keveredés** (egy nem-utolsó-vezető saját-adatlapján a Deaktiválás ugyanúgy disabled lenne, de "egyetlen vezető" magyarázat nem stimmelne).
- **Hatás.** A vezető zavart kaphat: *"ha kineveznénk egy másik vezetőt, akkor magamtól deaktiválhatnám?"* — **NEM; a `cannotDeactivateSelf` saját-fiók-tilalom független a vezető-számtól**. A `cannotRemoveLastManager` (és a role-szintű "manager checkbox locked") **elsőbb-deaktivációs path-on** hat.
- **Javaslat.** **Mock-korrekció — szövegcsere:**
  - **Deaktiválás-tooltip új szöveg:** *"Nem deaktiválhatod a saját fiókodat. Kérj meg egy másik vezetőt."* (csak `cannotDeactivateSelf`-konform; a "másik vezető" kifejezés implicit utal a `cannotRemoveLastManager`-előfeltételre is, de nem keveri).
  - **RoleEditor-`locks` magyarázat** (változatlan): *"Te vagy az egyetlen vezető — utolsó-manager invariáns (SD-38)."* (a `cannotRemoveLastManager`-hoz pontosan illeszkedik).
- **Hatás.** Mock-szintű szövegcsere (1 sor). **HANDOFF.md átadási megjegyzés** + DECISIONS D-9 UD-4A explicit példa-szöveg-bake-in.
- **Döntés-státusz.** `accepted-pending-mock-update`

### SF-51 — **"Te" chip identitás-előjelzés** — D-9 UD-4A bővítés vagy új D-X "Self-aware identitás-előjelzés a manager-listákon"

- **Forrás.** `a8-beallitasok-felhasznalok-lista.html`:
  - `UserCell.a8-uc__name`: a `row.isCurrentUser`-feltétel alatt `<span className="a8-self">Te</span>` mini-badge (blue-50 háttér, blue-200 border, blue-700 szöveg).
  - State 4 (FirstTime) `a8-self-row__name` ugyanaz a chip a self-row-on.
  - `USERS[0]` (Tóth Béla) `isCurrentUser: true` mock-flag.
- **Spec — három-réteges check:**
  - **(a) `20_felhasznalokezeles` §4.2 oszlop-katalógus** — a `displayName` oszlop-spec a vezető önmagát-jelölésére **NEM tér ki**; csak a `displayName` + `email` aggregátum-renderelést írja.
  - **(b) SD-38 invariánsok** — a 3 szerver-autoritatív szabály kliens-szinten a §3.7 + §4.4 *"proaktív megakadályozás"*-ot említ. A "proaktív" itt **akció-szintű** (disabled-button, locked-checkbox), **NEM identitás-szintű** (lista-soron "Te" chip).
  - **(c) D-9 UD-4A** — *"invariáns-előjelzés disabled + tooltip mintával"*. A *"Te"*-jelölés mint **identitás-affordance** D-9 nem rögzíti; UD-4A konkrétan a RoleEditor-checkbox-lock + Deaktiválás-button-disabled mintát írja.
- **Verdikt — 🔍 UI-találmány** (NEM 🟡). A "Te"-chip **identitás-szintű információ**, a `cannotDeactivateSelf`-invariáns akció-szintű előjelzésén túlmutató.
- **Pedagogiai indoklás (a "Te" chip megtartása mellett):**
  - **(i) Self-aware-flow-affordance.** A vezető vizuálisan azonnal tudja, hogy a listán önmagát is látja — ne lepődjön meg, ne kattintsa meglepetésszerűen a 'Deaktiválás'-t.
  - **(ii) FirstTime-state self-row-on különösen értékes.** A "Te vagy itt egyedül" magyarázat (SF-55 átszövegezett változatán: "Még csak te vagy a tenanton.") alá kerül a chip — a "te" szó kétféleképpen kerül elő (identitás-jelzés + magyarázó szöveg), ami a self-recognition-pattern-t megerősíti.
  - **(iii) SD-38 tág-szellemmel konzisztens.** A 3 invariáns mindegyikének közös szándéka a "vezető ne deaktiválja önmagát, ne döntse veszélybe a tenant-üzemeltetést". A "Te" chip ennek **proaktív identitás-előjelzése**.
- **Javaslat — két opció:**
  - **(a) D-9 UD-4A bővítés** — a UD-4A invariáns-előjelzés-pattern finomítása: *"A `cannotDeactivateSelf`-invariáns UI-mintája magában foglalja a **lista-szintű "Te" identitás-chip-et** + az adatlap-szintű disabled+tooltip-et. A "Te" chip a `currentUser.id == row.id`-feltétel alatt a `displayName` mellett mini-badge formátumban; blue-50 háttérrel, az Urbino-brand-blue-tarka identitás-jelzéssel."*
  - **(b) Új D-X döntés (D-15): "Self-aware identitás-előjelzés a manager-listákon"** — cross-screen érvényesítéssel az A8-listán túl: az A7-csoport-tagok listán (a vezető csoport-tagok között), az A11-bejelentés-felelős cellán (a vezető saját bejelentéseit), stb. helyeken. A "Te" chip egységes vizuális szerződéssel (`<span className="u-self-chip">Te</span>` ha lehet egy `_styles.css`-szintű kanonizációval).
- **Javasolt:** **(b) — új D-X döntés** (cross-screen érvényesítéssel a manager-rendszerben). A "Te" chip mint **horizontális design-pattern** több screenen érvényesülne; D-9 UD-4A bake-in a specifikusabb invariáns-előjelzés-réteg. **A DECISIONS.md új tételbe (D-15) érdemes felvenni**, az ORGANISMS.md `_styles.css` `.u-self-chip`-szintű kanonizációjával.
- **Hatás.**
  - **DECISIONS.md új D-15 felvétele** (Self-aware identitás-előjelzés a manager-listákon).
  - **ORGANISMS.md `_styles.css` `.u-self-chip`** új kanonikus class.
  - **A `UserCell` + `MemberRow` (A7) + `AssigneeCell` (A11) — opcionális retrofit** a kanonikus `.u-self-chip`-re.
  - **20_felhasznalokezeles.md §4.2 + §4.3** — implicit megerősítés (a "Te" chip a `currentUser.id`-feltétel alatti UI-elem, NEM spec-katalógus-mezőbővítés).
- **Döntés-státusz.** `under-review` — **spec-csapat döntsön**: (a) D-9 UD-4A bővítés vagy (b) új D-15 cross-screen pattern. Phase 2 SP-26 mintával — *"a "Te" chip pedagogiailag indokolt, a kérdés csak a dokumentáció-szintű hely"*.

### SF-52 — A8-lista `Utoljára aktív` oszlop — `User.lastActiveAt` **spec-bővítés**

- **Forrás.** `a8-beallitasok-felhasznalok-lista.html` `columns[3]` `Utoljára aktív` (str, sortable, 130px) — `row.lastActiveLabel` relatív-időbélyeg-formátum literal mock-szövegekkel: `'most'` / `'12 perce'` / `'2 órája'` / `'tegnap'` / `'még nem'` / `'3 hete'`.
- **Spec.** Sem `User`, sem `TenantUser` entitás nem hordoz `lastActiveAt` (vagy `lastLoginAt` / `lastSeenAt`) mezőt:
  - `00_domain_model.md` §3.1 `User` 5 mező: `id`, `displayName`, `email`, `language`, `passwordHash`.
  - `00_domain_model.md` §2.3 `TenantUser` SD-37 projekció: `displayName`, `email`, `status`, `disabledAt`.
- **Egyik sem hordoz aktivitás-időbélyeget**. A `20_felhasznalokezeles.md` §4.2 oszlop-katalógus a `Utoljára aktív`-oszlopot **nem szerepelteti**.
- **Probléma.** A "Utoljára aktív" oszlop vezetői-érték-szempontból nagyon hasznos:
  - *"Melyik diszpécser dolgozott aznap?"* — operatív-vetület.
  - *"A 3 héttel ezelőtt aktivált Pál azóta egyszer sem jelentkezett be."* — invitácio-elfogadás-utáni elakadás detektálása.
  - *"A Nagy Réka 3 hetes inaktivitása előzte meg a letiltás-döntést."* — staff-rotation-átláthatóság.
- **Implementáció-szempont:**
  - **Server-side:** új mező `User.lastActiveAt: DateTimeOffset?` (Core-szinten globális, a Core Identity-szolgáltatás minden auth-tokenes API-hívás során update-el; max. percenként 1× a write-amplification miatt). Vagy tenant-specifikus `TenantUser.lastActiveAt`-ra projektált (utóbbi cross-tenant elhatároltabb).
  - **UI-szinten:** relatív-időbélyeg-formátum (`getRelativeTime(timestamp)` helper-függvénnyel: `< 1min` → "most", `< 1h` → "{N} perce", `< 24h` → "{N} órája", `< 7d` → "tegnap" / "{N} napja", `< 30d` → "{N} hete", `< 365d` → "{N} hónapja", `>= 365d` → "{N} éve"). `Invited`-státuszú user → "még nem" literal (a lastActiveAt `null`).
- **Javaslat — spec-bővítés:**
  - **(a) `00_domain_model.md` §3.1** — új mező:
    ```
    | lastActiveAt | DateTimeOffset? | O | A Core Identity-szolgáltatás write-amplification-mentesen
    | | | | update-eli minden auth-tokenes API-hívás során (max. percenként 1×).
    | | | | `null` ha a user még nem aktivált (Invited-státuszú TenantUser).
    | | | | Cross-tenant globális — az utolsó-aktivitás a Core-felhasználó-szinten.
    ```
  - **(b) `20_felhasznalokezeles.md` §4.2 oszlop-katalógus** — bővítés:
    ```
    | Utoljára aktív | lastActiveAt | igen (idő-tartomány) | igen | relatív-időbélyeg-formátum;
    | | | | `'most'` / `'12 perce'` / `'2 órája'` / `'tegnap'` / `'3 hete'` / `'még nem'` (Invited)
    ```
- **Hatás.** **Spec-bővítés** — `User` entitás 1 új mezővel, `20` oszlop-katalógus 1 új oszloppal. A `[validationForm]`-mintával NEM ütközik (`lastActiveAt` Core Identity-szolgáltatás autoritatív, kliens-vezető NEM szerkeszti). **Phase 2+ kompatibilis** — a pilot-on opcionálisan rejthető oszlop.
- **Döntés-státusz.** `under-review` — **spec-csapat döntsön**.

### SF-53 — A8-lista FilterPillBar `Csoport`-szűrő mock-törlés + `Szerepkör`-szűrő multiselect→single

- **Forrás.** `a8-beallitasok-felhasznalok-lista.html` `FILTERS_DEFAULT = [{key:'role', label:'Szerepkör'}, {key:'group', label:'Csoport'}]` + `FILTERS_ACTIVE` State 2-n `Diszpécser` érték aktivált.
- **Spec.** `20_felhasznalokezeles.md` §4.2 oszlop-katalógus szűrhetőség: `displayName` (szöveg), `status` (4-tab), `role[]` (multiselect-dropdown). A `Csoport`-szerinti szűrő **NEM szerepel** a spec-katalógusban; a `role`-szűrő spec-szerint **multiselect-dropdown**, NEM single-value FilterPillBar-pill.
- **Probléma — két aspektus:**
  - **(i) `Csoport`-szűrő.** Pedagogikailag indokoltnak tűnhet ("kik tartoznak az 'Útkarbantartó csapathoz'?"), DE: a vezetőnek erre a kérdésre az A7-csoport-adatlap pontosabb választ ad (a `MemberRow` lista). A vezető-flow szempontjából **redundáns**.
  - **(ii) `Szerepkör`-szűrő FilterPillBar-on vs. dropdown.** Spec dropdown-multiselectet ír; a FilterPillBar single-value pill-egyetértésű. A pilot-on mind a 4 szerepkör external-input-ot kíván — a multiselect dropdown spec-konform megvalósítás, a FilterPillBar single-pill ezt **egyszerűsíti**.
- **Javaslat — két lépés:**
  - **(a) Mock-korrekció — `Csoport`-szűrő törlése.** A vezető a csoport-tagság-szerinti keresést az A7-adatlapon kapja meg.
  - **(b) Spec-szelídítés VAGY mock-korrekció — `Szerepkör`-szűrő single-value FilterPillBar:**
    - **Spec-szelídítés:** `20` §4.2 oszlop-katalógus *"a role-szűrő multiselect-dropdown VAGY single-value FilterPillBar; pilot single-value preferált"*.
    - **Mock-korrekció (alternatíva):** a FilterPillBar `role`-pill-ját kibővítjük multiselect-dropdown-megnyitásra (a FilterPillBar `popoverKind="multiselect"` propján át — ha ezt az organism szerződés engedi).
- **Javasolt:** **(a) + (b/spec-szelídítés)** — a pilot-on 1 szerepkör keresése elég gyakori, a multiselect-egyszerűsítés indokolt.
- **Hatás.** Mock-szintű korrekció + spec-szelídítés. **HANDOFF.md átadási megjegyzés**.
- **Döntés-státusz.** `under-review`

### SF-54 — A8-lista count-label *"X · 1 aktív szűrő"* redundancia visszavágás

- **Forrás.** `a8-beallitasok-felhasznalok-lista.html` State 2 (Aktív tab + diszpécser-szűrő): `DataTable.countLabel={<><strong>{rows.filter(...).length}</strong> diszpécser · 1 aktív szűrő</>}` — a count-label **2 információt összevon** egy sorba.
- **Spec / standard.** `20_felhasznalokezeles.md` §4.2 a `countLabel` formátum-szerződését nem rögzíti. Az A1-lista (Phase 2A) + A4-lista (Phase 2B) count-label `<strong>{N}</strong> bejelentés` **egysíkú szöveggel**; az "aktív szűrő"-jelzés a FilterPillBar `hasActive` propján vagy a "Szűrők törlése"-ghost-action-on jelenik meg.
- **Probléma.** A "1 aktív szűrő" rész **redundáns affordance** — a FilterPillBar `hasActive={true}` propja már vizuálisan jelzi (az aktív pill kiemelése + a "Szűrők törlése"-ghost-action), a count-label-en megint kimondani fölösleges.
- **Javaslat.** **Mock-korrekció** — a count-label egysíkúra redukálása `<strong>1</strong> diszpécser` formátummal (analóg az A1 + A4 mintával); a "1 aktív szűrő"-rész a FilterPillBar saját affordance-jára bízva.
- **Hatás.** Mock-szintű szövegcsere (1 sor). **HANDOFF.md átadási megjegyzés**.
- **Döntés-státusz.** `accepted-pending-mock-update`

### SF-55 — A8-lista FirstTime empty-card 👋 emoji + "Te vagy itt egyedül." tone-of-voice

- **Forrás.** `a8-beallitasok-felhasznalok-lista.html` State 4 (FirstTime):
  - `a8-empty-card__icon` "👋" (28px Unicode wave)
  - `a8-empty-card__title` *"Te vagy itt egyedül."*
  - `a8-empty-card__desc` *"Hívj meg másokat: diszpécsert a bejelentések kezelésére, terepi munkásokat a megoldásra, tartalomkezelőt a hírekhez. A meghívók e-mailben mennek ki."*
- **Spec / DS — három aspektus:**
  - **(i) `README.md` Emoji-szabály:** *"Default: no emoji. Manager-felület emoji-tilalom."* + *"A home-screen greeting wave 👋 — pairs with a wave emoji as a recognised warm-greeting idiom"* — DE: a 👋 wave-emoji kivétel **csak citizen-home-screen-en** alkalmazható; manager-felületen **NEM**.
  - **(ii) `TONE-OF-VOICE.md` magyar-vetülete:** *"Tisztelt-távolság helyett kollégai. Konkrét, név-szerű. Trailing `!` tilos."* A *"Te vagy itt egyedül."* meleg-hang, de a "egyedül" szó **enyhe-melancholikus**; a kollégai-hang inkább *"Még csak te vagy a tenanton."* / *"Egyedüli felhasználó vagy."*.
  - **(iii) `20_felhasznalokezeles.md` §4.5.2 spec-literal:** *"Még nincs más felhasználó. Hívj meg kollégákat."*
- **Probléma — háromszintű:**
  - 👋 emoji manager-felület DS-szabály-megsértés (citizen-home greeting reserved).
  - "Te vagy itt egyedül." enyhe-melancholikus tónus; **tone-of-voice-finomítás szükséges**.
  - Pedagogikai-desc OK (3 szerepkör-felsorolás), tone-konform.
- **Javaslat — háromrétű csere** (analóg SF-46-tal):
  - 👋 emoji → `<Icon name="user-plus" size={28} />` (Lucide stroke-ikon, semleges affordance).
  - `a8-empty-card__title` átírás: *"Még csak te vagy a tenanton."* (kollégai-konform, az "egyedül"-melancholiát elkerüli).
  - `a8-empty-card__desc` megtartani — a 3-szerepkör pedagogikai-magyarázattal jó.
- **Hatás.** Mock-szintű DS-konformitás-javítás + tone-of-voice-igazítás (1 ikon + 1 title-szövegcsere). **HANDOFF.md átadási megjegyzés** (analóg SF-46-tal).
- **Döntés-státusz.** `accepted-pending-mock-update`

### SF-56 — A9 `WeeklyReportRecipient.name` üres-eset fallback mock-data-bővítés

- **Forrás.** `a9-beallitasok-altalanos.html` `RECIPIENTS_FULL` 4 mock-RECIPIENT mind kitöltött `name`-mel; az "üres-name → email-fallback"-eset egyetlen artboardon sem demonstrált.
- **Spec.** `30_beallitasok.md` §2.2 mezőtábla: *"`name` opcionális. Max 200 karakter. **Ha üres, a felület és a `resend`-megerősítő-dialógus az e-mailt mutatja.**"*
- **Probléma.** A fejlesztő az Angular-portoláskor a `RecipientList` üres-name render-mintáját **csak a kanonikus organism-specimenből** (`manager-system/organisms/recipient-list.jsx` self-contained példányán át) látja, nem screen-fájl-szintű composition-ből. AC-R3.x-mintát a name-fallback fed.
- **Javaslat.** **Mock-data-bővítés** — egy 5. RECIPIENT mock-rekord `{id: 5, name: '', email: 'titkar2@balatonalmadi.hu', isActive: true}`-mel a State 1 ReadOnly listán. Vagy alternatív mock-szettel: a 3. *"Hivatali titkárság"* rekord `name`-jét üresítjük, így az email-fallback (`'titkarsag@balatonalmadi.hu'`) jelenik meg `name`-helyén — pedagogiailag éppen ezt a use-case-t fedi (intézményi mailbox, név nélkül).
- **Hatás.** Mock-szintű korrekció. **HANDOFF.md átadási megjegyzés**.
- **Döntés-státusz.** `accepted-pending-mock-update`

### SF-57 — A9 Email-uniqueness 409-validáció UI-hibakezelés mock-state-pótlás

- **Forrás.** `a9-beallitasok-altalanos.html` State 4 RecipientEdit a 2. sort edit-módban mutatja, **ütközés-állapot nélkül**.
- **Spec.** `30_beallitasok.md` §2.2 + §3.3.3 + AC-R3.1: *"tenant-szinten egyedi `email`; ütközéskor `409 email_not_unique`"*. A `[validationForm]`-minta szerinti UI-megjelenítés: a `EmailField` blur-on / form-submit-on `400`/`409` esetén field-error-megjelenítés (`u-input--error` modifier + `u-field-error` segéd-szöveg).
- **Probléma.** A fejlesztő nem látja, hogyan jelenik meg a `409 email_not_unique` UI-szinten. AC-R3.1 vizuális tükre hiányzik.
- **Javaslat.** **Mock-state-pótlás** — új 5. artboard `StateRecipientConflict` a State 4 mintára, de a 2. sor email-mezőjén `u-input--error` modifier + `u-field-error` hint magyar-vetülettel: *"Ez az e-mail már szerepel a címzett-listán."* A spec literal-vetület a `[validationForm]` `01_kozos_mintak` 5.5 mintájával.
- **Hatás.** Mock-szintű kiegészítés. **HANDOFF.md átadási megjegyzés**.
- **Döntés-státusz.** `under-review`

### SF-58 — A9 `LogoUploader` upload-folyamat-állapotok (pending/error) mock-state vagy organism-bővítés

- **Forrás.** `a9-beallitasok-altalanos.html` `LogoUploader` 2 állapota mockolva: empty (dropzone) + uploaded (preview-state). Az upload-folyamat-állapotok (`pending="uploading"` overlay + `error="file_too_large"` / `wrong_format`) **nincsenek külön artboardokon**.
- **Spec.** `30_beallitasok.md` §3.3.2 + AC-R2.1..AC-R2.4 — *"`POST /v1/tenants/logo` multipart, max 1MB, PNG/JPG/WEBP, max 2000×2000px. `400 file_too_large` / `400 wrong_format`"*. A pending upload (`Uploading…`) + sikertelen upload UI-mintát a `[validationForm]`-szerű hint-state-ek fednék.
- **Probléma.** A pilot-on Béla a logót egyszer feltölti — a hibás-upload-flow (rossz méret, rossz formátum) ritka, de a UI-szerződésnek **rendelkezni kell** róla. AC-R2.1..R2.4 vizuális tükre részleges.
- **Javaslat.** **Mock-state-pótlás vagy organism-bővítés:**
  - **(a) Organism-bővítés:** a `LogoUploader.jsx` organism-szinten egy `pendingState: boolean` + `errorState: 'file_too_large' | 'wrong_format' | 'network' | null` prop; az error-state magyar-vetülete *"A fájl nagyobb, mint 1 MB."* / *"Csak PNG, JPG, WEBP fogadható el."* / *"Hálózati hiba — próbáld újra."*.
  - **(b) Mock-state:** opcionálisan egy 5. artboard `StateLogoUploadError` a "fájl nagyobb, mint 1MB" magyar-vetülettel.
- **Hatás.** Organism-bővítés + opcionális mock-state. **HANDOFF.md átadási megjegyzés**.
- **Döntés-státusz.** `under-review`

### SF-59 — **A9 "péntek 06:00" vs. spec "hétfő reggel" — kritikus spec-konflikt** + spec-precízálási javaslat

> **Súlyosság:** **MAGAS — kritikus pilot-félreértés-rizikó**. Sürgős mock-korrekció szükséges a HANDOFF.md-be.

- **Forrás.** `a9-beallitasok-altalanos.html` **4 helyen** szövegez riport-kézbesítési időpontot:
  - State 1 ReadOnly `SettingsSection.description`: *"Akik **péntek reggel 06:00-kor** megkapják a heti PDF-riportot e-mailben."*
  - State 2 EditingTenant ugyanaz a description-szöveg.
  - State 4 RecipientEdit ugyanaz a description-szöveg.
  - State 3 FirstTime `RecipientEmptyCard.a9-rec-empty__desc`: *"A **pénteki riport-e-mail** nem megy ki senkihez, amíg fel nem veszel legalább egy címzettet."*
- **Spec — direkt ütközés a `40_riport.md`-vel:**
  - **`40_riport.md` §1.2 bevezetés (line 69):** *"E-mail-kézbesítés: **hétfő reggel** automatikus generálás az előző naptári hétre, e-mail-mellékletként a címzett-listának"*.
  - **`40_riport.md` §3.6 (line 475):** *"A generáló job. Egy ütemezett háttér-job minden **hétfőn reggel** (tenant-időzónában) fut..."*
  - **`40_riport.md` §3.6 (line 525):** *"a vasárnap 24:00 után **néhány órával** fut (hétfő reggel)..."*
- **A `30_beallitasok.md` §4.4 + §4.4.3** a recipient-szekció leírásában a konkrét időpontot **NEM SZEREPELTET** — a `40_riport.md`-re hivatkozik. A "péntek 06:00" **screen-mock-saját szövegtalálmány**, ami **direkt ellentmond** a `40_riport.md` autoritatív kijelentésének.
- **Probléma.** **Súlyos pilot-félreértés-rizikó:**
  - Béla (vezető) péntek reggel várja a polgármester-felé továbbítandó riportot; **csak hétfőn érkezik meg**.
  - Polgármester péntek reggel várja a heti összefoglalót; **csak hétfőn kapja**.
  - Hivatali titkárság a péntek reggeli ülésre tervezné a polgármester-előterjesztést; **a riport csak hétfőn áll rendelkezésre**.
  - A pilot-tapasztalat első 3 hete **negatív elvárás-csalódásokkal** indulna.
- **Javaslat — két lépés:**
  - **(a) Sürgős mock-korrekció — 4 helyen szövegcsere:**
    - 3× SettingsSection-description: *"Akik **péntek reggel 06:00-kor** megkapják..."* → *"Akik **hétfő reggel** megkapják a heti PDF-riportot az előző naptári hétről."*
    - 1× `RecipientEmptyCard.desc`: *"A **pénteki** riport-e-mail..."* → *"A **hétfő reggeli** riport-e-mail..."*.
  - **(b) Spec-precízálási javaslat — `40_riport.md` §3.6 időpont-precízálás:** a spec jelenleg csak *"hétfő reggel"*-t mond, konkrét óra-precízió NEM. **Javasolt 1-mondat-bővítés:** *"A háttér-job hétfő reggel 06:00–07:00 között (tenant-időzónában) fut. A vezető és a címzettek a hét első munkanapjának reggelére érvényes várakozást képezhetnek."* — így a vezető explicit várakozhat a riportra.
- **Hatás.**
  - **(a) Mock-korrekció:** azonnali, 4 sor szövegcsere a `a9-beallitasok-altalanos.html`-en. **HANDOFF.md sürgős átadási megjegyzés** (a Phase 2C legmagasabb prioritású fix-tétele).
  - **(b) Spec-precízálás:** `40_riport.md` §3.6 1-mondat-bővítés. A Phase 3 spec-csapatának továbbítandó.
- **Döntés-státusz.** `urgent-mock-fix-pending` + spec-precízálás `under-review`.

### SF-60 — A9 `RecipientEmptyCard` `@` karakter-ikon → Lucide mail-stroke-ikon

- **Forrás.** `a9-beallitasok-altalanos.html` State 3 `<div className="a9-rec-empty__icon" aria-hidden="true">@</div>` — 36×36px amber-500 háttér, fehér 18px `@` karakter Plus Jakarta Sans-ben.
- **Spec / DS.** `README.md` Iconography: *"System: Lucide — 1.5px stroke, rounded line caps, 24×24 default."* + *"A handful of Unicode glyphs are permitted as functional marks: ✓ → · …"* — `@` **nem szerepel** az engedélyezett Unicode-glyph-szettben.
- **Probléma.** Pedagogiailag jó (a `@` szimbólum az e-mail-affordance-t kommunikálja), DS-konformitás-szempontból **karakter-ikon** ami sem Lucide stroke, sem engedélyezett Unicode-glyph.
- **Javaslat.** **Mock-korrekció** — `@` → `<Icon name="mail" size={20} />` (Lucide stroke-ikon, semleges email-affordance, a `--u-amber-500` háttéren fehér stroke-kal). Az `a9-rec-empty__icon` CSS-szabály változatlan (36×36px, amber bg); csak a child-content vált.
- **Hatás.** Mock-szintű DS-konformitás-javítás (1 div-child-csere). **HANDOFF.md átadási megjegyzés**.
- **Döntés-státusz.** `accepted-pending-mock-update`

### SF-61 — A9 `LogoUploader.logoMeta` 4 derived-mező spec-bővítés vagy mock-redukció

- **Forrás.** `a9-beallitasok-altalanos.html` `LOGO_META` mock-objektum: `{filename: 'balatonalmadi-logo.png', size: '12 KB', uploadedAt: '2026.05.10. · 14:22', uploadedBy: 'Tóth Béla'}` — renderelve `LogoUploader` preview-state alatt.
- **Spec.** `30_beallitasok.md` §3.3.1 `TenantSettingsDto` 11 mezős DTO-táblája: `logoUrl` (derived presigned) + `logoFileRef` (S3-hivatkozás), **DE a meta-mezok (`filename`/`size`/`uploadedAt`/`uploadedBy`) nem szerepelnek a DTO-ban**. A `Tenant` `AuditableEntity` → `updatedAt`/`updatedBy`-t hordoz **tenant-szinten** (nem logó-szintűen); a logó-fájl-szintű audit (ki és mikor töltötte fel) **NEM része a spec-szerződésnek**.
- **Probléma.** A `LogoUploader` 4 derived-mezőt rendereli, ami **nem létezik a spec-DTO-ban**.
- **Javaslat — két opció:**
  - **(a) Szelektív spec-bővítés:** a `Tenant` entitásra `logoUploadedAt: DateTimeOffset?` + `logoUploadedBy: User.id?` — 2 új mező a 4-SD-58 felül. A `filename` + `size` derived (a `logoFileRef`-S3-objektum-metadata-feloldással, lazy a kliens-kérésére). A `TenantSettingsDto` bővítése `logoUploadedAt` + `logoUploadedByDisplayName` (denormalizált) mezőkkel.
  - **(b) Mock-redukció:** `LogoUploader` preview-state meta-szöveg törlése; csak a fájl-kép-előnézet + 2 gomb (cserélés + törlés) marad.
- **Javasolt:** **(a) szelektív** — `uploadedAt` + `uploadedBy` érdemi pilot-érték (a Béla tudja, mikor töltötte fel utoljára és ki — ha más vezető is van a tenanton), `filename` + `size` minor mock-pedagogikai (NEM blokkoló a törlésüknek).
- **Hatás.** **Spec-bővítés** (`Tenant` 2 új mezővel + `TenantSettingsDto` bővülés) + organism-szinten a `filename`/`size` minor csere derived-feloldásra. A `LogoUploader` API-szerződése `logoMeta`-prop helyett `tenant.logoUploadedAt`+`tenant.logoUploadedByDisplayName` direkt fogyasztást kap.
- **Döntés-státusz.** `under-review` — **spec-csapat döntsön**.

---

## Phase 2C — záró összegzés (`SPEC-COVERAGE-A6A7A8A9.md`-vel konszolidálva)

**A teljes Phase 2C 4-batch lezárva (A6+A7+A8+A9).** A számok és kategorizálás a `SPEC-COVERAGE-A6A7A8A9.md` ági záró-szakaszán; itt csak a SF-szám-summary:

| Kategória | SF-szám | Tételek |
|---|---|---|
| **Spec-bővítés** (érdemi entitás-mezőbővülés) | 4 | SF-43 (`Group.description`), SF-52 (`User.lastActiveAt`), SF-59 spec-precízálás (`40_riport.md` időpont), SF-61 (`Tenant.logoUploadedAt/By`) |
| **Spec-szelídítés** (1-mondat-átírás / pattern-revízió) | 6 | SF-37 (§4.2.5 modal→inline), SF-38 (Settings-nav Pattern N cross-cutting), SF-42 (§4.3.2 modal→inline), SF-44 (`Létrehozta` oszlop), SF-48 (`User.language` UI-fedés), SF-51 (D-9 UD-4A bővítés / új D-15 "Te" chip) |
| **Mock-state-pótlás** (új artboardok) | 4 | SF-33 (A6 4-state), SF-41 (A6+A7 delete-guard 409), SF-47 (A8 invite-dialog open), SF-57/SF-58 (A9 email-conflict + logo-upload-állapotok) |
| **Mock-korrekció / organism-bővítés** | 16 | SF-34, SF-35, SF-36, SF-39, SF-40, SF-45, SF-46, SF-49, SF-50, SF-53, SF-54, SF-55, SF-56, SF-60 + SF-43/SF-59 mock-aspektusok |

**Összesen: 30 SF-tétel** (SF-33..SF-61) a Phase 2C-ből.

**Kritikus pilot-prioritás:**
- **SF-59 (péntek-vs-hétfő spec-konflikt)** — sürgős mock-korrekció, **HANDOFF.md legmagasabb prioritású fix-tétele**. Pilot-félreértés-rizikó (vezető + polgármester téves várakozás).
- **SF-41 (delete-guard 409-confirm mock-state-klaszter A6+A7)** — közepes prioritású mock-pótlás (a kanonikus `ConfirmDialog` `kind="danger"` body-variant demonstrálása).
- **SF-38 (D-14 Settings-nav Pattern N cross-cutting)** — egységes spec-csapat-döntést igénylő spec-szelídítés; a teljes Beállítás-ágra érvényes.

---

*A Phase 2D (`## A10+A11+A12 spec-szelídítések`) fejezet alább megnyílt. A Phase 3 mindezt konszolidálja és visszacsatolja a spec-csapatnak.*

---

## A10+A11+A12 spec-szelídítések

**Phase 2D · 2026.05.25 · 34 SF-tétel (SF-62..SF-95).** Forrás: `SPEC-COVERAGE-A10A11A12.md` Batch 1 (A10 Hírek) + Batch 2 (A11 Programok) + Batch 3 (A12 Városi információk) + Cross-cutting fejezet.

> **FK-1 (RichTextEditor mibenléte) — lezárás-emlékeztető.** Az induló-prompt FK-1-et a `99_donesnaplo.md`-ben jelölte spec-szintű nyitott kérdésként; a valós elhelyezkedés a `03_implementacios_terkep.md` nyitott-kérdés-tábla, és a kérdést a `60_tartalom` v1.0 lezárta (SD-69 + §4.6 PrimeNG Editor implementációs választás). A `RichTextEditor` pilot-szintű impl. (D-13) az SD-69-whitelisttel konform; a HANDOFF.md hatáskörében a PrimeNG Editor-csere (FluentValidation szerver-szanitizációval). **NEM aktív nyitott kérdés — NEM SF-tétel.**

### Batch 1 — A10 Hírek

### SF-62 — `News.pushOnPublish` szerkesztő-mező teljes hiánya **(KRITIKUS — pilot-blokkoló)**
- **Forrás.** `a10-hirek-szerkeszto.html` `value` mind a 4 állapot-mockon `{publishState, title, body, coverImageUrl, [coverImageMeta], [publishedAt]}` — **`pushOnPublish` mező sem a value-on, sem renderelt jelölőnégyzetként sehol nem szerepel**. `content-editor.jsx:67-149` `editorPane` JSX nem rendereli a checkbox-ot semmilyen `kind`-feltétellel.
- **Spec.** `60_tartalom` §2.1 + §4.2.4 ASCII-mock + §4.2.5 mezősablon (jelölőnégyzet + súgó `content.news.field.pushOnPublish.help`) + §4.5.2 i18n + §4.5.5 `confirm.publish` vs `confirm.publishWithPush` két variant + AC-N1.8 + `00_domain_model` §4.2 mezőtáblába felvéve.
- **Hatás.** A tartalomkezelő **nem tudja beállítani** a push-tényt; AC-N1.8 UI-tesztelhetetlen; két variant publikálási-dialógus elveszik; polgári mobilapp NY-T1 push-átviteli minta input-kontraktja a manager-oldalon megsérül.
- **Javaslat.** Kanonikus organism-bővítés: `ContentEditor` `kind="news"`-feltételesen jelölőnégyzet a `Tartalom` mező után + új `value.pushOnPublish: boolean` mező. Új mock-state-megfontolás: a 4 állapotból a `StateNew` és `StateDraft` `pushOnPublish=true` mintán.
- **Döntés-státusz.** `accepted-pending-organism-extension` — **kritikus pilot-prioritás**.

### SF-63 — `Archived` állapot UI-tükre teljes hiánya mind a 6 screenen + `PublishStateChip` 2-állapotos vs spec 3-állapotos **(KRITIKUS — cross-batch)**
- **Forrás.** A10 lista `TABS=[Mind, Publikált, Vázlat]` — Archived tab nincs; A11 lista `TABS=[Közelgő, Lezajlott, Vázlat, Mind]` (a `Lezajlott` `when='past'` derived, NEM `Archived`); A12 lista nincs status-tab. `publish-state-chip.jsx` + `_styles.css:4373-4389` csak `--draft` és `--published` CSS-modifier-pár (NEM `--archived`). `ORGANISMS.md:377` explicit *"2-állapotos publikálási státusz-chip"*. A 6 szerkesztő-mockból egyik sem `StateArchived`.
- **Spec.** `00_domain_model` §4.1 + `60_tartalom` §2.9 (SD-70) háromállapotú enum; §4.2.2 kebab-menü Archived-állapot 3-akció-szettje; §4.5.1 i18n `content.common.status.Archived`; AC-T3 + AC-T4 + AC-A1 (archive-checkbox a szűrőben).
- **Hatás.** T3 + T4 átmenetek + AC-A1 archive-checkbox-szűrés + 3-állapotos PublishStateChip mind elérhetetlen. 4 acceptance criterion UI-tesztelhetetlen.
- **Javaslat.** **(a)** `PublishStateChip` 3-állapotos-bővítés: új `.mgr-pub-chip--archived { background: var(--u-slate-100); color: var(--u-slate-700); }` + dot `var(--u-slate-500)`. (b) A 3 lista `TabFilter`-eibe `archived` opcionális tab vagy `FilterPillBar`-ba "Archív megjelenítése" checkbox a `60_tartalom` §4.5.1 i18n `content.common.filter.showArchived`-ról. (c) Legalább 1 új `StateArchived` szerkesztő-artboard (preferáltan A10 vagy A12).
- **Döntés-státusz.** `accepted-pending-organism-extension` — **kritikus, cross-cutting az SF-64 + SF-89-cel**.

### SF-64 — Kebab + Publikálás-dropdown UI sehol nem renderelt → 4 állapot-átmenetből 3 elérhetetlen **(KRITIKUS — cross-batch)**
- **Forrás.** A10/A11/A12 lista `DataTable.columns` egyik sem hordoz `actions`-oszlopot; `IconKebab`-trigger sehol nem renderelt; a `onRowClick` no-op a szerkesztőre-vetítéshez. `content-editor.jsx:128-148` publish-bar **3 egyszerű gombot** (D-17 sorrend) — a Publikálás-gomb NEM dropdown, és sem "Archiválás", sem "Visszavonás vázlatba", sem "Újrapublikálás" akciók a szerkesztőből elérhetők.
- **Spec.** `60_tartalom` §4.2.1 `TableStateConfig.rowActions` 6 akciója (`edit/publish/unpublish/archive/republish/delete`) `visible(row)` predikátummal; §4.2.2 kebab-menü 3 állapot-érzékeny akció-szett; §4.2.6 *"Publikálás ▾" dropdown*: Draft "Publikálás" / Published "Archiválás" + "Visszavonás vázlatba" / Archived "Újrapublikálás". AC-A2 + AC-T1-T6.
- **Hatás.** T2/T3/T4 funkcionálisan blokkolt UI-szinten; a tartalomkezelő egy publikált hírt sem tud archiválni; AC-A2 + AC-T1-T6 6 acceptance UI-tesztelhetetlen.
- **Javaslat.** **(a)** A10/A11/A12 lista `DataTable.columns`-ra `actions`-oszlop `IconKebab`-triggerrel; kebab-popover állapot-érzékeny akció-szettjét a §4.2.2 spec-szerződés szerint. **(b)** `ContentEditor.publish-bar` Publikálás-gombját dropdown-affordanciára bővíteni: `state="published"`-on "Archiválás" + "Visszavonás vázlatba" + "Publikálás frissítése" sub-action-ekkel, `state="archived"`-on "Újrapublikálás" gombbal felülírva a Vázlat-mentés-Publikálás párt.
- **Döntés-státusz.** `accepted-pending-organism-extension` — **kritikus, kettős javaslat (lista-kebab + szerkesztő-publish-dropdown)**.

### SF-65 — A10 lista default-rendezés `publishedAt desc` ≠ spec `createdAt desc`
- **Forrás.** A10 lista `StateAll` `<DataTable sortKey="publishedAt" sortDir="desc">` — a `Draft`-rekordok `publishedAt=null` értékükkel a lista végén csoportosulnak.
- **Spec.** `60_tartalom` §3.2.2 *"Rendezés: `createdAt` (default desc), `publishedAt`, `title`, `updatedAt`"* + §4.2.1 `defaultSort: { field: 'createdAt', direction: 'desc' }`.
- **Javaslat.** Mock-korrekció: `sortKey="createdAt" sortDir="desc"` + a mock-adat `createdAt`-mező kiegészítésével.
- **Döntés-státusz.** `accepted-pending-mock-update`.

### SF-66 — Bulk-akciók (bulkPublish/bulkArchive/bulkDelete) UI-tükre nincs (cross-batch)
- **Forrás.** A10/A11 lista `DataTable` selectable-affordancia nincs; bulk-actionbar nincs; vegyes-batch-megerősítő-dialógus mock nincs.
- **Spec.** `60_tartalom` §4.2.1 `bulkActions = [bulkPublish, bulkArchive, bulkDelete]` + §4.2.3 vegyes-batch megerősítő-dialógus + AC-A3 + AC-D2 atomicitás + i18n `bulk_published_blocked`.
- **Javaslat.** HANDOFF.md átadási megjegyzés + opcionális mock-bővítés (pilot-volumenen — néhány tucat tétel — alacsony használati frekvencia).
- **Döntés-státusz.** `under-review` — **közepes prioritás, mock-szint-eldöntés**.

### SF-67 — RichTextEditor char-counter `xxxx / 10000` hiányzik (cross-batch A10+A11)
- **Forrás.** `rich-text-editor.jsx` `maxLength`-prop nincs, char-count-display nincs; `ContentEditor` `mgr-ce-field__hint` *"Bold, italic, underline, lista, link..."* literal-hint a char-count helyett.
- **Spec.** `60_tartalom` §4.2.5 *"Karakterszámláló: a szerkesztő alatt, '1247 / 10000'; 10 001-nél piros, Mentés letiltott."* + §4.6 + AC-A6.
- **Javaslat.** Organism-bővítés: `RichTextEditor.maxLength=10000` prop + `charCount`-counter; `value.length>10000`-nél piros + `ContentEditor.publish-bar` Publikálás+Vázlat-mentés disable.
- **Döntés-státusz.** `accepted-pending-organism-extension`.

### SF-68 — `ContentEditor` Audit szekció ("Létrehozta / Módosította") hiányzik (cross-batch)
- **Forrás.** `ContentEditor` mind a 3 tartalom-típuson nem rendereli a `createdByName/createdAt/updatedByName/updatedAt`-blokkot. A `lastSavedLabel="utoljára mentve 14:32"` mgr-editor__col-header-utalás-szöveg ≠ §4.2.4 ASCII-szerinti audit-két-soros blokk.
- **Spec.** `60_tartalom` §4.2.4 ASCII-mock explicit: *"Audit / Létrehozta: Gergő Kondor — 2026.05.18 14:32 / Módosította: Gergő Kondor — 2026.05.20 09:15"*.
- **Javaslat.** `ContentEditor.value.audit = { createdByName, createdAt, updatedByName, updatedAt }` mezőcsoport; publish-bar fölött divider + kétsoros megjelenítéssel.
- **Döntés-státusz.** `accepted-pending-organism-extension`.

### SF-69 — `CoverImageUploader` "új tételen letiltott az első mentésig" UI-szabály hiányzik
- **Forrás.** A10 szerkesztő StateNew `CoverImageUploader` aktívan rendereletetett; "Először mentsd el a hírt" hint sehol.
- **Spec.** `60_tartalom` §4.2.5 + AC-A5: *"új hír űrlapján a feltöltő-gomb le van tiltva az első mentésig; mentés után aktiválódik"*.
- **Javaslat.** Organism-bővítés: `CoverImageUploader.disabled` prop + `ContentEditor` `disabled={!value.id}` ekvivalens.
- **Döntés-státusz.** `accepted-pending-organism-extension` — alacsony prioritás.

### SF-70 — `ContentEditor.Cím *` `maxLength={120}` ≠ spec `max 200`
- **Forrás.** `content-editor.jsx:91` `<input maxLength={120}>` + hint *"Max 120 karakter"*.
- **Spec.** `00_domain_model` §4.2 + `60_tartalom` §4.2.5 + §3.2.4 FluentValidation `MaximumLength(200)`.
- **Javaslat.** Organism-konstans-frissítés: `maxLength={200}` + hint *"A polgári app csempéjén megjelenik. Max 200 karakter."*.
- **Döntés-státusz.** `accepted-pending-mock-update`.

### SF-71 — A10 lista `Szerző` oszlop alapból látható ≠ spec `createdByName visible: false`
- **Forrás.** A10 lista `columns[4] 'Szerző'` `defaultSortDir: 'asc'`, alapból látható.
- **Spec.** `60_tartalom` §4.2.1 `columns[5] 'createdByName'` `visible: false`.
- **Javaslat.** **Spec-szelídítés vagy mock-korrekció** — a `Szerző`-oszlop alapból-látható szelídítés indokolható (pilot kis-tenanton 1-2 tartalomkezelő, a "ki írta?" gyakori info).
- **Döntés-státusz.** `under-review` — **spec-csapat döntsön**.

### SF-72 — A10 lista `Borítókép`-filter-pill ≠ spec `pushOnPublish`-szűrő
- **Forrás.** A10 lista `FilterPillBar.filters[1] = {key:'cover', label:'Borítókép', value:'Bármi'}`.
- **Spec.** `60_tartalom` §3.2.2 szűrők: `contentStatus`, `pushOnPublish`, `publishedAt`, `createdAt`, `title.contains` — **`coverImageRef`-szűrő nem szerepel**.
- **Javaslat.** Mock-korrekció: `Borítókép`-pill törlése; helyette `Push`-pill (`{key:'push', label:'Push', value:'Bármi'}`).
- **Döntés-státusz.** `accepted-pending-mock-update`.

### SF-73 — Emoji-cluster a Tartalom-ágban (DS-guide-megsértés) — A10 📰🖼️ + A11 🎉 + A12 🔗🌐
- **Forrás.** A10 lista empty-state `📰` (60×60 kék-tinted) + thumbnail-cell `🖼️` (minden cover-os soron); A11 lista empty-state `🎉` + thumbnail-cell `🎉`; A12 lista empty-state `🔗` + per-row `🌐` favicon-glyph; A11 szerkesztő `CitizenPreview.ct-preview__when-icon` `📅` + `ct-preview__where` `📍`; A12 szerkesztő `CitizenPreview.ct-preview__cityinfo-link` `🌐` + `→` arrow.
- **Spec / DS.** DS guide *"No emoji in product UI"* — két kivétel (report-category + home-greeting wave 👋), egyik sem érintett. Lucide-stroke `newspaper`/`party-popper`/`link`/`globe`/`calendar`/`map-pin` ekvivalensek.
- **Javaslat.** Mock-korrekció: minden emoji-glyph Lucide-stroke-cseréje; thumbnail-emoji `<img src={row.coverImageUrl}>` placeholder-mintán (16:9 aspect-tel).
- **Döntés-státusz.** `accepted-pending-mock-update` — közepes-alacsony prioritás (mock-szintű, HANDOFF.md fejlesztőnek-átadáskor félreérthető).

### SF-74 — A10 szerkesztő `CitizenPreview` literal-szöveg + tenant-fasor-hardcoding HANDOFF
- **Forrás.** `ct-preview__date`: `{isPublished ? (publishedAt || '2026.05.22') : 'Még nincs publikálva'} · Balatonalmádi Városgondnokság`.
- **Spec.** `60_tartalom` §5 polgári-app adatigény-szerződés DTO-szintű; literal-szövegek a polgári-adatigény-spec hatáskörében (NY-T5).
- **Javaslat.** HANDOFF.md átadási megjegyzés: a preview-renderer host-felelősség, a polgári adatigény-spec véglegesíti az i18n-szövegeket.
- **Döntés-státusz.** `under-review` — alacsony prioritás.

### SF-75 — A10 szerkesztő StateValidationError "Borítókép kötelező a publikáláshoz" literal — **spec-szelídítés-jelölt**
- **Forrás.** `fieldErrors.coverImage = "Borítókép kötelező a publikáláshoz"`.
- **Spec.** `00_domain_model` §4.2 `coverImageRef: O` (opcionális); §3.2.5 PUT nem-szerkeszthető-listán, de **nincs explicit "kötelező a publikáláshoz" szabály**.
- **Javaslat.** **(a) Spec-szelídítés-jelölt:** a `60_tartalom` §4.2.5 mezősablon-bővítése — `coverImageRef` opcionális, **DE** publikáláshoz erősen javasolt (publikálás-előtti warning). A polgári app csempéjének vizuális egységessége indokolja. **(b) Mock-narratív megjegyzés:** a banner-literal mock-szintű, az Angular-port i18n-keys-eken.
- **Döntés-státusz.** `under-review` — **spec-csapat döntsön** a (a)-ról.

### SF-76 — "Eldobás" vs spec "Visszavonás" publish-bar gomb-felirat
- **Forrás.** `content-editor.jsx:130` `<button>Eldobás</button>` (D-17 publish-bar bal-szélen).
- **Spec.** `60_tartalom` §4.2.4 ASCII-mock: `[Visszavonás] [Mentés] [Publikálás ▾]`.
- **Javaslat.** **Spec-szelídítés:** "Eldobás" megerősítése a spec-be, hogy elkerüljük a `content.action.unpublish = "Visszavonás vázlatba"` action-szóval való kétértelmű használatot. Alternatíva: mock-korrekció "Visszavonás"-ra.
- **Döntés-státusz.** `under-review` — **spec-csapat döntsön** (spec-szelídítés preferált — kétértelműség-elkerülés).

### SF-77 — `ContentEditor` `mgr-editor__col-header` "Szerkesztő" oszlop-cím — organism-belső-konstans
- **Forrás.** `content-editor.jsx:63` `<span className="mgr-editor__col-title">Szerkesztő</span>` (split-view bal-oszlop-cím).
- **Spec.** Sehol nem rögzített.
- **Javaslat.** HANDOFF.md átadási megjegyzés: a oszlop-cím a `ContentEditor` belső organism-konstansa — Angular-i18n-kulcsra cserélendő (`organism.contentEditor.column.editor`).
- **Döntés-státusz.** `under-review` — alacsony prioritás.

### SF-78 — `CitizenPreview` device-frame stílus (telefon-keret + notch + body) — host-szintű UI-találmány
- **Forrás.** A10 + A11 + A12 szerkesztő `CitizenPreview.ct-preview__device` (border 8px #1f2937 + radius 22 + notch 22px + mono `9:41` + `●●● 📶 🔋` rendszer-ikonok).
- **Spec / D-X.** D-13 C-4 `previewSlot` slot-szerződést rögzíti; a render-stílust (telefon-keret-mintát) sehol nem.
- **Javaslat.** HANDOFF.md átadási megjegyzés: device-frame minta starter-projekt-konvenció (a 3 szerkesztő-screen közös `CitizenPreview`-mintáját a Phase 3 starter-projekt sablonosíthatja).
- **Döntés-státusz.** `under-review` — alacsony prioritás (host-szintű mock-stílus).

### Batch 2 — A11 Programok

### SF-79 — `Event.latitude` + `longitude` páros + "Térkép megnyitása" link TELJES hiánya **(KRITIKUS — pilot-blokkoló)**
- **Forrás.** `a11-programok-szerkeszto.html` `EventExtraFields` csak `DateTimeRangePicker` + `Helyszín` (locationText). `value`-szerződésen `{startAt, endAt, location}` — koordináta-mezők, "Térkép megnyitása"-link sehol.
- **Spec.** `00_domain_model` §4.3 + `60_tartalom` §4.3.2 + i18n `content.event.field.latitude/longitude/openMap` + AC-E1.5-1.9 5 acceptance criterion (páros + tartomány-validáció).
- **Hatás.** 5 acceptance UI-tükre megsemmisül; polgári térkép-megjelenítés (`screen_kezdooldal_*`) input-kontraktja megsérül.
- **Javaslat.** Host-komponens-bővítés: `EventExtraFields`-be `latitude` + `longitude` szám-input-páros (`type="number" step="any"`) + alatta szöveges link *"Megnyitás térképen"* `https://www.google.com/maps/?q={lat},{lng}` URL-mintán. Új `value.latitude/longitude` mezők. Új mock-state opcionálisan.
- **Döntés-státusz.** `accepted-pending-organism-extension` — **kritikus pilot-prioritás**.

### SF-80 — `locationText` `maxLength={120}` ≠ spec `300` + label `*` kötelezőként-jelölés ≠ spec opcionális
- **Forrás.** `EventExtraFields` `<input maxLength={120}>` + `<label>Helyszín <span className="mgr-ce-field__label-req">*</span></label>` + StateValidationError `fieldErrors.location = "Helyszín kötelező"`.
- **Spec.** `60_tartalom` §3.3.3 + §4.3.2: *"locationText: opcionális, max 300"*.
- **Javaslat.** Mock + host-komponens-korrekció: `maxLength={300}`, label `*` jelölés eltávolítása, StateValidationError `fieldErrors.location` mock-érték másra.
- **Döntés-státusz.** `accepted-pending-mock-update`.

### SF-81 — `content.event.confirm.pastDate` figyelmeztetés-dialógus nincs implementálva
- **Forrás.** `DateTimeRangePicker` past-date-validáció nincs; `EventExtraFields` nem renderel `<ConfirmDialog kind="warning">`; egyetlen artboard sem demonstrál past-date state-et.
- **Spec.** `60_tartalom` §4.3.2 mezősablon `startsAt`: figyelmeztetés *"A megadott időpont a múltban van. Folytatás?"* + §4.5.3 i18n `content.event.confirm.pastDate`.
- **Javaslat.** Host-komponens + új mock-state: `EventExtraFields` past-date-detektort + `ContentEditor.onPublish` előtti `ConfirmDialog kind="warning"`-hook. Új 5. artboard `StatePastDateWarning` opcionálisan.
- **Döntés-státusz.** `accepted-pending-organism-extension` — közepes prioritás.

### SF-82 — A11 lista `endsAt` + `locationText` rejtett-oszlop-aktiválhatóság — **spec-szelídítés-jelölt: cellType-bővítés**
- **Forrás.** A11 lista `columns` 5 oszlop (`cover/title/startAt/state/publishedAt`); `endsAt`+`locationText` mint külön-aktiválható oszlopok nincsenek (kombinálva a `TitleCell.__loc` + `TimeCell.__time` sub-cellákba).
- **Spec.** §4.3.1 lista-szerződés `endsAt` (`visible: false`), `locationText` (`visible: false`).
- **Javaslat.** **Spec-szelídítés:** a `TableStateConfig.columns`-ban `locationText`-cell `title`-oszlopba olvasztva (`cellType: 'titleWithLocation'`), `endsAt`-cell `startsAt`-oszlopba (`cellType: 'dateRange'`). A kombinált-cella UX-szempontból jobb.
- **Döntés-státusz.** `under-review` — **spec-csapat döntsön**.

### SF-83 — A11 lista `TimeCell` `today`/`soon`/`future`/`past` színkód + derived `when`-mező — UI-találmány
- **Forrás.** `TimeCell.a11-time-cell--today` (amber), `--soon` (primary blue), `--past` (opacity 0.55); `row.when` derived mock-mező `'soon'`/`'today'`/`'future'`/`'past'`.
- **Spec.** `Event` entitáson `when` mező nincs; a startsAt-szín-emelés nem említve. **Amber DS-token `--u-amber-700` az `--u-status-folyamatban-*`-státusszal szemantikai-overload kockázat.**
- **Javaslat.** **Spec-szelídítés:** új `cellType: 'eventTimeWithProximity'` cellrenderer a §4.3.1 lista-szerződésbe; az amber-tónus cseréje pl. `--u-blue-100`-ra a `today`-státuszon a szemantikai-overload elkerülésére.
- **Döntés-státusz.** `under-review` — közepes prioritás.

### SF-84 — A11 lista 4-tab `Közelgő/Lezajlott/Vázlat/Mind` — `Lezajlott` derived (`when='past'`), NEM `contentStatus`
- **Forrás.** A11 lista `TABS` szétválasztja a `Lezajlott`-ot (`when='past'`) — idő-derivált, **NEM** contentStatus-derivált — ortogonálisan a `Vázlat` (state-derived) tab-tól.
- **Spec.** §4.3.1 `contentStatus`-szűrő multiselect; `Közelgő/Lezajlott` szétválasztás nincs említve.
- **Javaslat.** Két lehetőség: **(a) Mock-korrekció:** `Közelgő/Lezajlott` mint `startsAt`-szűrő-pill a `FilterPillBar`-ba; `TabFilter` `[Mind/Publikált/Vázlat]` A10-konzisztens. **(b) Spec-szelídítés:** explicit megerősítés a §4.3.1-ben, hogy a `Közelgő/Lezajlott` derived-szűrő-tab.
- **Döntés-státusz.** `under-review` — **spec-csapat döntsön**.

### SF-85 — A11 lista `Mind`-tabon `a11-row--dim` halványítás a `Lezajlott`-sorokra — D-13 cross-screen pattern fork
- **Forrás.** `StateAll` `<DataTable rowClassName={dimPast}>` `dimPast = row => row.when === 'past' ? 'a11-row--dim' : ''`.
- **Spec / D-X.** D-13 generikus `rowClassName`-prop felszabadítja a halványítást; a tartalom-ágra-fork (`Lezajlott` ≠ `Lezárt/Elutasítva` Bejelentés-ági pattern) nem explicit-fedett.
- **Javaslat.** HANDOFF.md átadási megjegyzés: `rowClassName=dimPast` cross-screen pattern A1↔A11 ekvivalens — a D-13 generikus szerződésen belüli host-szintű fork.
- **Döntés-státusz.** `under-review` — alacsony prioritás.

### Batch 3 — A12 Városi információk

### SF-86 — `CityInfo.description` TÍPUS-QUAD-KONFLIKTUS: RichTextEditor HTML 10000 ≠ plain-text textarea 500 **(KRITIKUS — pilot-blokkoló)**
- **Forrás.** `a12-cityinfo-szerkeszto.html` `ContentEditor kind="cityinfo"` `Tartalom *` mezőre `RichTextEditor` (HTML, 10 000 char, SD-69 whitelist); `value.body` mezőnév; `*` kötelezőként-jelölve; StateUrlValid mock `body: '<p>24 órás sürgősségi szolgálat...</p>'` HTML-tartalommal.
- **Spec.** `00_domain_model` §4.4 + `60_tartalom` §3.4.2 + §4.4.2: *"description: opcionális, plain text, max 500"*; FluentValidation `MaximumLength(500)`.
- **Hatás (négyszeres konfliktus).** (a) mezőnév `body` ≠ spec `description` (DTO-szerződés-konfliktus az Angular-porton); (b) mezőtípus rich-text HTML + max 10 000 ≠ plain-text textarea + max 500 (FluentValidation-konfliktus, AC-C1); (c) `*` kötelezőként ≠ opcionális; (d) HTML-tartalom a szerver-oldalon plain-text-ként mentődne (vagy `field_not_editable`-szel elutasítódna).
- **Javaslat.** Kanonikus organism-bővítés + mock-korrekció: `ContentEditor.kind="cityinfo"` NE rendereljen `RichTextEditor`-t, hanem `<textarea>` plain-text (`mgr-ce-field__textarea`); mezőnév `value.description` (NEM `body`); label `Rövid leírás` (NEM `Tartalom *`); `*` jelölés eltávolítása; `maxLength={500}` + char-counter. Mock-on `description: 'A városi képviselő-testület jegyzőkönyvei...'` plain-text formátum.
- **Döntés-státusz.** `accepted-pending-organism-extension` — **kritikus pilot-prioritás**.

### SF-87 — `CityInfo.iconRef` IconPicker-mező a szerkesztőn teljes hiánya **(KRITIKUS — pilot-blokkoló)**
- **Forrás.** A12 szerkesztő `CityinfoExtraFields` csak `LinkValidator` URL-mezőt renderel; `iconRef` IconPicker-affordancia teljesen hiányzik; `value` szerződés `iconRef` mezőt sem hordoz.
- **Spec.** `00_domain_model` §4.4 + `60_tartalom` §2.7 (közös ikonkészlet) + §3.4.2 (whitelist max 50) + §4.4.2 mezősablon (ikon-választó) + polgári `screen_varosi_informaciok_lista` ikonos listát vár (§5.1).
- **Hatás.** Polgári ikonos lista input-kontrakt teljesen hiányzik; AC-C1 `iconRef`-whitelist UI-tesztelhetetlen; `60_tartalom` §2.7 közös ikonkészlet elve sérül.
- **Javaslat.** Host-komponens-bővítés: `CityinfoExtraFields`-be `iconRef` mező IconPicker-szerű button-popoverrel (A6 D-8 C-2A mintán) a közös `iconCatalog`-glyph-szettből. Új mock-state IconPicker-nyitva.
- **Döntés-státusz.** `accepted-pending-organism-extension` — **kritikus pilot-prioritás**.

### SF-88 — `CityInfo.groupLabel` autocomplete-mező + `/v1/city-info-groups` lookup fogyasztó-felület teljes hiánya **(KRITIKUS — pilot-blokkoló)**
- **Forrás.** A12 szerkesztő `CityinfoExtraFields` csak `LinkValidator`-t renderel; `groupLabel` autocomplete-input teljes hiánya; `value` szerződés `groupLabel` mezőt sem hordoz.
- **Spec.** `00_domain_model` §4.4 + `60_tartalom` §2.5 (SD-71 szabad-szöveg max 100) + §3.4.6 (`GET /v1/city-info-groups` distinct-lookup) + §4.4.2 mezősablon (autocomplete) + §4.5.4 i18n `content.cityInfo.field.groupLabel.placeholder = "Pl. Strandok, Hivatalok"`; AC-C2 3 acceptance; polgári lista-szekcionálás (§5.3.3).
- **Hatás.** Polgári lista-szekcionálás (`Strandok`/`Hivatalok`) input-kontrakt megsemmisül; AC-C2 3 acceptance UI-tesztelhetetlen; `/v1/city-info-groups` distinct-lookup-végpontnak nincs fogyasztója.
- **Javaslat.** Host-komponens-bővítés: `CityinfoExtraFields`-be `groupLabel` autocomplete-input (PrimeNG `p-autocomplete`-ekvivalens; host-felelős a `GET /v1/city-info-groups`-hívásért) + spec-konform placeholder. Új mock-state autocomplete-suggestion-list nyitva (4-5 distinct érték).
- **Döntés-státusz.** `accepted-pending-organism-extension` — **kritikus pilot-prioritás**.

### SF-89 — A12 lista `PublishStateChip` per-row + `contentStatus`-szűrő teljes hiánya **(KRITIKUS — cross-cutting SF-63 + SF-64-gyel)**
- **Forrás.** A12 lista `InfoRow` nem rendereli a `PublishStateChip`-et; nincs `Állapot` oszlop; screen-header literal-szöveg explicit *"nincs publish-state-chip (minden info él)"*; mock-data `CITY_INFOS[*]` nem hordoz `contentStatus` mezőt, csak `state: 'valid' | 'unreachable'` (LinkValidator-state, ortogonális dimenzió).
- **Spec.** `00_domain_model` §4.1 + §4.4: `CityInfo` ugyanazt a `ContentStatus`-enumot örökli (Draft/Published/Archived); §4.4.1 cross-reference a §4.2.1 News-konfigurációra (Status-multiselect-szűrő + Archive-toggle).
- **Hatás.** A vezető **nem tudja vázlatba helyezni / archiválni** a cityinfo-t; T1-T4 átmenetek elérhetetlenek; `60_tartalom` §4.5.1 common-i18n `content.common.status.*` UI-tükre A12-en megsemmisül; T-25 transition-végpont elérhetetlen.
- **Javaslat.** A12 lista `InfoRow`-on `PublishStateChip` per-row + `FilterPillBar`-ba státusz-szűrő (vagy `TabFilter` az A10/A11-mintán). A "minden info él" screen-pozíció **téves spec-értelmezés** — visszavonandó.
- **Döntés-státusz.** `accepted-pending-organism-extension` — **kritikus pilot-prioritás, cross-cutting az SF-63 + SF-64 összevont csomaggal**.

### SF-90 — A12 lista `iconRef` + `groupLabel` oszlopok + `groupLabel`-szűrő (loadOptionsFrom) hiány
- **Forrás.** A12 lista `InfoRow` 6 cellát renderel (`grip/title+desc/url+host/linkValidator-state/updatedAt/chev`); `iconRef` és `groupLabel` cella mind hiányzik; `FilterPillBar.filters` csak `[{Állapot: 'Bármi'}]`-t hordoz.
- **Spec.** `60_tartalom` §4.4.1 *"Új oszlopok: `iconRef` (ikon-cell), `groupLabel` (szűrő: `loadOptionsFrom: '/v1/city-info-groups'`), `url` (rejtett), `sortOrder` (rejtett)"*.
- **Javaslat.** Mock-bővítés + cell-layout-redesign + Tier-2 `FilterPillBar` `loadOptionsFrom`-prop-bővítés: `InfoRow.cellLayout`-ba `iconRef` (24px ikon-cella) + `groupLabel` (chip-cella); `FilterPillBar.filters` bővítés `{key:'group', label:'Csoport', loadOptionsFrom:'/v1/city-info-groups'}`.
- **Döntés-státusz.** `accepted-pending-organism-extension` — közepes prioritás.

### SF-91 — A12 szerkesztő `url` mező után "Megnyitás új lapon" link nincs
- **Forrás.** `LinkValidator.state='valid'` esetén `<button>↻</button>` retry-button — NEM "Megnyitás új lapon" link.
- **Spec.** `60_tartalom` §4.4.2 mezősablon: *"az érték érvényessége után 'Megnyitás új lapon' link"* + i18n `content.cityInfo.field.url.openInNewTab`.
- **Javaslat.** Organism-bővítés: `LinkValidator.state='valid'`-on `<a target="_blank" rel="noopener noreferrer">Megnyitás új lapon ↗</a>` link a retry-button mellett.
- **Döntés-státusz.** `accepted-pending-organism-extension` — alacsony prioritás.

### SF-92 — A12 lista per-row `LinkValidator`-state badge **(KRITIKUS UI-TALÁLMÁNY — spec-szelídítés-vagy-törlés)**
- **Forrás.** `a12-cityinfo-lista.html` `InfoRow.STATE_BADGE` dot+label (`elérhető` / `nem elérhető` / `érvénytelen URL` / `ellenőrzés…`) minden soron; mock-data `CITY_INFOS[*].state` `'valid' 7× / 'unreachable' 1×`.
- **Spec / D-X.** `60_tartalom` §4.4.1 oszlop-szerződés a per-row LinkValidator-state-et **nem említi**. `LinkValidator` organism (ORGANISMS.md) **szerkesztő-on-blur-hez** rögzítve — NEM lista-rendererhez. **`s15-*-explorer.html` fájl NEM létezik** a `preview/screens/`-en (csak `s13-` és `s6_5-` van) — a lista-szintű badge sehol nem dokumentált. **Az on-blur szerkesztő-state-szett (D-13 / ORGANISMS.md) 🟡, a per-row lista-rendererelés 🔍.**
- **Hatás.** Funkcionálisan értékes (a vezető láthatja a halott linkeket), DE **háttér-job-feltevés**t implikál (periodikus URL-érvényesség-ellenőrző job + `lastCheckedAt`+`lastCheckedState` mezők), ami a spec-ben sehol nem szerepel. A `STATE_BADGE` ortogonális a `contentStatus`-szal — kétdimenziós állapot UI-on összemosódhat.
- **Javaslat.** Két lehetőség: **(a) Spec-szelídítés (új SD-X + új NY-T):** *"A12 lista per-row LinkValidator-state badge"* — feltételezve egy óránkénti/napi háttér-job-ot, ami a `CityInfo.url`-ek elérhetőségét frissíti egy `lastCheckedAt`+`lastCheckedState` mezőn. A `60_tartalom` §3.4.* új végpontot + új mező-párt + új AC-X-et bocsát ki. Új NY-T: *"A12 URL-érvényesség-háttér-job — pilotra kell-e?"*. **(b) Törlés:** A per-row badge mock-szinten törlendő; a `LinkValidator` szerkesztő-on-blur-fogyasztása megmarad.
- **Döntés-státusz.** `under-review` — **kritikus spec-csapat-döntés: megerősítés-vagy-törlés**.

### SF-93 — A12 lista `row.host` derived-cell + `row.updatedAt` mock-mező
- **Forrás.** `InfoRow.a12-row__url-host {item.host}` + `a12-row__date {item.updatedAt}`.
- **Spec.** §4.4.1 oszlop-szerződés `url` (`visible: false` alapból); host-derived cella mint kanonikus oszlop nem említve.
- **Javaslat.** **Spec-szelídítés-jelölt** (host-derived cella `cellType: 'urlHost'` mint §4.4.1 oszlop-bővítés) vagy mock-korrekció.
- **Döntés-státusz.** `under-review` — alacsony prioritás.

### SF-94 — A12 lista NEM `DataTable`-t fogyaszt — host-szintű inline `InfoRow` (drag-aware) — `DataTable.onReorder` bővítés-jelölt
- **Forrás.** A12 lista `<div className="a12-list">{CITY_INFOS.map(item => <InfoRow ...>)}</div>` — host-szintű inline lista-renderer; A6 `CategoryTreeEditor` precedens (drag-aware lista-szerű komponens a `DataTable` helyett).
- **Spec / D-X.** `DataTable` Tier-2 organism nem hordoz `onReorder` API-t; spec §4.4 implicit DataTable-szerződést ír (§4.2.1 cross-reference), de a drag-and-drop reorder a kanonikus `DataTable`-vel nem fedhető le.
- **Javaslat.** HANDOFF.md átadási megjegyzés + `DataTable` Tier-2 organism bővítés-jelölt (`onReorder`-prop + reorder-mode), ha 2+ host-screen ezt fogyasztja (A6 + A12 minimum kettő).
- **Döntés-státusz.** `under-review` — közepes prioritás organism-bővítés.

### SF-95 — A12 lista empty-state literal-szöveg ≠ spec `content.empty.cityInfo.title`
- **Forrás.** `.a12-empty__title "Még nincs egyetlen hasznos link sem."` + `.a12-empty__desc "Kezdj a városi kórház, polgármesteri hivatal és háziorvos elérhetőségével."`
- **Spec.** §4.5.6 `content.empty.cityInfo.title = "Még nincs városi információ."` + `description = "Adj hozzá hasznos linkeket a polgárok számára."` + `action = "Új városi információ"`.
- **Javaslat.** Mock-korrekció vagy spec-szelídítés (a "hasznos linkek" megfogalmazás jobban tükrözi a tartalomkezelő-szándékot).
- **Döntés-státusz.** `under-review` — alacsony prioritás.

---

## Phase 2D — záró összegzés (`SPEC-COVERAGE-A10A11A12.md`-vel konszolidálva)

**A teljes Phase 2D 3-batch + cross-cutting lezárva (A10+A11+A12).** A számok és kategorizálás a `SPEC-COVERAGE-A10A11A12.md` ági záró-szakaszán; itt csak az SF-szám-summary:

| Kategória | SF-szám | Tételek |
|---|---|---|
| **Kritikus pilot-blokkoló** (P0 — HANDOFF.md fix-tétel) | 8 | SF-62 (pushOnPublish), SF-63 (Archived cross-cutting), SF-64 (kebab+dropdown), SF-79 (Event koord+map), SF-86 (CityInfo.description quad-konfliktus), SF-87 (iconRef hiány), SF-88 (groupLabel hiány), SF-89 (A12 PublishStateChip+szűrő) + SF-92 (per-row LinkValidator-badge — spec-csapat-döntés) |
| **Spec-bővítés vagy spec-szelídítés** (spec-csapat-döntés) | 8 | SF-71 (Szerző oszlop visible), SF-75 (cover-kötelező publikáláshoz), SF-76 ("Eldobás" megerősítés), SF-82 (cellType titleWithLocation+dateRange), SF-83 (TimeCell színkód), SF-84 (Lezajlott tab-derived), SF-92 (LinkValidator-badge háttér-job), SF-93 (urlHost cellType) |
| **Mock-state-pótlás** (új artboardok) | 4 | SF-66 (bulk-actions), SF-69 (cover-disabled), SF-81 (pastDate-warning), SF-95 (empty-state copy) |
| **Mock-korrekció / organism-bővítés** | 14 | SF-65, SF-67, SF-68, SF-70, SF-72, SF-73, SF-74, SF-77, SF-78, SF-80, SF-85, SF-90, SF-91, SF-94 |

**Összesen: 34 SF-tétel** (SF-62..SF-95) a Phase 2D-ből.

**Kritikus pilot-prioritás-cluster (P0):**
- **SF-62..SF-64** — Hír-ági és cross-tartalom publish-flow UI-hiány (pushOnPublish + Archived 3-állapot + 4-átmenet kebab+dropdown). A három tétel **funkcionálisan összekapcsolt** — együtt blokkolják a tartalom-publish-pipeline-t.
- **SF-79** — Esemény-koordináta-páros + Térkép-link (polgári térkép-megjelenítés input-kontrakt).
- **SF-86..SF-89** — Cityinfo négyes-hiány: description-quad-konfliktus + iconRef + groupLabel + per-row PublishStateChip. Egy egész cityinfo-szerkesztő-pipeline újragondolása.
- **SF-92** — A12 per-row LinkValidator-badge: spec-csapat-döntés (megerősítés új SD-X + háttér-job-spec, vagy törlés).

**Cross-cutting hatások:**
- **SF-63 + SF-89** — `PublishStateChip` 2-állapotos → 3-állapotos cross-organism-bővítés (Phase 2C SF-X-ekkel nem kapcsolódik; tisztán Phase 2D-belső).
- **SF-67 + SF-68** — RichTextEditor char-counter + ContentEditor Audit szekció: mindkettő A10+A11 cross-batch közös organism-bővítés.
- **SF-73** — Emoji-cluster cross-screen A10+A11+A12 (DS-guide-tone-of-voice).
- **SF-94** — `DataTable.onReorder` Tier-2 bővítés-jelölt — A6 + A12 közös igény.

---

*A Phase 2D ezzel lezárult. A Phase 3 (`HANDOFF.md` + `starter/`) a 4 SPEC-COVERAGE (A1+A2+A3, A4+A5, A6+A7+A8+A9, A10+A11+A12) + 95 SF-tétel teljes konszolidációjával nyílik meg.*
