It's because TaskType.__call__ doesn't push the directly executed task on top the celery.state._task_stack.
Then again, this brings the problem of children tasks: because the current_task.request would be completely new, and the task isn't called via apply (no track in the result backend)...
I fixed it here: 20e9776
but the second point is a damn good one :(
I guess it could travel down the stack to find one that does not have request.called_directly
(which is set to False when the worker executes a task)
Skip adding children for tasks called with task.__call__. Closes #701
Why not having __call__ be an alias of apply eager ? Maybe your goal is be to transparent when directly calling a task.