Add doc/note/tokens.md
diff --git a/doc/note/tokens.md b/doc/note/tokens.md
new file mode 100644
index 0000000..8a9bde0
--- /dev/null
+++ b/doc/note/tokens.md
@@ -0,0 +1,156 @@
+# Tokens
+
+Some Wuffs codecs transform between byte streams and token streams. For
+example, a JSON decoder might transform `[1,true,"abc\txyz"]` as
+
+```
+Bytes    [  1  ,  t  r  u  e  ,  "  a  b  c  \  t  x  y  z  "  ]
+Tokens   0  1  2  3.........  4  5  6......  7...  8......  9  10
+Chains   -  -  -  ----------  -  ----------------------------  -
+```
+
+The tokens partition the bytes. Each byte belongs to exactly one token. Each
+token spans zero or more bytes.
+
+Just as [I/O buffers](/doc/note/io-input-output.md) and
+[coroutines](/doc/note/coroutines.md) mean that a byte stream doesn't need to
+be entirely in memory at any point, token buffers similarly allow a token
+stream to be produced and consumed incrementally.
+
+Nonetheless, conceptually, if the byte stream was a single contiguous slice
+then each token would correspond to a sub-slice, one whose length was the token
+length and whose position was the sum of all previous tokens' lengths.
+
+Consecutive tokens can also form token chains, which capture higher level
+concepts. For example, the JSON string `"abc\txyz"` can correspond to multiple
+tokens. One reason is that the maximum token length is `65535` bytes, but JSON
+strings can be longer. Another reason is that different parts of the encoded
+string are treated differently when reconstructing the decoded string:
+
+- Decoding the first or last `"` is a no-op.
+- Decoding `abc` or `xyz` is a `memcpy`.
+- Decoding the backslash-escaped `\t` should produce a tab character.
+
+
+## Representation
+
+A token is just a `uint64_t`. The broad divisions are:
+
+- Bits 63 .. 18 (46 bits) is the value.
+- Bits 17 .. 16  (2 bits) is `LP` and `LN` (`link_prev` and `link_next`).
+- Bits 15 ..  0 (16 bits) is the length.
+
+The `LP` and `LN` bits denote tokens that are part of a multi-token chain:
+
+- `LP` means that this token is not the first (there is a previous token).
+- `LN` means that this token is not the last  (there is a next     token).
+
+A stand-alone token will have both link bits set to zero.
+
+```
++-----+-------------+-------+-------------+-----+-----+-----------+
+|  1  |      21     |   3   |      21     |  1  |  1  |     16    |
++-----+-------------+-------+-------------+-----+-----+-----------+
+[..................value..................]  LP    LN     length
+[..1..|..........~value_extension.........]
+[..0..|.value_major.|.....value_minor.....]
+[..0..|......0......|..VBC..|.....VBD.....]
+```
+
+The value bits can be sub-divided in multiple ways. First, the high bit:
+
+- Bits 63 .. 63  (1 bit)  denote an extended (1) or simple (0) token.
+
+
+### Extended Tokens
+
+- Bits 62 .. 18 (45 bits) is the bitwise-not (~) of the `value_extension`.
+
+Extended tokens are typically part of a multi-token chain whose first token is
+a simple token that provides the semantics for each `value_extension`.
+
+
+### Simple Tokens
+
+- Bits 62 .. 42 (21 bits) is the `value_major`.
+- Bits 41 .. 18 (24 bits) is the `value_minor`.
+
+The `value_major` is a 21-bit [Base38](doc/note/base38-and-fourcc.md) number.
+For example, an HTML tokenizer might produce a combination of "base" tokens
+(see below) and tokens whose `value_major` is `0x109B0B`, the Base38 encoding
+of `html`. The `value_major` forms a namespace that distinguishes e.g.
+HTML-specific tokens from JSON-specific tokens.
+
+If `value_major` is non-zero then `value_minor` has whatever meaning the
+tokenizer's package assigns to it.
+
+
+### VBCs and VBDs
+
+A zero `value_major` is reserved for Wuffs' built-in "base" package. The
+`value_minor` is further sub-divided:
+
+ - Bits 41 .. 39  (3 bits) is the `VBC` (`value_base_category`).
+ - Bits 38 .. 18 (21 bits) is the `VBD` (`value_base_detail`).
+
+The high 46 bits (bits 63 .. 18) only have `VBC` and `VBD` semantics when the
+high 22 bits (the `extended` and `value_major` parts) are all zero. An
+equivalent test is that the high 25 bits (the notional `VBC`), as either an
+unsigned integer or a sign-extended integer, is in the range `0 ..= 7`.
+
+These `VBC`s organize tokens into broad groups, generally applicable (as
+opposed to being e.g. HTML-specific or JSON-specific). For example, strings and
+numbers are two `VBC`s. Structure is another, for container boundaries like the
+start and end of HTML elements and JSON arrays.
+
+Filler is yet another `VBC`. Such tokens can generally be ignored (other than
+accumulating their length). Filler is most often encountered as whitespace, but
+also includes JSON commas (which are [structurally
+inessential](https://www.tbray.org/ongoing/When/201x/2016/08/20/Fixing-JSON#p-1))
+and comments.
+
+The `VBD` semantics depend on the `VBC`. For example, at 21 bits, the `VBD` can
+hold every valid Unicode code point, up to U+10FFFF. A `\t` or `\u2603` in a
+JSON string can each be represented by a single `VBC__UNICODE_CODE_POINT` token
+whose `VBD` is `0x0009` or `0x2603`, meaning the Unicode code points U+0009
+CHARACTER TABULATION (the ASCII tab character) or U+2603 SNOWMAN.
+
+More details on the `VBC` and `VBD` bit assignments are in the [`source
+code`](/internal/cgen/base/token-public.h).
+
+
+## SAX/Pull versus DOM/Push
+
+For file formats that conceptually decode into a node tree, such as HTML or
+JSON, Wuffs typically provides a
+[SAX](https://en.wikipedia.org/wiki/Simple_API_for_XML)-like pull parser, not a
+[DOM](https://en.wikipedia.org/wiki/Document_Object_Model)-like push parser.
+There are general reasons for [favoring pull
+parsers](https://github.com/raphlinus/pulldown-cmark/blob/master/README.md#why-a-pull-parser),
+but also, Wuffs code cannot [dynamically allocate
+memory](/doc/note/memory-safety.md), nor does Wuffs have an `unsafe` keyword or
+a foreign function interface, so a caller cannot pass arbitrary callbacks into
+Wuffs code. Instead, Wuffs just outputs tokens and tokens are just `uint64_t`s.
+
+The [example/jsonfindptrs](/example/jsonfindptrs/jsonfindptrs.cc) program
+demonstrates creating a traditional DOM-like node tree from a SAX-like token
+stream. The [example/jsonptr](/example/jsonptr/jsonptr.cc) program demonstrates
+a different, lower-level approach that works directly on tokens, where the
+entire program (not just the Wuffs library) never calls `malloc`.
+
+
+## Example Token Stream
+
+```
+$ gcc script/print-json-token-debug-format.c && \
+>   ./a.out -all-tokens -human-readable < test/data/json-things.formatted.json
+pos=0x00000000  len=0x0001  link=0b00  vbc=1:Structure........  vbd=0x004011
+pos=0x00000001  len=0x0005  link=0b00  vbc=0:Filler...........  vbd=0x000000
+pos=0x00000006  len=0x0001  link=0b01  vbc=2:String...........  vbd=0x000013
+pos=0x00000007  len=0x0002  link=0b11  vbc=2:String...........  vbd=0x000021
+pos=0x00000009  len=0x0001  link=0b10  vbc=2:String...........  vbd=0x000013
+etc
+pos=0x00000094  len=0x0001  link=0b10  vbc=2:String...........  vbd=0x000013
+pos=0x00000095  len=0x0001  link=0b00  vbc=0:Filler...........  vbd=0x000000
+pos=0x00000096  len=0x0001  link=0b00  vbc=1:Structure........  vbd=0x001042
+```
diff --git a/internal/cgen/base/token-public.h b/internal/cgen/base/token-public.h
index 1484552..aa37f13 100644
--- a/internal/cgen/base/token-public.h
+++ b/internal/cgen/base/token-public.h
@@ -16,63 +16,10 @@
 
 // ---------------- Tokens
 
+// wuffs_base__token is an element of a byte stream's tokenization.
+//
+// See https://github.com/google/wuffs/blob/master/doc/note/tokens.md
 typedef struct {
-  // The repr's 64 bits are divided as:
-  //
-  // +-----+-------------+-------+-------------+-----+-----+-----------+
-  // |  1  |      21     |   3   |      21     |  1  |  1  |     16    |
-  // +-----+-------------+-------+-------------+-----+-----+-----------+
-  // [..................value..................]  LP    LN     length
-  // [..1..|..........~value_extension.........]
-  // [..0..|.value_major.|.....value_minor.....]
-  // [..0..|.........VBC.........|.....VBD.....]
-  //
-  // The broad divisions are:
-  //  - Bits 63 .. 18 (46 bits) is the value.
-  //  - Bits 17 .. 16 ( 2 bits) is LP and LN (link_prev and link_next).
-  //  - Bits 15 ..  0 (16 bits) is the length.
-  //
-  // ----
-  //
-  // The value bits can be sub-divided in multiple ways. First, the high bit:
-  //  - Bits 63 .. 63 ( 1 bits) is an extended (1) or simple (0) token.
-  //
-  // For extended tokens:
-  //  - Bits 62 .. 18 (45 bits) is the bitwise-not (~) of the value_extension.
-  //
-  // For simple tokens:
-  //  - Bits 62 .. 42 (21 bits) is the value_major.
-  //  - Bits 41 .. 18 (24 bits) is the value_minor.
-  //  - Bits 62 .. 39 (24 bits) is the VBC (value_base_category).
-  //  - Bits 38 .. 18 (21 bits) is the VBD (value_base_detail).
-  //
-  // The value_major is a 21-bit [Base38](doc/note/base38-and-fourcc.md) value.
-  // If all of its bits are zero (special cased for Wuffs' built-in "base"
-  // package) then the value_minor is further sub-divided:
-  //  - Bits 41 .. 39 ( 3 bits) is the VBC (value_base_category).
-  //  - Bits 38 .. 18 (21 bits) is the VBD (value_base_detail).
-  //
-  // The high 46 bits (bits 63 .. 18) only have VBC and VBD semantics when the
-  // high 22 bits (the value_major) are all zero. An equivalent test is that
-  // the high 25 bits (the notional VBC) has a value in the range 0 ..= 7.
-  //
-  // At 21 bits, the VBD can hold every valid Unicode code point.
-  //
-  // If value_major is non-zero then value_minor has whatever arbitrary meaning
-  // the tokenizer's package assigns to it.
-  //
-  // ----
-  //
-  // Multiple consecutive tokens can form a larger conceptual unit. For
-  // example, an "abc\tz" string is a single higher level concept but at the
-  // lower level, it could consist of multiple tokens: the quotes '"', the
-  // ASCII texts "abc" and "z" and the backslash-escaped tab '\t'. The LP and
-  // LN (link_prev and link_next) bits denote tokens that are part of a
-  // multi-token chain:
-  //  - LP means that this token is not the first (there is a previous token).
-  //  - LN means that this token is not the last  (there is a next     token).
-  //
-  // In particular, a stand-alone token will have both link bits set to zero.
   uint64_t repr;
 
 #ifdef __cplusplus
@@ -151,6 +98,10 @@
 // CONVERT_1_DST_4_SRC_BACKSLASH_X means a source like "\\x23\\x67\\xAB", where
 // 12 src bytes encode 3 dst bytes.
 //
+// Post-processing may further transform those D destination bytes (e.g. treat
+// "\\xFF" as the Unicode code point U+00FF instead of the byte 0xFF), but that
+// is out of scope of this VBD's semantics.
+//
 // When src is the empty string, multiple conversion algorithms are applicable
 // (so these bits are not necessarily mutually exclusive), all producing the
 // same empty dst string.
diff --git a/internal/cgen/data.go b/internal/cgen/data.go
index 0537a67..7d5d0e6 100644
--- a/internal/cgen/data.go
+++ b/internal/cgen/data.go
@@ -382,13 +382,7 @@
 	""
 
 const baseTokenPublicH = "" +
-	"// ---------------- Tokens\n\ntypedef struct {\n  // The repr's 64 bits are divided as:\n  //\n  // +-----+-------------+-------+-------------+-----+-----+-----------+\n  // |  1  |      21     |   3   |      21     |  1  |  1  |     16    |\n  // +-----+-------------+-------+-------------+-----+-----+-----------+\n  // [..................value..................]  LP    LN     length\n  // [..1..|..........~value_extension.........]\n  // [..0..|.value_major.|.....value_minor.....]\n  // [..0..|.........VBC.........|.....VBD.....]\n  //\n  // The broad divisions are:\n  //  - Bits 63 .. 18 (46 bits) is the value.\n  //  - Bits 17 .. 16 ( 2 bits) is LP and LN (link_prev and link_next).\n  //  - Bits 15 ..  0 (16 bits) is the length.\n  //\n  " +
-	"" +
-	"// ----\n  //\n  // The value bits can be sub-divided in multiple ways. First, the high bit:\n  //  - Bits 63 .. 63 ( 1 bits) is an extended (1) or simple (0) token.\n  //\n  // For extended tokens:\n  //  - Bits 62 .. 18 (45 bits) is the bitwise-not (~) of the value_extension.\n  //\n  // For simple tokens:\n  //  - Bits 62 .. 42 (21 bits) is the value_major.\n  //  - Bits 41 .. 18 (24 bits) is the value_minor.\n  //  - Bits 62 .. 39 (24 bits) is the VBC (value_base_category).\n  //  - Bits 38 .. 18 (21 bits) is the VBD (value_base_detail).\n  //\n  // The value_major is a 21-bit [Base38](doc/note/base38-and-fourcc.md) value.\n  // If all of its bits are zero (special cased for Wuffs' built-in \"base\"\n  // package) then the value_minor is further sub-divided:\n  //  - Bits 41 .. 39 ( 3 bits) is the VBC (value_base_category).\n  //  - Bits 38 .. 18 (21 bits) is the VBD (value_base_detail).\n  //\n  // The high 46 bits (bits 63 .. 18) only have VBC and VBD semantics when the\n  // high 22 bits (the value_major) are all zero. An eq" +
-	"uivalent test is that\n  // the high 25 bits (the notional VBC) has a value in the range 0 ..= 7.\n  //\n  // At 21 bits, the VBD can hold every valid Unicode code point.\n  //\n  // If value_major is non-zero then value_minor has whatever arbitrary meaning\n  // the tokenizer's package assigns to it.\n  //\n  " +
-	"" +
-	"// ----\n  //\n  // Multiple consecutive tokens can form a larger conceptual unit. For\n  // example, an \"abc\\tz\" string is a single higher level concept but at the\n  // lower level, it could consist of multiple tokens: the quotes '\"', the\n  // ASCII texts \"abc\" and \"z\" and the backslash-escaped tab '\\t'. The LP and\n  // LN (link_prev and link_next) bits denote tokens that are part of a\n  // multi-token chain:\n  //  - LP means that this token is not the first (there is a previous token).\n  //  - LN means that this token is not the last  (there is a next     token).\n  //\n  // In particular, a stand-alone token will have both link bits set to zero.\n  uint64_t repr;\n\n#ifdef __cplusplus\n  inline int64_t value() const;\n  inline int64_t value_extension() const;\n  inline int64_t value_major() const;\n  inline int64_t value_base_category() const;\n  inline uint64_t value_minor() const;\n  inline uint64_t value_base_detail() const;\n  inline bool link_prev() const;\n  inline bool link_next() const;\n  inline uint64_t length() " +
-	"const;\n#endif  // __cplusplus\n\n} wuffs_base__token;\n\nstatic inline wuffs_base__token  //\nwuffs_base__make_token(uint64_t repr) {\n  wuffs_base__token ret;\n  ret.repr = repr;\n  return ret;\n}\n\n  " +
+	"// ---------------- Tokens\n\n// wuffs_base__token is an element of a byte stream's tokenization.\n//\n// See https://github.com/google/wuffs/blob/master/doc/note/tokens.md\ntypedef struct {\n  uint64_t repr;\n\n#ifdef __cplusplus\n  inline int64_t value() const;\n  inline int64_t value_extension() const;\n  inline int64_t value_major() const;\n  inline int64_t value_base_category() const;\n  inline uint64_t value_minor() const;\n  inline uint64_t value_base_detail() const;\n  inline bool link_prev() const;\n  inline bool link_next() const;\n  inline uint64_t length() const;\n#endif  // __cplusplus\n\n} wuffs_base__token;\n\nstatic inline wuffs_base__token  //\nwuffs_base__make_token(uint64_t repr) {\n  wuffs_base__token ret;\n  ret.repr = repr;\n  return ret;\n}\n\n  " +
 	"" +
 	"// --------\n\n#define WUFFS_BASE__TOKEN__LENGTH__MAX_INCL 0xFFFF\n\n#define WUFFS_BASE__TOKEN__VALUE__SHIFT 18\n#define WUFFS_BASE__TOKEN__VALUE_EXTENSION__SHIFT 18\n#define WUFFS_BASE__TOKEN__VALUE_MAJOR__SHIFT 42\n#define WUFFS_BASE__TOKEN__VALUE_BASE_CATEGORY__SHIFT 39\n#define WUFFS_BASE__TOKEN__VALUE_MINOR__SHIFT 18\n#define WUFFS_BASE__TOKEN__VALUE_BASE_DETAIL__SHIFT 18\n#define WUFFS_BASE__TOKEN__LINK__SHIFT 16\n#define WUFFS_BASE__TOKEN__LENGTH__SHIFT 0\n\n#define WUFFS_BASE__TOKEN__LINK_PREV 0x20000\n#define WUFFS_BASE__TOKEN__LINK_NEXT 0x10000\n\n  " +
 	"" +
@@ -398,8 +392,8 @@
 	"" +
 	"// --------\n\n#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__PUSH 0x00001\n#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__POP 0x00002\n#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_NONE 0x00010\n#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_LIST 0x00020\n#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__FROM_DICT 0x00040\n#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_NONE 0x01000\n#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_LIST 0x02000\n#define WUFFS_BASE__TOKEN__VBD__STRUCTURE__TO_DICT 0x04000\n\n" +
 	"" +
-	"// --------\n\n// \"DEFINITELY_FOO\" means that the destination bytes (and also the source\n// bytes, for 1_DST_1_SRC_COPY) are in the FOO format. Definitely means that\n// the lack of the bit is conservative: it is valid for all-ASCII strings to\n// have neither DEFINITELY_UTF_8 or DEFINITELY_ASCII bits set.\n#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_UTF_8 0x00001\n#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_ASCII 0x00002\n\n// \"CONVERT_D_DST_S_SRC\" means that multiples of S source bytes (possibly\n// padded) produces multiples of D destination bytes. For example,\n// CONVERT_1_DST_4_SRC_BACKSLASH_X means a source like \"\\\\x23\\\\x67\\\\xAB\", where\n// 12 src bytes encode 3 dst bytes.\n//\n// When src is the empty string, multiple conversion algorithms are applicable\n// (so these bits are not necessarily mutually exclusive), all producing the\n// same empty dst string.\n#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP 0x00010\n#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY 0x00020\n#" +
-	"define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_2_SRC_HEXADECIMAL 0x00040\n#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_4_SRC_BACKSLASH_X 0x00080\n#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_3_DST_4_SRC_BASE_64_STD 0x00100\n#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_3_DST_4_SRC_BASE_64_URL 0x00200\n#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_4_DST_5_SRC_ASCII_85 0x00400\n\n  " +
+	"// --------\n\n// \"DEFINITELY_FOO\" means that the destination bytes (and also the source\n// bytes, for 1_DST_1_SRC_COPY) are in the FOO format. Definitely means that\n// the lack of the bit is conservative: it is valid for all-ASCII strings to\n// have neither DEFINITELY_UTF_8 or DEFINITELY_ASCII bits set.\n#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_UTF_8 0x00001\n#define WUFFS_BASE__TOKEN__VBD__STRING__DEFINITELY_ASCII 0x00002\n\n// \"CONVERT_D_DST_S_SRC\" means that multiples of S source bytes (possibly\n// padded) produces multiples of D destination bytes. For example,\n// CONVERT_1_DST_4_SRC_BACKSLASH_X means a source like \"\\\\x23\\\\x67\\\\xAB\", where\n// 12 src bytes encode 3 dst bytes.\n//\n// Post-processing may further transform those D destination bytes (e.g. treat\n// \"\\\\xFF\" as the Unicode code point U+00FF instead of the byte 0xFF), but that\n// is out of scope of this VBD's semantics.\n//\n// When src is the empty string, multiple conversion algorithms are applicable\n// (so these bits are not necessarily mutual" +
+	"ly exclusive), all producing the\n// same empty dst string.\n#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_0_DST_1_SRC_DROP 0x00010\n#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_1_SRC_COPY 0x00020\n#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_2_SRC_HEXADECIMAL 0x00040\n#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_1_DST_4_SRC_BACKSLASH_X 0x00080\n#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_3_DST_4_SRC_BASE_64_STD 0x00100\n#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_3_DST_4_SRC_BASE_64_URL 0x00200\n#define WUFFS_BASE__TOKEN__VBD__STRING__CONVERT_4_DST_5_SRC_ASCII_85 0x00400\n\n  " +
 	"" +
 	"// --------\n\n#define WUFFS_BASE__TOKEN__VBD__LITERAL__UNDEFINED 0x00001\n#define WUFFS_BASE__TOKEN__VBD__LITERAL__NULL 0x00002\n#define WUFFS_BASE__TOKEN__VBD__LITERAL__FALSE 0x00004\n#define WUFFS_BASE__TOKEN__VBD__LITERAL__TRUE 0x00008\n\n  " +
 	"" +
diff --git a/release/c/wuffs-unsupported-snapshot.c b/release/c/wuffs-unsupported-snapshot.c
index b5cca28..9b0b950 100644
--- a/release/c/wuffs-unsupported-snapshot.c
+++ b/release/c/wuffs-unsupported-snapshot.c
@@ -1875,63 +1875,10 @@
 
 // ---------------- Tokens
 
+// wuffs_base__token is an element of a byte stream's tokenization.
+//
+// See https://github.com/google/wuffs/blob/master/doc/note/tokens.md
 typedef struct {
-  // The repr's 64 bits are divided as:
-  //
-  // +-----+-------------+-------+-------------+-----+-----+-----------+
-  // |  1  |      21     |   3   |      21     |  1  |  1  |     16    |
-  // +-----+-------------+-------+-------------+-----+-----+-----------+
-  // [..................value..................]  LP    LN     length
-  // [..1..|..........~value_extension.........]
-  // [..0..|.value_major.|.....value_minor.....]
-  // [..0..|.........VBC.........|.....VBD.....]
-  //
-  // The broad divisions are:
-  //  - Bits 63 .. 18 (46 bits) is the value.
-  //  - Bits 17 .. 16 ( 2 bits) is LP and LN (link_prev and link_next).
-  //  - Bits 15 ..  0 (16 bits) is the length.
-  //
-  // ----
-  //
-  // The value bits can be sub-divided in multiple ways. First, the high bit:
-  //  - Bits 63 .. 63 ( 1 bits) is an extended (1) or simple (0) token.
-  //
-  // For extended tokens:
-  //  - Bits 62 .. 18 (45 bits) is the bitwise-not (~) of the value_extension.
-  //
-  // For simple tokens:
-  //  - Bits 62 .. 42 (21 bits) is the value_major.
-  //  - Bits 41 .. 18 (24 bits) is the value_minor.
-  //  - Bits 62 .. 39 (24 bits) is the VBC (value_base_category).
-  //  - Bits 38 .. 18 (21 bits) is the VBD (value_base_detail).
-  //
-  // The value_major is a 21-bit [Base38](doc/note/base38-and-fourcc.md) value.
-  // If all of its bits are zero (special cased for Wuffs' built-in "base"
-  // package) then the value_minor is further sub-divided:
-  //  - Bits 41 .. 39 ( 3 bits) is the VBC (value_base_category).
-  //  - Bits 38 .. 18 (21 bits) is the VBD (value_base_detail).
-  //
-  // The high 46 bits (bits 63 .. 18) only have VBC and VBD semantics when the
-  // high 22 bits (the value_major) are all zero. An equivalent test is that
-  // the high 25 bits (the notional VBC) has a value in the range 0 ..= 7.
-  //
-  // At 21 bits, the VBD can hold every valid Unicode code point.
-  //
-  // If value_major is non-zero then value_minor has whatever arbitrary meaning
-  // the tokenizer's package assigns to it.
-  //
-  // ----
-  //
-  // Multiple consecutive tokens can form a larger conceptual unit. For
-  // example, an "abc\tz" string is a single higher level concept but at the
-  // lower level, it could consist of multiple tokens: the quotes '"', the
-  // ASCII texts "abc" and "z" and the backslash-escaped tab '\t'. The LP and
-  // LN (link_prev and link_next) bits denote tokens that are part of a
-  // multi-token chain:
-  //  - LP means that this token is not the first (there is a previous token).
-  //  - LN means that this token is not the last  (there is a next     token).
-  //
-  // In particular, a stand-alone token will have both link bits set to zero.
   uint64_t repr;
 
 #ifdef __cplusplus
@@ -2010,6 +1957,10 @@
 // CONVERT_1_DST_4_SRC_BACKSLASH_X means a source like "\\x23\\x67\\xAB", where
 // 12 src bytes encode 3 dst bytes.
 //
+// Post-processing may further transform those D destination bytes (e.g. treat
+// "\\xFF" as the Unicode code point U+00FF instead of the byte 0xFF), but that
+// is out of scope of this VBD's semantics.
+//
 // When src is the empty string, multiple conversion algorithms are applicable
 // (so these bits are not necessarily mutually exclusive), all producing the
 // same empty dst string.