Skip to content

feature: add refused bequest smell detection - #72

Merged
alxxjohn merged 1 commit into
mainfrom
feature/change-quality-semantic-precision
Jul 27, 2026
Merged

feature: add refused bequest smell detection#72
alxxjohn merged 1 commit into
mainfrom
feature/change-quality-semantic-precision

Conversation

@alxxjohn

Copy link
Copy Markdown
Contributor

Summary

This follow-up branch lands the deferred smell.refused-bequest rule and pushes CodeGuard further toward change-quality review: not just “is this line bad?”, but “does this design shape make future changes harder, less safe, or harder to isolate?”

The rule is deliberately conservative. It only emits when CodeGuard can see both inheritance/embedding evidence and multiple inherited-style methods being explicitly refused through no-op, unsupported, not-implemented, panic/throw/raise patterns.

What changed

Added smell.refused-bequest

  • Adds a new structural smell rule:
    • smell.refused-bequest
  • Detects derived/embedded types that inherit a contract but refuse multiple inherited-style methods.
  • Supports Go, Python, TypeScript, JavaScript, and C++ through the existing structural smell model.
  • Keeps the rule high-confidence by requiring:
    • visible base/embedded type evidence
    • at least two refused methods
    • explicit unsupported/no-op behavior

Added change-quality evidence metadata

Findings now include machine-readable evidence so reports can explain why the design shape is risky:

  • bases
  • refused_methods
  • refused_count
  • change_signal=inheritance-contract-friction

This makes the rule useful as PR-quality evidence, not just a lint warning.

Improved structural smell organization

  • Split refused-bequest logic into quality_smells_refused_bequest.go.
  • Kept quality_smells.go under CodeGuard’s own file/declaration dogfood limits.
  • Reused existing structural parsing/modeling where possible.

Metadata, docs, and fix guidance

  • Added rule catalog metadata for smell.refused-bequest.
  • Added guided fix template recommending:
    • composition over inheritance where behavior is refused
    • smaller interfaces/classes
    • capability-specific contracts
  • Updated docs/checks.md and docs/features.md to list the shipped rule and frame structural smells as change-quality evidence.
  • Updated SDK metadata tests to include the new structural smell rule.

Validation

Ran:

go test ./tests/checks -run 'TestQualityStructuralSmells|TestQualitySmell|TestSmell' -count=1
go test ./tests/cli -run 'TestSDKRuleMetadataForStructuralSmellRules|TestSDKRuleMetadataFixTemplatesPopulated' -count=1
go test ./tests/checks ./tests/cli ./internal/codeguard/rules -count=1
make codeguard-ci
git diff --cached --check

Final CodeGuard dogfood:

  • Code Quality: pass
  • Performance: pass
  • Design Patterns: pass
  • CI/CD: pass
  • Supply Chain: pass
  • Agent Context: pass

Notes

  • This is still deterministic/static analysis, not a semantic proof.
  • The detector intentionally prefers lower recall over noisy findings.
  • Deeper future precision would benefit from richer type information, CFG/state-machine modeling, and stronger parser support.

@alxxjohn
alxxjohn merged commit 4423aa4 into main Jul 27, 2026
16 checks passed
alxxjohn added a commit that referenced this pull request Jul 27, 2026
🤖 I have created a release *beep* *boop*
---


##
[1.3.0](v1.2.2...v1.3.0)
(2026-07-27)


### Features

* add abstraction quality checks
([fc5a7ec](fc5a7ec))
* add change safety diff detectors
([ebc2f80](ebc2f80))
* add change safety PR summary metrics
([5b10ecd](5b10ecd))
* add delivery governance checks
([eb1b803](eb1b803))
* add local quality precision rules
([dd75b79](dd75b79))
* add local quality precision rules
([00c493e](00c493e))
* add observability and operations checks
([3e8713c](3e8713c))
* add operability, design, and delivery governance checks
([#70](#70))
([a52199a](a52199a))
* add opt-in recommended check defaults
([1680b21](1680b21))
* add opt-in recommended check defaults
([#66](#66))
([67510e3](67510e3))
* add production readiness rule families
([d58e8eb](d58e8eb))
* Add production reliability and data-readiness checks across languages
([#67](#67))
([c243ead](c243ead))
* add refused bequest smell detection
([053cb1a](053cb1a))
* add refused bequest smell detection
([#72](#72))
([4423aa4](4423aa4))
* add structural smell quality rules
([eefd8bd](eefd8bd))
* change safety testability refactors
([#69](#69))
([9081ad3](9081ad3))
* deepen code smell and maintainability precision checks
([#71](#71))
([d554347](d554347))
* deepen reliability parity checks
([fc8d769](fc8d769))
* expand production readiness language coverage
([588bf19](588bf19))
* scaffold change safety checks
([0b313d9](0b313d9))


### Bug Fixes

* dogfood production readiness coverage
([1110f4f](1110f4f))
* restore change testability detectors
([88f6df0](88f6df0))
* satisfy strict lint for change safety
([311716c](311716c))
* satisfy strict lint for operability governance
([abc9fd1](abc9fd1))

---
This PR was generated with [Release
Please](https://github.com/googleapis/release-please). See
[documentation](https://github.com/googleapis/release-please#release-please).
@alxxjohn
alxxjohn deleted the feature/change-quality-semantic-precision branch July 28, 2026 14:04
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