Skip to content

Twelve fixes the LOGIC.md pass turned up: three defects, four dead things, five stale claims - #1775

Merged
brillout merged 12 commits into
mainfrom
claude/nice-einstein-g4wfd8
Sep 12, 2026
Merged

Twelve fixes the LOGIC.md pass turned up: three defects, four dead things, five stale claims#1775
brillout merged 12 commits into
mainfrom
claude/nice-einstein-g4wfd8

Conversation

@brillout

Copy link
Copy Markdown
Contributor

Writing a LOGIC.md beside every file meant reading every file, and reading every file turned up things that were wrong. Each is one commit.

Defects

  • An action that succeeds with nothing is not a failure. useAction reported a refusal and a void success alike as undefined. Three call sites worked around it by mapping their success to a stand-in true; the confirm dialog, which had no such wrapper, would have sat open with no message after a successful delete. run now says whether the action succeeded and carries its value, with the refusal branch excluded from that value's type.
  • Escape closes the suggestion menu. Escape over an open /, <, @ or # menu was passed through untouched, so the menu stayed on screen — and since an open menu is what makes Enter pick instead of send, the next Enter picked a suggestion the user thought they had dismissed.
  • A tag is a tag whether it was typed or loaded. Typing <await> produced the <AWAIT> the agent expects; loading a preset carrying the same text left it as prose and sent it lower-case. Both paths now recognize the same set. Tests pin it, which the token catalogue had none of.

Things nothing could reach

  • The preview event. Declared, rendered by the terminal, pinned by a test, emitted by nothing, and hung on a serve config that does not exist.
  • The gate countdown. A gate carried a delay after which the dashboard was to accept the recommended option, the panel took a prop saying whether that may run here, two call sites turned it off, and a mouse-move listener stood by to cancel it. Nothing ever started a countdown. Gone with it: the pick author no surface could produce, so a pick is the user's or nobody's. Whether the dashboard should answer a gate for the user at all is a product question this leaves open rather than half-built.
  • The reference token kind, which no token has ever been.
  • The sidebar_state cookie, written "so it survives a reload" and read by nothing.

Claims that had outlived their code

  • A budget cap. Twenty-odd comments named one as a way an agent ends; the usage event even said the agent stops itself at one. The flag that set it is gone, a test pins that it is gone, the meter only adds up, and MEMORY.md says a running agent is never cut short over spending.
  • The session name as a turn signal, in the emitter's own doc, the backlog loop and a test title — while the same file's header says it is not one.
  • A triage that aborts when its branch exists. The prompts pin a session name and abort on nothing; the guard is the routine lock the daemon takes before starting one.
  • Four smaller ones: a per-agent guard that "exists to pause an agent", one agent at a time per project, a queue parser named after a function that no longer exists, and a design gallery upload nothing performs.
  • The vocabulary in the prose a reader meets first: both package READMEs and the gallery's sample copy still said session, worktree and "Open TODOs".

Checks

pnpm build, pnpm typecheck and pnpm test all run. One test fails in my sandbox and is not this branch's: reclaim.test.ts makes a directory read-only and expects removal to fail, which root ignores — this container runs as root, and the branch touches no file in that package.

Every LOGIC.md describing changed behavior was updated in the same commit, and the coverage and vocabulary lint over all 683 of them reports nothing.

🤖 Generated with Claude Code

https://claude.ai/code/session_01YcSwKgtQE6ndJYjdDitVFB


Generated by Claude Code

useAction reported both a refusal and a success as `undefined`, so a caller
could not tell them apart. Three call sites worked around it by mapping their
void success to a stand-in `true`, and the confirm dialog, which had no such
wrapper, would have sat open with no message after a successful confirm that
resolved to nothing.

`run` now answers whether the action succeeded and carries its value when it
did. The three stand-ins go, the delete confirmation stops rejecting its own
refusal to be heard, and the value keeps its type: the refusal branch is
excluded from it, so a caller reads the success branch's fields directly.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YcSwKgtQE6ndJYjdDitVFB
Escape over an open `/`, `<`, `@` or `#` menu was passed through untouched, so
the menu stayed on screen after the keystroke that means "dismiss this" — and
since an open menu is what makes Enter pick instead of send, the next Enter
picked a suggestion the user thought they had dismissed.

The first Escape now closes the menu and stops there, leaving the trigger armed
but silent until a fresh one opens. With no menu showing, Escape is left alone
and reaches the surface around the editor as before.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YcSwKgtQE6ndJYjdDitVFB
Typing `<await>` into the composer produced the `<AWAIT>` the agent expects,
but loading a preset carrying the same text left it as prose, so it reached the
agent lower-case. The two paths recognized different sets: typing accepted a tag
in any letter case, loading accepted upper-case only.

Loading now recognizes what typing recognizes, and a catalogued tag normalizes
on both paths. Tests pin the rule, which the token catalogue had none of.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YcSwKgtQE6ndJYjdDitVFB
The event vocabulary declared a generated app booted and serving, the terminal
rendered it, and a test pinned that rendering — but nothing in the agent's
lifecycle ever emitted one, and the serve config its doc hung on does not
exist. A word no writer can say is not vocabulary.

The dashboard's own project preview is a different thing and stays.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YcSwKgtQE6ndJYjdDitVFB
A gate carried a delay after which the dashboard was to accept the recommended
option, the panel took a prop saying whether that countdown may run here, two
call sites turned it off, and a mouse-move listener stood by to cancel it. None
of it did anything: nothing ever started a countdown, so the panel always asked,
and the delay was read by no one.

The scaffolding goes, and with it the pick author no surface could produce: a
pick is now the user's or nobody's, the latter being an agent nobody is
watching, which is the daemon's own auto-accept and still very much alive.

Whether the dashboard should answer a gate for the user at all is a product
question, and this leaves it open rather than half-built.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YcSwKgtQE6ndJYjdDitVFB
The prompt editor's tokens declared a `reference` kind, and the stylesheet gave
it a chip color, but no token has ever been one: a mention is a project or a
file, and everything else is a macro or an action.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YcSwKgtQE6ndJYjdDitVFB
Every fold of the sidebar wrote a `sidebar_state` cookie "so it survives a
reload", but nothing ever read it back: the sidebar starts from its default
either way, and the cookie rode along on every request to the daemon for
nothing.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YcSwKgtQE6ndJYjdDitVFB
Twenty-odd comments named a budget cap as a way an agent ends — the usage event
even said the agent stops itself once its cost reaches one. No cap exists: the
flag that set it is gone, a test pins that it is gone, the meter only adds up,
and MEMORY.md says an agent already running is never cut short over spending.
Quota decides what may start, and that is a different thing.

Each mention now names what really ends an agent there: the Stop button, Ctrl-C,
or an answer the user marked stop.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YcSwKgtQE6ndJYjdDitVFB
Two claims had outlived their code. The turn-signal emitter's doc still counted
the session name among what it emits, though the file's own header says the name
is not a signal and the agent names its branch through the branches skill; the
backlog loop and a test title repeated it.

And both the routine rotation and the preset catalog said each triage prompt
aborts when its branch already exists. The prompts pin a session name but abort
on nothing: what keeps a rotation from triaging twice is the routine lock the
daemon takes before starting one, which holds across machines. The rotation's
note about which presets it skips now names them rather than a sibling that is
not a triage.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YcSwKgtQE6ndJYjdDitVFB
- The quota source called itself separate from a per-agent guard that "exists to
  pause an agent"; nothing pauses an agent over quota, and MEMORY.md says so.
- The multi-project read side said the daemon runs one agent at a time per
  project; it runs as many as the project's own concurrency allows.
- The dashboard's queue reader pointed at a parser by a name that no longer
  exists: the drain reads the queue through the queue skill's own parser.
- The design gallery's build said DesignSync uploads its output; nothing in this
  repository uploads anything.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YcSwKgtQE6ndJYjdDitVFB
Its module still explained itself as a hand-flattened copy that departs from a
doc, from before the prompts became markdown compiled into the package; and the
handoff pointed at an `--eco-auto-maintenance` flag that no longer exists,
saying the renderer drops a section for it, which the renderer cannot do.

A test named after settings the template stopped reading now says what it
actually proves: the same session renders the same prompt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YcSwKgtQE6ndJYjdDitVFB
Both package READMEs and the design gallery's sample copy still called an agent
a session and its checkout a worktree, and offered "Open TODOs" for what is the
agent queue. The code and MEMORY.md settled that vocabulary a while ago; the
prose that a reader meets first had not followed.

The session name keeps its name: it is the name an agent gives its own work.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YcSwKgtQE6ndJYjdDitVFB
@brillout

Copy link
Copy Markdown
Contributor Author

@suleimansh Good? I didn't review any of it (it's a list of issues Claude found while installing LDD).

@suleimansh

Copy link
Copy Markdown
Contributor

Seems good to me. The fixes were checked by my agent, commit by commit, they are real. The full test suite passes on my machine on this branch (1378 + 870 tests, the reclaim test included).

I didn't read all of the LOGIC files, I read only a few lines to check if they are easy to understand, and yes they are. Some files have very long texts, we can improve later.

@brillout
brillout merged commit 6facc28 into main Sep 12, 2026
2 checks passed
@brillout
brillout deleted the claude/nice-einstein-g4wfd8 branch September 12, 2026 19:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants