RETRO.md
Ref: Size: 97.5 KiB History
# Sprint retrospectives
## Native tiling — Sprint 1, 2026-09-05
Delivered two independent terminal panes, split selection, keyboard/mouse focus,
per-pane PTY sizing, and failure isolation. Refactoring and adversarial review
completed before acceptance. Native integration, 200% Wayland, and real SSH/QUIC
tests passed; the working demo is ready for ergonomic trial.
### What worked
- Two real panes exercised ownership, rendering, input, and failure isolation
before adding picker complexity. The deliverable was concrete and testable.
- Reusing one implementer and one adversarial reviewer kept responsibility clear.
Review found command-repeat leakage and the PTY signal-handling requirement for
testing Ctrl+\ passthrough.
- Mandatory cleanup consolidated geometry and ownership before final validation.
- Automated checks established correctness; the user's trial exposed ergonomic
questions that those checks could not settle.
### What to change
- The implementation chose Ctrl+Shift+Space without explicitly settling the
prefix with the user. The trial selected `Ctrl+\` for consistency with terminal
mux. Nesting mux is not a design requirement. Make unresolved interaction
choices explicit before implementing them.
- Explain temporary demo controls at handoff. `--next-target` and `--next-session`
stage one host/session pair; they are scaffolding until the picker exists.
- Keep delegation bounded: reuse the pair, assign narrow ownership, and exchange
concrete findings. Avoid repeated broad reviews or automatic skill ceremony.
### Actions for Sprint 2
Owner: the sprint lead, with implementation and review delegated as appropriate.
At the end of Sprint 2, mark completed items and record evidence or carry-forward
reasons below. Passing a test does not by itself complete an ergonomic action.
- [x] Settle unresolved picker interactions before implementation. Record the
agreed keys, back/cancel behavior, and existing/new session flow in the spec.
- [x] Demo host → existing/new session → insertion with the user. Verify that
the picker supplies the target without requiring staged CLI flags, and capture
the user's feedback on direction selection, cancellation, and focus.
- [x] Make connection setup and discovery cancellable. Verify stalled dialing,
slow replies, cancellation, shutdown, and stale results after target changes;
inherited synchronous Unix connect and DNS resolution need explicit treatment.
- [x] Resolve attach-existing versus create semantics. Test a session vanishing
between listing and attachment, and document behavior with older daemons.
- [x] Keep the implementation/reviewer pair bounded and complete the refactoring
package before final acceptance. Record concrete findings resolved, duplicated
or obsolete code removed, and any remaining debt with its next owner/package.
### Sprint 2 follow-up
The user accepted the recorded Sway demo on 2026-09-05: “Lgtm i pass the demo!”
This closes the two ergonomic actions. The first action missed its timing target:
defaults were proposed before implementation, but acceptance came afterward.
The demo covered host selection, new-session creation beside the first pane,
existing-session insertion below, and directional focus with independent input.
Acceptance was based on the recording while the user was away from the desktop;
no hands-on trial or additional feedback on individual controls is claimed.
## Native tiling — Sprint 2, 2026-09-05
Implemented host → existing/new session → insertion, including Add host,
nested splits, keyboard and scaled mouse selection, cancellation, and visible
errors. Removed the staged-target CLI flags. Both clients still share daemon
sessions; native layout policy remains separate from terminal mux.
### What worked
- The implementer/reviewer pair resolved concrete failures directly: SSH input
ownership, QUIC cleanup after cancellation, a child ignoring termination,
resize and Enter arriving together, and stale creation outcomes. The GUI
harness reproduced the resize bug before verifying its fix.
- Existing zero-size attachment already provides atomic join-only semantics.
Reusing it avoided changing replay or legacy attachment behavior. Explicit
creation needed a narrow new daemon verb to refuse competing names safely.
- Independent checks used daemon state and actual pixels, including the prior
sprint's daemon and real SSH/QUIC hosts. An unanswered creation remains an
unknown outcome rather than triggering an unsafe fallback.
- Cleanup removed duplicate target copying, stream buffering, and owned-child
teardown. One pure insertion plan now drives both capacity checks and committed
insertion; checking room consumes no pane ID or provisional allocation.
### What to change
- Shared cancellation work needs a matrix of input owners: first local attach,
first SSH attach, reconnect, and a GUI cancel pipe. Final repository CI caught
early local stdin consumption after the narrower tests had passed. The fix
preserves queued commands until attachment; regressions check both successful
detach and the existence of the newly requested session.
- Freeze owned files before starting compilation gates. An early broad run
overlapped an in-progress module edit and produced a transient compile failure.
- Updating a demo harness requires checking its observations too. Remote checks
initially assumed a missing-session dump failed and that quiet picker targets
printed fallback narration to GUI stderr. Read-only status and the real remote
endpoint log supplied the correct evidence; all fixtures were cleaned up.
### Evidence and remaining work
Connection cancellation is covered by saturated Unix sockets, stalled resolver
children, partial replies, target changes, and shutdown during an actual dispatched
request. Join-only and create-only behavior is covered by disappearing sessions,
competing creators, and an actual prior-sprint daemon. Native Wayland at 200% and
the VM at `10.78.5.4` both passed the picker workflow. Exact final gate results
are recorded in the native tiling delivery plan.
The user explicitly passed the recorded demo, closing Sprint 2's product gate.
New-session creation requires the updated daemon;
existing-session selection remains compatible with the prior daemon. Divider
resizing, persistence, and recovery commands remain in their planned sprints.
### Actions before and during Sprint 3
Owner: the sprint lead, with bounded implementation and adversarial review.
At the next retrospective, mark each action with evidence or a carry-forward reason.
- [x] Close the two outstanding picker ergonomic actions with the user before
expanding the interaction model. Record feedback on direction, back/cancel,
focus, and the shared host catalogue. The recorded demo was accepted on
2026-09-05; no changes or control-specific feedback were requested.
- [x] Agree divider hit areas and keyboard resize increments before UI work;
reuse one sizing policy for drag, keyboard input, and minimum constraints.
Closed by recorded-demo approval on 2026-09-05. Timing target missed: defaults
were proposed before UI work and accepted after delivery, without requested changes.
- [x] Exercise nested divider movement at 200% scale and after a display-scale
change. Check both PTY sizes and erased pixels, not only model rectangles.
- [x] Include batched resize/input events and stale asynchronous completion in
acceptance; avoid observations that accidentally repair the state under test.
- [x] Keep the bounded implementation/review pair and explicit cleanup package.
Freeze source before final gates and record any retained debt with an owner.
## Native tiling — Sprint 3, 2026-09-05
Implemented relative divider weights, mouse dragging, and keyboard resize mode.
Opening cleanup is separately committed as `3eaad75`; the closing cleanup and
adversarial review are complete. Final delivery evidence belongs in the native
tiling plan. Implementation `3eab2a35` is accepted: after the mouse-focused
recording, the user said “demo approved!” on 2026-09-05.
### What worked
- The opening cleanup unified live and insertion geometry before adding weights.
The closing cleanup consolidated direction mapping, signed pointer conversion,
minimum constraints, pixel serialization, and input-state teardown. Both passes
had a concrete purpose and avoided unrelated changes.
- Direct implementer/reviewer discussion resolved held-key alias leakage, ignored
modal keys repeating after exit, and keyboard/picker transitions retaining a
mouse drag. Regressions cover the actual triggering event sequences.
- Independent kernel PTY measurements caught an inherited mismatch: native panes
allowed one content row, while the daemon rejects fewer than two. The GUI now
derives its minimum from the shared protocol constants, including its header.
- A retained-frame hook observes already-rendered pixels without forcing repaint.
PTY checks read `TIOCGWINSZ` without sending input. This makes missed invalidation
and missing resize delivery observable instead of accidentally repairing them.
- Actual Wayland transitions through 200%, 100%, 150%, and 200% preserved nested
resizing, cancelled stale drags, and passed all-pane PTY and erased-pixel checks.
An isolated compositor allowed these tests without changing the user's monitor.
- The follow-up mouse recording used Wayland virtual-pointer motion and button
events with a visible cursor. Both dividers moved in both directions, stopped
on release, and retained correct kernel PTY sizes. It passed without code changes.
### What to change
- Check existing wire limits when defining UI minimums; a model-only test can
preserve a locally consistent value that the daemon refuses.
- Keep ergonomic proposals distinct from agreement. Six logical pixels and one
cell per key were proposed before UI work, then used as trial defaults while
awaiting feedback. Demo approval closes the action; it does not establish that
agreement happened before implementation or imply a hands-on trial.
- Include the pointer in mouse demos and use actual compositor input. The first
attempt warped the pointer without delivering held-button motion; the virtual
pointer interface exercised the complete input path successfully.
- Preserve practical test limits: tiny-window requests may be constrained by a
desktop compositor. Record the actual size granted instead of changing global
compositor policy. This sprint achieved exact 8x8 both offscreen and on Sway
after removing only the test window's border.
### Actions for Sprint 4
Owner: the sprint lead and the bounded implementation/review pair. Review these
before Sprint 4 and close each with evidence at its retrospective.
- [x] Obtain resize demo acceptance and resolve any requested ergonomic changes
before extending interaction with detach, end, and recovery actions.
The user approved the recorded demo on 2026-09-05; no changes were requested.
- [x] Start with a bounded cleanup of the lifecycle and state-ownership paths;
keep substantial refactors explicit and preserve the closing cleanup package.
Sprint 4 opening cleanup `aa5e977` centralizes attachment startup/teardown;
review, 33 native tests, and `make check` passed. Sprint 4 closing cleanup is
complete and consolidated the remaining lifecycle paths.
- [x] Persist the relative weights and stable pane/tab identity introduced here;
round-trip nested layouts after minimum clamping and at a different display scale.
Nested weights/identities survived 8x8 clamping and actual 100% save to 200%
Sway restore; `/tmp/muxg-lifecycle-wayland.log` records the 13 passing scenarios.
- [x] Validate detach versus end through independently observed daemon sessions,
including missing/offline hosts and sessions shared by another client.
The lifecycle harness checks real daemon outcomes, including Cancel/default
refusal, sole attachment End, explicit force, and detach survival. Real SSH/QUIC
restore and lifecycle checks passed separately in the user-provided VM.
- [x] Exercise atomic-save failure, malformed-state preservation, stale asynchronous
completions, and cancellation during restoration; do not modify terminal mux's
layout state or silently recreate a missing saved session.
Real chmod failures preserve prior bytes; malformed/unreadable files remain
sealed for the run. The harness covers stalled restores, missing sessions,
in-place replacement, changed working directories, and a CLI-layout sentinel.
- [x] Keep observations passive and final gates on frozen source. Retain the real
screen-recording/private Serve demo route documented in
[the sprint workflow](docs/native-sprint-workflow.md).
The final source is reviewed and frozen; the 45-second actual Sway recording is
privately available at `https://charizard.folk-amberjack.ts.net/sprint4/`.
Historical Sprint 3 note: relative weights remained in memory until Sprint 4
persistence, whose implementer owned that planned work. No new correctness debt
was deferred by the closing review.
## Native tiling — Sprint 4, 2026-09-05
Implementation, adversarial review, and delivery validation are complete. The
45-second Sway demo shows restore, a target returning, missing-session recovery,
Detach and End. Evidence is tracked in the native tiling plan. User acceptance of
Sprint 4 has not yet been given.
### What worked
- The opening cleanup `aa5e977` gave new and restored attachments a shared owned
lifetime. Closing cleanup then consolidated add/restore startup, modal held-key
ownership, popup reset, and observation of End outcomes through captured status.
Both cleanup passes remained bounded; no unrelated CLI layout work was needed.
- Agreeing the persistence boundary early let lifecycle/UI work, serialization,
and an independent real-session harness progress without competing file edits.
Strict graph validation and allocation-failure tests protect partial restores;
a stable sibling lock survives atomic replacement of the state file.
- Direct review caught mistakes that happy-path demos would miss: retry losing
old content after a malformed first snapshot, unreachable SSH appearing
permanently failed, modal overlap after a delayed End refusal, and requiring a
local runtime directory for an independent remote workspace.
- Independent acceptance checks actual daemon sessions, kernel PTY dimensions,
retained rendered pixels, saved bytes, process shutdown, and target identity
after changing working directories. It passed offscreen and on real Sway at
200%, including restoration from 100%. The VM checks exercise real SSH fallback
and direct QUIC rather than a transport stub.
### What to change
- Root's final review found an additional destructive-action context problem
after the first source freeze: moving focus while waiting could make a delayed
force confirmation ambiguous. The final fix binds unsolicited confirmation to
the original focused pane and names its captured session/target. Include focus
movement among delayed-action acceptance scenarios before the next freeze.
- Treat test observation as an explicit design choice. Tiny-window reflow may
legitimately move old text into scrollback; compare restored painted output
against the daemon's current grid before sending new input. Assertions about
captured text should not accidentally require unrelated scrollback behavior.
- Proposed `p` recovery and `x` confirmation controls were shared before UI work;
implementation proceeded with the stated defaults while awaiting feedback.
Recorded acceptance will not be described as a hands-on ergonomic trial.
### Retained limits and debt
The native state schema is tabs-aware, while this milestone deliberately supports
one tab and one default-workspace writer. Explicit targets remain temporary.
These are planned scope boundaries, not incomplete persistence behavior.
`src/client/session_pump.zig` retries SSH announce EOF with bounded backoff because
the handoff layer uses that same error for unavailable hosts and some SSH
authentication failures. The actual reason stays visible; no session creation or
End is retried. A future shared handoff error-classification change should separate
those cases; Sprint 5's final reviewer owns deciding whether that is justified
within the release review or should remain an explicit follow-up.
### Actions for Sprint 5
Owner: the sprint lead and implementation/review pair. Close each with evidence
at the final milestone retrospective. Completed items are evidenced in the
Sprint 5 retrospective below and the delivery plan.
- [x] Include `make native-stress` and a real Sway raw-output run in the final
release review; build both demo binaries together in an isolated ReleaseSafe
prefix and report sampled input latency separately from frame timing.
- [x] Resolve the Sprint 4 acceptance gate before beginning the release review.
The user explicitly said “Let’s start sprint 5”, authorizing advancement.
This supersedes waiting at that gate; separate Sprint 4 demo approval and
hands-on feedback are not claimed. Lifecycle remains in the final demo.
- [x] Run the next ergonomic trial from proposed defaults through implementation
and demo, apply any requested adjustments, and record whether feedback came
from the recording or a hands-on trial, if available, separately from automation.
The user accepted the recorded trial on 2026-09-05; no changes were requested.
No hands-on trial is claimed.
- [x] Start with a bounded review/cleanup of the accumulated native workflow, then
retain a closing cleanup pass; avoid introducing tabs UI or terminal tiling changes.
- [x] Review delayed destructive actions across focus, picker, resize, drag,
detach, and replacement transitions; keep confirmation target identity visible.
- [x] Review the retained SSH EOF/authentication classification limit and record
the disposition without weakening bounded reconnect or join-only restoration.
- [x] Run the complete multi-host workflow and final adversarial review, including
shared sessions, state ownership/failures, high DPI, and cleanup of owned fixtures.
- [x] Record final demo acceptance separately from automation and any hands-on
ergonomic feedback, update the spec's completion status, and commit the milestone.
- [x] Evaluate model economy for the sprint using available evidence: record the
bounded pair's task scope, review yield, and observed token/time cost, explicitly
noting unavailable measurements, then decide whether the current model defaults
remain economical for the next sprint.
### Sprint 4 follow-up: raw-output responsiveness
The user's `cat /dev/random` question exposed two validation gaps: printable
floods do not exercise arbitrary terminal controls, and checking the GUI's build
mode does not establish the daemon's mode. The first ad-hoc run paired a
ReleaseSafe GUI with a Debug daemon left in `zig-out` by the repository gates.
Its same-daemon neighbour took up to 843 ms to appear, while a separate-daemon
neighbour appeared within 121 ms. Binary inspection confirmed Debug; the
daemon's terminal engine enables expensive integrity checks in that mode.
Rebuilding only the daemon in ReleaseSafe resolved the observed difference.
The same real Sway scenario consumed about 56 MB over 30 seconds, versus 0.88 MB
in Debug, with both neighbours observed within 121 ms. Close/reopen, menus and
divider resizing passed. Those latency figures include polling delay and are
upper bounds, not precise intrinsic timings. Independent offscreen replication
agreed; there was no evidence warranting a production scheduler change.
The follow-up adds `make native-stress`, whose build graph supplies both release
binaries and refuses Debug. The Linux test uses raw output, independently checks
producer identity and sustained daemon reads, probes shared and separate daemon
neighbours, and repeats lifecycle/resize checks during the flood. A tighter
observation interval and a 250 ms input-to-painted limit guard the reported
failure. Demo instructions now use a separate release prefix. The original
measurement is retained here as a corrected finding, not a product defect.
The permanent test passed offscreen and on Sway at 200%: with 5 ms observation
polling, shared-daemon response was at most 65.2 ms and separate-daemon response
51.1 ms on Sway, while about 57 MB ran over 30 seconds. Frame p99 stayed below
17.3 ms, and the lifecycle/resize checks passed. The Debug build target failed
before launching fixtures as intended. Adversarial review accepted the test
after adding its Makefile target to `.PHONY`.
As a negative control, deliberately bypassing the build target and pairing the
release GUI with the Debug daemon failed the new latency assertion at 878 ms.
## Native tiling — Sprint 5, 2026-09-05
The user explicitly authorized the release review. Implementation, adversarial
review, closing cleanup assessment and final gates are complete. The user accepted
the final recorded trial on 2026-09-05 (“Trial passes! Good work”). Advancing
from Sprint 4 is not recorded as a separate demo approval.
The final trial retains the existing keys and asks for feedback on target clarity,
Cancel-first confirmation, and returning to terminal input. Hands-on feedback is
optional and will be recorded separately from video approval.
### What worked
- A bounded opening review found no justified attachment or persistence refactor.
The closing review reached the same conclusion after the targeted fix; no
cleanup quota or new abstraction was introduced.
- Adversarial review found a missed command-mode transition: a delayed End refusal
could open a force menu over an armed prefix. Dismissing the menu left the
prefix armed, so later terminal input could become another End command. The
fix preserves command mode and prevents that unsolicited menu.
- The real-daemon regression failed on the previous release binary, then passed
after the fix. Eight scenarios hold a reply by pausing only an owned daemon,
then exercise command, focus, picker, resize, drag, replacement, detach and
accepted-End paths. Another real client causes the shared-session refusal.
Explicit refusal assertions distinguish an actual reply from a timeout;
detach deliberately records an unknown outcome.
- Final-build SSH/QUIC checks passed on the VM and verified fixture cleanup.
The GUI demo and compositor mouse recording were captured on an isolated Sway
output at 200%, keeping the sleeping desktop unchanged.
### What to change
- The first Wayland stress setup tried to resize an unmapped window. Use a
compositor mapping rule or wait for mapping before fixture placement.
- A software-rendered headless compositor exceeded the frame-time budget even
though input remained responsive. Record renderer provenance as well as both
binaries' build modes; do not infer hardware performance from functional
headless checks. Keep performance runs separate from other GUI fixtures.
- Include the pinned compiler and writable cache directory in short agent briefs.
The implementer's local validation attempt used a blocked cache and could not
fetch dependencies; root's existing cache completed the final native gates.
### Validation and demo
`make ci`, 44 native unit tests, 63 native integration scenarios (including the
separately run old-daemon picker case), Wayland lifecycle/scale checks, real
compositor mouse input and SSH/QUIC acceptance passed. The GPU-backed Sway stress
run passed unchanged budgets: shared-daemon sampled input maximum 50.4 ms,
separate-daemon 65.3 ms, frame p99 16.0 ms, 113.7 MB over 30.1 seconds. The software
run remains a recorded failure; no budget was relaxed. Exact logs and measurement
limits are in the delivery plan. An earlier CI process received SIGTERM before
completion; the subsequent full CI run passed.
The [private final demo](https://charizard.folk-amberjack.ts.net/sprint5/) contains
the 61.2-second lifecycle/raw-output trial and a 23.4-second mouse recording. Both
use the final release GUI on isolated Sway at 200%, with no audio. Test fixtures
and compositors were stopped; only the explicitly shared demo service remains.
The user accepted implementation `1d43cd59` through the recorded trial, with no
requested changes. Sprint 5 and the native tiling milestone are complete.
No hands-on trial or retroactive separate Sprint 4 approval is claimed.
### Delegation and retained debt
Luna performed the opening assessment and focused implementation. A new Terra
reviewer could not start because old agent threads exhausted the session limit.
Root disclosed the fallback and reused the existing reviewer with a narrow brief;
that reviewer used the more expensive inherited model. The pair resolved one
production finding directly, and root independently reproduced it and validated
the integrated result. Per-agent token/cost totals were unavailable, so this
sprint does not establish savings from the intended Luna/Terra pair. Retain those
model defaults, and start the next sprint in a fresh session with both slots free.
The SSH announce EOF/authentication classification limit remains in
`src/client/session_pump.zig` and the shared handoff layer. Some permanent auth
failures receive bounded reconnect attempts. Reasons stay visible; End and
session creation are never retried. The final reviewer accepted deferral to a
shared handoff classification change, whose owner must preserve join-only
restoration and bounded shutdown. Tabs UI and pane rearrangement remain outside
this milestone.
### Actions for the next authorized sprint
- [x] Record final Sprint 5 demo acceptance and any requested ergonomic adjustment;
distinguish recorded approval from any hands-on trial. Accepted on 2026-09-05
with no requested changes; recorded-demo approval only.
- [x] Start with available Luna/Terra slots and short briefs containing the pinned
compiler/cache command; record model selection, review yield and available cost
evidence without estimating missing token totals.
Completed in the SSH follow-up below; local session metadata confirms both models.
- [x] When shared handoff errors are changed, separate unreachable-host EOF from
authentication refusal and verify bounded reconnect and join-only restore.
Implemented and validated in the SSH follow-up; recorded-demo acceptance pending.
## SSH failure classification — follow-up sprint, 2026-09-05
The user authorized this bounded sprint after accepting the native tiling milestone.
Implementation, adversarial review, closing cleanup assessment, and validation are
complete. The [delivery record](docs/superpowers/plans/2026-09-05-ssh-error-classification.md)
contains commands and evidence. The new recorded trial is awaiting user acceptance.
### Results and review
- Canonical OpenSSH authentication refusal now stops native automatic reconnect
during both restore and post-attachment redial. The pane retains its target and
diagnostic; correcting credentials requires explicit Retry. Unknown EOF and
unavailable-host recovery retain their existing behavior. End, creation, and
terminal layout policy were not changed.
- Opening review found the existing handoff/Reason/pump boundaries sufficient;
no separate structural cleanup was warranted. Closing review removed an unused
classification category and a bespoke ASCII scan, and extracted the retry-policy
predicate to verify existing non-auth behavior explicitly.
- Review tightened banner/identity parsing and authentication-method coverage,
required real execution counts for both retry paths, replaced a timing-dependent
reconnect test with an attached-then-release handshake, and fixed test-server
teardown so a stop failure cannot skip GUI/daemon cleanup. Root's final finding
preserved retries for post-attachment non-auth errors such as connection reset.
- The permanent real OpenSSH/native test failed on the accepted previous release:
a rejected key left the pane reconnecting and caused repeated SSH attempts.
It passes on the final release, including manual recovery, independent neighbour
input, unavailable-host return, missing-session preservation, and shutdown.
- `make ci` passed. After the final pump-policy correction, `make check`, native
unit/integration gates, real SSH acceptance, and the actual GUI recording were
rerun. Wayland 200%/100%/150%/200% transitions and raw-output stress passed.
Fixtures and the owned compositor were stopped.
### Model economy and workflow lessons
Both agents started with short briefs and no conversation fork. Local session
`turn_context.model` records confirm Luna for implementation and Terra for review.
An earlier reviewer claim that it used Astra was an unsupported self-description;
the reviewer retracted it. Verify metadata at startup rather than after delivery.
The local cumulative counters below include cached input, repeated context, and
all focused follow-up turns; they are not unique context sizes or monetary bills.
The evidence snapshot is retained with the demo logs.
| Agent | Input tokens | Cached input (included) | Output tokens |
| --- | ---: | ---: | ---: |
| Luna implementer | 5,424,261 | 5,296,640 | 17,644 |
| Terra reviewer | 6,733,586 | 6,560,000 | 13,092 |
The first/last token events span about 17 minutes for implementation and 16 minutes
for review, including follow-up waits; active model time and monetary cost are not
available. Review produced concrete correctness and test-quality improvements,
but repeated socket-denied unit runs and large failure output expanded context.
Retain Luna/Terra defaults; reduce redundant validation output and route socket
checks to the authorized environment after the first denial. No measured cost
saving is claimed.
### Retained limits and next actions
The classifier in `src/client/handoff.zig` recognizes complete OpenSSH diagnostic
forms, not every SSH implementation, localization, or truncated message. `Reason`
retains its existing 120-byte ASCII line limit. Unrecognized text stays unknown
and therefore recoverable rather than being guessed to mean auth refusal. The
next shared diagnostic-format change owns expanding classification and must retain
negative-banner, fragmented-line, reconnect, and shutdown checks.
- [ ] Record this sprint's demo acceptance separately from any hands-on trial.
- [x] Obtain explicit approval before exposing this demo page/video at the private
`/ssh-followup/` Tailscale route. Following the initial automatic approval
rejection, the user explicitly authorized sharing ("Yes share"). The page is
published and HTTPS page/video range checks passed; existing routes are unchanged.
Sharing approval does not imply demo acceptance.
- [x] In the next authorized sprint, verify agent model metadata immediately after
startup and avoid rerunning a socket-denied suite in the same sandbox.
Completed at interaction-sprint startup; local socket checks used the known
authorized route directly.
## Native interaction ownership — debt sprint, 2026-09-05
The user authorized this sprint after discussing accumulated native TUI debt.
Implementation and independent review are complete. All required validation passed, including the complete CI retry. The actual
GUI recording is retained. The
[delivery record](docs/superpowers/plans/2026-09-05-native-interaction-debt.md)
contains the commands, evidence and retained limits. Demo acceptance remains
pending; advancing here did not retroactively accept the prior SSH recording.
### Results and cleanup
- `interaction.Controller` owns modes, held input and text suppression, menu
lifetimes, captured pending End, pointer resizing and intent saves. `frame.zig`
adapts SDL, measures geometry, synchronizes mouse capture and paints. Existing
controls, observation JSON, attachment identities and terminal layout remain
unchanged. Pane actions stays on prefix + p.
- Opening review needed no separate preparatory cleanup. Closing cleanup removed
the unused effects scaffold, shared the matching menu-key navigation mechanics,
and preserved j/k text in editors. Two direct controller regressions complement
the retained SDL tests; the reviewer found no unresolved correctness issue.
- `test/native_scale.py` promotes the previously temporary scale gate into the
repository, with explicit compositor endpoints, an owned headless output,
fixture cleanup and restoration of the original output scale.
- Native unit/integration, real old-daemon compatibility, five real OpenSSH
groups, Wayland 200%/100%/150%/200% transitions and raw-output stress passed.
Stress measured 105.7 MB over 30.3 seconds, with sampled input maxima of 55.4 ms
(shared daemon) and 55.5 ms (separate daemon), and frame p99 of 18.1 ms. These
are polling upper bounds on the recorded NVIDIA GPU compositor, not exact
latency or new macOS evidence.
- The initial full CI run timed out in the existing terminal host-picker test
waiting for `2> 1`. The unchanged isolated host group passed all 15 scenarios.
Its exact initial failure cause is unproven; the subsequent full CI run passed
without code or test changes. Both logs are retained.
- The retained 57-second actual GUI recording shows the final release with two
disclosed restart cuts and no audio. It demonstrates the unchanged interaction
behavior. The owned fixtures and compositor were stopped; no new Tailscale
payload was published.
### Delegation and lessons
The reused agents' session metadata confirmed Luna and Terra immediately at
startup. Luna returned a types-only seam and then an unwired controller; that
was insufficient for the authorized deliverable. Root completed the coherent
controller migration, and Terra independently reviewed the integrated result.
Review caught physical-key identity, prefix-priority and text-suppression hazards
in the preliminary proposal and requested direct tests for the final boundary.
Agent agreement on a narrower cleanup would not have completed the user's task.
The retained `interaction-evidence/agent-metadata.json` contains cumulative
counters for these reused sessions, including the previous SSH sprint:
| Agent | Input tokens | Cached input (included) | Output tokens |
| --- | ---: | ---: | ---: |
| Luna implementer | 9,046,762 | 8,871,680 | 26,521 |
| Terra reviewer | 20,543,291 | 20,118,784 | 22,763 |
These are repeated-context counters, not unique context sizes or a monetary bill.
No cost saving is claimed. For another substantial extraction, start with a fresh
short task context and a concrete ownership/method contract. Stop an unwired
partial handoff promptly; avoid repeated review polling while implementation is
still being written.
### Retained debt and next actions
- [ ] Record this recording's acceptance separately from the SSH trial and any
hands-on feedback; do not infer it from passing tests.
- [ ] The next painter/test-protocol change should assess moving observation hooks
out of `frame.zig`, preserving passive frame and state observations.
- [ ] A future recording-tooling package should promote the recorder/clip driver;
only the scale gate moved into the repository in this bounded sprint.
- [x] Investigate the terminal host-picker timeout if it recurs. The component
sprint below reproduced the ordering hazard and replaced the missing readiness
condition with an event-based wait in `test/e2e_09_hosts.sh`. No timeout grew.
- [x] Obtain authorization before the next production sprint. The user requested
another separation sprint aimed at independent daemon/GUI work, followed by
clearer code ownership. That authorization does not imply demo acceptance.
## Component separation — independent daemon and GUI work, 2026-09-05
The user authorized another separation sprint, followed by a clearer ownership
split. Implementation, closing review and all final delivery gates are complete,
including full CI after the fixture fix. The actual GUI recording is retained. The
[delivery record](docs/superpowers/plans/2026-09-05-component-separation.md)
contains the graph, commands and evidence. Recorded-demo acceptance is pending.
### Results and cleanup
- The new `native_core` module exclusively owns workspace, runtime, picker,
persistence and interaction. The frame/painter consumes its declared import.
No behavior or file placement changed; compatibility aliases keep the native
module's existing public surface available.
- `make native-core-test` runs without window/font libraries. `make native`
includes the core and frame/painter suites; their ReleaseSafe run passed 47
tests. `make daemon-test` and `make client-test` reuse the same artifacts as
the aggregate unit gate, without running unrelated components.
- Six disposable-snapshot probes proved the boundaries: broken GUI compilation
leaves daemon/core tests usable; broken daemon compilation leaves GUI tests
usable; core tests need no window-library package metadata. Matching negative
controls failed as expected. No poisoned source entered the working checkout.
- Opening assessment preserved the existing shared client facade and module
table; neither needed a broad rewrite. Closing cleanup removed a redundant
test alias and corrected source-ban/build comments. All core child files have
one source owner, and native tests explicitly retain both suites.
- The recurring terminal CI failure was a fixture race, not a native module
change: selecting row 2 immediately after Enter could use a stale one-session
poll and clamp to row 1. The fix waits for the newly born row itself, retains
the selected-row/holder assertions, and changes no timeout. The focused
15-scenario host group and subsequent independent full CI both passed.
### Validation limits and recording
Native integration (including real old-daemon compatibility), five real OpenSSH
recovery groups, high-DPI scale transitions and the actual GUI recording passed.
The initial stress run missed frame p99 at 20.176 ms; the previous release also
missed the same 20 ms budget on that compositor. A normal-logging compositor
repeat passed without budget changes: frame p99 18.992 ms before reopen and
18.246 ms afterward, sampled input maxima 55.5/55.4 ms for shared/separate
daemons, 104.6 MB over 30.1 seconds. The exact cause of the variation is unproven;
all results and renderer provenance limits are retained. The input measurements
are polling upper bounds, and no new macOS evidence is claimed.
The 56.8-second final release recording has two disclosed restart cuts and no
audio. Fixtures and the owned compositor were stopped. The retained local video
is `native-component-trial.mp4` beside this thread's other visualization artifacts;
no new sharing payload was published. Acceptance remains a user decision.
### Delegation and ownership
Fresh short briefs and immediately checked session metadata confirmed Luna for
implementation and Terra for review. Luna wired the core/frame source split and
repaired the test fixture; root owned build wiring, independent probes, delivery
gates and documentation. Terra caught the insufficient stale-row readiness wait
and reviewed the corrected event condition, build artifacts and ownership map.
Available cumulative counters for these sprint-specific agent sessions are below.
Cached input is included in input, not additive; counters are not a monetary bill.
| Agent | Input tokens | Cached input (included) | Output tokens |
| --- | ---: | ---: | ---: |
| Luna implementer | 3,801,635 | 3,675,648 | 10,737 |
| Terra reviewer | 3,593,717 | 3,406,080 | 10,881 |
The [ownership proposal](docs/component-ownership.md) recommends daemon, native
GUI and shared wire/client responsibilities first. GUI policy and rendering have
an internal seam when separate owners become useful. Shared build/release and
wire-contract changes still need coordination. No people or CODEOWNERS rules
were invented, and mixed directories are called out explicitly.
### Next actions
- [ ] Record acceptance of this demo separately from earlier pending recordings
and hands-on feedback.
- [ ] Assign people or agents to the proposed ownership areas when those names
are known; use separate worktrees and the focused gates for internal work.
- [ ] Keep shared wire/lifecycle changes coordinated across affected frontends.
Independent compilation does not make their semantics independent.
- [ ] If revisiting performance measurement, distinguish frame preparation from
compositor swap waiting and record display/logging conditions before drawing
conclusions from a narrow frame-budget miss.
- [ ] Promote the general recorder/clip fixture in a future tooling package; the
repository scale gate already removed one temporary-script dependency.
## Component ownership handoff — 2026-09-05
The user asked to continue after the separation sprint. The remaining ownership
handoff is now actionable in `docs/component-ownership.md`: role edit scopes,
worktree prerequisites, focused commands, review handoffs and examples of
independent daemon work versus shared-contract changes. These role briefs can
be used for people or task-specific agents; no named assignments or CODEOWNERS
enforcement have been invented.
Opening cleanup corrected the stale GUI module table in `CLAUDE.md`. Closing
review preserved details that a directory-only split would miss: daemon
`main.zig` belongs to the shared dispatcher build, browser files live under
`src/client/`, and daemon tests do not execute every dependency's test suite.
Component owners can edit their own tests. Shared fixtures and changes to wire
or lifecycle meaning require coordination across the affected components.
Reused session metadata confirmed Luna implementation and Terra review. Root
independently checked the module roots, source-ban invocation, Make recipes and
ignored dependency paths. Reviewer corrections retained Make's macOS SDK setup
and required real native integration evidence for pane lifecycle changes.
Generated QUIC dependencies must not be rebuilt or cleaned concurrently through
a shared directory. The guide keeps existing compilation-isolation evidence
and its limits; this documentation change makes no new runtime claim.
Full `make ci` passed: terminal integration, all ten agent scenarios and
throughput, alongside its source/unit checks. The final documentation diff is
clean and the focused Make commands match the documented gates. Native source
and build wiring are unchanged, so the prior sprint's native evidence applies.
Validation logs and available cumulative agent counters are retained under
`ownership-evidence/` beside this thread's visualization artifacts. Those
counters include the agents' earlier separation work and cached input; they
are not incremental task costs. No new GUI recording is needed for this
documentation handoff, and previous demo acceptance remains pending.
### Next actions
- [x] Make the component proposal usable as bounded owner task briefs and
correct the stale module table.
- [ ] Assign people or task-specific agents when concrete work is selected;
start internal daemon and GUI tasks in separate worktrees with these briefs.
- [ ] Record user acceptance of the existing recordings separately. Continuing
the ownership handoff does not imply their acceptance.
## Native chord ergonomics — 2026-09-05
Hands-on feedback identified an unnecessary second chord after choosing split
direction, and a progress menu too brief to read on End. Prefix + v/b now opens
the host picker directly, keeping the selected direction and cancellation
semantics. End progress uses the originating pane header; shared-session refusal
still offers explicit force with Cancel selected first. Existing save warnings
retain header priority. The [delivery record](docs/superpowers/plans/2026-09-05-native-chord-ergonomics.md)
contains the validation and recording evidence.
The existing controller boundary made this a GUI-only change. Opening cleanup
was unnecessary; closing cleanup removed the obsolete progress-menu variant and
combined the shared v/b/Enter picker path. Video inspection caught the remaining
extra-chord header hint; review caught the distinction between insertion and
replacement pickers before final delivery. Stable attachment/request identity,
duplicate-End protection and late-reply modal ownership remain intact.
Luna implemented interaction/frame changes; Terra reviewed them adversarially.
Recorded metadata confirmed the models. Root updated integration fixtures,
independently observed delayed daemon replies and framebuffer pixels, and ran
the delivery gates. Final native units (50), native integration, full CI,
Wayland lifecycle/scale checks and raw-output stress passed. The stress result
remains close to the existing frame budget; it is not evidence of a speedup.
Available cumulative and start-snapshot-difference counters are retained with
cached input identified; they are not monetary costs.
The 23.8-second GUI recording shows the actual revised interactions. The user
explicitly approved its tailnet publication and confirmed ownership after
automatic review rejected the new payload; existing routes were preserved.
Playback and range responses were verified. Publication is separate from
acceptance of the ergonomic changes.
### Next actions
- [x] Record acceptance or further hands-on feedback for these chord changes.
The user said “this is excellent” and authorized merging the native branch.
The current result is accepted; no separate hands-on trial is inferred.
- [ ] When revisiting header layout, consider showing save failure and pending
End together; keep save errors prominent in narrow panes.
- [ ] A future recorder package should include its PTY registration and absolute
compositor address setup, avoiding the two fixture mistakes caught here.
## Native appearance — hardcoded theme — 2026-09-05
The first appearance slice centralises native colours and selects a warm dark
trial theme across terminal defaults, the indexed palette, cursor, headers,
dividers, bell feedback, pickers, recovery menus and the empty workspace. Explicit
application RGB remains exact. The original appearance remains `theme.legacy`
for the eventual no-config default. Config, font selection and Nerd Font
verification are the next slice; ligatures require a later scope discussion.
The [appearance delivery record](docs/superpowers/plans/2026-09-05-native-appearance.md)
contains acceptance scenarios and evidence. Native text selection is not
implemented today, so this slice themes existing popup selection only. An early
brief incorrectly called the baseline cursor an underline; independent review
checked the baseline and preserved its actual full-cell block geometry.
Opening inspection found no necessary refactor outside the theme extraction.
Luna implemented native theme/painter changes; Terra reviewed independently;
root owned real integration, validation, recording and documentation. Recorded
turn-context metadata confirmed the requested models. Review caught an unused
bell foreground and redundant chrome fields, which were fixed before delivery.
Closing review found no remaining duplicate colour paths or new configuration
scaffolding. The trial's source selection is intentional until config arrives.
The new real-framebuffer acceptance uses three panes, including off-origin
content, independently specified expected colours and nonforcing retained-frame
reads. It covers all 16 ANSI entries, extended indices, inverse defaults,
explicit RGB, cursor/focus/dividers, menu rows, bell expiry, empty workspace,
independent PTY dimensions and surviving detached sessions. An old native gate
assumed ANSI red was highly saturated; three glyph-placement fixtures now ask
for explicit RGB, keeping colour policy in the separate appearance oracle.
Release native units/core, native integration, full CI, offscreen and 200%
Wayland appearance, and real Wayland 200% → 100% → 150% → 200% scale transitions
passed. Offscreen raw-output responsiveness passed. NVIDIA and AMD headless
compositor comparison details, including the NVIDIA frame-budget miss, are
retained in the delivery record. The user correctly challenged treating an AMD
result as sufficient for their NVIDIA setup. A headless render device needs no
connected display, but cross-device results do not establish NVIDIA performance.
Root added a matched baseline/theme comparison on the same NVIDIA compositor;
one theme run passed and another exceeded the unchanged 20 ms gate. CPU paint
timings overlapped; no consistent theme penalty was established, but the strict
NVIDIA timing result remains unresolved. The sprint is not marked accepted.
No physical display configuration was
changed and no new macOS validation is claimed.
The 27.2-second continuous recording shows the actual GUI on an isolated NVIDIA
Sway compositor at 200%, with no audio or restart cuts. Root checked the preview
and decoded popup frame. The video, screenshot, scripts, logs, reports and
available cumulative agent counters live under `dist/appearance-slice1/` in this
worktree. Counters identify cached input as included, and are neither an
incremental slice cost nor a monetary bill. No external publication occurred.
Recorded demo acceptance was subsequently given on 2026-09-05, as noted below.
### Retained limits and next actions
- [x] Record the user's review of the appearance demo separately from test
success: the recorded demo was approved on 2026-09-05; config/fonts follows.
- [x] Completed in slice 2: restore `theme.legacy` as the no-config default and
explicitly select a trial theme in appearance fixtures. Keep CLI precedence
and font-size units consistent with the agreed Ghostty-compatible subset.
- [x] Verified in slice 2: installed Nerd Font Mono symbols; font fallback
and cross-cell ligatures are not implied by choosing a family.
- [ ] Next renderer/offscreen-fixture work: investigate unpainted 0xaa capture
regions after offscreen surface growth if dynamic resizing is needed there.
The final appearance specimen fits baseline panes; real Wayland resizing
passed. The cause of the initial offscreen observation is unproven.
- [ ] Future compositor fixtures should set the required geometry at mapping.
The stress fixture expects 960×600; a demo mapping rule for 1000×650 raced an
early resize command and stopped the first stress attempt before workload.
- [ ] Keep NVIDIA as the relevant performance validation target for this user.
The stress frame metric includes test readback and vsync; preserve failed
results and distinguish a matched baseline comparison from an absolute pass.
## Sprint review-page handoff — 2026-09-05
The user asked to retain the established webpage handoff with achievement notes
and an embedded demo, and explicitly requested updating the sprint document.
`docs/native-sprint-workflow.md` now requires that page as the primary review
link for each functional slice: goal, achievements, recording, controls/review
prompts, validation and open issues, next scope and acceptance state. The source
and assets must be retained and page loading, metadata and seeking verified.
The appearance page lives at `docs/demos/native-appearance-slice1.html`. Luna
created it; Terra reviewed claim accuracy and the handoff requirement. Root
verified actual Chromium playback/seeking, desktop/mobile layout, canonical
redirects and HTTP ranges. The page keeps the NVIDIA timing limit unresolved.
Automatic approval review rejected publishing this payload through Tailscale;
specific user approval was requested while the completed page remained local.
Native source is unchanged, so existing functional validation applies.
- [x] Review webpage handoffs retained in slices 2 and 3, with validation limits
and acceptance status beside the recording. This remains the standing workflow.
- [x] Record the verified private URL and route-specific teardown in the
appearance plan. The user authorised sharing sprint pages/assets on their
own tailnet as the standing handoff. The recorded demo was then explicitly
approved (“I approve the demo! Looks good.”). NVIDIA timing remains separate.
## Native appearance: config and fonts — 2026-09-05
Delivered font-family and fractional font-size config with explicit CLI precedence,
restart application, legacy defaults, and installed Nerd Font Mono rendering.
The family remains in use through DPI cache rebuilds; no hot reload, fallback,
color-file loading or ligatures were added. The user approved the recorded demo
on 2026-09-06 (“lgtm, continue to next sprint”).
Opening cleanup found the font/cache boundary ready. Closing cleanup removed
early rounding and redundant parser state, rejected malformed/duplicate config,
and made font matching verify the actual loaded face. The Luna/Terra pair found
lifetime, precedence and diagnostic problems; root integration caught compile
errors and a Fontconfig spacing trap that agreement alone had missed. Fontconfig
can echo a requested monospace property for a proportional face. FreeType's
fixed-width flag is also absent on some genuine monospace faces (Noto Sans Mono);
final validation uses that flag or equal unscaled ASCII advances. Native baseline
units and an actual installed proportional family exposed both mistakes.
Final native build/units, native integration, full CI, offscreen and NVIDIA font
acceptance passed. Three panes on two daemons kept shell PIDs and kernel PTY sizes
across restarts; raster signatures and a font-file glyph oracle verified Nerd Font
icons and scaling. NVIDIA stress passed with default/configured font final frame
p99 19,473 / 18,825 us; input upper bounds 70.3 / 55.5 ms. Tests were separate from
recording. Prior failed NVIDIA timings remain retained, not retroactively passed;
no physical display or new macOS validation is claimed.
The 33.2-second actual GUI demo has two documented restart cuts, includes the
invalid-config failure path, and is embedded in the private review webpage. Its
first error-example attempt inherited the daemon shell's separate config path;
the recorder now passes the intended XDG_CONFIG_HOME explicitly to the nested
client. Existing private routes were preserved. Artifacts and model-verified
cumulative agent counters (cached input included, not incremental cost) live in
`dist/appearance-slice2/`; the appearance plan lists the evidence and teardown.
- [x] Restore legacy defaults and explicitly select the trial palette in fixtures.
- [x] Verify installed Nerd Font Mono, real restart survival and selected-family DPI.
- [x] Keep the webpage/video as the primary private handoff.
- [x] Record slice 2 demo acceptance separately from tests; theme files authorised
on 2026-09-06.
- [x] Completed in slice 3: extend the strict parser intentionally and document the supported
Ghostty subset, defaults → theme → config → CLI precedence, and missing/default
behavior. Keep font-family lifetime and late raster rounding intact.
- [ ] Renderer follow-up retains the earlier intermittent NVIDIA budget miss and
offscreen surface-growth readback issue; a passing run does not settle either.
- [x] Scope decision recorded on 2026-09-06: defer ligatures for now and review GUI/TUI parity.
## Native appearance: Ghostty theme loading — 2026-09-06
Slice 2's recorded demo was approved and theme-file loading authorised. The user
rebased the worktree onto the shared GUI build/install/release targets; the demo
pair now uses `make install` with both staging and install destinations isolated
under the worktree. Opening inspection found no preliminary refactor needed.
Implemented theme lookup by config-directory filename or absolute path, strict
color/palette parsing, theme/config/CLI precedence, diagnostic warnings for
unsupported theme keys, and derived chrome for light/dark palettes. No-config
and font-only settings retain legacy appearance. The user subsequently deferred
ligatures on 2026-09-06 to focus on GUI/TUI parity. Closing cleanup removed a no-op callback, unused alias, and duplicate
palette index storage. Review found packed-channel overflow, missing cursor
fallback, loose lexical parsing, wrong diagnostic wording, and a contrast
calculation that returned different colors from those it measured. Root fixed
the final contrast mismatch and added regression checks; real pixels verified
the integrated behavior after agent review.
Native units/core, full native integration, offscreen theme acceptance, NVIDIA
theme/DPI acceptance, and retained scale/resize acceptance passed. Final delivery
validation and recording are complete; the user approved the recorded demo on
2026-09-06 (“LGTM”). No separate hands-on trial is inferred. The first CI attempt exposed a
baseline QUIC stop timeout; the focused retry passed, but source inspection found
that daemon shutdown quietly freed QUIC connections without sending a goodbye.
Separate prerequisite commit `693d038` sends CONNECTION_CLOSE before quiet
client teardown. Focused checks and full CI/native integration passed afterward. Retain the first failed
CI log and avoid calling the intermittent result a deterministic reproduction.
Both final NVIDIA stress runs passed, with default/configured-theme frame p99
17,842 / 17,814 us and sampled input upper bounds 55.4 / 70.3 ms. The unchanged
limits are 20 ms and 250 ms; input polling adds up to 5 ms. The default run uses
`make native-stress`'s paired build artifacts; the configured Latte/Nerd Font run
uses the install target's paired ReleaseSafe artifacts. These are acceptance
results, not a default-vs-configured performance comparison or speedup claim.
Historical NVIDIA misses remain retained. No physical display or new macOS
validation is claimed.
The review page embeds a 30.4-second actual NVIDIA Sway recording at 200%, with
restart cuts at 12.4s and 24.0s. Unmodified upstream Catppuccin Mocha/Latte files,
source URLs and hashes are retained. The first recording inherited dark text on
its explicit RGB background sample under Latte; the final specimen requests
white RGB text too. That correction changes demo output only. Root inspected
actual recorded frames and the preview. Artifacts, logs, scripts and verified
agent-model/counter metadata are in `dist/appearance-slice3/`.
- [x] Load named and absolute Ghostty theme files with documented subset and
defaults → theme → config → CLI precedence, preserving font behavior.
- [x] Validate light/dark terminal and chrome pixels, session survival, PTYs,
startup failures and warnings, and final CI/native/NVIDIA gates.
- [x] Recorded slice 3 demo approval on 2026-09-06, separately from checks.
- [x] Recorded the user’s decision to defer ligatures and review GUI/TUI parity.
- [ ] Retain the earlier NVIDIA frame-budget and offscreen growth observations
for a renderer follow-up; this sprint's passes do not settle those causes.
Private review page: https://charizard.folk-amberjack.ts.net/appearance-slice3/
HTTPS, byte ranges, browser seeking/playback, desktop/mobile layout and earlier
routes passed verification. Owned browser/compositor fixtures were stopped; only
the allowlisted page server remains. The appearance plan records route-specific
teardown. The worktree contains the prerequisite fix and the appearance slice
as separate commits; the original checkout's staged user file remains untouched.
## GUI/TUI parity and carry-forward audit — 2026-09-06
The user approved appearance slice 3, deferred ligatures, and requested the GUI/TUI
gaps and remaining retro items. This is a read-only code/issue audit plus delivery
record cleanup, not implementation of the next feature. Historical entries above
remain evidence of their original status; this section consolidates the current
backlog. Duplicate appearance checkboxes now point to their completed slices.
### Functional gaps from git-collab
| Issue | Current gap and evidence |
| --- | --- |
| `8b16e26b` mouse/wheel/selection | Visible-text drag selection and desktop copy are now delivered on the text-selection branch (demo acceptance pending). Wheel/history navigation, application mouse forwarding, extended selection gestures and GUI paste remain. See the text-selection delivery entry below; the user selected this slice before wheel scrolling. |
| `f3cf5785` SSH askpass | No native prompt UI for passphrases or first-use host-key confirmation. TUI owns the askpass listener/prompt flow; shared askpass support exists. Earlier SSH failure classification did not implement prompts. |
| `50ca9ba5` agent forwarding | No GUI `-A` policy or agent relay. Picker targets disable forwarding; functional relay handling remains in the TUI pump. |
| `fb4a0ee4` prediction | No native local typing prediction overlay. The predictor remains TUI-local; sharing must preserve the authoritative replica. |
| `0b725c82` End session | Partly delivered: pane End, pending identity and shared-holder force confirmation exist. Ending a selected session directly from the picker is absent; discovery currently supports only list/create. Ordinary shell exit retains an exited pane, so reconcile the ticket’s exit-removal wording with that existing UX when scoping the remainder. |
| `d61fdc4c` macOS | Native build, launch, integration and release evidence on an actual Mac remain missing. The cross-OS scripts have no native gate; Linux/NVIDIA evidence does not cover this. |
| `08ff372f` release/install | Partly delivered: Make installs and bundles both binaries. Fresh-machine dynamic dependency installation, actionable setup instructions and validation remain open. |
Parent `94ed7dfd` keeps terminal-wall retirement blocked until all seven gates
land. The browser retains its own layout. Do not close partly delivered tickets
on the strength of their stale descriptions. No git-collab issue content changed.
Recommended next functional slice: wheel scrolling in the pane under the pointer,
including unfocused/off-origin panes and app-mode wheel behavior. Demonstrate
three panes, independent scroll positions, return to live output and high-DPI
pointer coordinates in the actual GUI. Selection/copy follows separately. The
macOS gate can be investigated independently; this recommendation does not waive
it or authorize terminal-wall removal.
### Remaining retrospective work
- Renderer/measurement owner, next performance investigation: explain intermittent
NVIDIA frame-budget misses, separating preparation/readback from compositor
swap waiting. Later passes do not establish the cause of earlier failures.
- Renderer/fixture owner, next offscreen resizing change: investigate unpainted
`0xaa` readback after surface growth. Real Wayland resizing passes; offscreen
growth remains unproven.
- Painter/test-protocol owner, next change at that boundary: assess extracting
observation hooks from `src/gui/frame.zig`, preserving passive observations.
- Tooling owner, next recorder package: promote the reusable recorder/clip driver,
including PTY registration, explicit compositor addresses, isolated XDG paths
and geometry at mapping. The scale gate is already retained in the repository.
- GUI owner, next header-layout change: consider displaying save failure and
pending End together, with save errors still readable in narrow panes.
- Shared client owner, next SSH diagnostic change: preserve unknown/recoverable
handling for unrecognized, localized or truncated diagnostics; current
classification is bounded to supported complete OpenSSH forms.
- Delivery lead: older SSH, interaction-ownership and component-separation
recordings lack separate recorded approvals. These are historical review
bookkeeping, not known implementation failures or a new advancement gate.
Appearance slices 1–3 and the chord changes are approved.
Assign concrete owners when work is selected, using the existing component
briefs. Shared wire/lifecycle review, NVIDIA validation and private webpage/video
handoffs remain standing practices, not separate unfinished features. Ligatures,
font fallback, tabs and pane rearrangement remain outside the delivered scope;
hot reload is intentionally excluded.
## Appearance review and merge handoff — 2026-09-06
The user requested branch review against main, fixes, merge and a new worktree
for GUI/TUI parity. Independent CLI/config/theme and font/render reviews found no
actionable production regression; root reviewed the QUIC prerequisite and build/
test integration. Corrected two stale documentation claims: native config/theme
module ownership and the QUIC accessor's use during teardown. No runtime behavior
changed. Full CI, final check, ReleaseSafe native units/core and native integration
passed; prior actual NVIDIA demo/scale/stress evidence applies to unchanged runtime
behavior, with historical limits retained. The
[review record](docs/superpowers/plans/2026-09-06-appearance-merge-review.md)
records scope and evidence.
The next worktree is `gui-wheel-scrolling`; its
[bounded sprint plan](docs/superpowers/plans/2026-09-06-native-wheel-scrolling.md)
starts issue `8b16e26b` with wheel history and application wheel input. It carries
forward stale-reply, independent-pane, high-DPI, passive-observation and private
webpage/video requirements. Implementation has not started. Ligatures remain
deferred. Retain the appearance worktree's live review pages and preserve main's
staged user retro file when fast-forwarding.
## Wheel sprint opening — ownership and duplication cleanup, 2026-09-06
The user asked to review duplication, hexagonal architecture opportunities and
refactoring, then clarified that font validation should belong to fonts rather
than either input adapter. `font_options.zig` now owns the shared point-size
rule. CLI/config callers retain their diagnostics; installed-face/monospace
validation stays in `font.zig`. The first proposal shared the helper from config;
that removed repetition but assigned the rule to the wrong owner. Removed a
redundant empty-family check already enforced by the text parser.
Font settings, config and theme source now belong to the window-free native core.
The native renderer consumes core theme values and preserves its existing public
aliases. Luna implemented the bounded change; Terra reviewed ownership, error
mapping and module/test reachability. Closing review removed a stale comment
and retained the upper-limit rationale with its new policy owner. No extra
transport or filesystem abstraction was introduced for a single caller.
Independent dependency probes hid GUI package metadata: all 29 native core tests
passed, and the matching full GUI build failed on missing SDL3 as expected.
Native build/units, full native integration and full CI passed.
Evidence is in `dist/wheel-opening-cleanup/` in the new worktree. The first native
integration launch overlapped the check stage's temporary source-ban mutation;
it failed before building and passed after that stage finished. Both logs are
retained. The native workflow now explicitly serializes other builds against
that stage. Existing approved appearance recordings remain the visual baseline;
this opening refactor adds no visible feature or performance claim.
Carry forward into wheel implementation: semantic wheel intent crosses the
runtime/pump boundary; the pump consumes available mode frames before deciding
history versus application input. Do not sample mutable pump modes in the GUI
and queue pre-encoded bytes. Keep history/live snapshot ownership and reply
correlation explicit, share actual semantic helpers instead of copying the TUI
interaction core, and inject real SDL wheel events in the retained test adapter.
These are implementation constraints, not completed wheel behavior.
## Text selection opening cleanup — 2026-09-06
The user selected text selection as the next sprint using the updated skill.
Wheel behavior remains unimplemented; its plan is deferred. The reuse map in
`docs/superpowers/plans/2026-09-06-native-text-selection.md` identifies existing
drag state, daemon extraction and shared request correlation before feature edits.
Moved the pure TUI selection module and all its tests to `client.selection`;
both frontends can consume one gesture model. Deleted the old TUI source path
and updated existing callers without changing wall behavior. Luna implemented;
Terra independently found no opening-cleanup defect. The first focused client
test attempt was sandbox-blocked on local sockets; the required escalated
`make check` covers those tests. Logs are in `dist/text-selection/`.
Feature work owns the remaining snapshot/request freshness checks and SDL
clipboard adapter. Review identified a send-time race in addition to UI
cancellation: the pump must compare the displayed sequence when sending and
receiving. The existing protocol does not carry a server sequence precondition;
observed output changes can be rejected, but atomic copying of a historical
frame is not promised. A protocol-level version guard is retained for the next
selection-consistency change if that stronger guarantee is required.
## Native text selection delivery — 2026-09-06
Implemented visible text drag selection and desktop copy on release. The user
selected this before wheel scrolling; wheel remains deferred and unimplemented.
The shared selection model was moved once in opening commit `b0a68b1`; both
frontends consume it. Daemon extraction and the existing wire remain the owners
of Unicode, soft wraps, trimming and wide-cell copy semantics.
The reuse map guided implementation. Closing cleanup replaced repeated source
version fields/rules with `SelectionVersion`, centralized pump invalidation,
removed redundant held-range storage and the painter's duplicate span type.
Queued request tickets cancel work before transmission; one owned result and a
bounded deadline cross into the SDL clipboard adapter. Core rules remain free
of window/font libraries. No new runtime dependency or protocol message was
introduced. Root completed shared pump cleanup/tests after Luna's initial
integration; Terra independently reviewed the final production diff.
Review and real checks caught coordinate/history overflow, cross-pane subtraction,
mouse capture remaining after release, lost divider release coordinates, stale
press-version replacement, mode/reconnect invalidation, timeout locking,
allocation-failure ownership and empty-copy behavior. All actionable production
findings were resolved. Initial focused test claims covered existing tests only;
closing work added explicit transport and GUI high-history cases before delivery.
Full CI, client/native units/build, native integration, core-without-GUI metadata,
real NVIDIA Wayland pointer/clipboard checks and both selection-specific and
retained DPI gates passed. Separate NVIDIA stress passed with frame p99 19,267 us
and sampled input upper bound 65.3 ms; historical frame-budget misses remain
unexplained. Logs and earlier failed fixture attempts remain in
`dist/text-selection/`. No macOS or performance improvement is inferred.
The 24.4-second continuous recording uses real Wayland pointer motion and reads
clipboard contents with a separate client. SDL injection alone lacked a valid
Wayland input serial; the retained pointer adapter now makes that boundary
explicit. Clipboard publication is asynchronous, so the independent reader waits
for offers to arrive. An early recorder failure skipped cleanup; the recorder
now guarantees fixture teardown and root stopped only that failed fixture's
owned processes. Private page: https://charizard.folk-amberjack.ts.net/text-selection/ .
Demo approval remains pending; automated success is not user acceptance.
Carry-forward actions and ownership:
- Next selection-consistency sprint: the existing wire has no source-version
precondition at the daemon. Observed changes cancel copying, but an atomic
historical-frame copy would require coordinated wire/frontend work.
- Next mouse-parity sprint: implement wheel/history, then assess edge autoscroll,
word/line/rectangular selection and GUI paste as separately scoped behavior.
Application mouse forwarding remains open under issue `8b16e26b`.
- Next renderer follow-up: investigate earlier NVIDIA budget misses and offscreen
growth artifacts. Current passes do not settle their cause.
- Next recording/tooling change: consider promoting the retained C virtual-pointer
helper and recorder assets; the Python input adapter is now shared by tests and
this demo, while source/protocol/binary provenance remains with the artifacts.
- Next frame/test-protocol change: assess broader extraction of passive hooks;
this slice added one read-only clipboard observation, not a second input path.
The final private page passed HTTP range, desktop/mobile layout, playback and
seeking checks; all three appearance pages still return success. The final
retained recorder also passed after explicitly focusing the owned window before
its first pane click. Offscreen selection was rechecked after the Wayland driver
addition. Browser and compositor fixtures are stopped; only the allowlisted
loopback page server (PID 3384909, port 18774) remains. The main checkout's staged
`RETRO.pre-native-merge.md` remains byte-for-byte unchanged.
### Acceptance teardown and application scrolling follow-up
The user requested teardown after demo acceptance. Removed the three accepted
appearance routes and stopped their verified page-server processes; retained
their recordings and page sources. Only the text-selection route remains pending
review, and its page still responds successfully. The maintained sprint skill
and native guide now require this cleanup on acceptance, including verification
and preservation of unrelated services. Evidence:
`dist/text-selection/accepted-demo-teardown.json`.
A focused probe ran real Vim and less in isolated daemon PTYs with the native
offscreen GUI. In both apps, keyboard scrolling clears the GUI highlight while
preserving text already copied on release. Scrolling during a held drag cancels
it without overwriting the clipboard. Framebuffer and clipboard observations
passed; all probe processes were closed. This does not add wheel scrolling or
application mouse forwarding. Evidence and the rerunnable probe remain under
`dist/text-selection/app-scroll*` and `check-app-selection.py`.
### Hands-on copy shortcut — 2026-09-06
The hands-on review found Ctrl+Shift+C reached the PTY as Ctrl+C. The SDL adapter
now recognises the copy chord and the controller consumes it before terminal
input, even with no selected range. Copy on release and explicit copying share
one versioned request queue. Highlight and stale-attachment rules remain in the
controller; extraction and clipboard writing keep their existing owners. The
small cleanup removed an unnecessary forwarding helper. No new module,
dependency or wire message was introduced.
Luna implemented and Terra reviewed. Root caught a modifier-mask mistake that
required both left and right modifiers simultaneously; the final adapter tests
cover all four physical Ctrl/Shift combinations and Alt/GUI/Mode exclusions.
The real-PTY regression independently records SIGINT: shortcut copy during a
held drag, after release and without a selection leaves the process alone;
ordinary Ctrl+C still interrupts it. Root also corrected test ordering races by
waiting for actual highlighted pixels before releasing output or injecting the
shortcut after Wayland pointer input. Earlier failures remain in the logs.
Full CI, native integration, native/core units, full offscreen and independent
Wayland clipboard/scale checks passed. The user confirmed copying works in the restarted review GUI. The new
26.4-second continuous recording demonstrates copying before mouse release and
independent `wl-paste` output. Its pointer events come through Wayland; the copy
chord uses SDL event injection. Original footage is retained separately.
The initial hands-on launch used default colors because the user's mux config
does not exist; prior demonstrations used isolated configs. Relaunched with the
recording's explicit appearance flags. Next hands-on launch: reuse the recorded
appearance arguments in `dist/text-selection/hands-on-gui.json`, and distinguish
demo config from persistent user config when describing the launch.
The user reached for paste but agreed it can remain deferred. They clarified
their mouse-selection example was Claude Code, whose fullscreen mode requests
mouse reporting and displays its own copy toast. Alternate-screen state alone
does not confer mouse ownership. The TUI's `Core.forward` branches on `appMouse()`;
the GUI currently owns drags locally. `session_pump.onFrame` also skips validated
application `clipboard_set` effects. The next mouse/clipboard parity slice must
assess both application mouse forwarding and application clipboard requests,
alongside GUI paste and copy feedback. See the upstream explanation at
https://code.claude.com/docs/en/fullscreen#keep-native-text-selection .
Confirmation of copying is hands-on feedback,
not acceptance of the whole sprint or authorization to end daemon sessions.
The user confirmed Shift+drag belongs to the overall mouse feature. It is now
required acceptance for the application mouse/clipboard slice: force native
selection despite application mouse reporting, retain gesture ownership through
release and modifier changes, and prevent reports or text leaking across panes.
The wheel plan records the remaining order: wheel/history first, application
mouse/clipboard next. The latter slice's planner owns carrying these criteria
into implementation, tests and the demo; GUI paste remains deferred.
## Native wheel scrolling — 2026-09-06
Implemented the authorized next GUI/TUI parity slice: wheel over shell history,
mode-aware alternate-screen arrows, negotiated application wheel reports and
selection/copy from displayed history. Three panes on two daemons retain separate
scroll positions and fractional remainders. Wheel does not change keyboard focus;
menus, headers, dividers and command mode consume it. Application click/drag,
application clipboard writes and the required Shift+drag override remain next.
The controller owns geometry and gesture policy; the runtime checks attachment
identity; the shared pump owns terminal modes, wire ordering and history memory.
History uses the existing request/row decoder and a separate display grid, never
a second replica. One outstanding fetch remains as a cancelled tombstone until
drained, including across same-wire resync. New connections reset it; timeout
reconnects. Grid and displayed origin are captured together. Output refreshes
history while retaining its distance from live, and stale text cannot be copied.
Luna implemented the GUI input seam and pure wheel encoder; root integrated the
pump/runtime and real-boundary tests. Terra reviewed correctness and ownership.
Closing cleanup removed a duplicate receive loop and hand-written UTF-8 encoding;
standard key/Unicode encoding stays with its existing owner. No dependency or wire
message was added, and frozen TUI behavior is unchanged. Production growth is
concentrated in bounded history lifetime and semantic routing; no generic adapter
framework or separate module was needed.
Review and checks caught SDL wheel-coordinate fields, unrelated-selection
cancellation, same-origin stale replies, history/live origin confusion, QUIC
mailbox batching and a deleted pane stealing another pane's fractional remainder.
Focused tests cover wire ordering, resync, resize, timeouts and legacy coordinate
limits. Full CI and native integration passed on the final source. Real NVIDIA
Wayland wheel/clipboard checks pass at 200%, 100%, 150% and 200%; the retained DPI
resize gate also passed. Core tests run without GUI package metadata.
A test application initially read a partially rewritten mode-control file and
crashed; atomic replacement fixed the fixture. Earlier failed logs are retained.
Draft test snippets were not treated as validation: root replaced incorrect
fixture assumptions with tests exercising the production wire and mailbox.
Next test author: verify fixture preconditions and assert the named behavior;
a timeout test must exercise expiration, not merely compare the current clock.
The local webpage and continuous actual-GUI recording show history scrolling,
copying a history row through an independent clipboard reader and scrolling real
less without changing keyboard focus. Desktop/mobile playback and seeking passed.
Evidence is retained in `dist/wheel-scrolling/`; source is
`docs/demos/native-wheel-scrolling.html`. User acceptance is pending.
The user clarified delivery preferences: demos remain required; serve them on
localhost by default. Publishing is optional only when explicitly requested,
without routine prompts. The maintained skill and native workflow now say this
and no longer embed a specific publishing provider or standing-publish step.
The attempted remote publication was rejected by automatic approval review; no
new remote route was created. The local page is the handoff. Preserve earlier
services awaiting review and stop this page's owned server once accepted.
Open work and ownership:
- Renderer follow-up: investigate draw/swap timing at 60 Hz on NVIDIA. Initial
current build frame p99 was 20.199 ms, previous-release comparison 21.449 ms,
and current comparison 22.244 ms against the 20 ms limit. All input-response
samples passed the separate 250 ms bound; the current comparison's largest
observed upper bound was 98.4 ms with 5 ms polling. These are mixed historical
builds under the same conditions, not a speedup or no-regression claim. Keep
the failed logs and the pre-existing offscreen-growth issue open.
- Next shared-client scheduling change: a continuously readable stream can defer
wheel input and following FIFO messages until ready mode frames are drained;
continuous output may postpone a safely selectable history refresh. A finite
protocol ordering boundary is the trigger if this is encountered; do not drop
input or silently copy stale rows.
- Next application mouse/clipboard slice: Shift+drag must force native selection
through release and modifier changes; ordinary application gestures use pane
coordinates. Handle validated application clipboard writes. GUI paste remains
separately deferred.
- Next portability run: repeat real desktop clipboard, wheel and DPI checks on
macOS. Linux success is not macOS coverage.
Final-source timing passed at frame p99 18.745 ms and sampled input upper bound
65.3 ms. The earlier misses remain evidence for renderer follow-up, not discarded
attempts or a performance-improvement claim. The final recording is 27 seconds.
The localhost page is http://127.0.0.1:18776/wheel-scrolling/ ; publishing is no
longer a pending action under the clarified workflow. Owned recording/browser
and compositor fixtures are stopped after validation; the local review server
remains pending acceptance.
### Wheel selection feedback — 2026-09-06
Hands-on feedback corrected the initial cancellation policy: a completed
highlight must follow selected text through viewport scrolling, including
scrolling away and back. The pump already distinguishes absolute source rows
from the viewport origin. Removed the three viewport-only invalidations and
made input invalidation explicit in the mailbox; no new production state,
modules or dependencies were needed (four fewer production lines).
Luna implemented the pump change; Terra independently reviewed freshness and
input/resize/reconnect guards. Root corrected the regression fixture's history
setup and verified actual pixels and independent Wayland clipboard reads.
Held selection keeps its original anchor, with pointer motion/release resolving
the endpoint in the current viewport. This intentionally permits extending a
selection through scrolled history.
The user requested hands-on review instead of a new demo recording for this
feedback fix. The existing recording is retained and labelled as preceding this
change. Demo acceptance remains pending.
Lesson for the next mouse slice: distinguish source validity from viewport
position; reuse the existing absolute selection coordinates. Keep the required
Shift+drag override in that slice's acceptance criteria.
Validation: client/native unit tests and the full native integration gate pass.
Real NVIDIA Wayland wheel/selection checks pass all ten checkpoints at the
retained scale transitions; the separate ten-checkpoint copy suite also passes,
including stale output, delayed replies, resize and detach. Logs are retained as
`dist/wheel-scrolling/selection-preserve-*.log`. The first unit attempt exposed
an incomplete test setup after returning live; restoring history fixed the
fixture, and the final run passed. The isolated test compositor was stopped.
This bounded feedback fix makes no new performance or macOS claim.
Repository `make check` passed inside the full `make ci` attempt. That attempt
stopped in the existing terminal-client `agent-nested` exit wait (10 seconds),
after the preceding e2e groups passed. The targeted `10_agent` rerun passed all
six scenarios without source changes. Retain the failure rather than claiming
a fully green CI run; the later e2e groups did not run in this attempt. Next
trigger for the agent-test owner: investigate if this exit-wait timeout recurs.
The remaining agent and throughput gates passed in the follow-up run.
### Active-output selection feedback — 2026-09-06
The user isolated a misleading fullscreen symptom: Claude's counter paused in
the smaller window, and selection failed as soon as it resumed. Root reproduced
this with a real tmux counter and real Wayland pointer/clipboard. Geometry
inspection found no fullscreen-specific hit defect.
The user's Ghostty reference led to a simpler policy: keep the live selected
range through redraws and copy current text, even after that text is overwritten.
Terra verified the pinned Ghostty selection/page ownership and reviewed the
client validity predicate. Root implemented the pump-only change; the new source
provenance flag preserves strict cached-history freshness after returning live.
No per-cell tracking, duplicate extraction, new module, daemon change or wire
extension was needed. Existing epoch, dimensions, modes, input, attachment and
history-watermark guards remain. This supersedes prior retro statements that
any selected-pane output must cancel copying.
Acceptance now includes a counter that demonstrably advances during held and
released selection/copy, real tmux, windowed/fullscreen Wayland, and copying the
current text after an overwrite. Evidence is `dist/wheel-scrolling/active-selection-*`.
The first counter run reproduces the bug. A later full-fixture run exposed shell
job-completion text overwriting the next specimen; the fixture now waits for its
writer before repainting. User requested hands-on review, with no new recording.
Follow-up owner/trigger: the next history-identity slice must define scrolling,
reflow and capped-history eviction identity before promising Ghostty's tracked
pin behavior across the remote protocol. No atomic source snapshot is claimed.
Validation: client/native units and full native integration pass. Actual NVIDIA
Wayland selection passes eleven checkpoints through real tmux, and wheel/history
passes all ten checkpoints including scale transitions. Final focused review has
no remaining finding. The owned isolated compositor is stopped; existing demo
servers awaiting acceptance are preserved. No new recording, macOS verification
or performance claim is made for this behavioral fix.
The final full `make ci` run passed, including all e2e, agent and throughput
gates. The prior nested-agent timeout did not recur. Hands-on acceptance is
still pending; source commit and tests do not imply user approval.
### Follow-up: moving text and tmux selection ownership
The user's two-client trial found two remaining gaps. First, retaining a range
through redraws does not track the same line through terminal scrolling; the
highlight must move with that line and subsequent copy must still name it.
Second, foot's apparent tmux-owned drag can be visible in muxg because tmux paints
it, whereas muxg's current local drag is not sent to tmux. Local desktop copy,
tmux's paste buffer and shared selection rendering are distinct outcomes.
Added explicit acceptance scenarios to the text-selection plan: row-following
belongs to the selection-identity slice; normal application drag, shared tmux
selection, independent buffer/clipboard checks and required Shift+drag override
belong to the application mouse slice. Neither gap is claimed fixed by the
redraw-preservation commit. User acceptance of the overall feature is pending.
### Application mouse and clipboard writes — 2026-09-06
The Ghostty/foot comparison identified separate owners: a normal drag belongs
to an application that requests mouse reporting; Shift at press chooses native
selection for the complete gesture. Alternate screen alone does not decide.
The new controller captures the originating attachment and mode token; the pump
owns reports, original-format cancellation and stale-event rejection. The shared
wheel encoder now supplies all pointer formats. Application clipboard writes
reuse ClientCore validation and bounded decoding, with one shared text predicate
and SDL writer. No daemon, wire, dependency or new module was needed. The functional change
adds 291 production Zig lines beyond the opening refactor (excluding embedded
unit tests and build wiring): 134 for pump lifecycle/delivery, 88 for pane input
policy, 48 for SDL adaptation/hooks, and 21 for clipboard decoding/validation.
The growth buys the missing behavior while retaining existing owners.
Luna implemented the opening encoder and initial controller/decoding/tests;
Terra independently reviewed the boundaries and built acceptance fixtures; root
integrated and independently validated them. Review and compilation caught
incorrect expected bytes, runtime enum/character typing, double-counted pixel
origins, partial-cell bounds, button ownership and outside-coordinate handling.
The opening cleanup commit preceded the complete formatter gate because a
concurrent GUI edit entered that check. Next sprint coordinator action: freeze
all touched source until the opening check exits, then commit; never infer a
successful gate from completed unit output. The later integrated check passed.
Real NVIDIA Wayland checks verify direct application reports and both clipboard
targets with independent wl-paste reads. A separate foot/muxg two-client tmux
fixture verifies ordinary selection and the shared tmux paste buffer in both
directions, plus Shift-local copying without changing tmux state. An attempted
raw-program-inside-tmux cancellation check assumed the inner application's
mouse-off would disable the outer terminal's reporting. That assumption is
false; removed that redundant path and kept direct mode-cancellation and shared
tmux selection as separate oracles. Failure logs remain with the final evidence
under `dist/application-mouse/`.
The user requested a hands-on binary without a new recording. No review server
or publication was created; previous pending demos remain untouched. Hands-on
acceptance is still pending. Final delivery gate results and fixture teardown
are recorded below.
Retained debt and next owners/triggers:
- Selection-identity slice: track the same text through terminal scrolling,
reflow and history eviction. This sprint fixes tmux-owned selection sharing;
it does not give native local selection terminal line identity.
- Input owner: GUI paste and composition remain separate. Additional physical
mouse buttons during a held gesture are ignored; add chorded gestures only
when needed, preserving each original attachment and cancellation contract.
- Platform owner: Linux/Wayland evidence does not establish macOS. Native primary
selection uses the available SDL adapter; numbered and secondary OSC52 targets
remain unsupported, and clipboard reads remain refused.
- Transport owner: the existing wheel wait behind a continuously readable stream
remains a separate liveness follow-up; no scheduler rewrite was added here.
Final validation: full CI passed all 117 e2e scenarios, agent and throughput;
final required check and ReleaseSafe native-core/native units passed. Full native
integration passed, followed by separate final NVIDIA Wayland direct mouse,
shared foot/tmux, ten wheel/scale and eleven selection checkpoints. The owned
compositor PID 49292 was stopped and verified; test rigs cleaned up their own
processes. Previous pending demos and the user's staged main-worktree file remain
untouched.
The native raw-output frame gate remains red: initial p99 20.597 ms against a
20 ms budget. A controlled comparison reproduced it on the prior wheel release
(23.134 ms) and new release (21.374 ms). All had ongoing output, successful
reopen and input-to-painted upper bounds below 61 ms. Presentation dominated;
this does not establish a stable performance pass or an improvement. Keep
`stress.log`, `stress-baseline.log`, `stress-comparison.log` and their JSON
artifacts. Renderer owner follow-up: resolve the existing NVIDIA presentation
budget variability using this same isolated fixture; do not widen the budget
or rerun until green. The new mouse feature is handed off for functional review
with this limitation explicit.
Application-mouse demo follow-up: user explicitly requested recording and
publication after the hands-on handoff. Created the maintained review page and
a 32.4-second continuous actual GUI recording, with input automation disclosed.
Independent page review caught primary-selection coverage described as part of
the video; corrected it to separate automated coverage. Both clients in the
recording are muxg panes; foot remains separate acceptance evidence. Published
only `/application-mouse` on the existing private host, preserving the older
route. HTTPS page and byte ranges verified; recording fixtures stopped. Server
PID 99795 remains pending acceptance, with exact ownership and targeted teardown
in `dist/application-mouse/server.json` and the sprint plan.
Application mouse/clipboard product sign-off — 2026-09-06: the user accepted
the published demo and explicitly signed off the product slice. This is recorded
demo review, not an assertion of additional hands-on testing. Removed only its
`/application-mouse` sharing route, verified ownership and stopped server PID
99795, and confirmed port 18777 closed. The existing text-selection route was
preserved. Recording, page and test evidence remain; cleanup is recorded in
`dist/application-mouse/accepted-demo-teardown.json`. The existing rendering
budget issue and selection-identity/paste follow-ups remain open. No next sprint
was started by this sign-off.
### Selection follows terminal output — 2026-09-06
Completed native selections now follow their original terminal occurrence
through primary history and vertical scroll regions. Ctrl+Shift+C resolves the
tracked endpoints; a held copy uses its current range and release registers the
final range. One selection request/reply now covers extract/start/copy/clear for
native, TUI and browser callers. Daemon and clients must be rebuilt together;
compatibility was explicitly excluded.
The daemon owns Ghostty pins and text extraction, the pump owns correlation and
attachment lifetime, and the GUI receives position and grid together. Opening
inspection needed no separate cleanup. Closing cleanup removed the parallel
protocol and unused state. Independent Terra review approved these boundaries;
Luna handled bounded implementation/fixtures, and root integrated, reviewed and
tested actual behavior. Ghostty owns ordinary page movement and eviction. Its
partial-region row-copy/rotation paths need explicit external-pin movement;
REP now reuses the normal print hook rather than cancelling ordinary redraws.
Review fixed an extraction lifetime bug, pin-allocation cleanup, alternate-screen
allocator reuse, and partial-region endpoint movement. Assertions that a pin
still existed hid wrong coordinates: retained selections now assert both moved
coordinates and extracted distinct text. Validate library behavior against the
pinned implementation and compiler, not assumptions about APIs or privacy.
Re-copy acceptance first replaces the clipboard with a sentinel; unchanged
clipboard text alone proves nothing. Fixture header clicks clear selection, so
neighbour output uses the owned PTY directly. Wait for visible Wayland motion
before a separate FIFO key injection; neither channel orders the other.
Final CI passed all 117 e2e scenarios, 10 agent checks and throughput. Native
units/integration and actual NVIDIA Wayland selection, wheel, scale, foot/tmux
and live tmux counter checks passed. A prior CI run compiled while source was
changing; coordinator action: hold the freeze through the entire CI command,
including later agent/throughput builds, not only its check stage. Early failure
logs are retained alongside the successful final runs.
The raw-output frame gate still misses its existing 20 ms budget: 20.716 ms p99.
Output and reopen progressed; sampled input-to-painted upper bounds were at most
60.4 ms including polling. Do not claim a performance pass or rerun until green.
The 25-second actual GUI demo and review page remain on localhost, pending user
product acceptance. The owned compositor and fixture apps are stopped; stop only
server PID 257482 after verifying ownership on acceptance. Preserve unrelated
demos. Full evidence and teardown are in the selection-follow sprint plan.
Next owners/triggers:
- Renderer owner: resolve the retained NVIDIA presentation budget variability
using the same isolated raw-output fixture; retain the budget and baseline.
- Selection owner, when continuing this feature: held-drag movement, reflow,
character edits, rectangular margins and ranges crossing scroll-region
boundaries need explicit policies. They currently cancel conservatively;
preserve existing clipboard contents and add coordinate-plus-text oracles.
- GUI input owner: paste and composition remain separate slices; ligatures are
still deferred. Platform owner: Linux evidence does not establish macOS.
- Coordinator, on acceptance: record product review separately from architecture
and tests, verify/stop this demo server, and only then begin an authorized slice.
Selection-follow product sign-off — 2026-09-06: the user approved after reporting
that drag selection remains highlighted when scrolling the wheel and discussing
the held-drag limitation. Clarified viewport movement versus terminal output
moving the underlying rows. Recorded that specific hands-on observation and
approval without treating it as manual coverage of every test. Verified ownership
and stopped localhost demo server PID 257482; port 18778 is closed. Its compositor
and app fixtures had already stopped. Retained the page, 25-second recording and
check evidence, preserved unrelated services, and left the known NVIDIA frame
budget debt open. No next sprint was started.
Documentation update — 2026-09-06: Identifying the public support boundary required removing stale platform and release copy; concise source-backed architecture and feature pages made the current scope clear.