Skip to content

Merge the two agent screens into one: 작업 - #84

Merged
heznpc merged 1 commit into
mainfrom
feat/work-screen
Aug 21, 2026
Merged

Merge the two agent screens into one: 작업#84
heznpc merged 1 commit into
mainfrom
feat/work-screen

Conversation

@heznpc

@heznpc heznpc commented Aug 21, 2026

Copy link
Copy Markdown
Owner

AI 세션 and 레포 은퇴 were one object shown twice through two subsystem lenses. The retirement page could not even start without the audit having run first — the shape of a step in a workflow, not a peer in a sidebar.

One 작업 destination, project-primary

  • Agent worktrees fold into their repo. affectionate-cohen-f52bc6 is useful once you know which project you're looking at, and useless as the thing to sort a list by.
  • Retirement is an action raised from a project, as a sheet stating the whole case at once (git / AI 작업 / 보호할 워크트리 / 보존될 것). Read-only, as the page was.
  • Conversation titles are the click target. Project → title = the conversation.
  • The worktree inventory and lineage are demoted to the detail pane instead of opening the screen.
  • Index and titles load on entry: entering the screen is the intent. The line this project holds is metadata-only judgment, not a rule that a listing must be asked for twice.

Four things were broken, not merely awkward

Bug Effect
Index capped at 500 (Swift's own default overrode Python's) Told the user the machine holds thousands, let them search the newest few hundred. Measured: the cap saved nothing — 0.4s full walk vs a 5.6s report dominated by git inspection.
Gemini conversations unreachable collect_gemini reports the registry; the chats live in ~/.gemini/tmp/*/chats/ and were in no listing — 4,005 here — while the screen named Gemini in its subtitle.
titles used one shared scratch path, deleted on return Concurrent rows clobbered each other's input; no title ever arrived.
Full index exceeds the runner's output ceiling Now goes to a file, like bind-all already did.

Both Gemini answers are kept — registry for retention/lineage, chats for the browser — because they answer different questions, and a test pins that.

collect_all gives the judgment and the browser one definition of "all the stores", which is how Gemini came to be visible to one and not the other. The two commands stay two processes on purpose; the measurement says collapsing them buys little.

Verification

  • Python 633 · Modore 247 · MothballCore 120, green with CI flags.
  • release_smoke.py clean.
  • Driven in the running app against this machine: 350 projects, 7,145 conversations, titles resolving in one batch (including all 72 of an expanded project), a conversation opened in two clicks, worktrees demoted to the right pane.
  • Not verified by clicking: the 은퇴 검토 sheet itself. Its trigger was moved to the project header after I saw it sitting below 72 conversation rows, and macOS Notification Center began intercepting the automation's hit-tests before I could re-open it. Covered by build and unit tests only.

`AI 세션` and `레포 은퇴` were one object shown twice through two
subsystem lenses. Nobody outside the codebase has a reason to know that
scree finds workspaces and mothball judges repos: a session, a worktree,
a git state and a retirement verdict are all facts about a project, and
splitting them across two sidebar entries made the user assemble the
object themselves. The retirement page could not even start without the
audit having run first -- the shape of a step in a workflow, not a peer
in a sidebar.

So: one `작업` destination, project-primary. Worktrees become evidence
rather than identity -- `affectionate-cohen-f52bc6` is useful once you
know which project you are looking at and useless as the thing to sort a
list by, so agent worktrees fold into their repo. Retirement becomes an
action raised from a project, as a sheet that states the whole case at
once. Reaching a conversation is now two clicks: project, then title.

Titles are the click target, which needed a batch `titles` command --
the per-session one is right for one session and wrong for a list, and
thirty serial process spawns is why rows sat on "제목을 읽는 중…" long
enough to look broken.

Four things were broken rather than merely awkward:

- The session index was capped at 500. The cap was invisible to the
  person searching, who was told the machine holds thousands of sessions
  and then silently allowed to search the newest few hundred. It was not
  buying the I/O it appeared to either -- the count was taken after
  walking everything, and the full walk measures 0.4s against a 5.6s
  report whose time is git inspection.
- Gemini's conversations were unreachable. `collect_gemini` reports the
  registry, which is what retention and lineage want; the chats live in
  `~/.gemini/tmp/*/chats/` and appeared in no listing at all, while the
  screen named Gemini in its subtitle. 4,005 of them here. Both answers
  are kept, because they are answers to different questions.
- Every `titles` call wrote to one shared scratch path and deleted it on
  return, so concurrent rows clobbered each other's input and no title
  ever arrived.
- The full index is megabytes, past the runner's output ceiling, so it
  goes to a file like `bind-all`'s already did.

`collect_all` gives the judgment and the browser one definition of "all
the stores", which is how Gemini came to be visible to one and not the
other. The two commands stay two processes on purpose; the measurement
above says collapsing them would buy little.

Python 633 · Modore 247 · MothballCore 120. Driven in the running app
against this machine: 350 projects, 7,145 conversations, titles
resolving, a conversation open in two clicks.
@heznpc
heznpc merged commit ca17864 into main Aug 21, 2026
8 checks passed
@heznpc
heznpc deleted the feat/work-screen branch August 21, 2026 18:22
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