Skip to content

Code health: don't flag nested type-erasure bases as single-method interfaces - #82

Merged
dayfine merged 2 commits into
mainfrom
devtools/code-health-nested
Oct 31, 2026
Merged

dayfine merged 2 commits into
mainfrom
devtools/code-health-nested

Conversation

@dayfine

@dayfine dayfine commented Oct 30, 2026

Copy link
Copy Markdown
Owner

Based on main, independent; the diff shows only this change.

The single-method interface check flagged the private Callable base nested inside MoveOnlyFunction (#72), which is type-erasure plumbing, not an interface anyone implements. The check now skips classes nested in another class or in a detail or anonymous namespace, and still applies to top-level and namespace-scope classes. Covered by new cases in the class-shape tests; the full code_health suite passes, and the checker reports 0 failures on #72's branch.

🤖 Generated with Claude Code

https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E

dayfine and others added 2 commits October 30, 2026 00:50
…rface check

A class nested in another class, or in a detail or anonymous namespace, is an
implementation detail such as a type-erasure base, not an interface others
implement. MoveOnlyFunction's private Callable base was flagged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
@dayfine
dayfine marked this pull request as ready for review October 31, 2026 19:19
@dayfine
dayfine merged commit d5b1a30 into main Oct 31, 2026
17 checks passed
@dayfine
dayfine deleted the devtools/code-health-nested branch October 31, 2026 19:21
dayfine added a commit that referenced this pull request Nov 1, 2026
* Code health: skip nested and detail classes in the single-method interface check (#82)

A class nested in another class, or in a detail or anonymous namespace, is an
implementation detail such as a type-erasure base, not an interface others
implement. MoveOnlyFunction's private Callable base was flagged.


Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* Code health: lexical C++ style checks on added lines (#94)

* Code health: skip nested and detail classes in the single-method interface check

A class nested in another class, or in a detail or anonymous namespace, is an
implementation detail such as a type-erasure base, not an interface others
implement. MoveOnlyFunction's private Callable base was flagged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E

* Code health: lexical C++ style checks on added lines

Check the lines a change adds for the upstream bans (std::filesystem,
std::thread, std::mutex, std::async), control-flow brace formatting, and
the Abseil tips adopted in the fork's C++ style notes: mutable globals
(#103), new/delete (#126), std::bind (#108), return std::move(local)
(#120), top-level const by-value header parameters (#109), bool
parameters (#94), header using-directives (#153) and forward
declarations. A comment that describes a neighbouring function is an
advisory.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* code_health: match functions to their base by name, not by signature (#95)

Changing a parameter's type (std::function to MoveOnlyFunction in #90) changed
the function's key, so an existing 133-line constructor was held to the new
limit of 50 instead of its base length. Functions now match on their qualified
name without parameters; messages still show the full signature.


Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>

* Settings: default audio display and collapsed console settings

Two global settings for people who run many programs on one lab machine:
"Default Audio Display" (Audio Pipeline group) is what a program's console
shows for its audio until that console's own setting is saved, so a new
panel no longer opens with the frequency bars; and "Start with console
settings collapsed" folds each program's "Console N Settings" box at
creation, so the video is at the top. Both default to today's behavior.

AudioOption takes its initial display type from the global setting
instead of a fixed FREQ_BARS; a panel's saved value still wins.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
(cherry picked from commit 92d1ed3c6f6fa0468827ab15c51ec3cc71f01d32)

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
dayfine added a commit that referenced this pull request Nov 1, 2026
…104)

* Code health: skip nested and detail classes in the single-method interface check (#82)

A class nested in another class, or in a detail or anonymous namespace, is an
implementation detail such as a type-erasure base, not an interface others
implement. MoveOnlyFunction's private Callable base was flagged.

Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E



* Code health: lexical C++ style checks on added lines (#94)

* Code health: skip nested and detail classes in the single-method interface check

A class nested in another class, or in a detail or anonymous namespace, is an
implementation detail such as a type-erasure base, not an interface others
implement. MoveOnlyFunction's private Callable base was flagged.


Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E

* Code health: lexical C++ style checks on added lines

Check the lines a change adds for the upstream bans (std::filesystem,
std::thread, std::mutex, std::async), control-flow brace formatting, and
the Abseil tips adopted in the fork's C++ style notes: mutable globals
(#103), new/delete (#126), std::bind (#108), return std::move(local)
(#120), top-level const by-value header parameters (#109), bool
parameters (#94), header using-directives (#153) and forward
declarations. A comment that describes a neighbouring function is an
advisory.


Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E

---------



* code_health: match functions to their base by name, not by signature (#95)

Changing a parameter's type (std::function to MoveOnlyFunction in #90) changed
the function's key, so an existing 133-line constructor was held to the new
limit of 50 instead of its base length. Functions now match on their qualified
name without parameters; messages still show the full signature.

Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E



* Settings: default audio display and collapsed console settings

Two global settings for people who run many programs on one lab machine:
"Default Audio Display" (Audio Pipeline group) is what a program's console
shows for its audio until that console's own setting is saved, so a new
panel no longer opens with the frequency bars; and "Start with console
settings collapsed" folds each program's "Console N Settings" box at
creation, so the video is at the top. Both default to today's behavior.

AudioOption takes its initial display type from the global setting
instead of a fixed FREQ_BARS; a panel's saved value still wins.


Claude-Session: https://claude.ai/code/session_01AKYzhrMnPK61XHWEch4a6E
(cherry picked from commit 92d1ed3c6f6fa0468827ab15c51ec3cc71f01d32)

---------


(cherry picked from commit 0e737fb)

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant