Determine if a dot(comma) program halts Dotcomma is a simple esolang I made a while ago that only uses four operators: [.,]. In this challenge, you'll determine if a dotcomma program consisting only of [.] halts. Without ,, there is no input, output, or queue, making this challenge possible.
Blocks:
Any code wrapped in [] is a block. All blocks and operators (.) have a return value. The inputted program will always consist of a single block, and the brackets will always be properly nested.
Operators:
The . operator's return value depends on what it is preceded by:

Any number of blocks: The sum of the blocks' return values
A dot: The previous .'s return value will be kept
The beginning of a block ([): 1

If a . is followed by a block, it will be treated as a loop. The loop will run only if the .s return value is not 0, and if the block being looped returns 0 at any point it will terminate.
If a . is followed by the end of a block (]), the .'s return value will be used as the block's. Otherwise, a block's return value is 0.
Examples:
[]

Returns true. There are no loops.
[[].[]]

Returns true. The . takes the return value of the first nested block, which is 0, skipping the second.
[.[]]

Returns true. The . returns 1, but the loop terminates immediately as the block returns 0.
[.[.]]

Returns false. The . returns 1, and the block being looped returns 1, creating an infinite loop.
[[.][].[.]]

Returns false. The [.] returns 1, which is added to the 0 returned by the [], resulting in 1 and causing the loop body to be run.
Other:
You may return a truthy/falsy value in your language (representing either whether it halts or does not, your choice), or two consistent values for halting and non-halting.
This is code-golf. Shortest answer in bytes (per language) wins.
Python 3, 215 bytes

m,v,*d=-1,[],
L,*l=0,
for c in input():
&#9;if c&gt;"[":a=v.pop();l.pop()*a and exit(1);d.pop();d or exit(0);v[m]=v[m]*(d[m]%2)+a;d[m]=1
&#9;elif c&gt;"Z":l+=[L and v[m]];v+=0,;d+=0,
&#9;else:v[m]=v[m]if d[m]else 1;d[m]=2
&#9;L=c&lt;"A"

Try it online!
Exit code 0 if it will halt, 1 otherwise.
This is just a naive implementation of the interpreter, but golfed down. Here's a ungolfed version with debug output.
+12 bytes to fix a bug
-8 bytes thanks to Unrelated String