2b7d403d90
The vibe half of the role-chain fix is a chain of field forwarding — `#resolveWorker` derives the role, spawn and rehydrate copy it onto the `VibeRecord`, and `#buildSpawnOptions` hands it to the executor. Any dropped link silently reverts vibe children to the `default` chain, and only the `task` spawn path had a regression test. Drive a real `VibeSessionRegistry.spawn()` for both bundled workers (`good` -> `task` -> `@task`, `fast` -> `sonic` -> `@smol`) with `runSubprocess` spied, and assert the captured `ExecutorOptions` pair the expanded patterns with the role behind them. A third case covers `task.agentModelOverrides` replacing the alias with an explicit selector, which must carry no role so the child keeps inheriting `default`. Breaking either link — the derivation in `#resolveWorker` or the forward in `#buildSpawnOptions` — fails both role assertions.