diff --git a/apps/website/__tests__/components/ReceiptsBand.test.tsx b/apps/website/__tests__/components/ReceiptsBand.test.tsx
index d3ca0b5..bafc3a0 100644
--- a/apps/website/__tests__/components/ReceiptsBand.test.tsx
+++ b/apps/website/__tests__/components/ReceiptsBand.test.tsx
@@ -19,6 +19,15 @@ it("renders the receipts headline numbers", () => {
expect(screen.getByText("9ms")).toBeInTheDocument();
});
+it("renders the streaming-pipeline capability anchor (B2 follow-up #7)", () => {
+ render();
+ // After S5/S7 cross-validation showed AG Grid ties on raw streaming
+ // numerics, the fourth slot is a capability anchor (the integration
+ // pretable ships, not a throughput number).
+ expect(screen.getByText(/streaming sources/i)).toBeInTheDocument();
+ expect(screen.getByText(/openai/i)).toBeInTheDocument();
+});
+
it("does not render the positioning cards anymore (moved to CredibilityCards)", () => {
render();
expect(screen.queryByText(/ai-native/i)).not.toBeInTheDocument();
diff --git a/apps/website/app/components/ComparisonTable.tsx b/apps/website/app/components/ComparisonTable.tsx
index 3c2a66b..a07b234 100644
--- a/apps/website/app/components/ComparisonTable.tsx
+++ b/apps/website/app/components/ComparisonTable.tsx
@@ -22,6 +22,13 @@ const NA_MARKER = "n/a";
// Same slice for pretable + mui at 20 repeats. Confirms parity (mean
// diff −0.065 ms, well inside the 2σ noise floor of 0.40 ms).
//
+// status/milestones/2026-05-09-b2-s5-s7-cross-validation.hypotheses.json
+// S5/updates × {1000, 25000}/sec and S7/scroll × 4 adapters × 3 repeats.
+// Cross-validates H1 on S7 (satisfied) and surfaces H13/H14/H15 as
+// directional — AG Grid's native applyTransaction matches pretable on
+// streaming p95, the 25k/sec envelope, and visible-row drift. The
+// streaming-uniqueness wedge is package surface, not raw throughput.
+//
// status/milestones/2026-05-10-b2-sort-filter-summary.json
// S2/hypothesis/Chromium × 3 repeats × 4 adapters × 3 interaction
// scripts. Pretable beats AG Grid 3-3.5× and MUI 2× across sort,
@@ -34,9 +41,9 @@ const NA_MARKER = "n/a";
// The wedge: parity with the best full-grid comparator (MUI) on raw frame
// p95, with ~1.7× headroom over AG Grid + TanStack, and the only adapter
// here that combines zero blank gaps + zero anchor shift + ≤1 px row-height
-// fidelity at full-grid feature weight. Streaming rows are absent until a
-// future runset captures comparative S5 evidence — see
-// project_b2_followups.md item 6.
+// fidelity at full-grid feature weight. The streaming row is capability-
+// anchored (not numeric): pretable ships the SSE/partial-JSON/batcher/
+// applyTransaction pipeline; AG Grid users wire that themselves.
const ROWS: readonly Row[] = [
{
metric: "frame p95 (ms) — wrapped scroll",
@@ -103,7 +110,8 @@ const ROWS: readonly Row[] = [
budget: "—",
},
{
- metric: "purpose-built streaming pipeline",
+ metric:
+ "streaming pipeline (SSE → partial JSON → batcher → applyTransaction)",
pretable: "yes",
agGrid: NA_MARKER,
tanstack: NA_MARKER,
diff --git a/apps/website/app/components/FeatureGrid.tsx b/apps/website/app/components/FeatureGrid.tsx
index 8178491..843f7c6 100644
--- a/apps/website/app/components/FeatureGrid.tsx
+++ b/apps/website/app/components/FeatureGrid.tsx
@@ -25,7 +25,7 @@ const FEATURES: readonly Feature[] = [
{
title: "Stream-aware",
description:
- "Token-by-token rendering for OpenAI, Anthropic, your own SSE — sustained from 100 to 25,000 updates/sec.",
+ "Token-by-token rendering for OpenAI, Anthropic, and your own SSE. The full pipeline — partial-JSON parser, frame-budget batcher, applyTransaction wiring — ships as one import.",
marker: "black",
markerLabel: "Advanced — bring your own SSE",
},
diff --git a/apps/website/app/components/ReceiptsBand.tsx b/apps/website/app/components/ReceiptsBand.tsx
index 418846c..c5a66cc 100644
--- a/apps/website/app/components/ReceiptsBand.tsx
+++ b/apps/website/app/components/ReceiptsBand.tsx
@@ -3,29 +3,41 @@ interface Stat {
caption: string;
/** First stat anchors with accent color (warm orange) on the dark band. */
accent?: boolean;
+ /**
+ * Render the value at a smaller size for non-numeric labels (e.g., a
+ * source list). The grid still uses four cells; this slot just trades
+ * hero-number weight for legible text.
+ */
+ compact?: boolean;
}
// Receipts snapshot — numbers from the committed B2 comparative runset
-// and its high-repeat correction:
+// and its high-repeat correction; final slot is a capability anchor.
//
// status/milestones/2026-05-09-b2-h1-high-repeat-correction.json
// S2/hypothesis/scroll × 20 repeats. Pretable mean p95 = 9.07 ms ± 0.20;
// parity with MUI X DataGrid Community. Quality wedge: 0 blank gaps,
// 0 anchor shift, ≤1 px row-height drift.
//
-// status/milestones/2026-05-01-streaming-revalidated.hypotheses.json
-// S5/updates × 6 rates × 3 repeats. Pretable max sustained update rate
-// = 25k/sec (pretable's own — comparative S5 evidence pending; see
-// project_b2_followups.md item 6).
+// status/milestones/2026-05-09-b2-s5-s7-cross-validation.hypotheses.json
+// S5/updates × 4 adapters × 3 repeats. AG Grid Community matches
+// pretable on raw streaming throughput (9.2 ms p95, 25k/sec, 0 drift),
+// so the streaming wedge is reframed as the shipped pipeline rather
+// than the throughput number. Final receipts slot is the source list
+// pretable ships integrations for.
//
// First stat (0) anchors the quality wedge with accent (warm orange). All
-// numbers are pretable's own; the comparative ranking lives on the /bench
+// numerics are pretable's own; the comparative ranking lives on the /bench
// page and ComparisonTable.
const STATS: readonly Stat[] = [
{ value: "0", caption: "blank gaps under scroll", accent: true },
{ value: "9ms", caption: "frame p95 / wrapped scroll" },
{ value: "≤1px", caption: "row-height fidelity" },
- { value: "25k/s", caption: "max sustained update rate" },
+ {
+ value: "OpenAI · Anthropic · SSE",
+ caption: "streaming sources, one import",
+ compact: true,
+ },
];
export function ReceiptsBand() {
@@ -43,7 +55,10 @@ export function ReceiptsBand() {
diff --git a/docs/research/repo-memory.md b/docs/research/repo-memory.md
index 45c4d72..073954a 100644
--- a/docs/research/repo-memory.md
+++ b/docs/research/repo-memory.md
@@ -364,6 +364,20 @@ No other hypothesis status changed (S2-dependent ones — H1, H6–H8, H10–H12
- Editorial homepage refresh (potentially repopulating the deleted streaming row from this evidence) — distinct prose work.
- Comparative interaction scripts (sort, filter-text, filter-metadata, cell-renderer) on S7 — still pretable-only per the supportedScripts gate; tracked as B2 follow-up #5.
+### B2 follow-up #7: streaming wedge reframed as capability-anchored
+
+Direct consequence of follow-up #6's finding. AG Grid Community matches pretable on every measured streaming numeric (frame p95, 25k/sec envelope, visible-row drift), so the homepage can no longer claim a numeric streaming win. The wedge moves to package surface: pretable ships the SSE → partial-JSON → batcher → applyTransaction pipeline as a single import; AG Grid expects you to wire that yourself.
+
+Three editorial edits across `apps/website`:
+
+- **`ComparisonTable.tsx`** — the streaming row was titled `purpose-built streaming pipeline` (vague). Renamed to `streaming pipeline (SSE → partial JSON → batcher → applyTransaction)` to spell the wedge out concretely. Still capability-anchored (`yes / n/a / n/a / n/a`); no numeric streaming row added because the n=3 numerics tie.
+- **`ReceiptsBand.tsx`** — replaced the `25k/s · max sustained update rate` hero stat (no longer pretable-unique) with `OpenAI · Anthropic · SSE · streaming sources, one import`. Added a `compact: true` flag to the `Stat` interface so the longer label renders at a smaller font size, preserving the four-cell grid without overflowing the hero font scale.
+- **`FeatureGrid.tsx`** — Stream-aware card: dropped the "sustained from 100 to 25,000 updates/sec" tail; rewrote the description around the pipeline that ships as one import.
+
+Test added: `ReceiptsBand.test.tsx` regression-guards the new capability anchor (`streaming sources` + `openai`). The `verdictFor` / trail-marker tests are unchanged.
+
+The "Stream-aware" card in FeatureGrid retained its `markerLabel: "Advanced — bring your own SSE"` because that's still accurate — pretable ships the post-SSE pipeline; the SSE source itself is consumer-supplied.
+
## 2026-05-10
### B2 follow-up #5a: cell-renderer scripts opened to comparators