Here is the rules that get fired on the page where the read only gets cached. I just don't see anything in there that raises a red flag. It's just like whatever triggers the D2WContext to recalculate it's values stops working.
Mar 14 13:13:03 KMIWebCMSApp_1[5570] DEBUG NSLog - ****** fire : 20 : (pageConfiguration like 'Edit*') => task = edit (20501)
Mar 14 13:13:03 KMIWebCMSApp_1[5570] DEBUG NSLog - ****** fire : 10 : *true* => entity = entityForPageConfiguration [er.directtoweb.assignments.ERDKeyValueAssignment] (10000)
Mar 14 13:13:03 KMIWebCMSApp_1[5570] DEBUG NSLog - ****** fire : 0 : *true* => entityForPageConfiguration = <ERDDefaultModelAssignment> [er.directtoweb.assignments.defaults.ERDDefaultModelAssignment] (0)
Mar 14 13:13:03 KMIWebCMSApp_1[5570] DEBUG NSLog - ****** fire : 51 : ((task = 'edit') or (task = 'inspect')) => pageName = templateNameForInspectPage [er.directtoweb.assignments.ERDKeyValueAssignment] (51001)
Mar 14 13:13:03 KMIWebCMSApp_1[5570] DEBUG NSLog (EditKMIPrincipal) - ****** fire : 0 : *true* => targetOutput = html (0)
Mar 14 13:13:03 KMIWebCMSApp_1[5570] DEBUG NSLog (EditKMIPrincipal) - ****** fire : 0 : (frame = (java.math.BigDecimal)'1') => pageWrapperName = D2WEmptyWrapper (1)
Mar 14 13:13:03 KMIWebCMSApp_1[5570] DEBUG NSLog (EditKMIPrincipal) - <WOImage>: No height or width information provided for 'DownTriangle.gif'. If possible, this information should be provided for best performance.
Mar 14 13:13:03 KMIWebCMSApp_1[5570] DEBUG NSLog (EditKMIPrincipal) - ****** fire : 110 : (((task = 'inspect') or (task = 'edit')) and (object.isNonNull = (java.math.BigDecimal)'1') and (object.isNewObject = (java.math.BigDecimal)'0')) => branchChoices = ({branchButtonLabel = "Inspect"; branchIcon = "g"; branchName = "inspectObject"; }, {branchButtonLabel = "Edit"; branchIcon = "%"; branchName = "editObject"; }, {branchButtonLabel = "Add"; branchIcon = ""; branchName = "createObject"; }) (110003)
Mar 14 13:13:03 KMIWebCMSApp_1[5570] DEBUG NSLog (EditKMIPrincipal) - ****** fire : 100 : (task = 'edit') => selectedTabIndex = 1 (100001)
Mar 14 13:13:03 KMIWebCMSApp_1[5570] DEBUG NSLog (EditKMIPrincipal) - ****** fire : 22 : ((task = 'edit') or (task = 'inspect')) => repetitionComponentName = KMID2WInspectPageRepetition (22001)
Mar 14 13:13:03 KMIWebCMSApp_1[5570] DEBUG NSLog (EditKMIPrincipal) - ****** fire : 100 : ((task = 'edit') and (entity.name = 'KMIPrincipal')) => displayPropertyKeys = (("Details", "userName", "firstName", "lastName", "emailAddress", "phoneNumber"), ("Password", "password", "passwordConfirm")) (100002)
Mar 14 13:13:03 KMIWebCMSApp_1[5570] DEBUG NSLog (EditKMIPrincipal) - ****** fire : 10 : *true* => displayNameForProperty = <ERDDefaultDisplayNameAssignment> [er.directtoweb.assignments.defaults.ERDDefaultDisplayNameAssignment] (10000)
Mar 14 13:13:03 KMIWebCMSApp_1[5570] DEBUG NSLog (EditKMIPrincipal) - ****** fire : 0 : *true* => smartRelationship = <ERDDefaultModelAssignment> [er.directtoweb.assignments.defaults.ERDDefaultModelAssignment] (0)
Mar 14 13:13:03 KMIWebCMSApp_1[5570] DEBUG NSLog (EditKMIPrincipal) - ****** fire : 0 : *true* => smartAttribute = <ERDDefaultModelAssignment> [er.directtoweb.assignments.defaults.ERDDefaultModelAssignment] (0)
Mar 14 13:13:03 KMIWebCMSApp_1[5570] DEBUG NSLog (EditKMIPrincipal) - ****** fire : 22 : (task = 'edit') => componentName = KMID2WEditString (22001)
Mar 14 13:13:03 KMIWebCMSApp_1[5570] DEBUG NSLog (EditKMIPrincipal) - ****** fire : 5 : (smartAttribute.className = 'java.lang.String') => length = smartDefaultAttributeWidth [er.directtoweb.assignments.ERDKeyValueAssignment] (5001)
Mar 14 13:13:03 KMIWebCMSApp_1[5570] DEBUG NSLog (EditKMIPrincipal) - ****** fire : 0 : *true* => smartDefaultAttributeWidth = <ERDDefaultModelAssignment> [er.directtoweb.assignments.defaults.ERDDefaultModelAssignment] (0)
Mar 14 13:13:03 KMIWebCMSApp_1[5570] DEBUG NSLog (EditKMIPrincipal) - ****** fire : 0 : (smartAttribute.width > (java.math.BigDecimal)'0') => maxLength = smartAttribute.width [er.directtoweb.assignments.ERDKeyValueAssignment] (1)
Mar 14 13:13:03 KMIWebCMSApp_1[5570] DEBUG NSLog (EditKMIPrincipal) - ****** fire : 100 : ((task = 'edit') and (entity.name = 'KMIPrincipal') and (propertyKey = 'userName')) => readOnly = 1 [com.webobjects.directtoweb.BooleanAssignment] (100003)
Mar 14 13:13:03 KMIWebCMSApp_1[5570] DEBUG NSLog (EditKMIPrincipal) - ****** fire : 20 : (look = 'KMINativeLook') => elementNameForBottomActionBlock = div (20001)
Mar 14 13:13:03 KMIWebCMSApp_1[5570] DEBUG NSLog (EditKMIPrincipal) - ****** fire : 20 : (look = 'KMINativeLook') => classForBottomActionBlock = form-actions (20001)
Mar 14 13:13:03 KMIWebCMSApp_1[5570] DEBUG NSLog (EditKMIPrincipal) - ****** fire : 10 : *true* => saveButtonLabel = ERD2W.saveButtonLabel [er.directtoweb.assignments.delayed.ERDDelayedLocalizedAssignment] (10000)
Mar 14 13:13:03 KMIWebCMSApp_1[5570] DEBUG NSLog (EditKMIPrincipal) - ****** fire : 10 : *true* => cancelButtonLabel = ERD2W.cancelButtonLabel [er.directtoweb.assignments.delayed.ERDDelayedLocalizedAssignment] (10000)