Oh, I should add-- the bleeding edge has this comment from when I had fixed it that helps explain what to expect and when. It sort of obvious when you think about it, but frustratingly hard to glean from the official Couchbase docs:
ID: The id of the document in Couchbase, but only available if the query is NOT reduced
Document: Only available if the query is NOT reduced
Key: This is always available, but null if the query has been reduced, If un-redunced it is the first value passed into emit()
Value: This is always available. If reduced, this is the value returned by the reduce(), if not reduced it is the second value passed into emit()