# Knowledge Base — Operation Log

Append-only. Format: `## [YYYY-MM-DD] <verb> | <title>`

Verbs: `bootstrap`, `register`, `ingest`, `compile`, `lint`, `schema`

---

## [2026-05-15] bootstrap | initial setup

- Created `knowledge-base/` with SCHEMA.md, index.md, log.md, raw-sources/index.md
- Schema proposed and approved
- Source buckets: newspapers, advertisements, images, research
- Topic directories: people, brands, companies, events, documents, places

## [2026-05-15] ingest | W. E. Hayman Death Notice (1924)

- Source: `work/inbox/W_E_Hayman_Death_Notice.pdf` → slug `hayman-death-notice-1924`
- Registered: raw-sources/index.md (newspapers bucket)
- Updated: people/w-e-hayman.md (created)

## [2026-05-15] ingest | Coffee Company Prospers (1920)

- Source: `work/inbox/Coffee_Company_Prospers.pdf` → slug `coffee-company-prospers-1920`
- Registered: raw-sources/index.md (newspapers bucket)
- Updated: companies/hoffman-hayman-company.md (created)

## [2026-05-15] ingest | Western Coffee Company Charter (1907)

- Source: `work/inbox/Western_Coffee_Company_of_San_Antonio.pdf` → slug `western-coffee-company-charter-1907`
- Registered: raw-sources/index.md (newspapers bucket)
- Updated: companies/western-coffee-company.md (created)

## [2026-05-15] ingest | New Enterprise Deserves Success (1907)

- Source: `work/inbox/New_Enterprise_Deserves_Success.pdf` → slug `new-enterprise-deserves-success-1907`
- Registered: raw-sources/index.md (newspapers bucket)
- Updated: companies/western-coffee-company.md (cascade — second source for same company)

## [2026-05-15] ingest | 1937 fire cluster + 1928 fire (5 sources)

- Sources: 1937-02-27-fire-sweeps-coffee-plant, 1937-11-21-plant-output-is-increased, 1937-11-21-supplying-trade-with-h-h-coffee, 1937-11-21-thank-you, 1928-08-31-fires-damage-home-coffee-plant
- Created: events/1937-aviation-coffee-fire.md
- Updated: companies/hoffman-hayman-company.md — 1937 expansion, product formats table, 331 Burnett confirmed, competitor fire noted
- Updated: index.md — Events section populated
- Key findings:
  - Feb 1937 fire was at COMPETITOR Aviation Coffee Company (119 S. Medina St, owner A.A. Walker), NOT Hoffmann-Hayman; complete loss, $20,000
  - Nov 1937: expansion at 601 Delaware — new vacuum canning machinery for 1 and 3-lb tin cans
  - Three product formats by 1937: paper bag, vacuum can (tin), Crystalvac (glass jar)
  - Founding month: Nov 1937 ad says "thirty-three years ago this month" → November 1904 (Oct 1934 ad said October — one month variance unresolved)
  - Gus P. Menger still leading company in Nov 1937; portrait published
  - 1928 fire: "slight damage" at 331 Burnet street — confirms that address in Aug 1928
  - Packing department photo (Nov 1937) shows large workforce at 601 Delaware

## [2026-05-15] ingest | 1905–1909 early Hoffmann cluster (6 sources)

- Sources: 1905-01-17-h-e-hayman-arrives, 1907-08-25-big-coffee-roasting-plant, 1908-02-14-wm-r-hoffmann, 1908-06-01-hoffmann-rhyme, 1909-06-02-marriage-licenses, 1909-06-06-hoffman-menger-marriage
- Updated: people/william-r-hoffmann.md — major rewrite with portrait, early biography, St. Louis connection, 208 E. Commerce address, "Hoffmann's Package Coffee" and "Gold Elephant tea" brands, marriage details, Nolan & Hackberry home
- Updated: people/minnie-menger-schlosser.md — full name Wilhelmina, marriage date June 1 1909, parents Dr. & Mrs. R. Menger
- Updated: people/menger-family.md — Dr. R. Menger identified as patriarch (father of Minnie and likely Gus P.)
- Updated: people/w-e-hayman.md — H.E. Hayman (Peoria) noted as possible relative
- Updated: companies/western-coffee-company.md — 1907 Express-News detail added ("largest of its kind in the State")
- Key findings:
  - Hoffmann "formerly of New Braunfels and St. Louis" — St. Louis experience previously unknown
  - 1908 article: established in SA ~1902 ("six years ago"); 208 E. Commerce St; warehouse on SP track
  - Early brands before H and H: "Hoffmann's Package Coffee" (20–40¢) and "Gold Elephant" tea
  - By June 1908, Hoffmann already "a noted character in San Antonio" — published rhyme in SA Light
  - Marriage: June 1, 1909; Minnie's full name Wilhelmina; parents Dr. & Mrs. R. Menger (E. Commerce St)
  - First marital home: cottage at Nolan and Hackberry Streets
  - H.E. Hayman of Peoria visited SA Southern Hotel, Jan 1905 — possible W.E. Hayman relative
  - 1907 Express-News: Western Coffee Company "largest of its kind in the State" at opening

## [2026-05-15] ingest | 1921–1922 company profile cluster (3 sources)

- Sources: 1921-08-14-hoffmann-hayman-pioneer-concern, 1922-12-10-little-journeys-to-the-homes-of-big-industries, 1922-11-05-h-and-h-ad
- Updated: companies/hoffman-hayman-company.md — founding year table (1899/1900/1904 variants resolved), 307 N. Medina St address, 1921 capacity/workforce figures, Hoffmann's daily work method
- Updated: people/menger-family.md — full names (Rudolph W., Louis B.); timeline row for Jan 1920 purchase; Dec 1922 row showing Minnie already remarried
- Updated: people/minnie-menger-schlosser.md — remarriage to Schlosser confirmed by Dec 1922 (earlier than noted)
- Key findings:
  - Hoffmann's working method: solicited by day, roasted/packed evenings, delivered next day
  - Original roaster capacity: 300–400 lbs/day
  - Menger brothers purchased business January 1920
  - Full names: Rudolph W. Menger (R.W.), Louis B. Menger (L.B.)
  - 1921: 3 roasters × 200 lbs/hr; 14,480 lbs avg daily; 17 machine operators; 7,000 sq ft
  - 1922 address: 307 North Medina Street (multi-story brick building)
  - Minnie Menger already Mrs. William Schlosser by December 1922
  - "Little Journeys" confirms Hoffmann died in 1912 ("ten years ago" from Dec 1922) — refutes 1923 article's erroneous "1910"
  - H and H tea first year: 65% store distribution in SA; "surpassed all expectations"
  - 90% of city grocers + all within 100-mile radius carry H and H products (1922)

## [2026-05-15] ingest | 1932 new plant cluster (14 sources)

- Sources: 1932-03-05-banner-year, 1932-06-03/06 Crystalvac launch (×2), 1932-07-24 plant modern throughout, 1932-08-06 new home, 1932-10-22 nearing completion, 1932-11-05 about ready, 1932-11-28 spice department, 1932-12-21 southwest finest + tiny roaster (×2), 1932-12-28 lions club (×2), 1932-07-09 days fresher, 1932-12-19 3-pound jars
- Created: places/601-delaware-street.md
- Created: brands/crystalvac.md
- Updated: companies/hoffman-hayman-company.md — 1932 officers, new plant section, Crystalvac, "since 1899" resolution
- Updated: people/william-r-hoffmann.md — clerk at George C. Sauer's grocery on Alamo Plaza; William P. Hoffman as likely son (VP 1932); Gus P. Menger confirmed as brother-in-law
- Updated: people/menger-family.md — brother-in-law relationship confirmed
- Updated: brands/h-and-h-product-line.md — Menger Brand Peaberry, Master Chef Cafe Coffee added
- Updated: index.md — places section added
- Key findings:
  - Hoffmann was a clerk at George C. Sauer's grocery (Alamo Plaza) when he started roasting
  - Gus P. Menger was Hoffmann's brother-in-law (confirmed in Dec 1932 article)
  - William P. Hoffman appears as VP in Dec 1932 — likely Hoffmann's son
  - 1932 plant: 601 Delaware St; $130,000; 16,000 sq ft; 60+ employees; WOAI Open House Dec 21
  - Crystalvac: reusable vacuum crystal jar; launched June 1932; 250,000 jars from Three Rivers Glass; first of its kind in Texas; $10,000+ equipment
  - "Since 1899" was the company's own stated founding in 1932 ads — Hoffmann entered the trade ~1899
  - Previous address: 331 Burnett Street (~1922–1932)
  - 33+ spice and extract products by Nov 1932; separate Spice & Extract Dept created
  - New product brands: Menger Brand Peaberry Coffee, Master Chef Cafe Coffee, Sam Houston Coffee (all by Dec 1932)
  - Mar 1932: territory covers TX, Oklahoma, Louisiana, New Mexico

## [2026-05-15] ingest | 1934 anniversary cluster (4 sources)

- Sources: 1934-10-12-30-successful-years, 1934-10-12-30-years-of-progress-illustration, 1934-10-12-g-p-menger, 1934-10-19-thank-you
- Updated: companies/hoffman-hayman-company.md — founding date corrected, 1934 officers, new plant note, slogans, 150-city distribution
- Updated: people/menger-family.md — G.P./Gus R. resolved as same person; T.J. Menger as Treasurer, Paul Rochs as Sales Manager, A.V. Fitzgerald as Field Superintendent
- Updated: brands/h-and-h-product-line.md — Sam Houston Coffee and Texas Girl Coffee added
- Key findings:
  - FOUNDING DATE: October 1904 — "just thirty years ago this month, the first H and H Product was sold" (Oct 1934 ad)
  - 1934 article's "in 1914" is a typo for 1904
  - "Est. 1899" likely = Hoffmann's earlier trade presence before H and H brand creation
  - G. P. Menger = "Gus R. Menger" in 1923 caption (caption error confirmed)
  - G. P. Menger still president in 1934; Paul Rochs promoted to Sales Manager
  - Three flagship brands in 1934: H and H Blend, Sam Houston Coffee, Texas Girl Coffee
  - New plant built during Depression; "one of the largest and finest in the entire South"
  - Distribution: 150 cities in Texas by 1934

## [2026-05-15] ingest | 1923-08-26 special edition — San Antonio Light (30 sources)

- Sources: all 30 clippings from the Aug 26, 1923 San Antonio Light special section on Hoffmann-Hayman
- Created: people/menger-family.md (synthesis of all Menger family roles)
- Created: people/minnie-menger-schlosser.md
- Created: brands/h-and-h-product-line.md (coffee, tea, spices, extracts, cocoa; packaging, equipment)
- Updated: companies/hoffman-hayman-company.md — 1920 Menger buyout, 1923 leadership table, 211 Burnett St address, Pitluk advertising, slogan, market penetration stat
- Updated: index.md
- Key findings:
  - W. E. Hayman owned the Merchants Coffee Co. — he brought it into the 1912 merger
  - 1920: Hayman's interests bought out by G. P. Menger; full Menger family control established
  - 1923 address: 211 Burnett Street
  - Original roaster capacity: 30 lbs (c.1908); by 1920: 10,000 lbs/day
  - Complete 1923 leadership roster documented (13 named employees)
  - Full product line: coffee, Orange Pekoe Tea (from Ceylon), spices, extracts, cocoa
  - Equipment: Monitor roasters (Huntley Mfg., Silver Creek NY); tins by New Orleans Can Co.
  - Advertising: Pitluk Advertising Co.; newspaper + films + demonstrations + road signs
  - Note: 1923 article claims Hoffmann died "in 1910" — contradicted by 1912 primary sources (likely error)
  - Open question: Is "G. P. Menger" the same as "Gus R. Menger"? 1934 file may clarify.

## [2026-05-15] ingest | 1912 founding cluster (7 sources)

- Sources: 1912-01-11 funeral notices (×2), 1912-01-16 notice, 1912-02-04 announcement, 1912-02-06 charters (×2), 1912-02-11 location
- Created: people/william-r-hoffmann.md
- Created: people/william-edward-hayman-1938.md (from 1938-03-04 obituary — distinct person from W.E. Hayman 1924)
- Updated: companies/hoffman-hayman-company.md — full founding picture, incorporators, predecessors, location
- Updated: people/w-e-hayman.md — incorporator role added
- Updated: index.md
- Key finding: "est. 1899" = Hoffmann's original business; "1912" = corporate incorporation as Hoffmann-Hayman
- Key finding: Company is successor to BOTH Wm. R. Hoffmann AND Merchants Coffee Co.
- Key finding: Menger family (Minnie Menger Hoffmann + Gustave Menger) were founding incorporators

## [2026-05-15] register | batch registration — assets/pdfs (164 sources)

- Registered all 164 PDFs in assets/pdfs/ as stubs in raw-sources/index.md
- Buckets: newspapers (112), advertisements (49), research (2), images (1 duplicate noted)
- 1923-08-26 special edition called out as distinct cluster (~30 items)
- Duplicate flagged: assets/pdfs/1941-05-23 = knowledge-base/raw-archives/advertisements/1941-05-23_dont-miss-this-bargain.pdf
- Compile pending for all; priority order: 1912 founding → 1923 special edition → 1938 Hayman obituary → 1934 anniversary
- Added `companies/` topic directory to schema
- Schema updated with `research/` bucket notes

## [2026-05-15] ingest | 1941 Don't Miss This Bargain

- Source: `work/inbox/1941_Don_t_Miss_This_Bargain.pdf` → slug `hh-drip-grind-bargain-1941`
- Registered: raw-sources/index.md (advertisements bucket)
- Updated: brands/h-and-h-drip-grind.md (created)

## [2026-05-15] ingest | 1911 Hoffmann domestic + 1913 Morrison fire + 1919 ad campaign + 1960 Albert Menger succession + 2017 GW Mitchell blog (6 sources)

- Sources:
  - `1911-01-20-card-of-thanks-hoffmann` — Mr. and Mrs. Wm. R. Hoffmann thank friends after the death of "our darling son" (early Jan 1911)
  - `1911-10-26-housekeeper-want-ad` — Mrs. Wm. R. Hoffmann placing ad for "household of two" at 681 Nolan Street
  - `1913-08-13-fire-tea-coffee-plant` — Morrison Coffee Co. fire at 214 South Comal St (competitor; later acquired in 1917 per Mitchell)
  - `1919-11-11-coffee-company-striking-example-of-city-growth` — launch of "largest coffee advertising campaign" in SA; intermediate Caffarelli Bros bldg address; W. E. Hayman quote on quality and SA growth
  - `1960-05-05-albert-menger-elected-coffee-firm-president` — Albert G. Menger elected president; G. P. Menger → newly created Board Chairman; full 1960 officer slate
  - `2017-01-30-gw-mitchell-blog-hoffmann-hayman-rising-shining` — secondary source: 1914 Ft. Sam Houston order, 1917 Morrison acquisition, 1949/1955 building additions, 1960s Continental Coffee sale, 1972 listing
- Updated: companies/hoffman-hayman-company.md — 1913 Morrison fire, 1914 Ft. Sam Houston (secondary), 1917 Morrison acquisition (secondary), 1919 ad campaign launch + Caffarelli Bros location + Hayman quote, 1960 leadership succession + 1960 product list, 1960s Continental Coffee sale, building additions 1949/1955, 1972 listing; period extended to "1912–c.1965"
- Updated: people/william-r-hoffmann.md — son's death Jan 1911; 681 Nolan Street (Oct 1911) vs 631 Nolan Street (Jan 1912); revised children narrative; William P. Hoffman parentage now treated as unconfirmed
- Updated: people/menger-family.md — Albert G. Menger entry (son of G.P.; St. Mary's grad; 5yr USAF; joined 1945; age 42; wife Lemoyne; 206 Robinhood); August Menger and Mildred S. Holliday as 1960 directors; John C. Burkholder as 1960 VP Sales (non-Menger, with firm since 1945); 1960 leadership transition table; timeline row for May 1960
- Key findings:
  - Hoffmann family had a son who died Jan 1911 (previously unknown); the "infant daughter" in the 1912 death notice was a separate, later child
  - Address chain: Nolan & Hackberry (1909) → 681 Nolan (Oct 1911) → 631 Nolan (Jan 1912)
  - 1919 intermediate plant address: Caffarelli Bros building, N Medina & W Travis — between 1912 W. Commerce St and 1922 Burnett/Medina addresses
  - 1919 daily output: "frequently 10,000 pounds of coffee" — matches the 1920 article's claim
  - 1913 Morrison fire is a competitor event, NOT H&H — Morrison was later acquired by H&H in 1917 (per Mitchell, unconfirmed by primary)
  - Albert G. Menger (b. c.1917) confirmed as son of G. P. Menger — direct quote in the 1960 article
  - 1960 introduced **Master Chef Instant Coffee** alongside the existing brand lineup
  - Continental Coffee acquired H-H as a division in the mid-1960s (per Mitchell — no primary confirmation yet)
- Open questions added: Broncho Coffee (brand or competitor?); August Menger relationship; Mildred S. Holliday relationship; tenure of Albert G. Menger before Continental sale; primary-source confirmation for 1914 / 1917 / 1960s Mitchell claims

## [2026-05-15] ingest | inbox sweep — 1922 trademark + S. P. Stevens art samples (3 images, 1 MP4 deferred)

- Inbox items processed:
  - `20150703-172340_H&H Coffee_.jpg` → `assets/images/gallery/1922-04-10-us-patent-office-trademark-we-roast-it.jpg` (slug `1922-04-10-trademark-we-roast-it-others-praise-it`)
  - `S-P-Stevens-pic.jpg` → `knowledge-base/raw-archives/images/1954_s-p-stevens-cowboy-portrait.jpg` (slug `1954-s-p-stevens-cowboy-portrait`)
  - `s--p--stevens-portrait-of-a-woman-G6KF2.webp` → `knowledge-base/raw-archives/images/1946_s-p-stevens-woman-portrait.webp` (slug `1946-s-p-stevens-woman-portrait`)
- Deferred:
  - `H H Coffee Master Chef advertising record Aug 1961 TRACK 1 Macke.mp4` — audio extracted to `work/inbox/1961-08-hh-master-chef-ad-track-1-macke.m4a` (AAC, 48kHz stereo, 44.5s). Pending MacWhisper transcription before ingest as a 1961 advertisement.
- Registered: raw-sources/index.md (images bucket; first three entries — bucket previously empty)
- Created: `people/stanford-p-stevens.md` (research stub — family-lore claim only; `reliability: mixed`)
- Updated: `companies/hoffman-hayman-company.md` — trademark filing for "WE ROAST IT, OTHERS PRAISE IT" (Reg. 160,728 / Serial 161,907, filed Apr 10, 1922, Class 46, claims use since 1917)
- Updated: `brands/h-and-h-product-line.md` — added trademark registration details and pushed slogan use back to 1917
- Updated: `index.md` — added Stanford P. Stevens to People; source count 169 → 172
- Key findings:
  - **Slogan use predates 1923 by six years** — USPTO filing explicitly claims use since **1917** (vs. earliest prior reference: 1923 *SA Light* special edition)
  - Trademark identifiers: Reg. No. 160,728; Serial No. 161,907; Class 46 (Foods and Ingredients of Foods)
  - **S. P. Stevens** identified as Stanford P. Stevens, alleged early H&H billboard painter and founder of Stevens Outdoor Advertising — family lore only, no primary documentation; treat as research lead
  - Stevens art samples (1946 woman, 1954 cowboy) held for visual comparison against the "Fragrant…" billboard documented in the 2018-07-12 blog post
- Open questions added: USPTO trademark history (any earlier 1917-1922 filings? renewals?); primary-source confirmation for Stevens / H&H billboard connection; Stevens Outdoor Advertising founding date; identification of painter, shop, or contractor on the back of the H&H billboard print in collection

## [2026-05-15] ingest | 1961 Master Chef Coffee Macke advertising record + Stevens eye-treatment visual lead

- Sources:
  - `1961-08-hh-master-chef-ad-track-1-macke` — 44.5s audio/video advertising record (VP9+AAC); produced/duplicated via Macke; "TRACK 1" of a (presumed) multi-track session. Transcript via MacWhisper.
- Files moved/renamed:
  - `work/inbox/H H Coffee Master Chef advertising record Aug 1961 TRACK 1 Macke.mp4` → `knowledge-base/raw-archives/advertisements/1961-08-01_hh-master-chef-ad-track-1-macke.mp4`
  - `work/inbox/H H Coffee Master Chef advertising record Aug 1961 TRACK 1 Macke.md` → `knowledge-base/raw-archives/advertisements/1961-08-01_hh-master-chef-ad-track-1-macke.transcript.md`
  - Dropped `work/inbox/1961-08-hh-master-chef-ad-track-1-macke.m4a` (temporary extraction file used for MacWhisper input)
- Registered: `raw-sources/index.md` (advertisements bucket — first audio/video entry in the registry)
- Updated: `brands/h-and-h-product-line.md` — new "Master Chef Coffee (1961 radio/acetate spot)" section covering production, copy points, trading-stamps premium, vacuum-can packaging confirmation, and 4 open questions
- Updated: `people/stanford-p-stevens.md` — added "Visual comparison — eye treatment" subsection noting the painterly eye treatment shared between the Stevens portrait samples and the "We Serve Master Chef Coffee" sign (`assets/images/gallery/2014-07-27-master_chef_sign.jpg`); flagged as visual lead, not proof
- Key findings:
  - **1961 tagline:** "Wake up to flavor with MasterChef coffee"
  - **Trading-stamps premium:** "250 extra stamps or cash refunds" with every vacuum can of Master Chef — places H&H in the early-1960s redemption-stamp economy
  - **Heritage claim is marketing puff:** ad says Master Chef "famous for over half a century" — would imply pre-1911 use, but earliest documented Master Chef brand reference is Dec 1932; treat as advertising hyperbole conflating Master Chef with broader 1899/1904 H&H heritage
  - **Vacuum-can packaging** for Master Chef confirmed in 1961 — successor format to the 1932 Crystalvac glass jar
  - **Master Chef trajectory:** 1932 restaurant-only "Cafe Coffee" SKU → 1960 consumer brand (Coffee + Instant) → 1961 headline brand in radio advertising
  - **First audio source in the wiki:** previously all primary sources were print clippings; the Macke acetate is the first audio-format primary source
  - **Stevens / Master Chef visual lead:** painterly eye treatment in the Master Chef sign (specular highlights, defined upper-lid, prominent whites) mirrors the 1946/1954 Stevens portraits — consistent with the family-lore claim, but not yet proof
- Open questions added: "Macke" identity (vending company or recording service?); exact day in Aug 1961; which station(s) aired the spot; existence of TRACK 2+ from the same session; high-resolution detail-crop comparison of Master Chef chef vs. Stevens portrait eyes/moustache

## [2026-05-15] schema | correct 1961 Master Chef recording attribution — Broggi Agency + Kevin Mackey

- "Macke" in the original filename was a truncation of **Kevin Mackey** — collector and contributor of many 1910s–1930s *SA Express* clippings already in `raw-sources/`. Per user: Mackey is a collector/curator at a museum near Three Rivers, Texas, mentioned in a Three Rivers Glass Factory event in 2017 (the same Three Rivers Glass Co. that supplied 1932 Crystalvac jars — flagged as a research lead, no causation asserted).
- Authoritative attribution found in project file `_galleries/reference.md`: "a black lacquer Master Chef Coffee radio advertising record cut by **Broggi Advertising Agency, San Antonio**, in August 1961 (four spots, **A-17-61 through A-20-61**), contributed by Kevin Mackey."
- Files renamed (git mv):
  - `1961-08-01_hh-master-chef-ad-track-1-macke.mp4` → `1961-08-01_hh-master-chef-radio-broggi-track-1.mp4`
  - `1961-08-01_hh-master-chef-ad-track-1-macke.transcript.md` → `1961-08-01_hh-master-chef-radio-broggi-track-1.transcript.md`
- Slug updated: `1961-08-hh-master-chef-ad-track-1-macke` → `1961-08-hh-master-chef-radio-broggi-track-1`
- Updated: `raw-sources/index.md`, `brands/h-and-h-product-line.md` (frontmatter slug + body section rewritten with Broggi/Mackey attribution + four-spot context)
- Key findings:
  - **Producer = Broggi Advertising Agency, San Antonio** — third documented H&H advertising vendor (after Pitluk 1923 and the 1919 in-house campaign); may indicate a post-1960-succession vendor switch
  - **TRACK 1 is one of four spots** (A-17-61 / A-18-61 / A-19-61 / A-20-61) cut on a single black lacquer transcription disc — tracks 2–4 may still exist in Mackey's collection
  - **Kevin Mackey** is a long-standing project contributor: many `assets/pdfs/` newspaper scans we have were pulled from microfilm/newspaper databases by him (see `_galleries/newspaper.md` and per-post Mackey credits)
- Open questions revised: match TRACK 1 to a specific A-number; locate the other three Broggi spots; Broggi Advertising Agency history; Mackey's museum identity and the Three Rivers Glass Factory 2017 event details; whether Mackey's Three Rivers location is causally linked to H&H artifact preservation via the Three Rivers Glass Co. connection or coincidental

## [2026-05-15] schema | v2 — `artifacts/` bucket and Jekyll catalog as authoritative

Phase 0 of the gallery-image ingest plan (see `work/reports/gallery-audit.md`). Pre-audit, the schema treated `assets/images/gallery/` as something to register from scratch in `raw-sources/`. The audit found that `_data/galleries/` already maintains a structured catalog of 757 items across 7 galleries, with stable `clip_id`s and rich `alt` text. Schema updated to reflect that reality.

- Bumped `schema_version` to **2**
- Added **`artifacts/`** bucket distinct from `images/`:
  - `images/` = primary-source scans (USPTO filings, postcards, lithographic prints) where the image is itself the document
  - `artifacts/` = documentation photographs of physical objects (tins, signs, the factory) and field photography (2014+)
  - `artifacts/` entries **reference `clip_id` from `_data/galleries/`**, not raw file paths
- Documented primary-source vs. artifact-documentation distinction with concrete examples (the 1923 *SA Light* clipping is a primary source; a 2014 photo of a 1920s tin is artifact documentation of an artifact)
- Documented the `_data/galleries/` catalog structure and gallery counts (newspaper 299, collection 185, factory 103, reference 80, branding_newspaper 51, not_our_h_and_h 17, wanted 9)
- Added "When to add a raw-sources entry vs. just cite a clip_id" decision table
- Inbox processing updated:
  - Artifacts (object/field photographs) are handed off to `_data/galleries/<gallery>/` for catalog assignment — they do **not** go to `raw-archives/`
  - Audio/video advertising material formalized under `advertisements/` with `*.transcript.md` companion convention (matches the 1961 Broggi precedent)
- Added "Framework Note" caveat that the wiki references the Jekyll catalog as the exception to its framework-agnostic stance
- Added schema changelog with v1/v2 entries
- Open question: where does the audit's research-bucket book-cover proposal land? Either extend the existing `reference/` Jekyll gallery, or add a new `research/` Jekyll gallery (no change to wiki schema either way)

## [2026-05-15] schema | v3 — knowledge-base becomes single source of truth (Step 1 of 6)

Inversion of the v2 architecture after discovering the existing collection management system: `_data/accession_records/` already has **129 canonical YAML records** with a validation/export pipeline (`accessions_validate_and_export.exs`, `accessions_build_jekyll_data.exs`). Combined with `_data/galleries/` (757 catalog items) and `_brands/` (24 collection pages), the canonical data is already mature — it just lives in three places, all under `_data/` or `_brands/`. The v2 decision to treat the Jekyll side as authoritative was based on an incomplete picture of what already existed.

v3 reframes: **`knowledge-base/` is the single source of truth.** Jekyll data files (`_data/accessions.yml`, `_data/galleries/*/items/*.yml`, `_data/galleries/*/order.yml`, `_brands/*.md`) become *projections* generated by Elixir scripts from canonical records under `knowledge-base/`.

Step 1 of the migration (this commit) — schema only, no content moves:

- Bumped `schema_version` to **3**
- Restructured Topics into two sections:
  - **Narrative research** (people, brands, companies, places, events, documents) — unchanged shape
  - **Structured collection data** (accessions, artifacts, galleries) — NEW; one file per record, frontmatter is the structured data, body for research notes
- Documented the full canonical → projection diagram
- Defined the `accessions/` topic with the same schema as `_data/accession_records/*.yml`
- Defined the `artifacts/` topic (markdown + YAML frontmatter; `clip_id` per file; flat layout with `gallery:` as a frontmatter field rather than subdirectory)
- Defined the `galleries/` topic for gallery-level config (sequence, title, description)
- Removed the v2 `raw-sources/artifacts/` bucket (artifacts are now top-level, not under raw-sources)
- Added "Generators" section listing existing and planned Elixir scripts
- Updated Framework Note: KB can be migrated to a different SSG without losing data; only generators need to change
- Schema changelog updated with v3 entry; v2 marked superseded

Migration roadmap (Steps 2–6 — separate commits):

- **Step 2:** Move `_data/accession_records/*.yml` (129) → `knowledge-base/accessions/*.md` with body added below frontmatter; update `--registry` default in `accessions_validate_and_export.exs`
- **Step 3:** Move `_data/galleries/*/items/*.yml` (757) → `knowledge-base/artifacts/<clip_id>.md`; new generator `artifacts_build_jekyll_data.exs`
- **Step 4:** Move `_data/galleries/*/order.yml` (7) → `knowledge-base/galleries/<gallery>.md`; new generator `galleries_build_jekyll_data.exs`
- **Step 5:** Move `_brands/*.md` (24) → `knowledge-base/brands/*.md` (merge with existing 3 KB brand entries); new generator `brands_build_jekyll_collection.exs`
- **Step 6:** Audit remaining `_data/*.yml` stores (`events.yml`, `items.yaml`, `acquisitions.yml`, `ebay_purchase_history.yml`) for migration

Decision against `_posts/` `purchase:` frontmatter consolidation: leave posts unchanged. Accession record in KB is canonical; posts continue to carry inline `purchase:` for site display. Generator can validate consistency by `accession_id`.

## [2026-05-15] migrate | accessions: 129 records `_data/accession_records/*.yml` → `knowledge-base/accessions/*.md` (Step 2/6)

- Moved 129 YAML accession records into `knowledge-base/accessions/`, converting each to a Markdown frontmatter file:
  - Format: `---\n<original YAML>\n---\n` (body left empty for now; future research notes land below the closing `---`)
  - All file basenames preserved (e.g. `HH-AD-2014-0001.yml` → `HH-AD-2014-0001.md`)
  - Git detected all 129 as renames
- Updated downstream consumers to handle markdown frontmatter and the new path:
  - `scripts/accessions_validate_and_export.exs` — glob includes `*.md` first; new `extract_frontmatter/2` helper extracts YAML between `---` markers from `.md` files; `.yml`/`.yaml` files (fixtures) still parsed directly for backward compat; `--registry` default flipped from `_data/accession_records` to `knowledge-base/accessions`; docstring + Jekyll bundle source comments rewritten
  - `scripts/accessions_build_jekyll_data.exs` — `--registry` arg flipped to `knowledge-base/accessions`; docstring rewritten
  - `_plugins/regenerate_accessions_data.rb` — staleness glob now scans `knowledge-base/accessions/**/*.{md,yml}` (kept the legacy `_data/accession_records/**/*.yml` glob for safety until next clean build)
  - `_config.yml` — comment-only update referencing new path
- `_data/accessions.yml` regenerated successfully (129 accessions, exit 0). Bundle diff vs HEAD is cosmetic only — Ymlr re-emits `notes: > ...` folded scalars as inline strings; same string values, tidier YAML.
- Sanity check: validator + build script both run clean against the new location.
- No `_posts/` changes; `purchase:` frontmatter remains the display copy in posts.

Open follow-ups:
- Drop the `_data/accession_records/**/*.yml` fallback glob in `_plugins/regenerate_accessions_data.rb` after a clean build cycle confirms the new path works in CI.
- Update the accession runbook (`docs/engineering/2026-04-30-accession-registry-runbook.md`) and ADR/SDR references that still point to `_data/accession_records/`.

## [2026-05-15] migrate | artifacts: 744 catalog items `_data/galleries/*/items/*.yml` → `knowledge-base/artifacts/*.md` (Step 3/6)

- Moved **744 catalog items** from `_data/galleries/<gallery>/items/<clip_id>.yml` into a flat layout at `knowledge-base/artifacts/<clip_id>.md`. Two KB-side fields injected per file:
  - `type: artifact`
  - `gallery: <branding_newspaper | collection | factory | newspaper | not_our_h_and_h | reference | wanted>`
- Per-gallery counts unchanged: branding_newspaper 51, collection 185, factory 103, newspaper 299, not_our_h_and_h 17, reference 80, wanted 9.
- Schema across all items is consistent: `alt`, `clip_id`, `image_basename`, `image_path`, `title`, `url`, plus optional `gallery_sort_date` (15 items in `collection`).
- **6 source files (HH-REF-*-2015-* and HH-REF-1942-*) lacked trailing newlines** in their original `_data/galleries/...` form — caught during validator dry-run; KB files for those were regenerated with an explicit newline before the closing `---`. Source files are unchanged; the issue was purely in my migration pipeline's `cat` ordering.
- Added new Elixir generator `scripts/artifacts_build_jekyll_data.exs`:
  - Walks `knowledge-base/artifacts/*.md`, extracts YAML frontmatter via the same `extract_frontmatter/2` pattern used for accessions
  - Validates filename ↔ `clip_id` match and required-field presence (`clip_id`, `title`, `alt`, `image_basename`, `image_path`, `url`, `gallery`)
  - Detects duplicate `clip_id`s
  - Drops KB-only fields (`type`, `gallery`) from projection
  - Emits `_data/galleries/<gallery>/items/<clip_id>.yml` (alphabetically sorted keys via Ymlr)
- Added new Jekyll plugin `_plugins/regenerate_artifacts_data.rb` mirroring the accessions pattern (after_reset hook, staleness check, `SKIP_ARTIFACTS_REGEN` / `FORCE_ARTIFACTS_REGEN` env overrides, `artifacts_data.regenerate_on_build` / `artifacts_data.regenerate_only_when_stale` in `_config.yml`)
- `_config.yml` updated with an `artifacts_data:` block matching the accessions block style.
- Regenerated all 744 `_data/galleries/<gallery>/items/<clip_id>.yml` files. **74 of 744 had a cosmetic diff** — Ymlr drops double quotes around `alt`/`title` strings that don't require quoting. Same string content. All seven existing per-gallery validators (`validate_gallery_branding_newspaper_data.exs`, `…_collection_data.exs`, `…_factory_data.exs`, `…_newspaper_data.exs`, `…_not_our_h_and_h_data.exs`, `…_reference_data.exs`, `…_wanted_data.exs`) pass clean against the regenerated projection.
- **Step 2 carryover included**: `_data/accessions.yml` regenerated with the new "Source of truth: knowledge-base/accessions/*.md" header comment (the regeneration was made in Step 2 but the file wasn't staged; including here).
- No `_posts/` changes; no `_data/galleries/*/order.yml` changes (those move in Step 4).

Open follow-ups:
- Step 4: move `_data/galleries/*/order.yml` (7 files) → `knowledge-base/galleries/<gallery>.md`; extend the Step 3 generator (or write `galleries_build_jekyll_data.exs`) to project order back.
- The 74 cosmetic Ymlr re-quoting diffs are now baked in — future hand-edits to the legacy `_data/galleries/*/items/*.yml` paths will be overwritten by the generator. Update the per-gallery validation script docstrings to point to the new canonical path.
- The existing per-gallery `*.exs` migration scripts (`migrate_collection_gallery_to_split_data.exs`, etc.) are now obsolete — they performed an earlier split that's superseded by the canonical-in-KB move. Leave them in place for now as a historical record; flag for deletion when the migration is fully bedded in.

## [2026-05-15] migrate | galleries: 7 order.yml files → `knowledge-base/galleries/<gallery>.md` (Step 4/6)

- Moved **7 gallery sequences** from `_data/galleries/<gallery>/order.yml` to `knowledge-base/galleries/<gallery>.md`. Files added: `branding_newspaper.md`, `collection.md`, `factory.md`, `newspaper.md`, `not_our_h_and_h.md`, `reference.md`, `wanted.md`.
- Each KB gallery file carries frontmatter `gallery: <name>`, `order_strategy: manual`, and `sequence: [<clip_id>, …]`. No body content (gallery narrative continues to live in `_galleries/<gallery>.md` Jekyll pages — out of scope for this step).
- All 7 gallery sequence counts match their item counts in `knowledge-base/artifacts/` (branding_newspaper 51, collection 185, factory 103, newspaper 299, not_our_h_and_h 17, reference 80, wanted 9 = 744 total — exactly the artifact count from Step 3).
- Sequence ordering preserved byte-for-byte from the original `order.yml` files.
- Added new Elixir generator `scripts/galleries_build_jekyll_data.exs`:
  - Walks `knowledge-base/galleries/*.md`, extracts YAML frontmatter, validates filename ↔ `gallery:` match
  - Drops KB-only fields (`gallery`, `order_strategy`) from projection
  - Emits `_data/galleries/<gallery>/order.yml` for Jekyll consumption
  - **Cross-checks referential integrity against `knowledge-base/artifacts/`**: every `clip_id` in a sequence must correspond to an artifact whose `gallery:` matches; every artifact's gallery must be referenced in exactly one sequence position. The `--skip-integrity` flag bypasses the cross-check (e.g. when running before artifacts are migrated).
- Added new Jekyll plugin `_plugins/regenerate_galleries_data.rb` mirroring the accessions/artifacts plugins (after_reset hook, staleness check, `SKIP_GALLERIES_REGEN` / `FORCE_GALLERIES_REGEN` env overrides). Staleness check looks at both `knowledge-base/galleries/**/*.md` AND `knowledge-base/artifacts/**/*.md` (so a new artifact whose clip_id needs to land in a sequence triggers regeneration).
- `_config.yml` updated with a `galleries_data:` block matching the accessions/artifacts block style.
- Regenerated all 7 `_data/galleries/<gallery>/order.yml` files — **zero byte diff** vs HEAD (the original simple `sequence:` shape round-trips cleanly through Ymlr).
- All 7 existing per-gallery validators (`validate_gallery_*.exs`) pass clean against the regenerated projection.

Open follow-ups:
- Step 5: consolidate `_brands/*.md` (24 published brand pages) into `knowledge-base/brands/` (currently has 3 KB brand entries — h-and-h-product-line, crystalvac, h-and-h-drip-grind). Generator: `brands_build_jekyll_collection.exs` emitting `_brands/*.md` stubs.
- Step 6: audit remaining `_data/*.yml` stores (`events.yml`, `items.yaml`, `acquisitions.yml`, `ebay_purchase_history.yml`, `crystalvac_jars.yaml`, `story_taxonomy.yml`) for migration to KB.
- `_galleries/<gallery>.md` Jekyll pages (the human-written gallery overview pages with title, description, and long narrative body) are NOT in this migration. They could be consolidated into `knowledge-base/galleries/<gallery>.md` bodies in a future step if desired; for now they remain hand-edited Jekyll pages.

## [2026-05-15] migrate | brands: 22 `_brands/*.md` → `knowledge-base/brands/` + Jekyll-collection generator (Step 5/6)

- Migrated **22 brand pages** from the Jekyll `_brands/` collection (with `collection: brands` / `icon` / `sidebar` frontmatter and rich research narrative bodies) to canonical KB pages at `knowledge-base/brands/<hyphen-slug>.md`:
  - `anita-coffee`, `border-coffee`, `broncho-coffee`, `crystalvac-jars`, `double-h-coffee`, `h-and-h-blend-coffee`, `h-and-h-cocoa`, `h-and-h-extracts`, `h-and-h-instant-coffee`, `h-and-h-spices`, `h-and-h-tea`, `jav-o-coffee`, `juanita-coffee`, `master-chef-coffee`, `menger-hotel-coffee`, `menger-peaberry-coffee`, `misa-coffee`, `sam-houston-coffee`, `spoon-coffee`, `texas-girl-coffee`, `texco-coffee`, `wesco-coffee`
- Each migrated file carries KB frontmatter (`title`, `type: concept`, `updated`, `tags: [brands]`, `reliability: mixed`, `sources: []`) plus a `jekyll_filename:` field that maps the canonical hyphen-slug to the Jekyll-side underscore name (preserves existing `/brands/<name>/` URLs).
- Existing 3 KB brand entries left untouched:
  - `h-and-h-product-line.md` (KB-only synthesis catalog; no `jekyll_filename`, so not projected)
  - `crystalvac.md` (KB-only research-focused brand concept; not projected — the publication-focused jar narrative is now in the new `crystalvac-jars.md`)
  - `h-and-h-drip-grind.md` (no `jekyll_filename`; KB-only for now; can be opted into projection later by adding the field)
- **Total KB brand count: 25** (22 migrated + 3 existing). **Projected to `_brands/`: 22.**
- Decision on the crystalvac overlap: kept the existing KB `crystalvac.md` and new `crystalvac-jars.md` as **sibling entries** rather than merging. They cover distinct subjects — the brand concept (vacuum-packed glass packaging line, launched 1932, KB-side history) vs. the physical jars (Three Rivers Glass Co. manufacturer, 1937 Ball Brothers acquisition, Owens-Illinois mold marks, publication narrative).
- Added new Elixir generator `scripts/brands_build_jekyll_collection.exs`:
  - Walks `knowledge-base/brands/*.md`, extracts YAML frontmatter
  - **Opt-in projection model**: files without `jekyll_filename:` are skipped (allows KB-only synthesis pages to coexist)
  - Validates required title; detects duplicate `jekyll_filename` values
  - Constructs Jekyll-side frontmatter from scratch (`collection: brands`, `title`, `icon: coffee`, `sidebar.nav: brands`) rather than dropping KB fields — cleaner separation
  - Strips leading blank lines from the body before re-emission
- Added new Jekyll plugin `_plugins/regenerate_brands_collection.rb` mirroring the accessions/artifacts/galleries plugins (after_reset hook, staleness check across both `knowledge-base/brands/**/*.md` and `_brands/*.md`, `SKIP_BRANDS_REGEN` / `FORCE_BRANDS_REGEN` env overrides).
- `_config.yml` updated with a `brands_data:` block matching the rest of the projection family.
- Regenerated all 22 `_brands/*.md` files. **Diff is purely cosmetic** — Ymlr alphabetizes keys (`collection, icon, sidebar, title` vs the original `collection, title, icon, sidebar`) and drops unneeded quotes (`nav: "brands"` → `nav: brands`). Functionally identical; Jekyll parses both forms identically.

Open follow-ups:
- The migrated KB brand files carry empty `sources: []` and `tags: [brands]` placeholders. Pass through each KB brand body and back-fill `sources:` (from any `_posts/` or newspaper-clip references in the prose), per-brand tag enrichment, and `period:` ranges where confidently bracketed.
- Consider opting `h-and-h-drip-grind.md` into Jekyll projection by adding `jekyll_filename: h_and_h_drip_grind` — would publish a new `/brands/h_and_h_drip_grind/` page.
- Consider how `h-and-h-product-line.md` (KB-only product index) relates to the per-brand KB pages now — some content overlap (e.g. Master Chef Coffee section in product-line vs. master-chef-coffee.md). May want to slim product-line down to a cross-cutting index and let per-brand pages carry the detail.

Step 6 remains: audit the remaining `_data/*.yml` stores (`events.yml`, `items.yaml`, `acquisitions.yml`, `ebay_purchase_history.yml`, `crystalvac_jars.yaml`, `story_taxonomy.yml`) for migration to KB.

## [2026-05-15] migrate | events + audit final `_data/` stores (Step 6/6 — migration complete)

Triage of remaining `_data/*.yml` files (consumer-driven — files with no Jekyll template consumers stay where they are or get deleted; files consumed by templates are migrated):

| File | Lines | Template consumers | Action |
|---|---|---|---|
| `events.yml` | 279 (44 events) | `_pages/history.md` — `{% for event in site.data.events %}` | **MIGRATED** to `knowledge-base/events/<slug>.md` |
| `story_taxonomy.yml` | 17 | `_pages/artifact-index.md` filter dropdowns | **KEEP** — small controlled vocab, content-coupled to one Jekyll page |
| `navigation.yml` | 104 | site nav templates | **KEEP** — pure Jekyll display config |
| `ui-text.yml` | 669 | UI strings everywhere | **KEEP** — pure Jekyll display config |
| `acquisitions.yml` | 1,328 | auto-generated | **KEEP** — projection of `_data/*-ebayReports/` via `scripts/combine_ebay_purchase_history.exs` |
| `ebay_purchase_history.yml` | 3,510 | auto-generated | **KEEP** — same |
| `crystalvac_jars.yaml` | 15 | none (URL slug references in posts go to `/brands/crystalvac_jars/`, not the data file) | **DELETED** — vestigial draft |
| `items.yaml` | 8 | none | **DELETED** — vestigial 1-entry legacy |

### Events migration (44 entries)

- Migrated `_data/events.yml` to **44 per-event Markdown files** under `knowledge-base/events/<slug>.md`. Slug = `<year>-<slugified-title>` with `-N` disambiguator for collisions.
- Frontmatter: `title`, `type: concept`, `updated`, `tags: [events, timeline]`, **`timeline: true`** (opt-in projection flag), `date: <human form>`, `iso_date: <ISO 8601, year/month/day where known>`, `source: <html or text>`, `sources: []`.
- Body: `# Title` heading + the original `description:` text as a paragraph (so research can grow below).
- Existing `1937-aviation-coffee-fire.md` (rich research synthesis, no `timeline:` field) **left untouched** and KB-only.
- Total KB events: **45 canonical**, **44 projected** to `_data/events.yml`.

### Generator + plugin

- New `scripts/events_build_jekyll_data.exs`: walks `knowledge-base/events/*.md`, filters for `timeline: true`, sorts by `iso_date` ascending, emits `_data/events.yml` in the exact legacy `- event:\n  date: …\n  title: …\n  description: >-\n    …\n  source: …` shape.
- New `_plugins/regenerate_events_data.rb` — mirrors the accessions/artifacts/galleries/brands plugins (after_reset, staleness check, SKIP/FORCE env overrides).
- `_config.yml` gains `events_data:` block.
- Regenerated `_data/events.yml`: 98 insertions, 70 deletions (~3 lines per event reformatted — whitespace normalization, promote all `description:` to folded blocks, drop unneeded quotes). All parser-equivalent.

### Vestigial cleanup

- `git rm _data/items.yaml` (single legacy crystalvac entry, no template consumers)
- `git rm _data/crystalvac_jars.yaml` (sparse draft schema for an unfinished brand attribute table, no template consumers)

### Schema v3.1

- Bumped `schema_version` from `3` to `3.1`
- Expanded `events/` topic row to call out the `timeline: true` opt-in
- Added a "Files that stay in `_data/`" section documenting the conscious decision to leave navigation/UI/auto-generated files alone
- Consolidated the generator chain into a single canonical table (one row per `<name>_build_jekyll_*.exs` script + matching plugin)

### Migration complete

Steps 1–6 of the canonical-in-KB / projection-to-Jekyll migration are done:

- **Step 1** (`23c68d3`) Schema v3 — KB becomes single source of truth
- **Step 2** (`04640bd`) Accessions: 129 records moved to `knowledge-base/accessions/`
- **Step 3** (`70a1ff2`) Artifacts: 744 catalog items moved to `knowledge-base/artifacts/`
- **Step 4** (`28b697e`) Galleries: 7 sequences moved to `knowledge-base/galleries/`
- **Step 5** (`954ea79`) Brands: 22 brand pages moved to `knowledge-base/brands/`
- **Step 6** (this commit) Events + vestigial cleanup + schema v3.1

Open follow-ups (cross-step):
- Backfill `sources:` / `tags:` / `period:` in the 22 Step 5 brand pages (currently placeholders)
- Decide whether to opt `h-and-h-drip-grind.md` into Jekyll projection
- Reconcile content overlap between `h-and-h-product-line.md` and per-brand KB pages
- Eventually consolidate `_galleries/<gallery>.md` Jekyll narrative pages into `knowledge-base/galleries/<gallery>.md` bodies (out of scope for this migration)
- Drop the legacy `_data/accession_records/` fallback glob in `_plugins/regenerate_accessions_data.rb` after a clean build cycle
- Update docs/runbooks/ADRs that still reference the pre-migration paths
