{
  "schema": "fanpulse.v1",
  "task_id": "SAA-W4-1",
  "module": "FanCore + Idol Pulse (/fanpulse)",
  "realm": "0n40i4",
  "project": "K0NSULT / Szkola Agentow",
  "pilot": "Metrowy",
  "generated": "2026-06-12",
  "purpose": "Szkielet dashboardu sentymentu fanow oraz raportu reputacji idola. Mierzy nastroj i zasieg po jawnych, audytowalnych kanalach OSINT — bez manipulowania fanami. Pomiar sluzy artyscie do zrozumienia odbioru, nie do sterowania emocjami spolecznosci.",
  "guardrails": {
    "dignity_no_manipulation": "POMIAR NIE MANIPULUJE FANAMI (Godnosc). Dashboard tylko obserwuje i opisuje sentyment; zakaz dark patterns, zakaz astroturfingu, zakaz sztucznego podbijania/tlumienia nastrojow, zakaz targetowania emocjonalnego w celu wplywania na zachowania fanow.",
    "proof_before_claim": "Kazda metryka oznaczona [P] potwierdzone / [J] jawne-do-weryfikacji / [H] hipoteza. Dane bio i liczniki wylacznie z OSINT.",
    "osint_source": "archiwum/Metrowy_Os_Czasu_OSINT_Internet_Timeline_11062026.md",
    "R10_no_amounts": "Brak kwot i brak obietnic odzysku/zarobku. Reputacja NIE jest przeliczana na pieniadze ani prognozy przychodu.",
    "no_password_custody": "Agent nie przechowuje i nie zada hasel/loginow do social media artysty ani fanow. Odczyt wylacznie z publicznych/jawnych zrodel lub oficjalnych API w warstwie operatora.",
    "critique_not_hate": "Sentyment negatywny = sygnal, nie cel do uciszenia. Krytyka tworczosci przechodzi (nie cenzurujemy opinii). Hejt/grozba ida do Anti-Hate Radar, nie do tego modulu.",
    "human_is_decision_source": "Agent proponuje odczyty i alerty; interpretacja i dzialanie naleza do czlowieka (artysta/operator).",
    "no_legal_advice": "Agent nie udziela porady prawnej. Kwestie wizerunku/RODO/danych osobowych fanow = 'wymaga weryfikacji prawnej'.",
    "privacy_fans": "Agregaty zamiast profilowania jednostek. Nie budujemy profili pojedynczych fanow; nie zbieramy danych wrazliwych; minimalizacja danych.",
    "ai_act_art50": "Raporty i komunikaty generowane przez AI oznaczane jako AI-assisted (components/ai-badge.js w warstwie UI).",
    "homonym_ack": "Pomiar dotyczy wylacznie Metrowego = Bartosz Medynski (Rybnik). Sygnaly homonimow (METER zagraniczny, inne 'Metrowy') = ACK i wykluczenie z agregatu."
  },
  "cross_ref": {
    "anti_hate_radar": "fani/antihate_radar.md",
    "osint_timeline": "archiwum/Metrowy_Os_Czasu_OSINT_Internet_Timeline_11062026.md",
    "observer_index": "L1_obserwator_index.json",
    "ai_badge": "components/ai-badge.js"
  },
  "sources": [
    {
      "id": "ig_metrowyofficial",
      "platform": "Instagram",
      "handle": "@metrowyofficial",
      "metric_type": "obserwujacy",
      "baseline_value": 4691,
      "baseline_date": "2026-06-11",
      "proof": "P",
      "osint_ref": "OSINT sekcja 4, tabela social: Obserwujacy 4 691 (Instagram @metrowyofficial)",
      "sentiment_signal": "komentarze pod postami, reakcje, DM-agregaty (publiczne)",
      "manipulation_guard": "tylko odczyt agregatow; brak automatycznego angazu/botowania",
      "active": true
    },
    {
      "id": "fb_3oda_kru",
      "platform": "Facebook",
      "handle": "3oda Kru (sklad macierzysty)",
      "metric_type": "polubienia strony",
      "baseline_value": 53559,
      "baseline_value_note": "~53 559 (przyblizone w OSINT)",
      "baseline_date": "2026-06-11",
      "proof": "P",
      "osint_ref": "OSINT sekcja 4, tabela social: Polubienia (3oda Kru) ~53 559 (Facebook)",
      "sentiment_signal": "komentarze, reakcje, udostepnienia postow zwiazanych z Metrowym",
      "manipulation_guard": "kanal grupowy — sentyment przypisany Metrowemu tylko gdy post go dotyczy; zakaz przypisywania calej spolecznosci 3oda Kru jako 'fanow Metrowego'",
      "scope_caveat": "Strona zespolu, nie solowa Metrowego — agregat traktowany jako kontekst sceny, nie czysta baza fanow artysty.",
      "active": true
    },
    {
      "id": "spotify",
      "platform": "Spotify",
      "handle": "Metrowy",
      "metric_type": "sluchacze miesieczni",
      "baseline_value": 1122,
      "baseline_date": "2026-06-11",
      "proof": "P",
      "osint_ref": "OSINT sekcja 4: Sluchacze miesieczni 1 122 (Spotify); 'Brud boi' 176 822 odtworzen",
      "sentiment_signal": "trend sluchaczy miesiecznych, save/playlist-add (proxy pozytywnego odbioru)",
      "manipulation_guard": "brak fake-streamow; trendy raportowane surowo",
      "active": true
    },
    {
      "id": "lastfm",
      "platform": "Last.fm",
      "handle": "Metrowy",
      "metric_type": "sluchacze / scrobble",
      "baseline_value": 7007,
      "baseline_secondary": {"scrobble_total": 256500},
      "baseline_date": "2026-06-11",
      "proof": "P",
      "osint_ref": "OSINT sekcja 4: Sluchacze ogolem 7 007, Scrobble 256 500 (Last.fm)",
      "sentiment_signal": "lojalnosc (powracajace odsluchania) jako proxy przywiazania",
      "manipulation_guard": "tylko odczyt; bez sztucznych scrobbli",
      "active": true
    },
    {
      "id": "deezer",
      "platform": "Deezer",
      "handle": "Metrowy",
      "metric_type": "fani",
      "baseline_value": 582,
      "baseline_date": "2026-06-11",
      "proof": "P",
      "osint_ref": "OSINT sekcja 4: Fani 582 (Deezer)",
      "sentiment_signal": "przyrost liczby fanow",
      "manipulation_guard": "odczyt agregatu",
      "active": true
    },
    {
      "id": "tekstowo",
      "platform": "tekstowo.pl",
      "handle": "Metrowy",
      "metric_type": "fani / aktywnosc tekstowa",
      "baseline_value": 44,
      "baseline_date": "2026-06-11",
      "proof": "P",
      "osint_ref": "OSINT sekcja 4: Fani 44 (tekstowo.pl)",
      "sentiment_signal": "interakcje z tekstami (komentarze, poprawki, tlumaczenia)",
      "manipulation_guard": "odczyt agregatu",
      "active": true
    },
    {
      "id": "myspace_archive",
      "platform": "Myspace (archiwum)",
      "handle": "Metrowy",
      "metric_type": "obserwujacy (historyczne)",
      "baseline_value": 1818,
      "baseline_date": "archiwalne",
      "proof": "J",
      "osint_ref": "OSINT sekcja 4: Obserwujacy (archiwum) 1 818 (Myspace)",
      "sentiment_signal": "kontekst historyczny — nieaktywne, tylko jako tlo trendu dlugoterminowego",
      "manipulation_guard": "wykluczone z biezacego sentymentu (kanal nieaktywny)",
      "active": false
    },
    {
      "id": "youtube",
      "platform": "YouTube",
      "handle": "Metrowy / klipy 3oda Kru",
      "metric_type": "wyswietlenia / komentarze",
      "baseline_value": null,
      "baseline_date": null,
      "proof": "H",
      "osint_ref": "OSINT sekcja 6: YouTube blokuje odczyt licznikow → metryki NIEDOSTEPNE",
      "sentiment_signal": "komentarze pod klipami (gdy dostepne przez oficjalne API operatora)",
      "manipulation_guard": "pole jawnie puste — brak danych, brak zgadywania",
      "active": false,
      "data_gap": true
    }
  ],
  "sentiment_dashboard": {
    "description": "Agregat nastroju z aktywnych zrodel. Pokazuje rozklad, nie ocenia osob. Negatywny sentyment jest sygnalem do zrozumienia, nie do uciszenia.",
    "sentiment_classes": [
      {"key": "pozytywny", "definition": "wsparcie, entuzjazm, lojalnosc (powroty, sharey, pozytywne komentarze)"},
      {"key": "neutralny", "definition": "informacyjny / mieszany / bez wyraznego ladunku"},
      {"key": "krytyczny", "definition": "krytyka tworczosci/decyzji — PRZEPUSZCZAMY, nie cenzurujemy (Godnosc, krytyka != hejt)"},
      {"key": "toksyczny", "definition": "hejt/grozba/doxxing — NIE liczony tu jako 'sentyment'; przekazywany do antihate_radar.md"}
    ],
    "aggregation_rules": {
      "level": "agregat platformy, nie profil jednostki",
      "min_volume_for_report": "raportuj klase tylko gdy n >= 5 sygnalow (ochrona prywatnosci + statystyczny sens)",
      "toxic_routing": "klasa 'toksyczny' wychodzi z dashboardu sentymentu i wchodzi do Anti-Hate Radar (eskalacja wg jego regul)",
      "homonym_filter": "sygnaly homonimow odrzucone przed agregacja"
    },
    "fields_per_period": [
      "period (np. 2026-W24)",
      "source_id",
      "volume_total",
      "share_pozytywny",
      "share_neutralny",
      "share_krytyczny",
      "toxic_count_routed (do radaru)",
      "net_sentiment (-1..+1, bez wagi finansowej)",
      "confidence (P/J/H)",
      "notes"
    ],
    "anti_manipulation": [
      "Brak rekomendacji 'jak podbic sentyment' kierowanych na emocje fanow.",
      "Brak automatycznych odpowiedzi udajacych artyste.",
      "Brak A/B testowania emocji bez wiedzy i zgody odbiorcow.",
      "Dane prezentowane surowo — spadki nie sa ukrywane przed artysta."
    ]
  },
  "reputation_report": {
    "description": "Raport reputacji idola — synteza zasiegu, lojalnosci i odbioru w czasie, z jawnym poziomem pewnosci. Reputacja opisana, nie wyceniona (R10).",
    "dimensions": [
      {"key": "reach", "label": "Zasieg", "inputs": ["IG obserwujacy", "FB polubienia (kontekst 3oda Kru)", "Spotify sluchacze mies."], "proof_basis": "P"},
      {"key": "loyalty", "label": "Lojalnosc", "inputs": ["Last.fm scrobble/sluchacz", "Deezer fani", "powracajace odsluchania"], "proof_basis": "P"},
      {"key": "engagement", "label": "Zaangazowanie", "inputs": ["komentarze/reakcje (agregat)", "tekstowo.pl interakcje"], "proof_basis": "J"},
      {"key": "sentiment_balance", "label": "Bilans nastroju", "inputs": ["share_pozytywny vs share_krytyczny"], "proof_basis": "J"},
      {"key": "safety", "label": "Bezpieczenstwo", "inputs": ["liczba sygnalow przekazanych do Anti-Hate Radar"], "proof_basis": "P", "note": "wysoki toxic_count = ryzyko, nie zasluga ani wina artysty"}
    ],
    "scoring": {
      "method": "jawne wagi, audytowalne; brak czarnej skrzynki",
      "scale": "0-100 opisowo (orientacyjny indeks reputacji, NIE wycena rynkowa)",
      "weights": {"reach": 0.25, "loyalty": 0.30, "engagement": 0.20, "sentiment_balance": 0.20, "safety": 0.05},
      "forbidden": ["przeliczanie na PLN/honorarium", "prognozy zarobku", "obietnice wzrostu"],
      "human_review": "Indeks to propozycja agenta; akceptacja/korekta nalezy do czlowieka (HO)."
    },
    "output_fields": [
      "report_id",
      "period",
      "reach_score",
      "loyalty_score",
      "engagement_score",
      "sentiment_balance_score",
      "safety_score",
      "reputation_index_0_100",
      "trend_vs_prev_period",
      "confidence_overall (P/J/H)",
      "data_gaps (np. YouTube niedostepny)",
      "ai_assisted (true — art.50)"
    ],
    "data_gaps_known": [
      "YouTube: liczniki niedostepne (OSINT sekcja 6) — wykluczone z reach.",
      "FB 3oda Kru: kanal grupowy — wazony nizej, oznaczony jako kontekst sceny.",
      "Brak formalnych nagrod (OSINT sekcja 5) — reputacja oparta na odbiorze, nie na laurach."
    ]
  },
  "data_collection_ethics": {
    "consent": "Odczyt wylacznie tresci publicznych/jawnych; szanowanie ustawien prywatnosci platform i fanow.",
    "minimization": "Zbieramy minimum potrzebne do agregatu; nie magazynujemy tresci fanow dluzej niz konieczne.",
    "no_profiling": "Zakaz budowania profili pojedynczych fanow i targetowania ich emocji.",
    "transparency": "Artysta widzi pelna metode i surowe trendy; nic nie jest przed nim ukrywane.",
    "right_to_critique": "Krytyka tworczosci jest chroniona — nie jest 'naprawiana' ani usuwana przez ten modul."
  },
  "ui_integration": {
    "route": "/fanpulse",
    "ai_badge_required": true,
    "ai_badge_snippet": "<script src=\"../components/ai-badge.js\"></script> + <ai-badge></ai-badge>",
    "note": "Kazdy publiczny widok generowany z tego modulu musi nosic oznaczenie AI-assisted (AI Act art.50)."
  },
  "status": "skeleton_v1_no_live_pull",
  "notes": "Wartosci baseline pochodza z OSINT osi czasu (stan 2026-06-11). Modul jest szkieletem — nie wykonuje na zywo odczytu API. Liczba 4691 (IG) i ~53559 (FB 3oda Kru) sa kotwicami referencyjnymi, nie celami do sztucznego podbicia."
}
