A day of repairs to team --fix kept producing the same shape of bug, and the
shape follows from where the authority sits rather than from any of the
individual defects.
Today: the hook short-circuited on an environment it should not trust (#1130);
--fix followed a record into another seat's pane (#1131); it declined a seat
with no record at all (#1140); it could not search tmux from outside a pane
(#1146); it counted a malformed row and suppressed a valid one (#1134); and two
seats claiming one pane went unreported (#1144). Every one of those is
arbitration -- deciding whose claim about a pane is right when several writers
disagree.
There is no need to arbitrate if only one writer exists.
The change
Make correcting a seat's own identity a command the seat runs about itself,
and nothing else. A leader who wants the fleet corrected pokes every seat to run
it. Messaging does not consult the placement record -- verified: send.sh never
reads it, and a seat with no record at all was reachable all day -- so telling a
broken seat to fix itself does not depend on the thing that is broken.
What that deletes:
- resolving another seat's pane, in every form
- the guard that decides whether a seat may take a pane another record claims
- searching terminals from outside a pane
- writing to the pane a record names, which is the operation that nearly
destroyed a live seat's label today
What remains is small: a seat derives its own pane, writes its own three cells,
and a leader fans out. Fan-out becomes an instruction rather than code, so the
command carries no waiting, no aggregation and no timeout.
What it rests on
A seat must always be able to derive its own pane. The environment does not
provide that: it reports where the process runs, which for a CLI reached
through a shared server is not the seat's pane. Output does -- a tool's output is
rendered into the seat's own pane wherever it executed. Measured: two seats whose
environments named the same pane echoed a token into two different panes, each its
own. That is #1124, and it is the prerequisite.
The honest exception is a terminal with no addressable pane (plain), where the
answer is unsupported rather than a guess.
What is not solved by this
A seat that does not answer. Its row stays stale, and nothing should invent a
correction -- guessing is how wrong records get written. What a leader needs is to
see it: which seats answered and which did not. Today, work dispatched to two
names arrived at neither, and nothing said so for hours. That is #1144, and it
stays read-only.
A seat that can derive its pane but cannot write every cell -- a sandbox refusing
terminal operations -- records itself and fails to label. Measured on a live seat:
echo and writing a file are permitted, renaming the pane is not. So "fix
yourself" is the rule and labelling from outside is the exception, rather than
everything being done from outside as it is now.
Sequencing
Not a refactor to start under release pressure, and there is none: this addressing
mechanism is the base for the daemon work, so it is worth getting right before
more is built on it. #1124 first, measured to the end -- what a seat emits so it
cannot be confused with content, how deep the scan reads, what two simultaneous
probes do. The inversion follows from it.
A day of repairs to
team --fixkept producing the same shape of bug, and theshape follows from where the authority sits rather than from any of the
individual defects.
Today: the hook short-circuited on an environment it should not trust (#1130);
--fixfollowed a record into another seat's pane (#1131); it declined a seatwith no record at all (#1140); it could not search tmux from outside a pane
(#1146); it counted a malformed row and suppressed a valid one (#1134); and two
seats claiming one pane went unreported (#1144). Every one of those is
arbitration -- deciding whose claim about a pane is right when several writers
disagree.
There is no need to arbitrate if only one writer exists.
The change
Make correcting a seat's own identity a command the seat runs about itself,
and nothing else. A leader who wants the fleet corrected pokes every seat to run
it. Messaging does not consult the placement record -- verified:
send.shneverreads it, and a seat with no record at all was reachable all day -- so telling a
broken seat to fix itself does not depend on the thing that is broken.
What that deletes:
destroyed a live seat's label today
What remains is small: a seat derives its own pane, writes its own three cells,
and a leader fans out. Fan-out becomes an instruction rather than code, so the
command carries no waiting, no aggregation and no timeout.
What it rests on
A seat must always be able to derive its own pane. The environment does not
provide that: it reports where the process runs, which for a CLI reached
through a shared server is not the seat's pane. Output does -- a tool's output is
rendered into the seat's own pane wherever it executed. Measured: two seats whose
environments named the same pane echoed a token into two different panes, each its
own. That is #1124, and it is the prerequisite.
The honest exception is a terminal with no addressable pane (plain), where the
answer is
unsupportedrather than a guess.What is not solved by this
A seat that does not answer. Its row stays stale, and nothing should invent a
correction -- guessing is how wrong records get written. What a leader needs is to
see it: which seats answered and which did not. Today, work dispatched to two
names arrived at neither, and nothing said so for hours. That is #1144, and it
stays read-only.
A seat that can derive its pane but cannot write every cell -- a sandbox refusing
terminal operations -- records itself and fails to label. Measured on a live seat:
echoand writing a file are permitted, renaming the pane is not. So "fixyourself" is the rule and labelling from outside is the exception, rather than
everything being done from outside as it is now.
Sequencing
Not a refactor to start under release pressure, and there is none: this addressing
mechanism is the base for the daemon work, so it is worth getting right before
more is built on it. #1124 first, measured to the end -- what a seat emits so it
cannot be confused with content, how deep the scan reads, what two simultaneous
probes do. The inversion follows from it.