Task: Bring ores.utility to the clean standard
Table of Contents
This page documents a task in the Clean ores.utility to the component clean standard story. It captures the goal, current status, acceptance, and any notes or results.
1. Goal
ores.utility passes the Component Clean Standard for a component of kind All.
2. Status
| Field | Value |
|---|---|
| State | DONE |
| Parent story | Clean ores.utility to the component clean standard |
| Now | Merged as `9b2427bfca` in PR #2155. |
| Waiting on | Nothing. |
| Next | Nothing. |
| Last touched | 2026-09-26 |
3. Acceptance
- Every checklist item that applies to a component of kind All passes, with its evidence recorded on the task.
- Every item that does not apply is recorded as not applicable, with the reason.
- Every generator defect found is fixed at its source, with a regression test.
- ores.utility is listed in
COMPONENTS_UNDER_TEST, andcheck_component_drift.py --allpasses.
4. Plan
Work the Component Clean Standard in its section order, one entity at a time, and record each item's result in the table below.
- Baseline and inventory (B01 to B05). Record the baseline before any edit.
- Models (M01 to M10).
- Protocol (P01 to P06).
- Generation (G01 to G06).
- Wiring and data (W01 to W04).
- Shell (S01, S02).
- Structure and hygiene (H01 to H03).
- Verification (V01 to V06), ending with the registry entry.
| Item | Result | Evidence |
|---|---|---|
| B01 | pass | Baseline before any edit, on `feature/clean-utility` at `89cc8d8acd`. Build 0 at 100 percent. `ores.utility.tests` passes at 476 assertions in 141 test cases. `regenerate_cmake_component_files.py –component ores.utility –check` reports 2 stale files, `src/component_files.cmake` and `tests/component_files.cmake`. No catalogue row, so the drift gate cannot name the component. |
| B02 | pass | 0 entity, junction, operation and message models. |
| B03 | pass | 65 production C++ files at the survey, 44 headers and 21 sources, plus 15 files under `tests/`. Six sub-trees had no consumer outside their own test, and eleven umbrella headers had no consumer at all. The component now holds 52 production files, 36 headers and 16 sources, and 15 files under `tests/`, of which 14 are suites and one is `main.cpp`. The eleven namespace documentation headers are counted among the headers; they were restored after the first cut deleted them. Every surviving facet reaches at least one C++ file outside the component: `rfl` 856, `generation` 460, `uuid` 432, `domain` 251, `streaming` 80, `version` 41, `faker` 10, `program_options` 6, `convert` 4, `crypto` 3, `compression` 2, `serialization` 1 and `string` 1. |
| B04 | not applicable | The component serves and sends no NATS subject and has no protocol header. |
| B05 | pass | This story is the only live capture naming the component. |
| M01 to M05, M07 to M09 | not applicable | No org model. |
| M06 | not applicable, with a recorded exception | `domain/protocol.hpp` is a hand-written wire type: 124 lines, reached by 245 C++ files outside the component, and the codegen templates include it, so it cannot become a per-entity model. The exception and its reason are recorded under Recorded exceptions. |
| M10 | fixed | `component_overview.org` claimed the component had no dependency on any other ORE Studio component while `src/CMakeLists.txt` links `ores.platform.lib` `PUBLIC`. It listed `include/ores.utility/datetime/`, which never existed, advertised a geo facet with no code, named Base32 and TOTP, and omitted 8 of the facets. It is rewritten: the dependency is stated, all thirteen facets are listed with their external reach, and `See also` is filled. The `ores.utility.hpp` namespace header repeated the same claims and is corrected in place; the first cut deleted it and the deletion was wrong. |
| P01 to P06 | not applicable | No entity and no protocol. |
| G01 | not applicable | No model, so nothing regenerates from one. |
| G02 | fixed | The six dead or test-only sub-trees are deleted with their tests, and the two `Reflector<>` specialisations for the non-existent `ores::comms::messaging` are deleted. The eleven namespace documentation headers were deleted in the first cut and are restored, because every component keeps them for doxygen; see Review row 18. The CMake lists are regenerated. |
| G03 | fixed | The two `component_files.cmake` files now carry the generated marker. |
| G04 | not applicable | No generated code beyond the two CMake-stamped version templates, which stay. |
| G05 | fixed | The generator defect that reached this component dropped any data member with a brace initialiser, so `hierarchy_flat_row::id` and `hierarchy_node::id` vanished from the refresh. It is fixed at source with three regression cases that fail against the unfixed parser. The wrapped-declaration defect the platform pass fixed also reached here and is gone with the same script. |
| G06 | fixed | The same two files as G03, now current. |
| W01 to W04 | not applicable | No entity, registrar, handler, populate script or SQL script. |
| S01, S02 | not applicable | No entity and no shell unit. |
| H01 | pass | `validate_docs.py` reports only the pre-existing `ores.shell.iam` finding. No leftover artefact, every file and type name snake_case, the CMake lists match the tree, no commented-out code, no stub header left. The rendered diagram was read: every box carries its API, the free-function facets are drawn rather than omitted, and every edge is one the code supports. |
| H02 | fixed | The six sub-trees, the retired reflector specialisations, and the `converter` namespace that did not match its `convert` folder. The eleven namespace headers were removed and restored; see Review row 18. |
| H03 | fixed | The six end-of-line comments moved above their code, and the `Step 1` to `Step 4` narration left `short_code_generator.cpp`. |
| V01 | pass | Whole-tree build 0 at 100 percent. |
| V02 | fixed | `gzip` had no direct test in the component while `ores.nats` and `ores.storage` call it, and `ores.nats` exercised it only indirectly through its own compression suite; it now has 7 cases that call it directly. The live files with no test of their own gained two suites: 13 cases for the generation engine, context, environment and keys, and 4 for the faker datetime helpers. The suite went from 476 assertions in 141 test cases to 614 in 128: three test files holding 38 cases left with the deleted sub-trees, 24 cases arrived, and the tautological determinism case in `tree_builder_tests.cpp` became one that pins the shape for a known seed and one that proves the seed selects the shape. |
| V03, V04 | not applicable | No entity, no SQL and no generated shell command. |
| V05 | pass | Every gate green on the committed head: `regenerate_cmake_component_files.py –component ores.utility –check`, `check_component_drift.py –all`, `validate_docs.py`, `./compass.sh lint`, the codegen suite at 533 tests, and `clang-format –dry-run –Werror` on every changed and added file. |
| V06 | not applicable | No catalogue row and no models, so the component cannot join `COMPONENTS_UNDER_TEST`. Recorded as the programme gap. |
5. Deletions
The six sub-trees were decided as one group rather than file by file, because they share one reason and separate decisions would have produced six inconsistent answers for it. In every case the only consumer was the sub-tree's own test, which is the B06 test-only case.
| Sub-tree | Files | Lines | Why it goes |
|---|---|---|---|
| `serialization/reader` and `writer` | 4 | 475 | No consumer anywhere. The pair marshals the retired binary envelope, and each half is included only by its own `.cpp`. |
| `concurrency/retry_strategy.hpp` | 1 | 132 | No consumer anywhere. |
| `streaming/std_optional.hpp` | 1 | 38 | No consumer anywhere. It also adds an overload to `std`, which the standard allows only narrowly. |
| `faker/totp` | 2 | 72 | Only its own test. TOTP enrolment is recorded as missing work on the account journey, so removing a test-data faker does not block it. |
| `convert/base32_converter` | 2 | 91 | Its only consumer was `faker/totp`, so it falls with it. |
| `string/converter` and `conversion_error` | 3 | 139 | Only its own test. The class wrapped `std::stoi` to throw a custom exception. |
Sixteen files and 1526 lines left with the sub-trees and their tests: 947 lines across the thirteen sub-tree files in the table, and 579 across the three test files that covered them. Eleven namespace documentation headers were deleted as well in the first cut: `ores.utility.hpp` and the ten facet-level files that hold nothing but a `namespace` declaration and a `@brief` comment, 346 lines in total, none of them included anywhere. That was wrong and they are restored. Every component keeps a header for each of its namespaces; its content is the `@brief` doxygen renders, and the diagram conventions read the outermost one when they label the component, so a consumer census does not apply to it. `ores.utility.hpp` carried four claims the tree does not support, and two facet files advertised functions that do not exist, and those claims are corrected in place rather than removed with the file. See Review row 18 and G08 of the standard, which PR #2162 adds; this branch's base predates it.
One file with the same shape stays. serialization/error_code.hpp is
hand-written wire material, but `ores.iam.core` includes it, so it is
live and its disposition is recorded below rather than deleted.
6. Recorded exceptions
Two hand-written artefacts stay, for different reasons.
- M06, `domain/protocol.hpp`. The component's wire envelope is hand-written: 124 lines, reached by 245 C++ files outside the component, and the codegen templates include it, so a per-entity model cannot carry it. The standard's M06 asks for every wire type to be modelled and no hand-written protocol header to remain; this file is the recorded exception, and the template dependency is the reason.
serialization/error_code.hpp, misplaced. It enumerates the retired binary protocol's failures and carries signup and authentication codes that belong to `ores.iam`. Its only remaining consumer is `ores.iam.core/service/signup_service.hpp`, so it cannot be deleted, and it does not belong in a foundation library. Recorded for separate work.
Three further findings are recorded rather than fixed here, because each belongs to another component.
- `string/short_code_generator` is counterparty-name logic that belongs to `ores.synthetic` or `ores.refdata`.
- `program_options/shared_domain_registry` is process-global mutable state in a foundation library.
- `ores.platform::time::datetime::to_iso8601_utc` emits a space separator, so the name and the platform overview overstate the format. Captured as `doc/agile/product_backlog/inbox/to_iso8601_utc_emits_a_space_separator.org`.
7. Work items
Twelve items were planned. Each one is recorded here with its outcome.
| Item | Outcome |
|---|---|
| 1. Decide the six sub-trees as a group | done. All six deleted, with their tests, on the B06 test-only rule. Recorded above. |
| 2. Delete the `ores::comms::messaging` reflector specialisations | done. Both go, with the forward declarations that existed only for them. `ores.comms` does not exist. |
| 3. Deal with the eleven umbrella headers | the first cut deleted all eleven, and that was wrong. They are namespace documentation headers, which every component keeps, so they are restored with their claims corrected in place and the facet inventory lives on both the headers and the rewritten component overview. See Review row 18. |
| 4. Rewrite `component_overview.org` | done, including the false dependency claim, the non-existent `datetime/` facet, the geo facet with no code, and all thirteen facets. |
| 5. Fix the same claims in `ores.utility.hpp` | done by deletion. The file was a stub with no consumer. |
| 6. Test the live untested files | done. `gzip` had no direct test in the component and now has 7 cases; `ores.nats` covered it indirectly before this pass. Two new suites cover the generation facet and the faker datetime helpers. |
| 7. Strengthen the tautological assertions | done. The TOTP test left with `faker/totp`. `tree_builder_tests.cpp` compared two production runs to each other; that case is replaced by one that pins the tree shape for a known seed and one that proves the seed selects the shape. |
| 8. Regenerate the diagram through both passes | done. The automated pass was refreshed only after its defect was fixed, and the manual pass fills every method-only box and draws the free-function facets the parser cannot see. The render was read. |
| 9. Move the end-of-line comments and drop the `Step` narration | done. Six comments moved above their code, and the `Step 1` to `Step 4` comments are gone from `short_code_generator.cpp`. |
| 10. Reconcile the `converter` namespace with its folder | done. The namespace is now `ores::utility::convert`, matching the facet folder, and the four call sites outside the component are updated. |
| 11. Record the `domain/protocol.hpp` M06 exception | done, above. |
| 12. Record the misplaced concerns | done, above. Three findings, one of them captured in the backlog. |
One defect surfaced during the work and is recorded on the Review table: a third `generate_component_puml.py` defect dropped any data member with a brace initialiser, which the utility refresh exposed. It is fixed at source with a regression test.
8. Notes
Survey, 2026-09-25, at trunk `5de59e3fb8`, by an agent that did not write the component.
- Scale. 65 production C++ files in 44 headers and 21 sources, with 15 files under `tests/`. 141 test cases, 476 assertions, and 1814 files outside the component include it. The real foundation is `rfl` at 876 files, `generation` at 464, `uuid` at 453, `domain` at 262, `streaming` at 80 and `version` at 45. Everything from `program_options` down is thin, and everything from `convert` down is single-consumer or dead.
- Suites pass. `ores.utility.tests` runs green, 476 assertions in 141 test cases.
- Keep the component. The dead sub-trees are a minority. The foundation facets carry the repo.
Re-measured on `feature/clean-utility`, 2026-09-26. The survey's scale and per-facet figures were taken before any edit and against the pre-deletion header set. Where they differ from the Plan table, the Plan table is the figure that describes the tree now.
Rebased onto `origin/main` at `2e01f15e5e` on 2026-09-26, because PR #2155 reported a conflict. The only conflicting file was the generated `doc/agile/product_backlog/inbox.org` table, which main had also added captures to; it was resolved by regenerating the index from the capture files rather than by merging rows by hand. Eight of the nine commit patch-ids are unchanged by the rebase. The ninth is `[agile] Record the ores.utility clean-up`, whose patch-id moved from `93857360ae` to `f479f24f16`, because the regenerated table it commits now carries the captures main added. The branch was force-pushed with `–force-with-lease` as the conflict was the only remedy.
Rebased a second time onto `origin/main` at `f1ff373d30` on 2026-09-26, the orgmode clean-up's nine commits, for the same reason. The only conflicting file was `doc/agile/versions/v0/sprint_26/sprint.org`: main had marked the orgmode row DONE while this branch marks the utility row STARTED, and both rows are kept. Fourteen of the fifteen commit patch-ids are unchanged. The ninth, `[agile] Record the ores.utility clean-up`, moved from `f479f24f16` to `536c68a906`, because the resolved table it commits now carries main's orgmode row. Force-pushed with `–force-with-lease` again.
The six sub-trees, with their external callers.
| Sub-tree | Files | Callers outside its own test |
|---|---|---|
| `serialization/reader` and `writer` | 4 | none anywhere |
| `concurrency/retry_strategy.hpp` | 1 | none anywhere |
| `streaming/std_optional.hpp` | 1 | none anywhere |
| `faker/totp` | 3 | none anywhere |
| `convert/base32_converter` | 3 | none external. One internal caller, which is itself test-only |
| `string/converter` with `conversion_error` | 4 | none anywhere |
Work items, in the order they land.
- Decide the six sub-trees as a group. For each, either name the intended consumer in the overview or delete it with its test. Deciding file by file will produce six inconsistent answers.
- Delete the two `ores::comms::messaging` reflector specialisations, since the subsystem they marshal no longer exists.
- Delete the eleven umbrella headers with no consumer, or keep `ores.utility.hpp` alone and rewrite it. Two pairs are duplicates, and two advertise functions that do not exist. The survey's premise was wrong: these are the component's namespace documentation headers, which every component keeps, so the answer is to keep all eleven and correct their claims. See Review row 18.
- Rewrite `component_overview.org`. Fix the dependency claim, drop `datetime/` and geo, list every facet, fill `See also`, and bump `#+updated`.
- Fix the same false claims in `ores.utility.hpp`.
- Add tests for the live untested files, starting with `gzip`, which is on the wire and had no direct test in the component. The survey's "no test anywhere" was wrong: `ores.nats` covers it indirectly through its own compression suite.
- Strengthen the tautological assertions, starting with the TOTP test, which checks only length and alphabet, and `tree_builder_tests.cpp`, which compares two production runs to each other.
- Regenerate the diagram through both passes, after the generator defect is fixed. Six namespaces are missing, and the hand-authored section below the sentinel is empty.
- Move the six end-of-line comments above their code, and drop the `Step` narration.
- Rename the `converter` namespace to `convert`, or the folder to `converter`, and fix the call sites.
- Record the load-bearing exception for `domain/protocol.hpp`. It is a 245-C++-file wire envelope in a foundation library and the codegen templates depend on it, so it cannot be generated per entity. It needs an M06 exception with that reason, not a move.
- Record the misplaced concerns for separate work. `serialization/error_code.hpp` speaks the retired binary protocol and belongs to messaging. `string/short_code_generator` is counterparty-name logic that belongs to `ores.synthetic` or `ores.refdata`. `program_options/shared_domain_registry` is process-global mutable state in a foundation library.
9. Test Scenarios
Manual QA scenarios (scaffolded via compass add test_scenario)
that verify this task. Link
new ones here as they're created; the scenario doc itself links back
via its "Verifies task" field.
| Scenario | State | Notes |
|---|---|---|
10. PRs
11. Review
| # | Comment summary | File | Decision | Notes |
|---|---|---|---|---|
| 1 | The refreshed utility diagram lost the `id` member of `hierarchy_flat_row` and `hierarchy_node`, which the source declares as `boost::uuids::uuid id{};` | build/scripts/generate_component_puml.py | fixed | Found by reading the refresh rather than trusting it. A third defect in the parser: the field pattern accepted an `= value` initialiser but not a brace initialiser, and the brace bookkeeping consumed the line before the field reader saw it. Both halves are fixed, and three regression cases fail against the unfixed parser. |
| 2 | `to_iso8601_utc` emits `YYYY-MM-DD HH:MM:SSZ`, so the name and the platform overview overstate the format as ISO 8601, which requires a `T` | projects/ores.platform/src/time/datetime.cpp | recorded, not fixed | Found while writing the faker datetime test: the assertion had to be written with a space. The pair `to_iso8601_utc` and `from_iso8601_utc` is self-consistent, and changing the separator moves the stored and transmitted shape, so it needs a compatibility decision rather than a quiet edit here. Captured in the backlog. |
| 3 | The generator fix makes seven other components' `.puml` files stale, because their headers carry brace-initialised members | projects/ores.database, ores.diff, ores.nats, ores.orgmode, ores.security, ores.service, ores.testing | recorded, not fixed | The fix has to land with the component that found it. Each of those components owns a clean-up pass, several of them in flight in other worktrees, so the refresh belongs to those passes rather than to this PR. |
| 4 | The bookkeeping commit that `compass pr create` made carries `Story-ID:` and `Task-ID:`, but no `Environment:` and no `Co-Authored-By:` trailer | commit 59f5fa77ae | recorded, not fixed | The same tooling gap the platform task recorded, narrower than it was there: the tool now emits the two ID trailers and still omits the other two. The commit is pushed, so the gap is recorded rather than rewritten. |
| 5 | The facet census omitted `version` and misstated `rfl`, and the component overview then said every other facet "reaches fewer than a dozen files" and "four of them reach fewer than five" | task_clean_utility.org, component_overview.org | fixed | Found by the independent verifier, which re-measured every figure. `rfl` is 856 rather than 857, `version` has 41 external includers and was missing from the list, and five facets reach fewer than five, not four. Every count in the census and the overview is now stated with its metric, C++ files outside the component. |
| 6 | `domain/protocol.hpp` was recorded as reaching 255 files, and the story said 253 | task_clean_utility.org, story.org, component_overview.org, ores.utility.puml | fixed | Measured: 245 C++ files outside the component. The same figure now appears in all four places, with its metric named. |
| 7 | The component was described as having fourteen facets | task_clean_utility.org | fixed | Thirteen facet directories exist. The survey's fourteen counted `concurrency`, which this pass deletes, so the number referred to a tree that no longer exists. |
| 8 | The deletions section said thirteen files and 1526 lines left with the sub-trees and their tests | task_clean_utility.org | fixed | The table's thirteen sub-tree files are 947 lines; the sixteen files with their three tests are 1526. Both partitions are now stated. |
| 9 | The file count said fourteen test files while the survey counted fifteen files under `tests/` | task_clean_utility.org | fixed | Both frames are right: fourteen suites plus `main.cpp`. The row now says so. |
| 10 | "gzip had zero coverage anywhere in the repo", and the Result called the new cases the first test gzip has had anywhere | task_clean_utility.org, story.org, commit 8a0701b908, PR #2155 body | corrected, with one message left standing | The verifier found `projects/ores.nats/tests/domain_compression_tests.cpp`, eight cases present before this branch, which drives `ores.nats`'s compression wrapper and so exercises `gzip_compress` and `gzip_decompress` indirectly. The task, the story and the PR body now claim only that there was no direct test in the component. The pushed commit message repeats the old claim and stands, like the two platform messages before it. It is `ed8e2ac27d` before the rebase and `8a0701b908` after, with a byte-identical message. |
| 11 | The deletions table said the reader and writer "each half includes only the other" | task_clean_utility.org | fixed | Neither includes the other; each is included only by its own `.cpp`. |
| 12 | Three documents still named artefacts this branch deletes: the retry-strategy backoff capture, the geo task's stale-claim list, and a closed sprint 24 task | product_backlog/next/root_cause_wt_service_glibc_crash.org, clean-geo/task_clean_geo.org, sprint_24 task_generalise_account_images.org | two fixed, one left as history | The two live documents are corrected and now say what was deleted and what replaced it. The sprint 24 task is closed and its sentence describes the tree as it was then, so it is left as written. |
| 13 | The diagram drew a box named `streaming::parsers`, which is not a file in the component | projects/ores.utility/modeling/ores.utility.puml | fixed | It becomes two boxes named for the files that hold the specialisations, `streaming::uuid_parser` and `streaming::tenant_id_parser`, and each note now says it stands for the `rfl::Parser` specialisation in that file rather than for a type. The render was read again. |
| 14 | The corrections for rows 5 to 9 were applied everywhere except two places inside this task: the Result still said `rfl` reaches 857, and the work-items row still said "all fourteen facets" | task_clean_utility.org | fixed | Found by the verifier's confirmation round, which re-read the task rather than trusting the previous round's summary. Both now carry the measured figure. The lesson is the one the platform task recorded: after correcting a figure, grep for every occurrence rather than fixing the ones you remember. |
| 15 | The commit count in the Result was six `[utility]` commits, and the correction commit for rows 5 to 13 is itself tagged `[utility]`, making seven | task_clean_utility.org | fixed | The Result now says seven and names what the seventh is. It is the same defect that was caught when the count was eight, and it recurs for the same reason: the count depends on how the correcting commit is tagged, so the sentence now says which commit is which instead of leaving the reader to count. |
| 16 | The replacement sentence in the retry-strategy capture named `process_supervisor.cpp`, which exists nowhere in the repository, and the capture's other reference named a controller populate script that is also gone | doc/agile/product_backlog/next/root_cause_wt_service_glibc_crash.org | fixed by retiring the capture | The controller binary and `projects/ores.controller/` were removed in sprint 24 (PR #1806), which the sprint 25 investigation confirmed, and `ores.wt.service` was removed with the `ores.qt` tree in sprint 25, by PR #2106 and its task `retire_qt_and_emit_ui_metadata_to_typescript/task_remove-qt-and-wt.org`. The capture is superseded rather than repairable, so it moves to the discarded bucket with both removals recorded and the glibc `RLIMIT_RTPRIO` finding kept, because that part is about the environment and not about Wt. The first cut of this row credited the sprint 26 Qt pass with the removal; the verifier checked the commit history and it was sprint 25. |
| 17 | The task and the story had an empty `#+environment:` while every generated commit carries `Environment: merry_newton` | task_clean_utility.org, story.org | fixed | Both now carry `merry_newton`, matching the traceability the commits assert. The verifier notes that the sibling clean tasks are split on this, so it looks like a programme habit rather than a defect of this component. |
| 18 | The cleanup deleted the component's namespace documentation headers, eleven of them, on the reading that a header nothing includes is a dead header | projects/ores.utility/include/ores.utility/ores.utility.hpp and the ten facet-level headers | fixed by restoring them | Raised by the maintainer: every component keeps a header for each of its namespaces, its content is the `@brief` doxygen renders, and the diagram conventions read the outermost one when they label the component, so a consumer census does not apply. G02 said dead headers go and did not exempt these, so G08 states the rule; G08 lands in PR #2162, which this branch's base predates. The eleven files are restored with their claims corrected in place, their line count returns to the component, and the geo task's instruction that names `ores.utility.hpp` is reinstated. |
12. Result
ores.utility meets the standard for the items that apply to a model-free component. Twelve work items landed across seven `[utility]` commits: the six that carry the work, and the seventh carrying the corrections from the first verification round.
The component lost 16 files and 1526 lines: six sub-trees whose only consumer was their own test. (The first cut also deleted eleven namespace documentation headers and counted 27 files and 1872 lines; those are restored, because every component keeps them for doxygen. See Review row 18.) It gained a component overview that describes what is actually there, a rendered diagram whose boxes carry their APIs, and 24 test cases, of which 7 are the first direct tests `gzip` has had in the component. Its test suite went from 476 assertions in 141 test cases to 614 in 128, with the tautological determinism case replaced by two that assert something. One generator defect is fixed at its source.
The component keeps its place as the foundation library. Every facet that survives reaches at least one C++ file outside the component, and the facet with the widest reach, `rfl`, reaches 856 of them.
Three items stay out of scope. The M06 exception for `domain/protocol.hpp` is recorded with its reason. Three misplaced concerns are recorded for separate work, one of them captured in the backlog. Seven other components' diagrams are stale against the fixed generator and belong to their own passes.
13. Verification
An independent verifier worked the branch in four rounds and posted a verdict each time: PASS+NOTES, PASS+NOTES, PASS+NOTES, then PASS on `3d1a31520f`. No code defect was found in any round; every finding was a documentation figure or a stale reference, and all of them are in the Review table above with their disposition. The verifier also proved the load-bearing claims rather than accepting them: each half of the generator fix fails the regression cases when reverted, seven mutated production paths all fail the suite, and re-adding the old tree-builder case under a mutation showed it passing while the pinned case failed.
The branch was rebased twice because main moved under it, and both rebases are recorded in the Notes with their patch-ids. PR #2155 merged as `9b2427bfca` on 2026-09-26, with every CI check green on the final head.