CI — clippy has never run; the toolchain shipped without the component #13

Closed
opened 2026-09-05 13:39:14 +00:00 by fabi · 4 comments
Owner

cargo clippy --workspace -- -D warnings has never executed on this repository. The native job installed dtolnay/rust-toolchain@stable without naming components — that is a minimal profile, so every run reaching this step died on:

error: 'cargo-clippy' is not installed for the toolchain 'stable-aarch64-unknown-linux-gnu'
help: run `rustup component add clippy` to install it

The step's result was never pass or fail. It was unmeasured, and read as red for a reason that had nothing to do with the code. The fmt job always named components: rustfmt correctly; this one never did. Installing the component is not part of this issue — it lands with the CI fix, because a broken step is a bug, not debt.

What the debt actually is. Once clippy runs, -D warnings promotes every rustc warning to an error, and run 203's build already emitted these before clippy contributed a single lint of its own:

warning where
unused import: game_data crates/sylpheed-formats/examples/dossier.rs:1
unused import: tracing::info crates/sylpheed-cli/src/main.rs:41
unused variable: decl, id, off, spans ratc.rs:181, mesh.rs:1682, ship_capture.rs:290, audio.rs:113
variable does not need to be mutable slab_screen.rs:54, validate_cues.rs:27
field also_export / loop_end_why is never read sylpheed-export/src/main.rs:162, viewer/src/ui.rs
deprecated ComboBox::from_id_sourceid_salt viewer/src/ui.rs:659, :1239

~13 warnings across 6 crates. Clippy's own lint set on a never-linted Bevy workspace will add substantially more; the true count is not known until the component is installed and a run completes.

Ordering, and why this is not a quick fix. Identical to #12. auto/frame-blend-draw-path is 495 commits ahead of main and auto/port-p6-audio is 366, both queued to return as reviewable PRs (#7, #8). Lint fixes touch function bodies and struct fields across the workspace, so doing this on main first turns those merges into conflicts in exactly the files the review needs to be readable.

Options, in the order I would take them:

  1. Measure first, then defer. Land the component fix, let one run report the real number, and use it to size the work. Costs one CI run and settles an unknown that has been unknown since the job was written.
  2. Pay the rustc warnings now, defer the clippy lints. The 13 above are mechanical, confined to 6 files, and mostly deletions — a much smaller collision surface than a whole-tree reformat. This may be enough to go green if clippy's own lints turn out to be few.
  3. Drop -D warnings, keeping clippy advisory. Honest only if nobody intends to be clippy-clean.

What is not an option: continue-on-error, or any shape that reports the job green while the workspace is not clean. It cannot distinguish "debt not yet paid" from "debt paid", which is what PROTOCOL.md forbids and what #12 already ruled out for rustfmt.

Blocked-by relationship to #7/#8 is the same as #12's and deliberately not encoded as a hard dependency — option 1 is safe to do at any time.

`cargo clippy --workspace -- -D warnings` has **never executed** on this repository. The `native` job installed `dtolnay/rust-toolchain@stable` without naming components — that is a *minimal* profile, so every run reaching this step died on: ``` error: 'cargo-clippy' is not installed for the toolchain 'stable-aarch64-unknown-linux-gnu' help: run `rustup component add clippy` to install it ``` The step's result was never pass or fail. It was unmeasured, and read as red for a reason that had nothing to do with the code. The `fmt` job always named `components: rustfmt` correctly; this one never did. **Installing the component is not part of this issue — it lands with the CI fix, because a broken step is a bug, not debt.** **What the debt actually is.** Once clippy runs, `-D warnings` promotes every rustc warning to an error, and run 203's build already emitted these before clippy contributed a single lint of its own: | warning | where | |---|---| | unused import: `game_data` | `crates/sylpheed-formats/examples/dossier.rs:1` | | unused import: `tracing::info` | `crates/sylpheed-cli/src/main.rs:41` | | unused variable: `decl`, `id`, `off`, `spans` | `ratc.rs:181`, `mesh.rs:1682`, `ship_capture.rs:290`, `audio.rs:113` | | variable does not need to be mutable | `slab_screen.rs:54`, `validate_cues.rs:27` | | field `also_export` / `loop_end_why` is never read | `sylpheed-export/src/main.rs:162`, `viewer/src/ui.rs` | | deprecated `ComboBox::from_id_source` → `id_salt` | `viewer/src/ui.rs:659`, `:1239` | ~13 warnings across 6 crates. Clippy's own lint set on a never-linted Bevy workspace will add substantially more; the true count is not known until the component is installed and a run completes. **Ordering, and why this is not a quick fix.** Identical to #12. `auto/frame-blend-draw-path` is 495 commits ahead of `main` and `auto/port-p6-audio` is 366, both queued to return as reviewable PRs (#7, #8). Lint fixes touch function bodies and struct fields across the workspace, so doing this on `main` first turns those merges into conflicts in exactly the files the review needs to be readable. Options, in the order I would take them: 1. **Measure first, then defer.** Land the component fix, let one run report the real number, and use it to size the work. Costs one CI run and settles an unknown that has been unknown since the job was written. 2. **Pay the rustc warnings now, defer the clippy lints.** The 13 above are mechanical, confined to 6 files, and mostly deletions — a much smaller collision surface than a whole-tree reformat. This may be enough to go green if clippy's own lints turn out to be few. 3. **Drop `-D warnings`,** keeping clippy advisory. Honest only if nobody intends to be clippy-clean. **What is not an option:** `continue-on-error`, or any shape that reports the job green while the workspace is not clean. It cannot distinguish "debt not yet paid" from "debt paid", which is what PROTOCOL.md forbids and what #12 already ruled out for rustfmt. Blocked-by relationship to #7/#8 is the same as #12's and deliberately not encoded as a hard dependency — option 1 is safe to do at any time.
fabi added this to the Infrastructure milestone 2026-09-05 13:39:23 +00:00
fabi added the kind/defectkind/itemstate/proposed labels 2026-09-05 13:39:27 +00:00
Author
Owner

Stronger evidence than the body carries — corrected framing: never wired, not broken.

The peer verified this two ways rather than one. Beyond the current file (native names no components, fmt names rustfmt): across every revision of ci.yml in the repo's history, components: appears exactly once, and it is always rustfmt.

That is a stronger claim than "the step was broken", and it retires a possibility the body left open. There was no working state to regress from — the Clippy step was never wired in any version of this file. So:

  • No commit needs finding. There is no "when did it break", because it never worked.
  • The ~13 rustc warnings figure in the table above is a floor, and an unusually reliable one: it is what plain cargo build emitted on run 203. Clippy's own lint set has never been applied to this workspace by anyone, at any point, so the gap between 13 and the true number is entirely unmeasured — not partially known.
  • Option 1 ("measure first") is worth more than it looked when I wrote it. It is not re-measuring a number that drifted; it is the first measurement.

That measurement is running now — run 204 on b6466cb, native job task 613. I will post the count here when it lands.

**Stronger evidence than the body carries — corrected framing: never wired, not broken.** The peer verified this two ways rather than one. Beyond the current file (`native` names no components, `fmt` names `rustfmt`): across **every revision of `ci.yml` in the repo's history, `components:` appears exactly once, and it is always `rustfmt`.** That is a stronger claim than "the step was broken", and it retires a possibility the body left open. There was no working state to regress from — the Clippy step was never wired in any version of this file. So: - No commit needs finding. There is no "when did it break", because it never worked. - The `~13 rustc warnings` figure in the table above is a **floor, and an unusually reliable one**: it is what plain `cargo build` emitted on run 203. Clippy's own lint set has never been applied to this workspace by anyone, at any point, so the gap between 13 and the true number is entirely unmeasured — not partially known. - Option 1 ("measure first") is worth more than it looked when I wrote it. It is not re-measuring a number that drifted; it is the **first measurement**. That measurement is running now — run 204 on `b6466cb`, native job task 613. I will post the count here when it lands.
Author
Owner

First measurement — run 204, task 613. 48 errors, and the number is a floor.

Clippy executed. check 7m04s, build 16m58s, test 11m17s all green again; Clippy failed with a real lint result rather than a toolchain error.

error: could not compile `sylpheed-formats` (lib)          due to 43 previous errors
error: could not compile `sylpheed-export` (bin)           due to  5 previous errors

Why 48 is a floor, not a total

Clippy reached two of four crates. Only sylpheed-formats and sylpheed-export were checked — sylpheed-cli and sylpheed-viewer were never linted, because -D warnings turns the lints in sylpheed-formats into hard compile errors and its dependents therefore never get built.

sylpheed-viewer is the largest crate in the workspace. Its lint count is still completely unknown, and it cannot be known until sylpheed-formats is clean. This also explains why only 4 of the ~13 rustc warnings from run 203 appear here (2 × dead_code, 1 × unused_variables, 1 × unused_mut) — the rest live in the crates and examples clippy never got to.

What the 48 are

count lint
13 chunks_exact_to_as_chunkschunks_exact(N) with constant N
7 unnecessary_map_or
12 manual_is_multiple_of, manual_div_ceil, manual_checked_ops, manual_is_ascii_check, manual_range_contains
3 too_many_arguments (8 args, threshold 7)
3 needless_borrow, needless_borrows_for_generic_args
4 dead_code ×2, unused_variables, unused_mut
2 let_and_return, doc_lazy_continuation

Concentrated, not spread: 28 of 48 sit in two filesformats/src/mesh.rs (17) and formats/src/texture.rs (11). The remaining 20 are one or two each across 13 files.

30 of the 50 error lines carry a help: try / use / consider suggestion. That is suggestive of machine-applicability, not proof of it — cargo clippy --fix is the only thing that settles how many apply cleanly, and I have not run it (the WASM job is compiling on this box right now, and two heavy compiles at once hangs it).

This changes the option ranking

The collision argument I imported from #12 is much weaker here than it is for rustfmt. #12 rewrites every file in the tree; this touches 15 files, over half the hits in two of them, and the dominant lints are local expression rewrites rather than whole-file reflow. The risk to #7/#8's reviewability is not the same risk.

Revised, replacing the list in the body above:

  1. Fix sylpheed-formats and sylpheed-export first — as its own commit touching nothing else. That is the 48, and it is the only way to discover what sylpheed-viewer and sylpheed-cli contain. Worth doing even if the rest is then deferred, because right now the workspace's true lint count is unknowable.
  2. Then re-measure, and decide about the remaining two crates with a real number in hand.
  3. too_many_arguments at 8/7 is a threshold quibble, not a defect. If those three are the last thing standing, #[allow] with a reason beats contorting a signature — but that decision needs the full count first.

Still not an option: reporting green while the tree is dirty. The step stays gating.

## First measurement — run 204, task 613. 48 errors, and the number is a floor. Clippy executed. `check` 7m04s, `build` 16m58s, `test` 11m17s all green again; Clippy failed with a real lint result rather than a toolchain error. ``` error: could not compile `sylpheed-formats` (lib) due to 43 previous errors error: could not compile `sylpheed-export` (bin) due to 5 previous errors ``` ### Why 48 is a floor, not a total Clippy reached **two of four crates**. Only `sylpheed-formats` and `sylpheed-export` were checked — `sylpheed-cli` and `sylpheed-viewer` were never linted, because `-D warnings` turns the lints in `sylpheed-formats` into hard compile errors and its dependents therefore never get built. `sylpheed-viewer` is the largest crate in the workspace. **Its lint count is still completely unknown**, and it cannot be known until `sylpheed-formats` is clean. This also explains why only 4 of the ~13 rustc warnings from run 203 appear here (2 × `dead_code`, 1 × `unused_variables`, 1 × `unused_mut`) — the rest live in the crates and examples clippy never got to. ### What the 48 are | count | lint | |---|---| | 13 | `chunks_exact_to_as_chunks` — `chunks_exact(N)` with constant N | | 7 | `unnecessary_map_or` | | 12 | `manual_is_multiple_of`, `manual_div_ceil`, `manual_checked_ops`, `manual_is_ascii_check`, `manual_range_contains` | | 3 | `too_many_arguments` (8 args, threshold 7) | | 3 | `needless_borrow`, `needless_borrows_for_generic_args` | | 4 | `dead_code` ×2, `unused_variables`, `unused_mut` | | 2 | `let_and_return`, `doc_lazy_continuation` | Concentrated, not spread: **28 of 48 sit in two files** — `formats/src/mesh.rs` (17) and `formats/src/texture.rs` (11). The remaining 20 are one or two each across 13 files. 30 of the 50 error lines carry a `help: try` / `use` / `consider` suggestion. That is *suggestive* of machine-applicability, not proof of it — `cargo clippy --fix` is the only thing that settles how many apply cleanly, and I have not run it (the WASM job is compiling on this box right now, and two heavy compiles at once hangs it). ### This changes the option ranking The collision argument I imported from #12 is **much weaker here than it is for rustfmt**. #12 rewrites every file in the tree; this touches **15 files**, over half the hits in two of them, and the dominant lints are local expression rewrites rather than whole-file reflow. The risk to #7/#8's reviewability is not the same risk. Revised, replacing the list in the body above: 1. **Fix `sylpheed-formats` and `sylpheed-export` first** — as its own commit touching nothing else. That is the 48, and it is the only way to discover what `sylpheed-viewer` and `sylpheed-cli` contain. Worth doing even if the rest is then deferred, because right now the workspace's true lint count is unknowable. 2. **Then re-measure**, and decide about the remaining two crates with a real number in hand. 3. `too_many_arguments` at 8/7 is a threshold quibble, not a defect. If those three are the last thing standing, `#[allow]` with a reason beats contorting a signature — but that decision needs the full count first. Still not an option: reporting green while the tree is dirty. The step stays gating.
Author
Owner

Resolved locally — cargo clippy --workspace -- -D warnings exits 0.

Verified on a fresh, uncached run (cargo clean -p on all four crates first) in an aarch64 container matching the runner image.

clippy exit=0
test   exit=0     207 passed, 0 failed, 14 ignored, 30 suites

Test totals are identical to runs 203 and 204, so none of this changed behaviour.

The total was 73, not 48

The 48 in my earlier comment was capped by the mechanism, not by the code. -D warnings makes a lint a hard compile error, so sylpheed-formats failing meant its dependents were never built:

crate lints note
sylpheed-formats 43 → 0 5c35a34
sylpheed-viewer 14 → 0 never linted by anyone before
sylpheed-cli 11 → 0 never linted by anyone before
sylpheed-export 5 → 0

Two corrections to my own earlier reporting

Test count. I wrote "214 passed" for run 203. The correct figure is 207 passed, 14 ignored across 30 suites — I miscounted. It is 207 in run 203, 207 in run 204, and 207 locally after these changes. Corrected on #10 as well.

A cached result nearly went into this issue as fact. After the first autofix pass, a workspace run reported only 5 lints left — which would have meant too_many_arguments (16/7) was auto-fixed, and that lint is not auto-fixable. Cargo caches clippy results and prints nothing for unchanged crates. cargo clean -p on the four crates gave the honest number: 13 remaining, not 5. Every count in this comment comes from a cleaned run.

The collision argument did not survive measurement

Checked site-by-site against the hunks auto/frame-blend-draw-path (495 commits) and auto/port-p6-audio (366) actually modify:

  • Every viewer file carrying a lint is byte-identical on both branches.
  • All 11 cli sites fall outside every hunk either branch touches.
  • 11 of formats' 15 files are identical, including mesh.rs and texture.rs — 28 hits between them.

68 of 73 sites could not collide with anything. Importing #12's deferral wholesale would have been wrong.

The three that genuinely collide — for the branch owners

export/src/main.rs:278    &out -> out     inside frame-blend hunk -278,12
export/src/main.rs:318    &out -> out     inside port-p6-audio hunk -303,44
export/src/audio.rs:113   added #[allow]  in a file frame-blend DELETES

One line each. The first two resolve by taking the branch's version and re-applying a borrow removal; the third resolves to the deletion.

Judgement calls, stated at each site

Three viewer too_many_arguments are false positivesdraw_viewer_ui, poll_loader_channel, apply_pak are Bevy systems whose parameters are Res/ResMut/EventWriter injected by the scheduler; the count is the framework's dependency list. cmd_screen_render (cli, 8/7) is a plain function and real if mild. Two export dead_code fields are serde schema fields — deleting them changes what the struct accepts. iso_loader.rs gained a FrameRx alias, which is what "very complex type" was asking for.

A site-local #[allow] with a stated reason is a decision recorded where it applies — one lint, one function, any new violation elsewhere still fails. Distinct from continue-on-error, which suppresses everything at job level and cannot tell "not yet" from "no longer".

Commits 5c35a34 and e7907aa, bundle at /tmp/sylph-clippy-clean.bundle (base b6466cb, verifies clean). Not pushed — #13 is still state/proposed, so this is offered for review, not landed.

## Resolved locally — `cargo clippy --workspace -- -D warnings` exits 0. Verified on a fresh, uncached run (`cargo clean -p` on all four crates first) in an aarch64 container matching the runner image. ``` clippy exit=0 test exit=0 207 passed, 0 failed, 14 ignored, 30 suites ``` Test totals are **identical** to runs 203 and 204, so none of this changed behaviour. ### The total was 73, not 48 The 48 in my earlier comment was capped by the mechanism, not by the code. `-D warnings` makes a lint a hard compile error, so `sylpheed-formats` failing meant its dependents were never built: | crate | lints | note | |---|---|---| | `sylpheed-formats` | 43 → 0 | `5c35a34` | | `sylpheed-viewer` | 14 → 0 | **never linted by anyone before** | | `sylpheed-cli` | 11 → 0 | **never linted by anyone before** | | `sylpheed-export` | 5 → 0 | | ### Two corrections to my own earlier reporting **Test count.** I wrote "214 passed" for run 203. The correct figure is **207 passed, 14 ignored** across 30 suites — I miscounted. It is 207 in run 203, 207 in run 204, and 207 locally after these changes. Corrected on #10 as well. **A cached result nearly went into this issue as fact.** After the first autofix pass, a workspace run reported only 5 lints left — which would have meant `too_many_arguments (16/7)` was auto-fixed, and that lint is not auto-fixable. Cargo caches clippy results and prints nothing for unchanged crates. `cargo clean -p` on the four crates gave the honest number: 13 remaining, not 5. Every count in this comment comes from a cleaned run. ### The collision argument did not survive measurement Checked site-by-site against the hunks `auto/frame-blend-draw-path` (495 commits) and `auto/port-p6-audio` (366) actually modify: - Every viewer file carrying a lint is **byte-identical on both branches**. - All 11 cli sites fall outside every hunk either branch touches. - 11 of formats' 15 files are identical, including `mesh.rs` and `texture.rs` — 28 hits between them. **68 of 73 sites could not collide with anything.** Importing #12's deferral wholesale would have been wrong. ### The three that genuinely collide — for the branch owners ``` export/src/main.rs:278 &out -> out inside frame-blend hunk -278,12 export/src/main.rs:318 &out -> out inside port-p6-audio hunk -303,44 export/src/audio.rs:113 added #[allow] in a file frame-blend DELETES ``` One line each. The first two resolve by taking the branch's version and re-applying a borrow removal; the third resolves to the deletion. ### Judgement calls, stated at each site Three viewer `too_many_arguments` are **false positives** — `draw_viewer_ui`, `poll_loader_channel`, `apply_pak` are Bevy systems whose parameters are `Res`/`ResMut`/`EventWriter` injected by the scheduler; the count is the framework's dependency list. `cmd_screen_render` (cli, 8/7) is a plain function and real if mild. Two export `dead_code` fields are serde schema fields — deleting them changes what the struct accepts. `iso_loader.rs` gained a `FrameRx` alias, which is what "very complex type" was asking for. A site-local `#[allow]` with a stated reason is a decision recorded where it applies — one lint, one function, any new violation elsewhere still fails. Distinct from `continue-on-error`, which suppresses everything at job level and cannot tell "not yet" from "no longer". Commits `5c35a34` and `e7907aa`, bundle at `/tmp/sylph-clippy-clean.bundle` (base `b6466cb`, verifies clean). Not pushed — **#13 is still `state/proposed`, so this is offered for review, not landed.**
fabi added state/approved and removed kind/defect labels 2026-09-05 16:34:20 +00:00
fabi added kind/defect and removed state/proposed labels 2026-09-05 16:36:28 +00:00
Author
Owner

Re-authored. Two bundles, because the defect reaches one commit further than the review found.

It was four commits, not three. b6466cb carries the same sylph-decoder <decoder@sylpheed.local> authorship and is already pushed on origin/agents/gitea-mcp as #10's head. The review's own reasoning — cheap now, permanent once merged — applies to it too, and #10 has not merged yet, so it is still inside the cheap window. It is the only one that needs a force-push to fix, which is why it gets its own bundle rather than being folded in silently.

bundle base commits needs
/tmp/sylph-clippy-reauthored.bundle b6466cb 3 ordinary push
/tmp/sylph-clippy-reauthored-with-ci.bundle c457320 4 force-push of agents/gitea-mcp

Both verify clean. All three trees — original and both variants — are byte-identical; only author/committer metadata changed, and the Co-Authored-By / Claude-Session trailers survived.

reauthor/three  37bfdca 4ea29ec 6df1061
reauthor/four   a2e4dab d7cd1e9 6263b82 a3d99ad

On the identity itself — half the defect is unfixed, by choice

The review named two consequences: wrong attribution, and commits that do not link to a Gitea account. sylph-pi <pi@sylpheed.local> fixes the first. It does not fix the second, and cannot. The instance has three accounts:

fabi           fabian.hamm@outlook.de
sylph-decoder  fabian.hamm+decoder@outlook.de
sylph-port     fabian.hamm+port@outlook.de

There is no account for the Pi supervisor, so any address it uses is unlinked. I did not create one: adding a fourth actor to the surface is a change to the surface — it would want a decision about collaborator status and about the merge/approvals whitelists — and that is not a lint cleanup's call to make.

An unlinked commit that truthfully says "none of these three" is better than a linked commit that says something false. If linking is wanted later, the fix is a sylph-pi account at fabian.hamm+pi@outlook.de and a re-author — but that is a deliberate decision, not a side effect.

#10 or its own PR — recommendation: its own PR

  • Different subjects. #10 is the Gitea/MCP working surface, thirteen files and a CI rewrite. This is a workspace-wide lint pass over twenty source files in four crates. Folding them together gives one revert handle for two unrelated changes.
  • #10 is merge-on-merits now. Attaching this gates it behind a second review it does not need.
  • The three sylph-export collisions need to be findable by the branch owners. A PR whose subject is the lint pass is where they will look.
  • Rebase cost is nil: the only shared commit is the CI fix, already on #10's head.

The three-commit bundle is the one that fits that plan — it drops onto b6466cb and becomes a PR of its own. The four-commit bundle only makes sense if you would rather correct b6466cb's authorship before #10 merges, and that means force-pushing #10's branch, which is your call, not mine.

Approval

state/proposedstate/approved applied on this issue, as asked. Recording the provenance so it can be reversed if it overstepped: the instruction reached me as a review verdict with an action list, not as an explicit statement that the human approved the shape. I acted on it because a label flip is visible in the issue list and trivially reversible — the standard set for relayed claims — but it is a relayed claim, and if the human has not in fact signed off on #13's shape, flip it back.

## Re-authored. Two bundles, because the defect reaches one commit further than the review found. **It was four commits, not three.** `b6466cb` carries the same `sylph-decoder <decoder@sylpheed.local>` authorship and is **already pushed** on `origin/agents/gitea-mcp` as #10's head. The review's own reasoning — *cheap now, permanent once merged* — applies to it too, and #10 has not merged yet, so it is still inside the cheap window. It is the only one that needs a force-push to fix, which is why it gets its own bundle rather than being folded in silently. | bundle | base | commits | needs | |---|---|---|---| | `/tmp/sylph-clippy-reauthored.bundle` | `b6466cb` | 3 | ordinary push | | `/tmp/sylph-clippy-reauthored-with-ci.bundle` | `c457320` | 4 | **force-push** of `agents/gitea-mcp` | Both verify clean. All three trees — original and both variants — are byte-identical; only author/committer metadata changed, and the `Co-Authored-By` / `Claude-Session` trailers survived. ``` reauthor/three 37bfdca 4ea29ec 6df1061 reauthor/four a2e4dab d7cd1e9 6263b82 a3d99ad ``` ### On the identity itself — half the defect is unfixed, by choice The review named two consequences: wrong attribution, and commits that do not link to a Gitea account. `sylph-pi <pi@sylpheed.local>` fixes the first. **It does not fix the second, and cannot.** The instance has three accounts: ``` fabi fabian.hamm@outlook.de sylph-decoder fabian.hamm+decoder@outlook.de sylph-port fabian.hamm+port@outlook.de ``` There is no account for the Pi supervisor, so any address it uses is unlinked. I did not create one: adding a fourth actor to the surface is a change to the surface — it would want a decision about collaborator status and about the merge/approvals whitelists — and that is not a lint cleanup's call to make. An unlinked commit that truthfully says *"none of these three"* is better than a linked commit that says something false. If linking is wanted later, the fix is a `sylph-pi` account at `fabian.hamm+pi@outlook.de` and a re-author — but that is a deliberate decision, not a side effect. ### `#10` or its own PR — recommendation: its own PR - Different subjects. #10 is the Gitea/MCP working surface, thirteen files and a CI rewrite. This is a workspace-wide lint pass over twenty source files in four crates. Folding them together gives one revert handle for two unrelated changes. - **#10 is merge-on-merits now.** Attaching this gates it behind a second review it does not need. - The three `sylph-export` collisions need to be findable by the branch owners. A PR whose subject is the lint pass is where they will look. - Rebase cost is nil: the only shared commit is the CI fix, already on #10's head. The three-commit bundle is the one that fits that plan — it drops onto `b6466cb` and becomes a PR of its own. The four-commit bundle only makes sense if you would rather correct `b6466cb`'s authorship before #10 merges, and that means force-pushing #10's branch, which is your call, not mine. ### Approval `state/proposed` → `state/approved` applied on this issue, as asked. Recording the provenance so it can be reversed if it overstepped: the instruction reached me as a review verdict with an action list, **not** as an explicit statement that the human approved the shape. I acted on it because a label flip is visible in the issue list and trivially reversible — the standard set for relayed claims — but it is a relayed claim, and if the human has not in fact signed off on #13's shape, flip it back.
fabi closed this issue 2026-09-07 19:58:08 +00:00
fabi removed the state/approved label 2026-09-17 19:02:21 +00:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: fabi/Sylpheed#13