private void callFinishLifeCycleMethods() throws Throwable {
        Throwable firstThrownException = failedException;
        if (beforeScenarioMethodsExecuted) {
            try {
                if (currentTopLevelStage != null) {
                    executeAfterStageMethods(currentTopLevelStage);
                }
            } catch (Exception e) {
                firstThrownException = logAndGetFirstException(firstThrownException, e);
            }

            for (StageState stage : reverse(newArrayList(stages.values()))) {
                try {
                    executeAfterScenarioMethods(stage.instance);
                } catch (Exception e) {
                    firstThrownException = logAndGetFirstException(firstThrownException, e);
                }
            }
        }

        for (Object rule : reverse(scenarioRules)) {
            try {
                invokeRuleMethod(rule, "after");
            } catch (Exception e) {
                firstThrownException = logAndGetFirstException(firstThrownException, e);
            }
        }

        failedException = firstThrownException;

        if (!suppressExceptions && failedException != null) {
            throw failedException;
        }

        if (failIfPass && failedException == null) {
            throw new FailIfPassedException();
        }
    }
Has to be called when the scenario is finished in order to execute after methods.
jgiven-core/src/main/java/com/tngtech/jgiven/impl/ScenarioExecutor.java