Marcio -
So the way it works, each Espace is compiled into a separate IIS "application". Each time you deploy an espace, it looks in a central directory on the deployment controller where each module (espaces and extensions) are individually compiled to their current version, gets a copy of each one that it depends on, and puts it in its own application directory. *
Now, let's say you have a module (Producer) that is used by two other modules (Consumer A and Consumer B). Producer changes and Consumer A changes, you want to deploy to QA, but Consumer B is NOT ready to be deployed to QA. To make it worse, Producer has breaking changes in it that Consumer A depends on.
What will happen when you deploy from DEV to QA, you select Consumer A and it will require you to deploy Producer. You will have the choice to deploy the current version of Consumer B from DEV to QA... do NOT do it. You will also have the choice to REDEPLOY the version of Consumer B that is in QA... UNCHECK THAT! Now, when you do your deployment, Consumer B will still be compiled against the older version of Producer, it will still work exactly as it expects to using the older version of the code from Producer.
So the system is set up to let you make those kinds of changes without breaking other code, it's just a question of learning the way the deployments work... which is really not obvious or well-explained anywhere that I know of. It's totally understandable that this is not obvious to you (something which OutSystems should find a way to make more clear).
Of course, "I sure hope no one re-deploys Consumer B because Producer changed and Consumer B isn't ready for the changes yet" really is not a great plan at all. The OutSystems recommendation on this is to use feature flags. I know that there are many people who do not like feature flags (and I can understand why, even if I personally do not mind them, and in some cases prefer them), but that is the recommendation. Again, everyone's preferred way of working, but having been involved in some super huge projects/products built on OutSystems over the years, I have had less problems with feature flags than I have experienced in other systems with the problems around merging of branches and such... that's just my experience and I know others have had difference experiences so I know it isn't "truth".
J.Ja
* That's actually a simplification. What it REALLY does, is each time a version is created of a module, it compiles to a DLL, gets put into the central directory with some random characters added to the filename. Then, whenever a consume is published, it creates a symlink in its application directory pointing to the most recent version of the producer's DLL. The actual file in the central area gets deleted when no more consumers are pointing to it.