Found while reviewing #158 (thread on packages/web-og/src/index.tsx:242). Pre-existing on main, not introduced by that PR, so it is split out rather than bundled into it.
What
ResultCard in packages/web-og/src/index.tsx never reads result.partial. The web page does — packages/web/src/ui/result-card.tsx renders PartialResult (:23) and BestEffortBanner (:31) — so the two surfaces disagree about the same result, and the one that disagrees is the one that gets screenshotted into Slack, X and GitHub unfurls.
Two shapes render wrong today:
partial with firstRelease: null. The card shows the green --ship dot, "First released in", and not yet released. A truncated traversal is not evidence the commit is unreleased. If the commit is released, the unfurl asserts the opposite of the truth.
partial WITH a firstRelease. The card shows the green SHIPPED badge with no caveat. The gallop hit is the release we happened to land on, and the bisect that would confirm no EARLIER release contains the commit is exactly what the soft deadline cut short — so v2.0.0 can unfurl as final when v1.9.0 was the true earliest.
That is the CLAUDE.md guardrail — "Partial state ≠ 'not yet released'" — broken on the share surface.
Why it is not urgent-but-still-real
#158 gives both shapes a 300s PENDING_CACHE instead of the 24h pin, so a mislabeled card now lives 5 minutes at a time rather than a day. Right direction, but the copy is still wrong for those 5 minutes, and unlike the web page there is no caveat anywhere on the PNG.
Interaction with the PRs in flight
So: fix this with #156, not before it. Fixing it before #144 lands would be writing copy for a path #144 closes; fixing it after #156 lands without this would reopen the path with the same wrong copy.
Shape of the fix
Mirror what result-card.tsx already does, within the OG card's space budget:
- partial +
firstRelease → keep the tag, replace the SHIPPED badge with a "best effort" / "not confirmed earliest" treatment.
- partial + null → do not say "not yet released"; say the lookup was cut short.
Guard it with a routing test per shape asserting the rendered copy, alongside the lifetime test added in #158 (a soft-deadline partial with NO release renders the not-yet copy, PENDING-cached), which will need updating in the same commit.
Related: #159 (the same partial pinned as terminal on the web + badge surfaces), #151, #156.
Found while reviewing #158 (thread on
packages/web-og/src/index.tsx:242). Pre-existing onmain, not introduced by that PR, so it is split out rather than bundled into it.What
ResultCardinpackages/web-og/src/index.tsxnever readsresult.partial. The web page does —packages/web/src/ui/result-card.tsxrendersPartialResult(:23) andBestEffortBanner(:31) — so the two surfaces disagree about the same result, and the one that disagrees is the one that gets screenshotted into Slack, X and GitHub unfurls.Two shapes render wrong today:
partialwithfirstRelease: null. The card shows the green--shipdot, "First released in", andnot yet released. A truncated traversal is not evidence the commit is unreleased. If the commit is released, the unfurl asserts the opposite of the truth.partialWITH afirstRelease. The card shows the greenSHIPPEDbadge with no caveat. The gallop hit is the release we happened to land on, and the bisect that would confirm no EARLIER release contains the commit is exactly what the soft deadline cut short — sov2.0.0can unfurl as final whenv1.9.0was the true earliest.That is the
CLAUDE.mdguardrail — "Partial state ≠ 'not yet released'" — broken on the share surface.Why it is not urgent-but-still-real
#158 gives both shapes a 300s
PENDING_CACHEinstead of the 24h pin, so a mislabeled card now lives 5 minutes at a time rather than a day. Right direction, but the copy is still wrong for those 5 minutes, and unlike the web page there is no caveat anywhere on the PNG.Interaction with the PRs in flight
/internal503 everypartial, so once it merges no partial reaches web-og at all: the card becomes the neutral placeholder. That removes the wrong copy by removing the card.So: fix this with #156, not before it. Fixing it before #144 lands would be writing copy for a path #144 closes; fixing it after #156 lands without this would reopen the path with the same wrong copy.
Shape of the fix
Mirror what
result-card.tsxalready does, within the OG card's space budget:firstRelease→ keep the tag, replace theSHIPPEDbadge with a "best effort" / "not confirmed earliest" treatment.Guard it with a routing test per shape asserting the rendered copy, alongside the lifetime test added in #158 (
a soft-deadline partial with NO release renders the not-yet copy, PENDING-cached), which will need updating in the same commit.Related: #159 (the same partial pinned as terminal on the web + badge surfaces), #151, #156.