# "Brentwood 100" — Database Findings (Laravel source)

Findings from a read-only check of the Laravel CMS database, done to answer: *is there
hidden content, and why doesn't the page reach 100 items?*

- **Page:** id `157`, published version id `10175` (the version the live site renders).
- **Method:** a temporary read-only (`SELECT`-only) route was added to the Laravel mirror
  app, queried via the container, then **removed**. No data was modified.
- **Companion file:** the full visible-content listing is in
  [`brentwood-100-content-inventory.md`](./brentwood-100-content-inventory.md).

---

## Short answer

The page is **not meant to contain 100 items.** "Brentwood 100" is the school's
**centenary theme** (100 years since the 1923 founding), not a numbered list of 100 entries.
The badge numbering in the data tops out at **88** and is **non-contiguous**, and only a tiny
amount of content is actually hidden.

---

## Content elements in the published version (10175)

| Type | Count |
|---|---:|
| PhotoBlock | 129 |
| Slideshow | 19 |
| EmbedVideo | 1 |
| **Total** | **149** |

Status of those 149: **149 active**, **3 `unlisted`** (hidden), **0 `guest`-locked**, **0 soft-deleted**.

Note: 149 elements ≠ 149 "stories". Each modal story is built from **two** elements — a
numbered **cover tile** (headerless) plus the **story element** (has the header/body, no
number) — and there are also gallery photo-blocks, montage tiles, and one embedded video.
After pairing, the page resolves to ~**87 visible items** (see the inventory file:
19 inline · 58 modal · 10 montage).

---

## Badge numbering (why it isn't 1–100)

- Distinct badge numbers present: **66**.
- Range: **1 → 88** (not 100).
- **22 numbers are unused** within that range:

  `11, 14, 17, 20, 22, 30, 39, 40, 44, 51, 55, 58, 59, 67, 70, 71, 72, 73, 74, 75, 78, 86`

So even in the source data the centenary was never a contiguous 1–100; numbers were skipped
and it stops at 88.

---

## Hidden / not-displayed content

Only three content elements are flagged `unlisted` in the published version, plus one element
that exists but does not render as its own tile:

### 1. "Country Roads" — `unlisted` (hidden), text-only
A short history story; **not shown on the live page**. No photos attached.

> Excerpt: *"Once upon a time, the British Columbia Department of Highways owned and
> maintained three distinct dead-end roads in Mill Bay. All of them have disappeared.
> Solarium Road is now the handsome liquid amber tree-lined entrance to the school, skirting
> tennis courts and Gillespie Rugby Field…"* (excerpt — full text in DB)

### 2. Two headerless photo tiles — `unlisted`
Two PhotoBlock photo tiles with no header, hidden from display.

### 3. "Uptown" — present but not rendered as a tile
Not flagged `unlisted`, but it does not appear as its own item on the page (its wording about
the origin of the Mill Bay Centre overlaps the visible "Mill Bay Centre" story; it looks like
a legacy/duplicate block). The word "Uptown" only appears inside the Mill Bay Centre body on
the live page.

> Excerpt: *"Original 'Uptown': Mill Bay Centre opened 1977. The grocery store was Gibson's
> Valu-Wise Foods, where Pharmasave is now. Gibson's became the third store in the Thrifty
> Foods chain. The Library opened in 1989."*

**Net:** roughly **one hidden story (Country Roads)** plus two hidden photo tiles, and one
non-rendered legacy block (Uptown). Nothing is removed via delete or locked behind guest auth.

---

## Reconciliation with the crawled inventory

- DB headed stories (excluding the "Brentwood 100" intro hero): **79**.
- Items captured in `brentwood-100-content-inventory.md`: **77 headed stories + 10 montage tiles = 87**.
- The only two headed stories NOT in the inventory are exactly the ones above:
  **Country Roads** (intentionally hidden) and **Uptown** (not rendered).
- Conclusion: the crawled inventory faithfully represents the **live/visible** page; the only
  gaps are content that the site itself does not display.

---

## Version history (this page)

The page has several versions; the live site uses the published one (10175). Active element
counts per version:

| version_id | active elements | note |
|---|---:|---|
| 951 | 147 (of 153) | older |
| 9844 | 147 | |
| 9850 | 6 | partial/working |
| 9855 | 1 | partial/working |
| 9930 | 3 | partial/working |
| 9948 | 1 | partial/working |
| 10005 | 1 | partial/working |
| 10006 | 147 | |
| 10173 | 149 | |
| 10174 | 149 | |
| **10175** | **149** | **published (live)** |

No draft version holds a larger "stash" of ~100 items — the published version is the fullest.

---

## Full content extraction (the authoritative data)

A complete read-only dump of all 149 elements of the published version was taken and saved as
[`brentwood-100-db-dump.json`](./brentwood-100-db-dump.json) (raw ground-truth JSON). It is
richer and more reliable than the HTML crawl. What it contains per element: `sort_order`,
type, `expandable` flag, `number`, `header`, `layout`, full `body` HTML, all flags
(`unlisted/guest/filter/randomize/no_margin`), and every photo with real `sort_order`,
`subtitle` (caption), `title`, `link`, `enlarge`, `alt`, and the actual CDN paths
(`small/medium/large`). 200 photos total.

### How the page is actually built (from the DB)

The 149 elements break down into four roles:

1. **Story elements (80 with a header)** — the real content. Each has header + body + its own
   gallery photos. `expandable = 'modal'` → opens in a modal (59 elements); `expandable = null`
   → rendered inline. (One of the 80 is the "Brentwood 100" intro hero.)
2. **Cover/teaser tiles (64 headerless PhotoBlocks, 1 photo each)** — the front mosaic. Each
   tile's photo carries the story title as its `subtitle` and an anchor link
   `157#c-<element-uuid>` pointing at its story element. These are what you click in the grid.
3. **Numbered photo-montages (5)** — Cookie Break (10), Musical (27), Oceanfront Campus (37),
   Flying Club (77), Dorm Rooms (85): caption + multi-photo slider, no body.
4. **Embedded video (1)** — **"The Fire" (#47)** is an `EmbedVideo` element (layout
   `split-left`): the story has an embedded video, not just photos.

### Important correction about the badge numbers

Only **66 elements carry a stored `number`** in the DB (61 story elements + the 5 montages).
The other badge numbers seen in the HTML crawl (e.g. The Brentwood Chapel "14", Sunday Brunch
"17", Ned Pratt '30 "30", and ~14 more) are **not in the database** — they are assigned by the
front-end at render time. Cross-check: of 77 stories, 61 numbers match the DB and 16 had a
number in HTML but `NULL` in the DB.

**Takeaway:** the badge number is a display artifact, **not a stable identity**, and it is not
a reliable key for migration. Use the element UUID / header instead. (This also fits the
randomized display order — see `project-brentwood-100-randomized-order`.)

## Migration implications

- Don't target "100 items." Migrate the **87 visible items** (inventory file) as the page content.
- Decide with the client what to do with the hidden content:
  - **Country Roads** — keep hidden, publish, or drop.
  - **Uptown** — likely a duplicate/legacy of "Mill Bay Centre"; confirm before carrying it over.
- **Do not rely on badge numbers as identity** — only 66 elements have a stored `number`; the
  rest are front-end-assigned. Use the element UUID / header as the key. Display order is
  randomized per visit (see memory `project-brentwood-100-randomized-order`).
- Migrate from the **DB dump** (`brentwood-100-db-dump.json`), not the HTML crawl: it has the
  true photo order, real image URLs, full body HTML, and the modal/inline flag. Remember
  "The Fire" carries an **embedded video**.
