diff --git a/src/graph/GraphView.cpp b/src/graph/GraphView.cpp
index df2177cf6910a3c40ef269d18bf148d60b5faa66..5b37e0e8a622464f01243e1f03fd9c8f6d744cb0 100644
--- a/src/graph/GraphView.cpp
+++ b/src/graph/GraphView.cpp
@@ -83,6 +83,7 @@ void Aidge::GraphView::save(const std::string& path, bool verbose, bool showProd
     }
 
     fmt::print(fp.get(),
+                "```mermaid\n"
                 "%%{{init: {{'flowchart': {{ 'curve': 'monotoneY'}}, "
                 "'fontFamily': 'Verdana' }} }}%%\nflowchart TB\n\n");
 
@@ -204,6 +205,7 @@ void Aidge::GraphView::save(const std::string& path, bool verbose, bool showProd
     fmt::print(fp.get(), "classDef producerCls_rootCls stroke:#f00,fill:#ccf\n");
     fmt::print(fp.get(), "classDef genericCls_rootCls stroke:#f00,fill:#f9f9ff,stroke-width:1px,stroke-dasharray: 5 5\n");
     fmt::print(fp.get(), "classDef metaCls_rootCls stroke:#f00,stroke-width:5px\n");
+    fmt::print(fp.get(), "```\n");
     fmt::print(fp.get(), "\n");
 }
 
@@ -414,9 +416,10 @@ bool Aidge::GraphView::forwardDims(const std::vector<std::vector<Aidge::DimSize_
                     i, nodePtr->name(), nodePtr->type(), inputI.second, inputI.first->name(), inputI.first->type());
             } else {
                 // Input is missing
-                AIDGE_ASSERT(nodePtr->getOperator()->getRawInput(i)
-                    && !std::static_pointer_cast<Tensor>(nodePtr->getOperator()->getRawInput(i))->empty(),
+                AIDGE_ASSERT(nodePtr->getOperator()->getRawInput(i),
                   "Missing input#{} for node {} ({})", i, nodePtr->name(), nodePtr->type());
+                AIDGE_ASSERT(!std::static_pointer_cast<Tensor>(nodePtr->getOperator()->getRawInput(i))->empty(),
+                  "Empty input#{} for node {} ({})", i, nodePtr->name(), nodePtr->type());
             }
 
         }
diff --git a/src/scheduler/Scheduler.cpp b/src/scheduler/Scheduler.cpp
index 4e3f9978837120bd01a3de2cfe2d22e33f9d7828..1c41afd4a2765d364b0ce6035bf50d732179fe1c 100644
--- a/src/scheduler/Scheduler.cpp
+++ b/src/scheduler/Scheduler.cpp
@@ -280,7 +280,12 @@ std::vector<std::shared_ptr<Aidge::Scheduler::StaticSchedulingElement>> Aidge::S
     mPriorCache.clear();
 
     if (!consumers.empty()) {
-        Log::warn("Remaining consumers: possible dead-lock");
+        std::vector<std::string> consumersName;
+        std::transform(consumers.begin(), consumers.end(),
+            std::back_inserter(consumersName),
+            [&namePtrTable](auto val){ return namePtrTable.at(val); });
+
+        Log::warn("Remaining consumers: {}. Possible dead-lock.", consumersName);
     }
 
     return schedule;
@@ -518,7 +523,18 @@ void Aidge::Scheduler::connectInputs(std::vector<std::shared_ptr<Aidge::Tensor>>
     auto inputNodes = mGraphView->getOrderedInputs();
 
     // Assert that the number of input data producers corresponds to the number of data input
-    assert(data.size() == inputNodes.size()  && "Scheduler connectInput error - Inconsistent number of graph inputs and inputs passed to the graph");
+    if (data.size() != inputNodes.size()) {
+        const std::map<std::shared_ptr<Node>, std::string> namePtrTable
+            = mGraphView->getRankedNodesName("{0} ({1}#{3})");
+
+        std::vector<std::pair<std::string, IOIndex_t>> inputNodesName;
+        std::transform(inputNodes.begin(), inputNodes.end(),
+            std::back_inserter(inputNodesName),
+            [&namePtrTable](auto val){ return std::make_pair(namePtrTable.at(val.first), val.second); });
+
+        AIDGE_THROW_OR_ABORT(std::runtime_error, "Provided {} inputs to the scheduler, but graph has {} inputs (required inputs in order: )",
+            data.size(), inputNodes.size(), inputNodesName);
+    }
 
     for (std::size_t i = 0; i < data.size(); ++i){
         // TODO : maybe shallow copy instead of deepcopy