- Przycisk ▶️ w headerze chatu obok badge'a modelu
- Modal z 40-sekundowym tutorialem wideo z polskim narratorem
- Poster (miniaturka) wideo
- Sekcja "Szybkie wskazówki" pod odtwarzaczem
- Responsywny design dla mobile
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Naprawia ostrzeżenie HTTP 308 w Health Check Dashboard.
Flask blueprint z url_prefix='/raporty' wymaga trailing slash.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
New structure:
- Firmy | NordaGPT | Kalendarz | B2B | Forum | Więcej ▾
"Więcej" dropdown contains:
- Aktualności
- ZOP Kaszubia
- Kontakty zewnętrzne
- Raporty
- Mapa Powiązań
Most used features now directly visible in main nav.
Ref: forum post /forum/18 by Jacek Pomieczyński
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Obsługa pola 'text' z frontendu (oprócz 'content')
- Zmiana nazw pól odpowiedzi: ai_response→analysis, proposed_contacts→contacts
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Dodano modal "Dodaj z AI" z parsowaniem tekstu/obrazów przez Gemini
- API endpoints: /api/contacts/ai-parse, /api/contacts/bulk-create
- Nowy widok grupowania kontaktów po organizacji (domyślny)
- Widok tabeli dla kompaktowego przeglądu
- Przełącznik widoków z zapamiętywaniem preferencji
- Drag & drop dla zdjęć wizytówek
- Docker: PostgreSQL 16 (zgodność z produkcją)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Nowy model ExternalContact z pełnymi danymi kontaktowymi, social media, related_links (JSONB)
- Migracja SQL 020_external_contacts.sql z full-text search
- Routes: /kontakty (lista), /kontakty/dodaj, /kontakty/<id>, /kontakty/<id>/edytuj
- Szablony: lista z filtrami, karta szczegółów, formularz CRUD
- Nawigacja: link "Kontakty zewnętrzne" w dropdown Społeczność
- Poprawka: aktualizacja liczby firm z 80 na 111
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Nowa tabela announcement_reads do śledzenia kto przeczytał
- Avatary użytkowników z inicjałami (tooltip z nazwiskiem)
- Statystyki: liczba i procent użytkowników którzy przeczytali
- Progress bar wizualizujący zasięg ogłoszenia
- Automatyczny zapis odczytu przy otwarciu ogłoszenia
Autor: Maciej Pienczyn
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- CLAUDE.md uproszczony - tylko kluczowe info dla Claude
- docs/DEVELOPMENT.md - szczegóły SearchService, Chatbot, Testy AI, SEO, News
- docs/ROADMAP.md - plan rozwoju, priorytety, strategia monetyzacji 3-tier
- docs/CREDENTIALS.md - zasady zarządzania hasłami i kluczami API
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Feedback od testera: sekcja wyjaśniająca flow powinna być widoczna
wcześniej, przed szczegółowymi kartami funkcji.
Nowa kolejność:
1. Hero (nagłówek + statystyki + CTA)
2. "Jak to działa?" (1→2→3) ← przeniesione wyżej
3. Karty funkcji (Pełny katalog, AI Asystent, Filtry)
4. "Do czego użyjesz tego portalu?"
5. Bottom CTA
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Skrypt importu miał błędną godzinę 18:00. Faktyczne spotkania
"Chwila dla Biznesu" odbywają się o 19:00.
Zaktualizowano:
- Komentarz w linii 50
- Opis wydarzenia (description)
- time_start: time(19, 0)
Istniejące wydarzenia w bazie zostały zaktualizowane ręcznie (UPDATE SQL).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Dodano position: relative i z-index: 50 do .chat-header, aby elementy
dropdown menu użytkownika (z-index: 200) były wyświetlane nad paskiem NordaGPT.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Dodano przycisk 'Sugestie z bazy wiedzy' na stronie Timeline
- Modal z listą sugestii milestone z bazy wiedzy:
- Statystyki (total facts, w timeline, do dodania)
- Karty sugestii z edytowalnym tytułem i kategorią
- Przyciski Dodaj/Pomiń dla każdej sugestii
- Toast notifications dla feedbacku
- Auto-refresh timeline po dodaniu sugestii
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Przeniesiono logikę kwartału z inline dict do funkcji _quarter_to_date()
- f-string z dict literal nie jest wspierany w Python 3.11
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Dodano funkcje automatycznego uzupełniania Timeline z bazy wiedzy:
- get_timeline_suggestions() - pobiera milestone facts jako sugestie
- create_milestone_from_suggestion() - tworzy milestone z faktu
- categorize_milestones_with_ai() - kategoryzacja AI (nuclear/offshore/etc)
- Auto-detekcja kategorii, dat i statusu z tekstu polskiego
- API endpoints:
- GET /api/zopk/timeline/suggestions - lista sugestii z bazy wiedzy
- POST /api/zopk/timeline/suggestions/approve - zatwierdź sugestię
- Fix: /zopk zwracał 500 (nieistniejąca kolumna is_verified)
- Dodano kolumnę is_verified do modelu ZOPKMilestone
- Usunięto filtr is_verified z query (do migracji)
- Health check rozszerzony z 15 do 55+ endpointów:
- Public pages, Raporty, ZOPK, Chat, IT Audit
- API publiczne, Admin Core, Admin Audits, Admin ZOPK
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Dodano brakujące słowa kluczowe do _is_zopk_query():
- "kaszubia", "kaszub", "projekt kaszubia"
- "kamienie milowe", "roadmapa", "timeline", "harmonogram"
- "inwestycje pomorze", "inwestycje pomorskie", "rozwój pomorza"
Dzięki temu pytania takie jak "co wiesz o projekcie Kaszubia?"
będą rozpoznawane jako pytania ZOPK i chat będzie używał
bazy wiedzy.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Backend zwraca teraz pełne dane zweryfikowanych faktów (nie tylko count)
- Nowy modal pokazuje listę zweryfikowanych faktów z:
- Tekstem faktu i typem
- Procentem podobieństwa do wzorca
- Fragmentem wzorca który dopasował
- Możliwość cofnięcia weryfikacji dla pojedynczych faktów
- Statystyki: zweryfikowane / wzorce użyte / cofnięte
- Stylizowane karty z animacjami
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Zalogowani użytkownicy z is_admin=True są teraz wyłączeni z limitów
requestów (request_filter=is_admin_exempt). Rozwiązuje problem
"Too Many Requests" w panelu admina ZOPK.
Limity dla zwykłych użytkowników pozostają bez zmian:
- 200/dzień
- 50/godzinę
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Nowa funkcja find_similar_to_verified_facts() w zopk_knowledge_service.py
używa pg_trgm do wyszukiwania podobnych faktów
- Nowa funkcja auto_verify_similar_to_verified() automatycznie weryfikuje
fakty podobne do już zweryfikowanych (próg 80% podobieństwa)
- Nowy endpoint POST /api/zopk/knowledge/auto-verify/similar
- Nowy endpoint GET /api/zopk/knowledge/suggest-similar-facts
- Przycisk "Ucz się z weryfikacji" na dashboardzie bazy wiedzy ZOPK
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Funkcja używała nieistniejącej kolumny importance_score
- Zmieniono na confidence_score (rzeczywista nazwa w tabeli)
- Poprawka analogiczna do wcześniejszej w find_duplicate_facts
- Funkcja renderVerificationStats używała nieistniejącego klucza data.verification
- API zwraca dane w strukturze: data.entities, data.facts, data.chunks
- Naprawiono mapowanie danych do właściwej struktury
- Obliczanie 'oczekuje' jako total - verified
Zapytanie similarity() bez indeksu powodowało timeout przy 3414 faktach.
Teraz używamy SET pg_trgm.similarity_threshold + operator % który
wykorzystuje indeks GiST (idx_facts_fulltext_trgm).
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Dodano skrypt cron do automatycznej ekstrakcji wiedzy (scripts/cron_extract_knowledge.py)
- Dodano panel deduplikacji faktów (/admin/zopk/knowledge/fact-duplicates)
- Dodano API i funkcje auto-weryfikacji encji i faktów
- Dodano panel Timeline ZOPK (/admin/zopk/timeline) z CRUD
- Rozszerzono dashboard bazy wiedzy o statystyki weryfikacji i przyciski auto-weryfikacji
- Dodano migrację 016_zopk_milestones.sql dla tabeli kamieni milowych
- Naprawiono duplikat modelu ZOPKMilestone w database.py
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Problem: JS oczekiwał facts_subject + facts_object, API zwraca facts
Rozwiązanie: Zmiana JS na ${p.transfers.facts || 0}
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Model używa entity_a_id/entity_b_id, nie source_entity_id/target_entity_id.
Naprawione miejsca:
- get_entity_merge_preview(): zliczanie relacji
- merge_entities(): przenoszenie relacji
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Problem: `:entity_json::jsonb` było interpretowane przez SQLAlchemy
jako parametr `:entity_json` z dodatkowym `:jsonb` (błąd składni SQL)
Rozwiązanie: Użycie CAST(:entity_json AS jsonb) zamiast ::jsonb
Naprawione miejsca:
- get_entity_merge_preview() - linia 1919
- merge_entities() - linia 1831
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Zmiana kolejności ORDER BY w find_duplicate_entities():
- Teraz: sim DESC, entity_type, mentions DESC
- Wcześniej: entity_type, mentions DESC, sim DESC
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Problem: ZOPKKnowledgeFact nie ma kolumn subject_entity_id i object_entity_id.
Zamiast tego używa entities_involved (JSONB array).
Zmiany:
- get_entity_merge_preview(): użycie JSONB @> query do liczenia faktów
- merge_entities(): użycie JSONB update do zamiany entity ID w facts
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Dodano in-memory cache dla API /api/zopk/knowledge/graph/data
- Cache key oparty o parametry: entity_type, min_cooccurrence, limit
- TTL = 300 sekund (5 minut)
- Flaga 'cached' w odpowiedzi informuje czy dane z cache
Korzyść: Drugie i kolejne ładowania grafu są natychmiastowe.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Problem: D3.js ładowane przez base.html PO bloku extra_js,
więc initGraph() była wywoływana gdy D3 jeszcze nie istniało.
Rozwiązanie: użycie window.addEventListener('load', ...)
zamiast natychmiastowego sprawdzenia typeof d3.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Dodano endpoint /admin/zopk/knowledge/graph z wizualizacją D3.js
- Dodano API endpoint /api/zopk/knowledge/graph/data
- Graf współwystępowania encji z kolorami według typu
- Rozmiar węzłów proporcjonalny do liczby wzmianek
- Filtry: typ encji, minimalna liczba współwystąpień
- Tooltips z informacjami o encjach
- Zoom i drag-and-drop interakcje
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Nowe funkcje w zopk_knowledge_service.py:
- find_duplicate_entities() - wyszukiwanie podobnych encji (pg_trgm)
- merge_entities() - łączenie encji z transferem relacji
- get_entity_merge_preview() - podgląd przed połączeniem
Nowe endpointy w app.py:
- GET /admin/zopk/knowledge/duplicates - panel zarządzania duplikatami
- POST /api/zopk/knowledge/duplicates/preview - podgląd merge
- POST /api/zopk/knowledge/duplicates/merge - wykonanie merge
Nowy szablon:
- templates/admin/zopk_knowledge_duplicates.html - UI z kartami encji
Dodatkowo:
- Aktualizacja CLAUDE.md z procedurą wdrażania
- Skrypt scripts/run_migration.py do uruchamiania migracji SQL
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Priorytet 1 - Panel admina bazy wiedzy ZOPK:
- /admin/zopk/knowledge - dashboard ze statystykami
- /admin/zopk/knowledge/chunks - lista chunks z filtrowaniem
- /admin/zopk/knowledge/facts - lista faktów z typami
- /admin/zopk/knowledge/entities - lista encji z mentions
- CRUD operacje: weryfikacja, usuwanie
Priorytet 2 - Poprawa jakości odpowiedzi NordaGPT:
- Linki markdown do źródeł w kontekście ZOPK
- Ulepszone formatowanie (bold, listy, nagłówki)
- Sekcja "Źródła" na końcu odpowiedzi
- Instrukcje w system prompt dla lepszej prezentacji
Priorytet 3 - Timeline ZOPK:
- Model ZOPKMilestone w database.py
- Migracja 016_zopk_milestones.sql z sample data
- Sekcja "Roadmapa ZOPK" na stronie /zopk
- Pionowa oś czasu z markerami lat
- Statusy: completed, in_progress, planned, delayed
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Zmieniono 'processed' -> 'success' i 'generated' -> 'success' aby
pasowały do wartości zwracanych przez batch_extract() i
generate_chunk_embeddings().
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Uruchamia po kolei: scraping treści, ekstrakcję AI, generowanie embeddingów.
Do użycia w cron job co godzinę.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Zmieniono kolejność metod dekodowania - googlenewsdecoder jest teraz
używany jako pierwsza metoda zamiast ostatniej. Poprzednia kolejność
powodowała wpadanie w pętlę z consent.google.com i wyczerpanie max_depth
przed wywołaniem działającej biblioteki.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Problem: Podwójny import ZOPKContentScraper powodował błąd 'cannot access local variable'
Rozwiązanie: Przeniesiono import na początek funkcji generate()
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>