lakehouse/data/headshots/manifest.jsonl
root 5225211e45 demo: real synthetic headshots — fetch pool + serve route + UI wire
Three layers shipped:

1. SCRIPT — scripts/staffing/fetch_face_pool.py
   Pulls N synthetic StyleGAN faces from thispersondoesnotexist.com
   into data/headshots/face_NNNN.jpg, writes manifest.jsonl. Idempotent:
   re-running skips existing files. Optional gender tagging via deepface
   (currently unavailable on this box; the script handles ImportError
   gracefully and tags everything as untagged). Fetched 198 faces with
   concurrency=3 in ~67s.

2. SERVER — /headshots/:key route in mcp-server/index.ts
   Loads manifest at first hit, caches in globalThis._faces. Hashes the
   key with djb2-style mixing → pool index → returns the JPG. Same
   key always gets the same face (deterministic). Accepts
   ?g=man|woman&e=caucasian|black|hispanic|south_asian|east_asian|middle_eastern
   to bias pool selection — the gender/ethnicity buckets fall back to
   the full pool when no tagged matches exist. Cache-Control:
   86400 immutable so faces ride the browser cache after first hit.
   /headshots/__reload re-reads the manifest without restart.

3. UI — search.html + console.html worker cards
   Re-added overlay <img> on top of the monogram .av circle. img.src
   = /headshots/<encoded-key>?g=<hint>&e=<hint>. img.onerror removes
   the failed image so the monogram stays visible if the face pool
   isn't fetched / CDN is blocked. .av now has overflow:hidden +
   position:relative to clip the img to a perfect circle.

Forced-confident name resolution (J: "we're CREATING the profile,
created as though you truly have the information Xavier is more
likely Hispanic and he's a male"):

   genderFor(name)        — looks up MALE_NAMES + FEMALE_NAMES,
                            falls back to a deterministic hash split
                            so unknown names spread ~50/50. Sets now
                            include cross-cultural names: Alejandro/
                            Andres/Mateo/Santiago/Joaquin/Cesar/Hugo/
                            Felipe/Gerardo/Salvador/Ramon (Hispanic),
                            Raj/Anil/Vikram/Krishna/Pradeep (South
                            Asian), Wei/Yi/Hiroshi/Akira/Hyun (East
                            Asian), Demetrius/Kareem/DaQuan/Khalil
                            (Black), Omar/Khalid/Hassan/Ahmed/Bilal
                            (Middle Eastern). FEMALE_NAMES extended
                            in parallel.

   guessEthnicityFromFirstName(name)
                          — confident default of 'caucasian' for any
                            name not in the cultural buckets so every
                            worker resolves to a category the face
                            pool can be biased toward. Order: ME → Black
                            → Hispanic → South Asian → East Asian →
                            Caucasian (matters where names overlap,
                            e.g. Aisha appears in ME + Black, biases
                            toward ME for visual fit).

   Both helpers also ported into console.html so the triage backfills
   and try-it-yourself rendering get the same hint stack.

Privacy note in the script + route comments: the synthetic data uses
the worker's name as the seed; production should hash worker_id (not
name) to avoid leaking PII to a third-party CDN. The fetch URL itself
is referenced once per pool build, not per-worker.

.gitignore — added data/headshots/face_*.jpg (~100MB for 198 faces;
the manifest + script are tracked). Re-running the script on a fresh
checkout rebuilds the pool from scratch.

Verified end-to-end via playwright on devop.live/lakehouse:
   forklift query → 10 worker cards
   10/10 with face images (real synthetic headshots, not monograms)
   0/10 broken
   Alejandro G. Nelson  → ?g=man&e=hispanic
   Patricia K. Garcia    → ?g=woman&e=caucasian
   Each name → unique face, deterministic across loads.
   Console triage backfills get the same treatment.
2026-04-28 00:04:03 -05:00

199 lines
10 KiB
JSON

{"id": 0, "file": "face_0000.jpg", "gender": null}
{"id": 1, "file": "face_0001.jpg", "gender": null}
{"id": 2, "file": "face_0002.jpg", "gender": null}
{"id": 3, "file": "face_0003.jpg", "gender": null}
{"id": 4, "file": "face_0004.jpg", "gender": null}
{"id": 5, "file": "face_0005.jpg", "gender": null}
{"id": 6, "file": "face_0006.jpg", "gender": null}
{"id": 7, "file": "face_0007.jpg", "gender": null}
{"id": 8, "file": "face_0008.jpg", "gender": null}
{"id": 9, "file": "face_0009.jpg", "gender": null}
{"id": 10, "file": "face_0010.jpg", "gender": null}
{"id": 11, "file": "face_0011.jpg", "gender": null}
{"id": 12, "file": "face_0012.jpg", "gender": null}
{"id": 13, "file": "face_0013.jpg", "gender": null}
{"id": 14, "file": "face_0014.jpg", "gender": null}
{"id": 15, "file": "face_0015.jpg", "gender": null}
{"id": 16, "file": "face_0016.jpg", "gender": null}
{"id": 17, "file": "face_0017.jpg", "gender": null}
{"id": 18, "file": "face_0018.jpg", "gender": null}
{"id": 19, "file": "face_0019.jpg", "gender": null}
{"id": 20, "file": "face_0020.jpg", "gender": null}
{"id": 21, "file": "face_0021.jpg", "gender": null}
{"id": 22, "file": "face_0022.jpg", "gender": null}
{"id": 23, "file": "face_0023.jpg", "gender": null}
{"id": 24, "file": "face_0024.jpg", "gender": null}
{"id": 25, "file": "face_0025.jpg", "gender": null}
{"id": 26, "file": "face_0026.jpg", "gender": null}
{"id": 27, "file": "face_0027.jpg", "gender": null}
{"id": 28, "file": "face_0028.jpg", "gender": null}
{"id": 29, "file": "face_0029.jpg", "gender": null}
{"id": 30, "file": "face_0030.jpg", "gender": null}
{"id": 31, "file": "face_0031.jpg", "gender": null}
{"id": 32, "file": "face_0032.jpg", "gender": null}
{"id": 33, "file": "face_0033.jpg", "gender": null}
{"id": 34, "file": "face_0034.jpg", "gender": null}
{"id": 35, "file": "face_0035.jpg", "gender": null}
{"id": 36, "file": "face_0036.jpg", "gender": null}
{"id": 37, "file": "face_0037.jpg", "gender": null}
{"id": 38, "file": "face_0038.jpg", "gender": null}
{"id": 39, "file": "face_0039.jpg", "gender": null}
{"id": 40, "file": "face_0040.jpg", "gender": null}
{"id": 41, "file": "face_0041.jpg", "gender": null}
{"id": 42, "file": "face_0042.jpg", "gender": null}
{"id": 43, "file": "face_0043.jpg", "gender": null}
{"id": 44, "file": "face_0044.jpg", "gender": null}
{"id": 45, "file": "face_0045.jpg", "gender": null}
{"id": 46, "file": "face_0046.jpg", "gender": null}
{"id": 47, "file": "face_0047.jpg", "gender": null}
{"id": 48, "file": "face_0048.jpg", "gender": null}
{"id": 49, "file": "face_0049.jpg", "gender": null}
{"id": 50, "file": "face_0050.jpg", "gender": null}
{"id": 51, "file": "face_0051.jpg", "gender": null}
{"id": 52, "file": "face_0052.jpg", "gender": null}
{"id": 53, "file": "face_0053.jpg", "gender": null}
{"id": 54, "file": "face_0054.jpg", "gender": null}
{"id": 55, "file": "face_0055.jpg", "gender": null}
{"id": 56, "file": "face_0056.jpg", "gender": null}
{"id": 57, "file": "face_0057.jpg", "gender": null}
{"id": 58, "file": "face_0058.jpg", "gender": null}
{"id": 59, "file": "face_0059.jpg", "gender": null}
{"id": 60, "file": "face_0060.jpg", "gender": null}
{"id": 61, "file": "face_0061.jpg", "gender": null}
{"id": 62, "file": "face_0062.jpg", "gender": null}
{"id": 63, "file": "face_0063.jpg", "gender": null}
{"id": 64, "file": "face_0064.jpg", "gender": null}
{"id": 65, "file": "face_0065.jpg", "gender": null}
{"id": 66, "file": "face_0066.jpg", "gender": null}
{"id": 67, "file": "face_0067.jpg", "gender": null}
{"id": 68, "file": "face_0068.jpg", "gender": null}
{"id": 69, "file": "face_0069.jpg", "gender": null}
{"id": 70, "file": "face_0070.jpg", "gender": null}
{"id": 71, "file": "face_0071.jpg", "gender": null}
{"id": 72, "file": "face_0072.jpg", "gender": null}
{"id": 73, "file": "face_0073.jpg", "gender": null}
{"id": 74, "file": "face_0074.jpg", "gender": null}
{"id": 75, "file": "face_0075.jpg", "gender": null}
{"id": 76, "file": "face_0076.jpg", "gender": null}
{"id": 77, "file": "face_0077.jpg", "gender": null}
{"id": 78, "file": "face_0078.jpg", "gender": null}
{"id": 79, "file": "face_0079.jpg", "gender": null}
{"id": 80, "file": "face_0080.jpg", "gender": null}
{"id": 81, "file": "face_0081.jpg", "gender": null}
{"id": 82, "file": "face_0082.jpg", "gender": null}
{"id": 83, "file": "face_0083.jpg", "gender": null}
{"id": 84, "file": "face_0084.jpg", "gender": null}
{"id": 85, "file": "face_0085.jpg", "gender": null}
{"id": 86, "file": "face_0086.jpg", "gender": null}
{"id": 87, "file": "face_0087.jpg", "gender": null}
{"id": 88, "file": "face_0088.jpg", "gender": null}
{"id": 89, "file": "face_0089.jpg", "gender": null}
{"id": 90, "file": "face_0090.jpg", "gender": null}
{"id": 91, "file": "face_0091.jpg", "gender": null}
{"id": 92, "file": "face_0092.jpg", "gender": null}
{"id": 93, "file": "face_0093.jpg", "gender": null}
{"id": 94, "file": "face_0094.jpg", "gender": null}
{"id": 95, "file": "face_0095.jpg", "gender": null}
{"id": 96, "file": "face_0096.jpg", "gender": null}
{"id": 97, "file": "face_0097.jpg", "gender": null}
{"id": 98, "file": "face_0098.jpg", "gender": null}
{"id": 99, "file": "face_0099.jpg", "gender": null}
{"id": 100, "file": "face_0100.jpg", "gender": null}
{"id": 101, "file": "face_0101.jpg", "gender": null}
{"id": 102, "file": "face_0102.jpg", "gender": null}
{"id": 103, "file": "face_0103.jpg", "gender": null}
{"id": 104, "file": "face_0104.jpg", "gender": null}
{"id": 105, "file": "face_0105.jpg", "gender": null}
{"id": 106, "file": "face_0106.jpg", "gender": null}
{"id": 107, "file": "face_0107.jpg", "gender": null}
{"id": 108, "file": "face_0108.jpg", "gender": null}
{"id": 109, "file": "face_0109.jpg", "gender": null}
{"id": 110, "file": "face_0110.jpg", "gender": null}
{"id": 111, "file": "face_0111.jpg", "gender": null}
{"id": 112, "file": "face_0112.jpg", "gender": null}
{"id": 113, "file": "face_0113.jpg", "gender": null}
{"id": 114, "file": "face_0114.jpg", "gender": null}
{"id": 115, "file": "face_0115.jpg", "gender": null}
{"id": 116, "file": "face_0116.jpg", "gender": null}
{"id": 117, "file": "face_0117.jpg", "gender": null}
{"id": 118, "file": "face_0118.jpg", "gender": null}
{"id": 119, "file": "face_0119.jpg", "gender": null}
{"id": 121, "file": "face_0121.jpg", "gender": null}
{"id": 122, "file": "face_0122.jpg", "gender": null}
{"id": 123, "file": "face_0123.jpg", "gender": null}
{"id": 124, "file": "face_0124.jpg", "gender": null}
{"id": 125, "file": "face_0125.jpg", "gender": null}
{"id": 126, "file": "face_0126.jpg", "gender": null}
{"id": 127, "file": "face_0127.jpg", "gender": null}
{"id": 128, "file": "face_0128.jpg", "gender": null}
{"id": 129, "file": "face_0129.jpg", "gender": null}
{"id": 130, "file": "face_0130.jpg", "gender": null}
{"id": 131, "file": "face_0131.jpg", "gender": null}
{"id": 132, "file": "face_0132.jpg", "gender": null}
{"id": 133, "file": "face_0133.jpg", "gender": null}
{"id": 134, "file": "face_0134.jpg", "gender": null}
{"id": 135, "file": "face_0135.jpg", "gender": null}
{"id": 136, "file": "face_0136.jpg", "gender": null}
{"id": 137, "file": "face_0137.jpg", "gender": null}
{"id": 138, "file": "face_0138.jpg", "gender": null}
{"id": 139, "file": "face_0139.jpg", "gender": null}
{"id": 140, "file": "face_0140.jpg", "gender": null}
{"id": 141, "file": "face_0141.jpg", "gender": null}
{"id": 142, "file": "face_0142.jpg", "gender": null}
{"id": 143, "file": "face_0143.jpg", "gender": null}
{"id": 144, "file": "face_0144.jpg", "gender": null}
{"id": 145, "file": "face_0145.jpg", "gender": null}
{"id": 146, "file": "face_0146.jpg", "gender": null}
{"id": 147, "file": "face_0147.jpg", "gender": null}
{"id": 148, "file": "face_0148.jpg", "gender": null}
{"id": 149, "file": "face_0149.jpg", "gender": null}
{"id": 150, "file": "face_0150.jpg", "gender": null}
{"id": 151, "file": "face_0151.jpg", "gender": null}
{"id": 152, "file": "face_0152.jpg", "gender": null}
{"id": 153, "file": "face_0153.jpg", "gender": null}
{"id": 154, "file": "face_0154.jpg", "gender": null}
{"id": 155, "file": "face_0155.jpg", "gender": null}
{"id": 156, "file": "face_0156.jpg", "gender": null}
{"id": 157, "file": "face_0157.jpg", "gender": null}
{"id": 158, "file": "face_0158.jpg", "gender": null}
{"id": 159, "file": "face_0159.jpg", "gender": null}
{"id": 160, "file": "face_0160.jpg", "gender": null}
{"id": 161, "file": "face_0161.jpg", "gender": null}
{"id": 162, "file": "face_0162.jpg", "gender": null}
{"id": 163, "file": "face_0163.jpg", "gender": null}
{"id": 164, "file": "face_0164.jpg", "gender": null}
{"id": 165, "file": "face_0165.jpg", "gender": null}
{"id": 166, "file": "face_0166.jpg", "gender": null}
{"id": 167, "file": "face_0167.jpg", "gender": null}
{"id": 168, "file": "face_0168.jpg", "gender": null}
{"id": 169, "file": "face_0169.jpg", "gender": null}
{"id": 170, "file": "face_0170.jpg", "gender": null}
{"id": 171, "file": "face_0171.jpg", "gender": null}
{"id": 172, "file": "face_0172.jpg", "gender": null}
{"id": 173, "file": "face_0173.jpg", "gender": null}
{"id": 174, "file": "face_0174.jpg", "gender": null}
{"id": 175, "file": "face_0175.jpg", "gender": null}
{"id": 176, "file": "face_0176.jpg", "gender": null}
{"id": 177, "file": "face_0177.jpg", "gender": null}
{"id": 178, "file": "face_0178.jpg", "gender": null}
{"id": 179, "file": "face_0179.jpg", "gender": null}
{"id": 180, "file": "face_0180.jpg", "gender": null}
{"id": 181, "file": "face_0181.jpg", "gender": null}
{"id": 182, "file": "face_0182.jpg", "gender": null}
{"id": 183, "file": "face_0183.jpg", "gender": null}
{"id": 184, "file": "face_0184.jpg", "gender": null}
{"id": 185, "file": "face_0185.jpg", "gender": null}
{"id": 186, "file": "face_0186.jpg", "gender": null}
{"id": 187, "file": "face_0187.jpg", "gender": null}
{"id": 188, "file": "face_0188.jpg", "gender": null}
{"id": 189, "file": "face_0189.jpg", "gender": null}
{"id": 191, "file": "face_0191.jpg", "gender": null}
{"id": 192, "file": "face_0192.jpg", "gender": null}
{"id": 193, "file": "face_0193.jpg", "gender": null}
{"id": 194, "file": "face_0194.jpg", "gender": null}
{"id": 195, "file": "face_0195.jpg", "gender": null}
{"id": 196, "file": "face_0196.jpg", "gender": null}
{"id": 197, "file": "face_0197.jpg", "gender": null}
{"id": 198, "file": "face_0198.jpg", "gender": null}
{"id": 199, "file": "face_0199.jpg", "gender": null}