Tovább a tartalomhoz

Jegyéletciklus

Állapot Tárolt érték Leírás
backlog backlog Rögzítve, de még nincs az aktív sorba beosztályozva
open open Beosztályozva és munkára kész, de még nem kezdődött el
inProgress inProgress Aktívan dolgoznak rajta
blocked blocked Elkezdődött, de valami külső dolog blokkolja
inReview inReview A munka kész, átnézésre vár
done done Sikeresen befejeződött (végállapot)
failed failed Hibával fejeződött be (végállapot)
cancelled cancelled Elhagyva (végállapot)

Az állapotértékek camelCase formában tárolódnak (inProgress, inReview), soha nem in_progress alakban. A null tárolt érték open értékként értelmeződik; egy ismeretlen érték kivételt dob a kényszerített átalakítás helyett.

A tryParseLoose elfogadja az ügynök által megadott álneveket, figyelmen kívül hagyva a kis- és nagybetűket, valamint a - / _ / szóköz karaktereket:

Állapot Elfogadott álnevek
open todo, ready, pending, new
inProgress doing, started, active, wip
blocked stuck
inReview review, reviewing
done closed, complete, completed, finished
failed error, errored
cancelled canceled, abandoned, dropped
backlog ──→ open ──→ inProgress ──→ inReview ──→ done
│ │ │
│ └──→ failed ┘
└──→ blocked ──→ inProgress
Any non-terminal status ──→ cancelled; inReview ──→ failed

Ez a gráf csak az ügynököket és az automatizálást köti. A TicketWorkflowService.transitionStatus akkor ellenőrzi, amikor a force értéke false — az MCP-eszközök és a reconcilerek esetében. Egy szabálytalan átmenet ott naplózódik és figyelmen kívül marad. A felületen minden felhasználó által kezdeményezett állapotváltozás force: true értéket ad át, és teljesen megkerüli a gráfot, így egy ember a jegyet a választó által felsorolt bármely állapotba átmozgathatja (a failed kivételével mindegyikbe), beleértve egy végállapot újranyitását is. Az ügynökök a fail_ticket hívással jelölik failed állapotúnak a jegyet.

Egy állapot mindig átléphet önmagába. A végállapotokból nem vezet ki él.

Honnan Engedélyezett célok
backlog open, cancelled
open inProgress, blocked, cancelled
inProgress blocked, inReview, done, failed, cancelled
blocked inProgress, cancelled
inReview inProgress, done, failed, cancelled
done — (végállapot)
failed — (végállapot)
cancelled — (végállapot)

Egész számként tárolódik a Linear natív 0–4 skáláján. Egy ismeretlen érték none értékként értelmeződik.

Prioritás Tárolt érték
none 0
urgent 1
high 2
medium 3
low 4

Egy ismeretlen vagy null tárolt érték local értékként értelmeződik.

Szolgáltató Állapot
local Teljes egészében a munkaterület adatbázisában tárolódik; ez az alapértelmezett
linear Távoli tulajdonban van, helyben tükrözve

A szinkronizáló adapterek a packages/cc_infra/lib/src/tickets/sync/ alatt élnek, a Linear, a GitHub Issues, a Jira Cloud és a ClickUp számára. A GitHub Issues csak szinkronizálóadapter-szállító (vendorId: github) — nem TicketProvider-érték, ezért egy behúzott GitHub issue originKind: externalSync és alapértelmezett provider: local értékkel tárolódik. A szállítóleképezés a ticket_sync_links táblán él.

A createTicket a manual értéket írja. Egy szállítói behúzás az externalSync értéket írja. A delegált gyermekek manual értéken maradnak.

Érték Jelentés
manual Alapértelmezett a createTicket esetében (emberi, ügynök- és delegált sorok)
externalSync A TicketSyncEngine állítja be szállítói behúzáskor

Az aggregátum két szempontot fog át egyetlen soron. A tükör (szolgáltató, kulcsok, cím, leírás, prioritás, címkék, állapotok, időbélyegek) egy távoli szolgáltató gyorsítótára, amelyet egy frissítés teljes egészében újraír. A fedvény (hozzárendelés, delegálás, tér, szülő, projekt, kapcsolt PR-ek) csak a Control Centerben létezik, és egy frissítés soha nem nyúl hozzá.

Mező Típus Leírás
id String UUID v4
workspaceId String A tulajdonló munkaterület
provider TicketProvider A kanonikus adatokat birtokló háttérrendszer (alapértelmezés: local)
externalKey String? A szolgáltató natív kulcsa (pl. LIN-123). A helyi createTicket egy külön UUID-t ír ide, nem a sor id értékét
url String? Webes URL a távoli szolgáltatónál
title String Rövid összefoglaló; nem lehet üres
description String? Hosszabb Markdown-törzs
priority TicketPriority Alapértelmezés: none
labels List<String> Szabad formátumú címkék
status TicketStatus Kanonikus, normalizált állapot
rawStatus String? A távoli szolgáltató natív állapotneve, a veszteségmentes megjelenítés érdekében megtartva
externalSyncedAt DateTime? Az utolsó több szállítós szinkronizálás; az első előtt null. A szállítónkénti leképezés a ticket_sync_links táblán él
parentTicketId String? A szülő a delegálási / bontási fában
projectId String? A tulajdonló projekt; soha nem kerül fel távoli rendszerre
assignedAgentId String? A hozzárendelt principal azonosítója (csak metaadat — a hozzárendelés semmit nem indít el)
assigneeType PrincipalType Megadja, milyen fajta principalra mutat az assignedAgentId — user vagy agent (alapértelmezés: agent)
createdByType PrincipalType? A jegyet létrehozó principal fajtája (user vagy agent); régi/rendszersoroknál null
createdById String? A létrehozó principal azonosítója
assignedTeamId String? A hozzárendelt csapat (csak metaadat)
delegatedByAgentId String? Az ügynök, amely delegálta ezt a jegyet
delegationDepth int Mélység a delegálási láncban; a gyökér 0, a rendszer a maximális mélység korlátjához ellenőrzi
delegationRootTicketId String? A delegálási lánc gyökere; gyökérjegynél null
spaceId String? Az a beszélgetés, amelyből a jegy kivált, vagy a delegáló ügynök tere
errorMessage String? Akkor kerül beállításra, amikor a status értéke failed
linkedPrIds List<String> Azon PR-csomópont-azonosítók, amelyekhez ez a jegy kapcsolódik
metadata Map<String, dynamic> Szabad formátumú gyűjtő
createdAt DateTime A létrehozás időpontja
startedAt DateTime? Amikor a munka elkezdődött
blockedAt DateTime? Amikor a jegy blokkolttá vált
cancelledAt DateTime? Amikor a jegyet megszakították
completedAt DateTime? Amikor a jegy sikeresen befejeződött
finishedAt DateTime? Amikor a jegy bármely végállapotba került
updatedAt DateTime Az utolsó módosítás (tükörfrissítés vagy fedvényváltozás)
version int Optimalista párhuzamossági számláló, minden módosításkor növekszik
originKind TicketOriginKind A jegy létrejöttének módja (alapértelmezés: manual)
collaborators List<TicketCollaborator> A repository igény szerint tölti fel

Származtatott: isTerminal, isRemote (provider != local), isAssignedToUser és displayKey (externalKey ?? id — a helyi jegyek ezért a létrehozáskor kapott külön UUID-t jelenítik meg, nem a sor id értékét).

A tárolt élek irányított sorok a ticket_links táblában:

Típus Tárolt érték Jelentés
blocks blocks A forrás blokkolja a célt
relatesTo relates_to Szimmetrikus kapcsolat
duplicateOf duplicate_of A forrás a cél duplikátuma

Az a szókészlet, amelyet a felület és a ticket_relation használ, a TicketRelationKind, amely egy tárolt élből és abból származik, hogy az alany melyik végponton ül:

Fajta Származtatás
blockedBy Egy blocks sor, ahol az alany a cél
blocking Egy blocks sor, ahol az alany a forrás
relatedTo Egy relates_to sor (szimmetrikus)
duplicateOf Egy duplicate_of sor, ahol az alany a forrás
duplicatedBy Egy duplicate_of sor, ahol az alany a cél
subIssueOf A tickets.parent_ticket_id az alanyon
parentOf A tickets.parent_ticket_id a másik jegyen

A szülő- és gyermekjegy-kapcsolatok nem ticket_links sorok — a tickets.parent_ticket_id mezőn élnek.

Ez a nyolc osztály a packages/cc_domain/lib/core/domain/events/ticketing_events.dart fájlban él. Nincs TicketStarted, TicketDelegated, TicketCollaboratorAdded vagy ExternalTicketWebhookReceived.

Esemény Kiváltódik, amikor
TicketCreated Létrejön egy jegy
TicketAssigned Egy jegyet principalhoz vagy csapathoz rendelnek
TicketCompleted A munka sikeresen befejeződik
TicketFailed A munka meghiúsul
TicketCancelled Egy jegyet megszakítanak
TicketStatusChanged Bármely állapotváltozás
TicketReassigned Egy jegyet újra hozzárendelnek
TicketDetailsUpdated A cím, a leírás, a prioritás vagy a címkék megváltoznak

A TicketAssigned audit- és értesítési jelzés, valamint pipeline-eseményindító. Az ügynökhöz rendelés nem indít futtatást — nincs olyan jegykiosztó, amely az assignedAgentId mezőt figyelné. A csapathoz rendelés a kivétel: a TeamRoutingService kiosztja a csapatvezetőt. Egy közreműködő hozzáadása kiír egy sort, és semmit nem tesz közzé. Egy szállítói webhook a TicketSyncEngine-en keresztül, domainesemény nélkül érvényesül.

A TicketWorkflowService birtokol minden módosítást.

Mechanizmus Részletek
Egyetlen szűk keresztmetszet Minden módosítás a _mutate metóduson halad át, amely betölti a sort, és alkalmazás előtt meghívja az _assertWorkspace metódust
Munkaterület-elszigetelés Az _assertWorkspace WorkspaceMismatchException kivételt dob, amikor a betöltött sor workspaceId értéke nem egyezik a hívóéval
Optimalista párhuzamosság A _mutate úgy ír, hogy az expectedVersion értéke az éppen beolvasott version legyen, és ConcurrencyConflictException esetén a friss állapot újraolvasásával próbálkozik újra
Kizárólagos lefoglalás tryCheckout / releaseCheckout; egy második ügynök, amely egy már kivett jegyet próbál kivenni, CheckoutConflictException kivételt kap
Átmenet-őr canTransitionTo, csak akkor érvényesül, amikor a force értéke false