[INFO] cloning repository https://github.com/VolareNJ/train_record
[INFO] running `Command { std: "git" "-c" "credential.helper=" "-c" "credential.helper=/workspace/cargo-home/bin/git-credential-null" "clone" "--bare" "https://github.com/VolareNJ/train_record" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FVolareNJ%2Ftrain_record", kill_on_drop: false }`
[INFO] [stderr] Cloning into bare repository '/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FVolareNJ%2Ftrain_record'...
[INFO] running `Command { std: "git" "rev-parse" "HEAD", kill_on_drop: false }`
[INFO] [stdout] 679586f177e64f10e58b250981a3146c4a2ec8e8
[INFO] documenting VolareNJ/train_record against 1.99.0-beta.1 for beta-rustdoc-1.99-1
[INFO] running `Command { std: "git" "clone" "/workspace/cache/git-repos/https%3A%2F%2Fgithub.com%2FVolareNJ%2Ftrain_record" "/workspace/builds/worker-2-tc2/source", kill_on_drop: false }`
[INFO] [stderr] Cloning into '/workspace/builds/worker-2-tc2/source'...
[INFO] [stderr] done.
[INFO] removed /workspace/builds/worker-2-tc2/source/rust-toolchain.toml
[INFO] started tweaking git repo https://github.com/VolareNJ/train_record
[INFO] finished tweaking git repo https://github.com/VolareNJ/train_record
[INFO] tweaked toml for git repo https://github.com/VolareNJ/train_record written to /workspace/builds/worker-2-tc2/source/Cargo.toml
[INFO] validating manifest of git repo https://github.com/VolareNJ/train_record on toolchain 1.99.0-beta.1
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.99.0-beta.1" "metadata" "--manifest-path" "Cargo.toml" "--no-deps", kill_on_drop: false }`
[INFO] crate git repo https://github.com/VolareNJ/train_record already has a lockfile, it will not be regenerated
[INFO] running `Command { std: CARGO_HOME="/workspace/cargo-home" RUSTUP_HOME="/workspace/rustup-home" "/workspace/cargo-home/bin/cargo" "+1.99.0-beta.1" "fetch" "--manifest-path" "Cargo.toml", kill_on_drop: false }`
[INFO] [stderr]     Blocking waiting for file lock on package cache
[INFO] [stderr]     Blocking waiting for file lock on package cache
[INFO] running `Command { std: "docker" "create" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc2/source:/opt/rustwide/workdir:ro,Z" "-v" "/var/lib/crater-agent-workspace/builds/worker-2-tc2/target:/opt/rustwide/target:rw,Z" "-v" "/var/lib/crater-agent-workspace/cargo-home:/opt/rustwide/cargo-home:ro,Z" "-v" "/var/lib/crater-agent-workspace/rustup-home:/opt/rustwide/rustup-home:ro,Z" "-m" "1610612736" "--network" "none" "ghcr.io/rust-lang/crates-build-env/linux@sha256:00c5645b54fe3ce5dae1417175e3c7fb6a6646c021d554ecd63a097b8b9f3602" "sleep" "infinity", kill_on_drop: false }`
[INFO] [stdout] 626f444fbf7fda5e6318ac848e674643d06ebe5a07b049b25629bb4d0a61b702
[INFO] running `Command { std: "docker" "start" "626f444fbf7fda5e6318ac848e674643d06ebe5a07b049b25629bb4d0a61b702", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "626f444fbf7fda5e6318ac848e674643d06ebe5a07b049b25629bb4d0a61b702", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-w" "/opt/rustwide/workdir" "--user" "0:0" "626f444fbf7fda5e6318ac848e674643d06ebe5a07b049b25629bb4d0a61b702" "/opt/rustwide/cargo-home/bin/cargo" "+1.99.0-beta.1" "metadata" "--no-deps" "--format-version=1", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "inspect" "626f444fbf7fda5e6318ac848e674643d06ebe5a07b049b25629bb4d0a61b702", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "exec" "-e" "SOURCE_DIR=/opt/rustwide/workdir" "-e" "CARGO_HOME=/opt/rustwide/cargo-home" "-e" "RUSTUP_HOME=/opt/rustwide/rustup-home" "-e" "CARGO_TARGET_DIR=/opt/rustwide/target" "-e" "CARGO_INCREMENTAL=0" "-e" "RUST_BACKTRACE=full" "-e" "RUSTFLAGS=--cap-lints=warn" "-e" "RUSTDOCFLAGS=--cap-lints=warn" "-w" "/opt/rustwide/workdir" "--user" "0:0" "626f444fbf7fda5e6318ac848e674643d06ebe5a07b049b25629bb4d0a61b702" "/opt/rustwide/cargo-home/bin/cargo" "+1.99.0-beta.1" "doc" "--frozen" "--no-deps" "--document-private-items" "--message-format=json", kill_on_drop: false }`
[INFO] [stderr]    Compiling proc-macro2 v1.0.107
[INFO] [stderr]    Compiling quote v1.0.47
[INFO] [stderr]    Compiling libc v0.2.189
[INFO] [stderr]    Compiling serde v1.0.229
[INFO] [stderr]     Checking smallvec v1.15.2
[INFO] [stderr]    Compiling stable_deref_trait v1.2.1
[INFO] [stderr]     Checking futures-core v0.3.33
[INFO] [stderr]     Checking bytes v1.12.1
[INFO] [stderr]    Compiling serde_core v1.0.229
[INFO] [stderr]     Checking futures-sink v0.3.33
[INFO] [stderr]    Compiling memchr v2.8.3
[INFO] [stderr]    Compiling litemap v0.8.2
[INFO] [stderr]    Compiling writeable v0.6.3
[INFO] [stderr]    Compiling shlex v2.0.1
[INFO] [stderr]    Compiling crossbeam-utils v0.8.22
[INFO] [stderr]    Compiling pin-project-lite v0.2.17
[INFO] [stderr]    Compiling autocfg v1.5.1
[INFO] [stderr]    Compiling cc v1.4.0
[INFO] [stderr]    Compiling serde_json v1.0.151
[INFO] [stderr]    Compiling thiserror v2.0.19
[INFO] [stderr]    Compiling typenum v1.20.1
[INFO] [stderr]     Checking generic-array v0.14.9
[INFO] [stderr]    Compiling icu_normalizer_data v2.2.0
[INFO] [stderr]    Compiling icu_properties_data v2.2.0
[INFO] [stderr]     Checking futures-io v0.3.33
[INFO] [stderr]     Checking futures-task v0.3.33
[INFO] [stderr]     Checking log v0.4.33
[INFO] [stderr]     Checking slab v0.4.12
[INFO] [stderr]    Compiling once_cell v1.21.4
[INFO] [stderr]    Compiling foldhash v0.2.0
[INFO] [stderr]     Checking futures-util v0.3.33
[INFO] [stderr]    Compiling form_urlencoded v1.2.2
[INFO] [stderr]    Compiling hashbrown v0.16.1
[INFO] [stderr]    Compiling num-traits v0.2.19
[INFO] [stderr]    Compiling tracing-core v0.1.36
[INFO] [stderr]     Checking http v1.5.0
[INFO] [stderr]    Compiling zmij v1.0.23
[INFO] [stderr]    Compiling syn v3.0.3
[INFO] [stderr]    Compiling syn v2.0.119
[INFO] [stderr]     Checking block-buffer v0.10.4
[INFO] [stderr]     Checking crypto-common v0.1.6
[INFO] [stderr]    Compiling crc-catalog v2.5.0
[INFO] [stderr]    Compiling itoa v1.0.18
[INFO] [stderr]     Checking digest v0.10.7
[INFO] [stderr]    Compiling event-listener v5.4.2
[INFO] [stderr]    Compiling crc v3.4.0
[INFO] [stderr]    Compiling crossbeam-queue v0.3.13
[INFO] [stderr]    Compiling hashlink v0.11.1
[INFO] [stderr]     Checking http-body v1.1.0
[INFO] [stderr]    Compiling spin v0.9.9
[INFO] [stderr]     Checking futures-channel v0.3.33
[INFO] [stderr]    Compiling sha2 v0.10.9
[INFO] [stderr]    Compiling base64 v0.22.1
[INFO] [stderr]    Compiling flume v0.12.0
[INFO] [stderr]    Compiling winnow v1.0.4
[INFO] [stderr]     Checking parking_lot_core v0.9.12
[INFO] [stderr]     Checking errno v0.3.14
[INFO] [stderr]     Checking mio v1.2.2
[INFO] [stderr]     Checking signal-hook-registry v1.4.8
[INFO] [stderr]     Checking parking_lot v0.12.5
[INFO] [stderr]     Checking socket2 v0.6.5
[INFO] [stderr]    Compiling libsqlite3-sys v0.37.0
[INFO] [stderr]    Compiling atoi v2.0.0
[INFO] [stderr]    Compiling tokio v1.53.1
[INFO] [stderr]    Compiling rustc-hash v2.1.3
[INFO] [stderr]     Checking hashbrown v0.17.1
[INFO] [stderr]    Compiling futures-intrusive v0.5.0
[INFO] [stderr]     Checking getrandom v0.2.17
[INFO] [stderr]     Checking http-body-util v0.1.4
[INFO] [stderr]    Compiling glob v0.3.4
[INFO] [stderr]    Compiling getrandom v0.4.3
[INFO] [stderr]     Checking indexmap v2.14.0
[INFO] [stderr]     Checking rand_core v0.6.4
[INFO] [stderr]     Checking password-hash v0.5.0
[INFO] [stderr]     Checking deranged v0.5.8
[INFO] [stderr]     Checking serde_path_to_error v0.1.20
[INFO] [stderr]     Checking blake2 v0.10.6
[INFO] [stderr]     Checking tracing-log v0.2.0
[INFO] [stderr]     Checking thread_local v1.1.10
[INFO] [stderr]     Checking time-core v0.1.9
[INFO] [stderr]     Checking num-conv v0.2.2
[INFO] [stderr]     Checking bitflags v2.13.1
[INFO] [stderr]     Checking tracing-subscriber v0.3.23
[INFO] [stderr]     Checking argon2 v0.5.3
[INFO] [stderr]     Checking uuid v1.24.0
[INFO] [stderr]     Checking futures-executor v0.3.33
[INFO] [stderr]     Checking multer v3.1.0
[INFO] [stderr]    Compiling displaydoc v0.2.7
[INFO] [stderr]    Compiling serde_derive v1.0.229
[INFO] [stderr]    Compiling tokio-macros v2.7.2
[INFO] [stderr]    Compiling thiserror-impl v2.0.19
[INFO] [stderr]     Checking time v0.3.55
[INFO] [stderr]    Compiling synstructure v0.13.2
[INFO] [stderr]    Compiling zerovec-derive v0.11.3
[INFO] [stderr]    Compiling tracing-attributes v0.1.31
[INFO] [stderr]    Compiling zerofrom-derive v0.1.7
[INFO] [stderr]    Compiling yoke-derive v0.8.2
[INFO] [stderr]    Compiling tokio-stream v0.1.19
[INFO] [stderr]     Checking tracing v0.1.44
[INFO] [stderr]    Compiling zerofrom v0.1.8
[INFO] [stderr]     Checking axum-core v0.5.6
[INFO] [stderr]     Checking yoke v0.8.3
[INFO] [stderr]     Checking either v1.17.0
[INFO] [stderr]     Checking serde_urlencoded v0.7.1
[INFO] [stderr]     Checking zerovec v0.11.6
[INFO] [stderr]     Checking zerotrie v0.2.4
[INFO] [stderr]    Compiling askama_parser v0.16.0
[INFO] [stderr]    Compiling basic-toml v0.1.10
[INFO] [stderr]     Checking tinystr v0.8.3
[INFO] [stderr]     Checking potential_utf v0.1.5
[INFO] [stderr]    Compiling icu_collections v2.2.0
[INFO] [stderr]     Checking icu_locale_core v2.2.0
[INFO] [stderr]     Checking hyper v1.11.0
[INFO] [stderr]     Checking tokio-util v0.7.19
[INFO] [stderr]     Checking tower v0.5.3
[INFO] [stderr]     Checking tower-http v0.7.0
[INFO] [stderr]     Checking icu_provider v2.2.0
[INFO] [stderr]     Checking hyper-util v0.1.20
[INFO] [stderr]     Checking icu_normalizer v2.2.0
[INFO] [stderr]     Checking icu_properties v2.2.0
[INFO] [stderr]     Checking axum v0.8.9
[INFO] [stderr]     Checking idna_adapter v1.2.2
[INFO] [stderr]     Checking idna v1.1.0
[INFO] [stderr]     Checking url v2.5.8
[INFO] [stderr]     Checking sqlx-core v0.9.0
[INFO] [stderr]    Compiling askama_derive v0.16.0
[INFO] [stderr]     Checking sqlx-sqlite v0.9.0
[INFO] [stderr]    Compiling askama_macros v0.16.0
[INFO] [stderr]     Checking askama v0.16.0
[INFO] [stderr]    Compiling sqlx-macros-core v0.9.0
[INFO] [stderr]    Compiling sqlx-macros v0.9.0
[INFO] [stderr]     Checking sqlx v0.9.0
[INFO] [stderr]  Documenting train_record v0.1.0 (/opt/rustwide/workdir)
[INFO] [stdout] warning: unresolved link to `T`
[INFO] [stdout]    --> src/handlers/phases.rs:228:24
[INFO] [stdout]     |
[INFO] [stdout] 228 | ///   ① 标准库里 join 定义在 [T]（切片）上，不在 Iterator trait 上。
[INFO] [stdout]     |                               ^ no item named `T` in scope
[INFO] [stdout]     |
[INFO] [stdout]     = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]`
[INFO] [stdout]     = note: `#[warn(rustdoc::broken_intra_doc_links)]` on by default
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `LoginReq`
[INFO] [stdout]    --> src/api/auth.rs:158:23
[INFO] [stdout]     |
[INFO] [stdout] 158 | /// 1. 签名：State + Json<LoginReq>
[INFO] [stdout]     |                          ^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout]     = note: `#[warn(rustdoc::invalid_html_tags)]` on by default
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 158 | /// 1. 签名：State + `Json<LoginReq>`
[INFO] [stdout]     |                      +              +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `AppError`
[INFO] [stdout]    --> src/api/auth.rs:174:17
[INFO] [stdout]     |
[INFO] [stdout] 174 | ///   b. 实现 From<AppError> for ApiError（全局一次转换）
[INFO] [stdout]     |                   ^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 174 | ///   b. 实现 `From<AppError>` for ApiError（全局一次转换）
[INFO] [stdout]     |               +              +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `ListQuery`
[INFO] [stdout]    --> src/api/exercises.rs:159:38
[INFO] [stdout]     |
[INFO] [stdout] 159 | /// 1. 签名：State + ApiAuthUser + Query<ListQuery>
[INFO] [stdout]     |                                         ^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 159 | /// 1. 签名：State + ApiAuthUser + `Query<ListQuery>`
[INFO] [stdout]     |                                    +                +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `ExerciseCreateReq`
[INFO] [stdout]    --> src/api/exercises.rs:216:37
[INFO] [stdout]     |
[INFO] [stdout] 216 | /// 1. 签名：State + ApiAuthUser + Json<ExerciseCreateReq>
[INFO] [stdout]     |                                        ^^^^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 216 | /// 1. 签名：State + ApiAuthUser + `Json<ExerciseCreateReq>`
[INFO] [stdout]     |                                    +                       +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `PhaseOut`
[INFO] [stdout]    --> src/api/phases.rs:126:19
[INFO] [stdout]     |
[INFO] [stdout] 126 | /// 4. collect Vec<PhaseOut> → Json
[INFO] [stdout]     |                   ^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 126 | /// 4. collect `Vec<PhaseOut>` → Json
[INFO] [stdout]     |                +             +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `PhaseCreateReq`
[INFO] [stdout]    --> src/api/phases.rs:171:37
[INFO] [stdout]     |
[INFO] [stdout] 171 | /// 1. 签名：State + ApiAuthUser + Json<PhaseCreateReq>
[INFO] [stdout]     |                                        ^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 171 | /// 1. 签名：State + ApiAuthUser + `Json<PhaseCreateReq>`
[INFO] [stdout]     |                                    +                    +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `PhaseUpdateReq`
[INFO] [stdout]    --> src/api/phases.rs:302:48
[INFO] [stdout]     |
[INFO] [stdout] 302 | /// 1. 签名：State + ApiAuthUser + Path(id) + Json<PhaseUpdateReq>
[INFO] [stdout]     |                                                   ^^^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 302 | /// 1. 签名：State + ApiAuthUser + Path(id) + `Json<PhaseUpdateReq>`
[INFO] [stdout]     |                                               +                    +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `CalendarQuery`
[INFO] [stdout]   --> src/api/stats.rs:60:38
[INFO] [stdout]    |
[INFO] [stdout] 60 | /// 1. 签名：State + ApiAuthUser + Query<CalendarQuery>
[INFO] [stdout]    |                                         ^^^^^^^^^^^^^^^
[INFO] [stdout]    |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]    |
[INFO] [stdout] 60 | /// 1. 签名：State + ApiAuthUser + `Query<CalendarQuery>`
[INFO] [stdout]    |                                    +                    +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `T`
[INFO] [stdout]    --> src/auth.rs:353:48
[INFO] [stdout]     |
[INFO] [stdout] 353 | ///               用 .fetch_optional() 拿回 Option<T>
[INFO] [stdout]     |                                                   ^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 353 | ///               用 .fetch_optional() 拿回 `Option<T>`
[INFO] [stdout]     |                                             +         +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `User`
[INFO] [stdout]    --> src/auth.rs:378:29
[INFO] [stdout]     |
[INFO] [stdout] 378 | /// fetch_optional 给出 Option<User>，但函数要求 Result<User, AppError>。
[INFO] [stdout]     |                               ^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 378 | /// fetch_optional 给出 `Option<User>`，但函数要求 Result<User, AppError>。
[INFO] [stdout]     |                         +            +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `User`
[INFO] [stdout]    --> src/auth.rs:388:32
[INFO] [stdout]     |
[INFO] [stdout] 388 | /// 2. fetch_optional 拿到 Option<User>，查不到 → Err(Unauthorized)
[INFO] [stdout]     |                                  ^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 388 | /// 2. fetch_optional 拿到 `Option<User>`，查不到 → Err(Unauthorized)
[INFO] [stdout]     |                            +            +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `String`
[INFO] [stdout]    --> src/config.rs:139:29
[INFO] [stdout]     |
[INFO] [stdout] 139 |     /// - Fn(&str) -> Option<String> 是函数类型：传入名字，返回 Option 值
[INFO] [stdout]     |                             ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 139 |     /// - Fn(&str) -> `Option<String>` 是函数类型：传入名字，返回 Option 值
[INFO] [stdout]     |                       +              +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `pre`
[INFO] [stdout]    --> src/handlers/auth.rs:114:34
[INFO] [stdout]     |
[INFO] [stdout] 114 | /// 2026-08-08 排查：登录页在浏览器里显示为纯文本（<pre> + 转义），
[INFO] [stdout]     |                                                    ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `form`
[INFO] [stdout]    --> src/handlers/auth.rs:116:34
[INFO] [stdout]     |
[INFO] [stdout] 116 | /// 是 text/plain（纯文本）！浏览器收到纯文本就把 <form> 当普通文字显示。
[INFO] [stdout]     |                                                   ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `User`
[INFO] [stdout]    --> src/handlers/auth.rs:152:48
[INFO] [stdout]     |
[INFO] [stdout] 152 | /// 【教学：fetch_optional 的"套娃"类型 —— Result<Option<User>, sqlx::Error>】
[INFO] [stdout]     |                                                         ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `User`
[INFO] [stdout]    --> src/handlers/auth.rs:157:20
[INFO] [stdout]     |
[INFO] [stdout] 157 | ///   Result<Option<User>, sqlx::Error>
[INFO] [stdout]     |                    ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `User`
[INFO] [stdout]    --> src/handlers/auth.rs:181:50
[INFO] [stdout]     |
[INFO] [stdout] 181 | ///   fetch_optional().await      → Result<Option<User>, sqlx::Error>
[INFO] [stdout]     |                                                  ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `User`
[INFO] [stdout]    --> src/handlers/auth.rs:182:48
[INFO] [stdout]     |
[INFO] [stdout] 182 | ///     .map_err(AppError::Database)?  → Option<User>（数据库故障提前返回）
[INFO] [stdout]     |                                                ^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 182 | ///     .map_err(AppError::Database)?  → `Option<User>`（数据库故障提前返回）
[INFO] [stdout]     |                                          +            +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `User`
[INFO] [stdout]    --> src/handlers/auth.rs:243:31
[INFO] [stdout]     |
[INFO] [stdout] 243 | ///     → Future<Result<Option<User>, sqlx::Error>>  ③ 进入异步
[INFO] [stdout]     |                               ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `User`
[INFO] [stdout]    --> src/handlers/auth.rs:245:24
[INFO] [stdout]     |
[INFO] [stdout] 245 | ///     → Result<Option<User>, sqlx::Error>     ④ await 解包 Future → Result
[INFO] [stdout]     |                        ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `User`
[INFO] [stdout]    --> src/handlers/auth.rs:247:17
[INFO] [stdout]     |
[INFO] [stdout] 247 | ///     → Option<User>                          ⑤ 换错误类型 + ? 拆开
[INFO] [stdout]     |                 ^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 247 | ///     → `Option<User>`                          ⑤ 换错误类型 + ? 拆开
[INFO] [stdout]     |           +            +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `User`
[INFO] [stdout]    --> src/handlers/auth.rs:252:21
[INFO] [stdout]     |
[INFO] [stdout] 252 | ///     → Result<Vec<User>, sqlx::Error>        （Ok 里是 Vec<User>）
[INFO] [stdout]     |                     ^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `User`
[INFO] [stdout]    --> src/handlers/auth.rs:252:59
[INFO] [stdout]     |
[INFO] [stdout] 252 | ///     → Result<Vec<User>, sqlx::Error>        （Ok 里是 Vec<User>）
[INFO] [stdout]     |                                                              ^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 252 | ///     → Result<Vec<User>, sqlx::Error>        （Ok 里是 `Vec<User>`）
[INFO] [stdout]     |                                                           +         +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `T`
[INFO] [stdout]    --> src/handlers/auth.rs:263:61
[INFO] [stdout]     |
[INFO] [stdout] 263 | ///   query_as  = 按 FromRow 把每行转成结构体（fetch_optional → Option<T>，
[INFO] [stdout]     |                                                                       ^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 263 | ///   query_as  = 按 FromRow 把每行转成结构体（fetch_optional → `Option<T>`，
[INFO] [stdout]     |                                                                 +         +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `T`
[INFO] [stdout]    --> src/handlers/auth.rs:264:34
[INFO] [stdout]     |
[INFO] [stdout] 264 | ///               fetch_all → Vec<T>，fetch_one → 恰好一行否则报错）
[INFO] [stdout]     |                                  ^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 264 | ///               fetch_all → `Vec<T>`，fetch_one → 恰好一行否则报错）
[INFO] [stdout]     |                               +      +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `T`
[INFO] [stdout]    --> src/handlers/auth.rs:271:18
[INFO] [stdout]     |
[INFO] [stdout] 271 | ///   enum Option<T>    { Some(T), None }   // None 里啥都没有 → ok_or_else 不收参数
[INFO] [stdout]     |                  ^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 271 | ///   enum `Option<T>`    { Some(T), None }   // None 里啥都没有 → ok_or_else 不收参数
[INFO] [stdout]     |            +         +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `HeaderValue`
[INFO] [stdout]    --> src/handlers/auth.rs:284:41
[INFO] [stdout]     |
[INFO] [stdout] 284 | /// 结果 headers 的类型不是 HeaderMap，而是 Option<HeaderValue>！
[INFO] [stdout]     |                                                   ^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 284 | /// 结果 headers 的类型不是 HeaderMap，而是 `Option<HeaderValue>`！
[INFO] [stdout]     |                                             +                   +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `HeaderValue`
[INFO] [stdout]    --> src/handlers/auth.rs:285:35
[INFO] [stdout]     |
[INFO] [stdout] 285 | /// 原因：insert 的返回值是"被覆盖的旧值"（Option<HeaderValue>），
[INFO] [stdout]     |                                                  ^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 285 | /// 原因：insert 的返回值是"被覆盖的旧值"（`Option<HeaderValue>`），
[INFO] [stdout]     |                                            +                   +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `T`
[INFO] [stdout]    --> src/handlers/auth.rs:508:24
[INFO] [stdout]     |
[INFO] [stdout] 508 | ///   map        Option<T>    1 参数：Some 里的值    → 闭包返回普通值 U
[INFO] [stdout]     |                        ^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 508 | ///   map        `Option<T>`    1 参数：Some 里的值    → 闭包返回普通值 U
[INFO] [stdout]     |                  +         +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `T`
[INFO] [stdout]    --> src/handlers/auth.rs:509:24
[INFO] [stdout]     |
[INFO] [stdout] 509 | ///   and_then   Option<T>    1 参数：Some 里的值    → 闭包返回 Option<U>
[INFO] [stdout]     |                        ^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 509 | ///   and_then   `Option<T>`    1 参数：Some 里的值    → 闭包返回 Option<U>
[INFO] [stdout]     |                  +         +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `U`
[INFO] [stdout]    --> src/handlers/auth.rs:509:61
[INFO] [stdout]     |
[INFO] [stdout] 509 | ///   and_then   Option<T>    1 参数：Some 里的值    → 闭包返回 Option<U>
[INFO] [stdout]     |                                                                       ^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 509 | ///   and_then   Option<T>    1 参数：Some 里的值    → 闭包返回 `Option<U>`
[INFO] [stdout]     |                                                                 +         +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `T`
[INFO] [stdout]    --> src/handlers/auth.rs:511:24
[INFO] [stdout]     |
[INFO] [stdout] 511 | ///   ok_or_else Option<T>    0 参数                  → None 里没值，闭包凭空造错误
[INFO] [stdout]     |                        ^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 511 | ///   ok_or_else `Option<T>`    0 参数                  → None 里没值，闭包凭空造错误
[INFO] [stdout]     |                  +         +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `User`
[INFO] [stdout]    --> src/handlers/auth.rs:617:28
[INFO] [stdout]     |
[INFO] [stdout] 617 | ///   ② 查数据：fetch_all → Vec<User>
[INFO] [stdout]     |                                ^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 617 | ///   ② 查数据：fetch_all → `Vec<User>`
[INFO] [stdout]     |                             +         +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `User`
[INFO] [stdout]    --> src/handlers/auth.rs:618:18
[INFO] [stdout]     |
[INFO] [stdout] 618 | ///   ③ 拼页面：把 Vec<User> 变成 HTML 字符串返回
[INFO] [stdout]     |                       ^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 618 | ///   ③ 拼页面：把 `Vec<User>` 变成 HTML 字符串返回
[INFO] [stdout]     |                    +         +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `tr`
[INFO] [stdout]    --> src/handlers/auth.rs:624:27
[INFO] [stdout]     |
[INFO] [stdout] 624 | ///     .map(|u| format!("<tr>..."))   // 每个用户 → 一行 HTML（User → String）
[INFO] [stdout]     |                           ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `User`
[INFO] [stdout]    --> src/handlers/auth.rs:623:45
[INFO] [stdout]     |
[INFO] [stdout] 623 | ///   users.iter()                    // Vec<User> → Iter<'_, User>（借用遍历，不拿所有权）
[INFO] [stdout]     |                                             ^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 623 | ///   users.iter()                    // `Vec<User>` → Iter<'_, User>（借用遍历，不拿所有权）
[INFO] [stdout]     |                                          +         +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `String`
[INFO] [stdout]    --> src/handlers/auth.rs:625:52
[INFO] [stdout]     |
[INFO] [stdout] 625 | ///     .collect::<Vec<_>>()           // 迭代器 → Vec<String>（map 惰性，不 collect 不干活）
[INFO] [stdout]     |                                                       ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 625 | ///     .collect::<Vec<_>>()           // 迭代器 → `Vec<String>`（map 惰性，不 collect 不干活）
[INFO] [stdout]     |                                                    +           +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `String`
[INFO] [stdout]    --> src/handlers/auth.rs:626:46
[INFO] [stdout]     |
[INFO] [stdout] 626 | ///     .join("\n")                    // Vec<String> → 一个大 String（换行连接）
[INFO] [stdout]     |                                              ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 626 | ///     .join("\n")                    // `Vec<String>` → 一个大 String（换行连接）
[INFO] [stdout]     |                                           +           +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `form`
[INFO] [stdout]    --> src/handlers/auth.rs:640:10
[INFO] [stdout]     |
[INFO] [stdout] 640 | ///   r#"<form method="post" action="/admin/users">"#   ← 干净
[INFO] [stdout]     |          ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `String`
[INFO] [stdout]    --> src/handlers/auth.rs:741:33
[INFO] [stdout]     |
[INFO] [stdout] 741 | /// 背景：form.is_admin 的类型是 Option<String>
[INFO] [stdout]     |                                        ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 741 | /// 背景：form.is_admin 的类型是 `Option<String>`
[INFO] [stdout]     |                                  +              +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `T`
[INFO] [stdout]    --> src/handlers/auth.rs:756:27
[INFO] [stdout]     |
[INFO] [stdout] 756 | /// as_deref 是什么？= "Option<T> 的 as_str"：
[INFO] [stdout]     |                               ^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 756 | /// as_deref 是什么？= "`Option<T>` 的 as_str"：
[INFO] [stdout]     |                         +         +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `String`
[INFO] [stdout]    --> src/handlers/auth.rs:758:13
[INFO] [stdout]     |
[INFO] [stdout] 758 | ///   Option<String>.as_deref() → Option<String> → Option<&str>（把里面的值也变借用）
[INFO] [stdout]     |             ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 758 | ///   `Option<String>`.as_deref() → Option<String> → Option<&str>（把里面的值也变借用）
[INFO] [stdout]     |       +              +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `String`
[INFO] [stdout]    --> src/handlers/auth.rs:758:41
[INFO] [stdout]     |
[INFO] [stdout] 758 | ///   Option<String>.as_deref() → Option<String> → Option<&str>（把里面的值也变借用）
[INFO] [stdout]     |                                         ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 758 | ///   Option<String>.as_deref() → `Option<String>` → Option<&str>（把里面的值也变借用）
[INFO] [stdout]     |                                   +              +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `T`
[INFO] [stdout]    --> src/handlers/auth.rs:759:29
[INFO] [stdout]     |
[INFO] [stdout] 759 | /// 规则：只要 T 实现了 Deref，Option<T>.as_deref() 就是 Option<&T::Target>。
[INFO] [stdout]     |                                      ^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 759 | /// 规则：只要 T 实现了 Deref，`Option<T>`.as_deref() 就是 Option<&T::Target>。
[INFO] [stdout]     |                                +         +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `String`
[INFO] [stdout]    --> src/handlers/auth.rs:760:43
[INFO] [stdout]     |
[INFO] [stdout] 760 | ///   String: Deref<Target = str> → Option<String>.as_deref() = Option<&str>
[INFO] [stdout]     |                                           ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 760 | ///   String: Deref<Target = str> → `Option<String>`.as_deref() = Option<&str>
[INFO] [stdout]     |                                     +              +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `a`
[INFO] [stdout]   --> src/handlers/backup.rs:65:15
[INFO] [stdout]    |
[INFO] [stdout] 65 | ///    - 下载备份：<a href="/admin/backup/download">（GET 链接即可，
[INFO] [stdout]    |                    ^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `form`
[INFO] [stdout]   --> src/handlers/backup.rs:67:15
[INFO] [stdout]    |
[INFO] [stdout] 67 | ///    - 上传恢复：<form method="post" enctype="multipart/form-data">
[INFO] [stdout]    |                    ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `u8`
[INFO] [stdout]    --> src/handlers/backup.rs:117:15
[INFO] [stdout]     |
[INFO] [stdout] 117 | ///      → Vec<u8>（数据库二进制，不需要转字符串）
[INFO] [stdout]     |               ^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 117 | ///      → `Vec<u8>`（数据库二进制，不需要转字符串）
[INFO] [stdout]     |            +       +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `u8`
[INFO] [stdout]    --> src/handlers/backup.rs:121:51
[INFO] [stdout]     |
[INFO] [stdout] 121 | ///   3. (头, 字节) 转 Response：axum 对 (HeaderMap, Vec<u8>) 有 IntoResponse 实现
[INFO] [stdout]     |                                                         ^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 121 | ///   3. (头, 字节) 转 Response：axum 对 (HeaderMap, `Vec<u8>`) 有 IntoResponse 实现
[INFO] [stdout]     |                                                      +       +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `form`
[INFO] [stdout]    --> src/handlers/backup.rs:191:5
[INFO] [stdout]     |
[INFO] [stdout] 191 | /// <form enctype="multipart/form-data"> 提交时，文件内容被编码成
[INFO] [stdout]     |     ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `u8`
[INFO] [stdout]    --> src/handlers/backup.rs:197:35
[INFO] [stdout]     |
[INFO] [stdout] 197 | ///   field.bytes()     → 文件内容 Vec<u8>
[INFO] [stdout]     |                                       ^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 197 | ///   field.bytes()     → 文件内容 `Vec<u8>`
[INFO] [stdout]     |                                    +       +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `ExportQuery`
[INFO] [stdout]    --> src/handlers/backup.rs:359:35
[INFO] [stdout]     |
[INFO] [stdout] 359 | /// 1. 签名：State + AuthUser + Query<ExportQuery>
[INFO] [stdout]     |                                      ^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 359 | /// 1. 签名：State + AuthUser + `Query<ExportQuery>`
[INFO] [stdout]     |                                 +                  +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `a`
[INFO] [stdout]    --> src/handlers/exercises.rs:159:24
[INFO] [stdout]     |
[INFO] [stdout] 159 | /// 注意：删除用 POST 表单（不能是 <a> 链接）！
[INFO] [stdout]     |                                    ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `a`
[INFO] [stdout]    --> src/handlers/exercises.rs:160:7
[INFO] [stdout]     |
[INFO] [stdout] 160 | ///   <a> 是 GET 请求，而 DELETE 是有副作用的操作——
[INFO] [stdout]     |       ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `form`
[INFO] [stdout]    --> src/handlers/exercises.rs:162:17
[INFO] [stdout]     |
[INFO] [stdout] 162 | ///   所以删除按钮必须是 <form method="post">（PRG 模式，同 create）。
[INFO] [stdout]     |                          ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `Exercise`
[INFO] [stdout]    --> src/handlers/exercises.rs:152:23
[INFO] [stdout]     |
[INFO] [stdout] 152 | /// 两个分支各做一次查询、各返回 Vec<Exercise>，
[INFO] [stdout]     |                                     ^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 152 | /// 两个分支各做一次查询、各返回 `Vec<Exercise>`，
[INFO] [stdout]     |                                  +             +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `Exercise`
[INFO] [stdout]    --> src/handlers/exercises.rs:167:11
[INFO] [stdout]     |
[INFO] [stdout] 167 | /// 3. Vec<Exercise> → 表格行 HTML（map → collect → join）
[INFO] [stdout]     |           ^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 167 | /// 3. `Vec<Exercise>` → 表格行 HTML（map → collect → join）
[INFO] [stdout]     |        +             +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: improperly nested Markdown list item in HTML `script` tag
[INFO] [stdout]    --> src/handlers/exercises.rs:400:5
[INFO] [stdout]     |
[INFO] [stdout] 400 |   /// 3. default_mode 加 id + onchange（bar 在前 + selected，表默认 bar），
[INFO] [stdout]     |  _____^
[INFO] [stdout] 401 | | ///    bar_weight 包进 <div id="bar_weight_row">，
[INFO] [stdout] 402 | | ///    页面底部放 <script> 切换显隐
[INFO] [stdout] 403 | | /// 4. 返回链接 /exercises
[INFO] [stdout]     | |____^ Markdown translates this into HTML, but the browser parses it as JavaScript
[INFO] [stdout]     |
[INFO] [stdout] help: to turn off Markdown parsing, put the tag at the start of the line
[INFO] [stdout]     |
[INFO] [stdout] 402 ~ ///    页面底部放 
[INFO] [stdout] 403 ~ /// <script> 切换显隐
[INFO] [stdout]     |
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: nested Markdown list item in HTML `script` tag
[INFO] [stdout]    --> src/handlers/exercises.rs:403:5
[INFO] [stdout]     |
[INFO] [stdout] 403 | /// 4. 返回链接 /exercises
[INFO] [stdout]     |     ^^^^^^^^^^^^^^^^^^^^^^ Markdown translates this into HTML, but the browser parses it as JavaScript
[INFO] [stdout]     |
[INFO] [stdout] help: to turn off Markdown parsing, put the tag at the start of the line
[INFO] [stdout]     |
[INFO] [stdout] 402 ~ ///    页面底部放 
[INFO] [stdout] 403 ~ /// <script> 切换显隐
[INFO] [stdout]     |
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: improperly nested Markdown numbered list in HTML `script` tag
[INFO] [stdout]    --> src/handlers/exercises.rs:396:5
[INFO] [stdout]     |
[INFO] [stdout] 396 |   /// 1. 签名：State + AuthUser
[INFO] [stdout]     |  _____^
[INFO] [stdout] 397 | | /// 2. 返回 <form method="post" action="/exercises"> 的 HTML
[INFO] [stdout] 398 | | ///    （下拉框：body_part 6 项、default_mode 3 项、bar_weight 4 项；
[INFO] [stdout] 399 | | ///     数字框：default_sets/default_reps；文本域：key_points）
[INFO] [stdout] ...   |
[INFO] [stdout] 402 | | ///    页面底部放 <script> 切换显隐
[INFO] [stdout] 403 | | /// 4. 返回链接 /exercises
[INFO] [stdout]     | |__________________________^ Markdown translates this into HTML, but the browser parses it as JavaScript
[INFO] [stdout]     |
[INFO] [stdout] help: to turn off Markdown parsing, put the tag at the start of the line
[INFO] [stdout]     |
[INFO] [stdout] 402 ~ ///    页面底部放 
[INFO] [stdout] 403 ~ /// <script> 切换显隐
[INFO] [stdout]     |
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `script`
[INFO] [stdout]    --> src/handlers/exercises.rs:402:14
[INFO] [stdout]     |
[INFO] [stdout] 402 | ///    页面底部放 <script> 切换显隐
[INFO] [stdout]     |                   ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `select`
[INFO] [stdout]    --> src/handlers/exercises.rs:337:9
[INFO] [stdout]     |
[INFO] [stdout] 337 | /// 【教学：<select> 下拉框的完整写法】
[INFO] [stdout]     |             ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `select`
[INFO] [stdout]    --> src/handlers/exercises.rs:353:9
[INFO] [stdout]     |
[INFO] [stdout] 353 | /// 这正是 <select> 的经典用法——**显示和值分离**：
[INFO] [stdout]     |            ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `select`
[INFO] [stdout]    --> src/handlers/exercises.rs:376:7
[INFO] [stdout]     |
[INFO] [stdout] 376 | ///   <select id="default_mode" onchange="toggleBarWeight()"> ...
[INFO] [stdout]     |       ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `form`
[INFO] [stdout]    --> src/handlers/exercises.rs:397:11
[INFO] [stdout]     |
[INFO] [stdout] 397 | /// 2. 返回 <form method="post" action="/exercises"> 的 HTML
[INFO] [stdout]     |             ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `f64`
[INFO] [stdout]    --> src/handlers/exercises.rs:482:20
[INFO] [stdout]     |
[INFO] [stdout] 482 | ///   "abc".parse::<f64>()  → Err
[INFO] [stdout]     |                    ^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 482 | ///   "abc".`parse::<f64>`()  → Err
[INFO] [stdout]     |             +            +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `f64`
[INFO] [stdout]    --> src/handlers/exercises.rs:485:19
[INFO] [stdout]     |
[INFO] [stdout] 485 | ///       .parse::<f64>()
[INFO] [stdout]     |                   ^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 485 | ///       .`parse::<f64>`()
[INFO] [stdout]     |            +            +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `f64`
[INFO] [stdout]    --> src/handlers/exercises.rs:493:30
[INFO] [stdout]     |
[INFO] [stdout] 493 | ///   form.bar_weight.parse::<f64>()
[INFO] [stdout]     |                              ^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 493 | ///   form.bar_weight.`parse::<f64>`()
[INFO] [stdout]     |                       +            +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `i64`
[INFO] [stdout]    --> src/handlers/exercises.rs:497:42
[INFO] [stdout]     |
[INFO] [stdout] 497 | /// default_sets/default_reps 同理（.parse::<i64>()，类型 i64）。
[INFO] [stdout]     |                                             ^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 497 | /// default_sets/default_reps 同理（.`parse::<i64>`()，类型 i64）。
[INFO] [stdout]     |                                      +            +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `ExerciseForm`
[INFO] [stdout]    --> src/handlers/exercises.rs:507:34
[INFO] [stdout]     |
[INFO] [stdout] 507 | /// 1. 签名：State + AuthUser + Form<ExerciseForm>
[INFO] [stdout]     |                                     ^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 507 | /// 1. 签名：State + AuthUser + `Form<ExerciseForm>`
[INFO] [stdout]     |                                 +                  +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: incomplete HTML tag `Vec`
[INFO] [stdout]    --> src/handlers/exercises.rs:615:21
[INFO] [stdout]     |
[INFO] [stdout] 615 | ///       .collect::<Vec<_>>()
[INFO] [stdout]     |                     ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `form`
[INFO] [stdout]    --> src/handlers/exercises.rs:639:8
[INFO] [stdout]     |
[INFO] [stdout] 639 | ///    <form action="/exercises/edit"> 是错的——提交到不存在的地址。
[INFO] [stdout]     |        ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `form`
[INFO] [stdout]    --> src/handlers/exercises.rs:640:11
[INFO] [stdout]     |
[INFO] [stdout] 640 | ///    应为 <form action="/exercises/{id}/edit">，用 Path(id) 的 id 拼：
[INFO] [stdout]     |             ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `ExerciseForm`
[INFO] [stdout]    --> src/handlers/exercises.rs:865:54
[INFO] [stdout]     |
[INFO] [stdout] 865 | /// 1. 签名：State + AuthUser + Path(exercise_id) + Form<ExerciseForm>
[INFO] [stdout]     |                                                         ^^^^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 865 | /// 1. 签名：State + AuthUser + Path(exercise_id) + `Form<ExerciseForm>`
[INFO] [stdout]     |                                                     +                  +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `Phase`
[INFO] [stdout]    --> src/handlers/phases.rs:155:28
[INFO] [stdout]     |
[INFO] [stdout] 155 | ///   ② 查数据：fetch_all → Vec<Phase>
[INFO] [stdout]     |                                ^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 155 | ///   ② 查数据：fetch_all → `Vec<Phase>`
[INFO] [stdout]     |                             +          +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `Phase`
[INFO] [stdout]    --> src/handlers/phases.rs:201:12
[INFO] [stdout]     |
[INFO] [stdout] 201 | /// 【教学：Vec<Phase> → HTML 字符串 —— map → collect → join】
[INFO] [stdout]     |                ^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 201 | /// 【教学：`Vec<Phase>` → HTML 字符串 —— map → collect → join】
[INFO] [stdout]     |             +          +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `Phase`
[INFO] [stdout]    --> src/handlers/phases.rs:206:56
[INFO] [stdout]     |
[INFO] [stdout] 206 | ///   phases.iter()                              // Vec<Phase> → Iter<'_, Phase>
[INFO] [stdout]     |                                                        ^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 206 | ///   phases.iter()                              // `Vec<Phase>` → Iter<'_, Phase>
[INFO] [stdout]     |                                                     +          +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `String`
[INFO] [stdout]    --> src/handlers/phases.rs:208:62
[INFO] [stdout]     |
[INFO] [stdout] 208 | ///     .collect::<Vec<_>>()                     // 迭代器 → Vec<String>
[INFO] [stdout]     |                                                                 ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 208 | ///     .collect::<Vec<_>>()                     // 迭代器 → `Vec<String>`
[INFO] [stdout]     |                                                              +           +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `String`
[INFO] [stdout]    --> src/handlers/phases.rs:209:56
[INFO] [stdout]     |
[INFO] [stdout] 209 | ///     .join("\n")                              // Vec<String> → String（换行连接）
[INFO] [stdout]     |                                                        ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 209 | ///     .join("\n")                              // `Vec<String>` → String（换行连接）
[INFO] [stdout]     |                                                     +           +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `String`
[INFO] [stdout]    --> src/handlers/phases.rs:214:20
[INFO] [stdout]     |
[INFO] [stdout] 214 | ///   join    = Vec<String> → String（换行连接成一个大字符串）
[INFO] [stdout]     |                    ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 214 | ///   join    = `Vec<String>` → String（换行连接成一个大字符串）
[INFO] [stdout]     |                 +           +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `Phase`
[INFO] [stdout]    --> src/handlers/phases.rs:218:45
[INFO] [stdout]     |
[INFO] [stdout] 218 | ///   active_phases 和 archived_phases 都是 Vec<Phase>
[INFO] [stdout]     |                                                ^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 218 | ///   active_phases 和 archived_phases 都是 `Vec<Phase>`
[INFO] [stdout]     |                                             +          +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `Phase`
[INFO] [stdout]    --> src/handlers/phases.rs:219:34
[INFO] [stdout]     |
[INFO] [stdout] 219 | ///   （sqlx 的 fetch_all 返回的就是 Vec<Phase>，一行 → 一个结构体）。
[INFO] [stdout]     |                                         ^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 219 | ///   （sqlx 的 fetch_all 返回的就是 `Vec<Phase>`，一行 → 一个结构体）。
[INFO] [stdout]     |                                      +          +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `String`
[INFO] [stdout]    --> src/handlers/phases.rs:225:35
[INFO] [stdout]     |
[INFO] [stdout] 225 | ///   .collect::<Vec<_>>()   → Vec<String>（变成数组了）    ← 数组才有 join
[INFO] [stdout]     |                                   ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 225 | ///   .collect::<Vec<_>>()   → `Vec<String>`（变成数组了）    ← 数组才有 join
[INFO] [stdout]     |                                +           +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `String`
[INFO] [stdout]    --> src/handlers/phases.rs:229:13
[INFO] [stdout]     |
[INFO] [stdout] 229 | ///      Vec<String> 能调 join 是自动 deref 到 &[String]。
[INFO] [stdout]     |             ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 229 | ///      `Vec<String>` 能调 join 是自动 deref 到 &[String]。
[INFO] [stdout]     |          +           +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `h2`
[INFO] [stdout]    --> src/handlers/phases.rs:248:23
[INFO] [stdout]     |
[INFO] [stdout] 248 | /// 4. 拼 HTML：两个分区各一个 <h2> + 表格，active/archived 各自迭代 map
[INFO] [stdout]     |                                ^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `textarea`
[INFO] [stdout]    --> src/handlers/phases.rs:374:21
[INFO] [stdout]     |
[INFO] [stdout] 374 | ///   note        → <textarea name="note">              （备注，可空）
[INFO] [stdout]     |                     ^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `PhaseForm`
[INFO] [stdout]    --> src/handlers/phases.rs:389:47
[INFO] [stdout]     |
[INFO] [stdout] 389 | ///   ② method="post"：必须 POST（create 的签名要 Form<PhaseForm>）
[INFO] [stdout]     |                                                       ^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 389 | ///   ② method="post"：必须 POST（create 的签名要 `Form<PhaseForm>`）
[INFO] [stdout]     |                                                   +               +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `a`
[INFO] [stdout]    --> src/handlers/phases.rs:395:15
[INFO] [stdout]     |
[INFO] [stdout] 395 | ///      外加一个 <a href="/logout"> 需要 POST——先放 <a href="/"> 即可，
[INFO] [stdout]     |                   ^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `a`
[INFO] [stdout]    --> src/handlers/phases.rs:395:46
[INFO] [stdout]     |
[INFO] [stdout] 395 | ///      外加一个 <a href="/logout"> 需要 POST——先放 <a href="/"> 即可，
[INFO] [stdout]     |                                                      ^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `p`
[INFO] [stdout]    --> src/handlers/phases.rs:421:11
[INFO] [stdout]     |
[INFO] [stdout] 421 | ///   学生写 <p><a href="/phases">返回</a><p>，结尾应是 </p> 不是 <p>。
[INFO] [stdout]     |              ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `p`
[INFO] [stdout]    --> src/handlers/phases.rs:421:55
[INFO] [stdout]     |
[INFO] [stdout] 421 | ///   学生写 <p><a href="/phases">返回</a><p>，结尾应是 </p> 不是 <p>。
[INFO] [stdout]     |                                                                   ^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `form`
[INFO] [stdout]    --> src/handlers/phases.rs:427:15
[INFO] [stdout]     |
[INFO] [stdout] 427 | /// 2. 返回一个包含 <form method="post" action="/phases"> 的 HTML 字符串
[INFO] [stdout]     |                     ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `String`
[INFO] [stdout]    --> src/handlers/phases.rs:485:13
[INFO] [stdout]     |
[INFO] [stdout] 485 | ///   Option<String> 的 None 在这一层就定值了，存进 SQLite 就是 NULL，
[INFO] [stdout]     |             ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 485 | ///   `Option<String>` 的 None 在这一层就定值了，存进 SQLite 就是 NULL，
[INFO] [stdout]     |       +              +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `T`
[INFO] [stdout]    --> src/handlers/phases.rs:518:27
[INFO] [stdout]     |
[INFO] [stdout] 518 | ///   ② 完全多余！sqlx 对 Option<T> 有原生支持：
[INFO] [stdout]     |                                 ^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 518 | ///   ② 完全多余！sqlx 对 `Option<T>` 有原生支持：
[INFO] [stdout]     |                           +         +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `PhaseForm`
[INFO] [stdout]    --> src/handlers/phases.rs:548:34
[INFO] [stdout]     |
[INFO] [stdout] 548 | /// 1. 签名：State + AuthUser + Form<PhaseForm>
[INFO] [stdout]     |                                     ^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 548 | /// 1. 签名：State + AuthUser + `Form<PhaseForm>`
[INFO] [stdout]     |                                 +               +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `i64`
[INFO] [stdout]    --> src/handlers/phases.rs:607:39
[INFO] [stdout]     |
[INFO] [stdout] 607 | ///   /phases/3/edit  →  Path(3): Path<i64>  →  id = 3
[INFO] [stdout]     |                                       ^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 607 | ///   /phases/3/edit  →  Path(3): `Path<i64>`  →  id = 3
[INFO] [stdout]     |                                   +         +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `i64`
[INFO] [stdout]    --> src/handlers/phases.rs:610:34
[INFO] [stdout]     |
[INFO] [stdout] 610 | ///   - handler 参数 Path(id): Path<i64>，i64 是目标类型
[INFO] [stdout]     |                                    ^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 610 | ///   - handler 参数 Path(id): `Path<i64>`，i64 是目标类型
[INFO] [stdout]     |                                +         +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `textarea`
[INFO] [stdout]    --> src/handlers/phases.rs:632:7
[INFO] [stdout]     |
[INFO] [stdout] 632 | /// ② <textarea> 没有 value 属性！旧值放在开始/结束标签之间：
[INFO] [stdout]     |       ^^^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `String`
[INFO] [stdout]    --> src/handlers/phases.rs:639:35
[INFO] [stdout]     |
[INFO] [stdout] 639 | ///      phase.start_date 是 Option<String>（数据库可空列），
[INFO] [stdout]     |                                    ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 639 | ///      phase.start_date 是 `Option<String>`（数据库可空列），
[INFO] [stdout]     |                              +              +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `String`
[INFO] [stdout]    --> src/handlers/phases.rs:643:29
[INFO] [stdout]     |
[INFO] [stdout] 643 | ///      as_deref() 把 Option<String> 变成 Option<&str>（借用，不克隆），
[INFO] [stdout]     |                              ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 643 | ///      as_deref() 把 `Option<String>` 变成 Option<&str>（借用，不克隆），
[INFO] [stdout]     |                        +              +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `form`
[INFO] [stdout]    --> src/handlers/phases.rs:648:10
[INFO] [stdout]     |
[INFO] [stdout] 648 | ///      <form method="post" action="/phases/{id}/edit">
[INFO] [stdout]     |          ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `PhaseForm`
[INFO] [stdout]    --> src/handlers/phases.rs:718:51
[INFO] [stdout]     |
[INFO] [stdout] 718 | /// 1. 签名：State + AuthUser + Path(phase_id) + Form<PhaseForm>
[INFO] [stdout]     |                                                      ^^^^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 718 | /// 1. 签名：State + AuthUser + Path(phase_id) + `Form<PhaseForm>`
[INFO] [stdout]     |                                                  +               +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `i64`
[INFO] [stdout]     --> src/handlers/plan.rs:1132:28
[INFO] [stdout]      |
[INFO] [stdout] 1132 | ///     template_id: Option<i64>, // 选模板（可空）
[INFO] [stdout]      |                            ^^^^^
[INFO] [stdout]      |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]      |
[INFO] [stdout] 1132 | ///     template_id: `Option<i64>`, // 选模板（可空）
[INFO] [stdout]      |                      +           +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `i64`
[INFO] [stdout]     --> src/handlers/plan.rs:1133:26
[INFO] [stdout]      |
[INFO] [stdout] 1133 | ///     exercise_ids: Vec<i64>,   // 手动选动作（可空）
[INFO] [stdout]      |                          ^^^^^
[INFO] [stdout]      |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]      |
[INFO] [stdout] 1133 | ///     exercise_ids: `Vec<i64>`,   // 手动选动作（可空）
[INFO] [stdout]      |                       +        +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `i64`
[INFO] [stdout]     --> src/handlers/plan.rs:2723:33
[INFO] [stdout]      |
[INFO] [stdout] 2723 |     /// ⚠️ 不能用 exercise_ids: Vec<i64> 或同名重复键！
[INFO] [stdout]      |                                   ^^^^^
[INFO] [stdout]      |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]      |
[INFO] [stdout] 2723 |     /// ⚠️ 不能用 exercise_ids: `Vec<i64>` 或同名重复键！
[INFO] [stdout]      |                                +        +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `T`
[INFO] [stdout]     --> src/handlers/plan.rs:2797:20
[INFO] [stdout]      |
[INFO] [stdout] 2797 |     /// axum 的 Form<T> 底层用 serde_urlencoded 解析，它是 **map 语义**：
[INFO] [stdout]      |                     ^^^
[INFO] [stdout]      |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]      |
[INFO] [stdout] 2797 |     /// axum 的 `Form<T>` 底层用 serde_urlencoded 解析，它是 **map 语义**：
[INFO] [stdout]      |                 +       +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `i64`
[INFO] [stdout]     --> src/handlers/plan.rs:2843:30
[INFO] [stdout]      |
[INFO] [stdout] 2843 |     /// 不能用 exercise_ids: Vec<i64>（serde_urlencoded map 语义，重复键覆盖）
[INFO] [stdout]      |                                 ^^^^^
[INFO] [stdout]      |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]      |
[INFO] [stdout] 2843 |     /// 不能用 exercise_ids: `Vec<i64>`（serde_urlencoded map 语义，重复键覆盖）
[INFO] [stdout]      |                              +        +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `select`
[INFO] [stdout]    --> src/handlers/record.rs:468:7
[INFO] [stdout]     |
[INFO] [stdout] 468 | ///   <select id="mode-select">（bar/support/std，默认动作的 default_mode）
[INFO] [stdout]     |       ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `select`
[INFO] [stdout]    --> src/handlers/record.rs:469:7
[INFO] [stdout]     |
[INFO] [stdout] 469 | ///   <select id="unit-select">（kg/lb，观测强度单位，M4 新增）
[INFO] [stdout]     |       ^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `span`
[INFO] [stdout]    --> src/handlers/record.rs:473:7
[INFO] [stdout]     |
[INFO] [stdout] 473 | ///   <span id="result">           换算结果
[INFO] [stdout]     |       ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `body`
[INFO] [stdout]    --> src/handlers/record.rs:475:10
[INFO] [stdout]     |
[INFO] [stdout] 475 | ///   页面 <body data-bar-weight="动作.bar_weight"> 提供初始杆重
[INFO] [stdout]     |            ^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `String`
[INFO] [stdout]    --> src/handlers/stats.rs:295:13
[INFO] [stdout]     |
[INFO] [stdout] 295 | /// 【教学：Path<String> 和日期校验】
[INFO] [stdout]     |                 ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 295 | /// 【教学：`Path<String>` 和日期校验】
[INFO] [stdout]     |             +            +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `String`
[INFO] [stdout]    --> src/handlers/stats.rs:301:46
[INFO] [stdout]     |
[INFO] [stdout] 301 | /// 1. 签名：State + AuthUser + Path(date): Path<String>
[INFO] [stdout]     |                                                 ^^^^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 301 | /// 1. 签名：State + AuthUser + Path(date): `Path<String>`
[INFO] [stdout]     |                                             +            +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: improperly nested Markdown list item in HTML `script` tag
[INFO] [stdout]    --> src/handlers/stats.rs:534:5
[INFO] [stdout]     |
[INFO] [stdout] 534 |   /// 6. 数据注入（M4 §10.3 同款模式——数据单一来源）：
[INFO] [stdout]     |  _____^
[INFO] [stdout] 535 | | ///    serde_json::to_string 序列化后注入页面 JS 变量：
[INFO] [stdout] 536 | | ///    let chart_json = serde_json::to_string(&points)?;
[INFO] [stdout] 537 | | ///    → format!(r#"var CHART_POINTS = {chart_json};"#)
[INFO] [stdout] ...   |
[INFO] [stdout] 540 | | ///    （X 轴 label 用日期字符串，Chart.js 按数组顺序画即可）
[INFO] [stdout] 541 | | /// 7. 记录数 < 2 → 不画图，提示"记录太少，攒几次训练再看趋势"
[INFO] [stdout]     | |____^ Markdown translates this into HTML, but the browser parses it as JavaScript
[INFO] [stdout]     |
[INFO] [stdout] help: to turn off Markdown parsing, put the tag at the start of the line
[INFO] [stdout]     |
[INFO] [stdout] 539 ~ ///    然后 
[INFO] [stdout] 540 ~ /// <script> 里用 CHART_POINTS 画两条线
[INFO] [stdout]     |
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: nested Markdown list item in HTML `script` tag
[INFO] [stdout]    --> src/handlers/stats.rs:541:5
[INFO] [stdout]     |
[INFO] [stdout] 541 |   /// 7. 记录数 < 2 → 不画图，提示"记录太少，攒几次训练再看趋势"
[INFO] [stdout]     |  _____^
[INFO] [stdout] 542 | | ///    无记录 → 空态"这个动作还没有记录"
[INFO] [stdout] 543 | | ///
[INFO] [stdout] 544 | | /// 【教学：为什么 JSON 注入而不是页面内嵌 JS 数组？】
[INFO] [stdout]     | |____^ Markdown translates this into HTML, but the browser parses it as JavaScript
[INFO] [stdout]     |
[INFO] [stdout] help: to turn off Markdown parsing, put the tag at the start of the line
[INFO] [stdout]     |
[INFO] [stdout] 539 ~ ///    然后 
[INFO] [stdout] 540 ~ /// <script> 里用 CHART_POINTS 画两条线
[INFO] [stdout]     |
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: improperly nested Markdown numbered list in HTML `script` tag
[INFO] [stdout]    --> src/handlers/stats.rs:520:5
[INFO] [stdout]     |
[INFO] [stdout] 520 |   /// 1. 签名：State + AuthUser + Path(id): Path<i64>
[INFO] [stdout]     |  _____^
[INFO] [stdout] 521 | | /// 2. 数据隔离纪律：先验证动作存在且属于当前用户
[INFO] [stdout] 522 | | ///    SELECT * FROM exercises WHERE id = ? AND user_id = ?
[INFO] [stdout] 523 | | ///    → 没有 → 404（先验证再查记录，404 语义才清晰）
[INFO] [stdout] ...   |
[INFO] [stdout] 543 | | ///
[INFO] [stdout] 544 | | /// 【教学：为什么 JSON 注入而不是页面内嵌 JS 数组？】
[INFO] [stdout]     | |____^ Markdown translates this into HTML, but the browser parses it as JavaScript
[INFO] [stdout]     |
[INFO] [stdout] help: to turn off Markdown parsing, put the tag at the start of the line
[INFO] [stdout]     |
[INFO] [stdout] 539 ~ ///    然后 
[INFO] [stdout] 540 ~ /// <script> 里用 CHART_POINTS 画两条线
[INFO] [stdout]     |
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: nested Markdown paragraph in HTML `script` tag
[INFO] [stdout]    --> src/handlers/stats.rs:544:5
[INFO] [stdout]     |
[INFO] [stdout] 544 |   /// 【教学：为什么 JSON 注入而不是页面内嵌 JS 数组？】
[INFO] [stdout]     |  _____^
[INFO] [stdout] 545 | | ///   Rust 端拼 JS 数组字面量容易出错（引号转义、数字格式），
[INFO] [stdout] 546 | | ///   serde_json 序列化是"机器生成的合法 JSON"，
[INFO] [stdout] 547 | | ///   前端直接 var CHART_POINTS = [...] 就是合法 JS——
[INFO] [stdout] 548 | | ///   这就是 M4_bugfix_notes §10.3 的"数据注入 vs 手写"。
[INFO] [stdout]     | |_________________________________________________________^ Markdown translates this into HTML, but the browser parses it as JavaScript
[INFO] [stdout]     |
[INFO] [stdout] help: to turn off Markdown parsing, put the tag at the start of the line
[INFO] [stdout]     |
[INFO] [stdout] 539 ~ ///    然后 
[INFO] [stdout] 540 ~ /// <script> 里用 CHART_POINTS 画两条线
[INFO] [stdout]     |
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `script`
[INFO] [stdout]    --> src/handlers/stats.rs:539:11
[INFO] [stdout]     |
[INFO] [stdout] 539 | ///    然后 <script> 里用 CHART_POINTS 画两条线
[INFO] [stdout]     |             ^^^^^^^^
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stdout] warning: unclosed HTML tag `i64`
[INFO] [stdout]    --> src/handlers/stats.rs:520:44
[INFO] [stdout]     |
[INFO] [stdout] 520 | /// 1. 签名：State + AuthUser + Path(id): Path<i64>
[INFO] [stdout]     |                                               ^^^^^
[INFO] [stdout]     |
[INFO] [stdout] help: try marking as source code
[INFO] [stdout]     |
[INFO] [stdout] 520 | /// 1. 签名：State + AuthUser + Path(id): `Path<i64>`
[INFO] [stdout]     |                                           +         +
[INFO] [stdout] 
[INFO] [stdout] 
[INFO] [stderr]     Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 15s
[INFO] [stderr]    Generated /opt/rustwide/target/doc/train_record/index.html
[INFO] running `Command { std: "docker" "inspect" "626f444fbf7fda5e6318ac848e674643d06ebe5a07b049b25629bb4d0a61b702", kill_on_drop: false }`
[INFO] running `Command { std: "docker" "rm" "-f" "626f444fbf7fda5e6318ac848e674643d06ebe5a07b049b25629bb4d0a61b702", kill_on_drop: false }`
[INFO] [stdout] 626f444fbf7fda5e6318ac848e674643d06ebe5a07b049b25629bb4d0a61b702
