Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions bun.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 23 additions & 0 deletions next.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,18 @@ const nextConfig: NextConfig = {
experimental: {
useTypeScriptCli: true,
},
images: {
localPatterns: [
{
pathname: "/**",
search: "",
},
{
pathname: "/resume/face-motion/v12/**",
search: "?rev=20260813d",
},
],
},
outputFileTracingExcludes: {
"/*": ["./next.config.ts"],
},
Expand All @@ -19,6 +31,17 @@ const nextConfig: NextConfig = {
"/rss.xml": ["./src/content/**/*"],
"/sitemap.xml": ["./src/content/**/*"],
},
headers: async () => [
{
headers: [
{
key: "Cache-Control",
value: "public, max-age=31536000, immutable",
},
],
source: "/resume/face-motion/:asset*",
},
],
reactCompiler: true,
rewrites: async () => [
{
Expand Down
4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@
"type": "module",
"scripts": {
"dev": "next dev",
"build": "next build",
"build": "bun run verify:face-motion && next build",
"start": "next start",
"test": "bun test",
"verify:face-motion": "bun scripts/verify-face-motion-assets.ts",
"typecheck": "tsgo --noEmit",
"lint": "ultracite check && oxlint .",
"lint:ox": "oxlint .",
Expand Down Expand Up @@ -60,6 +61,7 @@
"oxlint": "^1.71.0",
"oxlint-tsgolint": "^0.23.0",
"schema-dts": "^2.0.0",
"sharp": "^0.34.5",
"tailwindcss": "^4.3.1",
"tw-animate-css": "^1.4.0",
"typescript": "^7.0.1-rc",
Expand Down
12 changes: 12 additions & 0 deletions public/resume/face-motion/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Face-motion assets

`v12` is the active portrait release. It contains nine immutable, semantic
compass endpoints generated with GPT Image 2: center plus the eight cardinal
and diagonal directions.

The release deliberately contains no mesh-derived frames, optical-flow frames,
warped faces, rescaled bodies, or blended eyeglasses. See
[`v12/README.md`](v12/README.md), [`v12/manifest.json`](v12/manifest.json), and
[`v12/VALIDATION.md`](v12/VALIDATION.md) for the exact contract and provenance.

New runtime code must use `/resume/face-motion/v12`.
91 changes: 91 additions & 0 deletions public/resume/face-motion/v12/PROVENANCE.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
{
"schemaVersion": 1,
"release": 12,
"generationModel": "gpt-image-2",
"method": "3x3 GPT Image 2 endpoints; targeted GPT Image 2 side-hair correction; border-connected chroma alpha",
"constraints": {
"crop": false,
"recenter": false,
"scale": false,
"rotate": false,
"warp": false,
"bodyLock": false,
"opticalFlow": false,
"interpolate": false,
"blend": false,
"opaqueRgbPreserved": true
},
"alphaExtraction": {
"innerThreshold": 24,
"outerThreshold": 10,
"feather": 1.4,
"partialEdgeRgb": "nearest fully opaque pixel from the same immutable source; opaque RGB untouched"
},
"endpoints": [
{
"pose": "top-left",
"sourceGeneration": "exec-ccb5f751-1bb9-446f-9bbd-b1c4afab4bf5.png",
"sourceSha256": "962961de3ba5d2e3906a91c62d5036a144453a17bbae17b9f7c2e1d9a51b68b2",
"keyedMasterSha256": "a0a4e42afd126dfe35bf42d7c416c7c86ae009c0ac1dbb70e715ab01bcfff740",
"alphaBbox": [69, 98, 1191, 1254]
},
{
"pose": "top",
"sourceGeneration": "exec-e6cbe6b8-c9d5-41e1-9414-0d27ddc66d11.png",
"sourceSha256": "ca23dd0e6d1fc06b21071682d2f29b20b49d1e33aaeadc4fcd81ea324b3f3952",
"keyedMasterSha256": "a7bef7700b30df19dd14649d1ed3c6dcfd7f525c5d324693d741f5b97d3e6cfd",
"alphaBbox": [71, 111, 1194, 1254]
},
{
"pose": "top-right",
"sourceGeneration": "exec-3f467a80-7a7f-4cc3-917c-d22a55e022ff.png",
"sourceSha256": "888d7b8d2ac3df8ee9b89ee9742db9e31b2091b47c4211fdf68ff5767d90b351",
"keyedMasterSha256": "5ef1ae6d56197543b1077ce0466ba4fe84832f1212509e8835f93cebd1ff7417",
"alphaBbox": [72, 92, 1192, 1254]
},
{
"pose": "left",
"sourceGeneration": "output/imagegen/face-motion-v12-transitions/dense2/left-hair-final-v7.png",
"sourceSha256": "e1a84aa15373fd200751cad19553d7daf294395e34adabf6e29346aca6d5f409",
"keyedMasterSha256": "143c1a012e7cc7845932f8ea426f9514190988e27135540a925c2afe69069ba9",
"alphaBbox": [71, 96, 1194, 1253],
"correction": "only registered GPT Image 2-authored crown pixels outside the immutable original endpoint silhouette; face, glasses, wardrobe, crop, scale, and pose retain original pixels"
},
{
"pose": "center",
"sourceGeneration": "exec-83d7d7fc-3601-4ce0-912f-c7ee2dce35ad.png",
"sourceSha256": "370a7d52f8f665321d9d08fbb0aad936318e81e1f0860720e463fed23016079e",
"keyedMasterSha256": "9fc6733e5fe79930e686ee8a8011c0d2f360a6620f4d8f3c21995953a5aff2a7",
"alphaBbox": [69, 99, 1196, 1254]
},
{
"pose": "right",
"sourceGeneration": "output/imagegen/face-motion-v12-transitions/dense2/right-hair-final-v7.png",
"sourceSha256": "5ddd3f707c4a44d04d677aa21323f5ffbbf769a168b902a91120a7a29b57513b",
"keyedMasterSha256": "ff839121a91538aae32b562a4bf5695d7273c8b49eb1c8d66c06a694a2531ae9",
"alphaBbox": [70, 92, 1191, 1253],
"correction": "only registered GPT Image 2-authored crown pixels outside the immutable original endpoint silhouette; isolated magenta key specks removed; face, glasses, wardrobe, crop, scale, and pose retain original pixels"
},
{
"pose": "bottom-left",
"sourceGeneration": "exec-0ab086f9-2890-4bf9-b667-45c6c8c97200.png",
"sourceSha256": "325cb59c0483d6f514921870a399e82abfcb319a3649fd856ed7959b9c6c7dbe",
"keyedMasterSha256": "ffe47b40ab878553ee98c89b7ae98dad720d5bcdd4c592e8e5fb39acac333c16",
"alphaBbox": [74, 128, 1199, 1254]
},
{
"pose": "bottom",
"sourceGeneration": "exec-c88bad67-f1de-48a4-83aa-16c49bc24316.png",
"sourceSha256": "4dc951afcf6329f9bb4890c9e46e7f95b07da2f1bab45a4fb8088fbcbb3219e0",
"keyedMasterSha256": "a075b1c931daba739ea14e6d763457378f0932624246ae12f4d7d97af8ee9ebe",
"alphaBbox": [69, 115, 1196, 1254]
},
{
"pose": "bottom-right",
"sourceGeneration": "exec-9e465e6d-3134-4334-bb5d-77358ed7f3f2.png",
"sourceSha256": "1b16aa28c34f00389981a947d407bd89e8f150c4d1b4264190f13990f549cd10",
"keyedMasterSha256": "d93e61860ff80768e801adf86bcdb3c074a1c59c37103f79652637cfdde519d2",
"alphaBbox": [59, 145, 1182, 1254]
}
]
}
32 changes: 32 additions & 0 deletions public/resume/face-motion/v12/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Face-motion V12

V12 is a nine-pose compass set built from accepted **GPT Image 2** originals.
Each `1254×1254` endpoint is a lossless WebP with a transparent background and
a semantic filename (`center.webp`, `top-right.webp`, and so on).

Only border-connected magenta background removal was applied to the accepted
generated portraits. The endpoints were not cropped, recentered, warped,
interpolated, body locked, or blended.

The live graph currently has nine independently generated GPT Image 2
transition frames: three for top, two for left, one each for bottom, top-left,
and top-right, and one for the right-to-bottom-right ring edge. Each
was accepted only after visual and pose QA; failed or off-axis generations
remain outside the runtime. The runtime reverses the same approved frame when
travelling back across an edge, so motion stays symmetric.

The extreme left and right endpoints use GPT Image 2 hair corrections derived
from the neighboring diagonal poses. Only registered GPT-authored crown pixels
outside each immutable original silhouette are imported; the face, glasses,
ears, clothes, crop, scale, and pose remain the original endpoint pixels. This
restores consistent crown height without the scale, roll, or rear-hair drift
found during visual QA of the rejected full-frame edits.

`portrait-neutral.webp` is a byte-for-byte copy of `center.webp`. The automated
asset verifier checks all nine endpoints for inventory, manifest hashes,
lossless VP8L encoding, exact `1254×1254` dimensions, decoded uniqueness, and
center/poster parity.

- Runtime inventory: [`manifest.json`](manifest.json)
- Generation provenance: [`PROVENANCE.json`](PROVENANCE.json)
- Immutable-endpoint validation: [`VALIDATION.md`](VALIDATION.md)
34 changes: 34 additions & 0 deletions public/resume/face-motion/v12/VALIDATION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# V12 immutable-endpoint validation

PASS: nine `1254×1254` lossless WebP endpoints were built directly from the
accepted GPT Image 2 magenta-background originals.

- No crop, recenter, resize, rotation, facial warp, body lock, optical flow,
interpolation, or frame blending was performed.
- Alpha is derived from border-connected magenta only. RGB is byte-identical to
the raw source for every fully opaque pixel.
- Chroma recovery is restricted to partially transparent silhouette pixels. It
cannot touch opaque glasses, hair, skin, or clothing pixels.
- Every WebP decoded to alpha and visible RGBA exactly matching its keyed PNG
master, and every file uses lossless VP8L encoding.

| endpoint | alpha bbox | opaque pixels | partial pixels | WebP bytes |
| ------------ | ----------------------: | ------------: | -------------: | ---------: |
| top-left | `[69, 98, 1191, 1254]` | 738,596 | 6,480 | 719,420 |
| top | `[71, 111, 1194, 1254]` | 709,697 | 6,820 | 729,410 |
| top-right | `[72, 92, 1192, 1254]` | 739,480 | 6,687 | 729,288 |
| left | `[70, 103, 1195, 1254]` | 730,914 | 6,698 | 762,100 |
| center | `[69, 99, 1196, 1254]` | 724,528 | 5,973 | 760,630 |
| right | `[70, 99, 1193, 1254]` | 726,237 | 6,135 | 731,546 |
| bottom-left | `[74, 128, 1199, 1254]` | 732,368 | 6,483 | 725,340 |
| bottom | `[69, 115, 1196, 1254]` | 724,959 | 5,686 | 719,452 |
| bottom-right | `[59, 145, 1182, 1254]` | 706,047 | 6,352 | 715,492 |

Visual inspection confirmed crisp lenses and metal rims without doubled or
vertically smeared eyewear, retained hair detail, visible authored up/down
movement, and the generated white crew-neck plus charcoal open overshirt in all
nine endpoints. The common canvas and authored framing are intentionally left
unaltered.

Run `bun run verify:face-motion` to recreate the machine-readable QA report and
contact sheet in `build/face-motion-qa/`.
Binary file added public/resume/face-motion/v12/bottom-left.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/resume/face-motion/v12/bottom-right.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/resume/face-motion/v12/bottom.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/resume/face-motion/v12/center.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/resume/face-motion/v12/left.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
72 changes: 72 additions & 0 deletions public/resume/face-motion/v12/manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
{
"schemaVersion": 1,
"version": 12,
"model": "gpt-image-2",
"assetBasePath": "/resume/face-motion/v12",
"canvas": {
"width": 1254,
"height": 1254
},
"center": "center",
"poster": "portrait-neutral.webp",
"processing": {
"backgroundRemoval": "border-connected magenta alpha only",
"crop": false,
"recenter": false,
"resize": false,
"rotate": false,
"warp": false,
"bodyLock": false,
"opticalFlow": false,
"interpolate": false,
"blend": false,
"opaqueRgbPreserved": true
},
"endpoints": [
{
"pose": "top-left",
"file": "top-left.webp",
"fileSha256": "c1b4e8f6d813e1a7b864d6cfdfe6fc9cca7ad87738f0e4fb63f20f805d23ccf3"
},
{
"pose": "top",
"file": "top.webp",
"fileSha256": "c4583dbb90e5b0137f04c22eca9f74fa8b57ef223b909c7e59fd255ffaa11a11"
},
{
"pose": "top-right",
"file": "top-right.webp",
"fileSha256": "05f0a86dd90624aea86214da8b3a2b154067ead194d7b3f2f6bdf05aa9d7ecd9"
},
{
"pose": "left",
"file": "left.webp",
"fileSha256": "143c1a012e7cc7845932f8ea426f9514190988e27135540a925c2afe69069ba9"
},
{
"pose": "center",
"file": "center.webp",
"fileSha256": "5ad8419e7c03e9ff679977bf903f78fe9fd7fb10f6f66d87843bdf1fa28e86e4"
},
{
"pose": "right",
"file": "right.webp",
"fileSha256": "ff839121a91538aae32b562a4bf5695d7273c8b49eb1c8d66c06a694a2531ae9"
},
{
"pose": "bottom-left",
"file": "bottom-left.webp",
"fileSha256": "ce59d7da8f145a90ea7193b54304e60e35a7a7d85c4ca938332172377335e505"
},
{
"pose": "bottom",
"file": "bottom.webp",
"fileSha256": "83e7159b290e15355598bace707c4a6ed7c1a266b9d5edee48856ea2d895e16f"
},
{
"pose": "bottom-right",
"file": "bottom-right.webp",
"fileSha256": "390c7fe733b44feead8c850ac06f0c97ad5906b67999429a5955fb26e59ee24a"
}
]
}
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/resume/face-motion/v12/right.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/resume/face-motion/v12/top-left.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/resume/face-motion/v12/top-right.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/resume/face-motion/v12/top.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading