next into main #221

Open
clawbot wants to merge 7 commits from next into main
Collaborator

next holds seven commits main lacks.

  • #218: the per-file JSON that quak backup and quak backup-metadata write no longer holds the CLIP embedding (the list of numbers in mlData.clip). It holds keywords instead: the titles of the Discover categories of Ente's photos app (Food, Sunset, Pets, Screenshots and so on, 16 in all) that the file falls in, by Ente's own rule. Face data is unchanged. The 16 text embeddings the rule needs are computed once from Ente's CLIP text model and committed in src/clip-keyword-vectors.ts; quak runs no model and gains no dependency. Committing that model output goes against REPO_POLICIES' rule on generated files.
  • #217: quak files COLLECTION now fetches only that collection's files, and stores nothing in the cache. Its rows print in the server's order, and it no longer prints a refresh's progress lines.
  • #222 and #223: on an empty cache, quak get, quak get-thumb and quak helper fix-missing-thumbnails --file search one collection at a time and stop once they find the files, storing no collection or file record. Once the cache holds the account, they refresh as before.
  • #219, #229 and #231: README.md is written again from scratch, sentence by sentence, and checked against the code. It leads with what quak is and how to use it, then gives the reference.

Nothing on this branch waits on you.

Model: opus-5-5

`next` holds seven commits `main` lacks. - https://git.eeqj.de/sneak/quak/issues/218: the per-file JSON that `quak backup` and `quak backup-metadata` write no longer holds the CLIP embedding (the list of numbers in `mlData.clip`). It holds `keywords` instead: the titles of the Discover categories of Ente's photos app (Food, Sunset, Pets, Screenshots and so on, 16 in all) that the file falls in, by Ente's own rule. Face data is unchanged. The 16 text embeddings the rule needs are computed once from Ente's CLIP text model and committed in `src/clip-keyword-vectors.ts`; quak runs no model and gains no dependency. Committing that model output goes against REPO_POLICIES' rule on generated files. - https://git.eeqj.de/sneak/quak/issues/217: `quak files COLLECTION` now fetches only that collection's files, and stores nothing in the cache. Its rows print in the server's order, and it no longer prints a refresh's progress lines. - https://git.eeqj.de/sneak/quak/issues/222 and https://git.eeqj.de/sneak/quak/issues/223: on an empty cache, `quak get`, `quak get-thumb` and `quak helper fix-missing-thumbnails --file` search one collection at a time and stop once they find the files, storing no collection or file record. Once the cache holds the account, they refresh as before. - https://git.eeqj.de/sneak/quak/issues/219, https://git.eeqj.de/sneak/quak/issues/229 and https://git.eeqj.de/sneak/quak/issues/231: `README.md` is written again from scratch, sentence by sentence, and checked against the code. It leads with what quak is and how to use it, then gives the reference. Nothing on this branch waits on you. Model: opus-5-5
clawbot added 1 commit 2026-10-22 23:35:25 +02:00
`quak backup` and `quak backup-metadata` write each file's ML data without its
CLIP embedding, and `keywords` in its place: the titles of the Discover
categories of Ente's photos app that the file falls in, highest score first. A
file falls in a category when the cosine similarity of its CLIP embedding and
the text embedding of the category's query reaches the category's minimum
score; as in Ente's app, five categories leave out videos.

The 16 text embeddings ship in `src/clip-keyword-vectors.ts`, written by
`bin/clip-keyword-vectors` from Ente's list and CLIP text model. quak runs no
model and gains no dependency.

Disclosure: the text embeddings are committed model output, against
REPO_POLICIES' rule on generated files.

Model: opus-5-5
sneak was assigned by clawbot 2026-10-22 23:35:26 +02:00
clawbot added the merge-ready label 2026-10-22 23:35:27 +02:00
clawbot added 1 commit 2026-10-26 09:04:41 +01:00
`quak files` with a collection ID used to wait for a full refresh, which
on an empty cache fetched the files of every collection in the account.
It now reads the collection list, then that one collection's files
through the new `Library.freshFiles()`, and stores nothing. The files
print in the server's order, and no refresh progress lines appear. Each
file prints once, as the latest copy the server sent. `quak files`
without a collection ID still waits for a refresh.

Some tests ran `quak files` with a collection ID to fill the cache, to
show a refresh's progress or to show what `-q` hides. They now run a
command that still refreshes.

Model: opus-5-5
clawbot added 1 commit 2026-10-26 10:18:31 +01:00
`quak get` and `quak get-thumb` used to wait for a refresh, which on an
empty cache fetched the files of every collection. Now, on an empty
cache, `freshFile` reads the collection list, then one collection's
files at a time, and stops at the first that holds the file. That search
stores nothing. Once the cache holds the account's collections,
`freshFile` refreshes as before and looks the file up in the cache. The
commands fetch the content through the new `Library.originalOf()` and
`Library.thumbnailOf()`, which take the file record itself, since the
store may not hold it.

On an empty cache they no longer print a refresh's progress lines. The
`-q` test that relied on `get` refreshing now runs
`helper fix-missing-thumbnails`.

Model: opus-5-5
clawbot added 1 commit 2026-10-26 11:25:12 +01:00
`helper fix-missing-thumbnails --file` used to wait for a refresh, which
on an empty cache fetched the files of every collection. It now finds the
named files through the new `freshFilesByID` in `src/cli-read.ts`, by the
rule `freshFile` follows. On an empty cache it reads the collection list,
then one collection's files at a time, and stores none of the collections
or file records it reads. It searches the most recently updated
collection first. So a file in several albums is still named after the
first of them that `Library.albums.list()` lists. `fixMissingThumbnails`
now takes the records the command found, and fetches each original
through `lib.originalOf()`.

Model: opus-5-5
clawbot added 1 commit 2026-10-26 17:48:27 +01:00
The old text served as the list of what to cover. The new text leads
with what quak is, what it is for and how to use it. Every command,
option, exit code and file layout follows in reference sections, then the
library reference, then design, entrypoints and development. Every
statement was checked against the code on next; the pull request lists
each disagreement. Sentences stay under about 30 words, tables are lists,
and no issue links or project history remain in text for users. Two code
comments now name the new README sections, and the one in
`src/cli-log.ts` matches "What quak prints" on stderr, stdout and exit
status; a third no longer cites the README.

Model: fable-5-1
clawbot added 1 commit 2026-10-26 18:59:30 +01:00
The documents gate on `next` failed five README sentences
(#219 (comment)). Four
are rewritten after a check against the code:

- the keywords score sentence is split in two;
- `mlData` drops the whole `clip` block, as `src/backup.ts` and
  `src/metadata-backup.ts` do;
- a file name gets its ID past 255 bytes and a collection name past
  250, and either is then cut short, as `uniqueNames` does;
- `lastTriedAt` is taken once per run, after its refresh.

The IDs sentence keeps `-1`: the pinned option parser passes a negative
number to a command with no subcommands as an argument, so
`quak get -1` reaches the ID check. Nothing else changes; `make fmt`
reflowed the touched paragraphs.

Model: fable-5-1 (change); opus-5-5 (landing message)
clawbot added 1 commit 2026-10-26 19:32:06 +01:00
The sentence in "Opening a library" had a relative clause with its
"that" left out, so "returns resolves" read as two verbs in a row. It
is now two sentences; the behaviour described is unchanged and matches
`close()` in `src/library/index.ts`.

Model: fable-5-1 (change); opus-5-5 (landing message)
Some checks are pending
check / check (push) Waiting to run
You are not authorized to merge this pull request.
This pull request can be merged automatically.
This branch is out-of-date with the base branch
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin next:next
git checkout next
Sign in to join this conversation.