BaseHalf
All posts

A moved file is recognized by its content

Rename or move a file in BaseHalf, Finder, git, or an agent session, even while BaseHalf is closed. It matches the file at the new path by content and updates every upstream entry that named it, without asking.

You rename research/interviews.md to research/interview-notes.md. Other notes already list that file as upstream. If those paths stayed frozen, every connection would break the moment a file changed names.

When BaseHalf can still see the same file at a new path, it updates the entries that named it. It does that without asking, and it does not matter who performed the move.

How recognition works

An item keeps its card whoever moves or renames it: you, an agent, Finder, or git. It also works while BaseHalf is closed. When the folder is open again, BaseHalf matches the item at its new path by its content. It moves what it keeps for that item, and it rewrites every upstream entry that named the old path.

No extra command is required. Agents rename and move files with their own tools. The working with agents docs say the same: BaseHalf follows the content, wherever the agent runs.

A renamed card keeps its place on the canvas. A card moved into another folder goes after the last card already there.

Cards on a BaseHalf canvas with upstream connections drawn between them.

When the lists update, and when they stay broken

The automatic rewrite is for a move or rename that BaseHalf can recognize. A delete is different. Deleting an item never changes another item's list. The entries that named it stay, now broken, until you Relink, Relink Everywhere, or Remove them.

Recognition also fails in a few documented cases.

What happenedWhat BaseHalf does
Rename or move, and the content still matchesRecognize the file, move what it keeps, and update every entry that named it
The file was also rewritten by more than halfNot recognized; entries that named it show as broken
An empty fileNot recognized
A folder with no filesNot recognized
A deleteOther lists are left alone; their entries become broken
A draft, which has no file yetMoves only inside BaseHalf

Broken entries stay visible on purpose. Fix a broken upstream path covers Relink, Relink Everywhere, Remove, and BaseHalf: Show Upstream Issues. Use that pass when recognition could not follow the file.

Why content, not only the path

Upstream lists are plain text paths, relative to the workspace folder. They live in Markdown frontmatter or in .bh/mirror/<path>/upstream.yaml. A path is what git diffs and what an agent reads. If the only identifier were that string, a rename would always look like a delete plus a new file.

Matching by content lets the path catch up when the file is still the same file. The next Claude Code or Codex session opens a note and sees the updated list. You do not paste the new path into every downstream file by hand.

This is the other half of storing a connection like an import. A connection is stored like an import explains where the list is written. This page is about what happens to those paths when the imported file moves.

Limits worth planning for

A large rewrite bundled with a move looks like a different file. If an agent rewrites most of a note and also renames it in the same step, the old path may go red. Relink the entry, or split the work: rename first, then edit, so content recognition has a chance.

Empty files and empty folders have no content to match. Give them some content before you rely on automatic updates, or expect to Relink.

Drafts have no file on disk, so Finder and git cannot move them. Move those cards inside BaseHalf.

The connections docs list what recognition does and does not cover. After a messy refactor, run BaseHalf: Show Upstream Issues and commit the lists that changed.