Chain of Responsibility design
Chain of Responsibility pattern (hereby &quot;CORP&quot;) includes two things: iteration and &quot;handling&quot;.
IMO, the iteration part, at least in modern programming languages such as Python and Java, can be easily &quot;extracted&quot; to an external iteration. So eventually the code could look like:
result = None
for handler in handlers:
  temp_result = handler.handle(request)
  if temp_result is not None:
    result = temp_result
    break
if result is not None:
  # handled!

I think this approach is simpler than maintaining the inner chain, and it has the same impact.
In CORP, once a handler was found, and it can handle the input, no additional handlers should be executed. It's quite similar to filtering.
However, I think that the code we have in your question tries to execute as many handlers as it can (as it tries to enrich a wider context). So maybe CORP is not really needed here.
Perhaps you can have enriching classes, that have a method enrich that accepts a request and a context, so that every enriching class could either change the state of the context object, or leave it as is:
class BaseEnricher:
  def enrich(request, store):
    pass