Parity
Python is the reference implementation; every other port tracks how much of its public surface it covers.
How each port is built
| Port | Package | Reference host | Renderer | Generator |
|---|---|---|---|---|
| Python | libtmux | libtmux.org | sphinx | Sphinx + sphinx-gp-theme |
| TypeScript | @libtmux/libtmux | libtmux.org | astro | @microsoft/api-extractor JSON |
| Rust | libtmux | docs.rs | — | — |
| Go | github.com/libtmux/libtmux-go/tmux | pkg.go.dev | — | — |
| Java | io.github.libtmux:libtmux | javadoc.io | — | — |
| .NET | LibTmux | libtmux.org | astro | docfx metadata (--outputFormat markdown) |
| C++ | libtmux-cxx | libtmux.org | sphinx | Doxygen XML to Breathe to Sphinx |
| Swift | libtmux-swift | libtmux.org | native-skinned | DocC (swift-docc-plugin) |
Per-symbol parity
Four ports publish a per-symbol Python-parity ledger, each in its own format (Rust, C++ and TypeScript keep trackers too, in three more shapes not sampled here). Every cell below is marked by what its ledger's own cited evidence resolves to on this machine, not by how confident the ledger's prose sounds:
- test-verified
- The cited test (file, for .NET; function, for Go) exists in that port’s checkout.
- claimed
- An implementation or test is asserted, but the ledger cites nothing resolvable.
- unknown
- The ledger disclaims implementation status for this row, or carries no status field at all.
Per-port summary
| Port | Ledger format | Python revision | Rows | Test-verified | Claimed | Unknown |
|---|---|---|---|---|---|---|
| .NET | Structured JSON, one row per Python public-API symbol, all pre-triaged: destinationStatus is approved (has a C# destination) / excluded (deliberately not carried, with a reason) / internalized (implemented, no public 1:1 destination). | c4a980b | 626 | 626 | 0 | 0 |
| Go | Structured JSON, one entry per Python symbol/branch (classes, methods, fields, parameter branches, ...), each with a `source` file path and a `proof` array citing a Go test function. PARITY.md: the manifest gate "rejects... unproved entries" — checked here by resolving each citation, not assumed. | not recorded | 1588 | 1588 | 0 | 0 |
| Java | Two generated Markdown tables, no structured data file. python-api.md (889 rows) catalogues Python’s public surface with an intended Java disposition — by its own header, "not a record of what is implemented here". test-map.md (1458 rows) catalogues planned contract tests, by its own header "a catalogue, not a status report": all but a handful are status "planned parity", for a test class the ledger says does not exist yet (checked here, not just quoted — see contractClassesFound below). | c4a980b | 892 | 0 | 3 | 889 |
| Swift | Structured JSON, Python-side extraction only: public surface, behavior contracts, format fields, query contracts, source fingerprints. No field in any of the five files records whether Swift has implemented a given symbol — python-behavior-contracts.json’s `swiftAdaptation` (direct/adapted/consolidated) records a planned translation strategy, not completion. | 988b02a | 1326 | 0 | 0 | 1326 |
.NET and Go publish per-symbol ledgers that are entirely pre-triaged; on this build, all 626 .NET rows and all 1588 Go rows resolve as test-verified — the cited evidence (a test file for .NET, a test function for Go) exists in that port's checkout. Java's and Swift's ledgers carry no per-symbol implementation-status field at all: Java's by explicit disclaimer in its own source files ("a row's presence says Python has it, not that Java does" / "a catalogue, not a status report"), confirmed here by checking that the contract-test classes those files cite (not found / not found) don't exist in the checkout; Swift's by the absence of any Swift-side status field across all five of its parity files.
By Python module
Rows are the union of modules across all four ledgers. Only .NET's ledger has its own module
field, used directly; Go, Java and Swift have none, so their rows are derived mechanically
from each entry's source-file path instead (see scripts/normalise-parity.mjs's
deriveModule) — the same rule for all three, so their keys line up with each
other and, for files .NET's ledger also covers, with .NET's own field. An em dash means the
ledger has no rows at all for that module; for .NET, most of the
_internal/_vendor rows are that by declared scope
(public-API-only), not by omission.
| Python module | .NET | Go | Java | Swift |
|---|---|---|---|---|
| libtmux | 14 verified | 14 verified | 13 unknown | 14 unknown |
| libtmux.__about__ | — | 12 verified | — | — |
| libtmux._compat | — | 18 verified | 5 unknown | — |
| libtmux._internal.constants | — | 242 verified | 237 unknown | — |
| libtmux._internal.control_mode | — | 10 verified | 5 unknown | — |
| libtmux._internal.dataclasses | — | 2 verified | 1 unknown | — |
| libtmux._internal.env | — | 10 verified | 5 unknown | — |
| libtmux._internal.query_list | 27 verified | 57 verified | 28 unknown | — |
| libtmux._internal.sparse_array | — | 6 verified | 8 unknown | — |
| libtmux._internal.types | — | 1 verified | 1 unknown | — |
| libtmux._vendor._structures | — | 1 verified | 4 unknown | — |
| libtmux._vendor.version | — | 1 verified | 25 unknown | — |
| libtmux.client | 9 verified | 7 verified | 8 unknown | 8 unknown |
| libtmux.common | 30 verified | 48 verified | 30 unknown | 37 unknown |
| libtmux.constants | 25 verified | 24 verified | 24 unknown | 25 unknown |
| libtmux.exc | 28 verified | 53 verified | 27 unknown | 28 unknown |
| libtmux.formats | 6 verified | 5 verified | 5 unknown | 6 unknown |
| libtmux.hooks | 13 verified | 54 verified | 12 unknown | 38 unknown |
| libtmux.neo | 190 verified | 197 verified | 191 unknown | 899 unknown |
| libtmux.options | 23 verified | 69 verified | 22 unknown | 29 unknown |
| libtmux.pane | 58 verified | 285 verified | 56 unknown | 56 unknown |
| libtmux.pytest_plugin | 14 verified | 16 verified | 13 unknown | 13 unknown |
| libtmux.server | 72 verified | 232 verified | 66 unknown | 65 unknown |
| libtmux.session | 43 verified | 71 verified | 39 unknown | 39 unknown |
| libtmux.test | 1 verified | — | — | 1 unknown |
| libtmux.test.constants | 4 verified | 3 verified | 3 unknown | 4 unknown |
| libtmux.test.environment | 4 verified | 10 verified | 3 unknown | 4 unknown |
| libtmux.test.random | 5 verified | 10 verified | 4 unknown | 4 unknown |
| libtmux.test.retry | 2 verified | 4 verified | 1 unknown | 2 unknown |
| libtmux.test.temporary | 3 verified | 8 verified | 2 unknown | 3 unknown |
| libtmux.window | 55 verified | 118 verified | 51 unknown | 51 unknown |
Per-ledger notes
- .NET: Scoped to public API surface only (python-public-api.json in the same directory is the matching 626-symbol extraction) — no rows at all for Python's _internal/_vendor modules. A module missing here is out of this ledger’s declared scope, not an omission.
- Java: Per-module rows below come from python-api.md only — test-map.md is keyed by pytest node IDs and doctest chunks, not Python symbols, so it cannot be bucketed by module; its own totals are reported once at the port level instead: 1458 rows, status counts {"planned parity":1454,"source-declared partial non-execution":1,"deliberate Java correction":3}. The 3 rows status "deliberate Java correction" are test-map.md’s own prose "defect decisions" (2 decisions, 3 rows — Server.attached_sessions is cited under two evidence keys) that the ledger says *are* implemented; each still cites a PythonBehaviorParityTest method, the very class confirmed absent from the checkout, so this script marks them "claimed" rather than upgrading them on the strength of the status label alone. Folded into the port tally below, not counted twice against python-api.md’s own module rows.
- Swift: 712 of this ledger's 1326 entries are kind "inherited-dataclass-field" — the same Python dataclass field counted again for every subclass that inherits it (libtmux.neo, almost entirely), not that many distinct symbols. A module row where Swift’s count runs several times another port's for the same file is this, not several times the actual surface.
- Go: the "Python revision" column above reads "not recorded" rather than a guess — see the revision-skew note above for what Go's manifest records instead.