Skip to content

refactor(sid): drop legacy instances_matching fallback + fix capability-matching flake - #208

Merged
zzylol merged 1 commit into
mainfrom
refactor/sid-drop-legacy-fallback-and-fix-flake
May 14, 2026
Merged

zzylol merged 1 commit into
mainfrom
refactor/sid-drop-legacy-fallback-and-fix-flake

Conversation

@zzylol

@zzylol zzylol commented May 14, 2026

Copy link
Copy Markdown
Contributor

Summary

Two related cleanups bundled.

  1. Drop legacy instances_matching fallback in ASAPQueryEngine.execute. Every production registration path now populates policy_fp; the fallback was only catching test fixtures and the raw-mode fast-path that the sink drops anyway. CapabilityMiss now means exactly one thing: no policy in the registry satisfies the candidate.

  2. Fix avg_finds_sum_and_count flake. aggregation_priority returned Equal on equal window_size, leaving sort_by order dependent on HashMap iteration. New sort keys: window_size DESC → single-pop wins → aggregation_id() tie-break.

Test plan

  • cargo check --workspace clean
  • cargo test --workspace --lib --bins green
  • Flaky test ran 5× in a row, all pass

🤖 Generated with Claude Code

…ty-matching flake

Two related cleanups bundled because both touch deterministic sid
lookup and they're each small.

## 1. Drop `instances_matching` fallback in ASAPQueryEngine.execute

PR #206 wired the content-addressed fast path with a fallback to
the legacy `idx.instances_matching(metric, gbk)` walk for sids
registered with `PolicyFingerprint::UNSET`. With PRs #203 + #205
populating the fp on every production registration path, the
fallback's only consumers are test fixtures and the raw-mode
fast-path that the sink already drops. Removing it makes
"capability miss" mean exactly one thing — no policy in the
registry satisfies the candidate — instead of overloading the
miss path between "no policy" and "no sid metadata".

## 2. Make `aggregation_priority` a total order

`capability_matching::tests::avg_finds_sum_and_count` had been
flaky because `aggregation_priority` returned `Equal` on equal
`window_size`, leaving `Vec::sort_by` order dependent on the
underlying `HashMap` iteration. The test inserts both a `Sum` and
a `CountMinSketch` config for the same metric; `Statistic::Sum`
matches both, and when the multi-pop `CountMinSketch` sorted first
the downstream key-aggregation lookup (only needed for multi-pop
value types) missed and the whole match returned `None`.

Sort keys now:
1. Larger `window_size` (coarser windows answer finer-grained
   queries via re-aggregation).
2. Single-population types beat multi-population (avoids the
   key-aggregation hunt when both shapes serve the statistic).
3. `aggregation_id()` (the policy fingerprint u64) tie-break —
   deterministic across runs and hosts.

The result for the failing test: `Sum` always wins the Sum-stat
candidate, no key-aggregation lookup fires, the function returns
`Some(...)` deterministically.

## Engine test update

`execute_returns_capability_miss_when_classify_is_ghost`
previously asserted the detail string contained "ghost" /
"unknown". With the fallback removed, the engine short-circuits
at the policy-resolution step (the test fixture's `dd_meta`
helper registers with `PolicyFingerprint::UNSET`, so the policy
lookup never finds the sid). The `CapabilityMiss` outcome is
preserved; the detail-string assertion is dropped since it pinned
implementation, not contract.

## Test plan

- [x] `cargo check --workspace` clean
- [x] `cargo test --workspace --lib --bins` green
- [x] `avg_finds_sum_and_count` ran 5× in a row, all pass — flake
      gone

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@zzylol
zzylol merged commit 061cbf6 into main May 14, 2026
@zzylol
zzylol deleted the refactor/sid-drop-legacy-fallback-and-fix-flake branch July 17, 2026 20:06
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