Okay, here’s an easy way to think of it.
1. Trunk should be a complete copy of the latest code. It is basically your working directory. When you check in changes, you check them into trunk. Only thing special about trunk is the “Stable Tag”, which points to the latest RELEASED version of the code.
2. When you want to do a “release”, you change the Stable Tag in trunk to point at the new release version, then make a directory in tags with that version number. Into this directory, you’re going to copy all of the latest trunk.
What gets released will be what’s in the tags directory. But yes, you still need to have the latest code in trunk.
When I make changes, I make them to trunk. When it comes time to release those changes, I update the stable tag and copy trunk to the new tag directory.
Note: When you’re doing versioning, then the only thing that matters in the trunk’s readme.txt is the Stable Tag. Everything else will be read from the tagged version’s readme.txt. But you still want to have the complete readme.txt in trunk. Trunk should be a complete copy of your “working” code, because sometimes other people want to run the latest code instead of the latest “released” code. Having this in trunk adheres to convention and allows people to know what’s new and what you’re working on and so forth.