It is important to note that FEFLOW references Ss and Sr as saturation, not as water content. Thus completely filled pores correspond to a value of 1 rather than the porosity. This is why Ss is 1 by default. FEFLOW accounts for porosity internally.
The quickest solution to this would probably be to copy the top node elevations to ALL nodes of a nodal User Data distribution and then use the value at the current node in this distribution.
Aside from this workaround, and assuming that you're working in a layered model, there is a way within the expression editor as well: There is a template for getting the value at a specific node index (indicated by brackets in the toolbar, check out the tooltips). With this you can get Elev(node index). But what's the node index of the top node corresponding to your current node? As FEFLOW numbers the nodes slice by slice and in the same order in each slice, you can get the node index of the top node by current node index (Idxn) minus (Current Slice Number Nos - 1) multiplied with the number of nodes per slice Nonslice. All the respective numbers can be found in the Mesh - Node Data section on the right hand side of the dialog.
Let me anser your second question: Those constraints are put as FEFLOW does not require a fixed-concentration BC when water flows out of the system at a boundary. Thus it is good practise to apply the fixed-concentration BC only for water inflow - and this is what the constraint with a value of 0 does.
Hi, in steady-state the correct working of constraints ist not strictly guaranteed. They are evaluated once and then kept, as otherwise the model would very likely loop infinitely over finding the correct status. In such a case, where the spring BCs keep infiltrating water, I recommend to run the model in transient for a while. Once the correct water table is found, it might work to run scenarios in steady-state again (assuming that the conditions at the springs do not change much).