diff --git a/DESIGN.md b/DESIGN.md index 175f7055..3d56cfc1 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -734,11 +734,12 @@ The page the reference design shows (#56), with measurements verified in v1's so The reference draws three more controls between the navigator and the save state — version select (GitBranch), create-branch (GitBranchPlus) and **Merge** (GitMerge). - **They are not rendered**, because the model they operate does not exist: annotation - versioning is #127, post-beta and blocked on a decision. They were drawn disabled + **They are not rendered**, because the model they operate does not exist: the + branch-and-merge question was settled on 2026-08-10 as superseded by the batch, review + and release model the product already has (cf. #127). They were drawn disabled until 2026-08-05 to hold the design's shape, which principle 9 forbids — the only honest tooltip for them is "this feature does not exist", and that is not an - explanation of what would enable the button. They return with the model, not before. + explanation of what would enable the button. - **Classes region** (#368 as a top-bar field, #420 as the panel's upper region): where class selection lives. It was the side panel's Labels tab, then a `Combobox` in the centre of the top bar, and it is a **list** now — because what is being chosen between @@ -1088,10 +1089,11 @@ Adapted from v1's `DESIGN.md` (`computer-vision-lab-app`, sibling checkout) on `components/annotations/annotation-utils.ts` (`getClassPalette`), and the annotation workspace components (`AnnotationToolHeader` / `AnnotationToolStrip` / `AnnotationSidePanel`). The reference screenshots are described in the 2026-07-30 design -comment on #51. The version-control affordances (branch dropdown, Merge) are recorded in -#127 and are post-beta. Their top-bar slots were removed on 2026-08-05: this record is -what re-milestoned #127 out of 0.1.0, and a disabled control whose only explanation is -"this does not exist yet" is the thing principle 9 names. +comment on #51. The version-control affordances (branch dropdown, Merge) are not part of +this interface. Their top-bar slots were removed on 2026-08-05 (#354) — a disabled control +whose only explanation is "this does not exist yet" is the thing principle 9 names — and +the branch-and-merge model behind them was settled on 2026-08-10 as superseded by the +batch, review and release model the product already has (cf. #127). **2026-08-01 (#206)** added principles 6–9, the whole of **Project surfaces**, and the qualification to principle 3, ahead of the project view redesign (#207–#213). diff --git a/docs/ui.md b/docs/ui.md index 27405024..c6ccffa9 100644 --- a/docs/ui.md +++ b/docs/ui.md @@ -371,12 +371,13 @@ the way to reach `annotated` from `skipped` is to un-skip and annotate, which is what the machine says. The zoom `−`/`%`/`+` and fit drive `AnnotatorCanvas`'s new `viewRef` handle, whose `fit` is the same implementation `mod+0` reaches, which is why that chord stays intercepted rather than forwarded. -The version dropdown and Merge that `DESIGN.md` draws are **not on the bar**. They -are #127, post-beta and blocked on a decision, and until 2026-08-05 they rendered -disabled to keep the bar the shape the design shows. That is the one case -disabled-with-reason cannot serve — the reason would be "this feature does not -exist", which says nothing about what would enable the control — so they were -removed. They return with the model behind them. +The version dropdown and Merge that `DESIGN.md` draws are **not on the bar**. The +branch-and-merge model behind them was settled on 2026-08-10 as superseded by the +batch, review and release model the product already has (cf. #127), and until +2026-08-05 they rendered disabled to keep the bar the shape the design shows. That +is the one case disabled-with-reason cannot serve — the reason would be "this +feature does not exist", which says nothing about what would enable the control — +so they were removed. #### The tool strip, and the geometries with no tool behind them diff --git a/frontend/ui-core/src/annotator/AnnotationPage.tsx b/frontend/ui-core/src/annotator/AnnotationPage.tsx index 5092e075..3a224a1f 100644 --- a/frontend/ui-core/src/annotator/AnnotationPage.tsx +++ b/frontend/ui-core/src/annotator/AnnotationPage.tsx @@ -27,13 +27,13 @@ * * ## What the top bar has and what it does not * - * `DESIGN.md` draws a version dropdown, create-branch and Merge. Annotation - * versioning is post-beta and blocked on a decision nobody has taken. They used to + * `DESIGN.md` draws a version dropdown, create-branch and Merge. The branch-and-merge + * model they operate was settled as superseded by the batch, review and release model + * the product already has, so there is nothing behind them to render. They used to * render **disabled**, to hold the design's shape — but a disabled control with no * model behind it cannot be explained in the terms principle 9 asks for, because - * the honest explanation is "this feature does not exist". So the slots are gone - * and they come back with the thing they operate. Every control on the bar now - * corresponds to a capability that exists. + * the honest explanation is "this feature does not exist". So the slots are gone. + * Every control on the bar now corresponds to a capability that exists. * * ## There is a minimum viewport, and the decision is made before anything mounts * diff --git a/frontend/ui-core/src/generated/api.ts b/frontend/ui-core/src/generated/api.ts index 8be9c14f..217d9c60 100644 --- a/frontend/ui-core/src/generated/api.ts +++ b/frontend/ui-core/src/generated/api.ts @@ -1110,7 +1110,7 @@ export interface paths { * @description Every annotation on one asset of this job, in the order they were added. * * Empty for an asset nobody has labeled yet — the ordinary starting state, not - * an error. Reading is not gated on the batch being open: a label outlives the + * an error. Reading is not gated on job or batch state: a label outlives the * work that produced it. */ get: operations["list_asset_annotations"]; diff --git a/openapi.json b/openapi.json index 47a5fcde..86b2524f 100644 --- a/openapi.json +++ b/openapi.json @@ -7500,7 +7500,7 @@ }, "/jobs/{job_id}/assets/{asset_id}/annotations": { "get": { - "description": "Every annotation on one asset of this job, in the order they were added.\n\nEmpty for an asset nobody has labeled yet \u2014 the ordinary starting state, not\nan error. Reading is not gated on the batch being open: a label outlives the\nwork that produced it.", + "description": "Every annotation on one asset of this job, in the order they were added.\n\nEmpty for an asset nobody has labeled yet \u2014 the ordinary starting state, not\nan error. Reading is not gated on job or batch state: a label outlives the\nwork that produced it.", "operationId": "list_asset_annotations", "parameters": [ { diff --git a/src/visionset/server/routes/annotations.py b/src/visionset/server/routes/annotations.py index 9c81e0b3..771c3898 100644 --- a/src/visionset/server/routes/annotations.py +++ b/src/visionset/server/routes/annotations.py @@ -57,7 +57,7 @@ def list_asset_annotations(workspace: WorkspaceDep, job_id: UUID, asset_id: UUID """Every annotation on one asset of this job, in the order they were added. Empty for an asset nobody has labeled yet — the ordinary starting state, not - an error. Reading is not gated on the batch being open: a label outlives the + an error. Reading is not gated on job or batch state: a label outlives the work that produced it. """ found = AnnotationService(workspace).for_asset(job_id, asset_id)