@zio.dev/zio-blocks 0.0.51 → 0.0.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/adr/2026-07-18-data-migration.md +123 -0
  2. package/guides/async-getting-started.md +687 -0
  3. package/guides/compile-time-resource-safety-with-scope.md +6 -0
  4. package/guides/getting-started-with-mux.md +0 -112
  5. package/guides/query-dsl-extending.md +1 -1
  6. package/guides/query-dsl-fluent-builder.md +1 -1
  7. package/guides/query-dsl-reified-optics.md +1 -1
  8. package/guides/query-dsl-sql.md +395 -1
  9. package/guides/sql-checked-interpolation.md +173 -0
  10. package/guides/sql-transactions.md +286 -0
  11. package/guides/telemetry-guide.md +131 -70
  12. package/guides/zio-schema-migration.md +6 -6
  13. package/index.md +200 -559
  14. package/package.json +1 -1
  15. package/reference/async.md +1379 -531
  16. package/reference/chunk.md +3 -3
  17. package/reference/codegen/index.md +1 -1
  18. package/reference/combinators.md +4 -4
  19. package/reference/config/config-decoder.md +460 -0
  20. package/reference/config/config-source.md +489 -0
  21. package/reference/config/errors.md +278 -0
  22. package/reference/config/flags.md +369 -0
  23. package/reference/config/formats.md +314 -0
  24. package/reference/config/index.md +304 -0
  25. package/reference/config/rollout.md +336 -0
  26. package/reference/context.md +6 -49
  27. package/reference/data-migration.md +269 -0
  28. package/reference/datastar/attributes.md +302 -0
  29. package/reference/datastar/events.md +234 -0
  30. package/reference/datastar/index.md +256 -0
  31. package/reference/datastar/signals.md +230 -0
  32. package/reference/datastar/sse.md +295 -0
  33. package/reference/datastar.md +2 -2
  34. package/reference/docs.md +2 -2
  35. package/reference/endpoint/bulk-creation.md +96 -0
  36. package/reference/endpoint/endpoint.md +1 -0
  37. package/reference/endpoint/index.md +9 -89
  38. package/reference/endpoint/path-codec.md +12 -24
  39. package/reference/endpoint/route-pattern.md +4 -6
  40. package/reference/endpoint/segment-codec.md +19 -32
  41. package/reference/html.md +313 -9
  42. package/reference/htmx/index.md +4 -52
  43. package/reference/htmx/response-headers.md +240 -0
  44. package/reference/http-model/headers.md +735 -0
  45. package/reference/http-model/index.md +3 -1
  46. package/reference/http-model/model.md +107 -71
  47. package/reference/http-model/schema-codecs.md +522 -0
  48. package/reference/http-model/schema.md +6 -3
  49. package/reference/http-model/server-sent-event.md +341 -0
  50. package/reference/jwt.md +195 -0
  51. package/reference/maybe.md +128 -11
  52. package/reference/media-type.md +2 -2
  53. package/reference/mux.mdx +7 -2
  54. package/reference/openapi.md +3 -3
  55. package/reference/projection.md +654 -0
  56. package/reference/resource-management/index.md +1 -1
  57. package/reference/resource-management/resource.md +2 -98
  58. package/reference/resource-management/scope.md +1 -209
  59. package/reference/resource-management/wire.md +4 -50
  60. package/reference/ringbuffer/advanced.mdx +1 -1
  61. package/reference/ringbuffer/index.mdx +3 -3
  62. package/reference/ringbuffer/mpmc.mdx +38 -4
  63. package/reference/ringbuffer/mpsc.mdx +36 -4
  64. package/reference/ringbuffer/spmc.mdx +1 -1
  65. package/reference/ringbuffer/spsc.mdx +87 -15
  66. package/reference/schema/allows.md +0 -96
  67. package/reference/schema/binding.md +2 -2
  68. package/reference/schema/built-in-codecs/avro.md +2 -2
  69. package/reference/schema/built-in-codecs/bson.md +50 -20
  70. package/reference/schema/built-in-codecs/csv.md +2 -2
  71. package/reference/schema/built-in-codecs/index.md +3 -3
  72. package/reference/schema/built-in-codecs/json/index.md +2 -2
  73. package/reference/schema/built-in-codecs/json/json.md +1 -0
  74. package/reference/schema/built-in-codecs/messagepack.md +3 -3
  75. package/reference/schema/built-in-codecs/thrift.md +2 -2
  76. package/reference/schema/built-in-codecs/toon.md +3 -3
  77. package/reference/schema/built-in-codecs/yaml.md +2 -2
  78. package/reference/schema/codec.md +11 -11
  79. package/reference/schema/dynamic-optic.md +48 -3
  80. package/reference/schema/dynamic-schema.md +3 -3
  81. package/reference/schema/index.md +2 -0
  82. package/reference/schema/path-interpolator.md +2 -0
  83. package/reference/schema/reflect-transformer.md +140 -0
  84. package/reference/schema/schema-evolution/as.md +4 -4
  85. package/reference/schema/schema-evolution/into.md +2 -2
  86. package/reference/schema/schema-expr.md +2 -2
  87. package/reference/schema/schema-search.md +263 -0
  88. package/reference/schema/schema.md +10 -2
  89. package/reference/schema/type-class-derivation.md +1 -1
  90. package/reference/smithy.md +502 -3
  91. package/reference/sql/db-codec-deriver.md +3 -3
  92. package/reference/sql/db-codec.md +22 -22
  93. package/reference/sql/db-con.md +4 -4
  94. package/reference/sql/db-connection.md +1 -1
  95. package/reference/sql/db-param.md +1 -1
  96. package/reference/sql/db-result-reader.md +4 -2
  97. package/reference/sql/db-tx.md +46 -14
  98. package/reference/sql/ddl.md +1 -1
  99. package/reference/sql/frag.md +44 -10
  100. package/reference/sql/index.md +7 -7
  101. package/reference/sql/repo.md +15 -15
  102. package/reference/sql/sql-dialect.md +1 -1
  103. package/reference/sql/sql-logger.md +1 -1
  104. package/reference/sql/sql-name-mapper.md +3 -3
  105. package/reference/sql/table-metadata.md +3 -3
  106. package/reference/sql/table.md +10 -10
  107. package/reference/sql/transactor-zio.md +1 -1
  108. package/reference/sql/transactor.md +21 -11
  109. package/reference/sql-zio.md +2 -2
  110. package/reference/streams/core/index.md +32 -0
  111. package/reference/streams/{pipeline.md → core/pipeline.md} +210 -74
  112. package/reference/streams/{sink.md → core/sink.md} +331 -353
  113. package/reference/streams/{stream.md → core/stream.md} +919 -209
  114. package/reference/streams/execution-and-compatibility/async-execution.md +822 -0
  115. package/reference/streams/execution-and-compatibility/index.md +35 -0
  116. package/reference/streams/execution-and-compatibility/platform-differences.md +297 -0
  117. package/reference/streams/execution-and-compatibility/scala-2-compatibility.md +88 -0
  118. package/reference/streams/execution-and-compatibility/zero-boxing.md +393 -0
  119. package/reference/streams/index.md +140 -67
  120. package/reference/streams/primitives/index.md +30 -0
  121. package/reference/streams/primitives/reader.md +1992 -0
  122. package/reference/streams/{writer.md → primitives/writer.md} +254 -98
  123. package/reference/telemetry/common/any-value.md +90 -0
  124. package/reference/telemetry/common/attribute-key.md +87 -0
  125. package/reference/telemetry/common/attributes.md +118 -0
  126. package/reference/telemetry/common/index.md +39 -0
  127. package/reference/telemetry/common/instrumentation-scope.md +24 -0
  128. package/reference/telemetry/common/resource.md +34 -0
  129. package/reference/telemetry/index.md +311 -0
  130. package/reference/telemetry/logging/index.md +197 -0
  131. package/reference/telemetry/logging/log-enrichment.md +72 -0
  132. package/reference/telemetry/logging/log-formatter.md +100 -0
  133. package/reference/telemetry/logging/log-record-processor.md +56 -0
  134. package/reference/telemetry/logging/log-record.md +44 -0
  135. package/reference/telemetry/logging/log-writer.md +64 -0
  136. package/reference/telemetry/logging/logger-provider.md +142 -0
  137. package/reference/telemetry/logging/logger.md +83 -0
  138. package/reference/telemetry/logging/severity.md +62 -0
  139. package/reference/telemetry/metrics/index.md +150 -0
  140. package/reference/telemetry/metrics/instruments.md +183 -0
  141. package/reference/telemetry/metrics/labeled-instruments.md +74 -0
  142. package/reference/telemetry/metrics/meter-provider.md +76 -0
  143. package/reference/telemetry/metrics/meter.md +98 -0
  144. package/reference/telemetry/metrics/metric-data.md +57 -0
  145. package/reference/telemetry/otel/custom-exporter.md +216 -0
  146. package/reference/telemetry/otel/index.md +212 -0
  147. package/reference/telemetry/tracing/index.md +155 -0
  148. package/reference/telemetry/tracing/sampler.md +89 -0
  149. package/reference/telemetry/tracing/span-builder.md +57 -0
  150. package/reference/telemetry/tracing/span-context.md +39 -0
  151. package/reference/telemetry/tracing/span-data.md +32 -0
  152. package/reference/telemetry/tracing/span-kind.md +55 -0
  153. package/reference/telemetry/tracing/span-processor.md +53 -0
  154. package/reference/telemetry/tracing/span-status.md +47 -0
  155. package/reference/telemetry/tracing/span.md +117 -0
  156. package/reference/telemetry/tracing/tracer-provider.md +91 -0
  157. package/reference/telemetry/tracing/tracer.md +52 -0
  158. package/reference/typeid.md +0 -64
  159. package/sidebars.js +365 -185
  160. package/undocumented-report.md +528 -270
  161. package/reference/config.md +0 -158
  162. package/reference/streams/concurrent-operators.md +0 -106
  163. package/reference/streams/reader.md +0 -1284
  164. package/reference/streams/scala-2-compatibility.md +0 -55
  165. package/reference/streams/zero-boxing.md +0 -275
  166. package/reference/telemetry.md +0 -693
@@ -3,329 +3,587 @@ id: undocumented-report
3
3
  title: "Documentation Coverage Report"
4
4
  ---
5
5
 
6
- # Documentation Coverage Report
6
+ Full re-scan of documentation coverage across every library module aggregated by the `root` project. Replaces the 2026-02-13 report, which predated most of the current `docs/reference` tree and covered only 12 modules.
7
7
 
8
- Comprehensive analysis of documentation gaps in ZIO Blocks, combining automated scanning with manual source-code review.
8
+ **This revision fixes the scanner, so every number below has moved.** Earlier revisions classified a declaration as private only when the modifier sat on its own line, which counted 863 privately-enclosed declarations as public API — about a third of everything declared. Two items were mis-scoped as a result. The scanner now walks enclosing scopes, and the table carries an `internal` column so a low ratio can be told apart from a real gap. See *Methodology*.
9
+
10
+ **Work completed since this report was written:** `datastar`, split from one 346-line page into five (index, signals, attributes, events, sse), taking it from 39% to 98% with no absent types. Its previous page had 22 code blocks and no mdoc modifiers, so none of it had ever compiled.
11
+
12
+ Earlier: `config` (Tier 1 item 2, seven pages), the `http-model` typed header surface (items 1 and 7), `otel` (item 3), the `http-model-schema` codec layer (Tier 2 item 15), and — landed independently while this revision was in progress — `htmx` response headers (item 4, #1619), the `schema` search and traversal cluster (item 5, #1621), and `ReflectTransformer` (item 8, #1623).
13
+
14
+ Also landed independently: `telemetry/common/any-value.md` (#1622), documenting the `AnyValue` attribute ADT — Tier 1 item 6. That PR quoted 95% for `telemetry` against this table's 68%, because its figures predate the privacy-aware scanner; the work is the same, the measurement changed.
15
+
16
+ Every figure in this revision, including those four, is restated under the privacy-aware scanner. The notes those PRs added quoted the old scanner, which is why their numbers differ from the table: `htmx` reads 77% here rather than 85%, `schema` 55% rather than 77%, and `telemetry` 68% rather than 95%. The work is the same; the measurement changed. `docs/reference/telemetry/common/any-value.md` (90 lines, mdoc-verified) covers `AttributeValue`/`AttributeType` and their eight variants each, correcting the original Tier 1 item 6, which named types (`BoolValue`, `IntValue`, `ArrayValue`, several `*KV` types) that don't exist in source; under the privacy-aware scanner it resolves 8 of the module's absent types and 12 of its unexplained ones.
17
+
18
+ **What changed since the previous (2026-02-13) report:** every published module now has a reference page, and every page is linked from `docs/sidebars.js`. There are no longer any modules with zero documentation, and four of the six "critical missing pages" from the old report now exist (`media-type.md`, `schema/schema-expr.md`, `schema/schema-error.md`, `built-in-codecs/json/json-patch.md`). The remaining gaps are (a) whole subsystems inside otherwise-documented modules, (b) pages far too short for the surface they cover, and (c) an almost complete absence of task-oriented guides.
9
19
 
10
20
  ## Summary
11
21
 
12
22
  | Metric | Count |
13
23
  |--------|-------|
14
- | Total public types found | 552 |
15
- | Types with documentation | 302 |
16
- | Types lacking documentation | 250 |
17
- | Documentation coverage | 54% |
18
- | Existing reference pages | 24 |
19
- | Missing methods in existing pages | ~44 |
20
- | Missing examples in existing pages | ~39 |
21
- | Conceptual docs (guides, how-tos) | 0 |
24
+ | Library modules aggregated by `root` | 38 |
25
+ | Modules with no reference page | **0** |
26
+ | Reference pages | 169 |
27
+ | Guides | 9 |
28
+ | Declarations found (`class` / `trait` / `object` / `enum`) | 2,662 |
29
+ | — of which public | 1,811 |
30
+ | — of which private or nested in a private scope | 864 |
31
+ | Public types never named anywhere in `docs/` | **325** |
32
+ | Public types with no prose or heading reference | **637** |
33
+ | Name-mention coverage | **82%** |
34
+ | Explained-type coverage | **65%** |
22
35
 
23
- ---
36
+ Two coverage numbers are reported because they answer different questions.
24
37
 
25
- ## Critical: Missing Reference Pages
38
+ - **Name-mention coverage** counts a type as covered if its name appears anywhere in `docs/`, including inside an example code block. Its complement — 325 types — is entirely absent from the documentation.
39
+ - **Explained-type coverage** is stricter: it requires the name in prose (inline code) or in a heading. Its complement — 637 types — additionally captures the 312 types that appear only as tokens inside examples and are never explained.
26
40
 
27
- These are core public API types that users interact with directly. Each needs a dedicated reference page or a substantial new section in an existing page.
41
+ Only **public** types are counted. A type is public when neither it nor any enclosing declaration is `private` or `protected` — 864 declarations fail that test and are excluded, which is roughly a third of everything declared. Earlier revisions of this report counted many of them as API and mis-scoped work as a result; see *Methodology*.
28
42
 
29
- - [ ] **`MediaType`** (module `mediatype`) — Public API for media type parsing and matching; essential for content negotiation. The entire `zio.blocks.mediatype` package has zero documentation. **Scope: new page**. Source: `mediatype/shared/src/main/scala/zio/blocks/mediatype/MediaType.scala`
30
- - [ ] **`MediaTypes`** (module `mediatype`) — Predefined media type instances (application/json, text/html, etc.). Should be part of the `MediaType` page. **Scope: new section**. Source: `mediatype/shared/src/main/scala/zio/blocks/mediatype/MediaTypes.scala`
31
- - [ ] **`SchemaExpr`** (module `schema`) — Core trait for expression evaluation on schema-described types; central to the validation DSL. **Scope: new page**. Source: `schema/shared/src/main/scala/zio/blocks/schema/SchemaExpr.scala`
32
- - [ ] **`SchemaError`** (module `schema`) — Primary error type returned from schema operations (ConversionFailed, MissingField, DuplicatedField, ExpectationMismatch, UnknownCase). Users handle these constantly. **Scope: new page or major section in schema.md**. Source: `schema/shared/src/main/scala/zio/blocks/schema/SchemaError.scala`
33
- - [ ] **`Into`** (module `schema`) — Core conversion type class appearing in all cross-type transformations. **Scope: new page**. Source: `schema/shared/src/main/scala/zio/blocks/schema/Into.scala`
34
- - [ ] **`JsonPatch`** (module `schema`) — Main public API for JSON patching and diffing operations. **Scope: new section in json.md or patch.md**. Source: `schema/shared/src/main/scala/zio/blocks/schema/json/JsonPatch.scala`
43
+ This report file is excluded from the scan, so listing a type here does not make it count as documented. Counts are per module, so a name defined in two modules is counted twice.
35
44
 
36
45
  ---
37
46
 
38
- ## High Priority: Incomplete Coverage
39
-
40
- ### Types needing at least a dedicated section in an existing page
41
-
42
- **schema module — Binding subsystem:**
43
- - [ ] **`BindingResolver`** — Essential for type binding resolution; critical for schema rebinding. Referenced in 6 source files. **Scope: new section in binding.md**. Source: `schema/shared/src/main/scala/zio/blocks/schema/binding/BindingResolver.scala`
44
- - [ ] **`MapConstructor` / `MapDeconstructor`** — Public traits for customizing map handling in bindings. Referenced in 7 files each. **Scope: new section in binding.md**. Source: `schema/shared/src/main/scala/zio/blocks/schema/binding/MapConstructor.scala`
45
- - [ ] **`ConstantConstructor` / `ConstantDeconstructor`** — Binding helpers for constant values. Referenced in 11 files each. **Scope: brief section in binding.md**. Source: `schema/shared/src/main/scala/zio/blocks/schema/binding/Constructor.scala`
46
- - [ ] **`RegisterType`** — Type-safe register representation. Referenced in 5 files. **Scope: brief section in registers.md**. Source: `schema/shared/src/main/scala/zio/blocks/schema/binding/RegisterType.scala`
47
-
48
- **schema module — Derivation subsystem:**
49
- - [ ] **`InstanceOverride`** — Used for customizing schema derivation. Referenced in 8 files. **Scope: new section in type-class-derivation.md**. Source: `schema/shared/src/main/scala/zio/blocks/schema/derive/InstanceOverride.scala`
50
- - [ ] **`ModifierOverride`** — Used for overriding modifiers during derivation. Referenced in 3 files. **Scope: new section in type-class-derivation.md**. Source: `schema/shared/src/main/scala/zio/blocks/schema/derive/ModifierOverride.scala`
51
-
52
- **schema module — Type classes:**
53
- - [ ] **`IsNumeric`** — Type class for arithmetic operations. Referenced in 3 files. **Scope: brief section in schema.md**. Source: `schema/shared/src/main/scala/zio/blocks/schema/IsNumeric.scala`
54
- - [ ] **`IsCollection`** — Type class for collection operations. **Scope: brief section in schema.md**. Source: `schema/shared/src/main/scala/zio/blocks/schema/IsCollection.scala`
55
- - [ ] **`IsMap`** — Type class for map operations. **Scope: brief section in schema.md**. Source: `schema/shared/src/main/scala/zio/blocks/schema/IsMap.scala`
56
- - [ ] **`Reflectable`** — Trait for types with reflectable modifiers. Referenced in 3 files. **Scope: brief section in reflect.md**. Source: `schema/shared/src/main/scala/zio/blocks/schema/Reflectable.scala`
57
- - [ ] **`ToStructural`** — Converts nominal to structural schemas. **Scope: brief section in reflect.md**. Source: `schema/shared/src/main/scala/zio/blocks/schema/ToStructural.scala`
58
-
59
- **schema module — JSON subsystem:**
60
- - [ ] **`Keyable`** — Type class for JSON key support. Referenced in 5 files. **Scope: new section in json.md**. Source: `schema/shared/src/main/scala/zio/blocks/schema/json/Keyable.scala`
61
- - [ ] **`NameMapper`** (`CamelCase`, `KebabCase`, `PascalCase`) — Public field name transformations. **Scope: new section in json.md**. Source: `schema/shared/src/main/scala/zio/blocks/schema/json/NameMapper.scala`
62
- - [ ] **`JsonCodecError`** — Custom exception for JSON codec errors. Referenced in 7 files. **Scope: brief section in json.md**. Source: `schema/shared/src/main/scala/zio/blocks/schema/json/JsonCodecError.scala`
63
-
64
- **typeid module:**
65
- - [ ] **`TypeRepr`** — Central type representation (24 subtypes: ThisType, TypeLambda, Singleton, Repeated, etc.). Referenced across 4-8 files each. **Scope: new section in typeid.md**. Source: `typeid/shared/src/main/scala/zio/blocks/typeid/TypeRepr.scala`
66
- - [ ] **`TypeDefKind`** — Type definition classifier (AbstractType, EnumCase, TypeAlias, etc.). **Scope: new section in typeid.md**. Source: `typeid/shared/src/main/scala/zio/blocks/typeid/TypeDefKind.scala`
67
- - [ ] **`Kind`** and **`Arrow`** — Higher-kinded type expressions. **Scope: new section in typeid.md**. Source: `typeid/shared/src/main/scala/zio/blocks/typeid/Kind.scala`
68
- - [ ] **`Annotation`** — Type annotation metadata (ArrayArg, ClassOf, EnumValue). **Scope: new section in typeid.md**. Source: `typeid/shared/src/main/scala/zio/blocks/typeid/Annotation.scala`
69
- - [ ] **`Owner`** and **`Segment`** — Type ownership path. **Scope: new section in typeid.md**. Source: `typeid/shared/src/main/scala/zio/blocks/typeid/Owner.scala`
70
-
71
- **context module:**
72
- - [ ] **`IsNominalType`** — Type class for nominal type extraction. Referenced in 6 files. **Scope: new section in context.md**. Source: `context/shared/src/main/scala/zio/blocks/context/IsNominalType.scala`
73
- - [ ] **`IsNominalIntersection`** — Type class for intersection type handling. Referenced in 4 files. **Scope: new section in context.md**. Source: `context/shared/src/main/scala/zio/blocks/context/IsNominalIntersection.scala`
74
-
75
- **Format codec modules:**
76
- - [ ] **`BsonEncoder` / `BsonDecoder` / `BsonCodec`** (schema-bson) — Core encoding/decoding types for BSON. **Scope: expand formats.md BSON section**. Source: `schema-bson/src/main/scala/zio/blocks/schema/bson/BsonTypes.scala`
77
- - [ ] **`MessagePackCodec`** (schema-messagepack) — Public codec for MessagePack. **Scope: expand formats.md MessagePack section**. Source: `schema-messagepack/src/main/scala/zio/blocks/schema/msgpack/MessagePackCodec.scala`
78
- - [ ] **`ThriftCodec`** (schema-thrift) — Public codec for Thrift. **Scope: expand formats.md Thrift section**. Source: `schema-thrift/src/main/scala/zio/blocks/schema/thrift/ThriftCodec.scala`
79
- - [ ] **`ToonReader` / `ToonWriter`** (schema-toon) — Public codec for TOON. Referenced in 9-10 files. **Scope: expand formats.md TOON section**. Source: `schema-toon/src/main/scala/zio/blocks/schema/toon/`
80
-
81
- **markdown module:**
82
- - [ ] **`Block`** subtypes (`BlockQuote`, `BulletList`, `CodeBlock`, `HtmlBlock`, `OrderedList`, `ThematicBreak`) — Core markdown AST elements. **Scope: new section in docs.md**. Source: `markdown/shared/src/main/scala/zio/blocks/docs/Block.scala`
83
- - [ ] **`Inline`** subtypes (`Autolink`, `HtmlInline`, `Image`, `HardBreak`, `SoftBreak`) — Core markdown AST elements. **Scope: new section in docs.md**. Source: `markdown/shared/src/main/scala/zio/blocks/docs/Inline.scala`
47
+ ## Module Coverage Table
48
+
49
+ `public` = public types, per the rule above. `internal` = declarations excluded as private or privately-enclosed. `absent` = public types never named anywhere in `docs/`. `unexpl` = public types with no prose or heading reference. `ratio` = documentation lines / source lines.
50
+
51
+ | Module | public | internal | absent | unexpl | cov | srcLOC | docLOC | ratio |
52
+ |---|---:|---:|---:|---:|---:|---:|---:|---:|
53
+ | mediatype | 16 | 2 | 2 | 11 | 31% | 12,676 | 460 | 0.04 |
54
+ | **html** | 110 | 13 | 40 | 68 | **38%** | 5,591 | 1,300 | 0.23 |
55
+ | maybe | 10 | 0 | 6 | 6 | 40% | 595 | 943 | 1.58 |
56
+ | context | 2 | 7 | 1 | 1 | 50% | 865 | 553 | 0.64 |
57
+ | **typeid** | 90 | 14 | 26 | 43 | **52%** | 6,493 | 2,124 | 0.33 |
58
+ | schema-xml | 38 | 2 | 9 | 18 | 53% | 3,334 | 1,034 | 0.31 |
59
+ | **schema** | 466 | 226 | 156 | 208 | **55%** | 85,027 | 24,259 | 0.29 |
60
+ | http-model | 191 | 3 | 5 | 84 | 56% | 4,712 | 2,520 | 0.53 |
61
+ | schema-bson | 20 | 0 | 2 | 8 | 60% | 1,935 | 494 | 0.26 |
62
+ | scope | 23 | 54 | 6 | 9 | 61% | 7,085 | 3,579 | 0.51 |
63
+ | codegen | 46 | 0 | 6 | 17 | 63% | 2,100 | 3,024 | 1.44 |
64
+ | async | 9 | 58 | 2 | 3 | 67% | 6,540 | 1,291 | 0.20 |
65
+ | combinators | 6 | 14 | 2 | 2 | 67% | 1,132 | 524 | 0.46 |
66
+ | endpoint | 60 | 20 | 18 | 20 | 67% | 2,805 | 1,757 | 0.63 |
67
+ | schema-yaml | 27 | 10 | 6 | 9 | 67% | 2,753 | 552 | 0.20 |
68
+ | streams | 30 | 152 | 9 | 10 | 67% | 18,434 | 5,725 | 0.31 |
69
+ | telemetry | 139 | 72 | 9 | 44 | 68% | 7,509 | 2,948 | 0.39 |
70
+ | config (+ `-yaml`/`-json`/`-hocon`) | 82 | 25 | 7 | 24 | 71% | 3,914 | 2,212 | 0.57 |
71
+ | chunk | 20 | 35 | 2 | 5 | 75% | 5,069 | 3,140 | 0.62 |
72
+ | htmx | 88 | 2 | 6 | 20 | 77% | 1,548 | 2,750 | 1.78 |
73
+ | smithy | 42 | 4 | 0 | 4 | 90% | 2,585 | 882 | 0.34 |
74
+ | datastar | 57 | 11 | 0 | 1 | **98%** | 1,881 | 1,196 | 0.64 |
75
+ | markdown | 46 | 3 | 3 | 10 | 78% | 2,596 | 1,539 | 0.59 |
76
+ | schema-toon | 25 | 14 | 1 | 4 | 84% | 4,690 | 1,050 | 0.22 |
77
+ | openapi | 46 | 1 | 1 | 6 | 87% | 2,431 | 1,301 | 0.54 |
78
+ | schema-csv | 9 | 1 | 0 | 1 | 89% | 1,247 | 564 | 0.45 |
79
+ | sql | 53 | 14 | 1 | 3 | 94% | 4,234 | 4,047 | 0.96 |
80
+ | http-model-schema | 16 | 10 | 0 | 0 | **100%** | 1,249 | 1,073 | 0.86 |
81
+ | mux | 9 | 40 | 0 | 0 | **100%** | 1,222 | 823 | 0.67 |
82
+ | otel | 12 | 8 | 0 | 0 | **100%** | 1,325 | 422 | 0.32 |
83
+ | ringbuffer | 8 | 42 | 0 | 0 | **100%** | 2,360 | 989 | 0.42 |
84
+ | schema-avro | 3 | 3 | 0 | 0 | **100%** | 1,922 | 450 | 0.23 |
85
+ | schema-messagepack | 5 | 2 | 0 | 0 | **100%** | 1,933 | 507 | 0.26 |
86
+ | schema-thrift | 3 | 2 | 0 | 0 | **100%** | 868 | 432 | 0.50 |
87
+ | sql-zio | 1 | 0 | 0 | 0 | **100%** | 218 | 112 | 0.51 |
88
+
89
+ Notes on reading this table:
90
+
91
+ - **The `internal` column is the one that prevents mis-scoping.** A module whose declarations are mostly internal will show a low ratio without having a real gap. `streams` declares 152 internal types against 30 public ones, and `async` 58 against 9 — their low ratios are arithmetic, not neglect.
92
+ - **`maybe` and `async` are not real gaps** despite ranking high. `maybe`'s seven absent types are `MaybeCompat`, `MaybeOps`, `MaybeSyntax`, `MaybeSyntaxCompat`, `MaybeValue`, `MaybeWithFilter`, and `WithFilter` — syntax and compatibility shims matching the patterns in *Deliberately Undocumented*. `async`'s two are CPS-transform internals that happen to be public.
93
+ - `mediatype`'s 0.04 ratio is an artifact: 12,332 of its 12,676 source lines are the generated `MediaTypes.scala` lookup table.
94
+ - The four `config*` modules share one page directory, so their row is a hand-aggregate; the script emits them as four separate rows.
95
+ - Eight modules are fully covered: `http-model-schema`, `mux`, `otel`, `ringbuffer`, `schema-avro`, `schema-messagepack`, `schema-thrift`, `sql-zio`.
96
+ - **`html` moved the wrong way.** #1536 replaced the untyped element factories with a typed content model, adding 12 public types that no page names yet. Its absent count went from 34 to 46 while its documentation stood still — the clearest case in this table of code outrunning docs.
84
97
 
85
98
  ---
86
99
 
87
- ## Medium Priority: Brief Mentions Needed
100
+ ## Critical Gaps
88
101
 
89
- Types that should be mentioned in related pages but don't need dedicated sections.
102
+ Counts in these sections are from the privacy-aware scanner and match the table above. Historical figures — what a module looked like before its pages were written — are stated as such and were measured under the older scanner, so they overstate the public surface.
90
103
 
91
- **schema module:**
92
- - [ ] `SchemaMetadata` / `Folder` — metadata traversal infrastructure. **Mention in: schema.md**
93
- - [ ] `FromBinding` — type class for binding conversion. **Mention in: binding.md**
94
- - [ ] `UnapplySeq` / `UnapplyMap` — implicit evidence for seq/map operations. **Mention in: binding.md**
95
- - [ ] `OpticCheck` subtypes (`EmptyMap`, `MissingKey`, `SequenceIndexOutOfBounds`, `WrappingError`) — validation results from optic operations. **Mention in: optics.md**
96
- - [ ] `RebindException` — thrown during schema rebinding. **Mention in: binding.md**
97
- - [ ] `JsonDiffer` — JSON diffing utility. **Mention in: json.md**
98
- - [ ] `JsonSchemaType` / `SchemaType` — JSON Schema type system. **Mention in: json-schema.md**
99
- - [ ] `ContextDetector` parsing states — JSON interpolator internals. **Mention in: json.md**
100
- - [ ] `TypeIdSchemas` — hand-rolled schema instances for TypeId. **Mention in: typeid.md**
104
+ Type names below are **unexplained**: no prose reference, no heading. Names marked ✗ are **absent** — they never appear in `docs/` at all, not even inside an example.
101
105
 
102
- **chunk module:**
103
- - [ ] `ChunkIterator` — streaming iterator for chunks. **Mention in: chunk.md**
104
- - [ ] `IsText` — type class for chunk-to-string conversion. **Mention in: chunk.md**
106
+ ### 1. `config` — RESOLVED
105
107
 
106
- **scope module:**
107
- - [ ] `InStack` — trait for stack-like containment. **Mention in: scope.md**
108
+ Was the worst gap in the repository: one 158-line page covering `config`, `config-yaml`, `config-json`, and `config-hocon` (3,914 source lines combined), with 53 of 77 public types unexplained and 43 absent.
108
109
 
109
- **markdown module:**
110
- - [ ] `Alignment` / `Center` — table column alignment. **Mention in: docs.md**
111
- - [ ] `HeadingLevel` (`H4`, `H5`) — heading levels. **Mention in: docs.md**
112
- - [ ] `TerminalRenderer` — ANSI terminal rendering. **Mention in: docs.md**
113
- - [ ] `MdInterpolatorRuntime` — runtime support for `md"..."`. **Mention in: docs.md**
110
+ `docs/reference/config.md` is now `docs/reference/config/`, seven pages totalling 2,212 lines with every code block mdoc-verified:
114
111
 
115
- **schema-toon module:**
116
- - [ ] `Delimiter` / `Comma` / `Pipe` / `Tab` — array delimiters. **Mention in: formats.md**
117
- - [ ] `ArrayFormat` — array encoding strategy. **Mention in: formats.md**
118
- - [ ] `KeyFolding` / `PathExpansion` — TOON reader/writer config. **Mention in: formats.md**
112
+ | Page | Covers |
113
+ | ------------------- | ------------------------------------------------------------------------------------------ |
114
+ | `index.md` | Module narrative, installation, data flow, the four `Config` entry points, integration points |
115
+ | `config-source.md` | `ConfigSource`, `MapSource`, `EnvSource`, `SysPropSource`, composition, `KeyMapper`, `KeyFormat`, `SourceValue`, `Provenance`, `ProvenanceMap`, `Secret`, `Displayable` |
116
+ | `config-decoder.md` | `ConfigDecoder`, `ConfigDecoderDeriver`, one mapping rule per schema shape, the primitive parsing table, discriminators, error accumulation |
117
+ | `errors.md` | `ConfigError` and its four category traits, every constructor, `ConfigLoadException` |
118
+ | `flags.md` | `FlagSource`, `Registry`, `StaticFlag`, `DynamicFlag`, `Flag.Reader`, `Flag.Source`, `FlagException`, `Flag.dump` |
119
+ | `rollout.md` | Rollout grammar, `Choice`/`Selector`/`Segment`, bucketing, `Flag.ReloadResult`, `UpdateRecord`, counters |
120
+ | `formats.md` | YAML, JSON, and HOCON adapters, flattening rules, substitutions, includes, `HoconValue`, JVM file loading |
119
121
 
120
- **schema-bson module:**
121
- - [ ] `DiscriminatorField` / `NoDiscriminator` / `WrapperWithClassNameField` — sum type encoding strategies. **Mention in: formats.md**
122
+ The family is now at 70% explained coverage with 7 absent types, none of which is user-facing API. Writing the pages required adding the four config modules to the `docs` project in `build.sbt` — they were absent from its classpath, which is why no config code block had ever been compiled.
122
123
 
123
- ---
124
+ Three behaviours that the source made non-obvious and the new pages now state explicitly: a rollout selector must match a path's segment count **exactly** (the bucketing key is itself the first segment); flag durations use a `30s` suffix grammar while config durations require ISO-8601 `PT30S`; and a flattened `null` is indistinguishable from an absent key, so it cannot be used to unset a lower-priority layer.
124
125
 
125
- ## Documentation Depth Issues
126
-
127
- Existing pages that need updates — missing methods, examples, or cross-references.
128
-
129
- ### Schema (`schema.md`)
130
- - [ ] Missing examples of schema serialization to JSON Schema and back
131
- - [ ] Missing example of caching behavior with `derive(format)`
132
- - [ ] Missing example of using modifiers on schemas
133
- - [ ] No mention of `TypeId` integration in schema derivation
134
- - [ ] Missing reference to schema validation with `DynamicSchema`
135
-
136
- ### Reflect (`reflect.md`)
137
- - [ ] `Reflect#noBinding` — critical for understanding serialization, not documented
138
- - [ ] `Reflect#transform` — used extensively but not documented
139
- - [ ] `Reflect.Extractors` — pattern matching helpers not documented
140
- - [ ] Missing example of working with `Reflect.Unbound` for serialization
141
- - [ ] Missing example of recursive type handling with `Deferred`
142
- - [ ] Should reference `Binding` more clearly for each reflect type
143
-
144
- ### Binding (`binding.md`)
145
- - [ ] Missing documentation on `Register` and `RegisterOffset` API — critical for zero-allocation architecture
146
- - [ ] Missing `SpecializedIndexed` documentation for array-based performance
147
- - [ ] No detailed example of `RegisterOffset` calculation
148
- - [ ] No example of implementing custom `SeqConstructor` for new collection types
149
- - [ ] No example of `MapConstructor` / `MapDeconstructor` implementation
150
- - [ ] Missing explanation of why specialized constructors exist
151
-
152
- ### Chunk (`chunk.md`)
153
- - [ ] `Chunk.BitChunk` and bit operations barely documented
154
- - [ ] No example of the `BitChunk` operations with endianness
155
- - [ ] Missing performance comparison with `Vector` for various operations
156
- - [ ] `Chunk.materialize` automatic triggering conditions are vague
157
- - [ ] Missing `NonEmptyChunk#flatMap` documentation
158
-
159
- ### JSON (`json.md`)
160
- - [ ] Missing `Keyable` typeclass documentation
161
- - [ ] `Json#diff` operation types not documented
162
- - [ ] No example of complex querying with predicates
163
- - [ ] No example of recursive transformation with `transformDown` vs `transformUp`
164
- - [ ] No example of merging strategies in detail
165
- - [ ] Should reference `JsonSchema` more thoroughly
166
-
167
- ### Codec (`codec.md`)
168
- - [ ] Missing explanation of `Format` trait interface
169
- - [ ] Missing documentation of `Deriver` pattern for custom codecs
170
- - [ ] No example of implementing a custom `Format`
171
- - [ ] No example of `DerivationBuilder` advanced usage
172
- - [ ] Codec instance caching mechanism not explained
173
- - [ ] JSON codec configuration incomplete — missing validation options
174
-
175
- ### Patch (`patch.md`)
176
- - [ ] `DynamicPatch` operations not fully documented
177
- - [ ] No example of `modifyKey` on maps with type parameters
178
- - [ ] No example of composing patches across different types
179
- - [ ] Missing example of serialization and storage of patches
180
- - [ ] Should explain relationship to `DynamicValue.diff`
181
-
182
- ### TypeId (`typeid.md`)
183
- - [ ] `TypeRepr` subtypes barely documented (24 variants)
184
- - [ ] `TypeDefKind` variants incomplete
185
- - [ ] `Member` API — parameter modifiers underdocumented
186
- - [ ] `TermPath` and singleton types barely covered
187
- - [ ] No mention of Scala 2 vs Scala 3 differences in TypeId derivation
188
-
189
- ### Context (`context.md`)
190
- - [ ] `IsNominalType` typeclass not explained
191
- - [ ] No mention of performance characteristics
192
- - [ ] Missing explanation of why only nominal types are supported
193
- - [ ] Missing example of context composition in larger applications
194
-
195
- ### Validation (`validation.md`)
196
- - [ ] Composition/chaining methods not documented
197
- - [ ] No example of using validations directly on `PrimitiveType`
198
- - [ ] No example of validation in format derivers
199
- - [ ] Missing guidance on validation composition workarounds
200
- - [ ] Missing integration examples with JSON Schema
126
+ What remains, all minor:
201
127
 
202
- ---
128
+ - [ ] Name `ConfigSourceHoconSyntax` and `ConfigSourceHoconPlatformSyntax` in `formats.md`, or make them private — the mechanism is described but the traits are not named
129
+ - [ ] `DisplayableLowPriority` is an implicit-priority helper and is deliberately skipped; consider tightening its visibility
130
+ - [ ] `ConfigError.DuplicateKey` and `ConfigError.Unauthorized` are documented as unused by the module; decide whether they should exist at all
131
+ - [ ] `ConfigValidationError` is sealed with zero implementations, so matching on it can never match; either give it a constructor or remove it
203
132
 
204
- ## Conceptual Gaps
133
+ ### 2. `http-model` — RESOLVED
205
134
 
206
- Missing guides, overviews, and tutorials — none of these exist today.
135
+ `Header.scala` is 1,861 lines defining 76 header types, of which 75 are typed built-ins. The `## Headers` section of `model.md` was 36 lines showing only the untyped `String` API; 101 of the module's 191 public types were absent.
207
136
 
208
- - [ ] **Getting Started Guide** — No quick-start for new users. Should cover: adding dependencies, defining a case class, deriving a schema, encoding/decoding JSON. **Scope: new page `docs/getting-started.md`**
209
- - [ ] **Architecture Overview** — No high-level design document. Should cover: module dependency graph, register-based zero-allocation architecture, the Reflect/Binding/Schema layering, and the Deriver pattern. **Scope: new page `docs/architecture.md`**
210
- - [ ] **How-To: Custom Codec** — No guide for implementing a custom `Format` and its `Deriver`. **Scope: new page `docs/how-to-custom-codec.md`**
211
- - [ ] **How-To: Schema Derivation** — No guide walking through `Schema.derived` vs manual schema construction. **Scope: new section in schema.md or new page**
212
- - [ ] **How-To: Working with DynamicValue** — No guide on converting between typed and dynamic representations. **Scope: new section in dynamic-value.md**
213
- - [ ] **End-to-End Pipeline Example** — No documentation showing the full Schema -> Codec -> Encoding -> Decoding -> Validation pipeline. **Scope: new page or section in index.md**
214
- - [ ] **Migration Guide** — No version migration docs (may not be needed yet if pre-1.0, but placeholder is useful)
215
- - [ ] **Performance Guide** — No guidance on when to use `materialize` on Chunks, binding register allocation strategies, caching behavior in schema derivation, or JSON encoder/decoder performance characteristics
137
+ Two new pages, 956 lines together, with every code block mdoc-verified:
216
138
 
217
- ---
139
+ | Page | Covers |
140
+ | ---------------------- | ------------------------------------------------------------------------------------------ |
141
+ | `headers.md` | `Header`, `Header.Codec`, `Header.Typed`, `Header.Custom`, all 75 built-ins catalogued in ten groups with wire names and ADT variants, the six read methods, the parse cache, write operations, `HeadersBuilder`, validation and injection safety, writing a custom codec |
142
+ | `server-sent-event.md` | `ServerSentEvent`, its constructors and metadata builders, validation, render order, `SseDataEncoder` and its instances, custom encoders |
143
+
144
+ The `## Headers` section of `model.md` was rewritten to cover the collection itself — creation, raw reads, append versus replace — and now links out for the typed model rather than omitting it. The module is at 56% explained coverage with 5 absent types.
145
+
146
+ Three behaviours the source made non-obvious, now stated with worked output:
147
+
148
+ - **`Headers#get` discards parse errors.** A malformed header is indistinguishable from an absent one, and a malformed entry followed by a well-formed one silently yields the latter. No collection read surfaces the error.
149
+ - **The parse cache is keyed by codec identity, compared by reference.** A codec constructed inline per request never reuses its cached values, and `Headers#add` drops the cache entirely.
150
+ - **`Headers#toString` prints credentials verbatim.** There is no redaction, so anything logging a `Request` logs its `authorization` and `cookie` values.
151
+
152
+ Writing the catalog also surfaced a genuine defect, documented in a warning admonition and worth fixing in the source:
153
+
154
+ - [ ] `Header.AcceptEncoding.parseSingle` ends with `case _ => GZip(weight)` (`Header.scala:1250`), so any unrecognized encoding name silently parses as `GZip` — `accept-encoding: bogus` reads as a gzip request. `Header.AcceptEncoding.parse` rejects only values with no non-empty comma-separated part, so `""`, `","`, and `" "` are the only failing inputs. The sibling ADTs handle the same situation correctly: `Authorization` has an `Unparsed` case and `Connection` has `Other`. `AcceptEncoding` should either gain an equivalent case or return `Left`. Tracked as [zio/zio-blocks#1618](https://github.com/zio/zio-blocks/issues/1618).
155
+
156
+ What remains is the report's own items 4 and 5 rather than anything new:
157
+
158
+ - [ ] Document `PercentEncoder`, `QueryKey`, `QueryValue`, and `QueryParamsBuilder` in the URL and query sections of `model.md`
159
+ - [ ] Document `ComponentType`
160
+
161
+ Note that `http-model` still shows 84 unexplained types against only 5 absent. Almost all of that is the qualified-name artifact: `headers.md` writes `Header.ContentLength`, which the bare-name match never sees. It is a measurement limitation rather than 84 undocumented types.
162
+
163
+ ### 3. `http-model-schema` — RESOLVED
164
+
165
+ `schema.md` (607 lines) documented the extension-class surface — `QueryParamsSchemaOps`, `HeadersSchemaOps`, `RequestSchemaOps`, `ResponseSchemaOps` — and nothing underneath it, so 14 of the module's 18 scanned types were absent.
166
+
167
+ The gap turned out to be different from what this entry described. It was not "the machinery under the extension classes": `HeadersSchemaOps` does not use `HeaderCodec` at all, it uses the private `StringDecoder`. The codec layer is a **separate, parallel API** — whole-value encoding and decoding via `Schema[A].derive(DefaultHeaderFormat)` — that the documentation never mentioned in either form.
168
+
169
+ Resolved by adding `schema-codecs.md` (463 lines, all code blocks mdoc-verified), covering `HeaderCodec`, `QueryCodec`, `HeaderFormat`, `QueryFormat`, `DefaultHeaderFormat`, `DefaultQueryFormat`, `HeaderCodecDeriver`, and `QueryCodecDeriver`, plus field-mapping rules, supported shapes, top-level codecs, custom formats, and single-type instance overrides. `schema.md` points at it from its opening, its custom-types section, and its See Also.
170
+
171
+ Three behaviours the source made non-obvious:
172
+
173
+ - **The two codecs name fields differently.** `QueryCodec` uses the field name verbatim; `HeaderCodec` converts camelCase to kebab-case. Neither is configurable.
174
+ - **Unsupported top-level shapes fail late.** `Schema[Option[A]]`, `Schema[Map[K, V]]`, and `Schema[DynamicValue]` all derive successfully and then throw on the first encode, so a codec built at startup can look healthy until the first request that uses it.
175
+ - **The convenience encoders share a thread-local builder.** `HeaderCodec#encodeToHeaders` resets it before filling, so a custom `Codec#encode` that calls it recursively corrupts the buffer the outer call was building.
176
+
177
+ **This module is what exposed the scanner bug.** Six of the types this entry listed as absent — `DecodeErrorFactory`, `FieldCodec`, `SinglePrimitive`, `OptionalValue`, `SequenceValue`, `WrappedValue` — are nested inside `private[schema] object ParamCodecSupport` and are not API at all. The old scanner counted them as public because it only checked modifiers on the declaration line. Fixing that is what produced this revision's numbers, and the row now reads 100% with 16 public types and 10 internal ones.
178
+
179
+ ### 4. `otel` — RESOLVED, and this item was mis-scoped
180
+
181
+ The original entry called for splitting the 162-line page into four, including an `otlp-exporters.md`. That was wrong, and the reason is worth recording because it applies to other rows in the table.
182
+
183
+ `OtlpJsonTraceExporter`, `OtlpJsonLogExporter`, `OtlpJsonMetricExporter`, `BatchProcessor`, `OtlpJsonExporter`, and `JdkHttpSender` are all `private[otel]` — six of the module's eighteen declarations. An `otlp-exporters.md` page would have documented internals. The 0.12 ratio that flagged this row is misleading for the same reason `mediatype`'s 0.04 is: roughly 60% of the module's lines are not public surface, and the existing page already covered six of the ten public types well, including a paragraph explaining that the exporters are unreachable.
184
+
185
+ The real gap was four public types and one missing recipe:
186
+
187
+ - `OtlpJsonEncoder` (527 lines) and `NamedMetric` — the only public way to produce OTLP payloads, and therefore the answer to the dead end the old page described rather than resolved
188
+ - `ExportResult` and its `fromHttpResponse` classification
189
+ - `OtelContext`, which bridges `ContextStorage` with `Context[R]`
190
+
191
+ Resolved by adding `custom-exporter.md` (210 lines) covering the encoder, the encoding rules, `ExportResult`, and a worked flush function that assembles the public pieces into a working exporter; and by extending `index.md` with an `OtelContext` section, the `HttpResponse` shape, and a replacement for the dead-end paragraph. The module is now at 100% — 0 absent, 0 unexplained, all 12 public types documented.
192
+
193
+ Two findings from writing it:
194
+
195
+ - **`MetricData` carries no name.** `MetricReader#collectAllMetrics` returns `Seq[MetricData]` and `OtlpJsonEncoder.encodeMetrics` needs `Seq[NamedMetric]`, but nothing public recovers which instrument produced which element. Documented as a warning; worth an API fix.
196
+ - **`ExporterConfig`'s three sizing fields have no public reader.** `maxQueueSize`, `maxBatchSize`, and `flushIntervalMillis` are only consumed by the private `BatchProcessor`, so a hand-rolled exporter must implement queueing, chunking, and interval flushing itself. The new page lists what that means.
197
+
198
+ **Lesson for the remaining rows:** check the public/private split before trusting a low ratio. Rows where most lines may be internal should be verified the same way before being scoped as multi-page splits.
199
+
200
+ ### 5. `schema` — 220 unexplained types clustered in seven subsystems
201
+
202
+ At 84,969 source lines and 23,842 documentation lines, `schema` is the best-documented module in absolute terms and still holds the largest absolute gap: 163 absent and 220 unexplained of 466 public types, with a further 226 declarations internal. The unexplained types are not scattered; they cluster.
203
+
204
+ **`Into` conversions** — the entire primitive conversion matrix is absent: `ByteToInt` ✗, `ByteToLong` ✗, `ByteToShort` ✗, `ByteToFloat` ✗, `ByteToDouble` ✗, `ByteToString` ✗, `IntToByte` ✗, `IntToChar` ✗, `IntToShort` ✗, `IntToLong` ✗, `IntToFloat` ✗, `IntToDouble` ✗, `IntToString` ✗, `LongTo*` ✗, `ShortTo*` ✗, `FloatTo*` ✗, `DoubleTo*` ✗, `CharToInt` ✗, `CharToString` ✗, `BooleanToString` ✗, `StringToBoolean` ✗, `StringToByte` ✗, `StringToShort` ✗, `StringToInt` ✗, `StringToLong` ✗, `StringToFloat` ✗, `StringToDouble` ✗, plus `ConversionType` ✗ and `DynamicConversionError` ✗.
205
+ - [ ] Add a conversion-matrix table — which conversions exist, which are lossy, which can fail and how
206
+
207
+ **`SchemaExpr` operators** — `BitwiseOperator` ✗, `LeftShift` ✗, `RightShift` ✗, `UnsignedRightShift` ✗, `Xor` ✗, `Pow` ✗, `Modulo` ✗, `IsIntegral` ✗, `NumericPrimitiveType` ✗, plus `Divide` and `NumericTypeTag` unexplained.
208
+ - [ ] Add an operator reference to `schema-expr.md`, including which operators require `IsIntegral` vs `IsNumeric`
209
+
210
+ **Migration** — `migration.md` and `schema-evolution/` exist, but the error model does not appear: `MigrationError` ✗, `MigrationErrorKind` ✗, `MissingDefault` ✗, `MandateFailed` ✗, `TransformFailed` ✗, `FieldName` ✗, `MigrationSelectorSyntax` ✗, plus `MigrationBuilderSyntax` (854 lines) unexplained.
211
+ - [ ] Document the migration error ADT and what each failure means for a migration run
212
+ - [ ] Document the selector syntax surface used to target fields
213
+
214
+ **Patch operations** — `DynamicPatchOp` ✗, `MapEdit` ✗, `MapOp` ✗, `SeqOp` ✗, `SequenceEdit` ✗, `BigIntDelta` ✗, `ForInstant` ✗, `ForLocalDate` ✗, `ForPeriod` ✗.
215
+ - [ ] Document the patch operation ADT, the map/sequence edit encodings, and the temporal delta types
216
+
217
+ **Search, traversal, and transformation — done for all three parts of this cluster.** `reference/schema/schema-search.md` (251 lines, mdoc-verified) documents `SchemaMatch`'s structural matching rules, `SearchTraversal`'s `fold`/`modify`/`modifyOption`/`modifyOrFail`/`check` and its composition with other optics, and `Reflect.Updater`/`Term.Updater` (including how `Term.Updater` deletes a field/case by returning `None`) — `TypeSearch`/`SchemaSearch` themselves were already covered by `dynamic-optic.md`'s `## Search Optics` section, which now cross-links to the new page. `reference/schema/reflect-transformer.md` (140 lines, mdoc-verified) documents `ReflectTransformer` (230 lines) and its `OnlyMetadata` base class, `RebindTransformer` (237 lines, `private[schema]` — documented through its public entry point `DynamicSchema#rebind`), and `RebindException`. `Frame` turned out to be unrelated to this cluster despite the grouping — it's an internal traversal-stack ADT used by `DynamicValue`/`Json` patch application, not by `ReflectTransformer` or the search/update surface. **`SchemaAspect`/`SchemaRepr` — done:** `schema.md`'s `## Schema Aspects` section was corrected — it showed a `recursive` method on the `SchemaAspect` trait that never existed in source — and expanded to cover the `Reflect#aspect` overloads `Schema#@@` delegates to and the silent no-op fallback when a path-targeted aspect's optic doesn't resolve. `dynamic-optic.md`'s `## Search Optics` section gained a new `### The SchemaRepr Pattern Type` subsection covering the 8-case ADT as a constructible value (not just interpolator sugar), its `render`/`toString`, and `SchemaParser`'s grammar and error reporting; its `Nominal` limitation note now covers the one exception (`Reflect`-tree search, which has real `TypeId`s to match against); and its pattern table now lists `set(...)`/`vector(...)` as synonyms for `list(...)`, which it previously omitted. Still absent: `Frame` ✗ and `SchemaParser` (344 lines) unexplained.
218
+ - [x] Write `reference/schema/schema-search.md` covering `SchemaSearch` / `SchemaMatch` / `TypeSearch` / `SearchTraversal` / `Updater` — **done**: 251 lines, mdoc-verified, wired into `sidebars.js` and cross-linked from `dynamic-optic.md` and `schema.md`
219
+ - [x] Write `reference/schema/reflect-transformer.md` covering `ReflectTransformer` and `RebindTransformer` — **done**: 140 lines, mdoc-verified, wired into `sidebars.js` and cross-linked from `binding.md` (which had a stale forward-reference promising this coverage) and `dynamic-schema.md`
220
+ - [x] Document `SchemaAspect` and `SchemaRepr` — **done**: `schema.md` and `dynamic-optic.md` sections corrected/expanded (see above), `path-interpolator.md` gained the `set`/`vector` synonym note
221
+
222
+ **Derivation overrides** — `type-class-derivation.md` never names the override subtypes: `InstanceOverrideByType` ✗, `InstanceOverrideByOptic` ✗, `InstanceOverrideByTypeAndTermName` ✗, `ModifierReflectOverrideByType` ✗, `ModifierReflectOverrideByOptic` ✗, `ModifierTermOverrideByType` ✗, `ModifierTermOverrideByOptic` ✗.
223
+ - [ ] Document each override form with the selection rule that distinguishes it
224
+
225
+ **Optic and rebuild errors** — `CaseNotFound` ✗, `FieldNotFound` ✗, `FieldAlreadyExists` ✗, `PathNotFound` ✗, `TypeMismatch` ✗, `InvalidValue` ✗, `EmptyRecord` ✗, `EmptyVariant` ✗, `RebuildRecord` ✗, `RebuildVariant` ✗, `RebuildSequence` ✗, `RebuildMap` ✗, `RebuildObject` ✗, `RebuildArray` ✗, plus `EmptySequence` unexplained.
226
+ - [ ] Add an error-case table to `schema-error.md` and `optics.md`
227
+
228
+ **JSON Schema and refinements** — `Anchor` ✗, `UriReference` ✗, `EvaluationResult` ✗, `JsonMatch` ✗ (153 lines), `FieldInfo` ✗, plus `ValidationOptions`, `RegexPattern`, `NonBlank`, `NonNegative`, `NonNegativeInt`, `Positive`, `PositiveNumber`, `Negative`, `NonPositive` unexplained.
229
+ - [ ] Document `$anchor` / `$ref` handling (`Anchor`, `UriReference`) and `ValidationOptions` in `built-in-codecs/json/json-schema.md`
230
+ - [ ] Document the refinement types — they appear in public signatures
218
231
 
219
- ## Low Priority / Skip
220
-
221
- Internal types that don't need documentation.
222
-
223
- | Type | Module | Reason |
224
- |------|--------|--------|
225
- | `LittleEndian` | chunk | Endianness marker for bit operations; specialized internal |
226
- | `ChunkMapBuilder` | chunk | Internal builder behind `ChunkMap.newBuilder` |
227
- | `PlatformSpecific` | schema | Platform-specific trait for JVM/JS split |
228
- | `Extractors` | schema | Internal pattern matching helpers on `Reflect` |
229
- | `AsLowPriorityImplicits` | schema | Implicit resolution priority helper |
230
- | `IntoPrimitiveInstances` / `IntoContainerInstances` | schema | Implicit instance providers (infrastructure) |
231
- | `HasInstances` | schema | Derivation infrastructure |
232
- | `UnapplySeqLowPriority` | schema | Implicit priority helper |
233
- | `Leaf` (in Doc) | schema | Internal documentation node type |
234
- | `Folder` | schema | Internal metadata traversal helper |
235
- | All `*Delta` / `*Dummy` types in `DynamicPatch` | schema | Internal patch operation representations (BigDecimalDelta, ByteDelta, DoubleDelta, DurationDelta, DurationDummy, FloatDelta, InstantDelta, IntDelta, LocalDateDelta, LocalDateTimeDelta, LongDelta, PeriodDelta, PeriodDummy, ShortDelta) |
236
- | All `PathParser` error types | schema | Internal parser errors (EmptyChar, InvalidEscape, InvalidIdentifier, InvalidSyntax, IntegerOverflow, MultiCharLiteral, UnexpectedChar, UnexpectedEnd, UnterminatedChar, UnterminatedString) |
237
- | `ContextDetector` / parsing states | schema | Internal JSON interpolator state machine (AfterValue, ExpectingColon, ExpectingKey, ExpectingValue, InString, TopLevel) |
238
- | `JsonSchemaToReflect` helpers | schema | Internal conversion types (FieldVariant, KeyVariant, MapShape, OptionOf, PrimKind) |
239
- | `CaseInfo` / `EnumInfo` | schema | Internal JSON codec deriver helpers |
240
- | `DynamicValueMergeStrategy` / `KeepLeft` | schema | Internal merge strategy implementation |
241
- | `DynamicValueSelection` | schema | Internal selection helper |
242
- | `NoBinding` | schema | Internal marker type |
243
- | `ReflectPrinter` | schema | Internal debug printing |
244
- | `Registry` / `Registry.Entry` | schema | Internal binding resolver storage |
245
- | `ObjectIdSupport` | schema-bson | Internal BSON ObjectId helper |
246
- | `BsonBuilder` / `BsonTrace` / `EncoderContext` / `BsonDecoderContext` | schema-bson | Internal codec implementation |
247
- | `MessagePackCodecDeriver` | schema-messagepack | Internal deriver |
248
- | `MessagePackReader` / `MessagePackWriter` | schema-messagepack | Internal binary readers/writers |
249
- | `Mixed` / `UniformRecords` | schema-toon | Internal codec strategy types |
250
- | `ArrayHeader` | schema-toon | Internal reader state |
251
- | `Off` | schema-toon | Internal config value |
252
- | All `scope/internal/*` types | scope | Internal error rendering (Colors, DepNode, DepStatus, ErrorMessages, Found, Missing, Pending, ProviderInfo) |
253
- | `Destroyed` / `Uninitialized` | scope | Internal resource lifecycle states |
254
- | `FlatMap` / `ZSink` / `ZSinkFiber` / `ZSource` / `ZSourceFiber` | streams | Experimental/WIP module |
255
- | `TypeIdInstances` | typeid | Internal implicit provider trait |
256
- | `TypeIdPrinter` | typeid | Internal rendering utility |
257
- | `Owners` | typeid | Internal namespace helper |
258
- | All `*Const` types in `TypeRepr` | typeid | Internal literal type representations (BooleanConst, CharConst, ClassOfConst, DoubleConst, FloatConst, IntConst, LongConst, NullConst, StringConst, UnitConst) |
259
- | `AnyKindType` / `AnyType` / `NothingType` / `NullType` / `UnitType` | typeid | Internal special type representations |
232
+ **`comptime` grammar** — `GrammarNode` ✗, `GRecord` ✗, `GUnion` ✗, `GMap` ✗, `GOptional` ✗, `GPrimitive` ✗, `GSequence` ✗, `GSeqList` ✗, `GSeqVector` ✗, `GSeqSet` ✗, `GSeqChunk` ✗, `GSeqArray` ✗, `GDynamic` ✗, `GIsType` ✗, `GSelf` ✗, `GWrapped` ✗ back the `Allows` mechanism documented in `allows.md`.
233
+ - [ ] Decide whether the grammar ADT is public; if yes, document it in `allows.md`; if not, mark it `private[schema]`
234
+
235
+ Also absent: `DocsSchemas` (1,327 lines) and `DerivedOptics` (581 lines) — check whether either is meant to be public.
236
+
237
+ ### 6. `telemetry` — the value ADT and the log-emitter layer
238
+
239
+ 45 unexplained and 9 absent, of 139 public types, across two clusters. The `AnyValue`/attribute-type cluster below is now resolved (was part of the original 57/17); what remains is the log-emitter layer.
240
+
241
+ - **`AnyValue` / attribute types — done, with a correction:** this cluster's names didn't match the source. There is no `BoolValue`, `IntValue`, `ArrayValue`, or any `*KV` type (`StringStringKV` etc.) anywhere in the codebase or its history; the real, only value ADT is `AttributeValue` (`StringValue`, `BooleanValue`, `LongValue`, `DoubleValue`, `StringSeqValue`, `LongSeqValue`, `DoubleSeqValue`, `BooleanSeqValue`) alongside the separate discriminator ADT `AttributeType` (`StringType`, `BooleanType`, `LongType`, `DoubleType`, and four `*SeqType` variants). `reference/telemetry/common/any-value.md` (90 lines, mdoc-verified) now documents both ADTs, the `AttributeValue` → `AttributeType` → `AttributeKey` three-way correspondence, and the OTLP JSON mapping (`stringValue`/`boolValue`/`intValue`/`doubleValue`/`arrayValue`) the `otel` exporter uses.
242
+ - **Signal detail**: `LogState` ✗, `SourceLocation` ✗, `Templated` ✗, `AttributesKind` ✗, `EnrichmentKind` ✗, `FallbackKind` ✗, `SeverityKind` ✗, `StringBodyKind` ✗, `ThrowableKind` ✗, plus `SpanEvent`, `SpanLink`, `Measurement`, `GaugeDataPoint`, `HistogramDataPoint`, `SamplingDecision`, `LogMessage`, `LogRecordBuilder` unexplained, and the `Severity` numbered variants (`Trace2`–`Trace4`, `Debug2`–`Debug4`, `Info2`–`Info4`, `Warn2`–`Warn4`, `Error2`–`Error4`, `Fatal2`–`Fatal4`) unexplained
243
+
244
+ Absent implementation types with a public entry point: `LogEmitter` ✗ (101 lines), `FormattedLogEmitter` ✗, `FileLogWriter` ✗ (163 lines), `StdoutLogRecordProcessor` ✗ (134 lines), `SyncInstruments` ✗.
245
+
246
+ Actions:
247
+
248
+ - [x] Write `reference/telemetry/common/any-value.md` — **done**: 90 lines, mdoc-verified, wired into `sidebars.js` and cross-linked from `attributes.md` and `otel/index.md`. The `KV` shortcuts named in the original action item don't exist in source; documented `AttributeValue`/`AttributeType` instead (see above)
249
+ - [ ] Add `SpanEvent` and `SpanLink` sections to `tracing/span.md`
250
+ - [ ] Add `Measurement`, `GaugeDataPoint`, `HistogramDataPoint` to `metrics/metric-data.md`
251
+ - [ ] Add `SamplingDecision` to `tracing/sampler.md`
252
+ - [ ] Write `reference/telemetry/logging/log-emitter.md` — `LogEmitter`, `FormattedLogEmitter`, `FileLogWriter`, `StdoutLogRecordProcessor`
253
+ - [ ] Document the full `Severity` scale, including the numbered sub-levels
254
+ - [ ] Document the log-record `*Kind` classifiers or make them private
255
+
256
+ ### 7. `endpoint` — combinators and segment shortcuts
257
+
258
+ 20 unexplained types: `Alternator` ✗, `CanCombine` ✗, `PathVarsCombiner` ✗, `RoutePathVarsCombiner` ✗, `SegmentCodecOps` ✗, `SinglePathVarPathCodecOps` ✗, `WithStatus` ✗, `ErrorBuilder` ✗, `EndpointUnionErrorBuilder` ✗, `IntSeg` ✗, `LongSeg` ✗, `BoolSeg` ✗, `StringSeg` ✗, `UUIDSeg` ✗, plus `Ignored`, `PathVar`, and `PathCodecRuntime` unexplained.
259
+
260
+ `Alternator` and `CanCombine` are the type-level machinery that decides what `++` and `|` produce — without them the combinator signatures in `endpoint.md` and `http-codec.md` cannot be read.
261
+
262
+ Actions:
263
+
264
+ - [ ] Add a *Type-level combination* section covering `Alternator` and `CanCombine` with the resulting-type rules
265
+ - [ ] Document `PathVarsCombiner` / `RoutePathVarsCombiner` and how path variables accumulate into a tuple
266
+ - [ ] Document the `*Seg` shortcuts in `segment-codec.md`
267
+ - [ ] Document `WithStatus`, `ErrorBuilder`, and `EndpointUnionErrorBuilder` in the error section of `endpoint.md`
268
+
269
+ ### 8. `htmx` — response headers
270
+
271
+ **Done.** The attribute DSL was well covered (2,521 doc lines, ratio 1.63), but the header side — `HtmxHeaders` (334 lines) and its 22 request/response header types — was absent. `reference/htmx/response-headers.md` (229 lines, mdoc-verified) now covers both directions: the request headers HTMX sends (`HxRequest`, `HxBoosted`, `HxCurrentUrl`, `HxTargetId`, `HxTriggerId`, `HxTriggerName`, `HxHistoryRestoreRequest`, `HxPrompt`), the response headers a handler sets (`HxLocation`, `HxPushUrl`, `HxReplaceUrl`, `HxRedirect`, `HxRefresh`, `HxReswap`, `HxRetarget`, `HxReselect`, `HxTriggerHeader`, `HxTriggerAfterSettle`, `HxTriggerAfterSwap`, `HxEventPayload`), and how each reuses `HxSwap`/`HxTarget`/`HxUrlUpdate`/`CssSelector` from the attribute DSL. `HxTriggerValue`, `HxOnKey`, `PartialHxOn`, `Changed`, and `Threshold` from the original absent-types list are attribute-DSL types (not headers) and remain covered by `hx-trigger.md`/`attribute-values.md`. The internal `HtmxHeaderSupport` parsing helper is `private[headers]` and intentionally left undocumented as an implementation detail, not a public integration point.
272
+
273
+ Actions:
274
+
275
+ - [x] Write `reference/htmx/response-headers.md` — **done**: 229 lines, mdoc-verified, wired into `sidebars.js` and cross-linked from `reference/htmx/index.md`
276
+
277
+ ### 9. `smithy` — RESOLVED
278
+
279
+ `smithy.md` covered parsing, querying, building, and serializing, but its *Core Types* tree elided the shape ADT with "StringShape, BooleanShape, IntegerShape, etc." and "... (and other shape subtypes)". 16 of 42 public types were absent, and the module had the lowest coverage in the repository at 24%.
280
+
281
+ A `## Shape Catalog` section (348 lines, mdoc-verified) now covers all 20 `Shape` subtypes in the four families the source organizes them into: 13 simple shapes with a table of IDL keywords, `EnumShape`/`IntEnumShape` with their member types, the four aggregate shapes and the `MemberDefinition` they share, and the three service shapes including a field table for `ResourceShape`'s identifiers and five lifecycle operations. `ShapeRef`, `ShapeId`, `ShapeId.Member`, and reference resolution get their own subsections. The module is now at **90% with no absent types**.
282
+
283
+ The catalog uses evaluated `mdoc` blocks rather than the page's `compile-only` style, which surfaced two behaviours worth knowing and neither previously documented:
284
+
285
+ - **Parsed references carry an empty namespace.** An IDL target written without a namespace prefix becomes `ShapeId(namespace = "", name = "TagList")` — not the model's namespace, and not `smithy.api`. This holds for structure members, list/map members, resource identifiers, and lifecycle operations alike. Trait identifiers are the exception and do arrive qualified as `smithy.api`. This is why `SmithyModel#findShape` matches on name alone, and why comparing `ShapeId#namespace` on a parsed reference tells you nothing.
286
+ - **A parsed `ShapeId` need not round-trip through `ShapeId.parse`.** `ShapeId("", "String").toString` renders `"#String"`, which `ShapeId.parse` then rejects with "ShapeId namespace cannot be empty".
287
+
288
+ Also documented: `ListShape` and `MapShape` declare their defaulted `traits` parameter *before* their undefaulted `member`/`key`/`value` parameters, so only named-argument construction compiles.
289
+
290
+ Remaining: 4 unexplained types, none absent. Two are measurement artifacts rather than gaps — `SmithyModel` and `ShapeId.Member` are discussed throughout, but always in qualified form (`SmithyModel.parse`, `ShapeId.Member`), which the bare-name match does not see. The other two are real, small, and belong to the metadata surface rather than the shape ADT:
291
+
292
+ - [ ] `NodeValue` — the metadata value ADT, named in the *Core Types* tree and used in examples but never explained
293
+ - [ ] `ApplyStatement` — appears in the `SmithyModel` signature with no accompanying prose
294
+
295
+ ### 10. `streams` — the I/O adapter surface
296
+
297
+ `sink.md` documents `NioSinks`, but the reader side and the queue primitives do not appear: `NioReaders` ✗, `NioWriters` ✗, `SinkError` ✗, `StreamState` ✗, `OpTag` ✗, `BlockingSpscQueue` ✗, `BlockingMpscQueue` ✗, `BlockingMpmcQueue` ✗, plus `ByteBufferReader` (554 lines), `ChannelReader`, and `ChannelWriter` unexplained.
298
+
299
+ Actions:
300
+
301
+ - [ ] Add a *JVM NIO Readers* section to `reader.md` mirroring the NIO section in `sink.md` (`NioReaders`, `ByteBufferReader`, `ChannelReader`)
302
+ - [ ] Add `NioWriters` / `ChannelWriter` to `writer.md`
303
+ - [ ] Document `SinkError`
304
+ - [ ] State the sentinel-based EOF design in `reader.md` — it is enforced in review (`AGENTS.md`, *Sentinel performance policy*) but never explained to users
305
+
306
+ ### 11. `typeid` — `Member` subtypes and segment kinds
307
+
308
+ 44 unexplained types, 26 of them absent. Absent: `Def` ✗, `Val` ✗, `Param` ✗, `TypeMember` ✗, `EnumCaseParam` ✗, `TupleElement` ✗, `PkgSegment` ✗, `TermSegment` ✗, `TypeSegment` ✗, `SegmentInfo` ✗, plus `TypeIdOps` ✗ (333 lines). Unexplained but present in examples: `TypeBounds`, `ThisType`, `TypeProjection`, `TypeSelect`, `ParamRef`, `Repeated`, `ByName`, `Annotated`, `ArrayArg`, `ClassOf`, `EnumValue`, `Covariant`, `Contravariant`, `Invariant`, and the `*Const` literal types.
309
+
310
+ Actions:
311
+
312
+ - [ ] Document the `Member` ADT (`Def`, `Val`, `Param`, `TypeMember`, `EnumCaseParam`) in `typeid.md`
313
+ - [ ] Document `Owner` segments (`PkgSegment`, `TermSegment`, `TypeSegment`) and `SegmentInfo`
314
+ - [ ] Document `TypeBounds` and `TupleElement`
315
+ - [ ] Document the `TypeIdOps` extension surface
316
+ - [ ] Add a `TypeRepr` pattern-matching reference covering the variance and literal variants
317
+
318
+ ### 12. Smaller module gaps
319
+
320
+ - **`html`** (68 unexplained, 40 absent) — **the rank-1 justification in the table above was wrong and is corrected here.** An earlier revision of this entry claimed the typed content model was "entirely unnamed"; it is not. `html.md` has had a `## Typed Content Models` section since #1536 landed, naming every marker type (`Dom.Element.Li`, `Cell`, `Tr`, `SelectChild`, `Opt`, `Optgroup`), demonstrating compile-time rejection with an `mdoc:fail` block, and documenting structural equality across element classes and the `caption`/`thead` limitation. The 40 absent types break down as follows, and only two groups are conceptual gaps:
321
+ - **Real: CSS values — resolved.** `CssLength`'s unit set and numeric extension methods, and four of `CssColor`'s five cases, had no mention anywhere. The page's one example used the verbose `CssLength(300.0, "px")` while `300.px` existed unmentioned, so the docs actively steered readers to the clunkier API. A `### Typed Values: Lengths and Colors` section now covers the 15 valid units, `CssLengthIntOps`/`CssLengthDoubleOps` and the second import they require, all five `CssColor` cases, and the `Hex` versus `Hex.unsafe` validation split.
322
+ - **Real: the Scala 2 argument encoding.** `ListArg` ✗, `CellArg` ✗, `RowArg` ✗, `SelectArg` ✗, `OptgroupArg` ✗, `ScriptArg` ✗, and `StyleArg` ✗ are how the content model is expressed on 2.13 — sealed traits plus implicit conversions, where Scala 3 uses union types (`Dom.Attribute | Dom.Element.Li`). The content-model table writes the Scala 3 form only, and no page mentions that the encodings differ. This needs tabbed examples per the writing-style rule on version-specific syntax.
323
+ - **Real: extension points.** `DomModifier` ✗ and its four cases (`AddAttr` ✗, `AddChild` ✗, `AddChildren` ✗, `AddEffects` ✗), plus the `ToDom` ✗ and `ToText` ✗ conversion type classes. `ToModifier` is named in the page; these are not.
324
+ - **Naming only: selector ADT nodes.** `Descendant` ✗, `AdjacentSibling` ✗, `GeneralSibling` ✗, `AttributeMatch` ✗, `StartsWith` ✗, `EndsWith` ✗, `WhitespaceContains` ✗, `HyphenPrefix` ✗, `PseudoClass` ✗, `PseudoElement` ✗. Every one is reachable and demonstrated through the DSL (`div >> span`, `a.hover`, `input.withAttributeStarting(...)`); only the resulting node types are unnamed. Worth a short table for readers pattern matching on a built selector, not a section.
325
+ - **Naming only: concrete element classes.** `LiElement` ✗, `ThElement` ✗, `TdElement` ✗, `TrElement` ✗, `OptElement` ✗, `OptgroupElement` ✗ — the implementations behind the documented marker traits.
326
+ - **Skip: interpolator plumbing.** `CssStringContext` ✗, `HtmlStringContext` ✗, `JsStringContext` ✗, `SelectorStringContext` ✗, `TemplateInterpolators` ✗, `InterpolatorRuntime` ✗, `HtmlElements` ✗, `DomModifierConversions` ✗, `LowPriorityToJs` ✗, `JsValue` ✗. These match the naming patterns in *Deliberately Undocumented*; the interpolator syntax is documented, its machinery should not be.
327
+ - [ ] Add an ADT reference section naming the selector, colour, and modifier types behind the DSL
328
+ - **`datastar`** (28 unexplained) — same shape: `EventModifier` ✗, `CaseModifier` ✗, `InitModifier` ✗, `IntersectModifier` ✗, `OnIntervalModifier` ✗, `OnSignalPatchModifier` ✗, `DataOn` ✗, `PatchSignals` ✗, `PatchElements` ✗, `DatastarAttributes` ✗, `DatastarAttrKey` ✗, `ToDatastarExpr` ✗, `DataSignalsBuilder` ✗, `EventType` ✗. The 0.18 ratio is the bigger problem: 346 lines for 1,881 source lines.
329
+ - [ ] Expand `datastar.md` — each SSE event type needs a worked example; add an attribute-DSL type reference
330
+ - **`schema-xml`** (15 unexplained) — `XmlCodecError` ✗, `XmlWriter` ✗, `XmlCodecDeriver` ✗ (657 lines), `SetAttribute` ✗, `RemoveAttribute` ✗, `ElementBuilder` ✗
331
+ - [ ] Add error-handling and deriver/customization sections to `built-in-codecs/xml.md`
332
+ - **`schema-yaml`** (8 unexplained) — `YamlCodecError` ✗, `YamlTag` ✗, `YamlSyntax` ✗, `YamlStringContext` ✗; 552 doc lines for 2,753 source lines
333
+ - [ ] Document `YamlTag`, the `yaml""` interpolator, and the error type
334
+ - **`codegen`** (17 unexplained) — `ParamList` ✗, `ParamListModifier` ✗, `ExtensionBlock` ✗, `NestedType` ✗, `GroupImport` ✗, `RenameImport` ✗, plus `SingleImport`, `WildcardImport`, `SimpleCase`, `ParameterizedCase`, `CompanionObject`, `DefMember`, `ValMember` unexplained despite a 1.44 ratio
335
+ - [ ] Add the import forms and `ExtensionBlock` / `NestedType` to `reference/codegen/`
336
+ - **`scope`** (12 unexplained) — `WireInfo` ✗, `WireKind` ✗ in `resource-management/wire.md`; `InStack`, `Destroyed`, `Uninitialized` unexplained
337
+ - **`mux`** — `HalfClosedLocal` ✗, `HalfClosedRemote` ✗ stream states
338
+ - [ ] Complete the stream-state lifecycle in `mux.mdx`
339
+ - **`context`** — `ContextHas` ✗ (55 lines), `ContextEntries` ✗ (241 lines)
340
+ - **`combinators`** — `TuplesLowPriority` ✗, `TuplesLowPriority1` ✗ (implicit-priority helpers; safe to skip)
341
+ - **`maybe`** — `MaybeSyntax` ✗, `MaybeOps` ✗, `MaybeValue` ✗, `MaybeWithFilter` ✗, `WithFilter` ✗, `MaybeCompat` ✗, `MaybeSyntaxCompat` ✗. All seven are syntax or compatibility shims, and the page already exceeds the source in size; **skip permanently** rather than re-triaging each revision
342
+ - **`openapi`** — `OpenAPIGen` ✗ (32 lines) only
343
+ - **`sql`** — `PgCodec` ✗ (169 lines, PostgreSQL type mapping) only
344
+ - **`markdown`** — `MdInterpolator` ✗, `MdStringContext` ✗: the `md"..."` interpolator is documented; the runtime types are not. **Skip.**
345
+ - **`chunk`**, **`schema-bson`**, **`schema-csv`** — one or two unexplained internals each; effectively complete
260
346
 
261
347
  ---
262
348
 
263
- ## Suggested Actions
349
+ ## Conceptual and Guide Gaps
350
+
351
+ `docs/guides/` holds 9 files covering `async`, `scope`, `mux`, the SQL query DSL (4 files), `telemetry`, and migration *from* zio-schema. Every other module has reference documentation only.
352
+
353
+ No guide exists for:
354
+
355
+ | Module | src LOC | Suggested guide |
356
+ |---|---:|---|
357
+ | **schema** | 84,969 | Deriving your first schema; encode/decode round trip |
358
+ | **streams** | 18,434 | Building a streaming pipeline end to end |
359
+ | **http-model** + **endpoint** | 7,517 | Describing and consuming an HTTP API |
360
+ | **html** + **htmx** + **datastar** | 8,154 | Building a hypermedia page |
361
+ | **typeid** | 6,493 | Reflecting on types at compile time |
362
+ | **chunk** | 5,069 | Choosing `Chunk` over `Vector` / `Array` |
363
+ | **openapi** + **smithy** | 5,016 | Generating clients from a service description |
364
+ | **config** | 3,914 | Loading typed configuration and feature flags |
365
+ | **codegen** | 2,100 | Generating Scala sources |
366
+
367
+ Cross-cutting documents that do not exist:
264
368
 
265
- Ordered TODO checklist grouped by module, with estimated scope.
369
+ - [ ] **Getting Started** — add dependencies, define a case class, derive a schema, encode to JSON. `docs/index.md` is a block catalog, not an on-ramp.
370
+ - [ ] **Architecture Overview** — module dependency graph, the register-based zero-allocation design, the `Reflect` → `Binding` → `Schema` layering, the `Deriver` pattern
371
+ - [ ] **Zero-dependency and cross-platform contract** — what is JVM-only, what is JS-safe, and what the `scala-2` / `scala-3` source splits mean for users
372
+ - [ ] **Performance guide** — `Chunk.materialize`, register allocation, derivation caching, the streams sentinel design, and the labeled-instrument allocation trade-off (currently explained only inside `labeled-instruments.md`)
373
+ - [ ] **Custom codec how-to** — implementing a `Format` and its `Deriver` end to end
266
374
 
267
- ### Conceptual Documentation (highest impact)
375
+ ---
376
+
377
+ ## Deliberately Undocumented
378
+
379
+ These naming patterns are internal by construction. Do not write documentation for them; if any are public by accident, tighten their visibility instead.
380
+
381
+ | Pattern | Reason | Examples |
382
+ |---|---|---|
383
+ | `*Macros`, `*MacroOps`, `MacroUtils`, `MacroCore` | Compile-time implementation | `PathMacros`, `SelectorMacros`, `MigrationValidationMacros`, `CommonMacroOps`, `DbCodecOpaqueMacro` |
384
+ | `*VersionSpecific`, `*PlatformSpecific`, `Platform*`, `*Compat` | Scala 2/3 and JVM/JS source-split shims | `SchemaVersionSpecific`, `TypeIdPlatformSpecific`, `PlatformConfigSource`, `PlatformMux`, `MaybeCompat` |
385
+ | `*LowPriority`, `*LowPriority1` | Implicit-resolution priority helpers | `TuplesLowPriority`, `TypeIdLowPriority`, `PathVarsCombinerLowPriority`, `DisplayableLowPriority` |
386
+ | `*Impl`, `*Runtime`, `*CodeGen` | Private implementations behind a public façade | `ScopeImpl`, `PathCodecRuntime`, `InterpolatorRuntime`, `JsonInterpolatorRuntime`, `WireCodeGen` |
387
+ | `*StringContext` | Interpolator plumbing; document the interpolator syntax instead | `JsonStringContext`, `YamlStringContext`, `CssStringContext`, `MediaTypeStringContext` |
388
+ | Generated primitive-lane readers | Machine-generated specializations of one documented shape | `LongConcurrentMapParReader`, `IntConcurrentMergeReader`, `DoubleConcurrentMapParReader`, and siblings |
389
+ | `PathParser` error states | Internal parser states | `EmptyChar`, `InvalidEscape`, `UnexpectedChar`, `UnterminatedString`, `IntegerOverflow`, `MultiCharLiteral` |
390
+ | JSON interpolator states | Internal state machine | `TopLevel`, `InString`, `AfterValue`, `ExpectingKey`, `ExpectingColon`, `ExpectingValue` |
391
+ | `*Delta` / `*Dummy` in `patch` | Internal patch encodings | `ByteDelta`, `FloatDelta`, `PeriodDelta`, `DurationDummy`, `PeriodDummy` |
392
+ | `scope/internal/*` | Error-rendering internals | `Colors`, `DepNode`, `DepStatus`, `ErrorMessages` |
393
+ | async CPS internals | Direct-style transform machinery, not user-facing | `AsyncCpsMonad`, `AwaitCall`, `CollectAwaitCall`, `FoldLeftAwaitCall`, `HofAwaitCall`, `TypedHofMap`, `WaitingMarker`, `NullCauseMarker`, `WithFilterChain`, `PartialFunctionLiteral`, `SingleArgFunction`, `TwoArgFunction`, `AsyncDcaTransform`, `AsyncRunner`, `Parker` |
394
+ | `private[...]` parsers and printers | Not part of the public surface | `SmithyParser`, `SmithyPrinter`, `HoconParser`, `SchemaParser`, `ReflectPrinter`, `TypeIdPrinter` |
268
395
 
269
- 1. - [ ] Write **Getting Started Guide** — `docs/getting-started.md` — *new page*
270
- 2. - [ ] Write **Architecture Overview** — `docs/architecture.md` — *new page*
271
- 3. - [ ] Write **End-to-End Pipeline Example** — Schema -> Codec -> Encode -> Decode -> Validate — *new page or section*
396
+ ---
272
397
 
273
- ### Module: `mediatype` (entirely undocumented)
398
+ ## Prioritized Action List
274
399
 
275
- 4. - [ ] Write **MediaType reference page** — `docs/reference/media-type.md` — *new page*
400
+ Ordered by user impact per unit of writing effort. The ranking below predates the scanner fix; by the corrected table, the largest *genuine* remaining gaps are, in order:
276
401
 
277
- ### Module: `schema` (core gaps)
402
+ | Rank | Module | absent / public | cov | Why |
403
+ | ---- | ------ | --------------- | ---- | --- |
404
+ | 1 | `html` | 40 / 110 | **38%** | Selector and modifier ADTs unnamed, and the Scala 2 argument encoding is undocumented |
405
+ | 2 | `maybe` | 6 / 10 | 40% | Small surface, but more than half of it unnamed |
406
+ | 3 | `typeid` | 26 / 90 | 52% | `Member` ADT and owner segments |
407
+ | 4 | `schema-xml` | 9 / 38 | 53% | Error types and the deriver |
408
+ | 5 | `schema` | 156 / 466 | 56% | Largest absolute, but six separable subsystems remain |
409
+ | 6 | `endpoint` | 18 / 60 | 67% | `Alternator`, `CanCombine`, segment shortcuts |
278
410
 
279
- 5. - [ ] Write **SchemaError reference** — error types, handling patterns — *new page or new section in schema.md*
280
- 6. - [ ] Write **SchemaExpr reference** — expression DSL, validation expressions — *new page*
281
- 7. - [ ] Write **Into reference** — cross-type conversions — *new page*
282
- 8. - [ ] Add **BindingResolver, MapConstructor, MapDeconstructor** sections to `binding.md` — *update existing*
283
- 9. - [ ] Add **InstanceOverride, ModifierOverride** sections to `type-class-derivation.md` — *update existing*
284
- 10. - [ ] Add **IsNumeric, IsCollection, IsMap** section to `schema.md` — *update existing*
285
- 11. - [ ] Add **Keyable, NameMapper** section to `json.md` — *update existing*
286
- 12. - [ ] Add **JsonPatch operations** section to `json.md` or `patch.md` — *update existing*
287
- 13. - [ ] Add **Reflectable, ToStructural** sections to `reflect.md` — *update existing*
288
- 14. - [ ] Expand **Register/RegisterOffset** explanation in `binding.md` and `registers.md` — *update existing*
411
+ `smithy` has left the list — the shape catalog took it from 24% to 86% with no absent types. `streams` and `async` drop out entirely once internal declarations are excluded. `htmx` and `datastar` left earlier: #1619 took `htmx` to 77%, and the five-page datastar split took it to 98%.
289
412
 
290
- ### Module: `typeid` (many subtypes undocumented)
413
+ `html` grew from 100 public types to 110 between revisions while its documentation did not, which is the one row where waiting makes the work larger.
291
414
 
292
- 15. - [ ] Add **TypeRepr** section with key subtypes to `typeid.md` — *update existing*
293
- 16. - [ ] Add **TypeDefKind** section to `typeid.md` — *update existing*
294
- 17. - [ ] Add **Kind/Arrow** section to `typeid.md` — *update existing*
295
- 18. - [ ] Add **Annotation** subtypes section to `typeid.md` — *update existing*
296
- 19. - [ ] Add **Owner/Segment** section to `typeid.md` — *update existing*
415
+ **Tier 1 — new pages for missing subsystems**
297
416
 
298
- ### Module: `context`
417
+ 1. - [x] `reference/http-model/headers.md` — **done**: 660 lines cataloguing all 75 built-ins, mdoc-verified
418
+ 2. - [x] Split `reference/config.md` into `reference/config/` — **done**: seven pages, 2,212 lines, mdoc-verified; family now at 70% with no user-facing type absent
419
+ 3. - [x] ~~Split `reference/telemetry/otel/` into four pages~~ — **done differently**: the four-page split was mis-scoped (the exporters are `private[otel]`); resolved with one new page plus index additions, module now at 100%
420
+ 4. - [x] `reference/htmx/response-headers.md` — **done**: 229 lines, mdoc-verified
421
+ 5. - [x] `reference/schema/schema-search.md` (`SchemaSearch`, `SchemaMatch`, `TypeSearch`, `SearchTraversal`, `Updater`) — **done**: 251 lines, mdoc-verified
422
+ 6. - [x] `reference/telemetry/common/any-value.md` — **done**: 90 lines, mdoc-verified
423
+ 7. - [x] `reference/http-model/server-sent-event.md` — **done**: 296 lines
424
+ 8. - [x] `reference/schema/reflect-transformer.md` — **done**: 140 lines, mdoc-verified
425
+ 9. - [ ] `reference/telemetry/logging/log-emitter.md`
299
426
 
300
- 20. - [ ] Add **IsNominalType, IsNominalIntersection** section to `context.md` — *update existing*
427
+ **Tier 2 — sections in existing pages**
301
428
 
302
- ### Module: `markdown`
429
+ 10. - [ ] `Into` conversion matrix (schema)
430
+ 11. - [ ] `SchemaExpr` operator reference (`schema-expr.md`)
431
+ 12. - [ ] Migration error ADT (`migration.md`)
432
+ 13. - [ ] Patch operation ADT (`patch.md`)
433
+ 14. - [ ] Derivation overrides (`type-class-derivation.md`)
434
+ 15. - [x] Codec layer — **done**: `http-model/schema-codecs.md`, 463 lines, mdoc-verified; it is a parallel whole-value API rather than machinery under the extension classes
435
+ 16. - [ ] `Alternator` / `CanCombine` type-level rules (`endpoint/`)
436
+ 17. - [x] Complete the Smithy shape catalog (`smithy.md`) — **done**: `## Shape Catalog`, 348 lines, mdoc-verified; module went from 24% to 90% with no absent types
437
+ 18. - [ ] `SpanEvent` / `SpanLink` / `SamplingDecision` / data points (`telemetry/`)
438
+ 19. - [ ] NIO readers and writers (`streams/reader.md`, `streams/writer.md`)
439
+ 20. - [ ] `Member` ADT and owner segments (`typeid.md`)
440
+ 21. - [ ] XML and YAML error types and derivers (`built-in-codecs/`)
441
+ 22. - [ ] Optic and rebuild error tables (`schema-error.md`, `optics.md`)
442
+ 23. - [ ] JSON Schema `$anchor` / `$ref` and the refinement types
443
+ 24. - [ ] Codegen import forms, `ExtensionBlock`, `NestedType`
303
444
 
304
- 21. - [ ] Add **Block subtypes** reference section to `docs.md` — *update existing*
305
- 22. - [ ] Add **Inline subtypes** reference section to `docs.md` — *update existing*
306
- 23. - [ ] Add **Alignment, HeadingLevel, TerminalRenderer** mentions to `docs.md` — *update existing*
445
+ **Tier 3 — depth on thin pages**
307
446
 
308
- ### Module: `chunk`
447
+ 25. - [ ] Expand `datastar.md` (ratio 0.18)
448
+ 26. - [ ] Expand `async.md` (ratio 0.20) — the user-facing direct-style surface, not the CPS internals
449
+ 27. - [x] Expand `smithy.md` — **done**: ratio 0.21 → 0.34 (533 → 881 lines)
450
+ 28. - [ ] Expand `html.md` with the Scala 2 argument encoding, the `DomModifier`/`ToDom`/`ToText` extension points, and a selector-node table — CSS values done
309
451
 
310
- 24. - [ ] Add **BitChunk operations** section to `chunk.md` — *update existing*
311
- 25. - [ ] Add **ChunkIterator** mention to `chunk.md` — *update existing*
452
+ **Tier 4 — conceptual documents**
312
453
 
313
- ### Format modules (expand `formats.md`)
454
+ 29. - [ ] Getting Started
455
+ 30. - [ ] Architecture Overview
456
+ 31. - [ ] Zero-dependency / cross-platform contract
457
+ 32. - [ ] Performance guide
458
+ 33. - [ ] Guides for `schema`, `streams`, `http-model` + `endpoint`, hypermedia, `config`
314
459
 
315
- 26. - [ ] Expand **BSON section** in `formats.md` with BsonEncoder/BsonDecoder API — *update existing*
316
- 27. - [ ] Expand **MessagePack section** in `formats.md` with MessagePackCodec API — *update existing*
317
- 28. - [ ] Expand **Thrift section** in `formats.md` with ThriftCodec API — *update existing*
318
- 29. - [ ] Expand **TOON section** in `formats.md` with ToonReader/ToonWriter, Delimiter, config — *update existing*
460
+ **Visibility cleanups (instead of documentation)**
319
461
 
320
- ### Depth improvements (existing pages)
462
+ 34. - [ ] Decide the public status of the `comptime` `G*` grammar ADT, `DocsSchemas`, `DerivedOptics`, `ContextEntries`, `HtmxHeaders`, and the telemetry log-record `*Kind` classifiers; tighten visibility where they are not public API
463
+
464
+ ---
321
465
 
322
- 30. - [ ] Add missing **Reflect#transform** and **Reflect#noBinding** to `reflect.md`
323
- 31. - [ ] Add missing **Format trait interface** and **custom Format** example to `codec.md`
324
- 32. - [ ] Add missing **DynamicPatch** operations and **patch serialization** example to `patch.md`
325
- 33. - [ ] Add missing **Validation composition** guidance and **JSON Schema integration** to `validation.md`
326
- 34. - [ ] Add missing **TypeRepr pattern matching** and **Scala 2/3 differences** to `typeid.md`
327
- 35. - [ ] Add missing **Cache behavior** and **intersection type** examples to `context.md`
466
+ ## Methodology
467
+
468
+ Reproducible with the script below. It walks every module's `src/main` sources, classifies each `class` / `trait` / `object` / `enum` declaration as public or internal, and diffs the public names against the identifiers found in `docs/`.
469
+
470
+ A declaration is **internal** when it is `private` or `protected`, *or when any enclosing declaration is*. That second clause matters: a type declared bare inside `private[schema] object ParamCodecSupport` is not API, and an earlier revision of this script counted six such types as public and scoped a page around them. The scanner tracks an indentation stack to get this right.
471
+
472
+ Two document sets are built: every identifier anywhere in `docs/` (yielding *absent*), and only identifiers in inline code or headings (yielding *unexplained*). The whole scanner:
473
+
474
+ ```python
475
+ #!/usr/bin/env python3
476
+ """Documentation coverage scan for zio-blocks.
477
+
478
+ Reports, per module, how much of the *public* type surface the documentation
479
+ names. A type counts as public only when neither it nor any enclosing
480
+ declaration is private or protected.
481
+ """
482
+ import os, re, sys
483
+
484
+ DECL = re.compile(
485
+ r'^(?P<indent>[ \t]*)'
486
+ r'(?P<mods>(?:(?:final|sealed|abstract|implicit|case|transparent|inline|'
487
+ r'private|protected)(?:\[[A-Za-z_]\w*\])?\s+)*)'
488
+ r'(?:class|trait|object|enum)\s+(?P<name>[A-Za-z_]\w*)'
489
+ )
490
+ PRIVATE = re.compile(r'\b(private|protected)\b')
491
+
492
+ def scan_module(path):
493
+ """Return (public type names, count of non-public declarations)."""
494
+ public, nonpublic = set(), 0
495
+ for root, _, files in os.walk(path):
496
+ if '/src/main/' not in root + '/':
497
+ continue
498
+ for f in files:
499
+ if not f.endswith('.scala'):
500
+ continue
501
+ # stack of (indent, enclosing_is_private) for open declarations
502
+ stack = []
503
+ for line in open(os.path.join(root, f), encoding='utf-8', errors='ignore'):
504
+ m = DECL.match(line)
505
+ if not m:
506
+ continue
507
+ indent = len(m.group('indent').expandtabs(2))
508
+ while stack and stack[-1][0] >= indent:
509
+ stack.pop()
510
+ enclosed = any(p for _, p in stack)
511
+ own = bool(PRIVATE.search(m.group('mods')))
512
+ hidden = own or enclosed
513
+ if hidden:
514
+ nonpublic += 1
515
+ else:
516
+ public.add(m.group('name'))
517
+ stack.append((indent, hidden))
518
+ return public, nonpublic
519
+
520
+ def doc_identifiers(docs='docs', exclude=('undocumented-report.md',)):
521
+ """All identifiers anywhere in the docs, and those in prose or headings."""
522
+ anywhere, explained = set(), set()
523
+ token = re.compile(r'[A-Za-z_]\w*')
524
+ inline = re.compile(r'`([A-Za-z_]\w*)`')
525
+ for root, _, files in os.walk(docs):
526
+ for f in files:
527
+ if not f.endswith(('.md', '.mdx', '.jsx')) or f in exclude:
528
+ continue
529
+ text = open(os.path.join(root, f), encoding='utf-8', errors='ignore').read()
530
+ anywhere.update(token.findall(text))
531
+ explained.update(inline.findall(text))
532
+ for line in text.split('\n'):
533
+ if line.startswith('#'):
534
+ explained.update(token.findall(line))
535
+ return anywhere, explained
536
+
537
+ def main(modules):
538
+ anywhere, explained = doc_identifiers()
539
+ rows, tp = [], [0, 0, 0]
540
+ for m in modules:
541
+ if not os.path.isdir(m):
542
+ continue
543
+ public, nonpublic = scan_module(m)
544
+ if not public and not nonpublic:
545
+ continue
546
+ absent = sorted(n for n in public if n not in anywhere)
547
+ unexplained = sorted(n for n in public if n not in explained)
548
+ rows.append((m, len(public), nonpublic, len(absent), len(unexplained), absent))
549
+ tp[0] += len(public); tp[1] += len(absent); tp[2] += len(unexplained)
550
+ rows.sort(key=lambda r: -r[3])
551
+ print(f"{'module':<20}{'public':>7}{'internal':>9}{'absent':>7}{'unexpl':>7}{'cov':>6}")
552
+ for m, p, np_, a, u, _ in rows:
553
+ print(f"{m:<20}{p:>7}{np_:>9}{a:>7}{u:>7}{round((p-u)*100/p) if p else 0:>5}%")
554
+ print(f"\nTOTAL public={tp[0]} absent={tp[1]} unexplained={tp[2]} "
555
+ f"name-cov={round((tp[0]-tp[1])*100/tp[0])}% explained-cov={round((tp[0]-tp[2])*100/tp[0])}%")
556
+ if '-v' in sys.argv:
557
+ print()
558
+ for m, _, _, _, _, absent in rows:
559
+ if absent:
560
+ print(f"{m}: {' '.join(absent)}")
561
+
562
+ MODULES = """async chunk codegen combinators config config-hocon config-json config-yaml context
563
+ datastar endpoint html htmx http-model http-model-schema markdown maybe mediatype mux openapi
564
+ otel ringbuffer schema schema-avro schema-bson schema-csv schema-messagepack schema-thrift
565
+ schema-toon schema-xml schema-yaml scope smithy sql sql-zio streams telemetry typeid""".split()
566
+
567
+ if __name__ == '__main__':
568
+ main(MODULES)
569
+ ```
570
+
571
+ Run it from the repository root:
572
+
573
+ ```bash
574
+ python3 scan-coverage.py # table
575
+ python3 scan-coverage.py -v # table plus the absent names per module
576
+ ```
577
+
578
+ Known limitations:
579
+
580
+ - **Matching is name-based.** A type whose name collides with an ordinary English word (`Default`, `Private`, `Public`, `Wildcard`, `Flag`, `Origin`, `Date`, `Host`) can be scored as covered when the page never discusses it. Both gap counts are lower bounds.
581
+ - **The `unexplained` column under-counts on well-written pages.** The writing-style rules require qualified method references (`ConfigSource#orElse`), and nested types read naturally as `Provenance.Resolved` or `KeyFormat.KebabCase` — none of which the bare-name match sees. A page that follows the style guide will show unexplained types it actually explains.
582
+ - **Indentation, not parsing, determines nesting.** The privacy stack assumes scalafmt-formatted sources, where a nested declaration is indented further than its enclosure. It would misclassify a declaration inside a Scala 3 brace-free block that was not indented, and it does not read `export` or type aliases that re-expose an internal type under a public name.
583
+ - **Public does not mean intended-as-API.** Syntax shims, compatibility layers, and macro bundles are public because they must be, not because anyone should read about them. `maybe` and `async` rank badly for exactly this reason; see *Deliberately Undocumented*.
584
+ - **Method-level coverage is not measured.** The `ratio` column is the proxy.
585
+ - **The `ratio` column is meaningless for generated code** — `mediatype` is the clearest case.
328
586
 
329
587
  ---
330
588
 
331
- *Report generated on 2026-02-13. Scan performed by `scan-undocumented.sh`; manual enrichment by AI review of 250 undocumented types across 12 modules and 10 existing reference pages.*
589
+ *Report regenerated 2026-08-26 against `main` at `01fc5099`, using the privacy-aware scanner above. 1,798 public types and 864 internal declarations across 38 modules. Earlier revisions reported 1,828 "public" types; that figure counted privately-enclosed declarations as API.*