39 Commits
Author SHA1 Message Date
Lucas WintherandClaude Opus 5.5 a56257867f docs: mark recoll-modern obsolete in favour of Knowledgenet
Check and publish image / checks (push) Successful in 1m12s
Check and publish image / publish (push) Successful in 12s
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-08 03:25:19 +02:00
Lucas Winther 60d7805133 docs: record successful main image pull
Check and publish image / checks (push) Successful in 37s
Check and publish image / publish (push) Successful in 3s
2026-09-28 03:51:24 +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 be1f1a2c31 fix: default registry login to workflow actor
Check and publish image / checks (push) Successful in 39s
Check and publish image / publish (push) Failing after 2m1s
2026-09-28 03:28:25 +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 354d8fbf99 feat: define published image tags 2026-09-28 02:59:52 +02:00
Lucas Winther 014d31aa94 docs: plan Gitea image publishing 2026-09-28 02:55:35 +02:00
Lucas Winther 718c4bfaee docs: specify Gitea image publishing 2026-09-28 02:53:10 +02:00
Lucas Winther c069ffb807 fix: preserve errors and reject nonregular sources 2026-09-28 02:45:59 +02:00
Lucas Winther 94effe4f2c docs: retire spec 001 checkpoint 2026-09-28 02:38:19 +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 575bc7cecb docs: checkpoint implementation after task 3 2026-09-18 18:33:47 +02:00
Lucas Winther fafa8c81c6 test: guard collection rename from enqueuing work 2026-09-18 18:30:47 +02:00
Lucas Winther 520840cb8e feat: add collection domain 2026-09-18 18:27:03 +02:00
Lucas Winther 8b83a6d49d feat: add SQLite persistence foundation 2026-09-18 18:13:57 +02:00
Lucas Winther bcf1e9a9a9 chore: scaffold Python service 2026-09-18 18:02:33 +02:00
Lucas Winther c5660a89dd docs: approve search engine API plan 2026-09-18 17:52:04 +02:00
Lucas Winther 718d5ce7ff docs: plan search engine API implementation 2026-09-18 17:50:23 +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 a9d46703f5 Merge branch 'feat/001-search-engine-api'
Brainstorm, verified Recoll spike findings, decision log and draft spec 001.
No application code; spec 001 is status: draft and awaiting sign-off.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
2026-09-18 17:09:32 +02:00
Lucas WintherandClaude Opus 5 3d6067f4fa docs: add spec 001 and a resume note for the next session
Writes docs/specs/001-search-engine-api.md covering the search engine and HTTP
API: collections managed at runtime, per-file membership supplied to Recoll at
index time, content-hash document identity with canonical paths, an in-process
indexing job queue, scoped search, and authentication. Twenty-four numbered
requirements, each with an acceptance criterion, plus the constraints the design
must hold: read-only documents, per-file membership, content-hash identity, and
no silently unscoped search.

The spec is status: draft. It has had its self-review pass but has not been
signed off, so no plan and no code may be written against it yet.

Self-review changed three things. Deleting a collection now states that it
enqueues reindexing of the affected canonical paths, because the previous
wording claimed no index work while leaving the deleted id in the index. The
search scope parameter is specified as collection ids rather than names, since
names are mutable and would break saved queries on rename. And the reported
match count is documented as approximate, because Xapian estimates it for large
result sets.

Three known gaps are recorded rather than left implicit: there is no way to read
a matched document until spec 002, the indexing overhead figures come from small
text files rather than real PDFs, and every authenticated user sees every
collection until spec 004.

docs/TODO.md gains a "Resume here" section stating where the workflow stands,
what the next action is, and the traps a resuming agent would otherwise hit --
chiefly that the extended-attribute membership design was superseded mid-session
and survives in the append-only decision log.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
2026-09-18 17:09:26 +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