(Note - I am referencing C11 here for personal convenience, but the section numbering and contents is, AFAIR, the same from C99 up to C17. C23 changed the numbering a bit.)
The presence of a struct-declaration-list in a struct-or-union-specifier declares a new type, within a translation unit.
So two tagless structs with the same fields declared, compatibility is the same as always - within a translation unit, they declare distinct incompatible new types, while across translation units they are compatible.
Two types have compatible type if their types are the same. Additional rules for determining whether two types are compatible are described in 6.7.2 for type specifiers, in 6.7.3 for type qualifiers, and in 6.7.6 for declarators. 55) Moreover, two structure, union, or enumerated types declared in separate translation units are compatible if their tags and members satisfy the following requirements: If one is declared with a tag, the other shall be declared with the same tag. If both are completed anywhere within their respective translation units, then the following additional requirements apply: there shall be a one-to-one correspondence between their members such that each pair of corresponding members are declared with compatible types;