A container cannot query itself.
The common read: container-type marks an element as queryable, so a @container rule styles that element too once it is wide enough.
Four elements get the layout. The four replies each resolve the condition against the thread, which is 600px wide, and the thread resolves it against nothing at all. A @container rule with no name is evaluated against the nearest ANCESTOR query container of the element being styled, and no element is an ancestor of itself, so the search for the thread's container starts at the thread's parent and walks up.
There is no query container above the thread, so there is nothing eligible to evaluate the condition against, and the declarations never apply to the thread. Measured in Chromium, Firefox and WebKit: getComputedStyle(thread).gridTemplateColumns returns "none" while all four replies return "48px 552px", and adding one query container above the thread turns the thread's own value into "48px 552px" and takes the count to five of five, without changing the rule, the selector or a single declared width.
This problem never came up with media queries: the thing a media query asks about is the viewport, the viewport is above every element on the page, and so "the element I am styling" and "the box I am asking about" could not be the same element. With container queries both boxes are in your tree, and when one element does both jobs, the rule does not style that element and reports no error.
Nothing throws, nothing warns, the console stays empty in all three engines, and the rule is present in the CSSOM as a live CSSContainerRule the whole time. Delete container-type from the thread altogether and all five elements go unstyled, again with no error, because no element has an eligible container.
So the element that carries container-type is not a candidate for the rules it enables, and the fix is a change to the element tree. Give the styled thing a parent, put container-type on the parent, and let the rule target the child.

