# EPB3: a reproducible book location EPB3 represents every possible 410-page volume using the 29-character alphabet `abcdefghijklmnopqrstuvwxyz ,.`. Each page has 3,200 characters: 40 rows × 80 columns. The canonical book has 1,312,000 digits. Indices below start at zero. ## The simple reversible part Character positions in the alphabet are digits 0..28. Encode each digit using `0123456789abcdefghijklmnopqrs`, retaining all leading zeros. A page address is exactly 3,200 encoded digits. Its inverse maps each symbol back to the same-index character. The canonical book address is `epb3c/` followed by all 410 encoded pages in page order. It has exactly 1,312,006 ASCII characters. This is a one-to-one encoding of the complete finite page/volume space, including repeated spaces. It needs no scrambling, private key, search query or hash to reverse. To read canonical page p, decode the 3,200 symbols beginning at offset 6 + p×3200. Do not discard leading zeros or interpret a short ID as this address. ## A shorter immutable spelling: the recipe Search normally saves `epb3r/` followed by canonical unpadded base64url of ASCII JSON. Keys must appear in this exact order; no extra keys or whitespace: ``` {"v":"epb3","kind":"anchor-pages-v1","search":"epb3-ranked1000-v1","seed":"64 lowercase hex digits","anchors":[[pageIndex,"complete 3200-symbol page address"]]} ``` Anchors have increasing unique page indices in 0..409; there are 1..410 anchors. The reader decodes an anchored page directly. Every other page is generated from that frozen 32-byte seed and its page index. The reader never accepts a separate passage to insert. Recipes are limited to 2,000,000 ASCII characters. Re-serializing and encoding must reproduce the input exactly; alternative JSON spellings fail. For non-anchor page p, use BLAKE3 XOF of UTF-8 `EPB/v3/page-fill-v1`, one zero byte, the seed bytes, then p as unsigned 16-bit big-endian. Read XOF bytes continuously; reject bytes >=232 and reduce each accepted byte modulo29 until 3,200 digits. The implementation reads blocks of 4,096 XOF bytes. Each page starts a fresh XOF, so it can be reconstructed without generating any earlier page. ## How search chooses a book Normalization remains `norm-v2`: lowercase Library reading, supported punctuation, number reading and whitespace rules. The original accepted source is retained separately and is authoritative for the original submission. Normalization is not lossless, and its mask is not a promise of arbitrary Unicode restoration. For normalized digits D, length L, and candidate index k (0..999), the 32-byte seed is BLAKE3 of UTF-8 `EPB/v3/candidate-v1`, zero byte, unsigned64 little-endian L, raw D bytes, unsigned64 little-endian k. Page count is ceil(L/3200). Placement uses BLAKE3 XOF of UTF-8 `EPB/v3/placement-v1`, zero byte, seed, and UTF-8 label `page` or `offset`. Read unsigned32 big-endian values; reject values >=floor(2^32/r)×r, then reduce modulo r. Page range r is 410-pageCount+1. For L<=3200, offset range r is 3200-L+1; longer passages use offset zero. Fill every anchor page by the page rule, place D into those pages once when creating the recipe, then save each complete resulting page address. A full-volume input uses its canonical address and candidate index zero: it is one exact book, rather than four distinct books. Short-passage search scores 1,000 candidate pages, excluding the passage itself. The score sums squared lengths of recognized fill tokens using word-list@4.1.0; ties use increasing k. It selects up to four distinct available canonical books. Longer passages try up to four deterministic candidates. Registry availability can change the selected results, without changing a candidate's saved pages. ## Equality, labels and compatibility Expand a recipe to the canonical address to compare books exactly. Two different recipes may mean the same book. BLAKE3 of UTF-8 `EPB/v3/canonical-identity-v1`, zero byte, and raw full-volume digits supplies a 64-hex lookup digest. The first 32 hex characters supply a short operational ID for new books. Neither hash is the reversible address or a mathematical uniqueness proof. Storage compares the complete canonical address and fails closed on digest/key collisions; canonical page-range exclusion also protects claims across old and new encodings. For decorative wall/shelf/volume labels, interpret all canonical digits as a base29 integer modulo640: wall=floor(remainder/160), shelf=floor(remainder%160/32), volume=remainder%32. Those labels do not identify a complete book on their own. EPB2 records retain their original addresses, IDs and decoder. Their page contents are never migrated into EPB3 search results. Compatibility metadata can recognize identical contents without rewriting the purchased record. Use the decoder selected by the saved record's version. Published JS and fixed golden examples provide executable details; tests are examples, not an exhaustive proof.