Skip to content

[pull] develop from photoprism:develop - #1778

Merged
pull[bot] merged 9 commits into
Uncodedtech:developfrom
photoprism:develop
Aug 31, 2026
Merged

[pull] develop from photoprism:develop#1778
pull[bot] merged 9 commits into
Uncodedtech:developfrom
photoprism:develop

Conversation

@pull

@pull pull Bot commented Aug 31, 2026

Copy link
Copy Markdown

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

The clustering thresholds are read from the face package, which only
Propagate assigns, so a migration re-clustered at the previous model's
distances until the next start. SetFaceModel now propagates them.

A migration that runs from the CLI also leaves a running instance behind:
it kept the model it started with and advised migrating to it, which
would have undone the run. That is now told apart from a genuine
mismatch, embedding work is paused, and a restart is asked for instead.
Recognition assigns a person to the markers of a cluster that already
carries one, which writes subj_uid without going through the matcher's
update count. A run whose whole output was that left the counts stale, so
the newly recognized pictures did not reach the people views, which order
and filter on them. Only "faces update" without --force was affected.
A face crop is taken from a pre-generated rendition and never from the
original, so a cache capped below what the crops need embeds a library
from upscaled pixels while the detail sits on the same disk. Nothing
downstream can tell such a vector apart, so the repair is a second full
migration. The plan now counts the markers a wider thumbnail would fix
and names the "--thumb-size" that clears them, apart from the ones whose
original is too small, which no setting recovers.

The upscaling log line also named the file it was handed rather than the
rendition that was opened, which sends a diagnosis to the wrong image.

Documents these and the two preceding commits in the face README.
The pre-flight read THUMB_SIZE, which says what indexing writes from now
on and nothing about the files already there: raising it without running
"photoprism thumbs" cleared the warning while every crop still came from
the renditions on disk, and its own remedy left it firing forever. The
plan now samples the ladder the oldest files hold, so both directions
answer from the cache, and the remedy names a "thumbs" run when the limit
already covers the size that clears it.

Also asks for the width the aligned crop actually requests rather than
the fallback's, so the shortfall is not over-reported; consults the
recorded model before clearing a pause a worker set; sends the restart
notice through the system log; and no longer refuses a migration when
this advisory count cannot be taken.
…them

A face crop is taken from a cached rendition and never from the original,
so a library indexed at a lower THUMB_SIZE was embedded from upscaled
pixels while the detail sat in the original on the same disk. Asking the
operator to pre-generate the whole ladder first costs storage and hours
for renditions most files never need, and a run they skip that step for
has to be repeated in full. The run now renders the one rendition each
file's smallest marker needs, under the hash the index recorded, and
lifts the on-demand size limit while it does: that limit exists because a
search results page renders hundreds of thumbnails at once, which a batch
run in a terminal does not do.

The pre-flight therefore forecasts that work rather than warning about
it, and states apart the markers whose originals are too small, which is
the only part no rendition recovers.
A render that failed was a debug line and nothing else, so a cache volume
that is read-only or full left the run embedding from upscaled crops with
no trace - the outcome the pass exists to prevent, and the one it cannot
show afterwards. It is now counted, reported once while it happens and
again in the summary, and the run refuses to start, and stops between
batches, when storage is critically low.

The rendition is also bounded at Fit4096, above which a face gains
nothing measurable and nothing else refreshes or purges what was written;
a file whose bytes are not the ones its recorded hash names is left
alone; and an empty rendition no longer counts as one the cache holds.
The second detection pass finds the smallest faces in a library, and a
crop is taken from a pre-generated rendition: where the cache offers none
wider than the detection thumbnail, those faces are detected only to stay
unrecognizable, because they reach neither the model's template nor the
clustering bar. Unset, FACE_SIZE_RETRY now follows what a crop can reach
- off at a thumbnail limit of 720, 20 up to 1920, and the shipped 10
above that or when on-demand rendering is enabled, which is consent to
render what is missing.

An explicit value stands in either direction. The flag carries no Value,
or the option would be non-zero on every start and never reach the
derivation.
…ng bar

A vector drawn from too few pixels is indistinguishable from one that was
not, so an operator whose thumbnails are smaller than their faces need -
or whose migration could not write a rendition - has nothing to read. The
audit now counts the markers whose recorded extent is below the bar, and
how many of those their original could still supply, which separates what
a re-run recovers from what no thumbnail size can.
@pull pull Bot locked and limited conversation to collaborators Aug 31, 2026
@pull pull Bot added the ⤵️ pull label Aug 31, 2026
@pull
pull Bot merged commit 3135088 into Uncodedtech:develop Aug 31, 2026
2 checks passed
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant