Files
service-finder/plans/logic_spec_80_gamification_2_0.md
2026-03-22 11:02:05 +00:00

224 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🎮 Logic Spec 80: Gamification 2.0, Verseny és Önvédelmi Rendszer
**Verzió:** 1.0
**Dátum:** 2026-03-15
**Szerző:** Rendszer-Architect
**Kapcsolódó mérföldkő:** [MILESTONE_8_GAMIFICATION_PRO.md](../MILESTONE_8_GAMIFICATION_PRO.md)
## 🎯 Modul célja és Masterbook 2 illeszkedés
### Cél
A Gamification 2.0 modul kiterjeszti a meglévő XP és szintrendszert szezonális versenyekkel, önvédelmi mechanizmusokkal és egy robusztus moderációs keretrendszerrel. A modul biztosítja, hogy a felhasználók által beküldött szervizadatok biztonságosan, ellenőrzött módon kerüljenek a productionba, miközben a spam és rosszindulatú tevékenységeket automatikusan szűri.
### Masterbook 2 illeszkedés
- **Epic 7: Marketplace & API (A Külvilág felé)** A szervizek publikálása és a marketplace minőségbiztosítása.
- **Epic 5: Robot Ecosystem** A service robot pipeline (04) hibáinak kijavítása és kiegészítése.
- **Epic 3: Identity & Social** Felhasználói reputáció, trust score és büntetési rendszer.
## 🗄️ Adatmodell
### 1. Season tábla (`system.seasons`)
Féléves versenyek tárolása. Minden szezonhoz tartozik egy ranglista, amely a szezonban szerzett XP alapján rangsorol.
| Mező | Típus | Leírás |
|------|-------|---------|
| `id` | `INTEGER` (PK) | Egyedi azonosító |
| `name` | `VARCHAR(100)` | Szezon neve (pl. "2026 Tavasz") |
| `start_date` | `DATE` | Szezon kezdete |
| `end_date` | `DATE` | Szezon vége |
| `is_active` | `BOOLEAN` | Aktív szezon? (egyidőben legfeljebb egy lehet) |
| `created_at` | `TIMESTAMPTZ` | Létrehozás időbélyege |
**Indexek:**
- `idx_seasons_active` (`is_active`) WHERE `is_active = TRUE`
- `idx_seasons_dates` (`start_date`, `end_date`)
**Alembic terv:**
```sql
CREATE TABLE system.seasons (
id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
name VARCHAR(100) NOT NULL,
start_date DATE NOT NULL,
end_date DATE NOT NULL,
is_active BOOLEAN DEFAULT FALSE,
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE UNIQUE INDEX idx_seasons_active_unique
ON system.seasons (is_active) WHERE is_active = TRUE;
```
### 2. UserContribution tábla (`gamification.user_contributions`)
Spam védelem: minden felhasználó csak 90 naponként kaphat XPt ugyanazon szerviz (fingerprint) beküldéséért.
| Mező | Típus | Leírás |
|------|-------|---------|
| `id` | `INTEGER` (PK) | Egyedi azonosító |
| `user_id` | `INTEGER` | `identity.users.id` hivatkozás |
| `service_fingerprint` | `VARCHAR(255)` | A beküldött szerviz hashje (MD5) |
| `action_type` | `VARCHAR(30)` | `submit_service`, `claim_business`, `review` |
| `earned_xp` | `INTEGER` | Az adott akcióért kapott XP |
| `cooldown_end` | `TIMESTAMPTZ` | Cooldown vége (90 nap a `submit_service` esetén) |
| `created_at` | `TIMESTAMPTZ` | Létrehozás időbélyege |
**Indexek:**
- `idx_user_contributions_user` (`user_id`, `service_fingerprint`, `action_type`)
- `idx_user_contributions_cooldown` (`cooldown_end`) WHERE `cooldown_end > NOW()`
**Alembic terv:**
```sql
CREATE TABLE gamification.user_contributions (
id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
user_id INTEGER NOT NULL REFERENCES identity.users(id) ON DELETE CASCADE,
service_fingerprint VARCHAR(255) NOT NULL,
action_type VARCHAR(30) NOT NULL,
earned_xp INTEGER NOT NULL DEFAULT 0,
cooldown_end TIMESTAMPTZ NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW()
);
COMMENT ON TABLE gamification.user_contributions IS
'Spam védelem: felhasználók csak 90 naponként kaphatnak XPt ugyanazon szerviz beküldéséért.';
```
### 3. UserStats bővítés (`system.user_stats`)
A meglévő táblához új mezők a restrikciós szintek és büntető kvóták kezeléséhez.
| Mező | Típus | Leírás | Alapérték |
|------|-------|--------|-----------|
| `restriction_level` | `INTEGER` | 0 (normál), -1 (figyelmeztetés), -2 (korlátozott), -3 (banned) | 0 |
| `penalty_quota_remaining` | `INTEGER` | Hátralévő büntető kvóta (pl. 3 strike) | 3 |
| `banned_until` | `TIMESTAMPTZ` | Kitiltás vége (ha restriction_level = -3) | NULL |
**Alembic terv (meglévő tábla módosítása):**
```sql
ALTER TABLE system.user_stats
ADD COLUMN restriction_level INTEGER NOT NULL DEFAULT 0,
ADD COLUMN penalty_quota_remaining INTEGER NOT NULL DEFAULT 3,
ADD COLUMN banned_until TIMESTAMPTZ;
```
### 4. ServiceStaging bővítés (`marketplace.service_staging`)
Hiányzó mezők hozzáadása a teljes adatátvitel érdekében.
| Mező | Típus | Leírás |
|------|-------|---------|
| `contact_phone` | `VARCHAR` | Telefonszám (Robot 4 vagy user által megadható) |
| `website` | `VARCHAR` | Weboldal URL |
| `external_id` | `VARCHAR` | Külső rendszer azonosító (pl. Google Place ID) |
| `contact_email` | `VARCHAR` | Email cím |
**Alembic terv:**
```sql
ALTER TABLE marketplace.service_staging
ADD COLUMN contact_phone VARCHAR,
ADD COLUMN website VARCHAR,
ADD COLUMN external_id VARCHAR,
ADD COLUMN contact_email VARCHAR;
```
### 5. SystemParameter bővítés (`system.system_parameters`)
Dinamikus küszöbértékek a gamification és moderáció számára.
| Kulcs | Érték (JSON) | Leírás |
|-------|--------------|---------|
| `service_promotion_threshold` | `{"trust_score": 50}` | Minimális trust_score a staging → promotionhoz |
| `xp_reward_base` | `{"submit_service": 50, "claim_business": 200}` | Alap XP jutalmak |
| `penalty_multiplier` | `{"level_-1": 0.5, "level_-2": 0.2}` | XP szorzó restrikciós szint szerint |
| `strike_policy` | `{"max_strikes": 3, "cooldown_days": 90}` | Strikeok és cooldown beállítások |
**Megjegyzés:** A meglévő tábla módosítása nem szükséges, csak új rekordok beszúrása.
## 🛡️ Admin kontroll: Global/Country/Region/User szintű változók
A `system.system_parameters` tábla `scope` mezője (`global`, `country`, `region`, `user`) lehetővé teszi a különböző szintű beállításokat. A Gamification 2.0 paraméterei alapértelmezetten `global` scopekal rendelkeznek, de felülírhatók country vagy region szinten (pl. különböző országokban eltérő trust_score küszöb).
**Példa a hierarchiára:**
1. **Global:** `service_promotion_threshold = 50`
2. **Country (HU):** `service_promotion_threshold = 40` (lazább feltételek Magyarországon)
3. **Region (Budapest):** `service_promotion_threshold = 60` (szigorúbb Budapesten)
A prioritás: `user` > `region` > `country` > `global`.
## 🤖 Robot Refactoring Tervek
### 1. Robot 3 (Enricher) Logika finomhangolása
**Jelenlegi állapot:** `enrich_ready``researched` (trust_score növelés).
**Új állapot:** `enrich_ready``auditor_ready` (trust_score növelés, de nem publikál).
**Módosítások:**
- A státusz neve `auditor_ready` legyen, jelezve, hogy az Auditor feldolgozhatja.
- A trust_score számítás változatlan marad.
- A robot továbbra is csak a `service_staging` táblát módosítja.
### 2. Robot 2 (Auditor) Új implementáció
**Fájl:** `service_robot_5_auditor.py` (vagy `service_robot_2_auditor.py`)
**Feladat:** Atom módon feldolgozza az `auditor_ready` státuszú staging bejegyzéseket.
**Lépések:**
1. **Kiválasztás:** `FOR UPDATE SKIP LOCKED` egy `auditor_ready` rekordra.
2. **Küszöb ellenőrzés:** Lekéri a `service_promotion_threshold` értékét a `system_parameters`ből.
3. **Döntés:**
- Ha `trust_score >= küszöb`:
- Organization létrehozása (ha még nem létezik) a `fleet.organizations` táblában.
- ServiceProfile létrehozása a `marketplace.service_profiles` táblában, a staging adatokkal.
- Státusz beállítása `pending_validation` (vagy `active`, ha azonnal publikálható).
- Audit log rögzítése (`audit.service_audit_log`).
- Egyébként:
- Státusz beállítása `needs_moderation`.
- InternalNotification létrehozása a moderátorok számára.
4. **Staging frissítés:** Státusz `audited`, `audited_at` időbélyeg.
**Technikai részletek:**
- Tranzakció használata (minden lépés egy tranzakcióban).
- Hibakezelés: hiba esetén `status = 'error'` és logolás.
- Időzítés: folyamatos feldolgozás (pl. 30 másodperces ciklus).
### 3. Robot 4 (Validator) Integráció
A Validator továbbra is a `service_profiles` táblán dolgozik, de ha a rekord `pending_validation` státuszú, a Validator frissítheti a hiányzó mezőket (contact_phone, website) a Google Places APIból, majd átállítja `active`ra.
## 🔧 SystemParameter integráció
A Gamification 2.0 minden dinamikus értékét a `system.system_parameters` táblából olvassa ki. Ez lehetővé teszi a rendszer finomhangolását anélkül, hogy kódot kellene módosítani.
**Példa lekérdezésre:**
```python
async def get_promotion_threshold(db):
param = await db.scalar(
select(SystemParameter)
.where(SystemParameter.key == 'service_promotion_threshold')
.where(SystemParameter.scope == 'global')
)
if param:
return param.value.get('trust_score', 50)
return 50
```
## 📝 Geologika (Service Finder algoritmus)
A Service Finder alapvetően lokációalapú keresést valósít meg. A Gamification 2.0 nem módosítja a keresési algoritmust, de befolyásolja a találatok minőségét:
1. **Trust Score súlyozás:** Magasabb trust_scoreú szervizek magasabbra kerülnek a találati listában.
2. **Szezonális bónusz:** Aktív szezonban beküldött szervizek extra láthatóságot kaphatnak.
3. **Restrikciók:** `restriction_level < 0` esetén a felhasználó beküldései nem jelennek meg, amíg a korlátozás fennáll.
## 🚀 Migrációs lépések (Alembic)
1. **Új táblák létrehozása:**
- `system.seasons`
- `gamification.user_contributions`
2. **Meglévő táblák bővítése:**
- `system.user_stats` (új mezők)
- `marketplace.service_staging` (hiányzó mezők)
3. **Alapértelmezett paraméterek beszúrása:**
- `service_promotion_threshold`, `xp_reward_base`, `penalty_multiplier`, `strike_policy`
4. **Robot kód frissítése:**
- Robot 3 státusz átnevezése `auditor_ready`re.
- Robot 5 (Auditor) implementálása.
- Robot 4 integrációja a `pending_validation` státusszal.
## ✅ Jóváhagyási pont
Ez a logic specifikáció a Modell Fázis (Foundation) teljes tervét tartalmazza. A következő lépés a tervek implementálása a Code módban. **Állj meg és kérj jóváhagyást a felhasználótól, mielőtt továbblépsz.**
---
*Ez a dokumentum a `/plans` könyvtárban található, és a 8. mérföldkő technikai specifikációjaként szolgál.*