weasel API - v0.8.0
    Preparing search index...

    Interface ResolvedCandidate

    One candidate from Dispatcher.resolveAll — a binding that matched the event, with why it did or didn't get to fire.

    Verdicts:

    • would-fire — eligible, enabled() passed, and nothing above it fired. At most one candidate per call carries this.
    • ineligible — the action's eligible rule evaluated false against the live RuleCtx. reason is the rule, serialized.
    • disabledenabled() returned a disabled reason, carried verbatim.
    • shadowed — never asked, for one of two reasons: something above it already fired, or it is a repeat binding of the action that itself won higher in the list (several bindings may point at one action, and the dispatcher runs each action at most once). A repeat of an action that was already judged ineligible or disabled is NOT shadowed — it inherits that action's verdict, since that is the reason it doesn't fire.
    interface ResolvedCandidate {
        action: Action;
        actionId: string;
        binding: GestureBinding;
        ownerToolId: string | null;
        scope: BindingScope;
        specificity: readonly [number, number, number, number];
        verdict:
            | { kind: "would-fire" }
            | { kind: "ineligible"; reason: string }
            | { kind: "disabled"; reason: string }
            | { kind: "shadowed" };
    }
    Index

    Properties

    action: Action
    actionId: string
    ownerToolId: string | null
    specificity: readonly [number, number, number, number]

    The tuple from specificity(binding.spec), surfaced so a reader can see why one candidate outranks another rather than inferring it.

    verdict:
        | { kind: "would-fire" }
        | { kind: "ineligible"; reason: string }
        | { kind: "disabled"; reason: string }
        | { kind: "shadowed" }