1. paint a picture of something really cool
2. deliver the smallest possible subset of that functionality, that runs
3. be guided by "bug reports" that request features to fill these *gaps*
This only works for a "flat" project - that is, where each additional feature can be added as a module. This requires a concept that is "flat" and an implementation architecture that is "flat" (has places to add each feature.) If the concept is not flat (or unknown), or if the right architecture is not flat (or unknown), this approach doesn't work.
This helps explain the kinds of projects that have popular open source implementations: copies (of concept and implementations) and system software.
May be most relevant (possible) for small-to-medium size projects, but the principles of keeping the outcomes in mind and getting feedback* regularly (whether weekly or monthly, etc) are useful for me, at least.
* whether it's feasible to get the feedback from end user or from a tester.
This helps explain the kinds of projects that have popular open source implementations: copies (of concept and implementations) and system software.