One test because a hybrid scenario needs both halves at once. Seeding over HTTP and asserting in the browser inside a single scenario is only expressible if the API client and the page are fixtures on the same test object; split them per layer and you are back to writing glue between two runners. An API scenario simply never touches the page fixture, which costs nothing because fixtures are lazy.
Worker-scoped, resolved once per worker process:
sdods — the project and layer selectionregistry and config — the discovered projects and the resolved configurationenv, runDir, harModeauth — the strategy, overridable per projectdb, userPool, authCache, healHistory
Per scenario: scenario, apiContext, api, data, user, storageState, heal, pages, shots.
So a page object may assume the configuration and the healer are ready, and must not assume anything about another scenario, because pages is per scenario.
You extend the same object in steps/fixtures.ts, and generation imports the test from there, which is why that file path is not negotiable.