Skip to content

Un-xfail 9 im.tincan.Calls contract tests; make the pending-iface guard self-healing#166

Merged
quad341 merged 2 commits into
mainfrom
fix/tincan-73eki-unxfail-calls-contract
Jul 4, 2026
Merged

Un-xfail 9 im.tincan.Calls contract tests; make the pending-iface guard self-healing#166
quad341 merged 2 commits into
mainfrom
fix/tincan-73eki-unxfail-calls-contract

Conversation

@quad341

@quad341 quad341 commented Jul 3, 2026

Copy link
Copy Markdown
Owner

What this changes

Nine D-Bus contract tests for the im.tincan.Calls interface (signals like
IncomingCall, CallConnected, CallEnded, CallActive, etc.) were
xfailing under a "not yet exported by the daemon" guard. The daemon has
actually exported all nine signals for a while now — the guard just never
got updated, so the tests were silently skipping real coverage instead of
running it.

This removes the stale entry so those 9 tests run for real (77 passed, 1
skipped, 0 xfailed in the contract file — was 66/2/10 before).

It also fixes why the guard went stale in the first place: the
pending-iface skip was an unconditional pytest.xfail(), which can never
self-heal or flag when an interface lands. It's now a strict xfail
(mirrors the existing _KNOWN_BROKEN_CONTRACT pattern in conftest.py), so
the next time an interface listed as "pending" actually ships, CI fails
loudly (XPASS) instead of the test suite quietly losing coverage again.

Review notes

  • Test-only change — one file, tests/tincand/test_dbus_contract.py, no
    runtime/production code touched.
  • The self-healing behavior was verified directly, not just read: a stale
    pending-iface entry was temporarily simulated and confirmed to produce a
    hard XPASS(strict) failure, then reverted before this commit.

Test plan

  • pytest tests/tincand/test_dbus_contract.py — 77 passed, 1 skipped, 0 xfailed
  • Full suite pytest tests/ — 2376 passed, 1 skipped, 0 failed, 0 xfailed
  • ruff check . — 77 errors, identical count before/after (zero new lint issues)
  • Release gate: release-gates/unxfail-calls-contract-sgeqs-gate.md

🤖 Deployed by actual-factory

quad341 added 2 commits July 3, 2026 15:27
…ding-iface guard strict (tincan-73eki)

The daemon has exported all 9 im.tincan.Calls signals since tincan-0e6na
landed, but _KNOWN_PENDING_DAEMON_IFACES still gated them behind an
unconditional pytest.xfail() that could never self-heal. Remove the
stale entry, refresh the comments that still cited the interface as
pending, and switch the guard to a dynamically-applied strict xfail
(mirroring conftest.py's _KNOWN_BROKEN_CONTRACT) so a future landed
interface can't rot silently again.
@quad341

quad341 commented Jul 4, 2026

Copy link
Copy Markdown
Owner Author

Thanks @quad341 — this is exactly the kind of stale-guard cleanup that's easy to leave rotting for months. Nice catch that the im.tincan.Calls xfail was silently eating real coverage after the daemon started exporting all nine signals. What I especially like is that you didn't just delete the entry: converting the guard to a strict xfail (mirroring _KNOWN_BROKEN_CONTRACT in conftest.py) means the next "pending" interface that lands trips CI with a loud XPASS instead of quietly losing coverage again — that's the fix that keeps the fix from being needed twice.

I re-traced the core claim against tincand/dbus_service.py and confirmed all nine Calls signals are unconditionally exported, so those 9 §1 cases are genuinely running now. CI's green, it's test-only, and the change is self-contained — merging as-is, nothing needed on my end. Appreciate the thorough test plan and that you actually simulated the strict-xfail self-heal rather than just asserting it. 🚀


Reviewers: Qwen (local) — ok · Claude (claude-opus-4-8[1m]) — ok · Codex (gpt-5.5) — ok
Synthesis: claude-opus-4-8[1m]

Verified locally + tests pass. Ready to merge — clicking the button is the only step left.

@quad341
quad341 merged commit 51eaaa7 into main Jul 4, 2026
1 check passed
@quad341
quad341 deleted the fix/tincan-73eki-unxfail-calls-contract branch July 4, 2026 14:36
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