feat(compare): rewrite /compare for the current wedge; stop leading on Raft - #763
Merged
Conversation
…n Raft The page led with "the difference is ownership" and compared only against Raft. Both are now wrong. Ownership is not our wedge. Buzz is Apache-2.0, self-hostable and backed by Block, so any framing whose punchline is "we're the open one" loses to Buzz on its own terms. And a single-competitor page anchors visitors on a company most of them have never heard of -- our homepage linked "Compare to Raft" four times, which is free marketing for a competitor. Now: concede the parity first (agent-to-agent work and per-agent memory are the shared bet, not our differentiator), then what a team has to accept from each of Buzz, Multica, Raft and the incumbent workspaces, then what we do differently -- AI-native, built for the second agent, yours to run, humans are seats. Deliberately NOT a checkmark grid. A table we win every row of invites the cherry-picked-rows objection, and prose cards stack on mobile without a grid-template override. Claims discipline, now written into both the doc and the component header: never assert an alternative LACKS something without a primary source. Earlier competitive drafts claimed Raft had no a2a and Buzz had no memory -- both false, both inferred from a single document. The same rule now covers incumbents: "Slack bots are second-class" is no longer true given Slack AI apps, Teams Entra Agent ID, and Lark bots-as-group-members. Renamed landing.actions.compareRaft -> landing.actions.compare; the key named a competitor and the label now reads "How we compare". Verified in a real browser (jsdom has no layout engine): 1280px and 390px, zero horizontal overflow, cards stack to one column, both locales render with no missing keys. 308/308 frontend tests pass. Typecheck errors and lint warnings present are pre-existing on main and touch none of these files. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RWkf1SuYRHosxnPqsXwaVa
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
The
/comparepage led with "the difference is ownership" and compared only against Raft. Both are now wrong.Ownership isn't our wedge. Buzz is Apache-2.0, self-hostable and backed by Block. Any framing whose punchline is "we're the open one" loses to Buzz on its own terms.
A single-competitor page anchors visitors on a company they've never heard of. The landing page linked "Compare to Raft" four times (nav, two CTAs, footer) — free marketing for a competitor, on our own front door.
What changed
docs/commonly-vs-raft.mddocs/commonly-vs-alternatives.mdThe page now opens by conceding what's genuinely the same — agent-to-agent work and persistent per-agent memory are the shared bet, not our differentiator, and we don't claim to have described it first. Leading with that is what makes the rest believable.
Deliberately not a checkmark grid. A table we win every row of invites the cherry-picked-rows objection, and prose cards stack on mobile without needing a
grid-template-columnsoverride.Claims discipline
Written into both the doc and the component header, because we've now made this mistake four times:
Earlier competitive drafts asserted Raft had no agent-to-agent collaboration and Buzz had no persistent memory. Both false — Raft's a2a is a headline feature with a published production metric, Buzz's memory is a signed spec (
kind:30174) on by default. Both came from inferring absence from a single document.The same rule now explicitly covers incumbents: "Slack bots are second-class" is no longer true. Slack ships autonomous AI apps and third-party agent surfaces, the Teams SDK ships MCP/A2A and agentic identity via Entra Agent ID, and Lark defines bots as group members with Docs/Base/Tasks/Calendar. Only definitional claims survive — they're SaaS, and their agent identity is vendor-scoped.
Verification
Real browser, because jsdom has no layout engine and this replaced a table with a grid:
auto-fit+minmax(min(100%, 280px), 1fr))— no media query neededalign-items: flex-startso it sits on the first line when a card title wrapsLint 0 errors. The 2 lint warnings and 5 typecheck errors present are pre-existing on
mainand touch none of these files (verified by stashing).Reviewer note
🇨🇳 The zh-CN copy needs Sam's native pass before merge, per the i18n merge gate. I wrote it against the established glossary (agent → 智能体, memory → 记忆, DM → 私信, token → 令牌) but a native read is the gate, not my draft.
🤖 Generated with Claude Code
https://claude.ai/code/session_01RWkf1SuYRHosxnPqsXwaVa