I'm using an org file like this one:

    * Simu

    `simu` is a program to simulate counting up to a certain number.

    The program has two main parts:

    ** Gathering input

    We simply get the first parameter, panicking if there is nothing specified.

    #+name: gather-input
    #+begin_src rust :noweb yes :comments noweb
    let args: Vec<String> = env::args().collect();
    if args.len() < 2 {
        panic!("No argument provided");
    }
    <<parse-input>>
    #+end_src

    This uses the `env` package, so we should add it:

    #+name: imports
    #+begin_src rust :noweb yes :comments link
    use std::env;
    #+end_src

    The input is provided as a string, so we need to parse, and report error if it fails.

    #+name: parse-input
    #+begin_src rust :noweb yes :comments link
    let count = args[1].parse::<i32>().unwrap();
    #+end_src

    ** Counting up to the number

    The loop is pretty straigforward:

    #+name: count
    #+begin_src rust :noweb yes :comments noweb
    let mut i = 0;
    while i < count {
        <<print-current-number>>
        i = i+1;
    }
    #+end_src

    Displaying the counter is a matter of presentation:

    #+name: print-current-number
    #+begin_src rust :noweb yes :comments link
    println!("Current number is {}", i);
    #+end_src

    ** Tying things up

    #+name: main
    #+begin_src rust :tangle main.rs :noweb yes :comments noweb
    <<imports>>
    fn main() {
        <<gather-input>>
        <<count>>
    }
    #+end_src

When using org-babel-tangle, a file is generated with this content:

    // [[file:simu.org::main][main]]
    // [[file:simu.org::imports][imports]]
    use std::env;
    // imports ends here
    fn main() {
        // [[file:simu.org::gather-input][gather-input]]
        let args: Vec<String> = env::args().collect();
        if args.len() < 2 {
            panic!("No argument provided");
        }
        // [[file:simu.org::parse-input][parse-input]]
        let count = args[1].parse::<i32>().unwrap();
        // parse-input ends here
        // gather-input ends here
        // [[file:simu.org::count][count]]
        let mut i = 0;
        while i < count {
            // [[file:simu.org::print-current-number][print-current-number]]
            println!("Current number is {}", i);
            // print-current-number ends here
            i = i+1;
        }
        // count ends here
    }
    // main ends here

When I visit the generated file, modify it, and I run
org-babel-detangle, I'm execting the org file to be changed.

Instead, I always get the error "Not in tangled code"

If instead I annotate my blocks with :comments links , then I don't even
get any comments in the generated file.

I supposed it's related to using noweb expansion.

What am I doing wrong ?

Emacs  : GNU Emacs 28.1 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.33, cairo version 1.16.0)
 of 2022-05-31
Package: Org mode version 9.6.1 (9.6.1-??-fe92a3c @ /home/phtrivier/.emacs.d/.local/straight/build-28.1/org/)