main at 3cbdf8999 fails 10 legs — Python 3.10/3.11/3.12/3.13/3.14 × (Unit, Engines) — on a single test. Run 36201817798.
FAILED tests/protocols/application/test_http_unit.py::HTTPUnitTests::
test_guess_version_reports_a_preface_with_no_frame_as_such
AssertionError: "Field debug resolved to a negative length; template='-1s'"
!= 'HTTP/2: invalid format'
One defect, ten legs — every version fails identically, so this is not version-dependent. It is separate from #819, which is red on 3.10/3.11/3.12 only and is fixed by #820; main currently carries both.
Cause: an interaction between two PRs that were each green. test_http_unit.py:652 (added by #814) feeds a 16-octet GOAWAY whose declared length is 0x15 = 21 with 7 payload octets, and asserts it surfaces as ProtocolError('HTTP/2: invalid format') with __cause__ a struct.error, from the handler at pcapkit/protocols/application/http.py:319. But #811 added a negative-length guard in pcapkit/corekit/fields/field.py that now raises ProtocolError("Field debug resolved to a negative length; template='-1s'") first, so that handler never runs.
Why neither CI caught it: #814's head a8f804787 is based on 4530424df (#803) — before #811, #812 and #813 merged. It was 27✅/0❌/0inc on its own branch and still broke main, because the two trees differ by exactly field.py and the tests those PRs added. git diff refs/pull/814/head..origin/main shows it.
Either the assertion is now stale and should expect #811's message, or the HTTP/2 arm should normalise ahead of the field guard. That call belongs to the fix.
This is the second time a PR cleared as green-and-conflict-free merged red (#813/#819 was the first). The standing check — merge the PR into current main in a scratch worktree and run its tests before clearing it — was not run for #814, and would have caught this.
mainat3cbdf8999fails 10 legs — Python 3.10/3.11/3.12/3.13/3.14 × (Unit, Engines) — on a single test. Run 36201817798.One defect, ten legs — every version fails identically, so this is not version-dependent. It is separate from #819, which is red on 3.10/3.11/3.12 only and is fixed by #820;
maincurrently carries both.Cause: an interaction between two PRs that were each green.
test_http_unit.py:652(added by #814) feeds a 16-octet GOAWAY whose declared length is0x15= 21 with 7 payload octets, and asserts it surfaces asProtocolError('HTTP/2: invalid format')with__cause__astruct.error, from the handler atpcapkit/protocols/application/http.py:319. But #811 added a negative-length guard inpcapkit/corekit/fields/field.pythat now raisesProtocolError("Field debug resolved to a negative length; template='-1s'")first, so that handler never runs.Why neither CI caught it: #814's head
a8f804787is based on4530424df(#803) — before #811, #812 and #813 merged. It was 27✅/0❌/0inc on its own branch and still brokemain, because the two trees differ by exactlyfield.pyand the tests those PRs added.git diff refs/pull/814/head..origin/mainshows it.Either the assertion is now stale and should expect #811's message, or the HTTP/2 arm should normalise ahead of the field guard. That call belongs to the fix.
This is the second time a PR cleared as green-and-conflict-free merged red (#813/#819 was the first). The standing check — merge the PR into current
mainin a scratch worktree and run its tests before clearing it — was not run for #814, and would have caught this.