You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
AnnotationSchema is (project_id, version, classes) — nothing records why a version exists or when it was created. A version history UI (follow-up issue) has nothing to show but class lists, and users asked for a details/comments field on schema versions.
Decision (founder, 2026-08-02)
The description is immutable, written once at publish — the commit-message model. It fits the never-update-a-version doctrine (immutability is in the frozen type); no update route is added. Ongoing editable discussion would be a separate future feature, deliberately out of scope here.
SchemaService.create_version gains an optional description parameter, stored verbatim (normalize/strip per domain/names.py temperament, but blank → None rather than a refusal — an empty commit message is legal).
Migration 14: two nullable columns on annotation_schema (description TEXT, created_at TEXT ISO-8601 with offset, per the timestamps rule in _tables.py). Alter-only table → columns declared last on the row class, explicit drops in _downgrade_to_version_one (the kernel: nothing records when an asset was ingested, so "recently" is unanswerable #216 pattern — the undo is what exercises the migration). Pre-existing versions keep NULLs; nothing backfills a moment nobody recorded.
Problem
AnnotationSchemais(project_id, version, classes)— nothing records why a version exists or when it was created. A version history UI (follow-up issue) has nothing to show but class lists, and users asked for a details/comments field on schema versions.Decision (founder, 2026-08-02)
The description is immutable, written once at publish — the commit-message model. It fits the never-update-a-version doctrine (immutability is in the frozen type); no update route is added. Ongoing editable discussion would be a separate future feature, deliberately out of scope here.
Scope
AnnotationSchema.description: str | None(frozen, like everything else on the model) andcreated_at: datetime(UTC, tz-aware — a version history without dates is half a history; kernel: nothing records when an asset was ingested, so "recently" is unanswerable #216 established the pattern and the cost).SchemaService.create_versiongains an optionaldescriptionparameter, stored verbatim (normalize/strip perdomain/names.pytemperament, but blank →Nonerather than a refusal — an empty commit message is legal).annotation_schema(descriptionTEXT,created_atTEXT ISO-8601 with offset, per the timestamps rule in_tables.py). Alter-only table → columns declared last on the row class, explicit drops in_downgrade_to_version_one(the kernel: nothing records when an asset was ingested, so "recently" is unanswerable #216 pattern — the undo is what exercises the migration). Pre-existing versions keep NULLs; nothing backfills a moment nobody recorded.SCHEMASis a flat mapping — a timestamp costs an entity its flat persistence mapping (kernel: nothing records when an asset was ingested, so "recently" is unanswerable #216 finding), so this likely means a hand-written mapper pair if it doesn't already have one (theclassesJSON column suggests it does).SchemaVersionOutgains both fields;SchemaVersionCreategains optionaldescription.openapi.json+pnpm generate:clientregenerate (drift gates).create_schema_version/get_schematool schemas pick the fields up through the domain models per the M3 convention.docs/schemas.md.Acceptance criteria
descriptionis null.created_atis stamped by the service at publish, UTC, and survives a round-trip byte-identically.checks.tsreflect both fields (drift gates green).