ECSx Component.search confusion/bug?

Had a great day or so coding against the EXSx framework - love the
Systems model to divide up the work. I’m having a bit of a moment with Component.search returning Components that I’m certain I’ve already removed. I’ve extracted the code into its own method, below.

  def get_live_assignments(worker_id) do
    dbg AssignmentWorker.search(worker_id)
    |> Enum.filter(&AssignmentWorker.exists?(&1) )
  end

I would expect search to not return records that would fail the exists? test, but that’s not what I’m seeing.

First - before removing any assignments:

[lib/taiichi/systems/worker_assignment_balancer.ex:14: Taiichi.Systems.WorkerAssignmentBalancer.get_live_assignments/1]
AssignmentWorker.search(worker_id) #=> ["9205100f-1308-4671-b8ea-a1601fc9275c", "a1399542-8bd1-4470-8892-4d4981a9a6b4"]
|> Enum.filter(&AssignmentWorker.exists?(&1)) #=> ["9205100f-1308-4671-b8ea-a1601fc9275c", "a1399542-8bd1-4470-8892-4d4981a9a6b4"]

All is good - the exists? filter returns both records returned by search. However, when I remove one of the assignments (in another System), there’s a mismatch:

[lib/taiichi/systems/worker_assignment_balancer.ex:14: Taiichi.Systems.WorkerAssignmentBalancer.get_live_assignments/1]
AssignmentWorker.search(worker_id) #=> ["9205100f-1308-4671-b8ea-a1601fc9275c", "a1399542-8bd1-4470-8892-4d4981a9a6b4"]
|> Enum.filter(&AssignmentWorker.exists?(&1)) #=> ["a1399542-8bd1-4470-8892-4d4981a9a6b4"]

Search is returning two records, while only one exists.

Here’s the definition for the Component, for reference:

defmodule Taiichi.Components.AssignmentWorker do
  @moduledoc """
  Tracks the worker who is on the assignment.
  key = assignment_id, value = worker_id.
  """
  use ECSx.Component,
    value: :binary,
    index: true
end

Besides that, I love the clarity and productivity that elixir and ECSx are bringing. I’ve built something where I can assign many people to a task, have them contribute to getting the work on the task done according to their own productivity, balance their assignments across many tasks and unassign them from completed tasks in just a few lines of code.

Any thoughts? I can always pipe calls to search into exists? but I’m worried I’m missing something obvious.