diff --git a/docs/design/ROOM_PARITY_GAP.md b/docs/design/ROOM_PARITY_GAP.md
index 83b5a476..eadd7ec5 100644
--- a/docs/design/ROOM_PARITY_GAP.md
+++ b/docs/design/ROOM_PARITY_GAP.md
@@ -28,8 +28,8 @@ memory demo room, first-visit state).
|---|---|---|---|
| 1 | Per-sheet header: title + filter + `DATAFRAME vNN` chip + `Room trace · N` + `Entity graph` on the artifact itself | REFINE | Version/kicker data already computed (Artifact.tsx `sheetKicker`, `dataframeMeta`); today it renders in the FOOTER as an all-caps kicker. Promote to header, quiet mono chip. |
| 2 | Footer consolidation: `N rows · double-click a cell to edit` + `N of N cols` only | REFINE | Undo stays (reference omits it but recoverability beats parity — B7). Kicker moves up (slice 1). |
-| 3 | Demo seed shows the POPULATED moment: variance chips (+24% …) + notes filled, like the landing loop's end state | REFINE | The reference sells the ledger full. Check e2e/state-capture deps on empty variance cells first. |
-| 4 | Variance/computed cells as semantic chips (green = reconciled+sourced success state) | REFINE | Matches landing loop's committed-value styling; green stays success-only. |
+| 3 | Demo seed shows the POPULATED moment: variance chips (+24% …) + notes filled | REJECT (amended 2026-07-17) | The empty→filled arc IS the demo: the seed empties variance cells (engine/demoRoom.ts:230) so the agent reconciles them LIVE on request. Pre-filling kills the product's hero moment. `state-captures.spec.ts:148` pins the "+ add" affordance. |
+| 4 | Variance/computed cells as green chips | REJECT as-drawn (amended 2026-07-17) | Existing taste ruling in `state-captures.spec.ts:148`: values use "neutral/sign-aware color, not all-green" — a green +27.5% on COGS would mark a cost increase as success. The mockup loses to semantics. |
| 5 | Binder: hierarchical categories with counts (Sheets > Financials 2 …, Docs, Notebooks, Uploads) + inline meta on pinned rows (`Sheet · v42 · agent`) | REFINE | Current: flat Pinned/Recent/Room-sheets. Needs artifact taxonomy from store; medium. |
| 6 | Tab strip: fold overflow into `+3 ∨` dropdown; move Export XLSX / Shared to a quieter right cluster | REFINE | Current `+3` chip exists but row still crowds. |
| 7 | Chat: accepted-patch EVENT LINES (`✓ Homen accepted the patch v42 → v43 · 2 cells · sourced`) + pinned-cell chips in messages | REFINE | Receipt cards + version chips already exist; event lines and cell-pin chips are missing. |
diff --git a/src/app/styles.css b/src/app/styles.css
index f4c40566..eeb11a39 100644
--- a/src/app/styles.css
+++ b/src/app/styles.css
@@ -1161,6 +1161,8 @@ button.r-offline-pill:hover, button.r-offline-pill:focus-visible { border-color:
version pill, chromeless column count. .r-vpill.next keeps its accent — it is a pending-commit
semantic, not decoration. */
.r-sheet-foot { padding: 10px 14px; border-top: 1px solid color-mix(in srgb, var(--line) 55%, transparent); display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
+/* The engine badge is provenance, not a headline — quiet mono, no uppercase shout. */
+.r-dataframe-badge .kicker { text-transform: none; letter-spacing: 0; font-family: var(--font-mono); font-weight: 600; font-size: 10px; }
.r-vpill { font-family: var(--font-mono); font-size: 11px; font-weight: 700; padding: 2px 8px; border-radius: 6px; background: transparent; border: 1px solid var(--line); color: var(--text-muted); }
.r-vpill.next { background: var(--accent-tint); border-color: var(--accent-border); color: var(--accent-ink); }
.r-cols-pill { display: inline-flex; align-items: center; min-height: 22px; padding: 0 7px; border: 1px solid transparent; border-radius: 6px; background: transparent; color: var(--text-muted); font-family: var(--font-mono); font-size: 10.5px; font-weight: 800; white-space: nowrap; }
diff --git a/src/ui/Landing.tsx b/src/ui/Landing.tsx
index 62694e39..5e5a1391 100644
--- a/src/ui/Landing.tsx
+++ b/src/ui/Landing.tsx
@@ -535,7 +535,14 @@ function ProofPillView({ rooms, cells, demo }: { rooms?: LandingMetric; cells?:
/** Mounted ONLY in live mode — memory mode has no ConvexProvider and useQuery would throw. */
function LiveProofPill() {
const metrics = useQuery(landingMetricsQuery, {});
- return ;
+ // No placeholder ghosts (em-dashes read as a broken page), and no zero-bragging:
+ // a social-proof strip with nothing to prove should not render at all. Verified
+ // against prod: metrics:landingMetrics currently returns { roomsLive: 0, ... }.
+ const rooms = metrics?.roomsLive;
+ const cells = metrics?.cellsCommittedToday;
+ if (!rooms || !cells) return null;
+ if (rooms.value === 0 && cells.value === 0) return null;
+ return ;
}
function LandingProofPill({ live }: { live: boolean }) {
diff --git a/src/ui/panels/Artifact.tsx b/src/ui/panels/Artifact.tsx
index e12f6bc4..4fbafd9b 100644
--- a/src/ui/panels/Artifact.tsx
+++ b/src/ui/panels/Artifact.tsx
@@ -2131,7 +2131,7 @@ export function GenericSheet({ roomId, me, art, proof, onError }: { roomId: stri
const selectedRowId = selected.rowId;
const selectedColId = selected.colId;
const dataframeMeta = art.meta?.dataframe;
- const sheetKicker = dataframeMeta?.sourceFile === "blank-room" || dataframeMeta?.sourceFile === "blank-room-agent" ? "versionedSpreadsheetSync" : art.meta?.upload ? "uploadedSpreadsheet" : "dataframe";
+ const sheetKicker = dataframeMeta?.sourceFile === "blank-room" || dataframeMeta?.sourceFile === "blank-room-agent" ? "versionedSync" : art.meta?.upload ? "uploaded" : "dataframe";
const columnCountLabel = cols.length < columns.length ? `${cols.length} of ${columns.length} cols` : `${cols.length} cols`;
const columnCountTitle = cols.length < columns.length ? `${columns.length - cols.length} hidden columns available from the column menu` : "All columns visible";
const footerColumnLabel = `${columns.length} columns`;
@@ -2901,7 +2901,7 @@ function Sheet({ roomId, me, art, proof, onError }: { roomId: string; me: Actor;
- versionedSpreadsheetSync
+ versionedSync
v{art.version}