diff --git a/CLAUDE.md b/CLAUDE.md
index c2e7ee95..b5c4c916 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -553,11 +553,16 @@ default). Mixing a declaring class with a non-declaring one is an error, where t
among a method's parameters is fine. `detail::class_list_registry` decides; `unanimous_registry`
is the strict fold, deliberately *not* `agreed_registry`.
-One thing deliberately does **not** participate, and is documented as such: the `any` and
-`type_erasure` interop headers are untouched, and `virtual_any&` contributes no affinity, so
-a method over one behaves exactly as before. The C++26 `register_classes` also still defaults to
-the macro - its groups may name a namespace, whose classes are only known during the scan that the
-choice of registry feeds.
+Two things deliberately do **not** participate, and both are documented as such:
+
+- The `any` and `type_erasure` interop headers declare no affinity. `virtual_any&`
+ contributes none, so a method over one behaves exactly as before. They are not untouched,
+ though: #116 gave their `validate_method_parameter` specializations the registry parameter
+ `virtual_` gained in #113, so a parameter may still *spell* a registry
+ (`virtual_`) - a different thing from declaring an affinity, and the
+ reason a specialization there must never go back to the bare `virtual_` spelling.
+- The C++26 `register_classes` still defaults to the macro - its groups may name a namespace,
+ whose classes are only known during the scan that the choice of registry feeds.
**A test that selects a registry through an affinity needs no PCH marker.** The scan below exists
because `BOOST_OPENMETHOD_DEFAULT_REGISTRY` must be defined before `core.hpp` is parsed, and a
@@ -567,9 +572,9 @@ headers, so those tests can share the PCH - do not add a fourth marker for them.
`test/CMakeLists.txt` withholds the shared PCH from any `test_*.cpp` that overrides the
registry - a force-included PCH would still precede the `#define`. It detects them by scanning
for the token `BOOST_OPENMETHOD_DEFAULT_REGISTRY` **or** for an include of a header that
-carries the override on the file's behalf (`test_capture_errors.hpp`). Add another such header
-and the scan has to learn about it: miss one and the file still compiles, binds to
-`default_registry`, and fails at run time.
+carries the override on the file's behalf (`test_capture_errors.hpp` and
+`test_checked_registry.hpp`). Add another such header and the scan has to learn about it: miss
+one and the file still compiles, binds to `default_registry`, and fails at run time.
### Flattened headers for Compiler Explorer
@@ -668,6 +673,30 @@ For examples:
4. For changes affecting examples: enable `BOOST_OPENMETHOD_BUILD_EXAMPLES`
5. Submit PRs against the `develop` branch
+### Never commit build output, and ask before committing anything large
+
+Stage named paths. `git add ` and `git add -A` are not used here: b2's object trees (`bin/`
+at the root and under `config/`, `test/`, `test/dynamic_loading/` and each
+`test/implicit_shared_libraries/` variant) and CMake's `build/` sit in the working tree, and one
+careless `git add test` commits them. **Ask before committing any build artefact, and before
+committing any file over 1MB**, whatever its kind.
+
+`.gitignore` is not a safety net. It has no effect on a path that is already tracked, and a branch
+cut before an ignore rule landed does not carry it - which is how #103 merged 415 files of b2
+output, 613 MiB expanded and 94 MiB in the pack on a repository of about 3 MB, days after #108
+added the `bin/` rule meant to prevent exactly that.
+
+On a Boost library the mistake is permanent, and rewriting `develop` is not a remedy:
+
+- The superproject pins `libs/openmethod` by SHA, and its bot bumps that pin within minutes of
+ every merge, so a rewrite orphans the commits `boostorg/boost` already points at -
+ `git submodule update` then fails at those commits for good.
+- The blobs stay reachable through `refs/pull//head`, which a maintainer cannot delete, and
+ forks share object storage. Removing them for real is a GitHub Support matter.
+
+So the only cheap fix is `git rm -r --cached` (#117), which cleans the tree and leaves the objects
+in the pack forever. Not committing them is the whole defence.
+
### Posting in public on the maintainer's behalf
Anything published under the maintainer's account - a GitHub issue or comment, a PR body, a