As Pieter wrote on bitcoin-development list,
The protocol is whatever the network enforces - and that is some mix of versions of the reference client right now, but doesn't need to remain that way.
I would very much like to have a text book of rules that is authorative, and every client that follows it would be correct. Unfortunately, that is not how a consensus system works. All (full) clients validate all rules, and all must independently come to the same solution. Consensus is of utmost importance, more than some theoretical "correctness". If we'd have a specification document, and it was discovered that a lot of nodes on the network were doing something different than the document, those nodes would be buggy, but it would be the specification that is wrong.
Or restated: The fundamental problem being solved by bitcoin at a technical level, on a daily basis, is the
distributed consensus problem (
link).
We fully support the writing of specifications and documentation, which you can see here
https://en.bitcoin.it/wiki/Protocol_specificationAnd changes to the existing protocol are formally documented here,
https://en.bitcoin.it/wiki/Bitcoin_Improvement_ProposalsUltimately the operational definition of consensus comes from what the network accepts/expects, not a theoretical paper. Specification practices are healthy as a manual, human-based method of achieving consensus on network protocol rules. Alternate client implementations (c.f.
heterogeneous environment) are another good practice.
But the collective software rules are always the final specification,
by definition. That is what bitcoin does, achieve consensus.
A few other observations:
Gnutella had a business and project environment with co-motivated individuals working on a few key codebases. The reference codebase in bitcoin, in contrast, has one paid developer (Gavin@BF) and a few part time unpaid volunteers.
All the big bitcoin businesses seem to either (a) contribute to BF, (b) use bitcoind without contributing back any testing/dev/specification resources, or (c) do their own thing entirely, not contributing back any testing/dev/specification resources.
Bitcoin is a
thing, an invention, not a funded project with a built-in set of professionals paid to ensure full spec/dev/test engineering effort. If you want something, DO IT. You cannot expect the engineering resources to do X to magically appear, just because you complained on an Internet forum.
In an unfunded open source project, arguing all day about the lack of full-engineering-team rigor is entirely wasted energy. Blame the dev team if that is your favorite target, that will not magically create extra time in the day or extra manpower to accomplish these extra tasks being demanded by non-contributors.
The time spent whining about what an unfunded effort fails to do could be better spent, say, creating a test network of full nodes running all known bitcoind versions, 0.3 through present. And test, test, test changes through that.