# Buggy code
def _summary(self):
    is_parallel_child = PARALLEL_ENV_VAR_KEY in os.environ
    if not is_parallel_child:
        reporter.separator("_", "summary", reporter.Verbosity.QUIET)
    exit_code = 0
    for venv in self.venv_dict.values():
        report = reporter.good
        status = getattr(venv, "status", "undefined")
        if isinstance(status, tox.exception.InterpreterNotFound):
            msg = " {}: {}".format(venv.envconfig.envname, str(status))
            if self.config.option.skip_missing_interpreters == "true":
                report = reporter.skip
            else:
                exit_code = 1
                report = reporter.error
        elif status == "platform mismatch":
            msg = " {}: {} ({!r} does not match {!r})".format(
                venv.envconfig.envname,
                str(status),
                sys.platform,
                venv.envconfig.platform,
            )
            report = reporter.skip
        elif status and status == "ignored failed command":
            msg = "  {}: {}".format(venv.envconfig.envname, str(status))
        elif status and status != "skipped tests":
            msg = "  {}: {}".format(venv.envconfig.envname, str(status))
            report = reporter.error
            exit_code = 1
        else:
            if not status:
                status = "commands succeeded"
            msg = "  {}: {}".format(venv.envconfig.envname, status)
        if not is_parallel_child:
            report(msg)
    if not exit_code and not is_parallel_child:
        reporter.good("  congratulations :)")
    path = self.config.option.resultjson
    if path:
        if not is_parallel_child:
            self._add_parallel_summaries()
        path = py.path.local(path)
        data = self.resultlog.dumps_json()
        reporter.line("write json report at: {}".format(path))
        path.write(data)
    return exit_code


# Traceback (AssertionError)
$ tox -p all
⠸ [3] py36 | py37 | py38ERROR: invocation failed (exit code 1), logfile: /home/churchyard/tmp/totox/.tox/py37/log/py37-5.log
=================================================== log start ===================================================
py37 run-test-pre: PYTHONHASHSEED='1114882869'
py37 run-test: commands[0] | python runner.py
py37 run-test-pre: PYTHONHASHSEED='3136963143'
py37 run-test: commands[0] | python -c 'import sys; print(sys.version)'
3.7.5 (default, Oct 17 2019, 12:09:47)
[GCC 9.2.1 20190827 (Red Hat 9.2.1-1)]
Traceback (most recent call last):
File "runner.py", line 8, in <module>
assert 'py36' in cp.stdout
AssertionError
ERROR: InvocationError for command /home/churchyard/tmp/totox/.tox/py37/bin/python runner.py (exited with code 1)

==================================================== log end ====================================================
✖ FAIL py37 in 1.389 seconds
⠴ [2] py36 | py38ERROR: invocation failed (exit code 1), logfile: /home/churchyard/tmp/totox/.tox/py38/log/py38-5.log
=================================================== log start ===================================================
py38 run-test-pre: PYTHONHASHSEED='3502501543'
py38 run-test: commands[0] | python runner.py
py38 run-test-pre: PYTHONHASHSEED='1953872060'
py38 run-test: commands[0] | python -c 'import sys; print(sys.version)'
3.8.0 (default, Oct 16 2019, 12:47:36)
[GCC 9.2.1 20190827 (Red Hat 9.2.1-1)]
Traceback (most recent call last):
File "runner.py", line 8, in <module>
assert 'py36' in cp.stdout
AssertionError
ERROR: InvocationError for command /home/churchyard/tmp/totox/.tox/py38/bin/python runner.py (exited with code 1)

==================================================== log end ====================================================
✖ FAIL py38 in 1.536 seconds
⠇ [1] py36ERROR: invocation failed (exit code 1), logfile: /home/churchyard/tmp/totox/.tox/py36/log/py36-5.log
=================================================== log start ===================================================
py36 run-test-pre: PYTHONHASHSEED='664963699'
py36 run-test: commands[0] | python runner.py
py36 recreate: /home/churchyard/tmp/totox/inner/.tox/py36
py36 run-test-pre: PYTHONHASHSEED='4138548204'
py36 run-test: commands[0] | python -c 'import sys; print(sys.version)'
3.6.9 (default, Jul  3 2019, 15:08:07)
[GCC 9.1.1 20190503 (Red Hat 9.1.1-1)]
Traceback (most recent call last):
File "runner.py", line 9, in <module>
assert 'py37' in cp.stdout
AssertionError
ERROR: InvocationError for command /home/churchyard/tmp/totox/.tox/py36/bin/python runner.py (exited with code 1)

==================================================== log end ====================================================
✖ FAIL py36 in 4.851 seconds
____________________________________________________ summary ____________________________________________________
ERROR:   py36: parallel child exit code 1
ERROR:   py37: parallel child exit code 1
ERROR:   py38: parallel child exit code 1

# Fixed code
def _summary(self):
    is_parallel_child = PARALLEL_ENV_VAR_KEY_PRIVATE in os.environ
    if not is_parallel_child:
        reporter.separator("_", "summary", reporter.Verbosity.QUIET)
    exit_code = 0
    for venv in self.venv_dict.values():
        report = reporter.good
        status = getattr(venv, "status", "undefined")
        if isinstance(status, tox.exception.InterpreterNotFound):
            msg = " {}: {}".format(venv.envconfig.envname, str(status))
            if self.config.option.skip_missing_interpreters == "true":
                report = reporter.skip
            else:
                exit_code = 1
                report = reporter.error
        elif status == "platform mismatch":
            msg = " {}: {} ({!r} does not match {!r})".format(
                venv.envconfig.envname,
                str(status),
                sys.platform,
                venv.envconfig.platform,
            )
            report = reporter.skip
        elif status and status == "ignored failed command":
            msg = "  {}: {}".format(venv.envconfig.envname, str(status))
        elif status and status != "skipped tests":
            msg = "  {}: {}".format(venv.envconfig.envname, str(status))
            report = reporter.error
            exit_code = 1
        else:
            if not status:
                status = "commands succeeded"
            msg = "  {}: {}".format(venv.envconfig.envname, status)
        if not is_parallel_child:
            report(msg)
    if not exit_code and not is_parallel_child:
        reporter.good("  congratulations :)")
    path = self.config.option.resultjson
    if path:
        if not is_parallel_child:
            self._add_parallel_summaries()
        path = py.path.local(path)
        data = self.resultlog.dumps_json()
        reporter.line("write json report at: {}".format(path))
        path.write(data)
    return exit_code