Jegyéletciklus
Jegyállapotok
Szekció neve “Jegyállapotok”| Á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 |
Állapotátmenetek
Szekció neve “Állapotátmenetek”backlog ──→ open ──→ inProgress ──→ inReview ──→ done │ │ │ │ └──→ failed ┘ └──→ blocked ──→ inProgress
Any non-terminal status ──→ cancelled; inReview ──→ failedEz 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) |
Jegyprioritások
Szekció neve “Jegyprioritások”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 |
Jegyszolgáltatók
Szekció neve “Jegyszolgáltatók”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.
Jegy eredete
Szekció neve “Jegy eredete”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 |
Jegy mezői
Szekció neve “Jegy mezői”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).
Jegykapcsolatok
Szekció neve “Jegykapcsolatok”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.
Domainesemények
Szekció neve “Domainesemények”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.
Módosítási szűk keresztmetszet
Szekció neve “Módosítási szűk keresztmetszet”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 |