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;