ADATEL Mail Triage — Thread State & Lifecycle v2
Ovaj skill je namenjen isključivo nalogu
vladimir.pavlovic@adatel.rs (Business / Codex). Radi nad poslovnim Gmail nitima,
ne nad izolovanim porukama. Primarni zadatak je da rekonstruiše trenutno poslovno
stanje niti, objasni promenu i predloži proverljivu sledeću akciju.
Scope i sigurnosna pravila
- Pre čitanja ili izmene proveri da je aktivni nalog
vladimir.pavlovic@adatel.rs. Ako nije, zaustavi se i prijavi mismatch. - Ne šalji mail, ne kreiraj draft, ne menjaj read/unread, label ili Drive sadržaj bez eksplicitnog zahteva korisnika.
- Klasifikacija nije dokaz izvršenja, potpisa, odobrenja, fakturisanja ili plaćanja. Svaki takav zaključak mora imati eksplicitni signal u niti ili povezanom dokumentu.
- Ne nagađaj činjenice, odgovornost, nameru, rok ili autoritet. Koristi
UNKNOWNkada dokaz nije dovoljan. - Citiraj signal kratkim neutralnim opisom; ne reprodukuj nepotrebne lične ili poverljive podatke.
- Jedna poslovna nit je jedna jedinica triage-a, čak i kada sadrži mnogo poruka.
Režimi
Podržani režimi:
STANDARD_TRIAGE— kompletno stanje i delta po poslovnoj niti.UNREAD_REVIEW— kuriranje unread niti uz stabilne redne brojeve.MEETING_PACK— Client/Partner Meeting Pack izveden iz istog thread state-a.
Ako korisnik ne navede režim, koristi STANDARD_TRIAGE. Ne mešaj rezultate
različitih režima bez jasnih odeljaka.
Pipeline
Korake izvršavaj ovim redom:
- potvrdi nalog i opseg pretrage;
- prikupi sve poruke kandidata, Gmail metadata i dostupne priloge/linkove;
- grupiši poruke u poslovne niti;
- sortiraj svaku nit hronološki;
- izdvoji događaje i činjenice sa izvorom;
- redukuj ceo tok u thread state;
- primeni readiness, lifecycle, billing, responsibility i dispute pravila;
- odredi prioritet, blocker i sledeću akciju;
- renderuj izlaz iz reduciranog stanja;
- tek na eksplicitan zahtev izvrši dozvoljene mutacije uz mark-read safety gate.
Poslednji mail nikada ne zamenjuje niti briše raniji kontekst. On samo dodaje, menja, rešava ili osporava činjenice koje se mogu povezati sa dokazom.
Grupisanje poslovnih niti
Primarni ključ
Koristi Gmail threadId kada postoji. Prosleđivanje, odgovor i promena subject
prefiksa (Re:, Fwd:) ostaju u istoj Gmail niti.
Minimax grouping guard
Zadrži postojeći Minimax princip: napravi najmanji broj grupa koji sprečava mešanje različitih poslovnih tema.
- Spoji poruke samo kada postoji jak strukturni signal: isti
threadId, isti KIR/card/order broj, ista lokacija/element uz kontinuirani posao, ili eksplicitna referenca na prethodnu poruku. - Ne spajaj samo zbog istog pošiljaoca, klijenta, regiona ili sličnog subject-a.
- Razdvoji jednu Gmail nit u više poslovnih tema samo kada postoje nezavisni scope, lokacija i akcija bez zajedničkog ishoda.
- Kada je grupisanje neizvesno, zadrži Gmail nit i dodaj
grouping_confidence: LOW; ne stvaraj lažnu preciznost. - U jednom run-u jednom izračunat
business_thread_keyostaje stabilan:threadId, inače najjači dokument/lokacija ključ, inače deterministički hash normalizovanog subject-a i prvog message ID-a.
Thread State Reducer
Obavezni događaj po poruci
Za svaku poruku hronološki izvedi:
message_event:
message_id: string
timestamp: RFC3339
actor: ADATEL | DOT | TELEKOM | OTHER | UNKNOWN
asserted_facts: []
changed_facts: []
resolved_facts: []
disputed_facts: []
requests: []
commitments: []
evidence_refs: []
Fact mora imati predmet i status, na primer:
fact:
key: scope.quantity
value: 6
status: ASSERTED | CONFIRMED | DISPUTED | SUPERSEDED | RESOLVED
source_message_id: string
confidence: HIGH | MEDIUM | LOW
Nova vrednost istog fact key-a ne briše staru. Obeleži staru vrednost kao
SUPERSEDED, poveži je sa novim source message ID-em i prikaži thread delta.
Kontradikcija bez jasnog autoritativnog razrešenja ostaje DISPUTED.
Reducer akumulator
Za svaku nit vrati najmanje:
thread_state:
business_thread_key: string
topic: string
previous_state: WORK_LIFECYCLE
new_state: WORK_LIFECYCLE
state_change: string
new_fact: []
resolved_fact: []
superseded_fact: []
disputed_fact: []
remaining_blocker: []
next_action:
owner: ADATEL | DOT | TELEKOM | SHARED | UNKNOWN
action: string
dependency: string | null
flags: []
responsibility: []
evidence_refs: []
previous_state je stanje neposredno pre najnovijeg relevantnog događaja,
ne stanje iz prvog maila. new_state je stanje nakon primene tog događaja.
Ako poslednja poruka nema poslovni delta, previous_state == new_state i
state_change: NO_CHANGE.
new_fact sadrži samo činjenice prvi put uvedene ili sada potvrđene.
resolved_fact sadrži blocker/dispute koji je eksplicitno zatvoren.
remaining_blocker se ponovo računa iz svih aktivnih činjenica, ne samo iz
poslednje poruke.
Precedence pravila
- Eksplicitno novije razrešenje istog pitanja nadjačava raniju pretpostavku.
- Potvrđen dokument nadjačava neformalnu procenu, ali ne dokazuje događaj koji dokument ne pokriva.
- Eksplicitno prihvatanje odluke ostaje prihvaćeno čak i ako poruka otvara drugi operativni dispute.
- Urgency signal utiče na flag/prioritet, nikada sam na readiness.
- Client escalation ne dokazuje krivicu izvođača.
- Tišina, nedostatak odgovora i CC lista nisu dokaz saglasnosti ili odgovornosti.
Work lifecycle
Dozvoljena osnovna stanja su:
| State | Uslov |
|---|---|
NEW |
Nit je nova; nema dovoljno podataka za dalji status. |
INFO_MISSING |
Obavezni operativni input nedostaje, ali nije potvrđen spoljašnji hard blocker. |
READY_TO_WORK |
Svi primenljivi readiness gate uslovi su potvrđeni. |
IN_PROGRESS |
Postoji eksplicitan dokaz da je fizički/operativni rad počeo. |
EXECUTED_PENDING_CLOSEOUT |
Fizički rad je završen, ali closeout/potpis/broj/log nije kompletan. |
DOCUMENTATION_INCOMPLETE |
Dokumentacija je delimično primljena ili potvrđeno nedostaje. |
DOCUMENTATION_COMPLETE |
Sva propisana prateća dokumentacija je potvrđena. |
READY_TO_INVOICE |
Billing gate je ispunjen ili postoji eksplicitno ovlašćenje za račun. |
INVOICED |
Postoji eksplicitan dokaz da je račun izdat/poslat. |
CLOSED |
Poslovna nit je eksplicitno zatvorena; nema otvorene akcije. |
Stanja nisu prost linearni timestamp. Ako novi dokaz otkrije ranije skriveni
blocker, stanje može nazadovati uz obavezno objašnjenje state_change.
PAID je billing state; kada je potvrđen i nema drugih otvorenih pitanja,
work lifecycle može biti CLOSED.
Paralelni flags
Dozvoljeni flagovi:
URGENTBLOCKEDDISPUTEDON_HOLDCLIENT_ESCALATIONCOMMERCIAL_RISKAUTHORITY_CONFLICT
Flag ne zamenjuje lifecycle. Na primer:
INFO_MISSING + URGENT, IN_PROGRESS + BLOCKED i
EXECUTED_PENDING_CLOSEOUT + DISPUTED su validne kombinacije.
Ukloni flag samo kada postoji eksplicitan dokaz da je razlog završen. Zabeleži
ga u resolved_fact.
Ready-to-work gate
URGENT != READY_TO_WORK.
Pre READY_TO_WORK proveri sve primenljive stavke:
| Gate | Prihvatljiv dokaz |
|---|---|
| KIR / radni dokument | identifikovan dokument, broj ili potvrda da je izdat |
| Jednoznačan scope | element i rad bez kontradiktornih instrukcija |
| Količina | aktuelna količina eksplicitno potvrđena |
| Lokacija / element | dovoljno precizni za izvršenje |
| Materijal | raspoloživost/vrsta potvrđeni ili označeno da nije potreban |
| Pristup / mehanizacija | mogući i usaglašeni ili označeno da nisu potrebni |
| Telekom/client support | vlasnik i termin poznati ili potvrđeno da nije potreban |
| Prioritet i authority | nema otvorenog konflikta ko raspoređuje ekipu |
Za svaku stavku vrati PASS, FAIL ili N/A i evidence ref. UNKNOWN tretiraj
kao FAIL, ne kao implicitni prolaz.
- Nedostajući input bez potvrđenog spoljnog blokera:
INFO_MISSING. - Potvrđen hard blocker: odgovarajuće lifecycle stanje +
BLOCKED. - Konflikt instrukcija/autoriteta:
AUTHORITY_CONFLICT; ne proglasiREADY_TO_WORKdok nije razrešen. - Urgent zahtev sa nepotpunim scope-om ostaje
INFO_MISSING + URGENT.
Billing state
Billing vodi kao odvojene, kumulativne činjenice:
billing_state:
work_executed: CONFIRMED | NOT_CONFIRMED
signed: CONFIRMED | NOT_CONFIRMED
documentation_complete: CONFIRMED | NOT_CONFIRMED
ready_to_invoice: CONFIRMED | NOT_CONFIRMED
invoiced: CONFIRMED | NOT_CONFIRMED
paid: CONFIRMED | NOT_CONFIRMED
evidence_refs: []
Pravila:
WORK_EXECUTEDne impliciraSIGNED.SIGNEDne impliciraDOCUMENTATION_COMPLETE.DOCUMENTATION_COMPLETEne implicira automatskiREADY_TO_INVOICEkada je potrebno dodatno komercijalno odobrenje.- Potpisana KIR kartica ili grupni nalog bez obavezne Excel/supporting
dokumentacije daje
DOCUMENTATION_INCOMPLETE, neREADY_TO_INVOICE. - Eksplicitno ovlašćenje poput „Možete poslati račun” je jak signal
READY_TO_INVOICE, osim ako je u istoj ili kasnijoj poruci povučeno/uslovljeno. INVOICEDzahteva dokaz slanja/izdavanja računa, ne samo spremnost.PAIDzahteva potvrdu uplate/knjiženja, ne samo odsustvo prigovora.- Uvek sačuvaj odvojene evidence refs za svaki billing korak.
Responsibility attribution
Za svaki aktivni blocker klasifikuj:
blocker:
type: EXECUTION_FAILURE | MISSING_INPUT | DOCUMENTATION_DELAY | APPROVAL_DELAY | MATERIAL_BLOCKER | ACCESS_BLOCKER | CONFLICTING_PRIORITY_AUTHORITY
responsible_party: ADATEL | DOT | TELEKOM | SHARED | UNKNOWN
evidence_ref: string
rationale: string
Attribution pravila:
- Dodeli stranu samo kada poruka/dokument direktno povezuje njenu obavezu i neizvršeni korak.
- Kada dve strane imaju zavisne otvorene obaveze, koristi
SHARED. - Kada se zna da blocker postoji, ali ne i čija je ugovorna/operativna obaveza,
koristi
UNKNOWN. - Razdvoji
EXECUTION_FAILUREodMISSING_INPUT; nemogućnost početka zbog nedostajućeg inputa nije automatski neuspeh izvođača. - Razdvoji fizičko izvršenje od
DOCUMENTATION_DELAYiAPPROVAL_DELAY. - Client escalation dodaje
CLIENT_ESCALATION, ali ne menja attribution bez dokaza. - Konflikt direktnog field prioriteta i formalnog client-supervision rasporeda
daje
CONFLICTING_PRIORITY_AUTHORITY,AUTHORITY_CONFLICTiSHAREDiliUNKNOWN, zavisno od dokaza.
Dispute extraction
Za strateške, komercijalne i eskalacione niti obavezno vrati:
dispute:
accepted_facts: []
disputed_facts: []
resolved_issues: []
open_issues: []
decision_already_accepted: []
requested_exception_or_carve_out: []
Razloži složenu poruku na atomic claims. „Prihvatamo stop novih radova, ali lokacija X iz postojećeg naloga nije završena” znači:
- strateška odluka o novim radovima:
ACCEPTED; - postojeća lokacija X:
OPEN/DISPUTED; - poruka nije odbijanje strateške odluke;
- zahtev da se X tretira odvojeno može biti
requested_exception_or_carve_out.
Ne sažimaj celu nit kao „partner odbija odluku” ako je glavni decision eksplicitno prihvaćen. Rešen issue ne vraćaj u open bez novog kontradiktornog dokaza.
Drive structural signals
Drive signal dopunjuje thread state, ali ne zamenjuje poslovni dokaz.
- Zabeleži tip, naziv, lokaciju, owner-a, version/modified metadata i vezu sa thread key-em kada su dostupni.
- Postojanje fajla dokazuje samo da fajl postoji, ne da je potpisan, kompletan ili odobren.
- Strukturni obrazac foldera može podići confidence grupisanja, ali ne sme sam zaključiti lifecycle ili billing state.
- Nedostajući očekivani fajl je signal za proveru;
DOCUMENTATION_INCOMPLETEpostavi tek kada zahtev/obrazac jasno pokazuje da je fajl obavezan. - Ne premeštaj, preimenuj, deli niti menjaš Drive dokumente bez eksplicitnog zahteva.
Compliance qualification
Pre visokorizičnog zaključka navedi kvalifikator:
VERIFIED— direktan eksplicitni dokaz;SUPPORTED— više saglasnih posrednih signala;UNVERIFIED— nema dovoljno dokaza;CONFLICTING— izvori se ne slažu.
Compliance/legal/contractual tvrdnje bez izvornog dokumenta ostaju
UNVERIFIED. Ne pretvaraj operativnu formulaciju u pravno priznanje krivice,
waiver, acceptance ili ugovornu obavezu. Surface-uj rok, vlasnika i rizik samo
kada su eksplicitni.
Prioritet i next action
Prioritet odredi odvojeno od lifecycle-a:
P0— bezbednost, zakonski/compliance rok ili potvrđen neposredan veliki poslovni prekid;P1— urgent/client escalation, blokiran aktivni rad ili neposredan commercial risk;P2— redovna operativna akcija, dokumentacija ili odobrenje;P3— informativno/watch bez trenutne akcije.
next_action mora biti jedna konkretna proverljiva radnja, sa owner-om i
zavisnošću. Ako owner nije dokazan, koristi UNKNOWN i napiši da treba potvrditi
vlasnika. Ne izmišljaj rok.
STANDARD_TRIAGE output
Prvo prikaži sažetak:
| # | Topic/thread | Priority | Previous → New | Flags | Remaining blocker | Next action |
|---|
Zatim za svaku nit prikaži:
business_thread_keyi obuhvaćene poruke;previous_state,new_state,state_change;new_fact,resolved_fact,superseded_fact,remaining_blocker;- readiness gate tabelu kada rad još nije počeo;
- billing state kada je izvršenje/dokumentacija/račun relevantan;
- responsibility attribution za svaki blocker;
- dispute extraction za strateške/eskalacione niti;
next_actioni ključne evidence refs;- confidence/compliance qualifier za neizvesne tvrdnje.
Jedan broj pripada jednoj poslovnoj niti. Koristi isti redosled u svim detaljnim sekcijama tog run-a.
UNREAD_REVIEW mode
Output mora biti tačno:
| # | Topic/thread | Priority | State | Why keep unread | Action |
|---|
Dozvoljeni Action enum:
KEEP_UNREAD— postoji konkretna neizvršena akcija korisnika/ADATEL-a ili neposredan P0/P1 blocker koji zahteva pažnju;WATCH— akcija je kod druge strane, ali nit ima otvoren rizik/dependency;READ_CLOSE— nema otvorene akcije ni razloga za aktivno praćenje.
Pravila:
- Jedna poslovna nit = jedan red, bez obzira na broj unread poruka.
- Brojeve dodeli jednom nakon konačnog sortiranja (priority, zatim najnoviji
relevantni događaj, zatim
business_thread_key) i zamrzni ih do kraja run-a. - Nova poruka u već numerisanoj niti ne dobija novi broj u istom run-u.
Why keep unreadmora navesti aktivnu akciju/blocker, ne samo „važno”.- Za
READ_CLOSEkoristiWhy keep unread: —. - Predloženi
READ_CLOSEnije dozvola za mark-read.
Mark-read safety
Pre bilo kakvog mark-read poziva:
- zahtev mora biti eksplicitan;
- prikaži tačan konačan skup thread ID-eva i pripadajuće
READ_CLOSEredove; - isključi
KEEP_UNREAD,WATCH, nepoznato i sve što nije prikazano korisniku; - menjaj stanje na nivou niti da ne ostanu skrivene unread poruke;
- neposredno pre mutacije ponovo proveri da nije stigla nova poruka;
- ako se nit promenila, preskoči je i prijavi razlog;
- izvrši najmanju potrebnu mutaciju i vrati rezultat po thread ID-u.
Nikada ne koristi broad query kao mutacioni skup. Ne markiraj sve rezultate kao pročitane zato što je triage završen.
Client/Partner Meeting Pack
MEETING_PACK se izvodi iz već reduciranih thread state-ova; ne radi novu,
nekonzistentnu klasifikaciju.
Paket sadrži:
- odluke već prihvaćene;
- otvorene odluke i dispute;
- workstream tabelu: lifecycle, flags, blocker, responsibility;
- dokumentaciju i billing pipeline;
- requested exceptions/carve-outs;
- akcije po owner-u (
ADATEL,DOT,TELEKOM,SHARED,UNKNOWN); - authority conflicts i commercial/compliance risks;
- kratke evidence refs za svaku tačku.
Ne predstavljaj open issue kao dogovorenu odluku i ne vraćaj prihvaćenu odluku u pregovore samo zato što postoji povezana operativna žalba.
Anonimizovani regression fixtures
Ovi fixture-i su normativni acceptance testovi. Svaka buduća izmena skill-a mora zadržati očekivane rezultate.
TEST A — urgent scope mutates
Chronology
- P1: urgent zahtev za zamenu 3 drvena stuba.
- P2: elementi se menjaju na betonske.
- P3: količina se menja na 6 stubova.
- P4: KIR/kartica još nije izdata.
- P5: potvrđeno je izvršenje svih 6 betonskih stubova.
Expected
- istorija čuva
3 woodenkaoSUPERSEDED, ne kao važeći scope; - važeći scope pre izvršenja je
6 concrete; - P1 ne daje
READY_TO_WORKsamo zbogURGENT; - P4 pokazuje blocker za radni dokument;
- P5 daje najmanje
WORK_EXECUTED; lifecycle jeEXECUTED_PENDING_CLOSEOUTdok closeout nije potvrđen; - thread delta prepoznaje svaku mutaciju scope-a.
TEST B — CAV ready for invoice
Chronology
- Kartica je usaglašena.
- Materijal je razdužen.
- Partner piše: „Možete poslati račun.”
Expected
- billing
ready_to_invoice: CONFIRMED; - lifecycle
READY_TO_INVOICE; - kartica i razduženje ostaju zasebni evidence refs;
- nema implicitnog
INVOICEDnitiPAID.
TEST C — signed but incomplete
Chronology
- Primljeni su potpisani KIR i grupni nalog.
- Potvrđeno je da nedostaju grupni Excel i supporting dokumentacija.
Expected
- billing
signed: CONFIRMED; - billing
documentation_complete: NOT_CONFIRMED; - lifecycle
DOCUMENTATION_INCOMPLETE; - nije
READY_TO_INVOICE.
TEST D — strategic stop + operational dispute
Chronology
- ADATEL najavljuje stop novih regionalnih radova.
- Partner eksplicitno prihvata odluku, ali osporava status nezavršene postojeće lokacije L-17 i traži da se ona završi.
Expected
- strateška stop odluka je u
decision_already_accepted; - lokacija L-17 je u
open_issuesidisputed_facts; - L-17 može biti
requested_exception_or_carve_out; - rezultat ne tumači poruku kao odbijanje strateške odluke.
TEST E — work executed but closeout missing
Chronology
- Fizički rad je potvrđeno završen.
- Kartica čeka zvanični broj.
- Dnevni log čeka potpis.
Expected
- billing
work_executed: CONFIRMED; - lifecycle
EXECUTED_PENDING_CLOSEOUT; - official number i log signature su odvojeni remaining blockers;
- nije
DOCUMENTATION_COMPLETEnitiREADY_TO_INVOICE.
TEST F — authority conflict
Chronology
- Partner koordinator direktno daje terenski prioritet ekipi.
- Interni koordinator navodi da raspored ekipe dolazi od client supervision-a.
- Nema dokaza ko ima konačni autoritet za ovaj nalog.
Expected
- flag
AUTHORITY_CONFLICT; - blocker type
CONFLICTING_PRIORITY_AUTHORITY; - responsibility
SHAREDako su potvrđene međuzavisne obaveze, inačeUNKNOWN; - nije automatski contractor/ADATEL fault;
- nije
READY_TO_WORKdok authority nije razrešen.
Regression guardovi
Pored testova A–F, svaka validacija mora potvrditi:
- Minimax grouping ne spaja različite poslovne teme;
- Drive strukturni signal ne postaje lažni dokaz potpisa/kompletnosti;
- compliance qualification ne daje pravni zaključak bez dokaza;
- Meeting Pack čuva accepted-vs-open razdvajanje;
- mark-read se ne izvršava bez eksplicitnog zahteva i ponovne provere niti;
- urgency nikada sama ne prolazi readiness gate;
- potpis nikada sam ne dokazuje billing readiness.
Validation procedure
Pošto je skill prozni rule engine, validiraj ga fixture-by-fixture:
- redukuj poruke hronološki;
- zabeleži očekivani i dobijeni lifecycle, flags, facts, billing i responsibility;
- zahtevaj potpuno poklapanje normativnih assertions iz testova A–F;
- pokreni postojeće repo testove ako test harness postoji;
- pokreni regression guardove iz prethodnog odeljka;
- prijavi svako odstupanje; ne menjaj expected rezultat da bi test prošao.
Changelog
v2.0.0 — 2026-08-20
- uveden thread-state reducer sa istorijom facts i explicitnim state delta;
- razdvojeni readiness i urgency;
- razdvojeni work, signature, documentation, invoice i payment billing signali;
- uvedena evidence-based responsibility attribution po blocker tipu;
- dispute model razdvaja prihvaćene odluke od otvorenih pitanja;
- dodat
UNREAD_REVIEWsa deduplikacijom niti i stabilnim brojevima; - dodati anonimizovani real-world regression fixture-i A–F;
- očuvani guardovi za Minimax grouping, Drive structural signals, compliance qualification, Client/Partner Meeting Pack i mark-read safety.