Files

P5b implementation plan: questions on long documents

For the implementing model: do not work from this file. The owner gives you one task file at a time. This file is the index for the owner and the reviewer.

Goal: P5a refuses question on a PDF longer than 200 digest chunks (~240k tokens) with "use grep or pages". After P5b such a question is answered: at once from BM25 over page-aware chunks, while the document's chunks are embedded in the background; once they are, later questions use today's hybrid score. Two facts found while planning:

  • The embedding cache (dcache GetEmbed/PutEmbed, EmbedKey) exists but nothing uses it: every question re-embeds every chunk.
  • Split is line-based, so a chunk that starts mid-page carries no --- page N --- marker and the model cannot cite its page.
Task Package Given
01-splitpages-bm25 internal/digest (pure functions) digest/splitpages_test.go, digest/bm25_test.go
02-retrieval internal/digest digest/retrieval_test.go
03-api internal/api, README.md, skill/SKILL.md api/pdf_retrieval_test.go; replaces api/pdf_test.go (P5a: the 200-chunk default becomes 5000)

How this plan was made: acceptance tests first, no reference implementation; the given tests compiled against a panic-only skeleton on master 1311cf3 and failed for the intended reasons.

Changes during the run

  • Run 1, task 01 (2026-09-26 11:01–12:24): infrastructure, not the model. straylight's llama-server ran out of shared KV (4 slots over one 262,144-token pool). The session got Context size has been exceeded with no commit. Hermes's ornith context was capped at 131072 (Kyle: "b is acceptable"); the task was re-run clean and passed (dca0004, rebased to 7595ad8).
  • Task 02, first attempt: my test, not the model or the task. TestEmbeddingsAreCachedAcrossQuestions used longDoc(12), which is 4,617 tokens. That is under SmallDoc (6000), so rule 2 answers it "whole", while the test expected "hybrid". Ornith measured the document and was working it out when I stopped the session (22 min). Fix d52a4fa: longDoc(30) (11,677 tokens, 10 chunks) plus a t.Fatalf precondition. Relaunched from task 02 on a clean tree.