Commit Graph
24 Commits
Author SHA1 Message Date
Lucas Winther 5c8a4937be fix: bind deployment state to local data directories 2026-09-28 17:16:07 +02:00
Lucas Winther 61108185f0 fix: keep published Recoll image below registry upload limit
Check and publish image / checks (push) Successful in 58s
Check and publish image / publish (push) Successful in 11s
2026-09-28 03:46:36 +02:00
Lucas Winther 1965f89c92 fix: isolate registry publishing and pin image revisions
Check and publish image / checks (push) Successful in 1m33s
Check and publish image / publish (push) Failing after 2s
2026-09-28 03:17:33 +02:00
Lucas Winther ceedbae1f3 docs: explain pulling and running published image 2026-09-28 03:10:28 +02:00
Lucas Winther f67e0c2ea0 ci: publish Gitea container image 2026-09-28 03:05:46 +02:00
Lucas Winther c66469bdc1 fix: close search API review findings 2026-09-28 02:32:40 +02:00
Lucas Winther 653c32db43 fix: make indexing review paths replay-safe 2026-09-27 19:12:56 +02:00
Lucas Winther 77fa48c7a2 test: verify search engine API acceptance 2026-09-26 14:10:22 +02:00
Lucas Winther 56805a97cf feat: package Recoll service 2026-09-26 13:05:15 +02:00
Lucas Winther 57c0f5ca0b feat: add scoped search and retrieval 2026-09-26 11:28:41 +02:00
Lucas Winther 734ba404c8 feat: expose membership and job APIs 2026-09-26 11:23:00 +02:00
Lucas Winther ad192365a1 feat: add authenticated HTTP service 2026-09-26 11:15:32 +02:00
Lucas Winther 57e5215a36 feat: add session authentication 2026-09-26 11:03:27 +02:00
Lucas Winther 863f671129 feat: add Recoll engine boundary 2026-09-26 10:59:09 +02:00
Lucas Winther f6f03b9128 feat: export Recoll membership metadata 2026-09-26 10:51:40 +02:00
Lucas Winther cbc07b2897 feat: add durable indexing jobs 2026-09-26 10:40:47 +02:00
Lucas Winther e80d59e7d7 feat: add membership provenance and rules 2026-09-26 10:32:49 +02:00
Lucas Winther 9e896fc410 feat: add document discovery and identity 2026-09-26 10:23:57 +02:00
Lucas Winther bcf1e9a9a9 chore: scaffold Python service 2026-09-18 18:02:33 +02:00
Lucas Winther 9981645f4e docs: preserve desktop packaging seam 2026-09-18 17:37:17 +02:00
Lucas Winther b776ee603e docs: complete search engine API design 2026-09-18 17:34:16 +02:00
Lucas WintherandClaude Opus 5 883db6a59d docs: supersede the xattr membership design for read-only documents
The service must work with read-only access to the documents it indexes.
Writing a user.collection extended attribute needs write access, so the
previous membership design fails on a :ro mount; setfattr returns "Read-only
file system". Verified in the spike container.

Membership now reaches Recoll through metadatacmds in recoll.conf, a documented
facility for external metadata: Recoll runs a helper per file at index time and
the helper answers from our own store. Verified end to end against a read-only
bind mount. Everything previously established about opaque collection IDs,
multi-membership and single-ranked-set OR queries survives unchanged, because
only the transport differs. SQLite becomes the only store of membership rather
than the authoritative one of two, so drift is impossible and the reconcile path
is gone. Extended attributes are no longer a deployment requirement.

Document identity becomes the SHA-256 of file content. Files sharing a name but
differing in content are separate documents; one file reachable by several paths
is a single document with one canonical path, and only that path is reported as
belonging to a collection. Recoll cannot help here: md5 is empty and sig is only
size plus mtime.

Two measured constraints are recorded. A membership change is invisible to both
a plain incremental run and recollindex -i, because the change signature is size
plus mtime; recollindex -i -Z on the affected path picks it up in about 15ms.
And the helper is spawned once per file per index run, so it must start fast: a
400-file index took 0.09s with no helper, 0.13s with shell and awk, and 0.82s
with python3.

The superseded entry in docs/DECISIONS.md is left intact, per that file's
append-only rule, and the new entry links back to it.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
2026-09-18 17:06:29 +02:00
Lucas WintherandClaude Opus 5 def811bab4 docs: close the six open design questions for spec 001
Records the outcome of the 001 brainstorm and the Recoll spike that backed it.

Decisions: Python + FastAPI managed with uv; the product split into four specs
built in order; collections managed at runtime through the API with SQLite as
the store of record; indexing as an in-process job queue; search scope as an
explicit required parameter; results carrying metadata and snippets; real
authentication in 001 with user administration deferred to 004.

The load-bearing one is collection membership. A collection cannot be a
directory, because files sharing a directory must be able to belong to
different collections, so every document is indexed once into a single Recoll
index and membership is a user.collection extended attribute mapped to a
queryable field. Verified against Recoll 1.43.0 in a throwaway container: the
tag must be an opaque single-token ID rather than the collection name, because
Recoll tokenises the field value and matches case-insensitively, so a tag of
cook-books is also matched by collection:cook and collection:books. Names as
tags would let collections silently bleed into each other. Opaque IDs also make
renaming free, since the index is never touched.

Two operational consequences are recorded in docs/TODO.md: documents must live
on a volume with extended-attribute support, checked loudly at startup, and a
plain incremental recollindex does not notice xattr-only changes, so retagging
must go through recollindex -i on the affected file.

uv 0.12.16 was installed on this host as part of the stack decision; AGENTS.md
is corrected in the same commit, since it previously listed uv as absent.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
2026-09-18 16:57:54 +02:00
Lucas WintherandClaude Opus 5 895eabcb69 chore: bootstrap agent-ready docs and rules
Empty repository: no commits, no stack. Establishes AGENTS.md as the single
source of truth, thin CLAUDE.md/GEMINI.md pointers, permission config, and the
docs/ progressive-disclosure tree.

Commands section is deliberately unfilled — no stack exists to verify commands
against.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
2026-09-18 16:41:56 +02:00