1. A system for governing software architecture as designed, the system comprising: a memory operable to store code and a plurality of rules, the rules corresponding to classification, layering, abstraction, components, and links characteristics of the software architecture as designed, the code programmed to implement at least part of the software architecture as designed; and a processor configured to apply the rules to the code, the application testing the code for differences from the software architecture as designed and the software architecture as implemented in the code, such that the testing comprises testing for directional layering dependencies by identifying a layer hierarchy and testing for forbidden communication between layers of the hierarchy, abstraction skipping, cyclical dependencies, class breadth, and a combination of calling and being called a threshold number of times, and indicating portions of the program violating the rules.