Purser mark: a gold crescent behind an ivory wing

The manual, answered.

Cited answers from a 1,226-page safety manual, for the cabin crew who fly by it. The model finds the page. The manual supplies the words.

View on GitHub

Where it started

A friend of mine is a flight attendant. Her safety and emergency procedures manual runs to 1,226 pages. General chatbots failed her twice: the PDF was too big to upload, and when one did answer, there was no telling a sentence from the manual from a plausible one the model made up. For the brace commands on a ditching, sounding right is a failure.

From 1,226 pages A PDF too big to upload whole, and answers nobody could check.
Flight
PSR 1226
Aircraft
A320 / A321
To One page The right page, with the manual's own lines on it, cited so anyone can check.
Seat
12A, exit row
Gate
GitHub
PART THREE ยง3.6 p.7
The exit rows port and starboard side must be occupied by at least one ABP for take-off and landing.

That line is the manual's, not the model's. The model only points to a page and a line range. The words are cut from the manual itself.

How it works

Two searches run side by side and meet in the middle. The agent reads whole sections, then points at the lines it used. Only the manual writes the quote.

Questionplain language Exact wordsBM25 over SQLite FTS5 Meaningbge-small embeddings Rank fusionRRF, k = 60 Read the sectionwhole pages, 6 at a time Point, don't quoteCiteRef(page, from, to) The manual's wordsspliced byte for byte The appPWA with live citations Claudethe same tools over MCP Question Exact wordsBM25, FTS5 Meaningbge-small Rank fusionRRF, k = 60 Read the sectionwhole pages, 6 at a time Point, don't quoteCiteRef(page, from, to) The manual's wordsspliced byte for byte The appPWA ClaudeMCP

Instruments

40 real crew questions, each with the section it should land on. The check runs with every test, so a slip fails the build.

40/40 040
right section in the top 8
34/40 040
right section in the top 3
0.748 01
mean reciprocal rank