blob: d3d46bfec0da96e6cc648ab8e7eae8faefa27ee8 [file] [view] [edit]
# nsmd — Review Context for CodeRabbit (and humans)
> Committed at the repo root (or `docs/`) and ingested by CodeRabbit via
> `knowledge_base.code_guidelines.filePatterns`. This is the repo-level context CodeRabbit lacks
> when it reviews a single diff. Every item below corresponds to a false-positive class found in a
> 6-month review audit. Keep it current CodeRabbit uses it as durable review guidance.
## Architecture facts (so reviews stop mis-assuming)
- **Production nsmd event-loop code is intended to be single-threaded.** It runs one
sdbusplus/asio event loop with cooperative coroutines unless a change explicitly introduces
another concurrent execution path such as worker threads, callbacks on a different execution
context/strand, or shared state accessed from multiple OS threads. Therefore:
- `std::localtime`, `static` local buffers, lazy `if(p==nullptr) p=make_unique<>()` init, and a
`if(flag){...} flag=true;` check-then-set are **NOT** data races **unless** there is a `co_await`
*between* the check and the set, or another concrete concurrent path is visible. Do not flag them
as thread-unsafe without identifying that path.
- **`mockupResponder/**` is a test simulator, not production firmware.** Production-grade error
handling, leak/null-deref hardening, and behavioral test assertions do not apply. Advertising a
command in `supportedCommands` before its handler exists is the intended "advertise-first" pattern
(the default case returns `NSM_ERR_UNSUPPORTED_COMMAND_CODE`).
- **`**/test/**` includes intentional branch-coverage / sanitizer-cleanup tests.** A test whose
purpose is "this code path runs without throwing / without a sanitizer error" legitimately uses
`EXPECT_NO_THROW`, an empty `catch{}`, or `EXPECT_NE(rc,0)` without asserting a specific value.
- **`libnsm/**` implements the NSM (MCTP System Management API) wire protocol.** Enum numeric values
and field widths are **spec-mandated** changing them is usually spec-alignment, not a wire break.
Many decoders perform **structural** validation (lengths/sizes), while **semantic** field
validation may live in encoders or callers. Check the local encoder/decoder contract before
demanding symmetric semantic validation. A trailing `[1]` / `bitfield8_t[1]` member means
`sizeof(struct)` already counts one element, so `resize(sizeof(struct)+n-1)` is correct.
## House conventions (intentional — not defects)
- `const` on **by-value** parameters is intentional (prevents accidental mutation of the local copy).
- `instance_id = 0` at encode time is the universal convention; the real id is assigned by the
requester/InstanceIdDb on send.
- Local `static inline` helpers scoped to one translation unit are fine even if they look duplicated
(no ODR issue); "local vs shared helper" is a free choice, not a defect.
- D-Bus interfaces, EM (entity-manager) config keys, and bmcweb contracts live in **other repos**
if a value/name looks wrong, it may be defined there; ask rather than assert.
## How to review nsmd well
- Before flagging a missing guard / missing test / wrong error type: read the **class header**
(access specifiers like `private:`, and C++ default member initializers `= value;`) and the
function's **callers** — most "issues" are handled just outside the diff hunk.
- Treat pure style/lint preferences as **nitpicks**, never "Potential issue / Major / Critical".
- Verify any "✅ Addressed" claim against the latest commit; don't assume.
## Maintaining this context
- If CodeRabbit raises a one-off false positive, reply on the CodeRabbit thread with the evidence and
resolve it.
- If the same false-positive pattern repeats, update this file through a normal MR.
- If the correction is a strict review rule or path-specific instruction, update `.coderabbit.yaml`.
- If the rule applies across BMC repositories, propose it in the parent `dgx/bmc/coderabbit` config.
## Pointers
- NSM protocol spec: MCTP System Management API (Type 0 Device Capability Discovery, Type 3 Platform
Environmentals, Type 4 Diagnostics, Type 5 Device Configuration, + Base Spec). Ask a maintainer for
the current PDFs if a wire/enum/field question arises.