Skip to content

docs(release): make "disclosure never yields to a stale test" an invariant - #478

Merged
BitHighlander merged 1 commit into
release/7.14.2from
docs/release-invariant-disclosure
Aug 17, 2026
Merged

docs(release): make "disclosure never yields to a stale test" an invariant#478
BitHighlander merged 1 commit into
release/7.14.2from
docs/release-invariant-disclosure

Conversation

@BitHighlander

Copy link
Copy Markdown
Owner

Documentation only. Two changes.

1. Writes down the invariant as a release rule

Tests adapt to newly required disclosure. Firmware disclosure is never removed to satisfy a stale test.

The pressure to invert this is real and arrives disguised as housekeeping: the integration suite is red, the quickest route to green is to stop showing a screen, and the commit that does it looks like a test fix. The extra THORChain screens disclose affiliate-fee bytes that were previously signed invisibly — deleting them to make CI pass would reintroduce the defect this release exists to close, while looking like progress.

If a test fails because the device now shows more, the test is wrong.

2. Replaces the known-red section, which was wrong twice

It said the integration stall was pre-existing. It is not. A controlled run — same test files, only the firmware varying — shows 1af2ffe7de passes both stalling tests and release/7.14.2 head hangs them. This release introduced it. My earlier comparison used 440619703, which already contained most of the release work.

It could not enumerate the failures at all, because the job was killed before producing JUnit XML. With #477 the suite completes in 134s, so the list is now finite and has an owner per row:

count message owner
9 Transaction signing disabled by policy (TON) documented BREAKING gate; tests must opt in
5 Chain Id out of bounds #445 as designed; fixed by python-keepkey #215
3 Enable AdvancedMode to blind-sign (TRON) documented BREAKING gate
2 Timeout >60.0s extra disclosure screens never acked (#466)
1 Arbitrary contract data signing disabled by policy 0x via #468; master's copy already opts in
1 Enable AdvancedMode to blind-sign typed hashes documented BREAKING gate
1 Structured EIP-712 disabled… deliberately disabled here

22 failed, 362 passed, 47 skipped. No firmware defect among them. The deps/python-keepkey repin is the single action that resolves most of it.

Two measurement traps, recorded so they are not rediscovered

  • Do not assess the integration suite sequentially against one emulator. A killed hang wedges the device and every later file reports spurious errors — five "collection errors" and four "failures" recorded that way evaporated on a per-file re-run.
  • The pinned submodule commit is the test source of truth, never the working tree. test__sign_transformERC20 enables AdvancedMode on python-keepkey master and does not at the pinned 81e581f. Reading the wrong one produced a confident and wrong "this breaks nothing" on fix(evm): bind transformERC20 clear-signing to full calldata #468.

Note on the red state

The branch reports red, and after #474 that is a fact rather than an appearance: ci-gate fails when any required job is failure, cancelled or skipped, so a gate-stage failure can no longer make the build graph vanish behind green ticks.

…riant

The integration suite is red, the quickest route to green is to stop showing a
screen, and the commit that does it looks like a test fix. Writing the rule down
is the cheapest defence against that, because the pressure arrives disguised as
housekeeping and the result would look like progress.

Tests adapt to newly required disclosure. Firmware disclosure is never removed to
satisfy a stale test. If a test fails because the device now shows more, the test
is wrong. The extra THORChain screens disclose affiliate-fee bytes that were
previously signed invisibly.

Also replaces the known-red section, which was wrong in two ways. It said the
integration stall was pre-existing at 4406197 -- a controlled run (same test
files, only firmware varying) showed 1af2ffe passes and head hangs, so this
release introduced it. And it could not enumerate the failures at all, because
the job was killed before producing JUnit XML.

With #477 the suite completes in 134s and the list is finite: 22 failed, 362
passed, 47 skipped, every failure a stale pinned expectation and none a firmware
defect. Recorded as a table with an owner per row, since that is now the concrete
work list for the repin.

Adds the two measurement traps that cost real time here: do not run the suite
sequentially against one emulator, and treat the PINNED submodule commit as the
test source of truth rather than the working tree -- reading master's copy of
test__sign_transformERC20 produced a confident and wrong "this breaks nothing".

Refs #466 #474 #477
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant