Ok - sort of solved. I had code in my AppServiceProvider as follows :
if (DB::connection() instanceof \Illuminate\Database\SQLiteConnection) {
DB::statement(DB::raw('PRAGMA foreign_keys=1'));
}
Which enforces 'proper' SQL foreign key constraints for sqlite (eg, triggers properly for onDelete()). But that seems to break dusk 2.x with the misleading 'readonly' error above. So commenting that out lets dusk work ok, but then phpunit fails because the code assume proper onDelete() functionality.
Replacing the above code with :
if ($this->app->environment('testing')) {
DB::statement(DB::raw('PRAGMA foreign_keys=1'));
}
Then both dusk and phpunit run ok (my .env/dusk setting for APP_ENV is 'local', for plain phpunit it's 'testing').
Bit of a hack, but it'll do for now...