maitrungduc1410/webrtc/pre-reviewer
Claude Code and agent skill by maitrungduc1410/webrtc
- community
Checking that the SKILL.md file is still in the repository.
Automated pre-review tool to inspect C++ style, concurrency safety, test quality, and CL descriptions before submitting code for human review.
Install
npx vskill@latest install maitrungduc1410/webrtc/pre-reviewerSKILL.md
Pre-Reviewer Skill
This skill acts as a pre-review confidence check tool for WebRTC C++ contributions. Use this skill to evaluate code changes for common C++ anti-patterns, concurrency bugs, test hygiene issues, and CL description completeness.
1. C++ Style and Modernization Guardrails
Lambda Expressions
- No Capture Renaming: Do not use captures with initializers to introduce
new names. Capture variables with their original names.
- Correct:
[on_certificate_ready = std::move(on_certificate_ready)] - Incorrect:
[callback = std::move(on_certificate_ready)] - Reference:
Google C++ Style Guide - Lambda expressions
- Prefer Implicit Captures for Inline/Local Lambdas: If the lambda cannot
escape the current scope (e.g. executed inside BlockingCall), prefer auto-capture ([&]). Do not explicitly list captures as it reduces readability.
- Reference:
C++ Readability Advice - Lambda capture clauses
Pointer and Value Checks
- Explicit `nullptr` Comparisons: Always compare pointer types to
nullptr
explicitly. Avoid implicit boolean conversion in conditions.
- Correct:
if (tq_ != nullptr)/RTC_DCHECK(transport == nullptr); - Incorrect:
if (tq_)/RTC_DCHECK(!transport); - Reference:
Abseil Tip #141: Test Container Emptiness with Boolean Functions
Structs vs. Classes
- Classes for API Invariants: Use a class if the object has invariants, has
wide visibility, or is expected to evolve. Use a struct only for passive data.
- Reference:
Google C++ Style Guide - Structs vs. Classes
- Encapsulation: Make classes' data members private unless they are
constants.
- Reference:
Google C++ Style Guide - Access Control
Virtual Functions
- No Default Arguments on Virtuals: Banned on virtual functions because
default arguments are bound statically at compile time, which leads to unexpected behavior when overriding.
- Reference:
Google C++ Style Guide - Default Arguments
Type Deduction (auto)
- Avoid Excessive `auto`: Explicitly spell out types unless the type is
overly verbose (e.g. templates) or using auto directly improves safety. Do not use it merely to avoid writing the type.
- Reference:
Google C++ Style Guide - Type deduction
Operator Style
- Pre-increment/decrement: Prefer the prefix form (
++i,--i) unless
postfix semantics are required.
- Reference:
Google C++ Style Guide - Preincrement and Predecrement
Smart Pointer Initialization
- Assignment Syntax: Use assignment syntax when initializing directly with
smart pointers.
- Correct:
std::unique_ptr<Foo> foo = std::make_unique<Foo>(); - Incorrect:
std::unique_ptr<Foo> foo(std::make_unique<Foo>()); - Reference:
Abseil Tip #88: Use Assignment Syntax for Smart Pointer Initialization
Modern C++ Patterns (C++20 & Standard Library)
- Constinit: Use
constinitdirectly instead ofABSL_CONST_INIT. - Reference:
- std::exchange: Use
std::exchangeto simplify reset-and-return logic. - Reference:
- Avoid std::make_pair / std::make_tuple: Prefer brace initialization or
class template argument deduction (CTAD) like std::pair{a, b} instead of std::make_pair(a, b).
- absl::flat_hash_map: Prefer as the default map type unless ordering is
required.
- Reference:
Type Casting and Conversions
- Prefer Braced Initialization for Non-Narrowing Conversions: Prefer braced
initialization (Type{value}) over static_cast<Type>(value) when converting constants or values where narrowing is not intended.
- Correct:
if (temporal_index >= int{kMaxTemporalStreams}) - Incorrect:
if (temporal_index >= static_cast<int>(kMaxTemporalStreams)) - Reference:
Google C++ Style Guide - Casting
Move Semantics
- Move First, Dereference After (for std::optional): For
std::optional, it
is recommended to move first and dereference after (e.g. *std::move(opt)). Note that this is generally not recommended for std::unique_ptr.
- Reference:
Abseil Tip #181: Move First, Dereference After
- Reference:
Abseil Tip #224: Avoid value() accessors
- Avoid Redundant Return moves: Do not use
std::moveon return statements
when it prevents copy elision (NRVO/RVO). Moving a member variable out of a class when returning can still be useful.
- Avoid Brittle Move Loops: Avoid moving a member variable into an argument
of a method only to move it back inside the method. This looks like a "use after move" and makes code brittle.
- Example: Avoid
RecreateEncoder(std::move(config_))which internally
updates config_ back. Prefer separating it into a parameterless reset method or a config updater.
2. Concurrency, Threading, and Destructors
- Prevent Reentrancy in Destructors: When executing callbacks during
destruction, move or swap the callback list/queue into a local variable first, then execute. This prevents callbacks from accessing a partially destroyed class.
- No Sequence Checkers in Destructors: Remove or omit sequence/thread checks
(RTC_DCHECK_RUN_ON) inside destructors. In C++, it is assumed that no other threads can call into an object while it is being destroyed.
- Atomic Safety: Do not use relaxed memory order atomics when safety
invariants depend on the ordering of operations not protected by the same lock.
- Reference:
3. Testing Best Practices
- Omit GMock Default Cardinality: Do not add
.Times(1)toEXPECT_CALLas
it is the default.
- Omit Wildcard GMock Parameters: Omit parameter lists in
EXPECT_CALLwhen
all parameters are wildcards (applicable to non-overloaded methods).
- Reference:
GoogleTest Mocking Reference - EXPECT_CALL
- Alias Testing Symbols with `using`: In test
.ccfiles, add a
using-declaration such as using ::testing::IsTrue; near the top of the file, next to any existing ones, for each gMock matcher or other ::testing symbol. Do not spell out the ::testing:: prefix at each call site and do not use using namespace ::testing;.
- Correct:
WaitUntil([&] { return done; }, IsTrue()) - Incorrect:
WaitUntil([&] { return done; }, ::testing::IsTrue()) - Reference:
- Reference:
Google C++ Style Guide - Namespaces
- Prefer Container Matchers: Use
EXPECT_THATwith matchers such as
SizeIs(), IsEmpty() and ElementsAre() instead of checking the result of size() or empty(). On failure, the matchers also print the contents of the container. For a container held in a std::optional, wrap the matcher in Optional(), e.g. EXPECT_THAT(values, Optional(SizeIs(2)));.
- Correct:
EXPECT_THAT(values, SizeIs(2));/
EXPECT_THAT(values, IsEmpty());
- Incorrect:
EXPECT_EQ(values.size(), 2u);/
EXPECT_TRUE(values.empty());
- Reference:
GoogleTest Matchers Reference - Container Matchers
- Avoid Unrelated Assertions: Do not assert expectations on calls that are
not the focus of the test scenario. Use ON_CALL instead of EXPECT_CALL for setting default behavior without setting expectations.
- Reference:
GoogleTest Cookbook - Use ON_CALL
- Descriptive Test Names: Include the test scenario and expected outcome in
test names.
- Reference:
Testing on the Toilet: Writing Descriptive Test Names
- Do Not Crash in Tests: Use
FAIL() << "message";instead of triggering a
crash when verifying preconditions or expectations.
- Reference:
GoogleTest Reference: Success/Failure Assertions
- Avoid Double Negations: Use positive assertions for better readability.
- Reference:
Testing Blog: Improve Readability with Positive Assertions
4. Code Review and CL Process
- Meaningful CL Descriptions: The CL description must explain why the
change is made, not just what changed. List major goals, link issue tickets, and clarify the bigger architectural plan.
- Reference:
Google Engineering Practices: CL Descriptions
- Keep CLs Small: Split large changes into multiple CLs. Introduce interface
definitions in one CL, and migrate callers in subsequent CLs.
- Reference:
Google Engineering Practices: Small CLs
- Documentation Freshness: When adding new
.mdfiles, always include
freshness metadata to track ownership.
- Reference:
WebRTC Documentation Guidelines
5. Inclusive Language Guidelines
- Use Inclusive Terminology: Avoid gendered pronouns and non-inclusive terms
in code, comments, and documentation. Use precise, neutral technical alternatives.
- Reference:
- Reference:
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingagents/skills/pre-reviewer/SKILL.md
Popularity
- Repository stars
- 62
- Repository forks
- 36
- 7-day trend score
- 21
Stars and forks are for the whole GitHub repository, not this skill alone. Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/maitrungduc1410/webrtc/pre-reviewer)