
Recursive content: one block, many articles
How miscsubjects articles reuse stable blocks, propagate edits, bind comments to versions, and expose the same controls to humans and models.
A recursive content block is one addressable unit of article prose. Every block has one stable identity. An article is an ordered list of references to those blocks. If the same block belongs in two articles, both articles point to it; neither receives a copy. Change the block once and every reference renders the new version.
That is recursive content on miscsubjects. It is the difference between prose that merely looks divided and prose that can actually be reused, criticized, revised, and traced at the point where the work happens.
How recursive content works
The unit is smaller than the article
An article remains the page a reader opens, but it is no longer the smallest addressable object. Each heading, paragraph, list, quotation, or code passage can be a block with an ID beginning rb_. The ID is created once and does not change when the words change. A block also carries a current version number, a content hash, its full version history, and the list of articles that reference it.
The article keeps an order for its references and the exact whitespace after each one. That last detail matters. Existing articles were not rewritten to fit the system. The wrapper separates the stored body into blocks and preserves every byte when it composes them again. A paragraph break, a run of three blank lines, and a final newline all survive the conversion.
Reuse is a reference, never a copy
The block picker searches the whole corpus by words or by an rb_ ID. Choosing “Insert reference” places the existing block into the current article. The system does not merge passages because they look similar. Similarity can help a person find a candidate, but only an explicit choice creates reuse.
A shared edit has an intentionally visible blast radius. Before saving, the control shows how many references the block has. The write uses the hash of the version the editor read. If another editor changed the block first, the stale write is refused and the current version is returned. When the write succeeds, the block version advances and every affected article body is regenerated in the same database batch.
This makes reuse honest. Two pages that make the same point can literally share the same object. They cannot drift silently because one copy was corrected and another was forgotten.
Criticism stays attached to what it criticized
A comment targets a block, not a vague region of an article. The stored comment records the block ID, version number, and content hash present when the comment was filed. Later edits do not move the criticism onto different words. A reader can open the history and see the criticized version beside the newer one.
This changes the scale of review. A model can object to one number, one causal step, or one instruction without treating the whole article as wrong. A human can answer or edit the same object. The record says which authority acted and which version it saw.
Identity and authority are separate. A caller may supply a display name, but the system derives the acting identity from the signed owner session or scoped token. There is no reputation score, points table, or invented economy. Tokens sign who may perform a verb; they do not pretend to measure the worth of a contributor.
Structural verbs have narrow meanings
Edit changes the canonical words and propagates them to every reference. Move changes only the position of a reference inside one article. Split keeps the left block’s identity, creates a new identity for the right side, and preserves the original bytes. Detach creates a private copy for one article so future edits stop propagating across that boundary.
Retire removes the selected reference. If no references remain, the block is marked retired, but its words, versions, comments, and events remain readable. Nothing in this system uses deletion as a substitute for history.
Search and Insert reference are the reuse verbs. History shows every version and every current reference. Comment binds criticism to the exact version on screen. These are the same verbs whether the caller is the signed-in owner clicking the page or a model using the machine endpoint.
The article page is the editor
A signed-in owner edits the ordinary article page. Click Edit page above the prose; there is no trip to the backend article form. The page outlines its addressable blocks and prints the instruction in place: click a block to edit it inline, or select text to make a block.
Selecting exact visible words opens a tray containing the selection and a Make block button. Saving that boundary replaces the selected article reference with byte-preserving prefix, selection, and suffix blocks. The article reads exactly as it did before, but the selected words now have their own stable rb_ identity. If the source block was reused elsewhere, the other article keeps its original reference; a boundary chosen in one article does not silently restructure another.
Click a block in edit mode to open its controls beside the prose. Edit block replaces that rendered block with an inline editor and Save inline edit. The same bar exposes Comment, History, Positive, Negative, Propose edit, Propose delete, Move up, Move down, Split, Reuse, Detach, Retire, and Suggestions. Shared edits state their reference count because saving changes every article that points to the block. Every successful mutation clears the page’s edge copy and last-good snapshot before the browser reloads fresh state.
Any web model can collaborate without a login
Reading is complete and valid by itself. If a model’s operator asked it to help edit an article, the model can read the public graph and file comments or proposals without minting a credential. The public procedure is printed in the footer of every article and at /api/blocks/procedure/recursive-content.
GET /api/blocks/article/<slug>returns the ordered blocks, stable IDs, versions, hashes, reference counts, and human URLs.POST /api/blocks/commentattaches a comment to the exact block version and hash.POST /api/blocks/verdictrecords Positive, Negative, Propose edit, or Propose delete against that exact version.POST /api/blocks/suggestfiles an isolate, move, edit, delete, reuse, or split proposal. The payload carries the proposed boundary, destination, replacement text, or order change.GET /api/blocks/block/<rb_id>/proposalsreturns the pending and decided proposals for one block.
Public collaboration never grants a crawler mutation authority. A keyless model can propose an exact DIV boundary, but it cannot rewrite the article. The signed-in owner opens Suggestions on that block and clicks Apply suggestion or Reject. Applying runs the same stale-hash checks and narrow block verbs as a direct owner edit; rejecting records the decision without changing the prose. This is the collaboration boundary: every model can contribute useful, precisely targeted editorial work, while random web traffic cannot destroy the corpus.
A model explicitly authorized by its operator can use an act token or a token scoped to the BLOCK_* verb family to perform the same direct mutations as the owner. The display name is metadata; the signed token is the authority. Public proposal fingerprints are anonymous hashes of transport context, never stored IP addresses.
The footer explanation is server-injected and permanently visible. It links the current graph, corpus search, history, proposal lane, and direct-mutation authority. JavaScript adds the live controls and maps the rendered prose to canonical block identities, including newly isolated blocks inside a paragraph.
The current graph is at /api/blocks/article/recursive-content. Global search is at /api/blocks/search?q=stable. A block’s versions, comments, verdicts, references, and proposals are at /api/blocks/block/<rb_id>/history.
Older and future articles enter the same graph
The corpus backfill calls the guarded wrapping API in batches. It does not write the new tables directly. Articles that already carried local DIVs use those boundaries when they reproduce the body exactly; everything else uses lossless paragraph boundaries. Imported IDs are deterministic from the original article, local position, and original content, so repeating a wrap does not manufacture a new identity.
A whole-body replacement is treated as a new document shape and is wrapped again. Block-native edits use the block service and preserve shared references. The rendered article body remains as a compatibility projection for existing readers, feeds, search, and older tools. The block graph is the canonical object for block-level work.
The result is usable prose with inspectable structure. The article remains readable as an article. Each point can also be found, reused, challenged, changed, detached, moved, or retired without pretending the rest of the page moved with it.