On second thought, validation turned out to be a bit easier than anticipated. Again, the starting point is #createSchematicWiring, with one method (#focusGained) to intercept focus, one method (#when:send:to:) to process the change, and one instance variable <buffer> to hold the old value for a while, as in:
createSchematicWiring "capture entering a new Total Height or a new Total Weight"
totalWidthPresenter when: #focusGained send: #setBuffer: to: self with: totalWidthPresenter .
totalHeightPresenter when: #focusGained send: #setBuffer: to: self with: totalHeightPresenter .
totalHeightPresenter when: #valueChanged send: #totalHeightChanged to: self .
totalWidthPresenter when: #valueChanged send: #totalWidthChanged to: self .
"save the <bufferedObject> argument value, before it changes, for later processing or validation" buffer := bufferedObject value .
totalWidthChanged "Validate the new value"
(totalWidthPresenter value >= widthPresenter value) ifTrue: [ rectangle2WidthPresenter value: totalWidthPresenter value ]
ifFalse: [ totalWidthPresenter value: buffer ; view refreshContents . MessageBox errorMsg: '''Total Width'' value out of bounds' ]
#totalHeightChanged - is treated in a similar way.
In #totalWidthChanged, the input value can be processed against any set of rules needed, and if this fails, the old value is reinstated from the saved value, the presenter is refreshed and a message box is displayed to inform the user accordingly.
The next step is to display a text box next to the presenter with the focus, guiding the user by displaying the range of acceptable input values...