Skip to content

docs: describe the product as the block protocol left it - #191

Open
mroops0111 wants to merge 6 commits into
masterfrom
docs/readme-block-protocol
Open

mroops0111 wants to merge 6 commits into
masterfrom
docs/readme-block-protocol

Conversation

@mroops0111

@mroops0111 mroops0111 commented Sep 16, 2026

Copy link
Copy Markdown
Owner

Closes #172.

The README last changed substantially in #105. Four merges since then moved what it describes, and a reader arriving today is told to do things that no longer exist and told nothing about the mechanisms that now decide what Braid feels like to use.

Two commits. The first fixes what is false. The second fixes what the front door spends its space on.

What Was False

Two mechanisms get a section each, because they are what a reader can check. Typed Blocks says a skill renders by calling a tool, that each call is a route on Braid's own spec and therefore an MCP tool with a schema, and that a block carries no layout. AG-UI on the Wire says Studio consumes /agui with the protocol's own HttpAgent, which is the only objective test that the endpoint is the protocol rather than something shaped like it. Documents as Projections says the deterministic half of a document never passes through model output, and that staleness falls out of the split rather than being tracked.

The Loop described a product that changed underneath it. It routed a reader to an Actions tab that left the rail, and to a Proposal surface and a Clarification surface as two separate acts. It now routes through Build, one Inbox holding both kinds of card, and Documents.

Architecture no longer says a run travels over SSE, nor that the CLI reads one. The CLI has init, serve, dev, and workspace, and nothing that streams a run.

A skill's category decides what it is offered, which is the reader-facing half of the narrowed spec. ask, build, and generate each get a line, and the frontmatter example declares one.

@braidhq/source-loader-mcp and @braidhq/view-generator-doc were missing from the package table.

Package READMEs

These drifted the same way and were not in the issue's scope, but they are what somebody reads after the root one.

  • studio: described seven surfaces, the Actions and Batch panels among them, and a run read over SSE. Now six surfaces, the block renderers, and a run read with a stock AG-UI client.
  • server: the MCP Gateway section said a per-run gateway exposes the whole spec. forRuns ended that, and the gateway reads GET /openapi/runs/:category/openapi.json. Role gains the run wire and the render calls, and infrastructure/agui/ joins the tree.
  • schema: the module families listed a clarify module that does not exist and omitted block, handoff, capability, coverage, reference, locale, embedding, and source-sync.
  • core: ClarifyTicket has been Clarification for a while, and ViewService was missing from the services.
  • sdk: defineViewGeneratorPlugin said a view kind renders a snapshot into an artifact, which predates subjects and format.
  • ontology-ddd: scan was missing from the skills, and renderHint now orders a document as well as colouring a canvas.
  • source-loader-mcp: the one package README that never followed the Role / Structure / Boundaries / Dependencies shape the other fifteen use. Restructured onto it with nothing removed.

What It Spends Its Space On

The root README is the project's front door, not its manual, and a correct document can still be the wrong one.

A worked example, which it never had. examples/conciergent has been in the repository the whole time: 120 nodes and 159 edges derived from one real codebase with no intent documents, the reviewed clarifications and proposals alongside, and a rendered graph. Every claim above it was abstract, so a reader could only believe it or not. One rule is quoted in full with the two source lines it was drawn from, because that is the shortest way to show what a model a PM can read actually looks like.

Five features, not seven. Past five a reader stops ranking and starts skimming, and the most distinctive item gets the weight of the most generic. Blocks and AG-UI were one story told twice, so they are one bullet. Git-versioned history becomes a clause of the gate it belongs to.

AG-UI moves to a badge. "We speak a standard protocol" is a credibility claim, and a badge is where a project makes one. It costs no space in a list whose job is to say why a reader should care, and the Design section still carries the detail.

The Deployment section goes. The issue asked for the full variable table in the root README, and that was the one recommendation not taken. packages/server/README.md has held that table since #117, and a second copy would drift against the first. It is also operator documentation: Quick Start's job is to get something running, and twelve lines about containers and a bare 401 belong after that, not inside it. One sentence points at compose.yaml and the server package.

Quick Start now says what is needed first. A reader could install, create a workspace, press run, and watch nothing happen, because a skill run is a claude subprocess and the README never mentioned it.

Motivation gains the objection a reader actually has now. The two failure modes it argued against were the 2024 ones. "Why not point an agent at the repository" is the current one, and the answer is the thesis: the graph is not an index that makes retrieval faster, it is where judgement is put so it outlives the conversation that produced it.

A Status section, because a public repository at 0.6.0 that never says where it stands reads as either abandoned or overclaiming.

Not in This PR

  • The demo gif still shows the old Clarification and Proposal surfaces. It needs re-recording against a workspace whose contents can be shown publicly, and the hero alt text changes with it.
  • The architecture diagram. architecture.pen is editable JSON and architecture.png is the rendered export, which needs the design app. Held for a separate pass rather than landing a half-updated pair.

Verified

eslint over every changed file, which is what lint-staged runs on .md. Every relative link resolves, examples/conciergent/graph.png is tracked so the image renders, and the packages/server/README.md#deployment anchor exists. No arrows or em-dashes in any file touched.

🤖 Generated with Claude Code

The README last changed substantially in #105. Four merges since then moved
what it describes: #164 gave a run's output a typed block protocol and put
AG-UI on the wire, #179 wired the view axis end to end and added Documents,
#178 named a Handoff, and #182 retired the Actions surface.

Root README: Features gains typed blocks and AG-UI, Design gains a section
for each of the three mechanisms, Architecture stops saying a run travels
over SSE, and The Loop stops routing a reader through an Actions tab and two
review surfaces that no longer exist. A Deployment section names the two
variables whose absence costs an afternoon. Two shipped packages were missing
from the table.

Package READMEs: studio described seven surfaces and a run it reads over SSE,
schema listed a module that does not exist and omitted eight that do, core
still called a Clarification a ClarifyTicket, server claimed a per-run gateway
reads the whole spec, which forRuns ended, ontology-ddd omitted scan, and
source-loader-mcp never followed the shape the other packages use.

The demo gif and the architecture diagram still show the old surfaces. Both
are follow-ups.

Closes #172.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot added the documentation Improvements or additions to documentation label Sep 16, 2026
mroops0111 and others added 5 commits September 16, 2026 18:22
The first pass fixed what was false. This fixes what it spends its space on.

A worked example, which the README never had. `examples/conciergent` has been
in the repository the whole time: 120 nodes and 159 edges derived from one real
codebase with no intent documents, the reviewed clarifications and proposals
alongside. Every claim above it was abstract, so a reader could only believe or
not. One rule quoted in full, with the two source lines it was drawn from, is
the shortest way to show what a model a PM can read actually looks like.

Five features, not seven. Past five a reader stops ranking and starts skimming,
and the most distinctive item gets the weight of the most generic. Blocks and
AG-UI were one story told twice, so they are one bullet. Git-versioned history
becomes a clause of the gate it belongs to.

AG-UI moves to a badge. "We speak a standard protocol" is a credibility claim,
and a badge is where a project makes one. It costs no space in a list whose job
is to say why a reader should care.

The Deployment section goes. It is operator documentation, and
`packages/server/README.md` has held it since #117. Quick Start's job is to get
something running, and twelve lines about containers and a bare 401 belong
after that, not inside it. One sentence points at the two places that have it.

Quick Start now says what is needed first. A reader could install, create a
workspace, press run, and watch nothing happen, because a skill run is a
`claude` subprocess and the README never mentioned it.

Motivation gains the objection a reader actually has now. The two failure modes
it argued against were the 2024 ones. "Why not point an agent at the repository"
is the current one, and the answer is the thesis: the graph is not an index that
makes retrieval faster, it is where judgement is put so it outlives the
conversation.

A Status section, because a public repository at 0.6.0 that never says where it
stands reads as either abandoned or overclaiming.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The Features list had five bullets and did not contain the one the tagline
sets up. "They drift apart every sprint, and the team ends up arguing about
which one is right" is the problem statement, and nothing below it said Braid
finds the disagreement or names who settles it.

Named Disagreement is new. CoverageState keeps `sourceChanged` and
`conflicted` apart on purpose, because reading a changed source again is
mechanical and a model contradicting its own evidence is not. A DriftIssue
carries at least two references for the same reason: the point is to name
which two things disagree. A person fixes the source or records the
difference as intended. This is the thesis, and it was the missing bullet.

Evidence-Backed Claims said a node traces back to "the file or document it
was drawn from", which is neither the vocabulary (a source) nor the useful
part (the line range). It now says both, and says that a node missing
evidence for a source role the ontology asks for names the gap.

Typed Output led on not being a wall of text, which is the least of it. The
point is that the model fills in a schema instead of choosing a presentation,
so a surface lays the result out, and the audiences an ontology declares
decide how much of a reference each reader sees. AG-UI stays, as the clause
it should always have been.

Docs That Never Drift promised something stronger than the code does. A
document is not regenerated on a graph change, it is marked stale, and the
honest claim is the one worth making: it is projected rather than maintained,
and it cannot go quietly wrong.

Continuous Reaction leaves the list. The reactor is `enabled: false` by
default, so a headline feature overstated it. Architecture still covers it.

The Architecture Model bullet gains the drift clause, so the new feature has
somewhere to land.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Four corrections, all from review.

The reactor should not have left the Features list. Default-off is a
deployment choice, not a statement about whether the feature matters, and
a graph that does not keep up with its sources is a snapshot of the day it
was built. That is the whole premise, so it goes back as its own bullet.

"Documents Regenerated, Not Maintained" named an implementation detail and
sold nothing. The point is the axis: a view kind is a plugin, so a document
is one kind of view rather than the only one there can be, and the next kind
is a plugin rather than a fork. The bullet is now Any Kind of View.

Typed Blocks and AG-UI were two sections for one mechanism, and they sat at
the same heading level as Framework and Architecture, which organise the
section rather than belonging to it. They merge into A Run's Output: a skill
fills in a schema, the surface lays it out, the ontology's audiences decide
how much each reader sees, and AG-UI carries the result. One purpose, one
section.

Reading the Graph is new, and covers what a reader asked for: Ask, views of
whatever kind a generator declares, and the read-only MCP endpoint, which
exchanges each caller's own token so a person's MCP client reads the graph
as them. That endpoint has been serving since #148 and appeared nowhere but
the server package.

Retrieval Alone was unreadable. It now says the plain thing: an agent
pointed at a repository answers the question and answers it again from
scratch next time, because nothing a reviewer concluded is written down
where the next question can reach it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The section duplicated the recording. The gif already shows this workspace,
so a second telling in prose, with an 838KB graph render pushing Motivation
and Design down the page, bought nothing the reader had not just watched.

What was worth keeping is that the example is reachable, so one line sits
under the gif and says what is in it. It names no scene in the recording, so
re-recording against a different workspace does not make it wrong.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
A caption competing with the recording above it is not a caption.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

The README describes the product as it stood before the block protocol

1 participant