Data Model: SaaS-Mediated CLI Tracker Reflow

CLI-Side Entities

TrackerProjectConfig (Modified)

Stored in .kittify/config.yaml under tracker: section.

FieldTypeSaaS-backedLocalNotes
provider`str \None`RequiredRequired
project_slug`str \None`RequiredUnused
workspace`str \None`UnusedRequired
doctrine_modestrDefaultDefaultOwnership doctrine (default: external_authoritative)
doctrine_field_ownersdict[str, str]DefaultDefaultPer-field ownership overrides

Serialized form (.kittify/config.yaml):

tracker:
  provider: linear
  project_slug: my-project
  doctrine:
    mode: external_authoritative
    field_owners: {}

Provider Classification

ProviderCategoryBinding modelExecution path
linearSaaS-backedprovider + project_slugSaaSTrackerService → SaaS API
jiraSaaS-backedprovider + project_slugSaaSTrackerService → SaaS API
githubSaaS-backedprovider + project_slugSaaSTrackerService → SaaS API
gitlabSaaS-backedprovider + project_slugSaaSTrackerService → SaaS API
beadsLocalprovider + workspaceLocalTrackerService → direct connector
fpLocalprovider + workspaceLocalTrackerService → direct connector
azure_devopsRemovedN/AHard fail with guidance

SaaS Contract Entities (Read-Only from CLI)

These entities are defined by the frozen PRI-12 contract. The CLI receives them in API responses but never constructs or mutates them.

NormalizedIssue

Received in PullResultEnvelope.items[].

FieldTypeNotes
refExternalRef{system, id, workspace, key?, url?} -- workspace is required per PRI-12
titlestr
body`str \null`
statusenumtodo, in_progress, in_review, blocked, done, canceled
issue_typeenumepic, story, task, bug, chore, subtask
priorityint (0-4)0 = unset, 1 = urgent, 4 = low
assigneesstr[]
labelsstr[]
parent_ref`ExternalRef \null`
linksIssueLink[]
custom_fieldsobjectFreeform
created_atdatetimeISO 8601
updated_atdatetimeISO 8601
provider_metadataobjectFreeform

PullResultEnvelope

FieldTypeNotes
statusenumok, partial, error
summaryResultSummary{total, succeeded, failed, skipped}
itemsNormalizedIssue[]
item_errors`ItemError[] \null`
identity_pathIdentityPath
has_moreboolPagination
next_cursor`str \null`
doctrine`object \null`

PushResultEnvelope

FieldTypeNotes
statusenumok, partial, error
summaryResultSummary
itemsPushResultItem[]Each: {ref, action, outcome, remote_ref, version, message}
item_errors`ItemError[] \null`
identity_pathIdentityPath
doctrine`object \null`

RunResultEnvelope

FieldTypeNotes
statusenumok, partial, error
summaryResultSummary
pullPullPhaseResultPull phase subset
pushPushPhaseResultPush phase subset
identity_pathIdentityPath
doctrine`object \null`

OperationAccepted (HTTP 202)

FieldTypeNotes
operation_idstr (UUID)Used for polling
statusstrAlways pending

OperationResult (Polling Response)

FieldTypeNotes
operation_idstr (UUID)
statusenumpending, running, completed, failed
result`PushResultEnvelope \RunResultEnvelope \
error`ErrorEnvelope \null`

ErrorEnvelope

FieldTypeNotes
codestrError code within category (e.g., missing_installation)
categorystrTop-level category (e.g., identity_resolution). Separate field from code per PRI-12.
http_statusint
messagestrHuman-readable
retryablebool
user_action_requiredbool
sourceenumsaas, provider
retry_after_seconds`int \null`
provider`str \null`
details`object \null`

IdentityPath

FieldTypeNotes
typeenuminstallation, user_link
installation_idstr (UUID)
user_link_id`str (UUID) \null`
providerstr
provider_account_idstr

State Transitions

Operation Lifecycle (push/run async)

[CLI sends request]
    │
    ├─ 200 → completed (inline result)
    │
    └─ 202 → pending
               │
               ├─ poll → pending (continue polling)
               ├─ poll → running (continue polling)
               ├─ poll → completed (result envelope)
               └─ poll → failed (error envelope)

Auth Token Lifecycle (on 401)

[Request fails with 401]
    │
    └─ refresh_tokens()
         │
         ├─ success → retry original request (once)
         │     │
         │     ├─ success → return result
         │     └─ 401 again → halt with re-login guidance
         │
         └─ failure → halt with re-login guidance