Skip to content

Commit 0c4f866

Browse files
committed
Faces: Rename the embed_upscaled column to embed_detail
The value is the share of the crop its source supplied, so 100 means the crop was not upscaled - which made embed_upscaled read backwards at the one value worth a clean predicate. The three names now agree: face.EmbedDetail computes it, SetEmbedDetail writes it, embed_detail stores it. The embed_ prefix stands for the reason it always did, that the column describes the embedding rather than the thumbnail its partner thumb_size names. No shim and no rename migration: nothing has shipped the old column, so AutoMigrate creating embed_detail is the whole change. A local database that saw the old name keeps a stale column until it is dropped by hand.
1 parent c48d23f commit 0c4f866

15 files changed

Lines changed: 80 additions & 80 deletions

internal/ai/face/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ The on-demand size limit is lifted for the duration of the run (`useMigrationThu
116116

117117
Two consequences worth knowing. A warped crop is not interchangeable with a `crop.Sizes` tile, so 112 cannot simply join that table - though a 112 *rectangle* would render as well as `Tile100` if the UI ever wants one. And because the smallest face selects the rendition for the whole file, one tiny face makes every other face in it decode a larger image; that is the lever to measure if embedding cost ever matters, not a crop cache.
118118

119-
**`markers.embed_upscaled` says how much of the crop the source supplied**, beside the extent in `thumb_size` that supplied it: 100 is full detail, 1 to 99 says the crop was interpolated and by how much, `EmbedUpscaledUnknown` is a migration that sampled the marker without measuring a ratio, and -1 a marker nothing has sampled. The two columns are written under one condition, so a marker embedded through an endpoint - a reused crop, which reports no source width - records neither rather than one of each. ⚠ The denominator is the crop the embedder was handed, which is the model's 112 px template for an aligned crop and the 160 px `face.CropSize` box for the fallback, so a distribution over the column mixes two scales. It is measured where the crop is taken rather than derived afterwards, because `face.CropSize` and a model's input geometry describe what is configured now and not the vector that was produced. Only the two paths that produce an embedding write it, as with `thumb_size`, and no command synthesizes it. There is deliberately no per-marker warning for an upscaled crop: a default install puts a double-digit percentage of markers in that bucket, so the distribution answers whether it matters and a line each does not.
119+
**`markers.embed_detail` says how much of the crop the source supplied**, beside the extent in `thumb_size` that supplied it: 100 is full detail, 1 to 99 says the crop was interpolated and by how much, `EmbedDetailUnknown` is a migration that sampled the marker without measuring a ratio, and -1 a marker nothing has sampled. The two columns are written under one condition, so a marker embedded through an endpoint - a reused crop, which reports no source width - records neither rather than one of each. ⚠ The denominator is the crop the embedder was handed, which is the model's 112 px template for an aligned crop and the 160 px `face.CropSize` box for the fallback, so a distribution over the column mixes two scales. It is measured where the crop is taken rather than derived afterwards, because `face.CropSize` and a model's input geometry describe what is configured now and not the vector that was produced. Only the two paths that produce an embedding write it, as with `thumb_size`, and no command synthesizes it. There is deliberately no per-marker warning for an upscaled crop: a default install puts a double-digit percentage of markers in that bucket, so the distribution answers whether it matters and a line each does not.
120120

121121
**A marker is stale when its vector, its crop, or its sample extent is.** The first two make it stale because it is in the wrong space; the third because nothing can judge what the vector rests on until the crop is sampled again, and only a re-embedding measures it. Without the third condition a library **already on the target model** is skipped whole - on one reference instance 88,353 of 89,516 markers - which leaves `thumb_size` unset and `FACE_CLUSTER_SIZE` falling back to the detection size the column was added to replace. It is a staleness condition rather than a `--repair` flag for that reason: an opt-in switch reproduces the failure it fixes, a gap nobody knows to close, and `--dry-run` already prices the work before it is paid for. The honest cost is that a re-run against an already-migrated library now has real work to do, once - `entity.ThumbSizeUnmeasured` records a sampling that reached a marker and measured nothing, whether the vector was regenerated or not, which is what makes it once rather than every run. A file that could not be read is left unsettled, because that fault may clear.
122122

internal/ai/face/cluster_size_test.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -86,32 +86,32 @@ func TestEmbedDetail(t *testing.T) {
8686
})
8787
}
8888

89-
// TestFace_SetEmbedUpscaled covers the detail recorded beside an embedding, which is measured at
89+
// TestFace_SetEmbedDetail covers the detail recorded beside an embedding, which is measured at
9090
// the crop rather than derived afterwards from a template that may since have changed.
91-
func TestFace_SetEmbedUpscaled(t *testing.T) {
91+
func TestFace_SetEmbedDetail(t *testing.T) {
9292
t.Run("AlignedTemplate", func(t *testing.T) {
9393
f := &Face{Cols: 720, Area: Area{Scale: 60}}
9494
f.SetThumbSize(720)
95-
f.SetEmbedUpscaled(ArcFaceTemplateSize)
95+
f.SetEmbedDetail(ArcFaceTemplateSize)
9696

9797
assert.Equal(t, 60, f.ThumbSize)
98-
assert.Equal(t, 54, f.EmbedUpscaled)
98+
assert.Equal(t, 54, f.EmbedDetail)
9999
})
100100
t.Run("WiderRenditionRemovesTheUpscale", func(t *testing.T) {
101101
// The same face embedded from a 1920 px rendition instead of the detection thumbnail.
102102
f := &Face{Cols: 720, Area: Area{Scale: 60}}
103103
f.SetThumbSize(1920)
104-
f.SetEmbedUpscaled(ArcFaceTemplateSize)
104+
f.SetEmbedDetail(ArcFaceTemplateSize)
105105

106-
assert.Equal(t, 100, f.EmbedUpscaled)
106+
assert.Equal(t, 100, f.EmbedDetail)
107107
})
108108
t.Run("UnsampledLeavesItUnset", func(t *testing.T) {
109109
f := &Face{Cols: 720, Area: Area{Scale: 60}}
110-
f.SetEmbedUpscaled(ArcFaceTemplateSize)
110+
f.SetEmbedDetail(ArcFaceTemplateSize)
111111

112-
assert.Zero(t, f.EmbedUpscaled, "no extent was recorded to measure against")
112+
assert.Zero(t, f.EmbedDetail, "no extent was recorded to measure against")
113113
})
114114
t.Run("Nil", func(t *testing.T) {
115-
assert.NotPanics(t, func() { (*Face)(nil).SetEmbedUpscaled(112) })
115+
assert.NotPanics(t, func() { (*Face)(nil).SetEmbedDetail(112) })
116116
})
117117
}

internal/ai/face/face.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@ type Face struct {
4848
// ThumbSize is the face's extent in pixels of the thumbnail its embedding was sampled from,
4949
// which is a different image than Size measures. Zero until an embedding is generated.
5050
ThumbSize int `json:"thumbSize,omitempty"`
51-
// EmbedUpscaled is the percentage of the crop width the source supplied, clamped at 100, so
51+
// EmbedDetail is the percentage of the crop width the source supplied, clamped at 100, so
5252
// a value below it says the crop was upscaled and by how much. Zero until measured.
53-
EmbedUpscaled int `json:"embedUpscaled,omitempty"`
53+
EmbedDetail int `json:"embedDetail,omitempty"`
5454
}
5555

5656
// SetThumbSize records the face's extent in an image of the given width, which is what the
@@ -79,18 +79,18 @@ func EmbedDetail(extent, cropWidth int) int {
7979
return min(100, max(1, int(math.Round(float64(extent)*100/float64(cropWidth)))))
8080
}
8181

82-
// SetEmbedUpscaled records how much of the crop the embedder asked for the source could supply.
82+
// SetEmbedDetail records how much of the crop the embedder asked for the source could supply.
8383
// It is measured here rather than derived later, because face.CropSize is a property of the
8484
// current template and not of the vector that was produced.
8585
//
8686
// SetThumbSize has to have run first: it holds the face's extent in the image the crop was taken
8787
// from, which is the numerator. An unmeasurable ratio is left unset, so no guess is stored.
88-
func (f *Face) SetEmbedUpscaled(cropWidth int) {
88+
func (f *Face) SetEmbedDetail(cropWidth int) {
8989
if f == nil {
9090
return
9191
}
9292

93-
f.EmbedUpscaled = EmbedDetail(f.ThumbSize, cropWidth)
93+
f.EmbedDetail = EmbedDetail(f.ThumbSize, cropWidth)
9494
}
9595

9696
// Size returns the absolute face size in pixels.

internal/ai/vision/embeddings.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,9 @@ func GenerateEmbeddings(embedder face.Embedder, fileName string, faces face.Face
5858
// The crop the embedder was handed: an aligned model warps the landmarks onto its
5959
// own input, and the fallback resamples a face.CropSize box.
6060
if aligned {
61-
f.SetEmbedUpscaled(width)
61+
f.SetEmbedDetail(width)
6262
} else {
63-
f.SetEmbedUpscaled(face.CropSize.Width)
63+
f.SetEmbedDetail(face.CropSize.Width)
6464
}
6565

6666
// Counted here rather than at the crop, since a crop nothing was embedded from

internal/ai/vision/embeddings_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ func TestGenerateEmbeddings(t *testing.T) {
113113

114114
require.False(t, faces[0].Embeddings.Empty())
115115
assert.Equal(t, 284, faces[0].ThumbSize)
116-
assert.Equal(t, 100, faces[0].EmbedUpscaled)
116+
assert.Equal(t, 100, faces[0].EmbedDetail)
117117
})
118118
t.Run("RecordsTheShortfallOfASmallFace", func(t *testing.T) {
119119
// The same picture and a 40 px face, which covers 57 px of it: the crop the model reads
@@ -124,7 +124,7 @@ func TestGenerateEmbeddings(t *testing.T) {
124124

125125
require.False(t, faces[0].Embeddings.Empty())
126126
assert.Equal(t, 57, faces[0].ThumbSize)
127-
assert.Equal(t, 51, faces[0].EmbedUpscaled)
127+
assert.Equal(t, 51, faces[0].EmbedDetail)
128128
})
129129
t.Run("MeasuredAgainstTheFallbackCrop", func(t *testing.T) {
130130
// The unaligned branch resamples a 160 px box rather than the 112 px template, so the
@@ -134,7 +134,7 @@ func TestGenerateEmbeddings(t *testing.T) {
134134
require.Equal(t, 1, GenerateEmbeddings(embedder, fileName, faces, false))
135135

136136
assert.Equal(t, 57, faces[0].ThumbSize)
137-
assert.Equal(t, 36, faces[0].EmbedUpscaled)
137+
assert.Equal(t, 36, faces[0].EmbedDetail)
138138
})
139139
t.Run("EmptyEmbeddingIsNotCounted", func(t *testing.T) {
140140
// The count describes vectors, so a crop the model returned nothing for is not one.
@@ -144,7 +144,7 @@ func TestGenerateEmbeddings(t *testing.T) {
144144

145145
require.Len(t, embedder.sizes, 1, "the crop was still taken")
146146
assert.True(t, faces[0].Embeddings.Empty())
147-
assert.Zero(t, faces[0].EmbedUpscaled, "a crop no vector came out of describes nothing")
147+
assert.Zero(t, faces[0].EmbedDetail, "a crop no vector came out of describes nothing")
148148
})
149149
t.Run("UnalignedModelUsesThumbCrop", func(t *testing.T) {
150150
embedder := &stubEmbedder{aligned: false, dims: 512}

internal/entity/file.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -897,7 +897,7 @@ func (m *File) AddFace(f face.Face, subjUid string) {
897897
// From the marker this detection would have created, so an upgrade records the
898898
// sampling exactly as a new marker does. Unmeasured stays at the sentinel rather
899899
// than keeping a value recorded for another sampling.
900-
thumbSize, embedUpscaled := marker.ThumbSize, marker.EmbedUpscaled
900+
thumbSize, embedDetail := marker.ThumbSize, marker.EmbedDetail
901901

902902
// For an already-saved marker, persist first and mutate in-memory
903903
// only on success: a failed write must not leave an unpersisted
@@ -913,7 +913,7 @@ func (m *File) AddFace(f face.Face, subjUid string) {
913913
"detect_model": f.DetectModel,
914914
"landmarks_json": landmarks,
915915
"thumb_size": thumbSize,
916-
"embed_upscaled": embedUpscaled,
916+
"embed_detail": embedDetail,
917917
"score": f.Score,
918918
}
919919

@@ -926,7 +926,7 @@ func (m *File) AddFace(f face.Face, subjUid string) {
926926
existing.SetEmbeddings(f.Embeddings, f.EmbedModel, f.DetectModel)
927927
existing.LandmarksJSON = landmarks
928928
existing.ThumbSize = thumbSize
929-
existing.EmbedUpscaled = embedUpscaled
929+
existing.EmbedDetail = embedDetail
930930
existing.Score = f.Score
931931
}
932932

internal/entity/file_test.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -712,14 +712,14 @@ func TestFile_AddFaceUpgradesProvenance(t *testing.T) {
712712
file.markers = &markers
713713

714714
f := face.Face{
715-
Rows: 2000,
716-
Cols: 3000,
717-
Score: 88,
718-
Area: face.NewArea("face", 1000, 1500, 300),
719-
Embeddings: face.Embeddings{face.RandomEmbedding()},
720-
EmbedModel: face.EmbeddingModelName(),
721-
ThumbSize: 97,
722-
EmbedUpscaled: 87,
715+
Rows: 2000,
716+
Cols: 3000,
717+
Score: 88,
718+
Area: face.NewArea("face", 1000, 1500, 300),
719+
Embeddings: face.Embeddings{face.RandomEmbedding()},
720+
EmbedModel: face.EmbeddingModelName(),
721+
ThumbSize: 97,
722+
EmbedDetail: 87,
723723
}
724724

725725
file.AddFace(f, "")
@@ -728,10 +728,10 @@ func TestFile_AddFaceUpgradesProvenance(t *testing.T) {
728728
require.NoError(t, UnscopedDb().First(stored, "marker_uid = ?", existing.MarkerUID).Error)
729729

730730
assert.Equal(t, 97, stored.ThumbSize, "the extent the vector was sampled at must be recorded")
731-
assert.Equal(t, 87, stored.EmbedUpscaled, "and how much of the crop that extent supplied")
731+
assert.Equal(t, 87, stored.EmbedDetail, "and how much of the crop that extent supplied")
732732
assert.Equal(t, 88, stored.Score, "the score must come from the detector that produced the vector")
733733
assert.Equal(t, 97, (*file.Markers())[0].ThumbSize, "and the in-memory marker must match the row")
734-
assert.Equal(t, 87, (*file.Markers())[0].EmbedUpscaled)
734+
assert.Equal(t, 87, (*file.Markers())[0].EmbedDetail)
735735
}
736736

737737
func TestFile_ValidFaceCount(t *testing.T) {

internal/entity/marker.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,17 @@ type Marker struct {
5252
H float32 `gorm:"type:FLOAT;" json:"H" yaml:"H,omitempty"`
5353
Size int `gorm:"default:-1;" json:"Size" yaml:"Size,omitempty"`
5454
ThumbSize int `gorm:"column:thumb_size;default:-1;" json:"ThumbSize" yaml:"ThumbSize,omitempty"`
55-
// EmbedUpscaled is the percentage of the crop its source supplied, 100 where it supplied all
56-
// of it, EmbedUpscaledUnknown where a migration sampled the marker without measuring one, and
55+
// EmbedDetail is the percentage of the crop its source supplied, 100 where it supplied all
56+
// of it, EmbedDetailUnknown where a migration sampled the marker without measuring one, and
5757
// -1 where nothing has. It describes the embedding, which is why it sits beside embed_model
5858
// rather than under the thumb_ prefix its partner thumb_size carries, and it is written under
5959
// the same condition as that partner so the two cannot disagree about what was sampled.
60-
EmbedUpscaled int `gorm:"column:embed_upscaled;type:SMALLINT;default:-1;" json:"-" yaml:"EmbedUpscaled,omitempty"`
61-
Score int `gorm:"type:SMALLINT;" json:"Score" yaml:"Score,omitempty"`
62-
Thumb string `gorm:"type:VARBINARY(128);index;default:'';" json:"Thumb" yaml:"Thumb,omitempty"`
63-
MatchedAt *time.Time `sql:"index" json:"MatchedAt" yaml:"MatchedAt,omitempty"`
64-
CreatedAt time.Time
65-
UpdatedAt time.Time
60+
EmbedDetail int `gorm:"column:embed_detail;type:SMALLINT;default:-1;" json:"-" yaml:"EmbedDetail,omitempty"`
61+
Score int `gorm:"type:SMALLINT;" json:"Score" yaml:"Score,omitempty"`
62+
Thumb string `gorm:"type:VARBINARY(128);index;default:'';" json:"Thumb" yaml:"Thumb,omitempty"`
63+
MatchedAt *time.Time `sql:"index" json:"MatchedAt" yaml:"MatchedAt,omitempty"`
64+
CreatedAt time.Time
65+
UpdatedAt time.Time
6666
}
6767

6868
// TableName returns the entity table name.
@@ -100,7 +100,7 @@ func NewMarker(file File, area crop.Area, subjUID, markerSrc, markerType string,
100100
H: area.H,
101101
Size: size,
102102
ThumbSize: -1,
103-
EmbedUpscaled: -1,
103+
EmbedDetail: -1,
104104
Score: score,
105105
Thumb: area.Thumb(file.FileHash),
106106
MatchedAt: nil,
@@ -141,8 +141,8 @@ func NewFaceMarker(f face.Face, file File, subjUid string) *Marker {
141141
if f.ThumbSize > 0 {
142142
m.ThumbSize = f.ThumbSize
143143

144-
if f.EmbedUpscaled > 0 {
145-
m.EmbedUpscaled = f.EmbedUpscaled
144+
if f.EmbedDetail > 0 {
145+
m.EmbedDetail = f.EmbedDetail
146146
}
147147
}
148148

internal/entity/marker_size.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ func ClusterSizeCond(alias string, floor int) (string, []any) {
3333
// 1, and telling them apart is what lets a migration filling the column terminate.
3434
const ThumbSizeUnmeasured = -2
3535

36-
// EmbedUpscaledUnknown marks a marker a migration sampled without the share of the crop its
36+
// EmbedDetailUnknown marks a marker a migration sampled without the share of the crop its
3737
// source supplied being measurable, beside the ThumbSizeUnmeasured its partner column records for
3838
// the same pass. Negative rather than zero for the same reason as that one: GORM omits a zero
3939
// field on insert where the column has a default, so a zero would read back as never sampled.
40-
const EmbedUpscaledUnknown = -2
40+
const EmbedDetailUnknown = -2
4141

4242
// ThumbSizeSettled reports whether a sampling has answered for this marker's extent, either by
4343
// measuring one or by trying and failing. Only an unsettled marker is worth sampling again.

internal/entity/marker_size_test.go

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -146,23 +146,23 @@ func TestMarkerThumbSize(t *testing.T) {
146146
})
147147
}
148148

149-
// TestNewFaceMarkerEmbedUpscaled pins the states a stored marker distinguishes, since a column
149+
// TestNewFaceMarkerEmbedDetail pins the states a stored marker distinguishes, since a column
150150
// that only ever holds two of them is a bool that cost a SMALLINT.
151-
func TestNewFaceMarkerEmbedUpscaled(t *testing.T) {
151+
func TestNewFaceMarkerEmbedDetail(t *testing.T) {
152152
file := FileFixtures.Get("exampleFileName.jpg")
153153
area := face.NewArea("face", 300, 300, 200)
154154

155155
t.Run("FullDetail", func(t *testing.T) {
156-
f := face.Face{Rows: 720, Cols: 720, Area: area, ThumbSize: 284, EmbedUpscaled: 100,
156+
f := face.Face{Rows: 720, Cols: 720, Area: area, ThumbSize: 284, EmbedDetail: 100,
157157
Embeddings: face.Embeddings{face.RandomEmbedding()}}
158158

159-
require.Equal(t, 100, NewFaceMarker(f, file, "").EmbedUpscaled)
159+
require.Equal(t, 100, NewFaceMarker(f, file, "").EmbedDetail)
160160
})
161161
t.Run("Upscaled", func(t *testing.T) {
162-
f := face.Face{Rows: 720, Cols: 720, Area: area, ThumbSize: 57, EmbedUpscaled: 51,
162+
f := face.Face{Rows: 720, Cols: 720, Area: area, ThumbSize: 57, EmbedDetail: 51,
163163
Embeddings: face.Embeddings{face.RandomEmbedding()}}
164164

165-
require.Equal(t, 51, NewFaceMarker(f, file, "").EmbedUpscaled)
165+
require.Equal(t, 51, NewFaceMarker(f, file, "").EmbedDetail)
166166
})
167167
t.Run("SampledWithoutAnExtent", func(t *testing.T) {
168168
// An endpoint embeds from a reused crop, which reports no source width, so neither
@@ -171,47 +171,47 @@ func TestNewFaceMarkerEmbedUpscaled(t *testing.T) {
171171
f := face.Face{Rows: 720, Cols: 720, Area: area, Embeddings: face.Embeddings{face.RandomEmbedding()}}
172172
m := NewFaceMarker(f, file, "")
173173

174-
require.Equal(t, -1, m.EmbedUpscaled)
174+
require.Equal(t, -1, m.EmbedDetail)
175175
assert.Equal(t, -1, m.ThumbSize)
176176
})
177177
t.Run("NeverSampled", func(t *testing.T) {
178178
// The state every marker written before the column existed is in, and the one a hand-drawn
179179
// marker stays in: nothing has taken a crop for it, so there is nothing to describe.
180180
f := face.Face{Rows: 720, Cols: 720, Area: area}
181181

182-
require.Equal(t, -1, NewFaceMarker(f, file, "").EmbedUpscaled)
183-
assert.Equal(t, -1, NewMarker(file, crop.NewArea("face", 0.4, 0.4, 0.1, 0.1), "", SrcImage, MarkerFace, 100, 50).EmbedUpscaled)
182+
require.Equal(t, -1, NewFaceMarker(f, file, "").EmbedDetail)
183+
assert.Equal(t, -1, NewMarker(file, crop.NewArea("face", 0.4, 0.4, 0.1, 0.1), "", SrcImage, MarkerFace, 100, 50).EmbedDetail)
184184
})
185185
}
186186

187-
// TestMarkerEmbedUpscaledRoundTrip pins that every state survives an insert. The unmeasurable one
187+
// TestMarkerEmbedDetailRoundTrip pins that every state survives an insert. The unmeasurable one
188188
// is negative for exactly this reason: GORM omits a zero field where the column has a default, so
189189
// a zero would be stored as the -1 that means the marker was never sampled.
190-
func TestMarkerEmbedUpscaledRoundTrip(t *testing.T) {
190+
func TestMarkerEmbedDetailRoundTrip(t *testing.T) {
191191
file := FileFixtures.Get("exampleFileName.jpg")
192192

193193
stored := func(t *testing.T, value int) int {
194194
t.Helper()
195195

196196
m := NewMarker(file, crop.NewArea("face", 0.4, 0.4, 0.1, 0.1), "", SrcImage, MarkerFace, 100, 50)
197197
m.MarkerUID = rnd.GenerateUID('m')
198-
m.EmbedUpscaled = value
198+
m.EmbedDetail = value
199199

200200
require.NoError(t, Db().Create(m).Error)
201201
t.Cleanup(func() { UnscopedDb().Delete(m) })
202202

203203
found := FindMarker(m.MarkerUID)
204204
require.NotNil(t, found)
205205

206-
return found.EmbedUpscaled
206+
return found.EmbedDetail
207207
}
208208

209209
t.Run("Measured", func(t *testing.T) {
210210
assert.Equal(t, 51, stored(t, 51))
211211
assert.Equal(t, 100, stored(t, 100))
212212
})
213213
t.Run("Unmeasured", func(t *testing.T) {
214-
assert.Equal(t, EmbedUpscaledUnknown, stored(t, EmbedUpscaledUnknown))
214+
assert.Equal(t, EmbedDetailUnknown, stored(t, EmbedDetailUnknown))
215215
})
216216
t.Run("NeverSampled", func(t *testing.T) {
217217
assert.Equal(t, -1, stored(t, -1))

0 commit comments

Comments
 (0)