Skip to content

fix(reg): emit tcpdump legacy link-type names after current ones - #848

Merged
JarryShaw merged 1 commit into
mainfrom
fix/844-linktype-209-legacy-order
Sep 27, 2026
Merged

JarryShaw merged 1 commit into
mainfrom
fix/844-linktype-209-legacy-order

Conversation

@JarryShaw

Copy link
Copy Markdown
Owner

Please follow the guide below

What is the purpose of your pull request?

  • fix — corrects a defect

Description of your pull request and other information

Closes #844.

LinkType(209).name returned 'IPMB_LINUX' — the name tcpdump and pcapkit's own generated
comment
label "Legacy names (do not use)" — because that row was emitted above I2C_LINUX = 209
and aenum gives the value to whichever member is defined first. Introduced by cfdf2ab5c7
(2024-05-04), where a regeneration inserted the legacy row above the current one.

The fix is in the generator: pcapkit/vendor/reg/linktype.py now sinks any row whose note
column mentions "legacy" into a bucket appended after every current row, so the current name is
always defined first for a shared value. pcapkit/const/reg/linktype.py changes only as the
regenerated consequence — a 3-line move, verified byte-reproducible from the generator.

Verification, re-run by me on this rebased branch rather than taken from the worker's report:

LinkType(209).name        -> I2C_LINUX          (was IPMB_LINUX)
LinkType['IPMB_LINUX']    -> 209                (still reachable, as an alias)
LinkType['I2C_LINUX']     -> 209
members 220 / iteration 219                     (unchanged)
values with >1 name       -> {209: ['I2C_LINUX', 'IPMB_LINUX']}
  • IPMB_LINUX is not removed — it stays an alias, so existing LinkType['IPMB_LINUX'] lookups keep working. Only the reverse direction changes.
  • 209 is the only multi-name value in the table, so nothing else could have shifted; independently derived, not taken on trust.
  • 'legacy' matches exactly one row in the whole generated table, so the rule is narrow today. It is deliberately a rule rather than a special case for 209, which means a future tcpdump row noting "legacy" would be sunk too — intended, and the reason the generator carries a comment saying so.
  • Regenerating from this branch reproduces the committed const file byte-identically.
  • coverage run -m pytest tests/const/ → 103 passed, 39458 subtests passed
  • The new tests/const/test_const_linktype_209_unit.py against unfixed main → 3 failed
    ('IPMB_LINUX' != 'I2C_LINUX' on both lookups, plus the generator-ordering check)

Not breaking: no name disappears and no value changes; only the value→name direction for 209
starts returning the non-deprecated name, which is the defect being fixed.

@JarryShaw JarryShaw added fix Pull requests that fix a defect (fix: subject prefix) const Regenerated IANA or vendor constant tables; members keep their numeric values review: pending No verdict for the current head - never reviewed, or the head moved since the last one breaking Breaks public-facing behaviour or API (apply alongside the type label) and removed breaking Breaks public-facing behaviour or API (apply alongside the type label) labels Sep 27, 2026
@JarryShaw
JarryShaw force-pushed the fix/844-linktype-209-legacy-order branch from 6aaee9c to f04a343 Compare September 27, 2026 12:54
@JarryShaw

Copy link
Copy Markdown
Owner Author

Python 3.11 failed, root-caused, and fixed — head is now f04a3431b. It was two symptoms of
one defect, not two failures:

FAILED tests/const/test_const_linktype_209_unit.py::LinkTypeGeneratorLegacyOrderingTests::test_both_rows_still_render_with_their_own_comment
FAILED …::test_current_name_is_emitted_before_the_legacy_one
  bs4.exceptions.FeatureNotFound: Couldn't find a tree builder with the features
  you requested: html5lib. Do you need to install a parser library?

The generator-level tests parse their fixture with bs4.BeautifulSoup(…, 'html5lib'). html5lib
ships as beautifulsoup4[html5lib] in the vendor extra (pyproject.toml:203), and the test
extra deliberately carries a plain beautifulsoup4 — pyproject.toml:256-263 says so explicitly. CI's
unit-tier job installs .[test,DPKT,crypto,NGAP], so the parser was never there. Same shape as
#511's ModuleNotFoundError: No module named 'requests'
, which is a vendor-extra dependency too.

Fixed with the repo's established guard, mirroring tests/protocols/test_dispatch_registry_unit.py:42:
a module-level HAS_HTML5LIB = importlib.util.find_spec('html5lib') is not None plus
@unittest.skipUnless on that one class.

The consequence, stated rather than buried: LinkTypeGeneratorLegacyOrderingTests is the
root-cause pin, and it now runs only where the vendor extra is installed — locally and in the
release gate, not in the unit-tier job. LinkType209ConstResolutionTests needs no parser, so the
symptom the issue actually reported stays guarded everywhere. Adding html5lib to the test extra is
the alternative and is your call — the same call #511 raised for requests.

Verified both ways before pushing:

  • locally, html5lib present → 4 passed, all four tests still execute
  • with html5lib hidden behind a patched find_spec → Ran 4 tests … OK (skipped=2), 0 failures, 0 errors
  • isort --check-only clean

Amended into the single commit rather than stacked; no verdict had been issued on the old head, so
nothing is invalidated. review: pending stands and CI is re-running.

… IPMB_LINUX (#844)

- pcapkit/vendor/reg/linktype.py: LinkType.process() now sinks any tcpdump
  row whose notes column says "legacy" into a bucket appended after every
  other row, so the current name is always defined first for a value the
  registry double-assigns.
- pcapkit/const/reg/linktype.py: regenerated as a consequence -- IPMB_LINUX
  (legacy) moved after I2C_LINUX (current), so LinkType(209).name now
  resolves to 'I2C_LINUX' instead of the legacy 'IPMB_LINUX'.
- tests/const/test_const_linktype_209_unit.py: pins the resolution against
  the committed const module and, offline, against the generator's own
  process() fed tcpdump's real two rows for value 209.

Verified against a live fetch of tcpdump.org/linktypes.html: 209 is the
table's only doubly-assigned value and its only "legacy" note. Build:
tests/const/ + tests/vendor/, 188 passed / 39644 subtests passed.
@JarryShaw
JarryShaw force-pushed the fix/844-linktype-209-legacy-order branch from f04a343 to 88f52fd Compare September 27, 2026 13:17
@JarryShaw

Copy link
Copy Markdown
Owner Author

My previous fix was wrong and the repo's own guard caught it. Head is now 88f52fd13.

f04a3431b went red on 10 legs — Python 3.10–3.14 and Engines Python 3.10–3.14 — with two
failures per leg, both one defect:

FAILED tests/test_tier_guard.py::DependencyGateCoverageTests::test_every_gate_a_job_reaches_has_its_dependency_installed
FAILED tests/test_tier_guard.py::DependencyGateFalsifiabilityTests::test_the_undoctored_workflow_produces_no_unexplained_gap
  AssertionError: Lists differ: [Gap(flag='HAS_HTML5LIB', job='gate', …)] != []

I introduced a new dependency gate, HAS_HTML5LIB, and tests/_dependency_gates.py requires every
HAS_* flag a job reaches to either have its dependency installed or carry an explicit exclusion. Mine
had neither. That is the guard doing exactly its job, on me.

The right fix was to mint no new gate at all. HAS_VENDOR_DEPS already exists for precisely these
dependencies — ('requests', 'bs4', 'html5lib'), spelled that way in
tests/vendor/test_request_prompt_unit.py:99,108 and four sibling files — and
tests/_dependency_gates.py:315 already accounts for it:

'HAS_VENDOR_DEPS': Exclusion(dark={'test': ('html5lib',), 'gate': ('html5lib',)}, reason=…)

with engine-tests closing the gate by installing the vendor extra. So the class now guards on
HAS_VENDOR_DEPS with the identical tuple, and needs no exclusion edit.

Net effect, which is better than my first attempt: the root-cause pin runs per-PR on engine-tests
rather than only locally, because that job installs vendor. test and gate stay dark on html5lib
by the existing ruling. LinkType209ConstResolutionTests needs no parser and still guards the reported
symptom on every leg.

Verified before pushing:

  • tests/test_tier_guard.py — the guard that flagged me — 102 passed, 549 subtests passed
  • tests/const/test_const_linktype_209_unit.py locally → 4 passed
  • with html5lib hidden behind a patched find_spec → OK (skipped=2), 0 failures, 0 errors
  • isort --check-only clean

Amended into the single commit; review: pending stands and no verdict was issued against either
superseded head.

@JarryShaw JarryShaw added the breaking Breaks public-facing behaviour or API (apply alongside the type label) label Sep 27, 2026
@JarryShaw

Copy link
Copy Markdown
Owner Author

GOOD TO GO on 88f52fd13 — the cross-review (opus, a different model from the sonnet author) returned
NEEDS CHANGES for exactly one thing, the breaking label, and it was right. Applied, so the change it
asked for is done and nothing in the code needs touching.

I got the label wrong, and the reasoning is worth recording. I argued "no name disappears and no value
changes, only the value→name direction for 209". True, but it is a normative test — "the old output was a
defect, so changing it is not breaking" — and the repo's applied rule is descriptive: did observable
public output change? Verified myself on both trees:

main: LinkType['IPMB_LINUX'].name = 'IPMB_LINUX'    LinkType(209).name = 'IPMB_LINUX'
PR  : LinkType['IPMB_LINUX'].name = 'I2C_LINUX'     LinkType(209).name = 'I2C_LINUX'

So LinkType['IPMB_LINUX'].name == 'IPMB_LINUX' breaks in consumer code. And #847 carries fix,
breaking, const
for the same shape of change — a name-resolution reordering in a generated const enum
where no value changes and no name disappears. I set that precedent three commits ago and then contradicted
it here.

What the review verified independently, each derived rather than read off the PR:

  • the root cause is genuinely generator-level — proved the hard way: regenerating the base tree from
    its own unfixed generator reproduces the buggy const file byte-identically, so a regeneration without the
    vendor change reintroduces the inversion, exactly as reg: LinkType(209) resolves to IPMB_LINUX, the name tcpdump and pcapkit both label do-not-use #844 warned
  • the full name → value map is identical across all 220 entries, with exactly one positional
    difference in 219 canonical slots (index 123); 209 confirmed the only doubly-assigned value, checked
    against the live registry's 205 rows as well as the committed table
  • the 'legacy' rule matches exactly 1 row in a live fetch of tcpdump.org/linktypes.html
  • byte-reproducible regeneration; tests/const/ 103 passed / 39458 subtests, re-derived as
    Ran 103 tests … OK under plain unittest; new file 3 failed on unfixed main, and it read all
    three rather than trusting the count
  • the HAS_VENDOR_DEPS reuse is legitimate, not exclusion-borrowing — zero HAS_HTML5LIB entries
    remain, the new file adds a Gate to an already-existing (job, module) gap rather than widening or
    inventing one, and HAS_CRAWLER_DEPS would have been provably wrong (it resolves to ['bs4', 'requests'] with no parser, so the class would have run on test and died with the same
    FeatureNotFound the fix exists to prevent)
  • the generator class genuinely runs per-PR: engine-tests installs the vendor extra and its three
    --ignore globs do not match this file, so it executes on all five legs

Three residual risks it raised as follow-ups rather than blockers — filed as #852 so they are not lost.

@JarryShaw JarryShaw added review: good-to-go Cross-review at the current head says ready; CI state is separate and removed review: pending No verdict for the current head - never reviewed, or the head moved since the last one labels Sep 27, 2026
@JarryShaw
JarryShaw merged commit f990f21 into main Sep 27, 2026
31 checks passed
@JarryShaw
JarryShaw deleted the fix/844-linktype-209-legacy-order branch September 27, 2026 14:03
@JarryShaw JarryShaw removed the review: good-to-go Cross-review at the current head says ready; CI state is separate label Sep 27, 2026
JarryShaw added a commit that referenced this pull request Sep 27, 2026
…il script

- Add util/pyshark_encap_map.py: sweeps every editcap -T encapsulation,
  writes it as pcap from examples/captures/in.pcap, reads the DLT from the
  file's own header and frame.encap_type back via tshark PDML, and rewrites
  ENCAP_TYPE_TO_LINKTYPE/FILTER_NAME_TO_LINKTYPE in
  pcapkit/toolkit/pyshark.py in place. Evicts any editable-install finder
  and pins sys.path to this checkout before importing LinkType, so the
  sweep cannot silently measure against a different tree's registry.
- Extracts the PDML showname's trailing number with a regex anchored to the
  end of the string, and parses editcap -T's own help listing by the
  "<token> - <desc>" line shape, so neither of its two banner lines is
  miscounted as a token.
- Excludes a DLT with no LinkType member and an ambiguous filter name,
  checking against the registry's genuinely-registered values up front so
  LinkType's own _missing_ cannot mint a placeholder member as a side effect
  of the check (#575). Rebased onto #848 (I2C_LINUX canonical for DLT 209):
  regenerating now correctly prefers it over the legacy IPMB_LINUX alias.
- Asserts the sweep arithmetic (226 accepted, 157 writable, 69 refused) only
  against the Wireshark version it was measured on (MEASURED_WIRESHARK_VERSION
  = 4.6.9); skips cleanly when tshark/editcap are absent or on a different
  version, since CI's packaged Wireshark (Ubuntu noble, 4.2.2) accepts 224.
- Add tests/project/test_pyshark_encap_map.py: version-independent invariants
  (no key/DLT ambiguity, agreement with the committed table) run on whatever
  Wireshark is on PATH; the exact-count sweep is gated on HAS_WIRESHARK, a
  NON_DISTRIBUTION_FLAGS entry in tests/_dependency_gates.py (a binary, not a
  pip distribution) plus the pinned version, so the gap is visible rather
  than silently dark. 3.10-safe (no TestCase.enterContext, 3.11+ only).
- Verified: regenerating against the rebased tree reproduces
  pcapkit/toolkit/pyshark.py byte-identically on a second run (md5
  c9ec0f6952da3be0c07f13e6a49e06d0 before and after --check); one legitimate
  line changes from origin/main (IPMB_LINUX -> I2C_LINUX, textual only, same
  aliased member); tests/test_tier_guard.py is green (102 passed, plain
  unittest cross-check OK); py_compile clean on Python 3.10.
JarryShaw added a commit that referenced this pull request Sep 27, 2026
Follow-ups from the cross-review of #848's legacy-sink rule in
pcapkit/vendor/reg/linktype.py:

- The sink predicate tested a row's notes for the word "legacy" alone,
  with no check that the row's value was actually claimed by another
  row -- so a future current row whose notes coincidentally mention
  "legacy" would be wrongly sunk. Gate the sink on the row's value
  being a genuine duplicate elsewhere in the table (pre-scanned via a
  Counter), computed independent of row order.
- The range branch (USER0-USER15) reused the same per-row sink, so one
  range row worded "legacy" would sink all sixteen expanded members at
  once. Range rows now always land in enum, unconditionally.
- Reworded the generator comment so it matches what the predicate
  actually tests, not "shares its value" when it never checked that.
- Added a comment at the const file's emission site, as a plain `#`
  line rather than `#:`, so it explains the source layout without
  leaking into IPMB_LINUX's rendered Sphinx docstring; qualified the
  self-reference as pcapkit.vendor.reg.linktype.LinkType.process.

Cross-review of this fix itself then caught a second regression: the
duplicate-value pre-scan counted only single-value rows, so a value
duplicated across a range boundary (a single-value row sharing a value
with one member of a USER0-style range) was invisible to it, and that
row's legacy alias stopped being sunk. The pre-scan now expands en-dash
ranges the same way the main loop does before counting, so no overlap
case is missed; an ASCII hyphen still isn't treated as a range.

Also fixed: the order-independence test previously proved nothing
beyond what the 209 fixture already covered (mutating the pre-scan
into a prefix-only, order-dependent variant left it passing); it now
runs the same duplicate pair through process() in both orders itself.

Added tests for: a non-duplicated value never sunk regardless of
wording, a duplicate pair resolving correctly in either table order,
range-sink isolation, the cross-range duplicate regression, and a
malformed en-dash range still raising loudly -- each shown failing
against the relevant prior code. Regenerated
pcapkit/const/reg/linktype.py; the range-aware pre-scan alone is
byte-identical (md5 7f4db8d612d74fbdbc880f75040bff12) to the
prior fix, confirmed by isolating it from the docstring-comment
change, which is the only other diff. Invariants hold:
LinkType(209).name == 'I2C_LINUX', IPMB_LINUX and I2C_LINUX both alias
value 209, 220 members / 219 canonical iteration, 209 the only
duplicated value, USER0-USER15 still 147-162. tests/const + tests/vendor:
193 passed; tests/test_tier_guard.py: 102 passed (unittest-confirmed).
JarryShaw added a commit that referenced this pull request Sep 27, 2026
Follow-ups from the cross-review of #848's legacy-sink rule in
pcapkit/vendor/reg/linktype.py:

- The sink predicate tested a row's notes for the word "legacy" alone,
  with no check that the row's value was actually claimed by another
  row -- so a future current row whose notes coincidentally mention
  "legacy" would be wrongly sunk. Gate the sink on the row's value
  being a genuine duplicate elsewhere in the table (pre-scanned via a
  Counter), computed independent of row order.
- The range branch (USER0-USER15) reused the same per-row sink, so one
  range row worded "legacy" would sink all sixteen expanded members at
  once. Range rows now always land in enum, unconditionally.
- Reworded the generator comment so it matches what the predicate
  actually tests, not "shares its value" when it never checked that.
- Added a comment at the const file's emission site, as a plain `#`
  line rather than `#:`, so it explains the source layout without
  leaking into IPMB_LINUX's rendered Sphinx docstring; qualified the
  self-reference as pcapkit.vendor.reg.linktype.LinkType.process.

Two rounds of cross-review on this fix itself then each caught a
narrower-than-main-loop hole in the duplicate-value pre-scan:

- Round 1: the pre-scan counted only single-value rows, so a value
  duplicated across a range boundary (a single-value row sharing a
  value with one member of a USER0-style range) was invisible to it.
  The pre-scan now expands en-dash ranges the same way the main loop
  does before counting.
- Round 2: the pre-scan's single-value branch tested str.isdigit(),
  narrower than the main loop's int(temp), which also accepts a
  leading sign and PEP 515 underscores. The pre-scan now tries
  int(temp) directly, before the en-dash check, so it recognises
  exactly what the main loop does. Neither hole is a live defect --
  every one of the 220 committed members matches a plain unsigned
  decimal -- but each was the same class of silent under-count this
  fix exists to close for ranges, narrowed further.

Also fixed: the order-independence test previously proved nothing
beyond what the 209 fixture already covered (mutating the pre-scan
into a prefix-only, order-dependent variant left it passing); it now
runs the same duplicate pair through process() in both orders itself.
And code_int (already parsed by int(temp)) is now reused at the
sink = line instead of re-parsing code a second time.

Added tests for: a non-duplicated value never sunk regardless of
wording, a duplicate pair resolving correctly in either table order,
range-sink isolation, the cross-range duplicate regression, a
malformed en-dash range still raising loudly in the main loop (not
the pre-scan), and signed/underscored duplicate pairs -- each shown
failing against the relevant prior code. Regenerated
pcapkit/const/reg/linktype.py at every round; each pre-scan widening
alone is byte-identical (md5 7f4db8d612d74fbdbc880f75040bff12) to the
prior fix, confirmed by isolating it from the docstring-comment
change, which is the only other diff. Invariants hold:
LinkType(209).name == 'I2C_LINUX', IPMB_LINUX and I2C_LINUX both alias
value 209, 220 members / 219 canonical iteration, 209 the only
duplicated value, USER0-USER15 still 147-162. tests/const + tests/vendor:
196 passed; tests/test_tier_guard.py: 102 passed (unittest-confirmed).
JarryShaw added a commit that referenced this pull request Sep 27, 2026
…ames

LinkType(209).name returned 'IPMB_LINUX', the name tcpdump's own table
(and pcapkit's generated comment) marks "Legacy names (do not use)",
because that row was emitted above the current I2C_LINUX = 209 and aenum
gives a value to whichever member is defined first.

Fixed in the generator: pcapkit/vendor/reg/linktype.py now sinks any row
whose note mentions "legacy" into a bucket appended after every current
row, so the current name is always defined first for a value the table
double-assigns; today that is value 209 alone. Not breaking: no name
disappears, no value changes and no membership changes -- only the
value-to-name direction for the shared value moves.
JarryShaw added a commit that referenced this pull request Sep 27, 2026
Adds util/pyshark_encap_map.py, a generator that regenerates
ENCAP_TYPE_TO_LINKTYPE (152 entries) and FILTER_NAME_TO_LINKTYPE (58) in
place inside pcapkit/toolkit/pyshark.py, so the two tables #850 hand-built
stop being hand-maintained. Guards against its own worst failure mode: a
naive LinkType(dlt) lookup cannot detect an unmapped DLT, because
_missing_ mints a placeholder rather than raising, so the generator
snapshots every known value before any lookup.

The real-tshark sweep is gated on a new HAS_WIRESHARK flag and is
version-pinned -- editcap -T accepts 226 encapsulations on Wireshark
4.6.9, 224 on 4.2.2 (CI's Ubuntu noble) -- so the count assertions run
only under the measured version. One line of pyshark.py itself changes as
a result: the IPMB_LINUX table entry becomes I2C_LINUX, the canonical
name #848 gave value 209.

util/changelog_md.py regenerated CHANGELOG.md for all seven entries added
across this and the six preceding commits (#838, #846, #847, #848, #849,
#850, #853); `--check` exit 0.
JarryShaw added a commit that referenced this pull request Sep 27, 2026
#846 and #850

- #838's "the 21 whose vendor crawler leaves Vendor.process() unmodified"
  measures 22, not 21 -- pcapkit.const.hip.transport.Transport also has an
  unmodified process(), but its FLAG-bound range has no unassigned gap, so
  its _missing_ carries no bounded-range extend_enum branch to fix. The
  real discriminator is that branch, not the process() override; reworded,
  and the "other 84" split into the 83 that do override process() and the
  one that doesn't but has nothing to fix either. Re-derived independently
  against 5e25db2^..5e25db2 (not main, which would fold in #847's own
  edit to ipx/socket.py): 22 registries have no process() override, 21 of
  them have the bounded-range branch, matching
  tests/const/test_const_enum_no_mint.py's own REGISTRIES_WITH_UNASSIGNED_RANGES
  (21 entries) vs ALL_REGISTRIES (22, +hip.transport, with a NOTE explaining
  the exclusion).

- #846's "Only tests/integration/test_engine_runtime.py and
  test_engine_parity.py change" is false -- 30bca99's own numstat also
  touches .github/workflows/unit-tests.yml (17+/2-). Qualified to "only
  these two test files change".

- #850 gets the breaking marker: its own prose already says the fallback
  is gone and an unrecognised encapsulation or filter name now raises
  MissingKeyError instead of substituting a plausible DLT -- the same
  shape as the two existing markers at AppType.get (1.5.0.rst:2456) and
  the four .get()-backed enum fields (1.5.0.rst:2720). Restructured to
  lead with the marker and the subject, matching their wording and
  placement; the later restatement of the same fact is dropped.

None of these are code or test changes -- prose only, matching the
cross-review's own framing. #848 stays unmarked (its own "Not breaking"
paragraph holds); #838, #849 and #853 stay unmarked per explicit
instruction not to add markers beyond what was asked.
JarryShaw added a commit that referenced this pull request Sep 28, 2026
…ames

LinkType(209).name returned 'IPMB_LINUX', the name tcpdump's own table
(and pcapkit's generated comment) marks "Legacy names (do not use)",
because that row was emitted above the current I2C_LINUX = 209 and aenum
gives a value to whichever member is defined first.

Fixed in the generator: pcapkit/vendor/reg/linktype.py now sinks any row
whose note mentions "legacy" into a bucket appended after every current
row, so the current name is always defined first for a value the table
double-assigns; today that is value 209 alone. Not breaking: no name
disappears, no value changes and no membership changes -- only the
value-to-name direction for the shared value moves.
JarryShaw added a commit that referenced this pull request Sep 28, 2026
Adds util/pyshark_encap_map.py, a generator that regenerates
ENCAP_TYPE_TO_LINKTYPE (152 entries) and FILTER_NAME_TO_LINKTYPE (58) in
place inside pcapkit/toolkit/pyshark.py, so the two tables #850 hand-built
stop being hand-maintained. Guards against its own worst failure mode: a
naive LinkType(dlt) lookup cannot detect an unmapped DLT, because
_missing_ mints a placeholder rather than raising, so the generator
snapshots every known value before any lookup.

The real-tshark sweep is gated on a new HAS_WIRESHARK flag and is
version-pinned -- editcap -T accepts 226 encapsulations on Wireshark
4.6.9, 224 on 4.2.2 (CI's Ubuntu noble) -- so the count assertions run
only under the measured version. One line of pyshark.py itself changes as
a result: the IPMB_LINUX table entry becomes I2C_LINUX, the canonical
name #848 gave value 209.

util/changelog_md.py regenerated CHANGELOG.md for all seven entries added
across this and the six preceding commits (#838, #846, #847, #848, #849,
#850, #853); `--check` exit 0.
JarryShaw added a commit that referenced this pull request Sep 28, 2026
#846 and #850

- #838's "the 21 whose vendor crawler leaves Vendor.process() unmodified"
  measures 22, not 21 -- pcapkit.const.hip.transport.Transport also has an
  unmodified process(), but its FLAG-bound range has no unassigned gap, so
  its _missing_ carries no bounded-range extend_enum branch to fix. The
  real discriminator is that branch, not the process() override; reworded,
  and the "other 84" split into the 83 that do override process() and the
  one that doesn't but has nothing to fix either. Re-derived independently
  against 5e25db2^..5e25db2 (not main, which would fold in #847's own
  edit to ipx/socket.py): 22 registries have no process() override, 21 of
  them have the bounded-range branch, matching
  tests/const/test_const_enum_no_mint.py's own REGISTRIES_WITH_UNASSIGNED_RANGES
  (21 entries) vs ALL_REGISTRIES (22, +hip.transport, with a NOTE explaining
  the exclusion).

- #846's "Only tests/integration/test_engine_runtime.py and
  test_engine_parity.py change" is false -- 30bca99's own numstat also
  touches .github/workflows/unit-tests.yml (17+/2-). Qualified to "only
  these two test files change".

- #850 gets the breaking marker: its own prose already says the fallback
  is gone and an unrecognised encapsulation or filter name now raises
  MissingKeyError instead of substituting a plausible DLT -- the same
  shape as the two existing markers at AppType.get (1.5.0.rst:2456) and
  the four .get()-backed enum fields (1.5.0.rst:2720). Restructured to
  lead with the marker and the subject, matching their wording and
  placement; the later restatement of the same fact is dropped.

None of these are code or test changes -- prose only, matching the
cross-review's own framing. #848 stays unmarked (its own "Not breaking"
paragraph holds); #838, #849 and #853 stay unmarked per explicit
instruction not to add markers beyond what was asked.
@JarryShaw JarryShaw added this to the 1.5 milestone Oct 6, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

breaking Breaks public-facing behaviour or API (apply alongside the type label) const Regenerated IANA or vendor constant tables; members keep their numeric values fix Pull requests that fix a defect (fix: subject prefix)

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

reg: LinkType(209) resolves to IPMB_LINUX, the name tcpdump and pcapkit both label do-not-use

1 participant