Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 9 additions & 7 deletions DESIGN.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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).
Expand Down
13 changes: 7 additions & 6 deletions docs/ui.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
10 changes: 5 additions & 5 deletions frontend/ui-core/src/annotator/AnnotationPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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
*
Expand Down
2 changes: 1 addition & 1 deletion frontend/ui-core/src/generated/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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"];
Expand Down
2 changes: 1 addition & 1 deletion openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": [
{
Expand Down
2 changes: 1 addition & 1 deletion src/visionset/server/routes/annotations.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Loading