The changing needs of modern application systems demand new and radical software architectures to support them. The attraction of persistent systems is that they define precisely the extent to which they are open, thereby allowing the dynamically changing resource requirements of applications to be tracked accurately within the persistent environment. Thus, an ever-growing body of work is being established to study the nature of running applications, and to use the information gleaned, to improve the runtime execution of these applications. Here we propose a new architectural approach to constructing persistent systems that accommodates, and thus is compliant to, the needs of particular applications. By separating policy from mechanism in all components, the architecture may be tailored to the policy needs of the application. ‡ ‡ We first propose a generic architecture for compliance, and then show how it may be instantiated. Finally, we describe an example of how the architecture operates in a manner that is compliant to a target application. We postulate, since we have not yet measured, that the benefits of compliant architectures will be a reduction in complexity, with corresponding gains in flexibility, portability, understandability in terms of failure semantics, and performance. ‡ ‡ Policy may be regarded as strategy for achieving a goal, such as a cache eviction algorithm, whereas mechanism is the method by which the objective is achieved, such as the physical movement of the cache lines. As we see later, policy and mechanism are composable to form new mechanism. ; 30:363-386 * This is the situation found in real-time applications. The term operating software has been used to characterise such real-time systems to emphasise the intimate connection between the real-time application and the real-time operating system [26].let init ← any (0) let initObject ← vector @1 of [init, init, init] ! A vector (array) of dummy objects.let clusterRoots ← vector @1 of [init, init, init, init, init] ! The empty vector of cluster roots.let clusterObjects ← vector @1 of [initObject, initObject, initObject, initObject] ! The empty vector of vectors of associated objects. ! The root index is used to identify the vector of associated objects within this.