When the bridge is used in a Portlet 3.0 environment, it generates all markup in the Portlet 3.0 HEADER_PHASE. It then saves off the markup to be rendered in the RENDER_PHASE. However, if the HEADER_PHASE fails to run or generates no markup for the portlet, the portlet will render no markup and fail silently. This situation occurs for example when the Portlet 3.0 bridge is run in a portlet which specifies Portlet 2.0 in its portlet.xml (causing the HEADER_PHASE to be skipped for backward compat).
To improve the developer experience, the bridge should log a warning or error or throw a NullPointerException when no markup is generated in the HEADER_PHASE. The markup should be checked in the RENDER_PHASE, specifically here: https://github.com/liferay/liferay-faces-bridge-impl/blob/e77c9a3/bridge-impl/src/main/java/com/liferay/faces/bridge/internal/BridgePhaseRenderCompatImpl.java#L68-L75