Biblatex, Oscola, footcite: punctuation

The root of all evil, so to speak, lies in oscola.bbx, more specifically the redefinition of postnote (l. 1670)

\renewbibmacro*{postnote}{%
  \ifboolexpr {test {\iffieldundef{postnote}} or
               test {\iftoggle{cbx@postnoteprinted}}}%
    {\midsentence}%<---- that's the little bugger
    {\ifboolexpr{test {\ifnumequal{\value{bbx@suppresspostnotedelim}}{1}}}
       {\setunit{\addspace}%
        \bbx@resetpostnotedelim}
       {\setunit{\postnotedelim}}%
     \usebibmacro{postnotepagination}}%
     \global\toggletrue{cbx@postnoteprinted}}

You can add the following to your preamble

\makeatletter
\renewbibmacro*{postnote}{%
  \ifboolexpr {test {\iffieldundef{postnote}} or
               test {\iftoggle{cbx@postnoteprinted}}}%
    {}%<---- nothing to see here
    {\ifboolexpr{test {\ifnumequal{\value{bbx@suppresspostnotedelim}}{1}}}
       {\setunit{\addspace}%
        \bbx@resetpostnotedelim}
       {\setunit{\postnotedelim}}%
     \usebibmacro{postnotepagination}}%
     \global\toggletrue{cbx@postnoteprinted}}
\makeatother

if you notice any adverse effect or insist on \midsentence, you can exchange the marked empty pair of curly braces {} for {\midsentence\nopunct}.

The MWE

\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage[babel]{csquotes}
\usepackage[
    backend=biber,
    style=oscola,
    natbib=true,
    sorting=nyt,
    maxbibnames=10,
    maxcitenames=2
]{biblatex}

\addbibresource{biblatex-examples.bib}

\makeatletter
\renewbibmacro*{postnote}{%
  \ifboolexpr {test {\iffieldundef{postnote}} or
               test {\iftoggle{cbx@postnoteprinted}}}%
    {}
    {\ifboolexpr{test {\ifnumequal{\value{bbx@suppresspostnotedelim}}{1}}}
       {\setunit{\addspace}%
        \bbx@resetpostnotedelim}
       {\setunit{\postnotedelim}}%
     \usebibmacro{postnotepagination}}%
     \global\toggletrue{cbx@postnoteprinted}}
\makeatother

\begin{document}
  Go\footcite{wilde} and again\footcite[123]{wilde} that's it\footcite{wilde}.
  \printbibliography
\end{document}

then yields enter image description here


Edit

The situation is more complicated than I thought. Punctuation is one of the features that is language dependent, so the output here looks different in different language. (You might notice that the MWE above used ngerman, which is probably not what you want.)

So an american document (and an english one for that matter) will without modifications yield the following

enter image description here

As you can see, there is an awful lot of double punctuation. You will find that footnote 8, however, does not suffer from double punctuation, this seems to be down to the way oscola handles postnotes in the first cite. If footnote 7 had contained a postnote, then footnote 8 would have gotten the superfluous comma (try it!).

A british document, meanwhile, looks like this

enter image description here

Note that there is no double punctuation, but the "ibid" is not (always) followed by a dot.

In an american (or english) document the following modifications seem to acheive what you want.

\makeatletter
\renewbibmacro*{footcite}{%
  \bbx@resetpostnotedelim%<----- reset the tracker here ...
  \usebibmacro{cite:citepages}%
  \global\togglefalse{cbx:loccit}%
  \ifboolexpr {test {\ifciteseen} or test {\ifciteibid}}
    {\ifboolexpr {test {\iffieldundef{shorthand}} 
                  or test {\bbx@ifnottrackingcites}}
       {\ifthenelse{\ifciteibid\AND\NOT\iffirstonpage}
          {\usebibmacro{footcite:ibid}\bbx@unsetpostnotedelim}%<-- ... so we can set it here
          {\usebibmacro{footcite:note}}}%
       {\usebibmacro{footcite:shorthand}}}
    {\usebibmacro{footcite:full}%
     \usebibmacro{footcite:save}}}
    
\renewbibmacro*{postnote}{%
  \ifboolexpr {test {\iffieldundef{postnote}} or
               test {\iftoggle{cbx@postnoteprinted}}}%
    {}%
    {\ifboolexpr{test {\ifnumequal{\value{bbx@suppresspostnotedelim}}{1}}}
       {\setunit{\addspace}%
        \bbx@resetpostnotedelim}
       {\setunit{\postnotedelim}}%
     \usebibmacro{postnotepagination}}%
  \global\toggletrue{cbx@postnoteprinted}}
\makeatother

The MWE

\documentclass[american]{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{babel}
\usepackage{csquotes}
\usepackage[backend=biber, style=oscola]{biblatex}
\addbibresource{biblatex-examples.bib}

\makeatletter
\renewbibmacro*{footcite}{%
  \bbx@resetpostnotedelim
  \usebibmacro{cite:citepages}%
  \global\togglefalse{cbx:loccit}%
  \ifboolexpr {test {\ifciteseen} or test {\ifciteibid}}
    {\ifboolexpr {test {\iffieldundef{shorthand}} 
                  or test {\bbx@ifnottrackingcites}}
       {\ifthenelse{\ifciteibid\AND\NOT\iffirstonpage}
          {\usebibmacro{footcite:ibid}\bbx@unsetpostnotedelim}
          {\usebibmacro{footcite:note}}}%
       {\usebibmacro{footcite:shorthand}}}
    {\usebibmacro{footcite:full}%
     \usebibmacro{footcite:save}}}
    
\renewbibmacro*{postnote}{%
  \ifboolexpr {test {\iffieldundef{postnote}} or
               test {\iftoggle{cbx@postnoteprinted}}}%
    {}
    {\ifboolexpr{test {\ifnumequal{\value{bbx@suppresspostnotedelim}}{1}}}
       {\setunit{\addspace}%
        \bbx@resetpostnotedelim}
       {\setunit{\postnotedelim}}%
     \usebibmacro{postnotepagination}}%
  \global\toggletrue{cbx@postnoteprinted}}
\makeatother

\begin{document}
  Go\footcite[8]{wilde} and again\footcite[123]{wilde} that's it\footcite{wilde}.
  
  And another\footcite[4]{baez/article} cite\footcite{baez/article}, again \footcite[23]{baez/article}.
  
  The Greek philosophers\footcite{aristotle:anima} must have known\footcite[9]{aristotle:anima} something\footcite{aristotle:anima}.
  
  \printbibliography
\end{document}

yields

enter image description here