Hi Nick,
The Ftest is indeed a 1tailed test. In the afni GUI, an Fstat result looks the same when viewed as a 1 or 2sided test, rather than forcing an explicit change by the user, say. 3dClusterize is being more picky than the afni GUI because the user is already forced to specify the sidedness.
However the Fstat corresponds to a 2sided ttest, because both positive and negative results, if applicable, would be shown in the Ftest. To put it another way, the Ftest for a simple contrast could not possibly show a 1sided result of the betas, e.g., positive only, even though it is a 1tailed test. The positive and negative betas could not be separated with an Ftest.
For reference, it might be nice to verify some of the numbers. In doing so, we must keep in mind that the cdf program views F as 1sided, and t as 2sided. No options.
In your case, since the Fstat comes from a simple contrast, t=sqrt(F).
F(1,27) = 13.61 @ p=0.001. But p.0.001 corresponds to t(27)=sqrt(13.61) as a 2 sided test. And sqrt(13.61) = 3.689173.
cdf t2p fift 13.61 1 27
p = 0.00100109
cdf t2p fitt 3.689173 27
p = 0.00100109
To really do a 1tailed ttest, the threshold would have to be different, because ‘cdf’ assumes 2sided testing for the tstat. The 2sided conversion from p=0.001 shows the above t:
cdf p2t fitt 0.001 27
t = 3.68959
However for a 1sided test, ‘cdf’ should be fooled by using 2*p:
cdf p2t fitt 0.002 27
t = 3.42103
Verify this in the afni GUI:

threshold on the tstat in the afni GUI

rightclick on the “Thr” text above the threshold slider bar, and “Set pvalue” to 0.001
==> this should set the threshold to 3.68959

now rightclick again, and change “Sign” to “Pos only”
==> the p should change to 0.002

repeat step 2: rightclick and set p=0.001
==> this should set the tstat threshold to 3.42103
The result of step 4 should match the faked 1sided ptot conversion with cdf.
Anyway, that might be extra babbling, but it hopefully clarifies things.