diff --git a/daemon/rib/fib-updater.cpp b/daemon/rib/fib-updater.cpp
index 6f82b17..3a7caff 100644
--- a/daemon/rib/fib-updater.cpp
+++ b/daemon/rib/fib-updater.cpp
@@ -554,7 +554,7 @@
 
 void
 FibUpdater::createFibUpdatesForErasedRoute(const RibEntry& entry, const Route& route,
-                                               const bool captureWasTurnedOff)
+                                           bool captureWasTurnedOff)
 {
   addFibUpdate(FibUpdate::createRemoveUpdate(entry.getName(), route.faceId));
 
diff --git a/daemon/rib/fib-updater.hpp b/daemon/rib/fib-updater.hpp
index e231341..ee820f6 100644
--- a/daemon/rib/fib-updater.hpp
+++ b/daemon/rib/fib-updater.hpp
@@ -35,7 +35,8 @@
 
 namespace nfd::rib {
 
-/** \brief computes FibUpdates based on updates to the RIB and sends them to NFD
+/**
+ * \brief Computes FibUpdates based on updates to the RIB and sends them to NFD.
  */
 class FibUpdater : noncopyable
 {
@@ -46,18 +47,19 @@
     using std::runtime_error::runtime_error;
   };
 
-public:
   using FibUpdateList = std::list<FibUpdate>;
   using FibUpdateSuccessCallback = std::function<void(RibUpdateList inheritedRoutes)>;
   using FibUpdateFailureCallback = std::function<void(uint32_t code, const std::string& error)>;
 
   FibUpdater(Rib& rib, ndn::nfd::Controller& controller);
 
-  NFD_VIRTUAL_WITH_TESTS
+#ifdef NFD_WITH_TESTS
+  virtual
   ~FibUpdater() = default;
+#endif
 
-  /** \brief computes FibUpdates using the provided RibUpdateBatch and then sends the
-   *         updates to NFD's FIB
+  /** \brief Computes FibUpdates using the provided RibUpdateBatch and then sends the
+   *         updates to NFD's FIB.
    *
    *  \note  Caller must guarantee that the previous batch has either succeeded or failed
    *         before calling this method
@@ -68,56 +70,60 @@
                            const FibUpdateFailureCallback& onFailure);
 
 private:
-  /** \brief determines the type of action that will be performed on the RIB and calls the
-  *          corresponding computation method
-  */
+  /**
+   * \brief Determines the type of action that will be performed on the RIB and calls the
+   *        corresponding computation method.
+   */
   void
   computeUpdates(const RibUpdateBatch& batch);
 
-  /** \brief sends the passed updates to NFD
-  *
-  *   onSuccess or onFailure will be called based on the results in
-  *   onUpdateSuccess or onUpdateFailure
-  *
-  *   \see FibUpdater::onUpdateSuccess
-  *   \see FibUpdater::onUpdateFailure
-  */
+  /**
+   * \brief Sends the passed updates to NFD.
+   *
+   * onSuccess or onFailure will be called based on the results in
+   * onUpdateSuccess or onUpdateFailure.
+   *
+   * \see FibUpdater::onUpdateSuccess
+   * \see FibUpdater::onUpdateFailure
+   */
   void
   sendUpdates(const FibUpdateList& updates,
               const FibUpdateSuccessCallback& onSuccess,
               const FibUpdateFailureCallback& onFailure);
 
-  /** \brief sends the updates in m_updatesForBatchFaceId to NFD if any exist,
-  *          otherwise calls FibUpdater::sendUpdatesForNonBatchFaceId.
-  */
+  /**
+   * \brief Sends the updates in m_updatesForBatchFaceId to NFD if any exist,
+   *        otherwise calls FibUpdater::sendUpdatesForNonBatchFaceId.
+   */
   void
   sendUpdatesForBatchFaceId(const FibUpdateSuccessCallback& onSuccess,
                             const FibUpdateFailureCallback& onFailure);
 
-  /** \brief sends the updates in m_updatesForNonBatchFaceId to NFD if any exist,
-  *          otherwise calls onSuccess.
-  */
+  /**
+   * \brief Sends the updates in m_updatesForNonBatchFaceId to NFD if any exist,
+   *        otherwise calls onSuccess.
+   */
   void
   sendUpdatesForNonBatchFaceId(const FibUpdateSuccessCallback& onSuccess,
                                const FibUpdateFailureCallback& onFailure);
 
 NFD_PROTECTED_WITH_TESTS_ELSE_PRIVATE:
-  /** \brief sends a FibAddNextHopCommand to NFD using the parameters supplied by
-  *          the passed update
-  *
-  *   \param nTimeouts the number of times this FibUpdate has failed due to timeout
-  */
+  /**
+   * \brief Sends a FibAddNextHopCommand to NFD using the parameters supplied by
+   *        the passed update.
+   * \param nTimeouts the number of times this FibUpdate has failed due to timeout
+   */
   NFD_VIRTUAL_WITH_TESTS void
   sendAddNextHopUpdate(const FibUpdate& update,
                        const FibUpdateSuccessCallback& onSuccess,
                        const FibUpdateFailureCallback& onFailure,
                        uint32_t nTimeouts = 0);
 
-  /** \brief sends a FibRemoveNextHopCommand to NFD using the parameters supplied by
-  *          the passed update
-  *
-  *   \param nTimeouts the number of times this FibUpdate has failed due to timeout
-  */
+  /**
+   * \brief Sends a FibRemoveNextHopCommand to NFD using the parameters supplied by
+   *        the passed update.
+   * \param nTimeouts the number of times this FibUpdate has failed due to timeout
+   */
   NFD_VIRTUAL_WITH_TESTS void
   sendRemoveNextHopUpdate(const FibUpdate& update,
                           const FibUpdateSuccessCallback& onSuccess,
@@ -125,48 +131,52 @@
                           uint32_t nTimeouts = 0);
 
 private:
-  /** \brief calculates the FibUpdates generated by a RIB registration
-  */
+  /**
+   * \brief Calculates the FibUpdates generated by a RIB registration.
+   */
   void
   computeUpdatesForRegistration(const RibUpdate& update);
 
-  /** \brief calculates the FibUpdates generated by a RIB unregistration
-  */
+  /**
+   * \brief Calculates the FibUpdates generated by a RIB unregistration.
+   */
   void
   computeUpdatesForUnregistration(const RibUpdate& update);
 
 NFD_PROTECTED_WITH_TESTS_ELSE_PRIVATE:
-  /** \brief callback used by NfdController when a FibAddNextHopCommand or FibRemoveNextHopCommand
-  *          is successful.
-  *
-  *   If the update has the same Face ID as the batch being processed, the update is
-  *   removed from m_updatesForBatchFaceId. If m_updatesForBatchFaceId becomes empty,
-  *   the updates with a different Face ID than the batch are sent to NFD.
-  *
-  *   If the update has a different Face ID than the batch being processed, the update is
-  *   removed from m_updatesForBatchNonFaceId. If m_updatesForBatchNonFaceId becomes empty,
-  *   the FIB update process is considered a success.
-  */
+  /**
+   * \brief Callback used by NfdController when a FibAddNextHopCommand or FibRemoveNextHopCommand
+   *        is successful.
+   *
+   * If the update has the same Face ID as the batch being processed, the update is
+   * removed from m_updatesForBatchFaceId. If m_updatesForBatchFaceId becomes empty,
+   * the updates with a different Face ID than the batch are sent to NFD.
+   *
+   * If the update has a different Face ID than the batch being processed, the update is
+   * removed from m_updatesForBatchNonFaceId. If m_updatesForBatchNonFaceId becomes empty,
+   * the FIB update process is considered a success.
+   */
   void
   onUpdateSuccess(const FibUpdate& update,
                   const FibUpdateSuccessCallback& onSuccess,
                   const FibUpdateFailureCallback& onFailure);
 
-  /** \brief callback used by NfdController when a FibAddNextHopCommand or FibRemoveNextHopCommand
-  *          is successful.
-  *
-  *   If the update has not reached the max number of timeouts allowed, the update
-  *   is retried.
-  *
-  *   If the update failed due to a non-existent face and the update has the same Face ID
-  *   as the update batch, the FIB update process fails.
-  *
-  *   If the update failed due to a non-existent face and the update has a different
-  *   face than the update batch, the update is not retried and the error is
-  *   ignored.
-  *
-  *   Otherwise, a non-recoverable error has occurred and an exception is thrown.
-  */
+  /**
+   * \brief Callback used by NfdController when a FibAddNextHopCommand or FibRemoveNextHopCommand
+   *        is successful.
+   *
+   * If the update has not reached the max number of timeouts allowed, the update
+   * is retried.
+   *
+   * If the update failed due to a non-existent face and the update has the same Face ID
+   * as the update batch, the FIB update process fails.
+   *
+   * If the update failed due to a non-existent face and the update has a different
+   * face than the update batch, the update is not retried and the error is
+   * ignored.
+   *
+   * Otherwise, a non-recoverable error has occurred and an exception is thrown.
+   */
   void
   onUpdateError(const FibUpdate& update,
                 const FibUpdateSuccessCallback& onSuccess,
@@ -174,80 +184,93 @@
                 const ndn::nfd::ControlResponse& response, uint32_t nTimeouts);
 
 private:
-  /** \brief adds the update to an update list based on its Face ID
-  *
-  *   If the update has the same Face ID as the update batch, the update is added
-  *   to m_updatesForBatchFaceId.
-  *
-  *   Otherwise, the update is added to m_updatesForBatchNonFaceId.
-  */
+  /**
+   * \brief Adds the update to an update list based on its Face ID.
+   *
+   * If the update has the same Face ID as the update batch, the update is added
+   * to m_updatesForBatchFaceId.
+   *
+   * Otherwise, the update is added to m_updatesForBatchNonFaceId.
+   */
   void
   addFibUpdate(const FibUpdate& update);
 
-  /** \brief creates records of the passed routes added to the entry and creates FIB updates
-  */
+  /**
+   * \brief Creates records of the passed routes added to the entry and creates FIB updates.
+   */
   void
   addInheritedRoutes(const RibEntry& entry, const Rib::RouteSet& routesToAdd);
 
-  /** \brief creates records of the passed routes added to the name and creates FIB updates.
-  *          Routes in routesToAdd with the same Face ID as ignore will be not be considered.
-  */
+  /**
+   * \brief Creates records of the passed routes added to the name and creates FIB updates.
+   *        Routes in \p routesToAdd with the same Face ID as ignore will be not be considered.
+   */
   void
   addInheritedRoutes(const Name& name, const Rib::RouteSet& routesToAdd, const Route& ignore);
 
-  /** \brief creates records of the passed routes removed from the entry and creates FIB updates
-  */
+  /**
+   * \brief Creates records of the passed routes removed from the entry and creates FIB updates.
+   */
   void
   removeInheritedRoutes(const RibEntry& entry, const Rib::RouteSet& routesToRemove);
 
-  /** \brief calculates updates for a name that will create a new RIB entry
-  */
+  /**
+   * \brief Calculates updates for a name that will create a new RIB entry.
+   */
   void
   createFibUpdatesForNewRibEntry(const Name& name, const Route& route,
                                  const Rib::RibEntryList& children);
 
-  /** \brief calculates updates for a new route added to a RIB entry
-  */
+  /**
+   * \brief Calculates updates for a new route added to a RIB entry.
+   */
   void
   createFibUpdatesForNewRoute(const RibEntry& entry, const Route& route,
-                              const bool captureWasTurnedOn);
+                              bool captureWasTurnedOn);
 
-  /** \brief calculates updates for changes to an existing route for a RIB entry
-  */
+  /**
+   * \brief Calculates updates for changes to an existing route for a RIB entry.
+   */
   void
   createFibUpdatesForUpdatedRoute(const RibEntry& entry, const Route& route,
                                   const Route& existingRoute);
 
-  /** \brief calculates updates for a an existing route removed from a RIB entry
-  */
+  /**
+   * \brief Calculates updates for a an existing route removed from a RIB entry.
+   */
   void
   createFibUpdatesForErasedRoute(const RibEntry& entry, const Route& route,
-                                 const bool captureWasTurnedOff);
+                                 bool captureWasTurnedOff);
 
-  /** \brief calculates updates for an entry that will be removed from the RIB
-  */
+  /**
+   * \brief Calculates updates for an entry that will be removed from the RIB.
+   */
   void
   createFibUpdatesForErasedRibEntry(const RibEntry& entry);
 
-  /** \brief adds and removes passed routes to children's inherited routes
-  */
+  /**
+   * \brief Adds and removes passed routes to children's inherited routes.
+   */
   void
   modifyChildrensInheritedRoutes(const Rib::RibEntryList& children,
                                  const Rib::RouteSet& routesToAdd,
                                  const Rib::RouteSet& routesToRemove);
 
-  /** \brief traverses the entry's children adding and removing the passed routes
-  */
+  /**
+   * \brief Traverses the entry's children adding and removing the passed routes.
+   */
   void
   traverseSubTree(const RibEntry& entry, Rib::RouteSet routesToAdd, Rib::RouteSet routesToRemove);
 
-  /** \brief creates a record of a calculated inherited route that should be added to the entry
-  */
+  /**
+   * \brief Creates a record of a calculated inherited route that should be added to the entry.
+   */
   void
   addInheritedRoute(const Name& name, const Route& route);
 
-  /** \brief creates a record of an existing inherited route that should be removed from the entry
-  */
+  /**
+   * \brief Creates a record of an existing inherited route that should be removed from the entry.
+   */
   void
   removeInheritedRoute(const Name& name, const Route& route);
 
@@ -260,8 +283,9 @@
   FibUpdateList m_updatesForBatchFaceId;
   FibUpdateList m_updatesForNonBatchFaceId;
 
-  /** \brief list of inherited routes generated during FIB update calculation;
-   *         passed to the RIB when updates are completed successfully
+  /**
+   * \brief List of inherited routes generated during FIB update calculation;
+   *        passed to the RIB when updates are completed successfully.
    */
   RibUpdateList m_inheritedRoutes;
 };
diff --git a/daemon/rib/readvertise/client-to-nlsr-readvertise-policy.hpp b/daemon/rib/readvertise/client-to-nlsr-readvertise-policy.hpp
index be76597..963c9c1 100644
--- a/daemon/rib/readvertise/client-to-nlsr-readvertise-policy.hpp
+++ b/daemon/rib/readvertise/client-to-nlsr-readvertise-policy.hpp
@@ -30,12 +30,12 @@
 
 namespace nfd::rib {
 
-/** \brief a policy to readvertise routes registered by end hosts into NLSR
+/** \brief A policy to readvertise routes registered by end hosts into NLSR.
  */
 class ClientToNlsrReadvertisePolicy : public ReadvertisePolicy
 {
 public:
-  /** \brief advertise if the route's origin is client
+  /** \brief Advertise if the route's origin is client.
    *
    *  If the route origin is "client" (typically from auto prefix propagation), readvertise it
    *  using the default signing identity.
diff --git a/daemon/rib/readvertise/host-to-gateway-readvertise-policy.hpp b/daemon/rib/readvertise/host-to-gateway-readvertise-policy.hpp
index 63b4fc8..44506e5 100644
--- a/daemon/rib/readvertise/host-to-gateway-readvertise-policy.hpp
+++ b/daemon/rib/readvertise/host-to-gateway-readvertise-policy.hpp
@@ -33,7 +33,7 @@
 
 namespace nfd::rib {
 
-/** \brief a policy to readvertise routes registered by local applications into remote gateway
+/** \brief A policy to readvertise routes registered by local applications into remote gateway.
  */
 class HostToGatewayReadvertisePolicy : public ReadvertisePolicy
 {
diff --git a/daemon/rib/readvertise/nfd-rib-readvertise-destination.hpp b/daemon/rib/readvertise/nfd-rib-readvertise-destination.hpp
index ab2f710..5ed5f52 100644
--- a/daemon/rib/readvertise/nfd-rib-readvertise-destination.hpp
+++ b/daemon/rib/readvertise/nfd-rib-readvertise-destination.hpp
@@ -35,7 +35,7 @@
 
 namespace nfd::rib {
 
-/** \brief a readvertise destination using NFD RIB management protocol
+/** \brief A readvertise destination using NFD RIB management protocol.
  */
 class NfdRibReadvertiseDestination : public ReadvertiseDestination
 {
@@ -46,14 +46,14 @@
                                const ndn::nfd::ControlParameters& parameters =
                                  ndn::nfd::ControlParameters().setOrigin(ndn::nfd::ROUTE_ORIGIN_CLIENT));
 
-  /** \brief add a name prefix into NFD RIB
+  /** \brief Add a name prefix into NFD RIB.
    */
   void
   advertise(const ReadvertisedRoute& rr,
             std::function<void()> successCb,
             std::function<void(const std::string&)> failureCb) override;
 
-  /** \brief remove a name prefix from NFD RIB
+  /** \brief Remove a name prefix from NFD RIB.
    */
   void
   withdraw(const ReadvertisedRoute& rr,
diff --git a/daemon/rib/readvertise/readvertise-destination.hpp b/daemon/rib/readvertise/readvertise-destination.hpp
index 045483a..95726bd 100644
--- a/daemon/rib/readvertise/readvertise-destination.hpp
+++ b/daemon/rib/readvertise/readvertise-destination.hpp
@@ -30,7 +30,7 @@
 
 namespace nfd::rib {
 
-/** \brief a destination to readvertise into
+/** \brief A destination to readvertise into.
  */
 class ReadvertiseDestination : noncopyable
 {
@@ -59,7 +59,7 @@
   setAvailability(bool isAvailable);
 
 public:
-  /** \brief signals when the destination becomes available or unavailable
+  /** \brief Signals when the destination becomes available or unavailable.
    */
   signal::Signal<ReadvertiseDestination, bool> afterAvailabilityChange;
 
diff --git a/daemon/rib/readvertise/readvertise-policy.hpp b/daemon/rib/readvertise/readvertise-policy.hpp
index 3e4456e..94d178f 100644
--- a/daemon/rib/readvertise/readvertise-policy.hpp
+++ b/daemon/rib/readvertise/readvertise-policy.hpp
@@ -32,7 +32,7 @@
 
 namespace nfd::rib {
 
-/** \brief a decision made by readvertise policy
+/** \brief A decision made by readvertise policy.
  */
 struct ReadvertiseAction
 {
@@ -40,7 +40,7 @@
   ndn::security::SigningInfo signer; ///< credentials for command signing
 };
 
-/** \brief a policy to decide whether to readvertise a route, and what prefix to readvertise
+/** \brief A policy to decide whether to readvertise a route, and what prefix to readvertise.
  */
 class ReadvertisePolicy : noncopyable
 {
@@ -48,7 +48,7 @@
   virtual
   ~ReadvertisePolicy() = default;
 
-  /** \brief decide whether to readvertise a route, and what prefix to readvertise
+  /** \brief Decide whether to readvertise a route, and what prefix to readvertise.
    */
   virtual std::optional<ReadvertiseAction>
   handleNewRoute(const RibRouteRef& ribRoute) const = 0;
diff --git a/daemon/rib/readvertise/readvertise.hpp b/daemon/rib/readvertise/readvertise.hpp
index 88b11aa..19274c9 100644
--- a/daemon/rib/readvertise/readvertise.hpp
+++ b/daemon/rib/readvertise/readvertise.hpp
@@ -33,7 +33,7 @@
 
 namespace nfd::rib {
 
-/** \brief readvertise a subset of routes to a destination according to a policy
+/** \brief Readvertise a subset of routes to a destination according to a policy.
  *
  *  The Readvertise class allows RIB routes to be readvertised to a destination such as a routing
  *  protocol daemon or another NFD-RIB. It monitors the RIB for route additions and removals,
@@ -72,7 +72,7 @@
 
   ReadvertisedRouteContainer m_rrs;
   /**
-   * \brief maps from RIB route to readvertised route derived from RIB route(s)
+   * \brief Map from RIB route to readvertised route derived from RIB route(s).
    */
   std::map<RibRouteRef, ReadvertisedRouteContainer::iterator> m_routeToRr;
 
diff --git a/daemon/rib/readvertise/readvertised-route.hpp b/daemon/rib/readvertise/readvertised-route.hpp
index e4be12c..a57fe70 100644
--- a/daemon/rib/readvertise/readvertised-route.hpp
+++ b/daemon/rib/readvertise/readvertised-route.hpp
@@ -33,7 +33,7 @@
 
 namespace nfd::rib {
 
-/** \brief state of a readvertised route
+/** \brief State of a readvertised route.
  */
 class ReadvertisedRoute : noncopyable
 {
diff --git a/daemon/rib/rib-entry.hpp b/daemon/rib/rib-entry.hpp
index d98d72a..6fbd198 100644
--- a/daemon/rib/rib-entry.hpp
+++ b/daemon/rib/rib-entry.hpp
@@ -66,10 +66,12 @@
   bool
   hasChildren() const;
 
-  /** \brief inserts a new route into the entry's route list
+  /** \brief Inserts a new route into the entry's route list.
+   *
    *  If another route already exists with the same faceId and origin,
    *  the new route is not inserted.
-   *  \return a pair, whose first element is the iterator to the newly
+   *
+   *  \return A pair, whose first element is the iterator to the newly
    *  inserted element if the insert succeeds and to the
    *  previously-existing element otherwise, and whose second element
    *  is true if the insert succeeds and false otherwise.
@@ -77,13 +79,15 @@
   std::pair<RibEntry::iterator, bool>
   insertRoute(const Route& route);
 
-  /** \brief erases a Route with the same faceId and origin
+  /**
+   * \brief Erases a Route with the same FaceId and origin.
    */
   void
   eraseRoute(const Route& route);
 
-  /** \brief erases a Route with the passed iterator
-   *  \return{ an iterator to the element that followed the erased iterator }
+  /**
+   * \brief Erases a Route with the passed iterator.
+   * \return An iterator to the element that followed the erased iterator
    */
   iterator
   eraseRoute(RouteList::iterator route);
@@ -112,23 +116,25 @@
   void
   removeInheritedRoute(const Route& route);
 
-  /** \brief Returns the routes this namespace has inherited.
-   *  The inherited routes returned represent inherited routes this namespace has in the FIB.
-   *  \return{ routes inherited by this namespace }
+  /**
+   * \brief Returns the routes this namespace has inherited.
+   *
+   * The inherited routes returned represent inherited routes this namespace has in the FIB.
    */
   const RouteList&
   getInheritedRoutes() const;
 
-  /** \brief Finds an inherited route with a matching face ID.
-   *  \return{ An iterator to the matching route if one is found;
-   *           otherwise, an iterator to the end of the entry's
-   *           inherited route list }
+  /**
+   * \brief Finds an inherited route with a matching face ID.
+   * \return An iterator to the matching route if one is found;
+   *         otherwise, an iterator to the end of the entry's
+   *         inherited route list
    */
   RouteList::const_iterator
   findInheritedRoute(const Route& route) const;
 
   /** \brief Determines if the entry has an inherited route with a matching face ID.
-   *  \return{ True, if a matching inherited route is found; otherwise, false. }
+   *  \return True, if a matching inherited route is found; otherwise, false.
    */
   bool
   hasInheritedRoute(const Route& route) const;
@@ -138,13 +144,13 @@
 
   /** \brief Determines if the entry has an inherited route with the passed
    *         face ID and its child inherit flag set.
-   *  \return{ True, if a matching inherited route is found; otherwise, false. }
+   *  \return True, if a matching inherited route is found; otherwise, false.
    */
   bool
   hasChildInheritOnFaceId(uint64_t faceId) const;
 
   /** \brief Returns the route with the lowest cost that has the passed face ID.
-   *  \return{ The route with the lowest cost that has the passed face ID}
+   *  \return The route with the lowest cost that has the passed face ID
    */
   const Route*
   getRouteWithLowestCostByFaceId(uint64_t faceId) const;
@@ -154,8 +160,6 @@
 
   /** \brief Returns the route with the lowest cost that has the passed face ID
    *         and its child inherit flag set.
-   *  \return{ The route with the lowest cost that has the passed face ID
-   *           and its child inherit flag set }
    */
   const Route*
   getRouteWithLowestCostAndChildInheritByFaceId(uint64_t faceId) const;
@@ -170,7 +174,7 @@
    *  confined within [\p minExpiration, \p maxExpiration] range. The caller is expected to sign
    *  this announcement.
    *
-   *  \warning (minExpiration > maxExpiration) triggers undefined behavior.
+   *  \warning `minExpiration > maxExpiration` triggers undefined behavior.
    */
   ndn::PrefixAnnouncement
   getPrefixAnnouncement(time::milliseconds minExpiration = 15_s,
diff --git a/daemon/rib/rib.hpp b/daemon/rib/rib.hpp
index 36d5e41..ddfa591 100644
--- a/daemon/rib/rib.hpp
+++ b/daemon/rib/rib.hpp
@@ -37,7 +37,7 @@
 
 class FibUpdater;
 
-/** \brief references a route
+/** \brief References a route.
  */
 struct RibRouteRef
 {
@@ -48,12 +48,15 @@
 bool
 operator<(const RibRouteRef& lhs, const RibRouteRef& rhs);
 
-/** \brief represents the Routing Information Base
-
-    The Routing Information Base contains a collection of Routes, each
-    represents a piece of static or dynamic routing information
-    registered by applications, operators, or NFD itself. Routes
-    associated with the same namespace are collected into a RIB entry.
+/**
+ * \brief Represents the Routing Information Base.
+ *
+ * The Routing Information Base (RIB) contains a collection of Route objects,
+ * each representing a piece of static or dynamic routing information registered
+ * by applications, operators, or NFD itself. Routes associated with the same
+ * namespace are collected into a RIB entry.
+ *
+ * \sa RibEntry
  */
 class Rib : noncopyable
 {
@@ -87,13 +90,13 @@
   }
 
   size_t
-  size() const
+  size() const noexcept
   {
     return m_nItems;
   }
 
-  bool
-  empty() const
+  [[nodiscard]] bool
+  empty() const noexcept
   {
     return m_rib.empty();
   }
@@ -105,7 +108,7 @@
   using UpdateSuccessCallback = std::function<void()>;
   using UpdateFailureCallback = std::function<void(uint32_t code, const std::string& error)>;
 
-  /** \brief passes the provided RibUpdateBatch to FibUpdater to calculate and send FibUpdates.
+  /** \brief Passes the provided RibUpdateBatch to FibUpdater to calculate and send FibUpdates.
    *
    *  If the FIB is updated successfully, onFibUpdateSuccess() will be called, and the
    *  RIB will be updated
@@ -118,7 +121,7 @@
                    const UpdateSuccessCallback& onSuccess,
                    const UpdateFailureCallback& onFailure);
 
-  /** \brief starts the FIB update process when a face has been destroyed
+  /** \brief Starts the FIB update process when a face has been destroyed.
    */
   void
   beginRemoveFace(uint64_t faceId);
@@ -167,13 +170,13 @@
   using RouteComparePredicate = bool (*)(const Route&, const Route&);
   using RouteSet = std::set<Route, RouteComparePredicate>;
 
-  /** \brief find entries under \p prefix
+  /** \brief Find entries under \p prefix.
    *  \pre a RIB entry exists at \p prefix
    */
   std::list<shared_ptr<RibEntry>>
   findDescendants(const Name& prefix) const;
 
-  /** \brief find entries under \p prefix
+  /** \brief Find entries under \p prefix.
    *  \pre a RIB entry does not exist at \p prefix
    */
   std::list<shared_ptr<RibEntry>>
@@ -185,54 +188,52 @@
   void
   updateRib(const RibUpdateBatch& batch);
 
-  /** \brief returns routes inherited from the entry's ancestors
-   *
-   *  \return{ a list of inherited routes }
+  /** \brief Returns routes inherited from the entry's ancestors.
+   *  \return a list of inherited routes
    */
   RouteSet
   getAncestorRoutes(const RibEntry& entry) const;
 
-  /** \brief returns routes inherited from the parent of the name and the parent's ancestors
-   *
+  /** \brief Returns routes inherited from the parent of the name and the parent's ancestors.
    *  \note A parent is first found for the passed name before inherited routes are collected
-   *
-   *  \return{ a list of inherited routes }
+   *  \return a list of inherited routes
    */
   RouteSet
   getAncestorRoutes(const Name& name) const;
 
-  /** \brief applies the passed inheritedRoutes and their actions to the corresponding RibEntries'
-   *  inheritedRoutes lists
+  /** \brief Applies the passed \p inheritedRoutes and their actions to the corresponding
+   *  RibEntries' inheritedRoutes lists.
    */
   void
   modifyInheritedRoutes(const RibUpdateList& inheritedRoutes);
 
 public:
-  /** \brief signals after a RIB entry is inserted
+  /** \brief Signals after a RIB entry is inserted.
    *
    *  A RIB entry is inserted when the first route associated with a
    *  certain namespace is added.
    */
   signal::Signal<Rib, Name> afterInsertEntry;
 
-  /** \brief signals after a RIB entry is erased
+  /** \brief Signals after a RIB entry is erased.
    *
    *  A RIB entry is erased when the last route associated with a
    *  certain namespace is removed.
    */
   signal::Signal<Rib, Name> afterEraseEntry;
 
-  /** \brief signals after a Route is added
+  /** \brief Signals after a Route is added.
    */
   signal::Signal<Rib, RibRouteRef> afterAddRoute;
 
-  /** \brief signals before a route is removed
+  /** \brief Signals before a route is removed.
    */
   signal::Signal<Rib, RibRouteRef> beforeRemoveRoute;
 
 private:
   RibTable m_rib;
-  std::multimap<uint64_t, shared_ptr<RibEntry>> m_faceEntries; ///< FaceId => Entry with Route on this face
+  // FaceId => Entry with Route on this face
+  std::multimap<uint64_t, shared_ptr<RibEntry>> m_faceEntries;
   size_t m_nItems = 0;
   FibUpdater* m_fibUpdater = nullptr;
 
diff --git a/daemon/rib/route.hpp b/daemon/rib/route.hpp
index eea42ee..471bdb6 100644
--- a/daemon/rib/route.hpp
+++ b/daemon/rib/route.hpp
@@ -37,16 +37,16 @@
 
 namespace nfd::rib {
 
-/** \brief represents a route for a name prefix
+/** \brief Represents a route for a name prefix.
  */
 class Route : public ndn::nfd::RouteFlagsTraits<Route>
 {
 public:
-  /** \brief default constructor
+  /** \brief Default constructor.
    */
   Route() = default;
 
-  /** \brief construct from a prefix announcement
+  /** \brief Construct from a prefix announcement.
    *  \param ann a prefix announcement that has passed verification
    *  \param faceId the face on which \p ann arrived
    */
diff --git a/daemon/rib/service.hpp b/daemon/rib/service.hpp
index 02e1914..3cedde4 100644
--- a/daemon/rib/service.hpp
+++ b/daemon/rib/service.hpp
@@ -43,7 +43,7 @@
 class Readvertise;
 
 /**
- * \brief initializes and executes NFD-RIB service thread
+ * \brief Initializes and executes the NFD-RIB service thread.
  *
  * Only one instance of this class can be created at any time.
  * After initialization, NFD-RIB instance can be started by running the global io_service.
@@ -52,7 +52,7 @@
 {
 public:
   /**
-   * \brief create NFD-RIB service
+   * \brief Create NFD-RIB service.
    * \param configFile absolute or relative path of configuration file
    * \param keyChain the KeyChain
    * \throw std::logic_error Instance of rib::Service has been already constructed
@@ -61,7 +61,7 @@
   Service(const std::string& configFile, ndn::KeyChain& keyChain);
 
   /**
-   * \brief create NFD-RIB service
+   * \brief Create NFD-RIB service.
    * \param configSection parsed configuration section
    * \param keyChain the KeyChain
    * \note This constructor overload is more appropriate for integrated environments,
@@ -72,13 +72,10 @@
    */
   Service(const ConfigSection& configSection, ndn::KeyChain& keyChain);
 
-  /**
-   * \brief Destructor
-   */
   ~Service();
 
   /**
-   * \brief Get a reference to the only instance of this class
+   * \brief Get a reference to the only instance of this class.
    * \throw std::logic_error No instance has been constructed
    * \throw std::logic_error This function is invoked on a thread other than the RIB thread
    */
@@ -86,7 +83,7 @@
   get();
 
   RibManager&
-  getRibManager()
+  getRibManager() noexcept
   {
     return m_ribManager;
   }
