Repository: probabl-ai/skore

Issue:
Reuse the scikit-learn convention for attributes with ending `_`
Right now, the reporter do not expose the same convention than scikit-learn:

```python
estimator = RandomForestClassifier()
report = EstimatorReport(estimator=estimator, ...)
assert report.estimator is not estimator
```

To avoid side-effect, we make sure to copy/clone the part of Python object that we want to modify. In scikit-learn, `fit` is known to have such processing. Here, it is our class constructor. We could reuse the same convention and make sure to expose attribute ending with `_` to acknowledge that it is not the attribute passed in init. Concretely, we would have:

```python
estimator = RandomForestClassifier()
report = EstimatorReport(estimator=estimator, ...)
assert report.estimator is estimator
assert report.estimator_ is not estimator  # the estimator resulting from the internal fit
```

@MarieS-WiMLDS What is your feeling about this part of the API?



Discussion:
github-actions[bot]: <!-- Pytest Coverage Comment: display-backend-coverage -->
<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/README.md"><img alt="Coverage" src="https://img.shields.io/badge/Coverage-93%25-brightgreen.svg" /></a><details><summary>Coverage Report for backend </summary><table><tr><th>File</th><th>Stmts</th><th>Miss</th><th>Cover</th><th>Missing</th></tr><tbody><tr><td colspan="5"><b>venv/lib/python3.12/site-packages/skore</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/__init__.py">\_\_init\_\_.py</a></td><td>22</td><td>5</td><td>71%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/__init__.py#L39-L56">39&ndash;56</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/__main__.py">\_\_main\_\_.py</a></td><td>8</td><td>1</td><td>80%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/__main__.py#L19">19</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/exceptions.py">exceptions.py</a></td><td>3</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td colspan="5"><b>venv/lib/python3.12/site-packages/skore/cli</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/cli/__init__.py">\_\_init\_\_.py</a></td><td>5</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/cli/cli.py">cli.py</a></td><td>33</td><td>3</td><td>85%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/cli/cli.py#L104">104</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/cli/cli.py#L111">111</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/cli/cli.py#L117">117</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/cli/color_format.py">color_format.py</a></td><td>43</td><td>3</td><td>90%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/cli/color_format.py#L35-L>40">35&ndash;>40</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/cli/color_format.py#L41-L43">41&ndash;43</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/cli/launch_dashboard.py">launch_dashboard.py</a></td><td>26</td><td>15</td><td>39%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/cli/launch_dashboard.py#L36-L57">36&ndash;57</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/cli/quickstart_command.py">quickstart_command.py</a></td><td>14</td><td>7</td><td>50%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/cli/quickstart_command.py#L37-L51">37&ndash;51</a></td></tr><tr><td colspan="5"><b>venv/lib/python3.12/site-packages/skore/item</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/__init__.py">\_\_init\_\_.py</a></td><td>21</td><td>1</td><td>91%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/__init__.py#L46">46</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/cross_validation_item.py">cross_validation_item.py</a></td><td>137</td><td>10</td><td>93%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/cross_validation_item.py#L27-L42">27&ndash;42</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/cross_validation_item.py#L373">373</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/item.py">item.py</a></td><td>42</td><td>13</td><td>69%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/item.py#L91">91</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/item.py#L94">94</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/item.py#L98-L118">98&ndash;118</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/item_repository.py">item_repository.py</a></td><td>61</td><td>5</td><td>91%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/item_repository.py#L12-L13">12&ndash;13</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/item_repository.py#L209-L210">209&ndash;210</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/item_repository.py#L231">231</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/media_item.py">media_item.py</a></td><td>70</td><td>4</td><td>94%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/media_item.py#L15-L18">15&ndash;18</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/numpy_array_item.py">numpy_array_item.py</a></td><td>25</td><td>1</td><td>93%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/numpy_array_item.py#L15">15</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/pandas_dataframe_item.py">pandas_dataframe_item.py</a></td><td>34</td><td>1</td><td>95%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/pandas_dataframe_item.py#L15">15</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/pandas_series_item.py">pandas_series_item.py</a></td><td>34</td><td>1</td><td>95%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/pandas_series_item.py#L15">15</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/polars_dataframe_item.py">polars_dataframe_item.py</a></td><td>32</td><td>1</td><td>94%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/polars_dataframe_item.py#L15">15</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/polars_series_item.py">polars_series_item.py</a></td><td>27</td><td>1</td><td>94%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/polars_series_item.py#L15">15</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/primitive_item.py">primitive_item.py</a></td><td>27</td><td>2</td><td>92%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/primitive_item.py#L13-L15">13&ndash;15</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/sklearn_base_estimator_item.py">sklearn_base_estimator_item.py</a></td><td>33</td><td>1</td><td>95%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/sklearn_base_estimator_item.py#L15">15</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/skrub_table_report_item.py">skrub_table_report_item.py</a></td><td>10</td><td>1</td><td>86%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/item/skrub_table_report_item.py#L11">11</a></td></tr><tr><td colspan="5"><b>venv/lib/python3.12/site-packages/skore/persistence</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/persistence/__init__.py">\_\_init\_\_.py</a></td><td>0</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/persistence/abstract_storage.py">abstract_storage.py</a></td><td>22</td><td>1</td><td>95%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/persistence/abstract_storage.py#L130">130</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/persistence/disk_cache_storage.py">disk_cache_storage.py</a></td><td>33</td><td>1</td><td>95%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/persistence/disk_cache_storage.py#L44">44</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/persistence/in_memory_storage.py">in_memory_storage.py</a></td><td>20</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td colspan="5"><b>venv/lib/python3.12/site-packages/skore/project</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/project/__init__.py">\_\_init\_\_.py</a></td><td>3</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/project/create.py">create.py</a></td><td>52</td><td>8</td><td>88%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/project/create.py#L116-L122">116&ndash;122</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/project/create.py#L132-L133">132&ndash;133</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/project/create.py#L140-L141">140&ndash;141</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/project/load.py">load.py</a></td><td>23</td><td>3</td><td>89%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/project/load.py#L43-L45">43&ndash;45</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/project/open.py">open.py</a></td><td>14</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/project/project.py">project.py</a></td><td>68</td><td>3</td><td>94%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/project/project.py#L118">118</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/project/project.py#L152">152</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/project/project.py#L156">156</a></td></tr><tr><td colspan="5"><b>venv/lib/python3.12/site-packages/skore/sklearn</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/__init__.py">\_\_init\_\_.py</a></td><td>4</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_base.py">_base.py</a></td><td>140</td><td>2</td><td>98%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_base.py#L171-L>176">171&ndash;>176</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_base.py#L186-L187">186&ndash;187</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/find_ml_task.py">find_ml_task.py</a></td><td>35</td><td>0</td><td>97%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/find_ml_task.py#L41-L>49">41&ndash;>49</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/find_ml_task.py#L47-L>49">47&ndash;>49</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/types.py">types.py</a></td><td>2</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td colspan="5"><b>venv/lib/python3.12/site-packages/skore/sklearn/_estimator</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_estimator/__init__.py">\_\_init\_\_.py</a></td><td>10</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_estimator/metrics_accessor.py">metrics_accessor.py</a></td><td>265</td><td>4</td><td>97%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_estimator/metrics_accessor.py#L149-L158">149&ndash;158</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_estimator/metrics_accessor.py#L183-L>236">183&ndash;>236</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_estimator/metrics_accessor.py#L191">191</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_estimator/metrics_accessor.py#L434-L>437">434&ndash;>437</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_estimator/metrics_accessor.py#L783-L>786">783&ndash;>786</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_estimator/report.py">report.py</a></td><td>116</td><td>0</td><td>99%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_estimator/report.py#L212-L>218">212&ndash;>218</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_estimator/report.py#L220-L>222">220&ndash;>222</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_estimator/utils.py">utils.py</a></td><td>11</td><td>11</td><td>0%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_estimator/utils.py#L1-L19">1&ndash;19</a></td></tr><tr><td colspan="5"><b>venv/lib/python3.12/site-packages/skore/sklearn/_plot</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_plot/__init__.py">\_\_init\_\_.py</a></td><td>4</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_plot/precision_recall_curve.py">precision_recall_curve.py</a></td><td>126</td><td>2</td><td>97%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_plot/precision_recall_curve.py#L200-L>203">200&ndash;>203</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_plot/precision_recall_curve.py#L313-L314">313&ndash;314</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_plot/prediction_error.py">prediction_error.py</a></td><td>75</td><td>0</td><td>99%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_plot/prediction_error.py#L289-L>297">289&ndash;>297</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_plot/roc_curve.py">roc_curve.py</a></td><td>95</td><td>3</td><td>94%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_plot/roc_curve.py#L156">156</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_plot/roc_curve.py#L167-L>170">167&ndash;>170</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_plot/roc_curve.py#L223-L224">223&ndash;224</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/_plot/utils.py">utils.py</a></td><td>77</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td colspan="5"><b>venv/lib/python3.12/site-packages/skore/sklearn/cross_validation</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/cross_validation/__init__.py">\_\_init\_\_.py</a></td><td>2</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/cross_validation/cross_validation_helpers.py">cross_validation_helpers.py</a></td><td>47</td><td>4</td><td>90%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/cross_validation/cross_validation_helpers.py#L104-L>136">104&ndash;>136</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/cross_validation/cross_validation_helpers.py#L123-L126">123&ndash;126</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/cross_validation/cross_validation_reporter.py">cross_validation_reporter.py</a></td><td>35</td><td>1</td><td>95%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/cross_validation/cross_validation_reporter.py#L177">177</a></td></tr><tr><td colspan="5"><b>venv/lib/python3.12/site-packages/skore/sklearn/cross_validation/plots</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/cross_validation/plots/__init__.py">\_\_init\_\_.py</a></td><td>0</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/cross_validation/plots/compare_scores_plot.py">compare_scores_plot.py</a></td><td>29</td><td>1</td><td>92%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/cross_validation/plots/compare_scores_plot.py#L10">10</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/cross_validation/plots/compare_scores_plot.py#L45-L>48">45&ndash;>48</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/cross_validation/plots/timing_plot.py">timing_plot.py</a></td><td>29</td><td>1</td><td>94%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/cross_validation/plots/timing_plot.py#L10">10</a></td></tr><tr><td colspan="5"><b>venv/lib/python3.12/site-packages/skore/sklearn/train_test_split</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/train_test_split/__init__.py">\_\_init\_\_.py</a></td><td>0</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/train_test_split/train_test_split.py">train_test_split.py</a></td><td>36</td><td>2</td><td>94%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/train_test_split/train_test_split.py#L16-L17">16&ndash;17</a></td></tr><tr><td colspan="5"><b>venv/lib/python3.12/site-packages/skore/sklearn/train_test_split/warning</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/train_test_split/warning/__init__.py">\_\_init\_\_.py</a></td><td>8</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/train_test_split/warning/high_class_imbalance_too_few_examples_warning.py">high_class_imbalance_too_few_examples_warning.py</a></td><td>17</td><td>3</td><td>78%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/train_test_split/warning/high_class_imbalance_too_few_examples_warning.py#L16-L18">16&ndash;18</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/train_test_split/warning/high_class_imbalance_too_few_examples_warning.py#L80">80</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/train_test_split/warning/high_class_imbalance_warning.py">high_class_imbalance_warning.py</a></td><td>18</td><td>2</td><td>88%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/train_test_split/warning/high_class_imbalance_warning.py#L16-L18">16&ndash;18</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/train_test_split/warning/random_state_unset_warning.py">random_state_unset_warning.py</a></td><td>11</td><td>1</td><td>87%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/train_test_split/warning/random_state_unset_warning.py#L15">15</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/train_test_split/warning/shuffle_true_warning.py">shuffle_true_warning.py</a></td><td>9</td><td>0</td><td>91%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/train_test_split/warning/shuffle_true_warning.py#L44-L>exit">44&ndash;>exit</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/train_test_split/warning/stratify_is_set_warning.py">stratify_is_set_warning.py</a></td><td>11</td><td>1</td><td>87%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/train_test_split/warning/stratify_is_set_warning.py#L15">15</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/train_test_split/warning/time_based_column_warning.py">time_based_column_warning.py</a></td><td>22</td><td>1</td><td>89%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/train_test_split/warning/time_based_column_warning.py#L17">17</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/train_test_split/warning/time_based_column_warning.py#L69-L>exit">69&ndash;>exit</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/train_test_split/warning/train_test_split_warning.py">train_test_split_warning.py</a></td><td>5</td><td>1</td><td>80%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/sklearn/train_test_split/warning/train_test_split_warning.py#L21">21</a></td></tr><tr><td colspan="5"><b>venv/lib/python3.12/site-packages/skore/ui</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/ui/__init__.py">\_\_init\_\_.py</a></td><td>0</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/ui/app.py">app.py</a></td><td>25</td><td>5</td><td>71%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/ui/app.py#L24">24</a>, <a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/ui/app.py#L53-L58">53&ndash;58</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/ui/dependencies.py">dependencies.py</a></td><td>7</td><td>1</td><td>86%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/ui/dependencies.py#L12">12</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/ui/project_routes.py">project_routes.py</a></td><td>50</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td colspan="5"><b>venv/lib/python3.12/site-packages/skore/utils</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/utils/__init__.py">\_\_init\_\_.py</a></td><td>0</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/utils/_accessor.py">_accessor.py</a></td><td>7</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/utils/_logger.py">_logger.py</a></td><td>21</td><td>4</td><td>84%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/utils/_logger.py#L14-L18">14&ndash;18</a></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/utils/_progress_bar.py">_progress_bar.py</a></td><td>28</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/utils/_show_versions.py">_show_versions.py</a></td><td>31</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td colspan="5"><b>venv/lib/python3.12/site-packages/skore/view</b></td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/view/__init__.py">\_\_init\_\_.py</a></td><td>0</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/view/view.py">view.py</a></td><td>5</td><td>0</td><td>100%</td><td>&nbsp;</td></tr><tr><td>&nbsp; &nbsp;<a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/view/view_repository.py">view_repository.py</a></td><td>16</td><td>2</td><td>83%</td><td><a href="https://github.com/probabl-ai/skore/blob/dbd2f51e25ca3ae7435fff6bf0e0be45a284537a/venv/lib/python3.12/site-packages/skore/view/view_repository.py#L8-L9">8&ndash;9</a></td></tr><tr><td><b>TOTAL</b></td><td><b>2371</b></td><td><b>144</b></td><td><b>93%</b></td><td>&nbsp;</td></tr></tbody></table></details>

| Tests | Skipped | Failures | Errors | Time |
| ----- | ------- | -------- | -------- | ------------------ |
| 443 | 3 :zzz: | 0 :x: | 0 :fire: | 1m 50s :stopwatch: |


Patch:
diff --git a/skore/src/skore/__init__.py b/skore/src/skore/__init__.py
index d63f169..7a5bf2e 100644
--- a/skore/src/skore/__init__.py
+++ b/skore/src/skore/__init__.py
@@ -1,14 +1,13 @@
 """Configure logging and global settings."""
 
 import logging
-import os
 
-from rich import jupyter
 from rich.console import Console
 from rich.theme import Theme
 
 from skore.project import Project, open
 from skore.sklearn import CrossValidationReporter, EstimatorReport, train_test_split
+from skore.utils._patch import setup_jupyter_display
 from skore.utils._show_versions import show_versions
 
 __all__ = [
@@ -20,54 +19,13 @@ __all__ = [
     "train_test_split",
 ]
 
-########################################################################################
-# FIXME: This is to make sure that the CSS style exposed by jupyter notebook and used
-# by ipywidgets is applied to rich output.
-# Currently, the VS Code extension does not support the CSS style exposed by jupyter
-# notebook and used by ipywidgets.
-# We should track the progress in the following issue:
-# https://github.com/microsoft/vscode-jupyter/issues/7161
-########################################################################################
-
-# Store the original display function
-original_display = jupyter.display
-
-
-def patched_display(segments, text):
-    """Patched version of rich.jupyter.display that includes VS Code styling."""
-    # Call the original display function first
-    original_display(segments, text)
-
-    # Apply VS Code styling if we're in VS Code
-    if "VSCODE_PID" in os.environ:
-        from IPython.display import HTML, display
-
-        css = """
-        <style>
-        .cell-output-ipywidget-background {
-            background-color: transparent !important;
-        }
-        :root {
-            --jp-widgets-color: var(--vscode-editor-foreground);
-            --jp-widgets-font-size: var(--vscode-editor-font-size);
-        }
-        </style>
-        """
-        display(HTML(css))
-
-
-# Patch the display function
-jupyter.display = patched_display
-
-########################################################################################
-# End of the temporary patch
-########################################################################################
-
-
 logger = logging.getLogger(__name__)
 logger.addHandler(logging.NullHandler())  # Default to no output
 logger.setLevel(logging.INFO)
 
+# Configure jupyter display for VS Code compatibility
+setup_jupyter_display()
+
 skore_console_theme = Theme(
     {
         "repr.str": "cyan",
diff --git a/skore/src/skore/item/item_repository.py b/skore/src/skore/item/item_repository.py
index 96df231..b00d481 100644
--- a/skore/src/skore/item/item_repository.py
+++ b/skore/src/skore/item/item_repository.py
@@ -180,7 +180,9 @@ class ItemRepository:
             raise TypeError(f"Message should be a string; got {type(message)}")
 
         try:
-            self.storage[key][version]["item"]["note"] = message
+            old = self.storage[key]
+            old[version]["item"]["note"] = message
+            self.storage[key] = old
         except IndexError as e:
             raise KeyError((key, version)) from e
 
@@ -202,7 +204,7 @@ class ItemRepository:
         Raises
         ------
         KeyError
-            If no note is attached to the ``(key, version)`` couple.
+            If the ``(key, version)`` couple does not exist.
         """
         try:
             return self.storage[key][version]["item"]["note"]
@@ -223,9 +225,11 @@ class ItemRepository:
         Raises
         ------
         KeyError
-            If no note is attached to the ``(key, version)`` couple.
+            If the ``(key, version)`` couple does not exist.
         """
         try:
-            self.storage[key][version]["item"]["note"] = None
+            old = self.storage[key]
+            old[version]["item"]["note"] = None
+            self.storage[key] = old
         except IndexError as e:
             raise KeyError((key, version)) from e
diff --git a/skore/src/skore/sklearn/_base.py b/skore/src/skore/sklearn/_base.py
index a9a262a..e8089fe 100644
--- a/skore/src/skore/sklearn/_base.py
+++ b/skore/src/skore/sklearn/_base.py
@@ -88,7 +88,7 @@ class _BaseReport(_HelpMixin):
     def _get_help_panel_title(self):
         return (
             f"[bold cyan]Tools to diagnose estimator "
-            f"{self.estimator_name}[/bold cyan]"
+            f"{self.estimator_name_}[/bold cyan]"
         )
 
     def _get_help_legend(self):
@@ -230,7 +230,7 @@ class _BaseAccessor(_HelpMixin):
             The hash of the data source. None when we are able to track the data, and
             thus relying on X_train, y_train, X_test, y_test.
         """
-        is_cluster = is_clusterer(self._parent.estimator)
+        is_cluster = is_clusterer(self._parent.estimator_)
         if data_source == "test":
             if not (X is None or y is None):
                 raise ValueError("X and y must be None when data_source is test.")
diff --git a/skore/src/skore/sklearn/_base.pyi b/skore/src/skore/sklearn/_base.pyi
index 155db3d..5bc3ffd 100644
--- a/skore/src/skore/sklearn/_base.pyi
+++ b/skore/src/skore/sklearn/_base.pyi
@@ -46,7 +46,8 @@ def _get_cached_response_values(
 
 class _BaseReport(_HelpMixin):
     _ACCESSOR_CONFIG: dict[str, dict[str, str]]
-    estimator_name: str
+    estimator_: BaseEstimator
+    estimator_name_: str
     _X_test: Optional[np.ndarray]
     _y_test: Optional[np.ndarray]
     _X_train: Optional[np.ndarray]
diff --git a/skore/src/skore/sklearn/_estimator/metrics_accessor.py b/skore/src/skore/sklearn/_estimator/metrics_accessor.py
index 934fc4f..1023ad8 100644
--- a/skore/src/skore/sklearn/_estimator/metrics_accessor.py
+++ b/skore/src/skore/sklearn/_estimator/metrics_accessor.py
@@ -316,7 +316,7 @@ class _MetricsAccessor(_BaseAccessor, DirNamesMixin):
             y_pred = _get_cached_response_values(
                 cache=self._parent._cache,
                 estimator_hash=self._parent._hash,
-                estimator=self._parent.estimator,
+                estimator=self._parent.estimator_,
                 X=X,
                 response_method=response_method,
                 pos_label=pos_label,
@@ -357,7 +357,9 @@ class _MetricsAccessor(_BaseAccessor, DirNamesMixin):
                 score = score.reshape(1, -1)
         else:  # unknown task - try our best
             columns = [metric_name] if score.shape[0] == 1 else None
-        return pd.DataFrame(score, columns=columns, index=[self._parent.estimator_name])
+        return pd.DataFrame(
+            score, columns=columns, index=[self._parent.estimator_name_]
+        )
 
     @available_if(
         _check_supported_ml_task(
@@ -1472,7 +1474,7 @@ class _PlotMetricsAccessor(_BaseAccessor):
             y_pred = _get_cached_response_values(
                 cache=self._parent._cache,
                 estimator_hash=self._parent._hash,
-                estimator=self._parent.estimator,
+                estimator=self._parent.estimator_,
                 X=X,
                 response_method=response_method,
                 data_source=data_source,
@@ -1483,8 +1485,8 @@ class _PlotMetricsAccessor(_BaseAccessor):
             display = display_class._from_predictions(
                 y,
                 y_pred,
-                estimator=self._parent.estimator,
-                estimator_name=self._parent.estimator_name,
+                estimator=self._parent.estimator_,
+                estimator_name=self._parent.estimator_name_,
                 ml_task=self._parent._ml_task,
                 data_source=data_source,
                 **display_kwargs,
diff --git a/skore/src/skore/sklearn/_estimator/report.py b/skore/src/skore/sklearn/_estimator/report.py
index 7bf3f75..e34ce31 100644
--- a/skore/src/skore/sklearn/_estimator/report.py
+++ b/skore/src/skore/sklearn/_estimator/report.py
@@ -48,6 +48,12 @@ class EstimatorReport(_BaseReport, DirNamesMixin):
 
     Attributes
     ----------
+    estimator_ : estimator object
+        The cloned or copied estimator.
+
+    estimator_name_ : str
+        The name of the estimator.
+
     metrics : _MetricsAccessor
         Accessor for metrics-related operations.
 
@@ -243,11 +249,11 @@ class EstimatorReport(_BaseReport, DirNamesMixin):
             progress.update(task, advance=1, refresh=True)
 
     @property
-    def estimator(self):
+    def estimator_(self):
         return self._estimator
 
-    @estimator.setter
-    def estimator(self, value):
+    @estimator_.setter
+    def estimator_(self, value):
         raise AttributeError(
             "The estimator attribute is immutable. "
             f"Call the constructor of {self.__class__.__name__} to create a new report."
@@ -294,7 +300,7 @@ class EstimatorReport(_BaseReport, DirNamesMixin):
         self._initialize_state()
 
     @property
-    def estimator_name(self):
+    def estimator_name_(self):
         if isinstance(self._estimator, Pipeline):
             name = self._estimator[-1].__class__.__name__
         else:
diff --git a/skore/src/skore/sklearn/_estimator/utils.py b/skore/src/skore/sklearn/_estimator/utils.py
index 578fab6..aa89df0 100644
--- a/skore/src/skore/sklearn/_estimator/utils.py
+++ b/skore/src/skore/sklearn/_estimator/utils.py
@@ -3,7 +3,7 @@ from sklearn.pipeline import Pipeline
 
 def _check_supported_estimator(supported_estimators):
     def check(accessor):
-        estimator = accessor._parent.estimator
+        estimator = accessor._parent.estimator_
         if isinstance(estimator, Pipeline):
             estimator = estimator.steps[-1][1]
         supported_estimator = isinstance(estimator, supported_estimators)
diff --git a/skore/src/skore/utils/_patch.py b/skore/src/skore/utils/_patch.py
new file mode 100644
index 0000000..765f8d8
--- /dev/null
+++ b/skore/src/skore/utils/_patch.py
@@ -0,0 +1,42 @@
+import os
+
+from rich import jupyter
+
+original_display = jupyter.display
+
+
+def patched_display(segments, text):
+    """Patched version of rich.jupyter.display that includes VS Code styling.
+
+    This is to make sure that the CSS style exposed by jupyter notebook and used
+    by ipywidgets is applied to rich output.
+    Currently, the VS Code extension does not support the CSS style exposed by jupyter
+    notebook and used by ipywidgets.
+    We should track the progress in the following issue:
+    https://github.com/microsoft/vscode-jupyter/issues/7161
+
+    """
+    # Call the original display function first
+    original_display(segments, text)
+
+    # Apply VS Code styling if we're in VS Code
+    if "VSCODE_PID" in os.environ:
+        from IPython.display import HTML, display
+
+        css = """
+        <style>
+        .cell-output-ipywidget-background {
+            background-color: transparent !important;
+        }
+        :root {
+            --jp-widgets-color: var(--vscode-editor-foreground);
+            --jp-widgets-font-size: var(--vscode-editor-font-size);
+        }
+        </style>
+        """
+        display(HTML(css))
+
+
+def setup_jupyter_display():
+    """Configure the jupyter display to work properly in VS Code."""
+    jupyter.display = patched_display


Test patch:
diff --git a/skore/tests/conftest.py b/skore/tests/conftest.py
index 82f8a2b..3260b03 100644
--- a/skore/tests/conftest.py
+++ b/skore/tests/conftest.py
@@ -1,6 +1,7 @@
 from datetime import datetime, timezone
 
 import pytest
+import skore
 from skore.item.item_repository import ItemRepository
 from skore.persistence.in_memory_storage import InMemoryStorage
 from skore.project import Project
@@ -46,6 +47,12 @@ def in_memory_project():
     )
 
 
+@pytest.fixture
+def on_disk_project(tmp_path):
+    project = skore.open(tmp_path / "project")
+    return project
+
+
 @pytest.fixture(scope="function")
 def pyplot():
     """Setup and teardown fixture for matplotlib.
diff --git a/skore/tests/unit/project/test_notes.py b/skore/tests/unit/project/test_notes.py
index b885b61..e2b3929 100644
--- a/skore/tests/unit/project/test_notes.py
+++ b/skore/tests/unit/project/test_notes.py
@@ -3,76 +3,95 @@
 import pytest
 
 
-def test_set_note(in_memory_project):
-    in_memory_project.put("key", "hello")
-    in_memory_project.set_note("key", "message")
-    assert in_memory_project.get_note("key") == "message"
+@pytest.mark.parametrize(
+    "project_fixture",
+    [
+        "in_memory_project",
+        "on_disk_project",
+    ],
+)
+class TestNotes:
+    def test_set_note(self, project_fixture, request):
+        project = request.getfixturevalue(project_fixture)
 
+        project.put("key", "hello")
+        project.set_note("key", "message")
+        assert project.get_note("key") == "message"
 
-def test_set_note_version(in_memory_project):
-    """By default, `set_note` only attaches a message to the latest version
-    of a key."""
-    in_memory_project.put("key", "hello")
-    in_memory_project.put("key", "goodbye")
-    in_memory_project.set_note("key", "message")
-    assert in_memory_project.get_note("key", version=-1) == "message"
-    assert in_memory_project.get_note("key", version=0) is None
+    def test_set_note_version(self, project_fixture, request):
+        """By default, `set_note` only attaches a message to the latest version
+        of a key."""
+        project = request.getfixturevalue(project_fixture)
 
+        project.put("key", "hello")
+        project.put("key", "goodbye")
+        project.set_note("key", "message")
+        assert project.get_note("key", version=-1) == "message"
+        assert project.get_note("key", version=0) is None
 
-def test_set_note_no_key(in_memory_project):
-    with pytest.raises(KeyError):
-        in_memory_project.set_note("key", "hello")
+    def test_set_note_no_key(self, project_fixture, request):
+        project = request.getfixturevalue(project_fixture)
 
-    in_memory_project.put("key", "hello")
+        with pytest.raises(KeyError):
+            project.set_note("key", "hello")
 
-    with pytest.raises(KeyError):
-        in_memory_project.set_note("key", "hello", version=10)
+        project.put("key", "hello")
 
+        with pytest.raises(KeyError):
+            project.set_note("key", "hello", version=10)
 
-def test_set_note_not_strings(in_memory_project):
-    """If key or message is not a string, raise a TypeError."""
-    with pytest.raises(TypeError):
-        in_memory_project.set_note(1, "hello")
+    def test_set_note_not_strings(self, project_fixture, request):
+        """If key or message is not a string, raise a TypeError."""
+        project = request.getfixturevalue(project_fixture)
 
-    with pytest.raises(TypeError):
-        in_memory_project.set_note("key", 1)
+        with pytest.raises(TypeError):
+            project.set_note(1, "hello")
 
+        with pytest.raises(TypeError):
+            project.set_note("key", 1)
 
-def test_delete_note(in_memory_project):
-    in_memory_project.put("key", "hello")
-    in_memory_project.set_note("key", "message")
-    in_memory_project.delete_note("key")
-    assert in_memory_project.get_note("key") is None
+    def test_delete_note(self, project_fixture, request):
+        project = request.getfixturevalue(project_fixture)
 
+        project.put("key", "hello")
+        project.set_note("key", "message")
+        project.delete_note("key")
+        assert project.get_note("key") is None
 
-def test_delete_note_no_key(in_memory_project):
-    with pytest.raises(KeyError):
-        in_memory_project.delete_note("key")
+    def test_delete_note_no_key(self, project_fixture, request):
+        project = request.getfixturevalue(project_fixture)
 
-    in_memory_project.put("key", "hello")
+        with pytest.raises(KeyError):
+            project.delete_note("key")
 
-    with pytest.raises(KeyError):
-        in_memory_project.set_note("key", "hello", version=10)
+        project.put("key", "hello")
 
+        with pytest.raises(KeyError):
+            project.set_note("key", "hello", version=10)
 
-def test_delete_note_no_note(in_memory_project):
-    in_memory_project.put("key", "hello")
-    assert in_memory_project.get_note("key") is None
+    def test_delete_note_no_note(self, project_fixture, request):
+        project = request.getfixturevalue(project_fixture)
 
+        project.put("key", "hello")
+        assert project.get_note("key") is None
 
-def test_put_with_note(in_memory_project):
-    in_memory_project.put("key", "hello", note="note")
-    assert in_memory_project.get_note("key") == "note"
+    def test_put_with_note(self, project_fixture, request):
+        project = request.getfixturevalue(project_fixture)
 
+        project.put("key", "hello", note="note")
+        assert project.get_note("key") == "note"
 
-def test_put_with_note_annotates_latest(in_memory_project):
-    """Adding the `note` argument annotates the latest version of the item."""
-    in_memory_project.put("key", "hello")
-    in_memory_project.put("key", "goodbye", note="note")
-    assert in_memory_project.get_note("key", version=0) is None
+    def test_put_with_note_annotates_latest(self, project_fixture, request):
+        """Adding the `note` argument annotates the latest version of the item."""
+        project = request.getfixturevalue(project_fixture)
 
+        project.put("key", "hello")
+        project.put("key", "goodbye", note="note")
+        assert project.get_note("key", version=0) is None
 
-def test_put_with_note_wrong_type(in_memory_project):
-    """Adding the `note` argument annotates the latest version of the item."""
-    with pytest.raises(TypeError):
-        in_memory_project.put("key", "hello", note=0)
+    def test_put_with_note_wrong_type(self, project_fixture, request):
+        """Adding the `note` argument annotates the latest version of the item."""
+        project = request.getfixturevalue(project_fixture)
+
+        with pytest.raises(TypeError):
+            project.put("key", "hello", note=0)
diff --git a/skore/tests/unit/sklearn/test_base.py b/skore/tests/unit/sklearn/test_base.py
index 0f6b12b..53b4b84 100644
--- a/skore/tests/unit/sklearn/test_base.py
+++ b/skore/tests/unit/sklearn/test_base.py
@@ -186,7 +186,7 @@ class MockReport:
         self._y_test = y_test
 
     @property
-    def estimator(self):
+    def estimator_(self):
         return self._estimator
 
     @property
diff --git a/skore/tests/unit/sklearn/test_estimator.py b/skore/tests/unit/sklearn/test_estimator.py
index 55adf53..ac7ba02 100644
--- a/skore/tests/unit/sklearn/test_estimator.py
+++ b/skore/tests/unit/sklearn/test_estimator.py
@@ -113,7 +113,7 @@ def test_check_supported_estimator():
 
     class MockParent:
         def __init__(self, estimator):
-            self.estimator = estimator
+            self.estimator_ = estimator
 
     class MockAccessor:
         def __init__(self, parent):
@@ -170,8 +170,8 @@ def test_estimator_report_from_unfitted_estimator(fit):
         y_test=y_test,
     )
 
-    check_is_fitted(report.estimator)
-    assert report.estimator is not estimator  # the estimator should be cloned
+    check_is_fitted(report.estimator_)
+    assert report.estimator_ is not estimator  # the estimator should be cloned
 
     assert report.X_train is X_train
     assert report.y_train is y_train
@@ -180,7 +180,7 @@ def test_estimator_report_from_unfitted_estimator(fit):
 
     err_msg = "attribute is immutable"
     with pytest.raises(AttributeError, match=err_msg):
-        report.estimator = LinearRegression()
+        report.estimator_ = LinearRegression()
     with pytest.raises(AttributeError, match=err_msg):
         report.X_train = X_train
     with pytest.raises(AttributeError, match=err_msg):
@@ -194,8 +194,8 @@ def test_estimator_report_from_fitted_estimator(binary_classification_data, fit)
     estimator, X, y = binary_classification_data
     report = EstimatorReport(estimator, fit=fit, X_test=X, y_test=y)
 
-    check_is_fitted(report.estimator)
-    assert isinstance(report.estimator, RandomForestClassifier)
+    check_is_fitted(report.estimator_)
+    assert isinstance(report.estimator_, RandomForestClassifier)
     assert report.X_train is None
     assert report.y_train is None
     assert report.X_test is X
@@ -203,7 +203,7 @@ def test_estimator_report_from_fitted_estimator(binary_classification_data, fit)
 
     err_msg = "attribute is immutable"
     with pytest.raises(AttributeError, match=err_msg):
-        report.estimator = LinearRegression()
+        report.estimator_ = LinearRegression()
     with pytest.raises(AttributeError, match=err_msg):
         report.X_train = X
     with pytest.raises(AttributeError, match=err_msg):
@@ -217,9 +217,9 @@ def test_estimator_report_from_fitted_pipeline(binary_classification_data_pipeli
     estimator, X, y = binary_classification_data_pipeline
     report = EstimatorReport(estimator, X_test=X, y_test=y)
 
-    check_is_fitted(report.estimator)
-    assert isinstance(report.estimator, Pipeline)
-    assert report.estimator_name == estimator[-1].__class__.__name__
+    check_is_fitted(report.estimator_)
+    assert isinstance(report.estimator_, Pipeline)
+    assert report.estimator_name_ == estimator[-1].__class__.__name__
     assert report.X_train is None
     assert report.y_train is None
     assert report.X_test is X
@@ -1140,9 +1140,9 @@ def test_estimator_has_side_effects(prefit_estimator):
         y_test=y_test,
     )
 
-    predictions_before = report.estimator.predict_proba(X_test)
+    predictions_before = report.estimator_.predict_proba(X_test)
     estimator.fit(X_test, y_test)
-    predictions_after = report.estimator.predict_proba(X_test)
+    predictions_after = report.estimator_.predict_proba(X_test)
     np.testing.assert_array_equal(predictions_before, predictions_after)