Skip to content

chat: one list of twenty-two tips, said two ways — home rotates, a conversation ranks - #1389

Open
ZeroPoint95 wants to merge 36 commits into
devfrom
claude/home-hints
Open

ZeroPoint95 wants to merge 36 commits into
devfrom
claude/home-hints

Conversation

@ZeroPoint95

@ZeroPoint95 ZeroPoint95 commented Sep 23, 2026

Copy link
Copy Markdown
Contributor

One list of tips, two boxes, two rules. Home rotates through them; a conversation ranks them. All are eventually retired.

Every tip retires eventually - even if not used - after 6 showings in rotation.
Users also have the option to disable hints altogether:

settings > workspace > disable hints
  1. rm ~/.codeaf/notices.json — wipes your ledger so every tip is new again
  2. Launch bin/codeaf. The dim line above the rule on home, with a bulb and a cross, is the tip row
  3. Press space twice in an empty box to go home, and again from the next conversation — a different tip each time
  4. Open a conversation and empty the box. The tip is the lowest rung of the keys row at the foot

note - this branch includes: #1388 (space space and ? ask/+ new revival)

The twenty-two tips

One table, both boxes. Row 13 is the only home-only row. "always" means from the first minute on home, and after the first exchange in a conversation.

# Tip Appears Retires
1 /compact summarizes the conversation now window crosses half /compact finishes
2 /cost says what this conversation has spent about ten cents spent /cost answered
3 esc esc or /rewind takes back an earlier message after a long answer either door lands a rewind
4 /files finds files codeaf wrote for you after the first export /files reached for
5 /resume opens an earlier conversation directory has an earlier one /resume reached for
6 /standing turns a message into a rule work must follow three or more earlier conversations standing page or order
7 /task starts a single-shot task on the side after one exchange /task typed
8 ctrl+enter makes your message a rule instead of a request always standing page or order
9 /manual answers any question about codeaf always /manual reached for
10 ctrl+shift+t reopens the last conversation tab always a tab is reopened
11 type @ to find paths in the current project always the @ list opens
12 /attach sends a file or folder with your message always anything attached
13 /project sets the project folder for a new conversation home only /project reaches a folder
14 /export writes the current conversation to a file two turns in an export lands
15 /model lets you see and choose models and providers always the model list opens
16 /crew sets the models codeaf uses on its own behalf always /crew answered
17 /budget sets the spending cap for the day always /budget answered
18 using enter steers conversations · use ctrl+q to queue messages after one exchange a message is queued
19 ctrl+t starts a fresh chat in this project always a new chat is started
20 /remember carries a fact forward, /forget drops it always /remember runs
21 /connect links Notion, Slack and other services always connect panel opens
22 /autonomy sets how questions are handled while you are away after one exchange /autonomy reached for

Rows 6 and 8 teach the same door and retire together: use /standing once and both go.

Added

  • Home has a tip row, above the rule over its box, with a bulb and a cross. It never drew one before
  • /project, home only. With a path it pins and opens nothing; bare, it opens the browser
  • @ on home — files and folders, ranked as you type, enter puts the path in. esc peels the list, then the box, then the screen
  • /attach takes a folder, not just a file. Bare on home it opens the browser

Changed — commands

  • /folder means one thing everywhere: a folder the conversation is about. It never moves the working directory
  • /manual is a turn — the question goes to the model. codeaf manual still prints the pages
  • /project with a path says nothing now. Its confirmation was drawn in the refusal slot, which hides home's keys row until the next keystroke — and those keys already end with project: <path>. Both refusals still speak
  • Enter on /attach in the command list opens the browser at once

Changed — other

  • A conversation ranks, home rotates. First eligible row wins the foot, with a two-turn gap; home's row moves on every visit and every two minutes
  • One ledger, no priority column. Every row draws on both boxes, and a gesture on either retires it on both
  • The cross blanks home's row until you leave home. The tip put away costs nothing
  • A showing is twenty seconds on home, one session in a conversation. Six retire a tip
  • The project sits at the right of the keys row, on both boxes, cut on the right when the keys need the room
  • Eight tip rows were rewritten in the owner's words, ids and retiring gestures untouched, so nobody is told twice

Renamed

  • disable hints on the Workspace tab, off by default. The stored key keeps its bytes as ui.hints; internal/config inverts once

Removed

  • /image/attach already tells a picture by its name
  • Nine tips, and every feature they named still works. ctrl+., alt+1alt+7, /search, /subharness: the foot and the / list already name them. ctrl+b's came off while copy mode stayed. /ask's came off first, then Restore double-space Home navigation and ask-here choices #1388 removed /ask. /folder's was untrue. The second /attach row was one too many

Fixed

  • /folder picks the folder codeaf works in was false. It never did
  • The @ tip promised a list home did not have
  • Quoted and escaped paths answered no such file
  • Bare /attach on home said type the path after /attach
  • Opening the context sheet retired both /attach tips
  • Stepping through home spent the whole table in flashes nobody read. A ledger written under that rule is forgiven once
  • The cross re-showed the same tip, a showing poorer
  • Five manual passages taught a home door that had moved

Internal

Proof

  • make pr-ready — the laws and the light gate, then fresh config, manual, e2e and tui3
  • Built and run by the owner at each step of the wave

internal/provider's TestTheWarmTranscriptEncodeCostsTheSameAtEightyTurnsAsAtEight/breakpoints is red on dev too, imports nothing this branch changes, and is outside the touched set.


🤖 Generated with Claude Code

ZeroPoint95 and others added 30 commits September 21, 2026 19:35
The surface stopped treating two spaces over an empty box as the home door on
2026-09-17 (TestDoubleSpaceNoLongerNavigates pins it, and home's tests press
esc), but five passages across keys, home, places and running-on-another-machine
still taught the old gesture. They now say esc, and the places section over
--host keeps the old words in its heading so the question still finds it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…oxes

Home never drew an earned tip: the picker refused the page outright and its
gap was measured in turns home does not have. The blank directly above the
rule over home's box is now the tip row — drawn only over an idle box with no
list, layer or exchange up, one cell in, dim, in the key-then-what-it-does
grammar the conversation's foot keeps.

The table is one table for both boxes. Each hint row says where it may draw
(the conversation's foot, home's row, or both), retirement is shared through
the same notices.json ledger, and the surface refuses to build on a note row
that names a box or a row filed under home's slot. Twenty-three lines join
the seven that were here, each retired by a real seam: /ask and alt+enter,
/task, ctrl+enter, ctrl+r, the @ list, /attach and /image, /folder, /export,
the model list, /crew, /budget, the spend and search places, steering and
ctrl+q, ctrl+t, alt+1..7, /remember, /subharness, /connect, and a media call
beginning. `/ shows every command` retires: both feet say `/ commands`.

Home rotates rather than ranks: every eligible tip has its turn in table
order, moving on every visit and every two minutes at rest on the beat home
already runs, and a tip that has come round six times is taken as read. A
board test pins the ring, a lab test pins the row over the frame, and a new
gate holds the hints page to every line in the table word for word.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…he project moves to the keys row

The owner's placing (2026-09-22). Home's tip row is right-aligned to end one
cell in from the edge, led by a bulb and closed by a cross a pointer can
press: the cross puts the tip away until the next visit to home or the row's
own two-minute turn, and writes nothing down, because a tip put away is not a
tip learned. The bulb is an emoji by the owner's word, against the
vocabulary's own no-emoji-in-chrome law, and hometip.go says so where it is
spelled.

The project left home's rule for the right end of the keys row under the box,
right-justified. The keys keep their room: a long path is cut on the right,
one ellipsis, and goes entirely where the keys leave it less than a word. It
is still the door onto the folder chooser, and the pointer and the hover read
its columns off the row it was drawn on. A conversation's seam still names its
workspace at the right.

The row that silences the tips is `disable hints` on the Workspace tab, off
by default. The key underneath is still ui.hints meaning shown — a persisted
identifier keeps its bytes — and internal/config inverts once, on the way in
and out, so the panel and `codeaf config` say the same word.

The manual's home, places, keys, asking-from-home, choosing-a-folder and
commands pages stop drawing the project on the rule, and the hints page
describes the bulb, the cross and the new row.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…are, /image is gone, two tips swapped

Reviewing the tips against the surface turned up four bugs, all fixed here.

The @ list on home. Home's box never opened the completion every
conversation's box has; the hint promised it. homeat.go binds the same
completion to home's box, drawn as rows of home's column like the slash
list, walking the folder the next conversation opens in, offering files and
folders and never tasks. Enter puts the path in after the @, a picture comes
out of the sentence and onto home's tray, esc closes the list, and the
command list wins when both could open.

A quoted or escaped path. /attach '/Users/me/Screenshot 2026-09-18 at
1.35.20 PM.png' — the shape Finder and a terminal drop hand you — answered
`no such file`. resolvePath now reads a path the way the shell it was copied
from would: matching quotes come off, a backslash before a space is the
space, and anything else is left as typed.

/attach bare on home opens the browser aimed at the next conversation's
folder, as a bare /folder does, and a file chosen there lands on home's tray;
it used to say `type the path after /attach`.

/image is gone. It was a second word for /attach that took only a picture
and refused everything else; /attach already told a picture from a file by
its name. The command table, the dispatch, home's gate and the path
completion's argument list no longer know the word, and typing it is
answered as every unknown word is.

Two tips changed. `alt+enter sends what you typed off as a task` is cut: on
home the chord asks rather than sending a task. `ctrl+r spells out …` is
cut: the chord works only in a conversation and only over a making-shaped
sentence, so on home it named a key that did nothing. `/manual answers any
question about codeaf from its own manual` and `ctrl+shift+t reopens the tab
you just closed` take the seats, each retired by its own seam, and the table
stays at thirty.

Eight manual pages stop naming /image and describe the list on home, the
quoted-path rule and the bare /attach browser.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…quiet minute, the project on both keys rows, /attach opens the browser from the list, search by name with memory off

The tip table is one set now: every hint draws over home's box and a
conversation's, in the table's order, round and round, and a tip that has
just become true jumps the ring. The priority numbers, the per-row place
and the conversation's turn gap are gone. A showing is a visible change of
hands on either row, six of them retire a tip.

A conversation says its tips the way home does — the row over the rule,
right-aligned, bulb and cross — but only after a minute with no key
pressed and no turn ending, on one self-sustaining clock started at Init;
a key hides it again. The keys row no longer carries a tip.

The project came off both seams to the right end of the keys row under
the box, cut on the right where the keys leave it no room, and it is the
folder door there in a conversation as it is on home.

Enter on /attach in the command list opens the browser at once, the way
/folder does: the bare row is its own row, the <path> row stays for a
typed path. A path with a raw apostrophe in its name is no longer read as
a shell quote.

With memory off the search place matches conversations by name and
project, the way home's box does, and says so, instead of refusing.

The picture-and-media tip gave its seat to ctrl+b copy mode. The manual
follows on every point, with four new probes.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…s home too, the reopen-tab tip names the conversation tab

/manual used to print the manual's pages as written, with no model call, and on
home that note landed in the conversation behind the screen — typing it looked
like nothing happening. It is a turn now: the words go to the model told to
answer from the manual tool and to name the page, the transcript keeps what
was typed, and on home a conversation opens at the target first. The
as-written reading stays at the terminal's `codeaf manual`.

ctrl+b on home was the emacs left while the merged tip list promised a freeze
there. Home freezes its own rows now the way a room does, the keys row names
the reader's keys, a tip never draws over it, and esc gives home back as it
was.

The ctrl+shift+t tip reads "reopens the last closed conversation tab".

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…es what the old count spent, ctrl+b leaves home, /autonomy takes the copy tip's seat

Every visible change of hands counted as a showing, and every road home is
one: an afternoon of stepping through home spent all thirty tips in flashes
nobody read, and the owner's row went blank. A showing is now a tip that
stood twenty seconds on a row somebody could see, counted when it leaves.
The ledger carries a rule number, and a ledger from the old rule is read once
with the rows that rule spent forgiven, keeping retired the ones a gesture
retired.

The home freeze from the previous commit goes back out: ctrl+b on home is the
caret key again, and the tip that taught the freeze gives its seat to
/autonomy.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The frozen viewport with v, a and y, its status word, its keys row, the
/copy command and every gate the surface kept on it are removed, on the
owner's judgement that it was no use beside the drag. The clipboard wire
stays: ctrl+s hands the pointer over, the sweep copies on release, and
both leave through OSC 52 (copymode.go becomes clipboard.go). ctrl+b is
bound to nothing in a conversation and stays the caret's left on home.
The keys, commands, screen, tasks, sessions, home and what-i-can-do pages
say so, and three probes reach them.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The cross on a tip row meant "put this away" and did two things nobody
asked for: it counted the standing as a showing, and it left the row
blank until the slot next changed hands — so on home the same tip was
back on the next visit with one of its six showings gone. It now means
NOT THIS ONE: the row rotates to the next tip on the very next frame,
and the tip put away is charged nothing and comes round again. Only
with one eligible tip left does the row go blank, as it always did.

/folder meant two different things depending on which screen it was
typed on: give THIS conversation a folder, or pin the folder the NEXT
conversation opens in. The pin is /project now, home's alone —
`/project <path>` takes the path and opens nothing, a bare /project
opens the browser aimed at the target, and in a conversation it says
which screen it lives on. /folder means one thing everywhere, so on
home it opens a conversation first like /files and /compact.

Also: every door onto the context sheet fires its own notice event
rather than the sheet deciding off the folder-door flag, which used to
retire both /attach tips when somebody opened the sheet to pick a
project.

The table is thirty-one hints: /project's is armed on home alone.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The owner's ruling: "do not show another hint until the user comes back
to the home tab after leaving it". The cross answered with a second
sentence on the very screen somebody had just asked it to stop talking
on, which is the surface arguing.

A crossed row now draws nothing at all, and ONE thing lifts it: the row
going out of view. On home that is leaving home — the cross is lifted in
dropHome, so it holds for the whole of the visit it was pressed on, and
coming back brings a different tip. In a conversation it is the next key
taking the row away and the next quiet minute returning it. Neither the
two-minute beat nor an event re-deciding the slot lifts it any more;
those were the two roads a tip came back on.

The tip put away still keeps its whole allowance: the standing is thrown
away rather than counted, and the slot is asked to advance so the row
that comes back is a different one.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Nine changes, all the owner's:

- `@ completes a file, a folder or a task into your message` becomes
  `type @ to quickly attach files in the current project`
- `/attach takes a picture too, or paste a screenshot in` becomes
  `/attach lets browse anywhere for files`
- `/export writes this whole conversation to a file` becomes
  `/export writes the current conversation to a file`
- `/budget caps what today may cost` becomes
  `/budget sets the spending cap for the day`
- `/connect links Google, Slack or another model service` becomes
  `/connect links Notion, Slack and other services`
- the steer row and the queue row become one, retired by the queue:
  `using enter stops and steers conversations, use ctrl+q to queue`
- `alt+3`, `alt+1`–`alt+7`, `/search` and `/subharness` come off the
  list altogether — four doors the tab bar and the `/` list already put
  in front of somebody, which is the argument that kept `alt+p` and `/`
  off it in the first place

Thirty-one rows become twenty-six. The five respelled rows KEEP their
ids, because the gesture each teaches has not changed and a new id would
say the tip again to everybody who has already retired it; the folded
row takes a new id, `steer-and-queue`, because somebody who retired one
of the pair has not been told the other half.

The events behind the four cut rows stay: nothing retires on them now,
which is already true of `task-started`, and they are what an arming
rule reads.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The line went in as `/attach lets browse anywhere for files` and was
missing its "you". Same id, same gesture, one word.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…me off

The owner's read, item by item:

- `/ask answers right here without opening a conversation` comes off
  ahead of the door it teaches. The command is untouched.
- `/folder picks the folder codeaf works in` comes off because it was
  NOT TRUE. /folder never moves the directory codeaf stands in — that is
  fixed for the life of a conversation — it registers a directory the
  conversation is ABOUT, which is what a folder after /attach already
  does, through the same seam. The command, and /place and /dir with it,
  is untouched.
- `/attach sends a file along with your message` becomes
  `/attach sends a file or folder with your message`, which is what that
  command has done since the folder branch landed.
- `/attach lets you browse anywhere for files` comes off: one command,
  one row.
- `/project sets the folder the next conversation opens in` becomes
  `/project sets the project folder for the next conversation`.
- the steer-and-queue row becomes
  `using enter steers conversations · use ctrl+q to queue` — the owner
  wrote it with a hyphen, and a hyphen is not what joins two clauses on
  this surface.
- `ctrl+t starts a fresh chat in this folder` becomes
  `ctrl+t starts a fresh chat in this project`.

Twenty-six rows become twenty-three, and /project is the only row armed
on home alone now that /ask's has gone. The five ids that only changed
their words keep those ids; nothing is reused.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…anism

The owner's ruling: put the conversation's hints back where they were and
trigger them the way they were triggered, keeping the new content. So the
two boxes diverge again, deliberately — a conversation is a screen you
sit in and home is a screen you pass through, and the tip worth saying
differs.

A CONVERSATION, as it was before this wave:

- the tip is the LOWEST RUNG OF THE KEYS ROW at the foot, under every
  state's own keys, taking the slot from the rest state
- it is decided by the events that prove what is happening, ranked by the
  table's own order — the first eligible row wins, and the table's order
  is what the old per-row `priority` column said in numbers
- the slot changes hands slowly: a different line may take it only once
  `noticeGap` turns have passed, so three tips arming in three turns are
  read one at a time
- a showing is one SESSION, counted when the slot takes the tip
- no clock, no quiet minute, no rotation, no cross

HOME keeps everything this wave gave it: the row over the rule, the bulb
and the cross, the rotation on every visit and every two minutes, and a
showing that is twenty seconds of standing where it could be seen.

So `pick` forks into `rank` (the conversation) and `rotate` (home), and
`take` counts on arrival for one and on departure for the other. Gone
with the conversation's clock: hintTickMsg, noticeArmIdle, noticeIdleBeat,
noticeTouched, chatHintIdle, the board's touched/due/idleArmed/idleGen,
chromeTip and tipClosePress.

One list still feeds both, so a row armed only on home — /project — is
simply never a candidate in a conversation, and using a gesture on either
box retires its tip on both.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`from its own manual` was the interesting half to whoever wrote the row
and the uninteresting half to whoever reads it: somebody who has not
used /manual wants to know they can ask, not where the answer comes
from. Same id, same gesture.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`type @ to quickly attach files in the current project` named the wrong
half of what the list does: it completes a file, a folder or a task INTO
the sentence being written, and attaching is /attach's job on the tray.
`find paths` is what a person is actually doing when they reach for it.
Same id, same gesture.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Both rows said "keeps", which taught a person that the two commands were
one thing in two spellings:

  /standing keeps something always true
  /remember keeps one thing across conversations

They are not. A standing order is a CONDITION the work has to honour — it
rides into a task's brief under its own heading, and the worker reports
when it cannot meet one. A memory is a fact carried forward as context,
binding nothing. So the two rows now say which is which, and the memory
one names the way back out:

  /standing turns a sentence into a rule work must follow
  /remember carries a fact forward, /forget drops it

Same ids, same gestures.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The owner read the whole list a third time and took `ctrl+. sees every task
this project has run` off it. The chord, `/history` and the task page are
untouched; only the tip is gone, and `eventTaskStarted` and
`eventTaskPageOpened` are still fired at their seams for a later row to wait on.

The tip was this suite's fixture on both boxes — a row armed by something that
happens mid-session and retired by a different gesture — so the tests move to
`/files finds everything made for you`, armed by an export landing and retired
by `/files`.

Three comments in notice.go still described the machinery the conversation's
row had for one build and no longer has: a quiet minute, an idle beat and a
rotation. They now say what the file does — a conversation ranks, home takes
turns.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
What a reader of this repository now believes wrongly: copy mode and
/image existed, /folder chose the project, home had no tip row and no @
list, /manual printed pages without a model call, and a showing was any
change of hands.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`ctrl+enter sends your message as something to keep true` was the third
row about a standing order and the only one still spelling it the old
way — "keep true" is exactly what /standing's row was taken off for,
since it made a rule and a memory look like one thing. The two rows
retire on the same event, so they are one lesson told twice; they now
tell it in the same words:

  /standing turns a sentence into a rule work must follow
  ctrl+enter makes your message a rule instead of a request

Same id, same gesture.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
dev landed #1384, the shared working-logo animation, which taught copy
mode to freeze a page without the transient activity row. This branch
deletes copy mode whole, so the three conflicts all resolve the same way:
the freeze goes, the logo stays.

- copymode.go: deleted, as this branch has it. dev's change to it was the
  freeze-without-the-row rule, which has nothing left to rule over.
- room.go: `freezeRoom` goes with it. dev's other two changes to the file
  — the `workActivity` field on taskRoom and its `Start` in `newRoom` —
  are kept, because they are the logo and not the freeze.
- roomscroll_test.go: `TestFreezingAFoldedRoomKeepsTheCopyCursorInBounds`
  goes; dev's only change to that file was inside it.

Two more that git merged cleanly and the compiler caught:

- worklogo.go guarded both visibility rules with `!a.copy.on`. There is no
  copy mode to hide from, so the guards go.
- worklogo_test.go's C1 and C2 tested the freeze itself. They go, and a
  comment in their place says what they held and where copying lives now.

And the manual: dev's new working-indicator page said the logo steps
aside in copy mode. It now says that it used to, and points at the keys
page for the mouse.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
ZeroPoint95 and others added 6 commits September 22, 2026 23:52
…jobs

codex/restore-home-shortcuts gives back the two Home gestures #1071 took:
two spaces in an empty box open home, and esc returns to being the
interrupt, the layer peel and the arming half of rewind. It also removes
/ask, whose tip this branch had already taken off the table, and puts
`ask here` back over home's box.

THE TIPS. One row changes its words: `/rewind takes back an earlier
message` becomes `esc esc takes back the last message`, which is #1388's
own edit and the right one — the chord is the half a person cannot
discover, and either door still retires the row. No row is added for two
spaces: the foot advertises `space space home` outright, and a tip for
something the keys row already names is the one rule this table has
always kept. Twenty-two rows, unchanged in number.

ESC ON HOME NOW PEELS THREE LAYERS, and the @ list this branch added is
the innermost: the list, then the box, then the screen. It has to be that
order — clearing the box first would take the half-typed token the list
was opened for along with it. #1388's own esc test typed `@x`, which
opens that list, so it walks all three layers now and says so in its name.

Three tests here opened home by pressing esc. They go through the door a
person uses, `goHome`, which presses space twice.

Copy mode meets this merge twice more: esc arming rewind no longer asks
whether a frozen page is up (rewind.go), and background.go's note about
the keys that are not for sale named ctrl+b beside it.

The manual: the hints page's opening now shows the keys row's live states
with `esc interrupt` in them, the roads home are two spaces rather than
esc, the rewind row is respelled, the `/ask` note says the door followed
its tip out, home.md keeps #1388's restored ask-here frame with this
branch's project on the keys row, and the rewind page's list of states
that refuse to arm drops copy mode.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The owner's word, 2026-09-23: "we don't need a hint, but don't remove the
feature." So b91a391 is reverted whole. ctrl+b freezes the viewport
again, v/a/y and y-on-a-mark work in it, /copy opens it, the status word
and the mode's own keys row are back, and copymode.go has its name back.

THE TIP DOES NOT COME BACK. `ctrl+b freezes the screen so you can read
and copy from it` stays off the table, /autonomy keeps the seat it took,
and the table stays at twenty-two rows. The row in notice.go that
explains that seat now says so outright, because it was the one place a
reader could conclude the feature had gone with its tip.

Three things the revert could not know about, because they landed after
it on this branch:

- #1384's working logo. It taught both freeze doors to lay the page out
  after copy mode owns it, so the animated row and its private blank
  never become frozen transcript. That edit went into copymode.go and
  room.go, both of which the removal had deleted, so it is applied by
  hand here — along with its two tests and the room freeze's transient-row
  arithmetic.
- The guards. worklogo.go asks `!a.copy.on` on both visibility rules
  again, and rewindReady counts a frozen page among the states that
  refuse to arm.
- #1388's esc. The revert wanted background.go and keys.md to say
  `ctrl+c` interrupts; esc does. Both say `ctrl+b is copy mode and esc
  interrupts`, which is what #1388 itself wrote.

The manual: the pages the removal edited are reverted with it, the
working-indicator page says the logo steps aside in copy mode again, the
rewind page counts copy mode among the states that refuse to arm, and the
hints page notes that the feature works while its tip does not exist. The
three probes about copy mode now ask about it working rather than about
it being gone.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
#1388 respelled this row from `/rewind takes back an earlier message` to
`esc esc takes back the last message`, and it arrived here in that merge
rather than by anybody's choice on this branch. The owner read it back
and did not recognise it.

Either spelling teaches half of it. `esc esc` is the half nobody
discovers. `/rewind` is the half that survives: a person who read only
the chord has no word to type into `/`, no word to ask the manual, and
nothing to search for a week later. So the row names both:

  esc esc or /rewind takes back an earlier message

`an earlier message` rather than `the last` because both doors walk back
further than one turn — the chord through the drawn blocks, the command
through the whole conversation.

Same id, same gesture; eventRewound already fires from both doors.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The owner's read of the list, row by row. Every id and every retiring
gesture is unchanged, so nobody who has already used one of these is told
about it again.

  /files finds everything made for you
    → /files finds files codeaf wrote for you
  /standing turns a sentence into a rule work must follow
    → /standing turns a message into a rule work must follow
  /task starts work you can walk away from
    → /task starts a single-shot task on the side
  ctrl+shift+t reopens the last closed conversation tab
    → ctrl+shift+t reopens the last conversation tab
  /project sets the project folder for the next conversation
    → /project sets the project folder for a new conversation
  /model lists every model, /model <slug> switches at once
    → /model lets you see and choose models and providers
  using enter steers conversations · use ctrl+q to queue
    → using enter steers conversations · use ctrl+q to queue messages

THE COMMAND IS `/files` AND THE ROW SAYS SO. The owner wrote `/file`. The
table has no such command and no such alias (commands.go), and a tip
naming a word that answers `there is no command called /file` teaches a
dead end — which is what the `/folder` row was taken off for.

`on the side` rather than `one the side`, under the owner's standing
order to fix grammar without asking.

The manual follows on every line, including the three quoted frames on
the home and places pages and the two examples in the hints page's own
prose. notice_test.go's fixture tip follows /files.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The owner met it: after `/project <path>` home's keys row was gone,
replaced by `project · ~/Code/deep-swe`, and it stayed that way until
they pressed a key.

Home's sentence is the REFUSAL SLOT. It is drawn IN PLACE OF the keys row
(homephone.go's [app.homeBar]: "a refusal outranks the bar") and stands
until the next keystroke clears it. That is right for a refusal — it is a
fact about a door somebody just tried, and nothing else on the screen
carries it. It is wrong for a success, and this one was wrong twice over:

  - it hid the keys row for as long as it stood, which is what the owner
    saw and had no way to read as anything but a stuck screen;
  - the row it was covering already said the same thing. The pin is a
    string on this window, so `project: <path>` is at the right end of
    those keys from the very next frame. The comment two lines above the
    call said exactly that and the call contradicted it.

The browser road has never said anything, for this reason (folderact.go's
[app.targetFolderConfirm]), so the typed road was also the odd one out.

Both refusals still speak: `no folder there · <path>`, and the connection
one over --host.

The probe that found it: home's foot after `/project` read
` → options · project · /var/…` and after one keystroke
` → options · alt+p project · / commands   project: /var/…`. It now reads
the second on both sides of the command.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The owner's word, 2026-09-23: undo it. With no conversation store behind
the window the place says `there is no index of this machine's
conversations behind this window, so nothing can be searched from here.`
and searches nothing, which is what it did until 2026-09-22.

Gone with it: `byName`, `searchByName`, `searchByNameWord` and
`searchNothingNamed`. `noIndex` is back, and it is again
`a.searchStore == nil && !a.hosted()` — the hosted case has its own
sentence naming WHOSE index is missing, which is the better one where it
applies. `searchTick` stops reading the world and just puts the waiting
flag down.

WHY THE REFUSAL IS THE RIGHT ANSWER, written down where the flag is read:
a place called `search` that quietly searches something narrower than it
says reads exactly like a whole search that found nothing. The refusal is
a fact a person can act on; half a search is one they cannot see.

The `places` page says the refusal, says why, and points at home's box
for finding a conversation by name — which is the door that has never
needed the index. The `commands` page's `/search` paragraph follows. The
test that held the by-name search now holds the refusal: nothing is drawn
under the words, no store read goes out, and the page never claims
nothing was said.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@ZeroPoint95
ZeroPoint95 marked this pull request as ready for review September 23, 2026 13:33
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.

1 participant