You gff file is correct, by this definition the start coordinate must be less than the end coordinate, all parsing libraries should handle the coordinates and strand correctly. In fact the way it is encoded makes the string extraction using standard functions more efficient to use on sequence data that are always only given in one direction:
## Pseudocode, given start end ordered already
for all feature in ggf.features:
subseq = substring (chromosome, feature.start, feature.end)
# given substring function is 1-based, most to all substring functions work that way
subseq = reverse.complement(subseq) if feature.strand == "-"
## given start end not particularly ordered but identified by strand
for all feature in ggf.features:
(start, end) = sort (feature.start, feature.end)
## we save this operation each time we extract a feature
## this can be implemented in many ways, but will always result in 1 or 4 redundant
## machine register operations:
## 1. a > b ? 2.-4.: swap: a=tmp; a=b; b=tmp;
subseq = substring (chromosome, start, end)
subseq = reverse.complement(subseq) if feature.strand == "-"
Because, extractions are more common than writing a gff file (once vs. every time someone uses the genome file), we will save 3 (with sanity checking, because swap never happens) - 4 (without any sanity check) on sort each time we access a feature. Not saying that this really was the reason, but it might sound convincing.
Thank you Devon Ryan. I was also thinking it in the same way but I was not sure.