Skip to main content

Writing here

Everything on this page works in any .md or .mdx file under blog/ or notebook/ with no imports. It doubles as the proof sheet: what you see below is what the components look like.

Where a piece goes

Lives inURLOrdered by
Dated piece — a note, an essay, a session logblog/YYYY-MM-DD-slug.md/writing/slugDate, newest first
Living page — revised in placenotebook/project/page.md/notebook/project/pageSidebar position

The rule of thumb: if the date is part of what the piece means, it is writing. If a reader six months from now should see the current version rather than the original, it belongs in the notebook.

Front matter

Dated pieces:

---
title: "Watching a claim get smaller"
slug: watching-a-claim-get-smaller
authors: [saif]
tags: [lab-notes, knowledge-editing]
date: 2026-09-10
standfirst: >
One sentence under the title saying what the piece argues.
status: provisional # draft | provisional | standing | superseded
revised: 2026-09-24 # only if it differs from date
project: edit-slice
---

standfirst, status, revised, and project are optional; each one adds a row to the front matter block at the top of the article. Everything after <!-- truncate --> is hidden from the index.

Notebook pages take title, sidebar_label, sidebar_position, and description. They show a "last edited" line taken from git, so revising a page is recorded without you maintaining a date by hand.

Figures

Numbering is a CSS counter, so figures renumber themselves when you move them.

<Figure
src="/img/edit-slice/orphan-diagram.svg"
alt="An edited fact with its grounds left pointing at the old value"
caption="Argument order swaps the edited triple. Justification order asks about the facts that were premises for it."
wide
/>
Argument orderJustification order(Eiffel, in, Rome)(Rome, contains, Eiffel)(Eiffel, in, Rome)(Eiffel, built-for, Expo 1889)
The two orders, side by side.

Put images in static/img/<project>/. A path of /img/edit-slice/x.svg resolves correctly in development and on the deployed site.

Claims

The claim block is the one loud element on the site. It shows what was given up above what still stands, so a narrowing is visible rather than described.

<Claim
superseded="Everyone probes forward from an edit; nobody probes backward."
record={{
Confidence: "Medium",
Revised: "10 September 2026",
}}
>
Argument-order inversion is covered. Justification order is not.
</Claim>

Use it once per page at most. Its force comes from being rare.

Status marks

Draft — actively being written
Provisional — may turn out to be wrong
Standing — survived review so far
Superseded — kept for the record
<Status kind="provisional" />
<Status kind="standing">Survived Arnab's review</Status>

For a whole page that is not finished, use the banner form:

This page is scaffolding. The numbers in it are placeholders from a dry run and should not be cited.

Margin notes

Asides carry the qualification that would derail a sentence. They are not footnotes — a footnote is for a citation or an aside a reader can skip entirely, and this site has those too.1

Mathematics

Inline math is written $\mathrm{IIA}$, which renders as IIA\mathrm{IIA}. Display math takes $$:

Δgrounds(e)=1G(e)gG(e)1 ⁣[y^(g)y(g)]\Delta_{\text{grounds}}(e) = \frac{1}{|G(e)|} \sum_{g \in G(e)} \mathbb{1}\!\left[\, \hat{y}(g) \neq y(g) \,\right]

KaTeX renders at build time, so equations cost nothing at page load and are selectable as text.

Citing papers

Papers live once, in data/papers.yml, keyed by a citation id:

cohen2024ripple:
title: Evaluating the Ripple Effects of Knowledge Editing in Language Models
authors: Cohen, R., Biran, E., Yoran, O., Globerson, A., Geva, M.
year: 2024
venue: TACL
url: https://arxiv.org/abs/2307.12976
status: read # read | skimmed | to-read
relevance: high # to my current work
verified: true # have I checked the venue against the paper?
projects: [edit-slice]
gives_me: The definition of Logical Generalization that narrowed my claim.

Cite it inline by id — (Cohen et al., 2024) — and it links to the paper with the full title on hover:

The obvious place for it to break is RippleEdits <Cite id="cohen2024ripple" />.
As <Cite id="hase2023localization" narrative /> shows, localisation is not
editability.

narrative gives the "Hase et al. (2023)" form for when the authors are the subject of the sentence rather than a parenthetical.

The verified flag is the point of the whole thing. It records whether the title, authors, year and venue have been checked against the paper's own record. An unverified entry renders with a dotted oxide underline, and /reading lists those in a separate table as not citable yet. This exists because a note of mine described RippleEdits as EMNLP 2023 for months; it is TACL 2024. Secondhand notes decay silently, and an unmarked wrong venue survives every draft.

It is deliberately independent of status: a citation can be trustworthy for a paper I have not read, which is the normal case for something on the to-read list. Everything in the list is currently checked, so that second table is empty — it reappears the moment a secondhand entry is added.

An id with no entry shows up as [nonexistent?] rather than failing the build, so a half-written draft still renders.

A reference list at the end of a piece pulls from the same file:

<References ids={["cohen2024ripple", "meng2022rome", "meng2023memit"]} />

Use items={[…]} instead for a one-off that does not belong in the reading list.

Interactive pages

A standalone HTML page — plain HTML, CSS and JS, with its own interactions — embeds as a live page rather than a screenshot. It shares numbering with <Figure>, so a diagram and a demo are both "Figure n".

<Embed
src="https://your-page.netlify.app/"
title="Belief revision explorer"
caption="Contraction and expansion applied to the same belief set."
ratio={16 / 10}
/>

Two ways to point at one:

Hosted elsewhere. Pass the full URL — a Netlify deploy, a GitHub Pages site, anything served over HTTPS. Nothing to copy, and the page keeps updating when you redeploy it. The one requirement is that the host does not send X-Frame-Options: DENY; Netlify does not by default, so this works out of the box.

Served from this site. Add the file to data/built.yml:

- name: belief-revision
title: The Belief Problem
from: mind/belief-revision.html
topic: Mind
what: >
What it takes to give up a belief, and why removing one is harder
than adding one.

npm run sync:demos copies it to static/demos/belief-revision/index.html, which happens automatically on npm start and npm run build. The entry also becomes a card on Built with a live preview. Then embed the path anywhere you want it in prose:

<Embed src="/demos/belief-revision/" title="Belief revision explorer" />

Paths in data/built.yml are relative to the repository root, and a directory source is copied whole, so a page with sibling CSS, JS or data files works the same way. Use url: instead of from: for a page deployed elsewhere and it appears on Built the same way, marked with its host. Same-origin is the reason to prefer this route: the page can read files next to it, and there is no third party to go down.

Either way the embed is sandboxed — scripts and forms run, top-level navigation does not — and every embed carries a link to open the page on its own, because an iframe on a phone is a poor place to use an interactive diagram.

Use a fixed height instead of ratio for a page that does not reflow:

<Embed src="/demos/one-crate/" title="One crate" height={620} />

The data files

Three files hold everything that appears on more than one page, so nothing is described twice:

FileFeeds
data/papers.yml<Cite>, <References ids>, Reading, the home page tally
data/built.ymlnpm run sync:demos, Built, the home page list
data/projects.yml<Projects>, the home page, Notebook
blog front matterWriting, the home page list

Adding a paper or a page means editing one file. The home page has no hand-maintained lists.

projects.yml is the thinnest of the four — a path to each project's plan.md, a link, and which status dot to use:

- name: edit-slice
plan: ai/edit-slice/plan.md
notebook: /notebook/edit-slice/
tone: draft # draft | provisional | standing

The words come from the plan itself: the ## Objective paragraph, trimmed to whole sentences, and the ## Current Phase line, shortened to its label with the rest as hover text. So the way to change what this site says about a project is to edit that project's plan, which is the file you were going to update anyway.

<Projects />
<Projects showUpdated />

Syncing from a project

Notebook pages are ordinary files, so a project under ~/code/open-concept-lab/ai/<project>/ can keep its own notes and have the page here written from them. What works in practice is to keep the page shorter than the notes: the notes are the record, the page is the argument. Copying notes verbatim produces a page nobody reads, including you.

References

  1. Cohen, R., Biran, E., Yoran, O., Globerson, A., Geva, M (2024). Evaluating the Ripple Effects of Knowledge Editing in Language Models. TACL 12.
  2. Meng, K., Bau, D., Andonian, A., Belinkov, Y (2022). Locating and Editing Factual Associations in GPT. NeurIPS.

Footnotes

  1. Footnotes are plain Markdown: [^1] in the text, [^1]: the note at the bottom of the file. They collect themselves into a block at the end.