Skip to content

tasks: a row says its state once, an abandoned call is said in whole seconds, and a conversation root names its folder only where that is news - #895

Merged
santoshkumarradha merged 6 commits into
devfrom
tasks/table
Sep 11, 2026
Merged

santoshkumarradha merged 6 commits into
devfrom
tasks/table

Conversation

@santoshkumarradha

Copy link
Copy Markdown
Member

Part of #884 — lane T, the first of two. Lane P builds the record pane on top of the table
that follows this.

Three defects on the owner's screenshot, and all three were the same shape: one fact with
two writers
.

stopped · stopped

internal/session's taskGradeOutcome spells a stopped node's own outcome as the literal
"stopped", and tasksMiddle hung that outcome off taskStateWord(entry) — so the page said
one reading twice because each writer thought it was the one saying it.

The fix is not a string. session.TaskStatus.RowWord() is the join, written down once: the
word, the reason, and the rule that a reason merely restating the word is not said again. It
is what the column beside a conversation already reads (tierRowBody), so the two surfaces
now say the same sentence about one row by construction rather than by agreement. Three
hand-rolled compositions in tasksMiddle collapse into it, and tasksNote stops spelling a
state word at all — it is now only which window the work is in.

Consequence, and it is #884's own ruling for the table arriving a PR early: the record's raw
outcome sentence leaves the row.
On every row the engine grades, that sentence WAS the state
word in different clothes; where it is real prose it belongs on the record card, which is one
enter away. The row's degradation ladder is now 2 files · your call · nobody could check it
→ your call · nobody could check it → your call: the word a list is scanned for is the last
thing a narrow frame gives up.

one call ran 29.24078975s without answering and was abandoned

time.Duration.String is the engine talking to itself — eight decimal places of a figure
nobody can act on, and the nanoseconds were never a fact about the run, only the resolution of
the clock. checkerStalled now spells the bound with taskSpanWord, this package's one
spelling of how long something took.

The ~ at the right of a conversation root

docs/design/home-mission-control/DESIGN.md §1 retired ~ as a project name and the project
tag on rows in this window's own folder. Home obeyed it; the tasks place drew both. New
internal/tui3/projecttag.go holds chatProjectWord — that rule, once — and home's
chatProjectTag is now two lines delegating to it.

The bar

  • One abstraction: session.TaskStatus.RowWord() reused rather than re-spelled, and
    chatProjectWord extracted so two pages ask one rule. Anyone drawing a list of work or a
    list of conversations can use both.
  • Deleted: three compositions in tasksMiddle, the state-word branch of tasksNote, the
    session.TaskReasonOf and refused() calls this page made for itself, and the raw-outcome
    fact on the row.
  • Guarded by: TestARowSaysItsStateWordOnce, TestTheRowTakesItsStateAndReasonFromTheOneJoin,
    TestAConversationRootWearsAFolderTagOnlyWhereItIsNews, TestAnAbandonedCallIsSaidInWholeSeconds.
  • Seam reported, not patched: checkerRanOut still says window.String() (5m0s). That
    window is a configured ceiling rather than a measured elapsed, and taskSpanWord's 5m 0s
    is not an improvement; it wants a ceiling spelling, which is a different question.
  • Other lane's file: six lines in internal/tui3/homepanel_recent.go (lane H's), turning
    chatProjectTag into a delegation.

🤖 Generated with Claude Code

santoshkumarradha and others added 4 commits September 11, 2026 11:24
…seconds, and a conversation root names its folder only where that is news

Three defects on one screenshot, and all three were one shape: a fact with
two writers.

`stopped · stopped`. The engine grades a node somebody stopped with the
outcome `stopped`, and this page hung that outcome off its own state word.
[session.TaskStatus.RowWord] is the join — the word, its reason, and the
rule that a reason restating the word is not said again — and it is what
the column beside a conversation already reads. The three hand-rolled
compositions in [tasksMiddle] and the state word [tasksNote] spelled for a
row nobody is behind are gone.

`one call ran 29.24078975s without answering`. [time.Duration.String] is
the engine talking to itself; [taskSpanWord] is this package's one
spelling of how long something took.

The `~` at the right of a conversation root. The mission-control ruling
retired `~` as a project name and the tag on rows in this window's own
folder; home obeyed it and the tasks place drew both. [chatProjectWord] is
that rule, asked by both pages.

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

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
[app.taskSheetSelfRow] knows what this conversation is called and nothing
about which project bucket it belongs to; the world scan knows the bucket
and nothing about a journal this session has not finished writing. The
two meet in [tasksConversationRows], so the reading takes the folder from
there. Asking [tasksMine.row] directly got the half with no folder on it,
which left every row of the folder a person was sitting in wearing its
name — the thing the ruling retired.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@santoshkumarradha
santoshkumarradha marked this pull request as ready for review September 11, 2026 15:37
santoshkumarradha and others added 2 commits September 11, 2026 11:47
… the rule about a folder's name takes named facts

Ten findings from a fresh-eyes pass over #895; these are the behaviour
ones and the comments that stopped being true.

THE WORD IS THE LAST THING A ROW GIVES UP. Moving the state out of the
note demoted it from second in the ranked tail to fifth, behind the age
and the conversation the work came out of — so at eighty-five cells a row
nothing was running kept `The Skill Model Rebuild` and dropped
`incomplete`. It ranks third now, directly behind the one fact that says
the work is somewhere else, which is the argument [tasksFacts] was always
making and the law tasktier.go states for the column beside a
conversation.

AND A FIELD WITH ONE SPELLING EITHER FITS OR GOES. A `your call` row that
changed no files had its file count and its state collapse into the same
string, so the ladder offered a single rung and a hundred-column frame
drew the age alone. The rungs are built by adding now, and a rung equal
to the one above it is not a rung. A live row's activity is returned
whole: it is a different fact and not a longer spelling of the state.

[chatProjectWord] takes a [chatFolder] rather than five positional
paths — every one of them a path, so a transposition compiled — and its
own comparison is cleaned on both sides like the check above it.

[refused] was [tasksMiddle]'s last caller and its comment stated a rule
this surface no longer applies; both are deleted. The abandoned-call
comment no longer claims one spelling of a duration where there are two,
and says why the window's ceiling keeps the other.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@santoshkumarradha
santoshkumarradha merged commit 4205888 into dev Sep 11, 2026
3 checks passed
@santoshkumarradha
santoshkumarradha deleted the tasks/table branch September 11, 2026 16:03
@santoshkumarradha santoshkumarradha added the area:session The engine — turns, tasks, the toolbelt, checkpoints label Oct 3, 2026
@santoshkumarradha santoshkumarradha added this to the Reliable agent milestone Oct 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:session The engine — turns, tasks, the toolbelt, checkpoints

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant