GeezerVison is showing github.com — Capture retained history with counter-backed cursors by tony · Pull Request #832 · tmux-python/libtmux
Conversation
tony
commented
Nov 6, 2026
•
edited
Loading
Uh oh!
There was an error while loading. Please reload this page.
Five identical same history rows can hide either two newly retained rows or a collection gap. Pane.capture_since() uses the connected tmux 3.8+ daemon's history counters to return immutable text and a new cursor with an explicit continuous, reset, gap, or unknown outcome. Core tmux support remains 3.2a.
The first slice selects retained main-grid physical history rows. It excludes the visible and alternate screens, keeps soft wraps separate, and distinguishes an initial anchor from a later reset. Native calls pin one endpoint, pane, and executable; unverifiable custom routing stays unknown while retaining its actual capture. Separate samples do not establish atomic or lossless output, and counters cannot recover discarded text. The API documentation states the limits of unobserved resize cycles, alternate-screen visits, and finite counters.
This independently builds on the evidence in #740, the prior cursor proposal #741, and the repeated-row counterexample #808. It does not import their broader implementation or any sibling branch. Native references: 3.8 history formats, counter updates, and native reconciliation.
Validation:
- Full configured pytest on tmux 3.2a: 1387 passed, 95 skipped. Full stable-3.8 pytest: 18 failed, 1461 passed, 3 skipped; all failure IDs and messages match unchanged master after checkout-path normalization. Those existing hooks, popup, and floating-pane failures remain a failed gate and are handled separately by tmux(fix[3.8]): Support hooks and terminal fixtures #825.
- Focused stable-3.8, development-3.8a, and next-3.9 cases pass. Older stable 3.2a/3.7b verify explicit rejection and selector validation; the feature cases are skipped there.
- Thirteen deliberate breaks are detected, including equal-row gaps, missing counters, same-PID replacement simulation, mixed endpoint routing, unavailable exit status, and a wrong example result. The standalone program runs unchanged twice and leaves an unrelated session's program alive.
- Ruff, full-tree mypy, documentation, rendered example/API checks, and source-distribution checks pass. Workflow syntax passes; full actionlint retains exactly the two existing SC2086 findings.
- A separate blocking stable-3.8 job enforces this feature's focused tests and example without altering existing full-suite jobs. Its exact-head stable-3.8 run passes all 26 feature tests, including the unchanged example. The separate pull-request-event instance is skipped and is not counted as a pass.
Visible/alternate-grid deltas, lossless bytes, serialization, atomic observation, and recovery of discarded text remain outside this slice. This PR does not close the broader issue.
Hosted checks at 3dbd6eb91e2ebf1267144ca719fe7ee1359d1b24 remain FAIL overall: tmux 3.2a and 3.3a pass; 3.4, 3.5, 3.6, 3.7a and 3.7b fail before pytest because cached binaries cannot load the runner ncurses library. Both CodeQL analyses and the aggregate pass. The nonblocking development-tmux job reports success despite the same pre-pytest ABI failure. The environmental correction remains separate in #825. Maintainer review is pending separately.
The CI-only follow-up collects and uploads the feature suite coverage; source, tests, examples and docs are byte-identical to 36c583abd4c1f6b90d0885d44171c3f7ffc91a17, whose local full-suite/build receipts remain recorded above. The new head passes all 26 feature tests and the upload is processed. Codecov now has three sessions and reports 49.51%; codecov/project remains FAIL. No threshold changed and no new full-suite run is claimed for this workflow-only change.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
codecov
Bot
commented
Nov 6, 2026
•
edited
Loading
Uh oh!
There was an error while loading. Please reload this page.
|
❌ Patch coverage is 58.82353% with 63 lines in your changes missing coverage. Please review.
✅ Project coverage is 52.70%. Comparing base (03c4c4b) to head (c3a932c).
Additional details and impacted files
@@ Coverage Diff @@
## master #832 +/- ##
==========================================
+ Coverage 52.37% 52.70% +0.33%
==========================================
Files 26 27 +1
Lines 3729 3882 +153
Branches 747 782 +35
==========================================
+ Hits 1953 2046 +93
- Misses 1472 1520 +48
- Partials 304 316 +12
☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.
🚀 New features to boost your workflow:
- ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
why: Repeated captures can hide new rows and collection gaps. Native
history counters can align retained rows without claiming lossless
program output.
what:
- Return immutable history cursors with explicit continuity outcomes
- Pin native routing and keep unverifiable captures unqualified
- Exercise reset, gap, lifetime, routing, and missing-evidence cases
- Document the selection and enforce its executable example on tmux 3.8
why: The tmux 3.8 feature lane did not contribute coverage, leaving native
history paths absent from the aggregate report.
what:
- Collect XML coverage while running the existing history feature suite.
- Upload that report through the existing Codecov action.
why: Contributors need the lint-tool requirement alongside other
development environment changes.
what:
- Document the Ruff 0.17.3 minimum for development and lint checks
This branch has not been deployed
No deployments
Uh oh!
There was an error while loading. Please reload this page.
Assignees
No one assigned
Milestone
No milestone
Development
Successfully merging this pull request may close these issues.
Uh oh!
There was an error while loading. Please reload this page.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
|