@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.
- package/adr/2026-07-18-data-migration.md +123 -0
- package/guides/async-getting-started.md +687 -0
- package/guides/compile-time-resource-safety-with-scope.md +6 -0
- package/guides/getting-started-with-mux.md +0 -112
- package/guides/query-dsl-extending.md +1 -1
- package/guides/query-dsl-fluent-builder.md +1 -1
- package/guides/query-dsl-reified-optics.md +1 -1
- package/guides/query-dsl-sql.md +395 -1
- package/guides/sql-checked-interpolation.md +173 -0
- package/guides/sql-transactions.md +286 -0
- package/guides/telemetry-guide.md +131 -70
- package/guides/zio-schema-migration.md +6 -6
- package/index.md +200 -559
- package/package.json +1 -1
- package/reference/async.md +1379 -531
- package/reference/chunk.md +3 -3
- package/reference/codegen/index.md +1 -1
- package/reference/combinators.md +4 -4
- package/reference/config/config-decoder.md +460 -0
- package/reference/config/config-source.md +489 -0
- package/reference/config/errors.md +278 -0
- package/reference/config/flags.md +369 -0
- package/reference/config/formats.md +314 -0
- package/reference/config/index.md +304 -0
- package/reference/config/rollout.md +336 -0
- package/reference/context.md +6 -49
- package/reference/data-migration.md +269 -0
- package/reference/datastar/attributes.md +302 -0
- package/reference/datastar/events.md +234 -0
- package/reference/datastar/index.md +256 -0
- package/reference/datastar/signals.md +230 -0
- package/reference/datastar/sse.md +295 -0
- package/reference/datastar.md +2 -2
- package/reference/docs.md +2 -2
- package/reference/endpoint/bulk-creation.md +96 -0
- package/reference/endpoint/endpoint.md +1 -0
- package/reference/endpoint/index.md +9 -89
- package/reference/endpoint/path-codec.md +12 -24
- package/reference/endpoint/route-pattern.md +4 -6
- package/reference/endpoint/segment-codec.md +19 -32
- package/reference/html.md +313 -9
- package/reference/htmx/index.md +4 -52
- package/reference/htmx/response-headers.md +240 -0
- package/reference/http-model/headers.md +735 -0
- package/reference/http-model/index.md +3 -1
- package/reference/http-model/model.md +107 -71
- package/reference/http-model/schema-codecs.md +522 -0
- package/reference/http-model/schema.md +6 -3
- package/reference/http-model/server-sent-event.md +341 -0
- package/reference/jwt.md +195 -0
- package/reference/maybe.md +128 -11
- package/reference/media-type.md +2 -2
- package/reference/mux.mdx +7 -2
- package/reference/openapi.md +3 -3
- package/reference/projection.md +654 -0
- package/reference/resource-management/index.md +1 -1
- package/reference/resource-management/resource.md +2 -98
- package/reference/resource-management/scope.md +1 -209
- package/reference/resource-management/wire.md +4 -50
- package/reference/ringbuffer/advanced.mdx +1 -1
- package/reference/ringbuffer/index.mdx +3 -3
- package/reference/ringbuffer/mpmc.mdx +38 -4
- package/reference/ringbuffer/mpsc.mdx +36 -4
- package/reference/ringbuffer/spmc.mdx +1 -1
- package/reference/ringbuffer/spsc.mdx +87 -15
- package/reference/schema/allows.md +0 -96
- package/reference/schema/binding.md +2 -2
- package/reference/schema/built-in-codecs/avro.md +2 -2
- package/reference/schema/built-in-codecs/bson.md +50 -20
- package/reference/schema/built-in-codecs/csv.md +2 -2
- package/reference/schema/built-in-codecs/index.md +3 -3
- package/reference/schema/built-in-codecs/json/index.md +2 -2
- package/reference/schema/built-in-codecs/json/json.md +1 -0
- package/reference/schema/built-in-codecs/messagepack.md +3 -3
- package/reference/schema/built-in-codecs/thrift.md +2 -2
- package/reference/schema/built-in-codecs/toon.md +3 -3
- package/reference/schema/built-in-codecs/yaml.md +2 -2
- package/reference/schema/codec.md +11 -11
- package/reference/schema/dynamic-optic.md +48 -3
- package/reference/schema/dynamic-schema.md +3 -3
- package/reference/schema/index.md +2 -0
- package/reference/schema/path-interpolator.md +2 -0
- package/reference/schema/reflect-transformer.md +140 -0
- package/reference/schema/schema-evolution/as.md +4 -4
- package/reference/schema/schema-evolution/into.md +2 -2
- package/reference/schema/schema-expr.md +2 -2
- package/reference/schema/schema-search.md +263 -0
- package/reference/schema/schema.md +10 -2
- package/reference/schema/type-class-derivation.md +1 -1
- package/reference/smithy.md +502 -3
- package/reference/sql/db-codec-deriver.md +3 -3
- package/reference/sql/db-codec.md +22 -22
- package/reference/sql/db-con.md +4 -4
- package/reference/sql/db-connection.md +1 -1
- package/reference/sql/db-param.md +1 -1
- package/reference/sql/db-result-reader.md +4 -2
- package/reference/sql/db-tx.md +46 -14
- package/reference/sql/ddl.md +1 -1
- package/reference/sql/frag.md +44 -10
- package/reference/sql/index.md +7 -7
- package/reference/sql/repo.md +15 -15
- package/reference/sql/sql-dialect.md +1 -1
- package/reference/sql/sql-logger.md +1 -1
- package/reference/sql/sql-name-mapper.md +3 -3
- package/reference/sql/table-metadata.md +3 -3
- package/reference/sql/table.md +10 -10
- package/reference/sql/transactor-zio.md +1 -1
- package/reference/sql/transactor.md +21 -11
- package/reference/sql-zio.md +2 -2
- package/reference/streams/core/index.md +32 -0
- package/reference/streams/{pipeline.md → core/pipeline.md} +210 -74
- package/reference/streams/{sink.md → core/sink.md} +331 -353
- package/reference/streams/{stream.md → core/stream.md} +919 -209
- package/reference/streams/execution-and-compatibility/async-execution.md +822 -0
- package/reference/streams/execution-and-compatibility/index.md +35 -0
- package/reference/streams/execution-and-compatibility/platform-differences.md +297 -0
- package/reference/streams/execution-and-compatibility/scala-2-compatibility.md +88 -0
- package/reference/streams/execution-and-compatibility/zero-boxing.md +393 -0
- package/reference/streams/index.md +140 -67
- package/reference/streams/primitives/index.md +30 -0
- package/reference/streams/primitives/reader.md +1992 -0
- package/reference/streams/{writer.md → primitives/writer.md} +254 -98
- package/reference/telemetry/common/any-value.md +90 -0
- package/reference/telemetry/common/attribute-key.md +87 -0
- package/reference/telemetry/common/attributes.md +118 -0
- package/reference/telemetry/common/index.md +39 -0
- package/reference/telemetry/common/instrumentation-scope.md +24 -0
- package/reference/telemetry/common/resource.md +34 -0
- package/reference/telemetry/index.md +311 -0
- package/reference/telemetry/logging/index.md +197 -0
- package/reference/telemetry/logging/log-enrichment.md +72 -0
- package/reference/telemetry/logging/log-formatter.md +100 -0
- package/reference/telemetry/logging/log-record-processor.md +56 -0
- package/reference/telemetry/logging/log-record.md +44 -0
- package/reference/telemetry/logging/log-writer.md +64 -0
- package/reference/telemetry/logging/logger-provider.md +142 -0
- package/reference/telemetry/logging/logger.md +83 -0
- package/reference/telemetry/logging/severity.md +62 -0
- package/reference/telemetry/metrics/index.md +150 -0
- package/reference/telemetry/metrics/instruments.md +183 -0
- package/reference/telemetry/metrics/labeled-instruments.md +74 -0
- package/reference/telemetry/metrics/meter-provider.md +76 -0
- package/reference/telemetry/metrics/meter.md +98 -0
- package/reference/telemetry/metrics/metric-data.md +57 -0
- package/reference/telemetry/otel/custom-exporter.md +216 -0
- package/reference/telemetry/otel/index.md +212 -0
- package/reference/telemetry/tracing/index.md +155 -0
- package/reference/telemetry/tracing/sampler.md +89 -0
- package/reference/telemetry/tracing/span-builder.md +57 -0
- package/reference/telemetry/tracing/span-context.md +39 -0
- package/reference/telemetry/tracing/span-data.md +32 -0
- package/reference/telemetry/tracing/span-kind.md +55 -0
- package/reference/telemetry/tracing/span-processor.md +53 -0
- package/reference/telemetry/tracing/span-status.md +47 -0
- package/reference/telemetry/tracing/span.md +117 -0
- package/reference/telemetry/tracing/tracer-provider.md +91 -0
- package/reference/telemetry/tracing/tracer.md +52 -0
- package/reference/typeid.md +0 -64
- package/sidebars.js +365 -185
- package/undocumented-report.md +528 -270
- package/reference/config.md +0 -158
- package/reference/streams/concurrent-operators.md +0 -106
- package/reference/streams/reader.md +0 -1284
- package/reference/streams/scala-2-compatibility.md +0 -55
- package/reference/streams/zero-boxing.md +0 -275
- package/reference/telemetry.md +0 -693
package/undocumented-report.md
CHANGED
|
@@ -3,329 +3,587 @@ id: undocumented-report
|
|
|
3
3
|
title: "Documentation Coverage Report"
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
|
|
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
|
-
|
|
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
|
-
|
|
|
15
|
-
|
|
|
16
|
-
|
|
|
17
|
-
|
|
|
18
|
-
|
|
|
19
|
-
|
|
|
20
|
-
|
|
|
21
|
-
|
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
##
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
**
|
|
49
|
-
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
-
|
|
68
|
-
|
|
69
|
-
-
|
|
70
|
-
|
|
71
|
-
**
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
**
|
|
76
|
-
-
|
|
77
|
-
-
|
|
78
|
-
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
-
|
|
83
|
-
-
|
|
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
|
-
##
|
|
100
|
+
## Critical Gaps
|
|
88
101
|
|
|
89
|
-
|
|
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
|
-
**
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
133
|
+
### 2. `http-model` — RESOLVED
|
|
205
134
|
|
|
206
|
-
|
|
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
|
-
|
|
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
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
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
|
-
##
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
398
|
+
## Prioritized Action List
|
|
274
399
|
|
|
275
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
427
|
+
**Tier 2 — sections in existing pages**
|
|
301
428
|
|
|
302
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
311
|
-
25. - [ ] Add **ChunkIterator** mention to `chunk.md` — *update existing*
|
|
452
|
+
**Tier 4 — conceptual documents**
|
|
312
453
|
|
|
313
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
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
|
|
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.*
|