Blanket acknowledgement is unchanged when the UUID list is omitted. A present expected_retirement_uuids set must equal the stale projections, and the call retires nothing when that set mismatches, a stale row still has tasks or dependency edges, or both authorizations are set together. Assistant: grok Assistant-Session: 01a10946-16b1-7973-b1dd-71fc58b8fcf0
42 lines
1.4 KiB
Python
42 lines
1.4 KiB
Python
from __future__ import annotations
|
|
|
|
import re
|
|
import uuid
|
|
from typing import Literal
|
|
|
|
from pydantic import BaseModel, Field, field_validator
|
|
|
|
from api.schemas.task import TaskRead
|
|
from api.schemas.workplan import WorkplanRead
|
|
from api.schemas.workplan_dependency import WorkplanDependencyRead
|
|
|
|
|
|
class RepositoryProjectionReconcile(BaseModel):
|
|
expected_commit: str
|
|
acknowledge_retirements: bool = False
|
|
# None keeps today's blanket acknowledgement. An empty list is present and
|
|
# means the caller expects zero retirements. Combined with
|
|
# acknowledge_retirements, the call is ambiguous and retires nothing.
|
|
expected_retirement_uuids: list[uuid.UUID] | None = None
|
|
|
|
@field_validator("expected_commit")
|
|
@classmethod
|
|
def validate_commit(cls, value: str) -> str:
|
|
value = value.strip().lower()
|
|
if not re.fullmatch(r"[0-9a-f]{40}", value):
|
|
raise ValueError("expected_commit must be a full 40-character Git SHA")
|
|
return value
|
|
|
|
|
|
class RepositoryProjectionSnapshot(BaseModel):
|
|
"""One bounded read of a repository's complete work-record projection."""
|
|
|
|
schema_version: Literal["state-hub.repository-projection-snapshot.v1"] = Field(
|
|
validation_alias="schema",
|
|
serialization_alias="schema",
|
|
)
|
|
repo_slug: str
|
|
repo_id: uuid.UUID
|
|
workplans: list[WorkplanRead]
|
|
tasks: list[TaskRead]
|
|
dependencies: list[WorkplanDependencyRead]
|