> Dobre dane dla AI to nie kwestia formatu — to zestaw reguł, który z góry mówi modelowi, co wolno mu powiedzieć, a czego nie wolno zmyślić. Dobry kontrakt danych nie tylko przenosi liczby — niesie w sobie rolę, zadanie, kontekst, kluczowe pytania i wymagany format odpowiedzi. Im mniej z tych elementów jest w danych, tym więcej zostaje miejsca na zgadywanie.
1. Wstęp – Czym jest JSON i czym jest kontrakt danych dla AI
1.1. JSON w dwóch zdaniach, bez żargonu
Zamiast zdania „Jan ma 34 lata i mieszka w Warszawie" te same informacje da się zapisać jako:
{"imie": "Jan",
"wiek": 34,
"miasto": "Warszawa"}JSON to po prostu sposób zapisu danych w postaci par klucz–wartość. Czytelny jednocześnie dla człowieka i dla maszyny — nic bardziej tajemniczego.
1.2. Co to znaczy „structured output" w kontekście AI — i dlaczego to nie jest temat tego artykułu
To pojęcie ma dwa znaczenia, które łatwo pomylić.
Pierwsze: dane wejściowe podane modelowi w uporządkowanej formie zamiast luźnego opisu tekstowego. Drugie: wymuszony format odpowiedzi modelu (np. „odpowiedz wyłącznie w JSON, z dokładnie takimi polami").
W praktyce pojęcie structured output bywa używane szerzej, niż wynikałoby z jego technicznego znaczenia. W tym artykule interesuje nas problem stojący krok wcześniej: jak ustrukturyzować dane i instrukcje przekazywane modelowi, żeby jego odpowiedź była przewidywalna.
Od tego momentu będziemy więc mówić o kontrakcie danych — czyli pliku, który nie tylko przenosi liczby, ale też mówi modelowi, jak je czytać i jak ma wyglądać odpowiedź.
Problem, którego większość zespołów nie nazywa wprost
Zespoły traktują dane dla AI jak problem formatowania — „niech model zwróci JSON, a nie zdania". Tymczasem prawdziwy problem leży gdzie indziej: w niejednoznaczności znaczenia danych.
Zobacz, jak to wygląda w praktyce. Model sumuje liczby, których sumować nie wolno, bo to migawki z różnych momentów, a nie narastające wartości. Model „dopowiada" brakujące pole zamiast napisać wprost „nie mam takich danych". Model odpowiada w złym języku, bo żadne pole nie mówi mu, w jakim języku ma pisać.
Za każdym z tych błędów stoi to samo błędne założenie: „mamy dane w JSON, więc mamy wszystko, czego trzeba". Nieprawda — JSON to tylko składnia. Kontrakt danych to coś więcej.
Różnica między „mamy dane w JSON" a „mamy dane, które model rozumie bezpiecznie"
Sam fakt, że dane są w JSON, niczego nie gwarantuje.
Weźmy plik z Headshot Haven — realny przykład od Origami Effect. Zawiera on m.in. pola `weapons.top` (aktualny stan broni gracza) i `weaponFeatures` (uśrednione wartości z ostatniego przebiegu obliczeń). Skąd model ma wiedzieć, że nie wolno mu tych dwóch rzeczy zsumować? Tylko stąd, że ktoś napisał to wprost w polu `context`.
To jest dokładnie metoda, którą pokażemy w sekcji 4: przy każdym elemencie tego pliku zobaczysz, jakiemu konkretnemu ryzyku zapobiega.
2. Podstawowe pojęcia – anatomia dobrego kontraktu danych
Każde pole w dobrze zaprojektowanym pliku odpowiada na inne pytanie modelu: kim mam być, co mam zrobić, jak czytać te liczby, na czym się skupić, jak ma wyglądać wynik. To warstwy jednego kontraktu. Brak jednej z nich to otwarta furtka na zmyślanie.
Każde z poniższych pól to nie metadane — to zabezpieczenie przed konkretnym błędem.
2.1. `role` – dlaczego zdefiniowanie roli to pierwsza linia obrony
Rola to nie ozdobnik stylistyczny. To ona zawęża, jakie odpowiedzi model w ogóle rozważy. „Komentator meczowy" odpowie inaczej niż „analityk biznesowy", a jeszcze inaczej niż „handlowiec" — i to nie tylko kwestia tonu, ale i tego, na czym model się skupi.
W pliku Headshot Haven rola brzmi mniej więcej: „mów energicznie, jak transmisja na żywo, ale każda teza musi mieć oparcie w liczbie z danych". Jedno zdanie, a załatwia dwie rzeczy naraz — ton i rygor faktograficzny.
Zapisz sobie tę zasadę: jeśli chcesz, żeby dwa zapytania do tych samych danych brzmiały tak samo, a nie za każdym razem inaczej — zdefiniuj rolę wprost. Bez tego model za każdym razem zgaduje na nowo.
2.2. `task` vs `context` – rozdzielenie „co zrobić" od „jak to rozumieć"
`task` i `context` robią co innego, i warto je trzymać osobno.
`task` to jedno zdanie celu — na przykład „skomentuj progres gracza". `context` to instrukcja obsługi danych — tłumaczy ich specyfikę, np. że „delta to ostatni import minus pierwszy" albo że brakujący typ broni nie znaczy zero zabójstw, tylko brak danych.
Kiedy zespoły wrzucają wszystko do jednego pola, tracą kontrolę nad tym, co jest instrukcją, a co surowymi danymi. Rozdziel je, jeśli Twoje dane mają własną logikę — agregacje, wyjątki, jednostki — której model nie odgadnie z samych nazw kluczy.
2.3. Instrukcje antyhalucynacyjne — jawne „czego nie wolno"
To jest sedno całego artykułu.
Model domyślnie chce dać pełną, gładką odpowiedź. Jeśli nie zabronisz mu czegoś wprost, zrobi to „pomocniczo" — nawet jeśli to błąd. W pliku Headshot Haven są konkretne zakazy: nie sumuj zabójstw z różnych migawek czasowych, nigdy nie wymyślaj map, broni ani zdarzeń, jeśli wartość jest pusta — powiedz, że brak danych.
Zapamiętaj to zdanie: kontrakt danych bez jawnych zakazów, nawet wypchany danymi po brzegi, to zaproszenie do zgadywania. A zgadywanie modelu brzmi dokładnie tak samo pewnie, jak fakt.
Potrzebujesz takich zakazów wszędzie tam, gdzie istnieje operacja — sumowanie, uśrednianie, przewidywanie — która wygląda na oczywistą, a jest błędna. Model tego nie wie, dopóki mu nie powiesz.
2.4. `keyQuestions` – prowadzenie modelu zamiast liczenia na to, że sam znajdzie sedno
Samo rzucenie modelowi surowych danych to za mało, jeśli tych danych jest dużo. `keyQuestions` wskazuje, od czego zacząć — np. „zacznij od topMovers" — i jakie porównania w ogóle mają sens.
To nie jest podpowiadanie gotowej odpowiedzi. To zawężenie pola widzenia do tego, co rzeczywiście ważne. Bez tego dostajesz sprawozdanie ze wszystkiego po trochu, zamiast odpowiedzi na pytanie, które naprawdę Cię interesowało.
2.5. `requiredOutput` – kontrakt na kształt odpowiedzi, nie tylko na jej treść
`requiredOutput` to specyfikacja odbioru — limit słów, wymagana struktura (np. dokładnie trzy punkty na koniec), zasada w stylu „opisuj mocne i słabe strony tylko wtedy, gdy dane to wprost potwierdzają".
Nawet świetna merytorycznie odpowiedź jest bezużyteczna, jeśli nie pasuje do miejsca, w które ma trafić — dashboardu, powiadomienia, maila. Zdefiniuj `requiredOutput`, gdy odpowiedź ma wylądować w konkretnym miejscu produktu. Wtedy długość, struktura i ton przestają być kwestią gustu, a stają się wymaganiem integracyjnym.
2.6. Reguła językowa jako dane, nie jako założenie
W pliku Headshot Haven wszystko — nazwy pól, opisy, jednostki — jest po angielsku. Bez jawnej reguły model mógłby uznać, że to sugestia co do języka odpowiedzi. Dlatego reguła językowa jest tam zapisana wprost, jako nadrzędna — coś w stylu „odpowiadaj w języku, w którym pisze użytkownik, niezależnie od języka tego pliku".
Potrzebujesz takiej reguły zawsze, gdy Twój plik będzie czytany przez użytkowników mówiących różnymi językami, a sama treść pliku jest w jednym. Bez tego model miesza język danych z językiem, w którym powinien odpowiedzieć.
2.7 Weź odpowiedzialność za dane: policz to, co da się policzyć, zanim dane trafią do modelu
Wszystkie zasady z tej sekcji mają wspólną słabość: są regułami napisanymi słowami. Model (zwłaszcza w trybie czatu) czasem i tak zrobi po swojemu. Nawet jawnie zapisana reguła nie daje stuprocentowej gwarancji. To zmniejsza ryzyko, ale go nie zeruje — zwłaszcza w wersjach czatowych modeli, które czasem trzymają się własnej intuicji bardziej niż instrukcji w danych.
Innymi słowy: reguła w kontrakcie danych zwiększa szansę na poprawne zachowanie, ale nie zastępuje sprawdzenia wyniku. To zresztą kolejny dobry powód, żeby samemu przetestować plik na kilku modelach — o czym więcej w dalszej części artykułu.
Jest jednak sposób, żeby to ryzyko ograniczyć skuteczniej niż samą regułą: nie proś modelu, żeby coś policzył. Policz to wcześniej, w kontrolowanym, deterministycznym procesie i podaj mu gotowy wynik. Tam, gdzie to możliwe, przenosimy obliczenia z modelu do narzędzi, które są do tego stworzone. LLM-y zostawiamy do tego, w czym naprawdę są dobre — czytania dużych ilości tekstu naraz, wychwytywania niuansów, ciekawostek, anomalii i pisania interpretacji na podstawie już zweryfikowanych faktów.
3. Jak to wszystko działa razem — od surowych danych do bezpiecznej odpowiedzi
Każde pole z sekcji 2 neutralizuje inny typ błędu. Kontrakt danych to nie wybór jednego z nich — to komplet zabezpieczeń dobrany do tego, jak łatwo dane mogą zostać źle zrozumiane.
Od surowego pliku do odpowiedzi, której można zaufać
Wyobraź sobie to jako drogę, którą przechodzą Twoje dane, zanim staną się odpowiedzią:
Najpierw są surowe dane — same w sobie nie niosą żadnego kontekstu. Potem dochodzi `role` i `task`, czyli ramy: kim model ma być i co ma zrobić. Następnie `context` uczy model, jak czytać konkretne liczby — co można z nimi zrobić, a czego nie wolno. Na tym etapie w grę wchodzą też jawne zakazy, które blokują pozornie „oczywiste", a błędne operacje. Dalej `keyQuestions` kieruje uwagę modelu na to, co faktycznie ważne. Dopiero wtedy powstaje odpowiedź — a `requiredOutput` decyduje, czy trafi ona w oczekiwany kształt: długość, strukturę, język.
Każdy z tych etapów eliminuje inny rodzaj błędu. Więcej o tym, jak to wygląda w praktyce, zobaczysz w sekcji 4.
Dlaczego pominięcie któregokolwiek elementu kosztuje wiarygodność
Brak `context` albo niejasny `context` → model źle agreguje dane. Przykład: bez informacji, że `total_kills` to migawka z danego importu, model zsumuje wartości ze wszystkich importów i poda liczbę kilkukrotnie zawyżoną — brzmiącą w stu procentach wiarygodnie.
Brak jawnych zakazów → model zmyśla mapy, bronie, zdarzenia, które pasują do kontekstu, ale nie istnieją w danych.
Brak `keyQuestions` → odpowiedź jest rozwodniona i ogólnikowa, bo model odpowiada na domyślne, niekoniecznie trafne pytania.
Brak `requiredOutput` → odpowiedź wychodzi w złym formacie, np. jako tekst zamiast ustrukturyzowanych danych, i nie da się jej automatycznie przetworzyć.
Brak reguły językowej → model miesza języki w jednej odpowiedzi, co wygląda nieprofesjonalnie i obniża użyteczność całości.
4. Anatomia jednego pliku — Headshot Haven jako case study
Przykład pochodzi z rzeczywistego systemu Headshot Haven, który gromadzi i analizuje między innymi dane dotyczące rozgrywek Battlefield 6. Backend systemu przygotowuje na ich podstawie plik JSON zawierający zarówno dane, jak i instrukcje określające sposób ich interpretacji oraz wymagany format odpowiedzi.
To właśnie ten plik jest tutaj traktowany jako kontrakt danych dla AI. Na potrzeby artykułu jego zawartość została zanonimizowana, ale zachowano strukturę i mechanizmy, które decydują o sposobie pracy modelu.
4.1. Rola komentatora meczowego — czemu zapobiega
To nie był zwykły „podsumuj statystyki".
"prompt": {
"role": "You are a Battlefield match commentator. Describe how one player plays:
style, weapons, vehicles, objectives, and what changed between imports.
Do not compare this player with others, this export contains only this one.
Style: energetic, like a live broadcast, but every claim must be backed by a number from the data. No business recommendations....",Bez zdefiniowanej roli model mógłby odpowiedzieć jak sucha tabelka albo jak tekst reklamowy gry. Rozwiązanie: jawnie określona rola, która wymusza konkretny rejestr i twardą zasadę — każda teza musi mieć oparcie w liczbie z danych.
Dlaczego samo bogactwo danych by nie wystarczyło: nawet mając wszystkie liczby, model bez roli musiałby zgadywać ton i poziom szczegółowości. A zgadywanie to pierwszy krok do tego, że dwie odpowiedzi na te same dane będą brzmiały zupełnie inaczej.
4.2. Delta jako pojęcie zdefiniowane w danych, nie w głowie analityka
To nie było zwykłe pole „zmiana".
"context": "...The source is the bf6_stats, bf6_weapon_stats and bf6_weapon_features tables in Headshot Haven. Delta means the last import minus the first import within the selected range...",„Delta" mogłaby znaczyć zmianę dzień do dnia, tydzień do tygodnia — cokolwiek, zależnie od tego, kto pyta. Rozwiązanie: jedno zdanie w `context`, które definiuje deltę raz na zawsze jako różnicę między ostatnim a pierwszym importem w wybranym zakresie.
Dlaczego samo posiadanie pola `delta` by nie wystarczyło: liczba bez zdefiniowanego znaczenia to pułapka. Model musiałby zgadnąć, względem czego liczyć — a przy dwóch pytaniach mógłby zgadnąć dwa razy inaczej.
4.3. „Brakujący typ broni ≠ zero zabójstw" — jawne wykluczenie fałszywego wniosku
To nie było zwykłe czyszczenie danych.
"context": "...weapons.top is the latest snapshot per weapon within the range (sorted by kills, capped); weapons.restByType aggregates the remaining weapons. Use that for the current weapon mix. groups.weapons lists career kills by weapon type and their delta between imports, but only types with a current value above zero. A missing type is omitted, not confirmed as zero. Do not treat a missing type as no kills when weapons.top shows that type...",Typy broni z zerem zabójstw są pominięte w tabeli — i wyglądają identycznie jak sytuacja, w której gracz faktycznie nigdy tą bronią nikogo nie zabił. Rozwiązanie: jawne zdanie mówiące wprost, że brak typu w tabeli oznacza brak danych, a nie potwierdzone zero.
Dlaczego samo poprawne zamodelowanie tabeli by nie wystarczyło: ta niejednoznaczność siedzi w naturze danych. Żadna „ładniejsza" struktura JSON tego nie rozwiąże — trzeba to po prostu powiedzieć wprost.
4.4. `topMovers` jako gotowy punkt startowy, nie kolejna kolumna do przeliczenia
To nie było zwykłe sortowanie po zmianie procentowej.
"topMovers": {
"note": "Ranked by relative change (deltaPercent). Small-base metrics can show large percentages; mention that when it applies.",
"gainers": [
{
"key": "vehicles_destroyed",
"label": "Vehicles destroyed",
"baseline": 181,
"value": 426,
"delta": 245,
"deltaPercent": 135.4,
"display": "+245"
},Przy dziesiątkach metryk model mógłby wybrać do skomentowania te najbardziej efektowne liczbowo, ale nieistotne analitycznie — np. duży wzrost procentowy przy małej bazie wyjściowej. Rozwiązanie: `topMovers` z jawnym ostrzeżeniem, że małe bazy potrafią dawać duże procenty, i że warto o tym wspomnieć, gdy się to zdarza.
Dlaczego same surowe metryki by nie wystarczyły: model bez tej podpowiedzi najpewniej wybrałby „efektowne", a nie „znaczące" liczby — bo nic mu nie powiedziało, że to dwie różne rzeczy.
4.5. `requiredOutput` jako lista kontrolna, nie sugestia stylistyczna
To nie było zwykłe „napisz krótko".
"requiredOutput": [
"Write one coherent commentary of no more than 350 words.",
"Cover the player’s playing style, weapons, vehicles, objectives and support.",
"Start with the most important changes from topMovers, including both increases and decreases.",
"Describe strengths and weaknesses only when directly supported by the data.",
"End with exactly 3 things visible in this profile that are worth checking in the next import.",
"Final check: the whole answer follows the LANGUAGE RULE."
]
},Limit 350 słów, dokładnie trzy rzeczy do sprawdzenia na koniec, zakaz rekomendacji biznesowych — każdy z tych warunków osobno łatwo pominąć, jeśli istnieje tylko „w głowie" osoby piszącej prompt. Rozwiązanie: spisanie tego jako listy punktowanej wprost w danych, z ostatnim punktem, który każe modelowi samemu sprawdzić, czy trzyma się reguły językowej.
Dlaczego sama dobra merytorycznie odpowiedź by nie wystarczyła: analiza w złej długości albo bez wymaganych trzech punktów jest, z punktu widzenia integracji z produktem, tak samo bezużyteczna jak analiza błędna.
4.6. Reguła językowa z klauzulą pierwszeństwa
To nie było zwykłe „odpowiadaj po polsku albo angielsku".
"requiredOutput": [
"Write one coherent commentary of no more than 350 words.",
"Cover the player’s playing style, weapons, vehicles, objectives and support.",
"Start with the most important changes from topMovers, including both increases and decreases.",
"Describe strengths and weaknesses only when directly supported by the data.",
"End with exactly 3 things visible in this profile that are worth checking in the next import.",
"Final check: the whole answer follows the LANGUAGE RULE."
]
}, "prompt": {
"role": "...LANGUAGE RULE (highest priority, overrides everything else in this file): Reply in the same language the user writes their chat messages to you in. Ignore the language of this file: the instructions and field names are in English, and that says nothing about the response language. If the user wrote nothing besides attaching this file, reply in English. Translate metric labels, weapon types and other terms into the response language. Never mix languages in one answer. If the user switches language later in the conversation, switch with them...",
Cały plik — nazwy pól, opisy, jednostki — jest po angielsku. To mogłoby sugerować modelowi, że taki ma być też język odpowiedzi. Rozwiązanie: reguła językowa jawnie oznaczona jako nadrzędna, obowiązująca ponad wszystkim innym w pliku.
Dlaczego samo napisanie promptu w dobrym języku by nie wystarczyło: prompt systemowy i dane wejściowe to dwa osobne miejsca. Bez jawnej reguły w samych danych ryzyko „przecieku" języka pliku do odpowiedzi rośnie właśnie wtedy, gdy dane są bogate i szczegółowe — czyli tam, gdzie najbardziej zależy Ci na precyzji.
5. Analityk i tak będzie chciał wykres — AI jako warstwa narracyjna
Kontrakt danych nie musi służyć wyłącznie do wygenerowania odpowiedzi w oknie czatu. Te same dane mogą być częścią dashboardu, systemu analitycznego albo aplikacji, w której użytkownik pracuje na co dzień.

Na ekranie widać dwa sposoby przedstawienia tego samego zbioru danych. Wykres pozwala analitykowi samodzielnie zobaczyć relacje między wartościami. Obok znajduje się narracyjny opis wygenerowany przez AI.
Analityk nadal będzie chciał zobaczyć wykres, tabelę lub inne źródło danych i wykonać własną interpretację. Tekst wygenerowany przez AI może być dodatkowym materiałem: wskazać istotne zmiany, zwrócić uwagę na nietypowe wartości albo przygotować pierwszy opis dużego zestawu KPI, który człowiek następnie zweryfikuje.
Nie chodzi więc o zastąpienie dashboardu tekstem. Chodzi o dodanie do niego kolejnego sposobu korzystania z tych samych danych.
Wyobraźmy sobie system sprzedażowy, w którym dla każdego SKU dostępnych jest kilkadziesiąt wskaźników: sprzedaż, marża, rotacja, zapas, dynamika, udział w kategorii, zwroty, ceny konkurencji i wiele innych. Dashboard może pokazać wszystkie te informacje, ale użytkownik nadal musi je przeczytać i połączyć w całość.
Warstwa narracyjna może dla każdego SKU wygenerować krótką charakterystykę sytuacji: co się zmieniło, które KPI wymagają uwagi i jakie zależności wynikają z danych. Dashboard pozostaje źródłem szczegółowych informacji, a AI pomaga szybciej przejść przez dużą liczbę pozycji.
Podobnie można wykorzystać ten mechanizm w systemach wspierających decyzje. Do danych można przekazać również zdefiniowane reguły biznesowe i wykorzystać AI do wskazywania sytuacji, w których dana reguła może mieć zastosowanie.
Przykładowo: system wykrywa jednocześnie spadek sprzedaży, wzrost zapasu i spadek marży. AI nie musi samodzielnie wymyślać sposobu postępowania. Na podstawie danych i przekazanych reguł może wskazać użytkownikowi, że wystąpił zestaw warunków odpowiadający określonej sytuacji, a następnie przedstawić ją w zrozumiałej formie.
Taki mechanizm może służyć między innymi do:
- objaśniania dużej liczby KPI,
- tworzenia komentarzy do dashboardów,
- przygotowywania opisów wyników sprzedaży,
- wskazywania zmian wymagających uwagi,
- porządkowania informacji mogących wyjaśniać odchylenia,
- generowania opisów dla konkretnych produktów, klientów lub lokalizacji,
- wskazywania użytkownikowi potencjalnie istotnych reguł postępowania.
Im większa liczba KPI i obiektów, tym większy staje się problem nie samego dostępu do danych, ale kosztu ich przeczytania i interpretacji przez człowieka.
AI może ten koszt zmniejszyć, jeśli oprócz liczb otrzyma również informację, co te liczby oznaczają, jak wolno je interpretować i jakiego rodzaju narrację ma z nich zbudować.
Wtedy JSON przestaje być tylko formatem wymiany danych.
Staje się jednym z elementów warstwy, która łączy dane, reguły ich interpretacji i narrację kierowaną do użytkownika.
6. Sprawdzenie w praktyce — jeden plik, dowolny model
Zamiast prezentowania gotowych interpretacji, zachęca się do samodzielnego przeprowadzenia testu. Pozwala to na ocenę działania modeli AI w praktyce i weryfikację przedstawionych twierdzeń. Poniżej przedstawiono instrukcję umożliwiającą powtarzalne i obiektywne porównanie wyników.
Pobranie przykładowego pliku
Zamiast polegać wyłącznie na gotowych interpretacjach, najlepiej sprawdzić to samemu. Poniższy blok JSON zawiera kompletny kontrakt danych i instrukcji — w tej samej strukturze, która jest generowana przez backend Headshot Haven na potrzeby interpretacji danych przez AI.
Jak przeprowadzić test?
Skopiuj całą poniższą zawartość bloku JSON i wklej ją bezpośrednio do okna czatu z modelem AI (np. ChatGPT, Claude czy Gemini). Nie musisz dopisywać żadnego dodatkowego kontekstu ani instrukcji od siebie, zobaczysz, jak model interpretuje ten sam zestaw danych zgodnie z rolą, ograniczeniami i wymaganiami zapisanymi w kontrakcie
{
"meta": {
"datasetName": "Headshot BF6 Progress",
"exportedAt": "2026-09-26T14:30:28.347Z",
"rowCount": 116,
"sourceSystem": "Headshot Haven",
"sourceDescriptionUrl": null,
"author": "Origami Effect",
"organization": "Origami Effect"
},
"prompt": {
"role": "You are a Battlefield match commentator. Describe how one player plays: style, weapons, vehicles, objectives, and what changed between imports. Do not compare this player with others, this export contains only this one. Style: energetic, like a live broadcast, but every claim must be backed by a number from the data. No business recommendations. LANGUAGE RULE (highest priority, overrides everything else in this file): Reply in the same language the user writes their chat messages to you in. Ignore the language of this file: the instructions and field names are in English, and that says nothing about the response language. If the user wrote nothing besides attaching this file, reply in English. Translate metric labels, weapon types and other terms into the response language. Never mix languages in one answer. If the user switches language later in the conversation, switch with them.",
"task": "Comment on the selected player’s progress between the first and last import and describe how they play using the available numbers.",
"context": "The source is the bf6_stats, bf6_weapon_stats and bf6_weapon_features tables in Headshot Haven. Delta means the last import minus the first import within the selected range. topMovers holds the precomputed biggest gainers and decliners. weapons.top is the latest snapshot per weapon within the range (sorted by kills, capped); weapons.restByType aggregates the remaining weapons. Use that for the current weapon mix. groups.weapons lists career kills by weapon type and their delta between imports, but only types with a current value above zero. A missing type is omitted, not confirmed as zero. Do not treat a missing type as no kills when weapons.top shows that type. Describe vehicles from groups (vehicle kills, vehicle damage, distance). There is no vehicleGroups block. There is no spotlight block. Do not invent a best class or best map. Those career fields are often the placeholder \"All\" with incomplete rates. weaponFeatures holds averages from the latest calculation, one row per weapon name. Do not sum total_kills or time_hours: they are accumulated snapshots, not current career totals. Use only the numbers from the data. If a value is missing or null, say there is no data. Never invent maps, weapons, events or numbers. unit=percent means percentage points (31.1 = 31.1%). unit=duration means seconds (convert to hours/minutes in the answer). unit=distance means meters. display and deltaDisplay are ready to quote. For calculations use value and delta. Career numbers describe the player’s state at the time of import, not the result of a single round.",
"keyQuestions": [
"Which metrics increased the most and which decreased over this period? (start from topMovers)",
"What playing style emerges from the distribution of kills, weapons, vehicles and objectives?",
"Which weapons account for the most kills, and which stand out for accuracy or effectiveness?",
"How did the player’s form change between imports (K/D, KPM, accuracy, wins)?"
],
"requiredOutput": [
"Write one coherent commentary of no more than 350 words.",
"Cover the player’s playing style, weapons, vehicles, objectives and support.",
"Start with the most important changes from topMovers, including both increases and decreases.",
"Describe strengths and weaknesses only when directly supported by the data.",
"End with exactly 3 things visible in this profile that are worth checking in the next import.",
"Final check: the whole answer follows the LANGUAGE RULE."
]
},
"data": {
"view": "progress",
"periodDays": 365,
"profile": {
"username": "origamii_friend",
"platform": "ea",
"discordId": "000000000000000",
"platformUserId": "00000000000000",
"snapshotCount": 116,
"firstImportedAt": "2026-05-01T09:00:18",
"lastImportedAt": "2026-09-25T09:00:03",
"trackerTime": "12 days, 6:46:41"
},
"summary": [
{
"key": "kill_death_ratio",
"label": "K/D",
"unit": "decimal",
"value": 1.23,
"display": "1,23",
"baseline": 1.21,
"delta": 0.02,
"deltaDisplay": "+0,02"
},
{
"key": "kills_per_minute",
"label": "KPM",
"unit": "decimal",
"value": 0.64,
"display": "0,64",
"baseline": 0.75,
"delta": -0.11,
"deltaDisplay": "−0,11"
},
{
"key": "wins",
"label": "Wins",
"unit": "int",
"value": 448,
"display": "448",
"baseline": 337,
"delta": 111,
"deltaDisplay": "+111"
},
{
"key": "matches_played",
"label": "Matches",
"unit": "int",
"value": 924,
"display": "924",
"baseline": 661,
"delta": 263,
"deltaDisplay": "+263"
},
{
"key": "kills",
"label": "Kills",
"unit": "int",
"value": 11273,
"display": "11 273",
"baseline": 8711,
"delta": 2562,
"deltaDisplay": "+2562"
},
{
"key": "xp_total",
"label": "Total XP",
"unit": "int",
"value": 16460236,
"display": "16 460 236",
"baseline": 11186395,
"delta": 5273841,
"deltaDisplay": "+5 273 841"
}
],
"topMovers": {
"note": "Ranked by relative change (deltaPercent). Small-base metrics can show large percentages; mention that when it applies.",
"gainers": [
{
"key": "vehicles_destroyed",
"label": "Vehicles destroyed",
"baseline": 181,
"value": 426,
"delta": 245,
"deltaPercent": 135.4,
"display": "+245"
},
{
"key": "kills_passenger",
"label": "Passenger",
"baseline": 448,
"value": 1040,
"delta": 592,
"deltaPercent": 132.1,
"display": "+592"
},
{
"key": "damage_passenger",
"label": "Passenger damage",
"baseline": 137367,
"value": 308094,
"delta": 170727,
"deltaPercent": 124.3,
"display": "+170 727"
}
],
"decliners": [
{
"key": "kills_per_minute",
"label": "KPM",
"baseline": 0.75,
"value": 0.64,
"delta": -0.11,
"deltaPercent": -14.7,
"display": "−0,11"
},
{
"key": "damage_per_minute",
"label": "DPM",
"baseline": 242.74,
"value": 217.08,
"delta": -25.66,
"deltaPercent": -10.6,
"display": "−25,66"
},
{
"key": "kills_per_match",
"label": "Kills per match",
"baseline": 13.18,
"value": 12.2,
"delta": -0.98,
"deltaPercent": -7.4,
"display": "−0,98"
}
]
},
"groups": [
{
"id": "combat",
"title": "Combat",
"subtitle": "Volume, assists and pace",
"metrics": [
{
"key": "kills",
"label": "Kills",
"unit": "int",
"value": 11273,
"display": "11 273",
"baseline": 8711,
"delta": 2562,
"deltaDisplay": "+2562"
},
{
"key": "deaths",
"label": "Deaths",
"unit": "int",
"value": 9131,
"display": "9131",
"baseline": 7194,
"delta": 1937,
"deltaDisplay": "+1937"
},
{
"key": "kill_death_ratio",
"label": "K/D",
"unit": "decimal",
"value": 1.23,
"display": "1,23",
"baseline": 1.21,
"delta": 0.02,
"deltaDisplay": "+0,02"
},
{
"key": "assists",
"label": "Assists",
"unit": "int",
"value": 11683,
"display": "11 683",
"baseline": 7806,
"delta": 3877,
"deltaDisplay": "+3877"
},
{
"key": "kill_assists",
"label": "Kill assists",
"unit": "int",
"value": 11683,
"display": "11 683",
"baseline": 7806,
"delta": 3877,
"deltaDisplay": "+3877"
},
{
"key": "matches_played",
"label": "Matches",
"unit": "int",
"value": 924,
"display": "924",
"baseline": 661,
"delta": 263,
"deltaDisplay": "+263"
},
{
"key": "wins",
"label": "Wins",
"unit": "int",
"value": 448,
"display": "448",
"baseline": 337,
"delta": 111,
"deltaDisplay": "+111"
},
{
"key": "losses",
"label": "Losses",
"unit": "int",
"value": 474,
"display": "474",
"baseline": 322,
"delta": 152,
"deltaDisplay": "+152"
},
{
"key": "win_percent",
"label": "Win %",
"unit": "percent",
"value": 48.59,
"display": "48,6%",
"baseline": 51.14,
"delta": -2.55,
"deltaDisplay": "−2,5 pp"
},
{
"key": "kills_per_minute",
"label": "KPM",
"unit": "decimal",
"value": 0.64,
"display": "0,64",
"baseline": 0.75,
"delta": -0.11,
"deltaDisplay": "−0,11"
},
{
"key": "kills_per_match",
"label": "Kills per match",
"unit": "decimal",
"value": 12.2,
"display": "12,20",
"baseline": 13.18,
"delta": -0.98,
"deltaDisplay": "−0,98"
},
{
"key": "seconds_played",
"label": "Time played",
"unit": "duration",
"value": 1061201,
"display": "294 h 46 min",
"baseline": 701347,
"delta": 359854,
"deltaDisplay": "+99 h 57 min"
}
]
},
{
"id": "aim",
"title": "Accuracy",
"subtitle": "Shots, hits and headshots",
"metrics": [
{
"key": "accuracy",
"label": "Accuracy",
"unit": "percent",
"value": 31.08,
"display": "31,1%",
"baseline": 28.65,
"delta": 2.43,
"deltaDisplay": "+2,4 pp"
},
{
"key": "shots_fired",
"label": "Shots fired",
"unit": "int",
"value": 318398,
"display": "318 398",
"baseline": 252637,
"delta": 65761,
"deltaDisplay": "+65 761"
},
{
"key": "shots_hit",
"label": "Shots hit",
"unit": "int",
"value": 98962,
"display": "98 962",
"baseline": 72375,
"delta": 26587,
"deltaDisplay": "+26 587"
},
{
"key": "headshots",
"label": "Headshots",
"unit": "int",
"value": 1686,
"display": "1686",
"baseline": 1330,
"delta": 356,
"deltaDisplay": "+356"
},
{
"key": "headshots_percent",
"label": "Headshot %",
"unit": "percent",
"value": 14.96,
"display": "15%",
"baseline": 15.27,
"delta": -0.31,
"deltaDisplay": "−0,3 pp"
},
{
"key": "inround_kills_headshots",
"label": "In-round headshots",
"unit": "int",
"value": 15,
"display": "15",
"baseline": 15,
"delta": 0
},
{
"key": "damage_total",
"label": "Damage",
"unit": "int",
"value": 3839391,
"display": "3 839 391",
"baseline": 2837440,
"delta": 1001951,
"deltaDisplay": "+1 001 951"
},
{
"key": "damage_per_minute",
"label": "DPM",
"unit": "decimal",
"value": 217.08,
"display": "217,08",
"baseline": 242.74,
"delta": -25.66,
"deltaDisplay": "−25,66"
},
{
"key": "damage_per_match",
"label": "Damage per match",
"unit": "decimal",
"value": 4155.19,
"display": "4155,19",
"baseline": 4292.65,
"delta": -137.46,
"deltaDisplay": "−137,46"
}
]
},
{
"id": "style",
"title": "Elimination style",
"subtitle": "How the kills happen",
"metrics": [
{
"key": "kills_ads",
"label": "ADS",
"unit": "int",
"value": 6609,
"display": "6609",
"baseline": 5483,
"delta": 1126,
"deltaDisplay": "+1126"
},
{
"key": "kills_hipfire",
"label": "Hipfire",
"unit": "int",
"value": 2249,
"display": "2249",
"baseline": 1881,
"delta": 368,
"deltaDisplay": "+368"
},
{
"key": "kills_long_distance",
"label": "Long range",
"unit": "int",
"value": 1338,
"display": "1338",
"baseline": 1224,
"delta": 114,
"deltaDisplay": "+114"
},
{
"key": "kills_grenades",
"label": "Grenades",
"unit": "int",
"value": 197,
"display": "197",
"baseline": 170,
"delta": 27,
"deltaDisplay": "+27"
},
{
"key": "kills_melee",
"label": "Melee",
"unit": "int",
"value": 15,
"display": "15",
"baseline": 12,
"delta": 3,
"deltaDisplay": "+3"
},
{
"key": "kills_multi",
"label": "Multi-kills",
"unit": "int",
"value": 1127,
"display": "1127",
"baseline": 880,
"delta": 247,
"deltaDisplay": "+247"
},
{
"key": "kills_passenger",
"label": "Passenger",
"unit": "int",
"value": 1040,
"display": "1040",
"baseline": 448,
"delta": 592,
"deltaDisplay": "+592"
},
{
"key": "kills_vehicle",
"label": "Vehicle",
"unit": "int",
"value": 1707,
"display": "1707",
"baseline": 780,
"delta": 927,
"deltaDisplay": "+927"
},
{
"key": "kills_roadkills",
"label": "Roadkills",
"unit": "int",
"value": 35,
"display": "35",
"baseline": 24,
"delta": 11,
"deltaDisplay": "+11"
},
{
"key": "kills_human",
"label": "Against players",
"unit": "int",
"value": 11074,
"display": "11 074",
"baseline": 8570,
"delta": 2504,
"deltaDisplay": "+2504"
}
]
},
{
"id": "weapons",
"title": "Weapons",
"subtitle": "Career kills by type. Types at zero are omitted because those columns are often empty, not because the player has no kills there.",
"metrics": [
{
"key": "kills_smg",
"label": "SMGs",
"unit": "int",
"value": 2688,
"display": "2688",
"baseline": 2459,
"delta": 229,
"deltaDisplay": "+229"
},
{
"key": "kills_dmr",
"label": "DMRs",
"unit": "int",
"value": 504,
"display": "504",
"baseline": 229,
"delta": 275,
"deltaDisplay": "+275"
},
{
"key": "kills_shotguns",
"label": "Shotguns",
"unit": "int",
"value": 286,
"display": "286",
"baseline": 191,
"delta": 95,
"deltaDisplay": "+95"
}
]
},
{
"id": "support",
"title": "Support",
"subtitle": "Squad, gadgets and spotting",
"metrics": [
{
"key": "revives",
"label": "Revives",
"unit": "int",
"value": 953,
"display": "953",
"baseline": 793,
"delta": 160,
"deltaDisplay": "+160"
},
{
"key": "squadmate_revives",
"label": "Squad revives",
"unit": "int",
"value": 579,
"display": "579",
"baseline": 477,
"delta": 102,
"deltaDisplay": "+102"
},
{
"key": "heals",
"label": "Heals",
"unit": "int",
"value": 28119,
"display": "28 119",
"baseline": 22088,
"delta": 6031,
"deltaDisplay": "+6031"
},
{
"key": "resupplies",
"label": "Resupplies",
"unit": "int",
"value": 6425,
"display": "6425",
"baseline": 5001,
"delta": 1424,
"deltaDisplay": "+1424"
},
{
"key": "repairs",
"label": "Repairs",
"unit": "int",
"value": 26030,
"display": "26 030",
"baseline": 18139,
"delta": 7891,
"deltaDisplay": "+7891"
},
{
"key": "savior_kills",
"label": "Savior kills",
"unit": "int",
"value": 2266,
"display": "2266",
"baseline": 1885,
"delta": 381,
"deltaDisplay": "+381"
},
{
"key": "player_takedowns",
"label": "Takedowns",
"unit": "int",
"value": 44,
"display": "44",
"baseline": 44,
"delta": 0
},
{
"key": "gadgets_destroyed",
"label": "Gadgets destroyed",
"unit": "int",
"value": 1292,
"display": "1292",
"baseline": 864,
"delta": 428,
"deltaDisplay": "+428"
},
{
"key": "thrown_throwables",
"label": "Throwables thrown",
"unit": "int",
"value": 3438,
"display": "3438",
"baseline": 1667,
"delta": 1771,
"deltaDisplay": "+1771"
},
{
"key": "enemies_spotted",
"label": "Enemies spotted",
"unit": "int",
"value": 11376,
"display": "11 376",
"baseline": 8459,
"delta": 2917,
"deltaDisplay": "+2917"
}
]
},
{
"id": "objectives",
"title": "Objectives",
"subtitle": "Time on objective and actions",
"metrics": [
{
"key": "objective_time_total",
"label": "Objective time",
"unit": "duration",
"value": 104281,
"display": "28 h 58 min",
"baseline": 78862,
"delta": 25419,
"deltaDisplay": "+7 h 3 min"
},
{
"key": "objective_time_attacked",
"label": "Attacking",
"unit": "duration",
"value": 19749,
"display": "5 h 29 min",
"baseline": 14424,
"delta": 5325,
"deltaDisplay": "+1 h 28 min"
},
{
"key": "objective_time_defended",
"label": "Defending",
"unit": "duration",
"value": 62984,
"display": "17 h 29 min",
"baseline": 48322,
"delta": 14662,
"deltaDisplay": "+4 h 4 min"
},
{
"key": "objective_armed",
"label": "Armed",
"unit": "int",
"value": 64,
"display": "64",
"baseline": 52,
"delta": 12,
"deltaDisplay": "+12"
},
{
"key": "objective_captured",
"label": "Captured",
"unit": "int",
"value": 1394,
"display": "1394",
"baseline": 1000,
"delta": 394,
"deltaDisplay": "+394"
},
{
"key": "objective_neutralized",
"label": "Neutralized",
"unit": "int",
"value": 630,
"display": "630",
"baseline": 404,
"delta": 226,
"deltaDisplay": "+226"
},
{
"key": "objective_defused",
"label": "Defused",
"unit": "int",
"value": 8,
"display": "8",
"baseline": 7,
"delta": 1,
"deltaDisplay": "+1"
},
{
"key": "objective_destroyed",
"label": "Destroyed",
"unit": "int",
"value": 23,
"display": "23",
"baseline": 20,
"delta": 3,
"deltaDisplay": "+3"
}
]
},
{
"id": "inround",
"title": "In round",
"subtitle": "Totals inside a round",
"metrics": [
{
"key": "inround_kills",
"label": "In-round kills",
"unit": "int",
"value": 54,
"display": "54",
"baseline": 50,
"delta": 4,
"deltaDisplay": "+4"
},
{
"key": "inround_kills_headshots",
"label": "In-round headshots",
"unit": "int",
"value": 15,
"display": "15",
"baseline": 15,
"delta": 0
},
{
"key": "inround_kills_grenade",
"label": "In-round grenades",
"unit": "int",
"value": 5,
"display": "5",
"baseline": 5,
"delta": 0
},
{
"key": "inround_kills_melee",
"label": "In-round melee",
"unit": "int",
"value": 1,
"display": "1",
"baseline": 1,
"delta": 0
},
{
"key": "inround_kills_multi",
"label": "In-round multi-kills",
"unit": "int",
"value": 12,
"display": "12",
"baseline": 10,
"delta": 2,
"deltaDisplay": "+2"
},
{
"key": "inround_objective_armed",
"label": "In-round armed",
"unit": "int",
"value": 0,
"display": "0",
"baseline": 0,
"delta": 0
},
{
"key": "inround_objective_captured",
"label": "In-round captured",
"unit": "int",
"value": 0,
"display": "0",
"baseline": 0,
"delta": 0
},
{
"key": "inround_objective_neutralized",
"label": "In-round neutralized",
"unit": "int",
"value": 0,
"display": "0",
"baseline": 0,
"delta": 0
},
{
"key": "inround_objective_defused",
"label": "In-round defused",
"unit": "int",
"value": 0,
"display": "0",
"baseline": 0,
"delta": 0
},
{
"key": "inround_objective_destroyed",
"label": "In-round destroyed",
"unit": "int",
"value": 0,
"display": "0",
"baseline": 0,
"delta": 0
},
{
"key": "inround_damage_as_vehicle",
"label": "Damage as vehicle",
"unit": "int",
"value": 1006363,
"display": "1 006 363",
"baseline": 1006363,
"delta": 0
}
]
},
{
"id": "movement",
"title": "Movement and vehicles",
"subtitle": "Distance, vehicle damage and destructions",
"metrics": [
{
"key": "distance_foot",
"label": "On foot",
"unit": "distance",
"value": 1279358,
"display": "1279,4 km",
"baseline": 1006284,
"delta": 273074,
"deltaDisplay": "+273,1 km"
},
{
"key": "distance_passenger",
"label": "As passenger",
"unit": "distance",
"value": 926117,
"display": "926,1 km",
"baseline": 442091,
"delta": 484026,
"deltaDisplay": "+484 km"
},
{
"key": "distance_vehicle",
"label": "In a vehicle",
"unit": "distance",
"value": 2641834,
"display": "2641,8 km",
"baseline": 1342277,
"delta": 1299557,
"deltaDisplay": "+1299,6 km"
},
{
"key": "damage_passenger",
"label": "Passenger damage",
"unit": "int",
"value": 308094,
"display": "308 094",
"baseline": 137367,
"delta": 170727,
"deltaDisplay": "+170 727"
},
{
"key": "damage_vehicle_driver",
"label": "Driver damage",
"unit": "int",
"value": 1922513,
"display": "1 922 513",
"baseline": 1477041,
"delta": 445472,
"deltaDisplay": "+445 472"
},
{
"key": "damage_to_vehicle",
"label": "Damage to vehicles",
"unit": "int",
"value": 1155325,
"display": "1 155 325",
"baseline": 599036,
"delta": 556289,
"deltaDisplay": "+556 289"
},
{
"key": "vehicles_destroyed",
"label": "Vehicles destroyed",
"unit": "int",
"value": 426,
"display": "426",
"baseline": 181,
"delta": 245,
"deltaDisplay": "+245"
},
{
"key": "human_percentage",
"label": "PvP share",
"unit": "percent",
"value": 98.23,
"display": "98,2%",
"baseline": 98.38,
"delta": -0.15,
"deltaDisplay": "−0,1 pp"
}
]
},
{
"id": "xp",
"title": "Experience",
"subtitle": "XP breakdown from the latest import",
"metrics": [
{
"key": "xp_total",
"label": "Total XP",
"unit": "int",
"value": 16460236,
"display": "16 460 236",
"baseline": 11186395,
"delta": 5273841,
"deltaDisplay": "+5 273 841"
},
{
"key": "xp_performance",
"label": "Score XP",
"unit": "int",
"value": 4542680,
"display": "4 542 680",
"baseline": 3321045,
"delta": 1221635,
"deltaDisplay": "+1 221 635"
},
{
"key": "xp_accolades",
"label": "Accolade XP",
"unit": "int",
"value": 599300,
"display": "599 300",
"baseline": 449000,
"delta": 150300,
"deltaDisplay": "+150 300"
}
]
}
],
"weapons": {
"totalWeaponsUsed": 61,
"top": [
{
"name": "SCW-10",
"type": "SMG-PDWs",
"kills": 2060,
"headshotKills": 258,
"headshotsPercent": 12.52,
"accuracyPercent": 17.37,
"killsPerMinute": 1.2,
"damage": 229585,
"timeEquippedSeconds": 103380,
"importedAt": "2026-09-21T20:54:13"
},
{
"name": "KORD 6P67",
"type": "Assault Rifles",
"kills": 1128,
"headshotKills": 161,
"headshotsPercent": 14.27,
"accuracyPercent": 20.78,
"killsPerMinute": 0.85,
"damage": 135292,
"timeEquippedSeconds": 79868,
"importedAt": "2026-09-21T20:54:13"
},
{
"name": "M433",
"type": "Assault Rifles",
"kills": 566,
"headshotKills": 62,
"headshotsPercent": 10.95,
"accuracyPercent": 16.59,
"killsPerMinute": 0.92,
"damage": 69461,
"timeEquippedSeconds": 37065,
"importedAt": "2026-09-21T20:54:13"
},
{
"name": "DRS-IAR",
"type": "Machine Guns",
"kills": 541,
"headshotKills": 60,
"headshotsPercent": 11.09,
"accuracyPercent": 21.84,
"killsPerMinute": 0.73,
"damage": 84455,
"timeEquippedSeconds": 44488,
"importedAt": "2026-09-21T20:54:13"
},
{
"name": "M4A1",
"type": "Carbines",
"kills": 517,
"headshotKills": 78,
"headshotsPercent": 15.09,
"accuracyPercent": 15.73,
"killsPerMinute": 1.42,
"damage": 60013,
"timeEquippedSeconds": 21880,
"importedAt": "2026-09-21T20:54:13"
},
{
"name": "Mini Scout",
"type": "Rifles",
"kills": 418,
"headshotKills": 254,
"headshotsPercent": 60.77,
"accuracyPercent": 32.52,
"killsPerMinute": 0.59,
"damage": 63004,
"timeEquippedSeconds": 42505,
"importedAt": "2026-09-21T20:54:13"
},
{
"name": "RPK-74M",
"type": "Machine Guns",
"kills": 303,
"headshotKills": 59,
"headshotsPercent": 19.47,
"accuracyPercent": 19.7,
"killsPerMinute": 0.45,
"damage": 43657,
"timeEquippedSeconds": 40823,
"importedAt": "2026-09-21T20:54:13"
},
{
"name": "TR-7",
"type": "Assault Rifles",
"kills": 275,
"headshotKills": 37,
"headshotsPercent": 13.45,
"accuracyPercent": 14.8,
"killsPerMinute": 0.92,
"damage": 31091,
"timeEquippedSeconds": 17863,
"importedAt": "2026-09-21T20:54:13"
},
{
"name": "GRT-CPS",
"type": "DMRs",
"kills": 251,
"headshotKills": 50,
"headshotsPercent": 19.92,
"accuracyPercent": 24.87,
"killsPerMinute": 0.51,
"damage": 36919,
"timeEquippedSeconds": 29429,
"importedAt": "2026-09-21T20:54:13"
},
{
"name": "VCR-2",
"type": "Assault Rifles",
"kills": 191,
"headshotKills": 30,
"headshotsPercent": 15.71,
"accuracyPercent": 15.54,
"killsPerMinute": 0.7,
"damage": 23127,
"timeEquippedSeconds": 16282,
"importedAt": "2026-09-21T20:54:13"
},
{
"name": "SGX",
"type": "SMG-PDWs",
"kills": 190,
"headshotKills": 23,
"headshotsPercent": 12.11,
"accuracyPercent": 17.7,
"killsPerMinute": 0.84,
"damage": 21731,
"timeEquippedSeconds": 13610,
"importedAt": "2026-09-21T20:54:13"
},
{
"name": "SVK-8.6",
"type": "DMRs",
"kills": 168,
"headshotKills": 40,
"headshotsPercent": 23.81,
"accuracyPercent": 31.43,
"killsPerMinute": 0.4,
"damage": 29003,
"timeEquippedSeconds": 25299,
"importedAt": "2026-09-21T20:54:13"
},
{
"name": "CZ3A1",
"type": "SMG-PDWs",
"kills": 162,
"headshotKills": 25,
"headshotsPercent": 15.43,
"accuracyPercent": 17.54,
"killsPerMinute": 0.75,
"damage": 18187,
"timeEquippedSeconds": 12946,
"importedAt": "2026-09-21T20:54:13"
},
{
"name": "AK-205",
"type": "Carbines",
"kills": 158,
"headshotKills": 17,
"headshotsPercent": 10.76,
"accuracyPercent": 18.48,
"killsPerMinute": 1.42,
"damage": 19652,
"timeEquippedSeconds": 6671,
"importedAt": "2026-09-21T20:54:13"
},
{
"name": "PSR",
"type": "Rifles",
"kills": 148,
"headshotKills": 84,
"headshotsPercent": 56.76,
"accuracyPercent": 27.86,
"killsPerMinute": 0.48,
"damage": 20121,
"timeEquippedSeconds": 18625,
"importedAt": "2026-09-21T20:54:13"
}
],
"restByType": [
{
"type": "Machine Guns",
"weaponsCount": 7,
"kills": 340
},
{
"type": "Pistols",
"weaponsCount": 7,
"kills": 306
},
{
"type": "Shotguns",
"weaponsCount": 4,
"kills": 286
},
{
"type": "SMG-PDWs",
"weaponsCount": 7,
"kills": 276
},
{
"type": "Carbines",
"weaponsCount": 7,
"kills": 174
},
{
"type": "Assault Rifles",
"weaponsCount": 7,
"kills": 173
},
{
"type": "Rifles",
"weaponsCount": 3,
"kills": 141
},
{
"type": "DMRs",
"weaponsCount": 4,
"kills": 85
}
]
},
"weaponFeatures": [
{
"name": "SCW-10",
"type": "SMG-PDWs",
"sessionCount": 60,
"avgAccuracy": 16.65,
"avgKpm": 1.23,
"efficiency": 0.71,
"headshotEfficiency": 10.94,
"damagePerKill": 102.4,
"momentumPercent": -30.7,
"engineeredAt": "2026-09-26T09:00:02"
},
{
"name": "KORD 6P67",
"type": "Assault Rifles",
"sessionCount": 60,
"avgAccuracy": 19.95,
"avgKpm": 0.76,
"efficiency": 0.55,
"headshotEfficiency": 12.83,
"damagePerKill": 113.09,
"momentumPercent": -21.7,
"engineeredAt": "2026-09-26T09:00:02"
},
{
"name": "M433",
"type": "Assault Rifles",
"sessionCount": 60,
"avgAccuracy": 15.53,
"avgKpm": 0.86,
"efficiency": 0.45,
"headshotEfficiency": 10.16,
"damagePerKill": 114.37,
"momentumPercent": -28.5,
"engineeredAt": "2026-09-26T09:00:02"
},
{
"name": "M4A1",
"type": "Carbines",
"sessionCount": 60,
"avgAccuracy": 14.69,
"avgKpm": 1.33,
"efficiency": 0.53,
"headshotEfficiency": 14.08,
"damagePerKill": 108.32,
"momentumPercent": -28.5,
"engineeredAt": "2026-09-26T09:00:02"
},
{
"name": "DRS-IAR",
"type": "Machine Guns",
"sessionCount": 60,
"avgAccuracy": 21.96,
"avgKpm": 0.72,
"efficiency": 0.53,
"headshotEfficiency": 10.23,
"damagePerKill": 152.67,
"momentumPercent": -30.8,
"engineeredAt": "2026-09-26T09:00:02"
},
{
"name": "TR-7",
"type": "Assault Rifles",
"sessionCount": 60,
"avgAccuracy": 13.47,
"avgKpm": 0.93,
"efficiency": 0.49,
"headshotEfficiency": 13.18,
"damagePerKill": 105.89,
"momentumPercent": -33.1,
"engineeredAt": "2026-09-26T09:00:02"
},
{
"name": "AK-205",
"type": "Carbines",
"sessionCount": 60,
"avgAccuracy": 17.36,
"avgKpm": 1.33,
"efficiency": 0.43,
"headshotEfficiency": 9.75,
"damagePerKill": 116.18,
"momentumPercent": -28.5,
"engineeredAt": "2026-09-26T09:00:02"
},
{
"name": "Mini Scout",
"type": "Rifles",
"sessionCount": 25,
"avgAccuracy": 28.32,
"avgKpm": 0.5,
"efficiency": 3.71,
"headshotEfficiency": 49.43,
"damagePerKill": 129.58,
"momentumPercent": -20,
"engineeredAt": "2026-09-26T09:00:02"
},
{
"name": "PSR",
"type": "Rifles",
"sessionCount": 60,
"avgAccuracy": 23.36,
"avgKpm": 0.4,
"efficiency": 3.76,
"headshotEfficiency": 47.5,
"damagePerKill": 112.68,
"momentumPercent": -20.2,
"engineeredAt": "2026-09-26T09:00:02"
},
{
"name": "P18",
"type": "Pistols",
"sessionCount": 60,
"avgAccuracy": 28.74,
"avgKpm": 0.65,
"efficiency": 1.65,
"headshotEfficiency": 10.83,
"damagePerKill": 108.73,
"momentumPercent": -28.3,
"engineeredAt": "2026-09-26T09:00:02"
}
],
"history": {
"note": "Each point is a career snapshot from an import, not a single round. Values are cumulative or measured at that moment. The list was thinned evenly from 116 to 40 points; the first and last are always kept.",
"series": [
{
"key": "kills",
"label": "Kills"
},
{
"key": "deaths",
"label": "Deaths"
},
{
"key": "kill_death_ratio",
"label": "K/D"
},
{
"key": "kills_per_minute",
"label": "KPM"
},
{
"key": "wins",
"label": "Wins"
},
{
"key": "matches_played",
"label": "Matches"
},
{
"key": "win_percent",
"label": "Win %"
},
{
"key": "accuracy",
"label": "Accuracy %"
},
{
"key": "headshots",
"label": "Headshots"
},
{
"key": "headshots_percent",
"label": "Headshots %"
}
],
"points": [
{
"importedAt": "2026-05-01T09:00:18",
"kills": 8711,
"deaths": 7194,
"kill_death_ratio": 1.21,
"kills_per_minute": 0.75,
"wins": 337,
"matches_played": 661,
"win_percent": 51.14,
"accuracy": 28.65,
"headshots": 1330,
"headshots_percent": 15.27
},
{
"importedAt": "2026-05-05T09:00:27",
"kills": 8781,
"deaths": 7264,
"kill_death_ratio": 1.21,
"kills_per_minute": 0.74,
"wins": 340,
"matches_played": 668,
"win_percent": 51.05,
"accuracy": 28.65,
"headshots": 1343,
"headshots_percent": 15.29
},
{
"importedAt": "2026-05-10T09:00:14",
"kills": 8801,
"deaths": 7291,
"kill_death_ratio": 1.21,
"kills_per_minute": 0.74,
"wins": 340,
"matches_played": 669,
"win_percent": 50.97,
"accuracy": 28.62,
"headshots": 1347,
"headshots_percent": 15.31
},
{
"importedAt": "2026-05-13T09:00:37",
"kills": 8901,
"deaths": 7351,
"kill_death_ratio": 1.21,
"kills_per_minute": 0.74,
"wins": 345,
"matches_played": 677,
"win_percent": 51.11,
"accuracy": 28.71,
"headshots": 1359,
"headshots_percent": 15.27
},
{
"importedAt": "2026-05-17T09:00:32",
"kills": 8996,
"deaths": 7448,
"kill_death_ratio": 1.21,
"kills_per_minute": 0.72,
"wins": 348,
"matches_played": 689,
"win_percent": 50.66,
"accuracy": 28.81,
"headshots": 1366,
"headshots_percent": 15.18
},
{
"importedAt": "2026-05-20T09:00:06",
"kills": 8996,
"deaths": 7448,
"kill_death_ratio": 1.21,
"kills_per_minute": 0.72,
"wins": 348,
"matches_played": 689,
"win_percent": 50.66,
"accuracy": 28.81,
"headshots": 1366,
"headshots_percent": 15.18
},
{
"importedAt": "2026-05-23T09:00:16",
"kills": 9044,
"deaths": 7490,
"kill_death_ratio": 1.21,
"kills_per_minute": 0.73,
"wins": 348,
"matches_played": 692,
"win_percent": 50.43,
"accuracy": 28.8,
"headshots": 1370,
"headshots_percent": 15.15
},
{
"importedAt": "2026-05-27T09:00:08",
"kills": 9190,
"deaths": 7598,
"kill_death_ratio": 1.21,
"kills_per_minute": 0.72,
"wins": 352,
"matches_played": 707,
"win_percent": 49.93,
"accuracy": 28.85,
"headshots": 1396,
"headshots_percent": 15.19
},
{
"importedAt": "2026-06-01T09:00:10",
"kills": 9273,
"deaths": 7651,
"kill_death_ratio": 1.21,
"kills_per_minute": 0.71,
"wins": 356,
"matches_played": 714,
"win_percent": 50,
"accuracy": 28.99,
"headshots": 1408,
"headshots_percent": 15.18
},
{
"importedAt": "2026-06-05T09:00:40",
"kills": 9378,
"deaths": 7729,
"kill_death_ratio": 1.21,
"kills_per_minute": 0.71,
"wins": 360,
"matches_played": 724,
"win_percent": 49.86,
"accuracy": 29.08,
"headshots": 1422,
"headshots_percent": 15.16
},
{
"importedAt": "2026-06-07T09:00:05",
"kills": 9378,
"deaths": 7729,
"kill_death_ratio": 1.21,
"kills_per_minute": 0.71,
"wins": 360,
"matches_played": 724,
"win_percent": 49.86,
"accuracy": 29.08,
"headshots": 1422,
"headshots_percent": 15.16
},
{
"importedAt": "2026-06-12T09:00:26",
"kills": 9458,
"deaths": 7794,
"kill_death_ratio": 1.21,
"kills_per_minute": 0.7,
"wins": 365,
"matches_played": 736,
"win_percent": 49.73,
"accuracy": 29.3,
"headshots": 1433,
"headshots_percent": 15.15
},
{
"importedAt": "2026-06-17T09:00:19",
"kills": 9712,
"deaths": 7987,
"kill_death_ratio": 1.22,
"kills_per_minute": 0.69,
"wins": 377,
"matches_played": 767,
"win_percent": 49.28,
"accuracy": 29.28,
"headshots": 1476,
"headshots_percent": 15.2
},
{
"importedAt": "2026-06-20T09:00:59",
"kills": 9821,
"deaths": 8026,
"kill_death_ratio": 1.22,
"kills_per_minute": 0.69,
"wins": 383,
"matches_played": 778,
"win_percent": 49.36,
"accuracy": 29.58,
"headshots": 1494,
"headshots_percent": 15.21
},
{
"importedAt": "2026-06-23T09:00:25",
"kills": 9900,
"deaths": 8053,
"kill_death_ratio": 1.23,
"kills_per_minute": 0.69,
"wins": 384,
"matches_played": 781,
"win_percent": 49.29,
"accuracy": 29.59,
"headshots": 1497,
"headshots_percent": 15.12
},
{
"importedAt": "2026-06-26T09:00:30",
"kills": 9900,
"deaths": 8053,
"kill_death_ratio": 1.23,
"kills_per_minute": 0.69,
"wins": 384,
"matches_played": 781,
"win_percent": 49.29,
"accuracy": 29.59,
"headshots": 1497,
"headshots_percent": 15.12
},
{
"importedAt": "2026-06-29T09:00:59",
"kills": 9937,
"deaths": 8080,
"kill_death_ratio": 1.23,
"kills_per_minute": 0.69,
"wins": 386,
"matches_played": 783,
"win_percent": 49.42,
"accuracy": 29.58,
"headshots": 1509,
"headshots_percent": 15.19
},
{
"importedAt": "2026-07-02T09:00:07",
"kills": 10052,
"deaths": 8146,
"kill_death_ratio": 1.23,
"kills_per_minute": 0.69,
"wins": 390,
"matches_played": 792,
"win_percent": 49.37,
"accuracy": 29.58,
"headshots": 1520,
"headshots_percent": 15.12
},
{
"importedAt": "2026-07-07T09:00:59",
"kills": 10276,
"deaths": 8295,
"kill_death_ratio": 1.24,
"kills_per_minute": 0.69,
"wins": 397,
"matches_played": 813,
"win_percent": 48.95,
"accuracy": 29.81,
"headshots": 1555,
"headshots_percent": 15.13
},
{
"importedAt": "2026-07-11T09:00:15",
"kills": 10309,
"deaths": 8331,
"kill_death_ratio": 1.24,
"kills_per_minute": 0.68,
"wins": 399,
"matches_played": 818,
"win_percent": 48.9,
"accuracy": 29.81,
"headshots": 1561,
"headshots_percent": 15.14
},
{
"importedAt": "2026-07-15T09:00:56",
"kills": 10309,
"deaths": 8331,
"kill_death_ratio": 1.24,
"kills_per_minute": 0.68,
"wins": 399,
"matches_played": 818,
"win_percent": 48.9,
"accuracy": 29.81,
"headshots": 1561,
"headshots_percent": 15.14
},
{
"importedAt": "2026-07-18T09:00:07",
"kills": 10309,
"deaths": 8331,
"kill_death_ratio": 1.24,
"kills_per_minute": 0.68,
"wins": 399,
"matches_played": 818,
"win_percent": 48.9,
"accuracy": 29.81,
"headshots": 1561,
"headshots_percent": 15.14
},
{
"importedAt": "2026-07-23T09:00:40",
"kills": 10434,
"deaths": 8410,
"kill_death_ratio": 1.24,
"kills_per_minute": 0.68,
"wins": 404,
"matches_played": 830,
"win_percent": 48.79,
"accuracy": 29.88,
"headshots": 1582,
"headshots_percent": 15.16
},
{
"importedAt": "2026-07-26T09:00:06",
"kills": 10541,
"deaths": 8481,
"kill_death_ratio": 1.24,
"kills_per_minute": 0.68,
"wins": 411,
"matches_played": 841,
"win_percent": 48.99,
"accuracy": 29.93,
"headshots": 1597,
"headshots_percent": 15.15
},
{
"importedAt": "2026-07-29T09:00:23",
"kills": 10566,
"deaths": 8502,
"kill_death_ratio": 1.24,
"kills_per_minute": 0.68,
"wins": 413,
"matches_played": 844,
"win_percent": 49.05,
"accuracy": 29.98,
"headshots": 1601,
"headshots_percent": 15.15
},
{
"importedAt": "2026-08-02T09:00:11",
"kills": 10724,
"deaths": 8623,
"kill_death_ratio": 1.24,
"kills_per_minute": 0.67,
"wins": 423,
"matches_played": 861,
"win_percent": 49.24,
"accuracy": 29.87,
"headshots": 1622,
"headshots_percent": 15.12
},
{
"importedAt": "2026-08-05T09:00:15",
"kills": 10793,
"deaths": 8702,
"kill_death_ratio": 1.24,
"kills_per_minute": 0.67,
"wins": 427,
"matches_played": 868,
"win_percent": 49.31,
"accuracy": 29.85,
"headshots": 1639,
"headshots_percent": 15.19
},
{
"importedAt": "2026-08-09T09:00:22",
"kills": 10817,
"deaths": 8742,
"kill_death_ratio": 1.24,
"kills_per_minute": 0.67,
"wins": 427,
"matches_played": 872,
"win_percent": 49.08,
"accuracy": 29.79,
"headshots": 1643,
"headshots_percent": 15.19
},
{
"importedAt": "2026-08-12T09:00:06",
"kills": 10883,
"deaths": 8816,
"kill_death_ratio": 1.23,
"kills_per_minute": 0.67,
"wins": 432,
"matches_played": 881,
"win_percent": 49.15,
"accuracy": 29.76,
"headshots": 1655,
"headshots_percent": 15.21
},
{
"importedAt": "2026-08-15T09:00:06",
"kills": 10883,
"deaths": 8816,
"kill_death_ratio": 1.23,
"kills_per_minute": 0.67,
"wins": 432,
"matches_played": 881,
"win_percent": 49.15,
"accuracy": 29.76,
"headshots": 1655,
"headshots_percent": 15.21
},
{
"importedAt": "2026-08-18T09:00:06",
"kills": 10883,
"deaths": 8816,
"kill_death_ratio": 1.23,
"kills_per_minute": 0.67,
"wins": 432,
"matches_played": 881,
"win_percent": 49.15,
"accuracy": 29.76,
"headshots": 1655,
"headshots_percent": 15.21
},
{
"importedAt": "2026-08-21T09:00:07",
"kills": 10940,
"deaths": 8863,
"kill_death_ratio": 1.23,
"kills_per_minute": 0.66,
"wins": 435,
"matches_played": 889,
"win_percent": 49.04,
"accuracy": 30.02,
"headshots": 1658,
"headshots_percent": 15.16
},
{
"importedAt": "2026-08-28T09:00:01",
"kills": 10940,
"deaths": 8863,
"kill_death_ratio": 1.23,
"kills_per_minute": 0.66,
"wins": 435,
"matches_played": 889,
"win_percent": 49.04,
"accuracy": 30.02,
"headshots": 1658,
"headshots_percent": 15.16
},
{
"importedAt": "2026-08-31T09:00:07",
"kills": 11063,
"deaths": 8946,
"kill_death_ratio": 1.24,
"kills_per_minute": 0.66,
"wins": 436,
"matches_played": 898,
"win_percent": 48.66,
"accuracy": 30.24,
"headshots": 1665,
"headshots_percent": 15.05
},
{
"importedAt": "2026-09-03T09:00:07",
"kills": 11124,
"deaths": 8993,
"kill_death_ratio": 1.24,
"kills_per_minute": 0.65,
"wins": 439,
"matches_played": 906,
"win_percent": 48.56,
"accuracy": 30.61,
"headshots": 1667,
"headshots_percent": 14.99
},
{
"importedAt": "2026-09-06T09:00:12",
"kills": 11124,
"deaths": 8993,
"kill_death_ratio": 1.24,
"kills_per_minute": 0.65,
"wins": 439,
"matches_played": 906,
"win_percent": 48.56,
"accuracy": 30.61,
"headshots": 1667,
"headshots_percent": 14.99
},
{
"importedAt": "2026-09-10T09:00:08",
"kills": 11165,
"deaths": 9034,
"kill_death_ratio": 1.24,
"kills_per_minute": 0.64,
"wins": 443,
"matches_played": 913,
"win_percent": 48.63,
"accuracy": 30.71,
"headshots": 1673,
"headshots_percent": 14.98
},
{
"importedAt": "2026-09-13T09:00:03",
"kills": 11165,
"deaths": 9034,
"kill_death_ratio": 1.24,
"kills_per_minute": 0.64,
"wins": 443,
"matches_played": 913,
"win_percent": 48.63,
"accuracy": 30.71,
"headshots": 1673,
"headshots_percent": 14.98
},
{
"importedAt": "2026-09-21T09:00:03",
"kills": 11273,
"deaths": 9131,
"kill_death_ratio": 1.23,
"kills_per_minute": 0.64,
"wins": 448,
"matches_played": 924,
"win_percent": 48.59,
"accuracy": 31.08,
"headshots": 1686,
"headshots_percent": 14.96
},
{
"importedAt": "2026-09-25T09:00:03",
"kills": 11273,
"deaths": 9131,
"kill_death_ratio": 1.23,
"kills_per_minute": 0.64,
"wins": 448,
"matches_played": 924,
"win_percent": 48.59,
"accuracy": 31.08,
"headshots": 1686,
"headshots_percent": 14.96
}
]
}
}
}
