The behaviour as known to me is that a constant defined inside a local procedure keeps it value.
That is only true for typed constants, and only true in the {$J+} compiler state (as Thaddy pointed out), which is normally true, since {$J+} is the default FPC setting, for historical reasons of Delphi compatibility. With {$J+} typed constants are assignable wherever they are declared (whether in a local procedure or not).
As has been often noted, the word constant in "typed constant" is rather misleading in this case, since the 'constant' is actually an initialized variable. Of course it does remain constant ... until you change its value.
Uhm... pardon me in advance, but i believe i misunderstood the first part of what you just wrote as it doesn't seem to add up for me (most probably wrong interpretation on my part).
In mode J- you are not allowed to change the value of a constant. So, we can rule out that it ever changes, and therefor will always contain the last assigned value (it keeps it value).
In mode J+ you are allowed to change the value of a constant but only when type defined. If it is not type defined the compiler does not allow you to change it during runtime and in case it is type defined it will keep its value (that was last assigned to it).
I admit i could perhaps have been more explicit in my wording: The behaviour as known to me is that a constant will always contain the value that was last assigned to it.
With regards to the second part of your message i agree that the name constant is misleading but on the other hand such constants behave differently as variables do when the circumstances are similar (e.g. variables defined in same way 'initializes' itself to again on re-entry of the procedure/function).