Two entities this week, and the last two. With Collections and Periods done, all four entity types from the proposal are searchable through the engine, each behind its own merge request on the same stack.
Collections (!1281). The first entity where the template from Proveniences really was a copy: builder, mapping, capture, engine-backed page, database fallback, parity harness, all in the shapes the earlier entities settled. What was new was small and visible. The A-Z browse now runs on a folded field, which fixes a quiet gap in the old one: a collection whose name starts with an accented letter used to be missing from its letter’s page, and now it is there. The classification dropdowns became facets with counts, like the region facet on proveniences. And Collections turned out to be the cleanest entity in the database: not a single name stores a combining mark, so the parity run ended with zero pinned divergences, where Proveniences needed 13 and Publications 39. The parity work still earned its keep here, though: it surfaced seven country codes in the collection data that the reference table cannot resolve, which is now a question for the curators rather than something buried in a join.
Periods (!1283). The smallest entity, 32 rows, and the only one with no search at all today, just a listing. So the work was the pipeline pieces: a document builder, the mapping, capture, and the listing served from the engine in its proper sequence order, with the database as fallback. The one interesting problem was the Arabic period names. They live in a separate translation table, which no earlier entity had, so this was the first time capture had to notice an edit that never touches the entity’s own table. An Arabic-name-only edit now reaches the document like any other change.
The Periods MR also carries one commit that belongs to all four entities. While building Collections i found two defects in the shared search plumbing: a value with broken text encoding could turn a query into “match everything”, silently returning a full page where the database returns none. The fix lands as the final commit of this MR, with a guard per entity and tests proving all four now reject what they cannot serve. It sits last on the stack deliberately, so it reaches the main branch together with everything it protects.
| # | Day | Date | A short description of the work done |
|---|---|---|---|
| 1 | Monday | 2026/07/27 | Built the collection document builder and mapping, and registered the entity across the pipeline |
| 2 | Tuesday | 2026/07/28 | Built capture for collections and verified the delete behavior |
| 3 | Wednesday | 2026/07/29 | Built the read side: engine matching, the folded A-Z browse, facets with counts, database fallback |
| 4 | Thursday | 2026/07/30 | Ran the collections parity harness, verified the accented-letter fix, and opened the collections MR (!1281) |
| 5 | Friday | 2026/07/31 | Built the period document builder and mapping, including the Arabic names from the translation table |
| 6 | Saturday | 2026/08/01 | Built capture for periods, including edits that only touch the translation table, and the engine-backed listing |
| 7 | Sunday | 2026/08/02 | Built the shared encoding fix with its per-entity guards and tests, walked both entities end to end, and opened the periods MR (!1283) |