You don't need to worry about tick and tock phases of the clock.
The values stored in a register (be it D, A, M, or PC) just before the end of an instruction are the values of the expression on the right just after the start of the instruction. Don't make it harder than it is.
Having said that, there is (or perhaps was) a bug in the CPU Emulator that produced incorrect results in a pretty specific case involving a conditional jump in a statement that updates the A register -- a case that is unlikely to be used in practice, but turns out does have at least one oddball use case that I've thought of.
The bug was confirmed in the desktop tools, but I don't know if it was fixed or if it was ever present in the online tools (which have had a few of their own bugs that the desktop tools never had).
So, in your example, you have:
A M D M[1] M[2]
? ? ? 0 7
2 7 ? 0 7 @2
2 7 1 0 7 D = 1
1 7 1 0 7 A = D
1 1 1 1 7 AMD = M+D
The memory map for each row is what it looks like after the instruction on that row executed. But the instruction uses the values at the end of the prior instruction (i.e., the values from the previous line).
One thing that I think might be causing your confusion is a notion that memory someone continues to remember what the address was even after the address changes.
As soon as the A register's output changes, the address sent to memory changes and memory immediately outputs the data associated with the new address. The memory has no mechanism to act on anything other than the A register's output current output, as that logic is one hundred percent combinational.