Jitter or offset encodings are not yet implemented in Vega-Lite; see https://github.com/vega/vega-lite/issues/4703 for the relevant feature request.
In the meantime, the best way to approximate what you want is to use a column encoding, along with an x encoding built from a randomly-generated jitter. The transform and encoding might look something like this:
"transform": [{"calculate": "random()", "as": "jitter"}],
"encoding": {
"size": {"value": 65},
"column": {"field": "cv", "type": "ordinal", "spacing": 0},
"x": {
"field": "jitter",
"type": "quantitative",
"axis": {"title": null, "labels": false},
"scale": {"domain": [-1, 2]}
},
"y": {"field": "c", "type": "quantitative"},
"color": {"field": "os", "type": "nominal"}
}
A simplified example using your data can be seen here:

From there you can customize grids, ticks, labels, and the rest to get it to look how you would like. It's imperfect, but it's the only way to currently get this kind of behavior within the Vega-Lite grammar.