Skip to content

CAP-33 does not own the engine's OTA arm, so a correct trailer fails the relevance lint (09048b84) #1403

Description

@dc0sk

Follow-up from #1371 / PR #1401. This is the one remaining failure in the relevance corpus that is not a mislabel.

The case

09048b84 — "fix(daemon): let an OTA-enabled daemon receive uncoded non-ladder traffic" — carries Refactors: CAP-33 CAP-38. Its body describes the change as "without feeding the rate controller or keying an ACK", and it names on_rx_frame(RxOutcome::Failed) and ota_rate_decision_events. CAP-33 "Over-the-air receiver-led rate control" is semantically the right capability.

It fails the lint because CAP-33's code: is:

crates/openpulse-core/src/ota_rate.rs
crates/openpulse-core/src/profile.rs

— and the commit touched the OTA arm in openpulse-modem/src/engine.rs and openpulse-daemon/src/server.rs. CAP-33 owns neither. The rate controller's policy is in core; the OTA arm that drives it lives in the engine and the daemon, and the map does not say so.

Why it was not fixed in #1401

It is a map gap, not a rule error, and the 2026-09-15 maintainer decision already names curation as the remedy for exactly this. It briefly caused a worse mistake: I proposed relaxing the lint's predicate (fail only when every named capability is irrelevant) to absorb this one case. Review rejected that — it would have been a silent second relaxation on top of the gap, with a measured bypass (CAP-66 owns a touched file in 49 % of production commits). The predicate stayed strict and this case stayed failing, deliberately.

Enforcement is not retroactive, so 09048b84 blocks nothing; a future commit to the OTA arm naming CAP-33 would be refused, which is the live cost.

The decision this needs

Widening CAP-33 to engine.rs is not free:

  • engine.rs is 1 335 mutants and already has 6 owners; server.rs is 218 with 6.
  • code: feeds trace.py scope → req-mutation.sh, so a capability's size is its mutation cost.
  • It also makes engine.rs a 7-owner hub, and hub ownership is what makes the relevance rule weak where commits concentrate (already 9 of 22 pass only weakly).

So the options are roughly:

  1. Widen CAP-33 to the OTA arm files. Fixes the case; grows a hub and a mutation scope.
  2. Narrow the commit's trailer convention — accept that a change spanning policy and its driver names the capability that owns the files it touched (CAP-38 here), and let CAP-33 describe policy only.
  3. Function-level code: (-F-style scoping) so a capability can own the OTA arm functions in engine.rs without owning all 1 335 mutants. Biggest change; also the one that would help scripts/req-mutation.sh is the only tier-2 verification instrument and runs in no workflow #1279's cost problem.

Option 3 is the one that generalises, and it is the same lever the #1279 cadence work wants. Worth deciding together rather than separately.

Related: #1371, #1279, #1401.

🤖 Generated with Claude Code

https://claude.ai/code/session_0188ATCj6DZ9aRVQ2vSirua6

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions