GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — Capture retained history with counter-backed cursors by tony · Pull Request #832 · tmux-python/libtmux

Conversation

@tony

@tony tony commented Nov 6, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown
Member

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.

All reactions
@codecov

codecov Bot commented Nov 6, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown

Codecov Report

❌ 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).

Files with missing lines Patch % Lines
src/libtmux/capture.py 58.66% 50 Missing and 12 partials ⚠️
src/libtmux/pane.py 66.66% 1 Missing ⚠️
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.
All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

tony added 2 commits November 6, 2026 20:20
@tony
pane(feat): Capture retained history with cursors
54b8975
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
@tony
ci(fix[coverage]): Report native history coverage
b97c910
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.
@tony
tony force-pushed the feat/740-history-cursor branch from 3dbd6eb to b97c910 Compare November 7, 2026 02:20
tony added 2 commits November 6, 2026 20:43
@tony
py(deps[dev]) Raise Ruff floor to 0.17.3
7ccc2a4
why: Keep development and CI linting on the same Ruff release,
including corrected f-string conversions and safer lint fixes.

what:
- Raise Ruff floors in the development and lint dependency groups
- Lock Ruff 0.17.3 with its published source and wheel hashes

Ruff release notes:
https://github.com/astral-sh/ruff/releases/tag/0.17.2
https://github.com/astral-sh/ruff/releases/tag/0.17.3
@tony
CHANGES(docs): Record the Ruff development floor
c3a932c
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

No reviews

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

None yet

Projects

None yet

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.

1 participant

@tony
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.
You are visitor 01402520 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.