# Models: F

> API models starting with F.

## `Fact`

- `id: str`
- `revision_id: str | None` (`revisionId` on the wire) (optional)
- `type: str`
- `scope: kindgi.client.FactScope`
- `version: int`
- `created_at: AwareDatetime` (`createdAt` on the wire)
- `updated_at: AwareDatetime | None` (`updatedAt` on the wire) (optional)
- `content: Any | None` (optional)
- `content_ref: str | None` (`contentRef` on the wire) (optional)
- `content_hash: str | None` (`contentHash` on the wire) (optional)
- `size: int | None` (optional)
- `embedding_model: str | None` (`embeddingModel` on the wire) (optional)
- `retention: kindgi.client.Retention | None` (optional)
- `source: kindgi.client.FactSource | None` (optional)
- `caused_by_log_id: list[str] | None` (`causedByLogId` on the wire) (optional)
- `supersedes: str | None` (optional)
- `trust: Optional[Annotated[Union[Literal['verified', 'asserted', 'unverified'], str], <kindgi.client._open.OpenEnum object at 0x10700bbd0>]]` (optional)
- `verified_by: str | None` (`verifiedBy` on the wire) (optional)
- `verified_at: AwareDatetime | None` (`verifiedAt` on the wire) (optional)
- `attributed_to: kindgi.client.FactAttribution | None` (`attributedTo` on the wire) (optional)
- `generated_by: kindgi.client.FactGeneratedBy | None` (`generatedBy` on the wire) (optional)
- `subjects: list[kindgi.client.FactSubject] | None` (optional)
- `valid_from: AwareDatetime | None` (`validFrom` on the wire) (optional)
- `valid_until: AwareDatetime | None` (`validUntil` on the wire) (optional)
- `observed_at: AwareDatetime | None` (`observedAt` on the wire) (optional)
- `invalidated_at: AwareDatetime | None` (`invalidatedAt` on the wire) (optional)
- `invalidated_by: str | None` (`invalidatedBy` on the wire) (optional)
- `invalidation_reason: Optional[Annotated[Union[Literal['superseded', 'deleted', 'erased', 'expired'], str], <kindgi.client._open.OpenEnum object at 0x10700bbd0>]]` (`invalidationReason` on the wire) (optional)
- `review: Optional[Annotated[Union[Literal['pending'], str], <kindgi.client._open.OpenEnum object at 0x10700bbd0>]]` (optional)
- `expires_at: AwareDatetime | None` (`expiresAt` on the wire) (optional)

## `FactAttribution`

Who asserted a fact, set by the server from the writer.

- `kind: Union[Literal['user', 'service', 'agent'], str]`
- `id: str`
- `agent_version: str | None` (`agentVersion` on the wire) (optional)

## `FactCollectionPage`

- `data: list[kindgi.client.Fact]`
- `next_cursor: str | None` (`nextCursor` on the wire) (optional)
- `has_more: bool` (`hasMore` on the wire)

## `FactGeneratedBy`

The run step that wrote a fact, for one an agent wrote.

- `run_id: str` (`runId` on the wire)
- `step_id: str | None` (`stepId` on the wire) (optional)
- `tool_call_id: str | None` (`toolCallId` on the wire) (optional)

## `FactRevisionList`

- `data: list[kindgi.client.Fact]`

## `FactScope`

Fact scope object. `tenantId` is required; every optional key narrows the fact (`userId`, `orgId`, `projectId`, `threadId`, `sessionId`, `participantId`). A fact is readable by whoever has every container it names. Additional keys accepted for forward compatibility.

- `tenant_id: str` (`tenantId` on the wire)
- `user_id: str | None` (`userId` on the wire) (optional)
- `org_id: str | None` (`orgId` on the wire) (optional)
- `project_id: str | None` (`projectId` on the wire) (optional)
- `thread_id: str | None` (`threadId` on the wire) (optional)
- `session_id: str | None` (`sessionId` on the wire) (optional)
- `participant_id: str | None` (`participantId` on the wire) (optional)

## `FactSource`

- `kind: Union[Literal['http-api', 'blob', 'mcp-tool', 'external-db', 'user-input'], str]`
- `uri: str | None` (optional)
- `freshness: kindgi.client.SourceFreshness`
- `refresh: kindgi.client.SourceRefresh`

## `FactSubject`

Whom a fact is about: what access and erasure requests by person find.

- `kind: Union[Literal['participant', 'user', 'external'], str]`
- `id: str`

## `FailureGroup`

One group of failed runs: the same cause, subject and version.

- `code: str | None` (optional)
- `reason: str | None` (optional)
- `subject: kindgi.client.FailureSubject`
- `version: str | None` (optional)
- `count: int`
- `first_seen: AwareDatetime` (`firstSeen` on the wire)
- `last_seen: AwareDatetime` (`lastSeen` on the wire)
- `example_run_id: uuid.UUID` (`exampleRunId` on the wire)

## `FailureSubject`

Whose runs a failure group counts: an agent's turns, or a flow's runs.

- `kind: Union[Literal['agent', 'flow'], str]`
- `id: str`

## `Filter`

Optional filter narrowing the export set. Composition is AND — every populated field must match. Absent / empty filter exports every record for the tenant.

- `run_id: str | None` (`runId` on the wire) (optional)
- `agent_id: str | None` (`agentId` on the wire) (optional)
- `flow_id: str | None` (`flowId` on the wire) (optional)
- `kind: str | None` (optional)
- `from_: AwareDatetime | None` (`from` on the wire) (optional)
- `to: AwareDatetime | None` (optional)

## `FinishedRun`

A finished top-level run: its identity and outcome, never its input or output. Field names match `GET /v1/runs/{runId}`.

- `id: uuid.UUID`
- `project_id: uuid.UUID` (`projectId` on the wire)
- `flow_id: str` (`flowId` on the wire)
- `flow_version: str` (`flowVersion` on the wire)
- `status: Union[Literal['completed', 'failed', 'cancelled'], str]`
- `dry_run: bool` (`dryRun` on the wire)
- `failure_message: str | None` (`failureMessage` on the wire)
- `failure: kindgi.client.RunFailure | None` (optional)
- `created_at: AwareDatetime` (`createdAt` on the wire)
- `completed_at: AwareDatetime` (`completedAt` on the wire)
- `usage: kindgi.client.RunTreeUsage | None` (optional)
- `agent: kindgi.client.RunAgent | None` (optional)

## `FirstAdmin`

The person made the tenant's admin and member, by email: the runtime's own sign-in finds them. The runtime gives them every capability but `secrets:reveal`, to put on the keys they make. Absent: the answer carries an admin key instead, which takes the full system capability.

- `email: str`
- `name: str`

## `FirstAdmin1`

- `person_id: str` (`personId` on the wire)

## `FixProposal`

An improvement proposal: a change to one data block an agent version pins, for one live scope, taken through the same comparison, gate and promotion as any other version.

- `id: uuid.UUID`
- `agent_id: str` (`agentId` on the wire)
- `from_version: str` (`fromVersion` on the wire)
- `scope: kindgi.client.LiveScopeTenant | kindgi.client.LiveScopeOrg | kindgi.client.LiveScopeProject | kindgi.client.LiveScopeSegment | kindgi.client.LiveScopeUnrecognized`
- `tier: Union[Literal['settings-block', 'prompt-block'], str]`
- `change: kindgi.client.ProposalChange`
- `hypothesis: str`
- `evidence: kindgi.client.Evidence1 | None` (optional)
- `drafter: kindgi.client.ProposalDrafter`
- `status: Union[Literal['draft', 'evaluating', 'evaluated', 'not-better', 'evaluation-failed', 'in-review', 'promoted', 'refused', 'rejected', 'expired', 'superseded', 'rolled-back', 'withdrawn'], str]`
- `candidate: kindgi.client.ProposalCandidate | None` (optional)
- `evaluation: kindgi.client.ProposalEvaluation | None` (optional)
- `promotion: kindgi.client.ProposalPromotion | None` (optional)
- `rolled_back: kindgi.client.RolledBack | None` (`rolledBack` on the wire) (optional)
- `withdrawn: kindgi.client.Withdrawn | None` (optional)
- `created_at: AwareDatetime` (`createdAt` on the wire)
- `updated_at: AwareDatetime` (`updatedAt` on the wire)

## `FixProposalCollectionPage`

- `data: list[kindgi.client.FixProposal]`
- `has_more: bool` (`hasMore` on the wire)
- `next_cursor: str | None` (`nextCursor` on the wire) (optional)

## `Flow`

- `id: str`
- `version: str`
- `project_id: uuid.UUID | None` (`projectId` on the wire) (optional)
- `name: str | None` (optional)
- `description: str | None` (optional)
- `nodes: list[kindgi.client.FlowNode]`
- `edges: list[kindgi.client.FlowEdge]`
- `max_parallelism: int | None` (`maxParallelism` on the wire) (optional)
- `metadata: dict[str, Any] | None` (optional)
- `pins: kindgi.client.FlowPins | None` (optional)
- `pins_digest: str | None` (`pinsDigest` on the wire) (optional)
- `derived_from: kindgi.client.VersionDerivation | None` (`derivedFrom` on the wire) (optional)
- `unregistered_at: AwareDatetime | None` (`unregisteredAt` on the wire) (optional)

## `FlowCollectionPage`

- `data: list[kindgi.client.Flow]`
- `next_cursor: str | None` (`nextCursor` on the wire) (optional)
- `has_more: bool` (`hasMore` on the wire)

## `FlowEdge`

- `id: str`
- `from_: str` (`from` on the wire)
- `to: str`
- `when: dict[str, Any] | None` (optional)
- `policy: dict[str, Any] | None` (optional)

## `FlowId`

- `root: str`

## `FlowNode`

- `id: str`
- `kind: Union[Literal['tool', 'agent', 'loop', 'fanout', 'subgraph'], str]`
- `ref: str | None` (optional)
- `config: dict[str, Any] | None` (optional)

## `FlowPins`

The exact tool and agent versions a flow version runs: its lockfile. Set by the runtime when the version is published, never in the publish body: each tool the flow runs, and each agent it runs at no named version, resolves once to its latest version then, which every run of that flow version uses. Absent on a version published before pins existed (it binds the latest versions per run).

- `tools: dict[str, str]`
- `agents: dict[str, str]`

## `FlowRef`

- `id: str`
- `version: str`

## `FlowVersionOverrides`

Agents and tools a flow runs at other exact versions than the flow version's pins ("this flow, with `acme.scorer` at 0.4.0"), without publishing a new flow version: a comparison's flow candidate (`versions` on the start body and the run's `comparison`), and the flow runs that replay it (a run's `versions`). Each id must be an agent or tool the flow uses.

- `tools: dict[str, str] | None` (optional)
- `agents: dict[str, str] | None` (optional)

## `Fresh`

The part of these sums judged on this output itself (a replay judged after it ran). Absent when none was.

- `yes_weight: float` (`yesWeight` on the wire)
- `total_weight: float` (`totalWeight` on the wire)
- `items: int`
