The only problem is that you have forgotten a mandatory piece in the command.
C-h v org-agenda-custom-commands says in part:
Each entry is a list like this:
(key desc type match settings files)
type The command type, any of the following symbols:
agenda The daily/weekly agenda.
match What to search for:
For all other commands, this should be the empty string.
settings A list of option settings, similar to that in a let form, so like
this: ((opt1 val1) (opt2 val2) ...). The values will be
evaluated at the moment of execution, so quote them when needed.
Since you are not using a match you just omitted it, but that's not correct: For all other commands, this (i.e. the match expression) should be the empty string.
So it is looking for a match expression and since there is no empty string there, it goes after the settings instead and tries to interpret them as a match expression, with predictably chaotic results.
("o" ;; Key
"todays agenda for current buffer" ;; Description
agenda ;; Type agenda
"" ;; Match expression
(org-agenda-span 1)) ;; Options
That seems to have worked in my (rather superficial) experiment.