Artifacts

chops-search build writes two kinds of file into out (default static/search/): content-hashed index artifacts, and the unhashed browser runtime.

Index artifacts

FileLoadingContents
model.meta.<hash>.binEager, gzippedComplete vocab + per-row quantization scales. Never partial: a truncated vocab tokenizes silently wrong
model.prefix.<hash>.i8EagerTop ~2048 frequency-ordered rows, covering most queries outright
index.<hash>.binEager, gzippedChunk vectors, document URLs and titles, keyword postings
model.rows.<hash>.i8Range-fetched per queryFull matrix, headerless raw i8; row i at byte i × dim
snippets.<hash>.binRange-fetched after rankingPer-chunk display text
manifest.jsonEager, revalidatingNames every hashed file; the only unhashed artifact

Filenames carry a build hash so everything above manifest.json can be served immutable. Artifacts are byte-stable given the same content and model: sorted walks, sorted postings, deterministic tie-breaks, so an unchanged site rebuilds to identical hashes and browser caches stay warm.

What changes when

You changedFiles that get new hashes
Site contentindex, snippets
The model or dimsmodel.meta, model.prefix, model.rows, plus index and snippets (chunk vectors re-embed)
NothingNothing; the build is reproducible

The runtime

FileRole
chops-search.jsPage script: overlay/inline UI, worker bootstrap
chops-search.cssOverlay styles, themed via currentColor and .chops custom properties
search-worker.jsThe Web Worker that plans, fetches, and queries
pkg/The wasm engine and its glue, requested with ?v=<build hash>

The runtime files have stable names (they're referenced from your templates), so they must not be cached immutable; the wasm under pkg/ is version-queried and safe to pin. The deployment guide has the exact _headers policy.