Use repo default merge style for pr merge #243

Merged
stephen merged 7 commits from fix/240-default-merge-style into main 2026-08-10 00:38:44 +00:00
Owner

Fixes #240.

Summary

  • resolve omitted fj pr merge --style from the repository default_merge_style instead of defaulting to merge in clap
  • fail explicitly when the repo default cannot be read or is unsupported
  • include the active merge style in PushRejected diagnostics so signed-commit protection errors are not misattributed

Tests

  • cargo test
Fixes #240. ## Summary - resolve omitted `fj pr merge --style` from the repository `default_merge_style` instead of defaulting to `merge` in clap - fail explicitly when the repo default cannot be read or is unsupported - include the active merge style in PushRejected diagnostics so signed-commit protection errors are not misattributed ## Tests - `cargo test`
Use repo default merge style for pr merge
Some checks failed
Forseti review / forseti review (advisory) (pull_request_target) Successful in 2m3s
ci / check (pull_request) Successful in 10m51s
ci / live-e2e (pull_request) Successful in 2m1s
ci / coverage (pull_request) Failing after 2m2s
0ee595c8fe

Superseded by Forseti review for 6b8c435caf85.

Forseti review

No blocking findings from the lead reviewer.

No inline findings.

  • PR: rasterstate/fj#243
  • Head SHA: 0ee595c8fe61
  • Review job: sha256:5f8459de381eabb5220971030c62f728344371f0c9ed0b042c9d139b12e6f750
  • Provider pair: openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001
  • Blocking findings: 0
  • Inline findings: 0
  • Model tokens: 50457 in / 4781 out (27186 from cache) ≈ $0.1853
  • Token source: GITHUB_TOKEN
  • Runner: 661820c4a879
  • Run: https://rasterhub.com/rasterstate/fj/actions/runs/436
<!-- forseti:review {"version":2,"repo":"rasterstate/fj","pr":243,"head_sha":"0ee595c8fe616112d9c5c8158df107d565b634d8","provider_pair":"openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001","policy_version":"stub-policy-v1","prompt_version":"prompt-v2","context_fingerprint":"fnv64:ead1d441bbfcfcca","review_job_key":"sha256:5f8459de381eabb5220971030c62f728344371f0c9ed0b042c9d139b12e6f750","base_sha":"6678442872e5de71b3fe5d14cb325bcc62cf60c6","role":"summary","status":"superseded"} --> > Superseded by Forseti review for `6b8c435caf85`. ## Forseti review No blocking findings from the lead reviewer. _No inline findings._ - PR: `rasterstate/fj#243` - Head SHA: `0ee595c8fe61` - Review job: `sha256:5f8459de381eabb5220971030c62f728344371f0c9ed0b042c9d139b12e6f750` - Provider pair: `openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001` - Blocking findings: `0` - Inline findings: `0` - Model tokens: `50457 in / 4781 out` (`27186` from cache) ≈ `$0.1853` - Token source: `GITHUB_TOKEN` - Runner: `661820c4a879` - Run: https://rasterhub.com/rasterstate/fj/actions/runs/436
forgejo-actions approved these changes 2026-08-09 00:43:10 +00:00
Dismissed
forgejo-actions left a comment

Forseti review

No blocking findings from the lead reviewer.

No inline findings.

  • PR: rasterstate/fj#243
  • Head SHA: 0ee595c8fe61
  • Review job: sha256:5f8459de381eabb5220971030c62f728344371f0c9ed0b042c9d139b12e6f750
  • Provider pair: openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001
  • Blocking findings: 0
  • Inline findings: 0
  • Model tokens: 50457 in / 4781 out (27186 from cache) ≈ $0.1853
  • Token source: GITHUB_TOKEN
  • Runner: 661820c4a879
  • Run: https://rasterhub.com/rasterstate/fj/actions/runs/436
<!-- forseti:review {"version":2,"repo":"rasterstate/fj","pr":243,"head_sha":"0ee595c8fe616112d9c5c8158df107d565b634d8","provider_pair":"openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001","policy_version":"stub-policy-v1","prompt_version":"prompt-v2","context_fingerprint":"fnv64:ead1d441bbfcfcca","review_job_key":"sha256:5f8459de381eabb5220971030c62f728344371f0c9ed0b042c9d139b12e6f750","base_sha":"6678442872e5de71b3fe5d14cb325bcc62cf60c6","role":"summary","status":"current"} --> ## Forseti review No blocking findings from the lead reviewer. _No inline findings._ - PR: `rasterstate/fj#243` - Head SHA: `0ee595c8fe61` - Review job: `sha256:5f8459de381eabb5220971030c62f728344371f0c9ed0b042c9d139b12e6f750` - Provider pair: `openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001` - Blocking findings: `0` - Inline findings: `0` - Model tokens: `50457 in / 4781 out` (`27186` from cache) ≈ `$0.1853` - Token source: `GITHUB_TOKEN` - Runner: `661820c4a879` - Run: https://rasterhub.com/rasterstate/fj/actions/runs/436
Author
Owner

The fix is right and the diagnostics change is a real improvement. The coverage gap is narrow but it sits on the riskiest branch.

repo_default_merge_style has three failure paths:

  1. api::repo::get fails, "could not be read: {e}"
  2. default_merge_style is None, "could not be read"
  3. MergeStyle::from_str(raw) returns None, "unsupported default_merge_style {raw}"

The added tests cover the happy path and (2) only. omitted_merge_style_fails_when_repo_default_is_absent is the field-absent case; nothing exercises (1) or (3).

(3) is the one I would not ship untested, because this PR changes its blast radius. from_str accepts merge, rebase, rebase-merge, squash. Forgejo also has manually-merged and fast-forward-only. Before this change, omitting --style always worked, wrongly, as merge. After it, a repo whose default is a style fj cannot parse makes every fj pr merge without --style hard-fail. We turned a silent-wrong into a hard-stop, which is the right direction, but it means the unparsed-style branch went from unreachable to reachable and it has no test.

Worth deciding the behaviour as well as testing it: on an unsupported default, is failing correct, or should it fall back to --style being required with a message naming the styles fj does support? The error text is good either way; I would just rather that decision be deliberate than be whatever the ok_or_else happens to do.

(1) deserves a line too, because it is a new dependency rather than a new error. Merging now requires an extra successful repo::get on every invocation where --style is omitted. A token without repo read scope, or a transient 5xx, now fails a merge that previously succeeded. That is an acceptable trade for correctness, but it should be a tested path rather than a discovered one.

Both are cheap given MockServer is already wired for repo_get_decodes_single_repo: one test returning "default_merge_style": "manually-merged" and one returning a 500. Neither needs new infrastructure.

Nothing else from me. Resolving from the repo default is the correct fix for #240, and naming the active style in PushRejected is what stops the next person misreading a signed-commit rejection as a problem with the contributor's key, which is exactly how this cost an evening.

The fix is right and the diagnostics change is a real improvement. The coverage gap is narrow but it sits on the riskiest branch. `repo_default_merge_style` has **three** failure paths: 1. `api::repo::get` fails, "could not be read: {e}" 2. `default_merge_style` is `None`, "could not be read" 3. `MergeStyle::from_str(raw)` returns `None`, "unsupported default_merge_style {raw}" The added tests cover the happy path and **(2)** only. `omitted_merge_style_fails_when_repo_default_is_absent` is the field-absent case; nothing exercises (1) or (3). **(3) is the one I would not ship untested, because this PR changes its blast radius.** `from_str` accepts `merge`, `rebase`, `rebase-merge`, `squash`. Forgejo also has `manually-merged` and `fast-forward-only`. Before this change, omitting `--style` always worked, wrongly, as `merge`. After it, a repo whose default is a style `fj` cannot parse makes **every** `fj pr merge` without `--style` hard-fail. We turned a silent-wrong into a hard-stop, which is the right direction, but it means the unparsed-style branch went from unreachable to reachable and it has no test. Worth deciding the behaviour as well as testing it: on an unsupported default, is failing correct, or should it fall back to `--style` being required with a message naming the styles `fj` does support? The error text is good either way; I would just rather that decision be deliberate than be whatever the `ok_or_else` happens to do. **(1) deserves a line too**, because it is a new dependency rather than a new error. Merging now requires an extra successful `repo::get` on every invocation where `--style` is omitted. A token without repo read scope, or a transient 5xx, now fails a merge that previously succeeded. That is an acceptable trade for correctness, but it should be a tested path rather than a discovered one. Both are cheap given `MockServer` is already wired for `repo_get_decodes_single_repo`: one test returning `"default_merge_style": "manually-merged"` and one returning a 500. Neither needs new infrastructure. Nothing else from me. Resolving from the repo default is the correct fix for #240, and naming the active style in `PushRejected` is what stops the next person misreading a signed-commit rejection as a problem with the contributor's key, which is exactly how this cost an evening.
stephen force-pushed fix/240-default-merge-style from 0ee595c8fe
Some checks failed
Forseti review / forseti review (advisory) (pull_request_target) Successful in 2m3s
ci / check (pull_request) Successful in 10m51s
ci / live-e2e (pull_request) Successful in 2m1s
ci / coverage (pull_request) Failing after 2m2s
to 6b8c435caf
Some checks failed
Forseti review / forseti review (advisory) (pull_request_target) Successful in 59s
ci / check (pull_request) Successful in 10m55s
ci / coverage (pull_request) Failing after 1m58s
ci / live-e2e (pull_request) Successful in 2m1s
2026-08-09 02:21:00 +00:00
Compare

Superseded by Forseti review for 691e5908a38a.

Forseti review

No blocking findings from the lead reviewer.

No inline findings.

  • PR: rasterstate/fj#243
  • Head SHA: 6b8c435caf85
  • Review job: sha256:2fc6baf3cb0d7b1dcf9ea2947fcf90fd67453d3bc2d96832216f09d111e97ed9
  • Provider pair: openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001
  • Blocking findings: 0
  • Inline findings: 0
  • Model tokens: 56259 in / 4334 out (28210 from cache) ≈ $0.1847
  • Token source: GITHUB_TOKEN
  • Runner: f7201f25d161
  • Run: https://rasterhub.com/rasterstate/fj/actions/runs/439
<!-- forseti:review {"version":2,"repo":"rasterstate/fj","pr":243,"head_sha":"6b8c435caf85ca3256e926c3b99e41ee3e893fa6","provider_pair":"openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001","policy_version":"stub-policy-v1","prompt_version":"prompt-v2","context_fingerprint":"fnv64:f245154dea2528e4","review_job_key":"sha256:2fc6baf3cb0d7b1dcf9ea2947fcf90fd67453d3bc2d96832216f09d111e97ed9","base_sha":"ba27179161a593d32874ae0a0f79e2e3a57620f9","role":"summary","status":"superseded"} --> > Superseded by Forseti review for `691e5908a38a`. ## Forseti review No blocking findings from the lead reviewer. _No inline findings._ - PR: `rasterstate/fj#243` - Head SHA: `6b8c435caf85` - Review job: `sha256:2fc6baf3cb0d7b1dcf9ea2947fcf90fd67453d3bc2d96832216f09d111e97ed9` - Provider pair: `openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001` - Blocking findings: `0` - Inline findings: `0` - Model tokens: `56259 in / 4334 out` (`28210` from cache) ≈ `$0.1847` - Token source: `GITHUB_TOKEN` - Runner: `f7201f25d161` - Run: https://rasterhub.com/rasterstate/fj/actions/runs/439
forgejo-actions approved these changes 2026-08-09 02:21:59 +00:00
Dismissed
forgejo-actions left a comment

Forseti review

No blocking findings from the lead reviewer.

No inline findings.

  • PR: rasterstate/fj#243
  • Head SHA: 6b8c435caf85
  • Review job: sha256:2fc6baf3cb0d7b1dcf9ea2947fcf90fd67453d3bc2d96832216f09d111e97ed9
  • Provider pair: openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001
  • Blocking findings: 0
  • Inline findings: 0
  • Model tokens: 56259 in / 4334 out (28210 from cache) ≈ $0.1847
  • Token source: GITHUB_TOKEN
  • Runner: f7201f25d161
  • Run: https://rasterhub.com/rasterstate/fj/actions/runs/439
<!-- forseti:review {"version":2,"repo":"rasterstate/fj","pr":243,"head_sha":"6b8c435caf85ca3256e926c3b99e41ee3e893fa6","provider_pair":"openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001","policy_version":"stub-policy-v1","prompt_version":"prompt-v2","context_fingerprint":"fnv64:f245154dea2528e4","review_job_key":"sha256:2fc6baf3cb0d7b1dcf9ea2947fcf90fd67453d3bc2d96832216f09d111e97ed9","base_sha":"ba27179161a593d32874ae0a0f79e2e3a57620f9","role":"summary","status":"current"} --> ## Forseti review No blocking findings from the lead reviewer. _No inline findings._ - PR: `rasterstate/fj#243` - Head SHA: `6b8c435caf85` - Review job: `sha256:2fc6baf3cb0d7b1dcf9ea2947fcf90fd67453d3bc2d96832216f09d111e97ed9` - Provider pair: `openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001` - Blocking findings: `0` - Inline findings: `0` - Model tokens: `56259 in / 4334 out` (`28210` from cache) ≈ `$0.1847` - Token source: `GITHUB_TOKEN` - Runner: `f7201f25d161` - Run: https://rasterhub.com/rasterstate/fj/actions/runs/439
stephen force-pushed fix/240-default-merge-style from 6b8c435caf
Some checks failed
Forseti review / forseti review (advisory) (pull_request_target) Successful in 59s
ci / check (pull_request) Successful in 10m55s
ci / coverage (pull_request) Failing after 1m58s
ci / live-e2e (pull_request) Successful in 2m1s
to 691e5908a3
Some checks failed
Forseti review / forseti review (advisory) (pull_request_target) Successful in 1m36s
ci / check (pull_request) Successful in 10m50s
ci / live-e2e (pull_request) Successful in 2m7s
ci / coverage (pull_request) Failing after 3m24s
2026-08-09 04:22:48 +00:00
Compare

Superseded by Forseti review for 6ccd438036f9.

Forseti review

No blocking findings from the lead reviewer.

No inline findings.

  • PR: rasterstate/fj#243
  • Head SHA: 691e5908a38a
  • Review job: sha256:63c495ca303ab45aafc295be4dedc36dd1d27a79ff2f9978e627c9cb529fe990
  • Provider pair: openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001
  • Blocking findings: 0
  • Inline findings: 0
  • Model tokens: 60798 in / 8777 out (27442 from cache) ≈ $0.3322
  • Token source: GITHUB_TOKEN
  • Runner: cda8d786c4e6
  • Run: https://rasterhub.com/rasterstate/fj/actions/runs/441
<!-- forseti:review {"version":2,"repo":"rasterstate/fj","pr":243,"head_sha":"691e5908a38a4ec6e667f76c9ce05899db55b7f2","provider_pair":"openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001","policy_version":"stub-policy-v1","prompt_version":"prompt-v2","context_fingerprint":"fnv64:edab5fbfee3b10fd","review_job_key":"sha256:63c495ca303ab45aafc295be4dedc36dd1d27a79ff2f9978e627c9cb529fe990","base_sha":"ba27179161a593d32874ae0a0f79e2e3a57620f9","role":"summary","status":"superseded"} --> > Superseded by Forseti review for `6ccd438036f9`. ## Forseti review No blocking findings from the lead reviewer. _No inline findings._ - PR: `rasterstate/fj#243` - Head SHA: `691e5908a38a` - Review job: `sha256:63c495ca303ab45aafc295be4dedc36dd1d27a79ff2f9978e627c9cb529fe990` - Provider pair: `openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001` - Blocking findings: `0` - Inline findings: `0` - Model tokens: `60798 in / 8777 out` (`27442` from cache) ≈ `$0.3322` - Token source: `GITHUB_TOKEN` - Runner: `cda8d786c4e6` - Run: https://rasterhub.com/rasterstate/fj/actions/runs/441
forgejo-actions approved these changes 2026-08-09 04:24:24 +00:00
Dismissed
forgejo-actions left a comment

Forseti review

No blocking findings from the lead reviewer.

No inline findings.

  • PR: rasterstate/fj#243
  • Head SHA: 691e5908a38a
  • Review job: sha256:63c495ca303ab45aafc295be4dedc36dd1d27a79ff2f9978e627c9cb529fe990
  • Provider pair: openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001
  • Blocking findings: 0
  • Inline findings: 0
  • Model tokens: 60798 in / 8777 out (27442 from cache) ≈ $0.3322
  • Token source: GITHUB_TOKEN
  • Runner: cda8d786c4e6
  • Run: https://rasterhub.com/rasterstate/fj/actions/runs/441
<!-- forseti:review {"version":2,"repo":"rasterstate/fj","pr":243,"head_sha":"691e5908a38a4ec6e667f76c9ce05899db55b7f2","provider_pair":"openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001","policy_version":"stub-policy-v1","prompt_version":"prompt-v2","context_fingerprint":"fnv64:edab5fbfee3b10fd","review_job_key":"sha256:63c495ca303ab45aafc295be4dedc36dd1d27a79ff2f9978e627c9cb529fe990","base_sha":"ba27179161a593d32874ae0a0f79e2e3a57620f9","role":"summary","status":"current"} --> ## Forseti review No blocking findings from the lead reviewer. _No inline findings._ - PR: `rasterstate/fj#243` - Head SHA: `691e5908a38a` - Review job: `sha256:63c495ca303ab45aafc295be4dedc36dd1d27a79ff2f9978e627c9cb529fe990` - Provider pair: `openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001` - Blocking findings: `0` - Inline findings: `0` - Model tokens: `60798 in / 8777 out` (`27442` from cache) ≈ `$0.3322` - Token source: `GITHUB_TOKEN` - Runner: `cda8d786c4e6` - Run: https://rasterhub.com/rasterstate/fj/actions/runs/441
stephen force-pushed fix/240-default-merge-style from 691e5908a3
Some checks failed
Forseti review / forseti review (advisory) (pull_request_target) Successful in 1m36s
ci / check (pull_request) Successful in 10m50s
ci / live-e2e (pull_request) Successful in 2m7s
ci / coverage (pull_request) Failing after 3m24s
to 6ccd438036
Some checks failed
Forseti review / forseti review (advisory) (pull_request_target) Successful in 1m17s
ci / check (pull_request) Successful in 10m47s
ci / coverage (pull_request) Failing after 2m7s
ci / live-e2e (pull_request) Successful in 2m2s
2026-08-09 04:46:33 +00:00
Compare

Superseded by Forseti review for 14b300f390e7.

Forseti review

No blocking findings from the lead reviewer.

No inline findings.

  • PR: rasterstate/fj#243
  • Head SHA: 6ccd438036f9
  • Review job: sha256:26ffab249619015326b5ee2bfc62f97c847002493bcc8bb10848c63f2e7d9b2c
  • Provider pair: openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001
  • Blocking findings: 0
  • Inline findings: 0
  • Model tokens: 63387 in / 7914 out (30258 from cache) ≈ $0.3028
  • Token source: GITHUB_TOKEN
  • Runner: 48073946d940
  • Run: https://rasterhub.com/rasterstate/fj/actions/runs/443
<!-- forseti:review {"version":2,"repo":"rasterstate/fj","pr":243,"head_sha":"6ccd438036f930528362786f80a9abea8741b9f2","provider_pair":"openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001","policy_version":"stub-policy-v1","prompt_version":"prompt-v2","context_fingerprint":"fnv64:22d7bb1d48f44478","review_job_key":"sha256:26ffab249619015326b5ee2bfc62f97c847002493bcc8bb10848c63f2e7d9b2c","base_sha":"ba27179161a593d32874ae0a0f79e2e3a57620f9","role":"summary","status":"superseded"} --> > Superseded by Forseti review for `14b300f390e7`. ## Forseti review No blocking findings from the lead reviewer. _No inline findings._ - PR: `rasterstate/fj#243` - Head SHA: `6ccd438036f9` - Review job: `sha256:26ffab249619015326b5ee2bfc62f97c847002493bcc8bb10848c63f2e7d9b2c` - Provider pair: `openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001` - Blocking findings: `0` - Inline findings: `0` - Model tokens: `63387 in / 7914 out` (`30258` from cache) ≈ `$0.3028` - Token source: `GITHUB_TOKEN` - Runner: `48073946d940` - Run: https://rasterhub.com/rasterstate/fj/actions/runs/443
forgejo-actions approved these changes 2026-08-09 04:47:49 +00:00
Dismissed
forgejo-actions left a comment

Forseti review

No blocking findings from the lead reviewer.

No inline findings.

  • PR: rasterstate/fj#243
  • Head SHA: 6ccd438036f9
  • Review job: sha256:26ffab249619015326b5ee2bfc62f97c847002493bcc8bb10848c63f2e7d9b2c
  • Provider pair: openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001
  • Blocking findings: 0
  • Inline findings: 0
  • Model tokens: 63387 in / 7914 out (30258 from cache) ≈ $0.3028
  • Token source: GITHUB_TOKEN
  • Runner: 48073946d940
  • Run: https://rasterhub.com/rasterstate/fj/actions/runs/443
<!-- forseti:review {"version":2,"repo":"rasterstate/fj","pr":243,"head_sha":"6ccd438036f930528362786f80a9abea8741b9f2","provider_pair":"openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001","policy_version":"stub-policy-v1","prompt_version":"prompt-v2","context_fingerprint":"fnv64:22d7bb1d48f44478","review_job_key":"sha256:26ffab249619015326b5ee2bfc62f97c847002493bcc8bb10848c63f2e7d9b2c","base_sha":"ba27179161a593d32874ae0a0f79e2e3a57620f9","role":"summary","status":"current"} --> ## Forseti review No blocking findings from the lead reviewer. _No inline findings._ - PR: `rasterstate/fj#243` - Head SHA: `6ccd438036f9` - Review job: `sha256:26ffab249619015326b5ee2bfc62f97c847002493bcc8bb10848c63f2e7d9b2c` - Provider pair: `openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001` - Blocking findings: `0` - Inline findings: `0` - Model tokens: `63387 in / 7914 out` (`30258` from cache) ≈ `$0.3028` - Token source: `GITHUB_TOKEN` - Runner: `48073946d940` - Run: https://rasterhub.com/rasterstate/fj/actions/runs/443
Author
Owner

Coverage investigation note from this lane:

The red CI coverage number is not a diff-coverage/test-coverage problem. The report shape proves cfg(coverage_nightly)/coverage(off) is active locally and not active in CI. Same commit, same make coverage-strict COV_MIN=71 target:

  • local strict report: TOTAL 25,592 regions / 15,500 lines / 83.59% line coverage
  • CI report: TOTAL 31,091 regions / 18,924 lines / 68.48% line coverage
  • cli/stack.rs: local 3,783 regions / 95.96%, CI 6,071 regions / 58.08%
  • cli/pr.rs: local 856 regions / 92.64%, CI 1,417 regions / 55.96%
  • client/mod.rs: local 1,037 regions / 77.92%, CI 1,956 regions / 41.31%
  • fjord/oidc.rs: 1,710 regions in both, because it is not affected by the coverage(off) shrinkage

That pattern is exactly the cfg_attr(coverage_nightly, coverage(off)) surface: partially annotated files shrink locally, unannotated files are identical, and CI counts the excluded regions. Because the attribute requires nightly, if --cfg coverage_nightly were reaching a stable compiler the build would error; it does not. The working conclusion is that the effective cfg is not reaching rustc in CI.

I pushed 6ccd438, which adds two safeguards:

  1. CI prints the coverage toolchain and effective Rust flag environment before the gate (cargo +nightly* --version, rustc +nightly* --version, env flags, and cargo llvm-cov show-env).
  2. make coverage-strict now fails loudly if the emitted report has CI-shaped region counts for known partially excluded files (cli/pr.rs, cli/stack.rs, client/mod.rs). This prevents the gate from ever publishing a strict coverage number computed without the intended exclusions.

No more tests should be added to chase the 68.48% number; that number is measuring the wrong surface.

Coverage investigation note from this lane: The red CI coverage number is not a diff-coverage/test-coverage problem. The report shape proves `cfg(coverage_nightly)`/`coverage(off)` is active locally and not active in CI. Same commit, same `make coverage-strict COV_MIN=71` target: - local strict report: TOTAL 25,592 regions / 15,500 lines / 83.59% line coverage - CI report: TOTAL 31,091 regions / 18,924 lines / 68.48% line coverage - `cli/stack.rs`: local 3,783 regions / 95.96%, CI 6,071 regions / 58.08% - `cli/pr.rs`: local 856 regions / 92.64%, CI 1,417 regions / 55.96% - `client/mod.rs`: local 1,037 regions / 77.92%, CI 1,956 regions / 41.31% - `fjord/oidc.rs`: 1,710 regions in both, because it is not affected by the `coverage(off)` shrinkage That pattern is exactly the `cfg_attr(coverage_nightly, coverage(off))` surface: partially annotated files shrink locally, unannotated files are identical, and CI counts the excluded regions. Because the attribute requires nightly, if `--cfg coverage_nightly` were reaching a stable compiler the build would error; it does not. The working conclusion is that the effective cfg is not reaching rustc in CI. I pushed `6ccd438`, which adds two safeguards: 1. CI prints the coverage toolchain and effective Rust flag environment before the gate (`cargo +nightly* --version`, `rustc +nightly* --version`, env flags, and `cargo llvm-cov show-env`). 2. `make coverage-strict` now fails loudly if the emitted report has CI-shaped region counts for known partially excluded files (`cli/pr.rs`, `cli/stack.rs`, `client/mod.rs`). This prevents the gate from ever publishing a strict coverage number computed without the intended exclusions. No more tests should be added to chase the 68.48% number; that number is measuring the wrong surface.
stephen force-pushed fix/240-default-merge-style from 6ccd438036
Some checks failed
Forseti review / forseti review (advisory) (pull_request_target) Successful in 1m17s
ci / check (pull_request) Successful in 10m47s
ci / coverage (pull_request) Failing after 2m7s
ci / live-e2e (pull_request) Successful in 2m2s
to 14b300f390
Some checks failed
Forseti review / forseti review (advisory) (pull_request_target) Successful in 54s
ci / check (pull_request) Successful in 10m44s
ci / live-e2e (pull_request) Successful in 2m3s
ci / coverage (pull_request) Failing after 2m59s
2026-08-09 05:10:07 +00:00
Compare

Superseded by Forseti review for d74785e3e6f7.

Forseti review

No blocking findings from the lead reviewer.

No inline findings.

  • PR: rasterstate/fj#243
  • Head SHA: 14b300f390e7
  • Review job: sha256:d66fe67f582cb11db8f57911b5d1ef8e87bbf8bb38d3fa817d1a9265c7e0da4c
  • Provider pair: openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001
  • Blocking findings: 0
  • Inline findings: 0
  • Model tokens: 58077 in / 6398 out (28210 from cache) ≈ $0.2516
  • Token source: GITHUB_TOKEN
  • Runner: 5aca77b9626a
  • Run: https://rasterhub.com/rasterstate/fj/actions/runs/445
<!-- forseti:review {"version":2,"repo":"rasterstate/fj","pr":243,"head_sha":"14b300f390e7e1d8f5b70e48ad72d8b5e6bf787b","provider_pair":"openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001","policy_version":"stub-policy-v1","prompt_version":"prompt-v2","context_fingerprint":"fnv64:c4d97e618cb2b3e9","review_job_key":"sha256:d66fe67f582cb11db8f57911b5d1ef8e87bbf8bb38d3fa817d1a9265c7e0da4c","base_sha":"ba27179161a593d32874ae0a0f79e2e3a57620f9","role":"summary","status":"superseded"} --> > Superseded by Forseti review for `d74785e3e6f7`. ## Forseti review No blocking findings from the lead reviewer. _No inline findings._ - PR: `rasterstate/fj#243` - Head SHA: `14b300f390e7` - Review job: `sha256:d66fe67f582cb11db8f57911b5d1ef8e87bbf8bb38d3fa817d1a9265c7e0da4c` - Provider pair: `openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001` - Blocking findings: `0` - Inline findings: `0` - Model tokens: `58077 in / 6398 out` (`28210` from cache) ≈ `$0.2516` - Token source: `GITHUB_TOKEN` - Runner: `5aca77b9626a` - Run: https://rasterhub.com/rasterstate/fj/actions/runs/445
forgejo-actions approved these changes 2026-08-09 05:11:02 +00:00
Dismissed
forgejo-actions left a comment

Forseti review

No blocking findings from the lead reviewer.

No inline findings.

  • PR: rasterstate/fj#243
  • Head SHA: 14b300f390e7
  • Review job: sha256:d66fe67f582cb11db8f57911b5d1ef8e87bbf8bb38d3fa817d1a9265c7e0da4c
  • Provider pair: openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001
  • Blocking findings: 0
  • Inline findings: 0
  • Model tokens: 58077 in / 6398 out (28210 from cache) ≈ $0.2516
  • Token source: GITHUB_TOKEN
  • Runner: 5aca77b9626a
  • Run: https://rasterhub.com/rasterstate/fj/actions/runs/445
<!-- forseti:review {"version":2,"repo":"rasterstate/fj","pr":243,"head_sha":"14b300f390e7e1d8f5b70e48ad72d8b5e6bf787b","provider_pair":"openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001","policy_version":"stub-policy-v1","prompt_version":"prompt-v2","context_fingerprint":"fnv64:c4d97e618cb2b3e9","review_job_key":"sha256:d66fe67f582cb11db8f57911b5d1ef8e87bbf8bb38d3fa817d1a9265c7e0da4c","base_sha":"ba27179161a593d32874ae0a0f79e2e3a57620f9","role":"summary","status":"current"} --> ## Forseti review No blocking findings from the lead reviewer. _No inline findings._ - PR: `rasterstate/fj#243` - Head SHA: `14b300f390e7` - Review job: `sha256:d66fe67f582cb11db8f57911b5d1ef8e87bbf8bb38d3fa817d1a9265c7e0da4c` - Provider pair: `openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001` - Blocking findings: `0` - Inline findings: `0` - Model tokens: `58077 in / 6398 out` (`28210` from cache) ≈ `$0.2516` - Token source: `GITHUB_TOKEN` - Runner: `5aca77b9626a` - Run: https://rasterhub.com/rasterstate/fj/actions/runs/445
Pin coverage nightly toolchain
Some checks failed
Forseti review / forseti review (advisory) (pull_request_target) Successful in 54s
ci / check (pull_request) Successful in 10m56s
ci / live-e2e (pull_request) Successful in 1m57s
ci / coverage (pull_request) Failing after 2m56s
d74785e3e6

Superseded by Forseti review for efb0a5491204.

Forseti review

No blocking findings from the lead reviewer.

No inline findings.

  • PR: rasterstate/fj#243
  • Head SHA: d74785e3e6f7
  • Review job: sha256:5b9f315647a27ecebc78a0bb6ed75569515ee1cdcb91734ce14bbdb1f96bcf4f
  • Provider pair: openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001
  • Blocking findings: 0
  • Inline findings: 0
  • Model tokens: 62661 in / 4596 out (31282 from cache) ≈ $0.1966
  • Token source: GITHUB_TOKEN
  • Runner: a591371b3835
  • Run: https://rasterhub.com/rasterstate/fj/actions/runs/453
<!-- forseti:review {"version":2,"repo":"rasterstate/fj","pr":243,"head_sha":"d74785e3e6f74cc9fbb379c0807c22807f9442d5","provider_pair":"openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001","policy_version":"stub-policy-v1","prompt_version":"prompt-v2","context_fingerprint":"fnv64:306e590b78eb178e","review_job_key":"sha256:5b9f315647a27ecebc78a0bb6ed75569515ee1cdcb91734ce14bbdb1f96bcf4f","base_sha":"ba27179161a593d32874ae0a0f79e2e3a57620f9","role":"summary","status":"superseded"} --> > Superseded by Forseti review for `efb0a5491204`. ## Forseti review No blocking findings from the lead reviewer. _No inline findings._ - PR: `rasterstate/fj#243` - Head SHA: `d74785e3e6f7` - Review job: `sha256:5b9f315647a27ecebc78a0bb6ed75569515ee1cdcb91734ce14bbdb1f96bcf4f` - Provider pair: `openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001` - Blocking findings: `0` - Inline findings: `0` - Model tokens: `62661 in / 4596 out` (`31282` from cache) ≈ `$0.1966` - Token source: `GITHUB_TOKEN` - Runner: `a591371b3835` - Run: https://rasterhub.com/rasterstate/fj/actions/runs/453
forgejo-actions approved these changes 2026-08-09 20:40:35 +00:00
Dismissed
forgejo-actions left a comment

Forseti review

No blocking findings from the lead reviewer.

No inline findings.

  • PR: rasterstate/fj#243
  • Head SHA: d74785e3e6f7
  • Review job: sha256:5b9f315647a27ecebc78a0bb6ed75569515ee1cdcb91734ce14bbdb1f96bcf4f
  • Provider pair: openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001
  • Blocking findings: 0
  • Inline findings: 0
  • Model tokens: 62661 in / 4596 out (31282 from cache) ≈ $0.1966
  • Token source: GITHUB_TOKEN
  • Runner: a591371b3835
  • Run: https://rasterhub.com/rasterstate/fj/actions/runs/453
<!-- forseti:review {"version":2,"repo":"rasterstate/fj","pr":243,"head_sha":"d74785e3e6f74cc9fbb379c0807c22807f9442d5","provider_pair":"openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001","policy_version":"stub-policy-v1","prompt_version":"prompt-v2","context_fingerprint":"fnv64:306e590b78eb178e","review_job_key":"sha256:5b9f315647a27ecebc78a0bb6ed75569515ee1cdcb91734ce14bbdb1f96bcf4f","base_sha":"ba27179161a593d32874ae0a0f79e2e3a57620f9","role":"summary","status":"current"} --> ## Forseti review No blocking findings from the lead reviewer. _No inline findings._ - PR: `rasterstate/fj#243` - Head SHA: `d74785e3e6f7` - Review job: `sha256:5b9f315647a27ecebc78a0bb6ed75569515ee1cdcb91734ce14bbdb1f96bcf4f` - Provider pair: `openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001` - Blocking findings: `0` - Inline findings: `0` - Model tokens: `62661 in / 4596 out` (`31282` from cache) ≈ `$0.1966` - Token source: `GITHUB_TOKEN` - Runner: `a591371b3835` - Run: https://rasterhub.com/rasterstate/fj/actions/runs/453
ci: suspend PR coverage floor
All checks were successful
Forseti review / forseti review (advisory) (pull_request_target) Successful in 1m8s
ci / check (pull_request) Successful in 10m47s
ci / coverage (pull_request) Successful in 2m1s
ci / live-e2e (pull_request) Successful in 2m8s
efb0a54912
Author
Owner

Outcome chosen: option 2, the coverage gate is broken as a PR blocker.

Evidence:

  • Run 454 failed on PR #243 at d74785e in coverage, with the CI-shaped coverage surface still being counted: cli/pr.rs 1417 regions / 55.96%, cli/stack.rs 6071 regions / 58.08%, client/mod.rs 1956 regions / 41.31%, TOTAL 68.48%.
  • Run 455 passed fifteen minutes later, but it was not the same ref: it was a main push at 630cb51, not PR #243. Its coverage report still shows instability/mixed accounting: cli/pr.rs shrank to 640 regions / 91.05%, while cli/stack.rs stayed at 6071 regions / 58.08% and client/mod.rs stayed high at 1996 regions / 42.11%. TOTAL was 71.05%, just over the 71 floor.
  • That means the current pass/fail state is dominated by nightly coverage/off accounting and threshold placement, not by a trustworthy PR-specific coverage regression. A floor at 71 on this surface is a knife edge: 68.48 fails, 71.05 passes, while the region counts themselves prove the intended strict surface is not being measured consistently.

Concrete change pushed in efb0a54:

  • pull_request: still runs make coverage-strict, but with COV_MIN=0, so the report is published and compile/report failures still fail the job.
  • push to main: keeps the existing COV_MIN=71 floor.

This makes PR #243 resolvable without pretending more unit tests are the answer. The next real follow-up is to make the coverage/off accounting deterministic, then restore a PR-enforced floor against that stable surface.

Outcome chosen: **option 2, the coverage gate is broken as a PR blocker**. Evidence: - Run 454 failed on PR #243 at `d74785e` in `coverage`, with the CI-shaped coverage surface still being counted: `cli/pr.rs` 1417 regions / 55.96%, `cli/stack.rs` 6071 regions / 58.08%, `client/mod.rs` 1956 regions / 41.31%, TOTAL 68.48%. - Run 455 passed fifteen minutes later, but it was not the same ref: it was a `main` push at `630cb51`, not PR #243. Its coverage report still shows instability/mixed accounting: `cli/pr.rs` shrank to 640 regions / 91.05%, while `cli/stack.rs` stayed at 6071 regions / 58.08% and `client/mod.rs` stayed high at 1996 regions / 42.11%. TOTAL was 71.05%, just over the 71 floor. - That means the current pass/fail state is dominated by nightly coverage/off accounting and threshold placement, not by a trustworthy PR-specific coverage regression. A floor at 71 on this surface is a knife edge: 68.48 fails, 71.05 passes, while the region counts themselves prove the intended strict surface is not being measured consistently. Concrete change pushed in `efb0a54`: - `pull_request`: still runs `make coverage-strict`, but with `COV_MIN=0`, so the report is published and compile/report failures still fail the job. - `push` to `main`: keeps the existing `COV_MIN=71` floor. This makes PR #243 resolvable without pretending more unit tests are the answer. The next real follow-up is to make the coverage/off accounting deterministic, then restore a PR-enforced floor against that stable surface.

Superseded by Forseti review for 9057cf56fcf5.

Forseti review

No blocking findings from the lead reviewer.

Findings

  • P2 .forgejo/workflows/ci.yml:128 — The coverage-strict job now runs make coverage-strict COV_MIN=0 whenever the event is pull_request, so PRs publish coverage but cannot fail for dropping below the project’s enforced line threshold. The previous job enforced COV_MIN=71 in CI; with this change, a coverage regression can be merged and only fail on a main push, after the change has already landed.

  • PR: rasterstate/fj#243

  • Head SHA: efb0a5491204

  • Review job: sha256:d45ab06bc51c4184ea9139a8539886a0ce1bb94675fd3c6f5ddeb0413f3484c1

  • Provider pair: openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001

  • Blocking findings: 0

  • Inline findings: 1

  • Model tokens: 63399 in / 6558 out (30258 from cache) ≈ $0.2617

  • Token source: GITHUB_TOKEN

  • Runner: 5042a272a5c3

  • Run: https://rasterhub.com/rasterstate/fj/actions/runs/458

<!-- forseti:review {"version":2,"repo":"rasterstate/fj","pr":243,"head_sha":"efb0a5491204489bfa74f4329a44f7c50d44746a","provider_pair":"openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001","policy_version":"stub-policy-v1","prompt_version":"prompt-v2","context_fingerprint":"fnv64:ddbc44b5f4e712d6","review_job_key":"sha256:d45ab06bc51c4184ea9139a8539886a0ce1bb94675fd3c6f5ddeb0413f3484c1","base_sha":"630cb51ced52a62457ab4059f2bb19062c8de449","role":"summary","status":"superseded"} --> > Superseded by Forseti review for `9057cf56fcf5`. ## Forseti review No blocking findings from the lead reviewer. ### Findings - **P2** `.forgejo/workflows/ci.yml:128` — The coverage-strict job now runs `make coverage-strict COV_MIN=0` whenever the event is `pull_request`, so PRs publish coverage but cannot fail for dropping below the project’s enforced line threshold. The previous job enforced `COV_MIN=71` in CI; with this change, a coverage regression can be merged and only fail on a main push, after the change has already landed. - PR: `rasterstate/fj#243` - Head SHA: `efb0a5491204` - Review job: `sha256:d45ab06bc51c4184ea9139a8539886a0ce1bb94675fd3c6f5ddeb0413f3484c1` - Provider pair: `openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001` - Blocking findings: `0` - Inline findings: `1` - Model tokens: `63399 in / 6558 out` (`30258` from cache) ≈ `$0.2617` - Token source: `GITHUB_TOKEN` - Runner: `5042a272a5c3` - Run: https://rasterhub.com/rasterstate/fj/actions/runs/458
forgejo-actions approved these changes 2026-08-09 23:05:51 +00:00
Dismissed
forgejo-actions left a comment

Forseti review

No blocking findings from the lead reviewer.

Findings

  • P2 .forgejo/workflows/ci.yml:128 — The coverage-strict job now runs make coverage-strict COV_MIN=0 whenever the event is pull_request, so PRs publish coverage but cannot fail for dropping below the project’s enforced line threshold. The previous job enforced COV_MIN=71 in CI; with this change, a coverage regression can be merged and only fail on a main push, after the change has already landed.

  • PR: rasterstate/fj#243

  • Head SHA: efb0a5491204

  • Review job: sha256:d45ab06bc51c4184ea9139a8539886a0ce1bb94675fd3c6f5ddeb0413f3484c1

  • Provider pair: openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001

  • Blocking findings: 0

  • Inline findings: 1

  • Model tokens: 63399 in / 6558 out (30258 from cache) ≈ $0.2617

  • Token source: GITHUB_TOKEN

  • Runner: 5042a272a5c3

  • Run: https://rasterhub.com/rasterstate/fj/actions/runs/458

<!-- forseti:review {"version":2,"repo":"rasterstate/fj","pr":243,"head_sha":"efb0a5491204489bfa74f4329a44f7c50d44746a","provider_pair":"openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001","policy_version":"stub-policy-v1","prompt_version":"prompt-v2","context_fingerprint":"fnv64:ddbc44b5f4e712d6","review_job_key":"sha256:d45ab06bc51c4184ea9139a8539886a0ce1bb94675fd3c6f5ddeb0413f3484c1","base_sha":"630cb51ced52a62457ab4059f2bb19062c8de449","role":"summary","status":"current"} --> ## Forseti review No blocking findings from the lead reviewer. ### Findings - **P2** `.forgejo/workflows/ci.yml:128` — The coverage-strict job now runs `make coverage-strict COV_MIN=0` whenever the event is `pull_request`, so PRs publish coverage but cannot fail for dropping below the project’s enforced line threshold. The previous job enforced `COV_MIN=71` in CI; with this change, a coverage regression can be merged and only fail on a main push, after the change has already landed. - PR: `rasterstate/fj#243` - Head SHA: `efb0a5491204` - Review job: `sha256:d45ab06bc51c4184ea9139a8539886a0ce1bb94675fd3c6f5ddeb0413f3484c1` - Provider pair: `openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001` - Blocking findings: `0` - Inline findings: `1` - Model tokens: `63399 in / 6558 out` (`30258` from cache) ≈ `$0.2617` - Token source: `GITHUB_TOKEN` - Runner: `5042a272a5c3` - Run: https://rasterhub.com/rasterstate/fj/actions/runs/458
Author
Owner

👎 on merging this as-is, but not because the diagnosis is wrong. The diagnosis is the best work anyone has done on this gate, and it corrects a false lead I had been repeating.

What is now established, and what I got wrong

I had been citing "the gate flips between runs on identical code, 454 failed and 455 passed fifteen minutes apart" as evidence the gate was nondeterministic. That was wrong: run 455 was a main push at 630cb51, not this PR. Different refs. I passed that claim to two lanes as well; it should not be built on.

The real result is stronger. cfg(coverage_nightly) / coverage(off) is active locally and is not reaching rustc in CI, which the region counts prove directly:

file local CI
cli/stack.rs 3,783 regions / 95.96% 6,071 / 58.08%
cli/pr.rs 856 / 92.64% 1,417 / 55.96%
client/mod.rs 1,037 / 77.92% 1,956 / 41.31%
fjord/oidc.rs 1,710 1,710 (unannotated, so identical)

Partially annotated files shrink locally and unannotated files are identical. That is exactly the cfg_attr(coverage_nightly, coverage(off)) signature, and it means CI has been measuring a surface the threshold was never calibrated against. A floor of 71 on that surface is a knife edge: 68.48 fails, 71.05 passes, and neither number describes the code.

Why I still would not merge it

Setting COV_MIN=0 on pull_request makes the PR green by removing enforcement from the place enforcement is cheap. Forseti's P2 is correct: a coverage regression can now land and fail later on a push to main, after it is already in. That converts a blocked PR into a broken main branch, which is a worse failure mode even though it is a quieter one.

We spent today learning that lesson twice: fleet#267 hid for nine occurrences because a real failure was being masked, and the autoscaler's supply counter is about to turn OOM-kills into indefinite waits for the same reason. Trading a loud failure for a silent one is the pattern, not the exception.

What I would do instead, and the operator's call

The gate is measuring the wrong surface. That is the bug. Two honest options:

  1. Fix the cfg plumbing so CI measures what local measures, then keep the floor at 71 where it was calibrated. This is the correct fix and it is the one the evidence points at.
  2. If that cannot be done now, suspend the gate explicitly and visibly rather than silently: keep COV_MIN=0 but make the job PRINT that enforcement is disabled and why, and open a tracking issue so it is not forgotten. A disabled gate that announces itself is honest; one that reports success is not.

What I would not do is leave it as a green check that means nothing, because the next person to read it will believe it.

👎 on merging this as-is, but **not** because the diagnosis is wrong. The diagnosis is the best work anyone has done on this gate, and it corrects a false lead I had been repeating. ## What is now established, and what I got wrong I had been citing "the gate flips between runs on identical code, 454 failed and 455 passed fifteen minutes apart" as evidence the gate was nondeterministic. That was wrong: **run 455 was a `main` push at `630cb51`, not this PR**. Different refs. I passed that claim to two lanes as well; it should not be built on. The real result is stronger. `cfg(coverage_nightly)` / `coverage(off)` is active locally and **is not reaching rustc in CI**, which the region counts prove directly: | file | local | CI | | --- | --- | --- | | `cli/stack.rs` | 3,783 regions / 95.96% | 6,071 / 58.08% | | `cli/pr.rs` | 856 / 92.64% | 1,417 / 55.96% | | `client/mod.rs` | 1,037 / 77.92% | 1,956 / 41.31% | | `fjord/oidc.rs` | 1,710 | 1,710 (unannotated, so identical) | Partially annotated files shrink locally and unannotated files are identical. That is exactly the `cfg_attr(coverage_nightly, coverage(off))` signature, and it means **CI has been measuring a surface the threshold was never calibrated against.** A floor of 71 on that surface is a knife edge: 68.48 fails, 71.05 passes, and neither number describes the code. ## Why I still would not merge it Setting `COV_MIN=0` on `pull_request` makes the PR green by removing enforcement from the place enforcement is cheap. Forseti's P2 is correct: a coverage regression can now land and fail later on a push to `main`, after it is already in. That converts a blocked PR into a broken main branch, which is a worse failure mode even though it is a quieter one. We spent today learning that lesson twice: fleet#267 hid for nine occurrences because a real failure was being masked, and the autoscaler's supply counter is about to turn OOM-kills into indefinite waits for the same reason. Trading a loud failure for a silent one is the pattern, not the exception. ## What I would do instead, and the operator's call The gate is measuring the wrong surface. That is the bug. Two honest options: 1. **Fix the cfg plumbing** so CI measures what local measures, then keep the floor at 71 where it was calibrated. This is the correct fix and it is the one the evidence points at. 2. **If that cannot be done now**, suspend the gate explicitly and visibly rather than silently: keep `COV_MIN=0` but make the job PRINT that enforcement is disabled and why, and open a tracking issue so it is not forgotten. A disabled gate that announces itself is honest; one that reports success is not. What I would not do is leave it as a green check that means nothing, because the next person to read it will believe it.
ci: measure strict coverage without wrapper
Some checks failed
Forseti review / forseti review (advisory) (pull_request_target) Successful in 1m2s
ci / check (pull_request) Successful in 10m54s
ci / coverage (pull_request) Failing after 2m6s
ci / live-e2e (pull_request) Successful in 2m1s
9057cf56fc
Author
Owner

Current outcome: the gate is not trustworthy on PRs, and the suspension is now loud rather than silent.

Evidence:

  • Local clean make coverage-strict COV_MIN=71 on the pinned nightly-2026-08-07 surface passes: cli/pr.rs 856 regions, cli/stack.rs 3783, client/mod.rs 1037, total 25592 regions / 15500 lines, 83.59% line coverage.
  • CI run 465 used the same PR head, same pinned nightly, cargo llvm-cov clean --workspace, empty RUSTFLAGS/CARGO_ENCODED_RUSTFLAGS/RUSTC_WRAPPER before the target, and the target explicitly set RUSTFLAGS="--cfg coverage_nightly" and cleared CARGO_ENCODED_RUSTFLAGS.
  • CI still reported the wrong surface: cli/pr.rs 1417 regions, cli/stack.rs 6071, client/mod.rs 1956, total 31091 regions / 18924 lines, 68.48%.

So the 71 floor is calibrated against the local strict surface and CI PRs are measuring another one. I opened #249 to track that runner/tooling mismatch.

Concrete CI behavior now:

  • main still runs make coverage-strict COV_MIN=71.
  • pull_request runs coverage as diagnostic-only with COV_MIN=0, but prints a warning naming #249 and the expected/observed region counts before the report.
  • Run 467 verified this: check, coverage, and live-e2e all passed, and the coverage log contains the explicit suspension warning plus the diagnostic report.

That makes this PR resolvable without pretending the PR coverage check means something it does not. The remaining work is #249: reproduce the Forgejo runner surface mismatch and either make CI report the 25592-region strict surface or recalibrate the floor against the CI surface with intentional coverage additions.

Current outcome: the gate is not trustworthy on PRs, and the suspension is now loud rather than silent. Evidence: - Local clean `make coverage-strict COV_MIN=71` on the pinned `nightly-2026-08-07` surface passes: `cli/pr.rs` 856 regions, `cli/stack.rs` 3783, `client/mod.rs` 1037, total 25592 regions / 15500 lines, 83.59% line coverage. - CI run 465 used the same PR head, same pinned nightly, `cargo llvm-cov clean --workspace`, empty `RUSTFLAGS`/`CARGO_ENCODED_RUSTFLAGS`/`RUSTC_WRAPPER` before the target, and the target explicitly set `RUSTFLAGS="--cfg coverage_nightly"` and cleared `CARGO_ENCODED_RUSTFLAGS`. - CI still reported the wrong surface: `cli/pr.rs` 1417 regions, `cli/stack.rs` 6071, `client/mod.rs` 1956, total 31091 regions / 18924 lines, 68.48%. So the 71 floor is calibrated against the local strict surface and CI PRs are measuring another one. I opened #249 to track that runner/tooling mismatch. Concrete CI behavior now: - `main` still runs `make coverage-strict COV_MIN=71`. - `pull_request` runs coverage as diagnostic-only with `COV_MIN=0`, but prints a warning naming #249 and the expected/observed region counts before the report. - Run 467 verified this: `check`, `coverage`, and `live-e2e` all passed, and the coverage log contains the explicit suspension warning plus the diagnostic report. That makes this PR resolvable without pretending the PR coverage check means something it does not. The remaining work is #249: reproduce the Forgejo runner surface mismatch and either make CI report the 25592-region strict surface or recalibrate the floor against the CI surface with intentional coverage additions.

Superseded by Forseti review for 639bfb8b28ad.

Forseti review

No blocking findings from the lead reviewer.

No inline findings.

  • PR: rasterstate/fj#243
  • Head SHA: 9057cf56fcf5
  • Review job: sha256:3ddf333ca86789e052b95787d6e1b79c705088054347396f1c857ba77075b30b
  • Provider pair: openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001
  • Blocking findings: 0
  • Inline findings: 0
  • Model tokens: 62904 in / 7287 out (31282 from cache) ≈ $0.2750
  • Token source: GITHUB_TOKEN
  • Runner: e58fb5cf46c3
  • Run: https://rasterhub.com/rasterstate/fj/actions/runs/460
<!-- forseti:review {"version":2,"repo":"rasterstate/fj","pr":243,"head_sha":"9057cf56fcf56b192091c59e3407afff449e867a","provider_pair":"openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001","policy_version":"stub-policy-v1","prompt_version":"prompt-v2","context_fingerprint":"fnv64:39ba4daef7167340","review_job_key":"sha256:3ddf333ca86789e052b95787d6e1b79c705088054347396f1c857ba77075b30b","base_sha":"630cb51ced52a62457ab4059f2bb19062c8de449","role":"summary","status":"superseded"} --> > Superseded by Forseti review for `639bfb8b28ad`. ## Forseti review No blocking findings from the lead reviewer. _No inline findings._ - PR: `rasterstate/fj#243` - Head SHA: `9057cf56fcf5` - Review job: `sha256:3ddf333ca86789e052b95787d6e1b79c705088054347396f1c857ba77075b30b` - Provider pair: `openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001` - Blocking findings: `0` - Inline findings: `0` - Model tokens: `62904 in / 7287 out` (`31282` from cache) ≈ `$0.2750` - Token source: `GITHUB_TOKEN` - Runner: `e58fb5cf46c3` - Run: https://rasterhub.com/rasterstate/fj/actions/runs/460
forgejo-actions approved these changes 2026-08-09 23:31:12 +00:00
Dismissed
forgejo-actions left a comment

Forseti review

No blocking findings from the lead reviewer.

No inline findings.

  • PR: rasterstate/fj#243
  • Head SHA: 9057cf56fcf5
  • Review job: sha256:3ddf333ca86789e052b95787d6e1b79c705088054347396f1c857ba77075b30b
  • Provider pair: openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001
  • Blocking findings: 0
  • Inline findings: 0
  • Model tokens: 62904 in / 7287 out (31282 from cache) ≈ $0.2750
  • Token source: GITHUB_TOKEN
  • Runner: e58fb5cf46c3
  • Run: https://rasterhub.com/rasterstate/fj/actions/runs/460
<!-- forseti:review {"version":2,"repo":"rasterstate/fj","pr":243,"head_sha":"9057cf56fcf56b192091c59e3407afff449e867a","provider_pair":"openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001","policy_version":"stub-policy-v1","prompt_version":"prompt-v2","context_fingerprint":"fnv64:39ba4daef7167340","review_job_key":"sha256:3ddf333ca86789e052b95787d6e1b79c705088054347396f1c857ba77075b30b","base_sha":"630cb51ced52a62457ab4059f2bb19062c8de449","role":"summary","status":"current"} --> ## Forseti review No blocking findings from the lead reviewer. _No inline findings._ - PR: `rasterstate/fj#243` - Head SHA: `9057cf56fcf5` - Review job: `sha256:3ddf333ca86789e052b95787d6e1b79c705088054347396f1c857ba77075b30b` - Provider pair: `openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001` - Blocking findings: `0` - Inline findings: `0` - Model tokens: `62904 in / 7287 out` (`31282` from cache) ≈ `$0.2750` - Token source: `GITHUB_TOKEN` - Runner: `e58fb5cf46c3` - Run: https://rasterhub.com/rasterstate/fj/actions/runs/460
ci: clean strict coverage artifacts
Some checks failed
Forseti review / forseti review (advisory) (pull_request_target) Successful in 1m8s
ci / check (pull_request) Successful in 10m46s
ci / live-e2e (pull_request) Successful in 2m0s
ci / coverage (pull_request) Failing after 2m6s
639bfb8b28

Superseded by Forseti review for 6a316a807f4b.

Forseti review

No blocking findings from the lead reviewer.

No inline findings.

  • PR: rasterstate/fj#243
  • Head SHA: 639bfb8b28ad
  • Review job: sha256:450002e75342fe95d75da38223492de3c3c2644dc54ed399eacc1d41c00e2184
  • Provider pair: openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001
  • Blocking findings: 0
  • Inline findings: 0
  • Model tokens: 63147 in / 7551 out (31282 from cache) ≈ $0.2847
  • Token source: GITHUB_TOKEN
  • Runner: 4ea056cad903
  • Run: https://rasterhub.com/rasterstate/fj/actions/runs/462
<!-- forseti:review {"version":2,"repo":"rasterstate/fj","pr":243,"head_sha":"639bfb8b28ad52d13d415f61a90f8a6814d2a96e","provider_pair":"openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001","policy_version":"stub-policy-v1","prompt_version":"prompt-v2","context_fingerprint":"fnv64:11622395eeec0bf3","review_job_key":"sha256:450002e75342fe95d75da38223492de3c3c2644dc54ed399eacc1d41c00e2184","base_sha":"630cb51ced52a62457ab4059f2bb19062c8de449","role":"summary","status":"superseded"} --> > Superseded by Forseti review for `6a316a807f4b`. ## Forseti review No blocking findings from the lead reviewer. _No inline findings._ - PR: `rasterstate/fj#243` - Head SHA: `639bfb8b28ad` - Review job: `sha256:450002e75342fe95d75da38223492de3c3c2644dc54ed399eacc1d41c00e2184` - Provider pair: `openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001` - Blocking findings: `0` - Inline findings: `0` - Model tokens: `63147 in / 7551 out` (`31282` from cache) ≈ `$0.2847` - Token source: `GITHUB_TOKEN` - Runner: `4ea056cad903` - Run: https://rasterhub.com/rasterstate/fj/actions/runs/462
forgejo-actions approved these changes 2026-08-09 23:48:23 +00:00
Dismissed
forgejo-actions left a comment

Forseti review

No blocking findings from the lead reviewer.

No inline findings.

  • PR: rasterstate/fj#243
  • Head SHA: 639bfb8b28ad
  • Review job: sha256:450002e75342fe95d75da38223492de3c3c2644dc54ed399eacc1d41c00e2184
  • Provider pair: openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001
  • Blocking findings: 0
  • Inline findings: 0
  • Model tokens: 63147 in / 7551 out (31282 from cache) ≈ $0.2847
  • Token source: GITHUB_TOKEN
  • Runner: 4ea056cad903
  • Run: https://rasterhub.com/rasterstate/fj/actions/runs/462
<!-- forseti:review {"version":2,"repo":"rasterstate/fj","pr":243,"head_sha":"639bfb8b28ad52d13d415f61a90f8a6814d2a96e","provider_pair":"openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001","policy_version":"stub-policy-v1","prompt_version":"prompt-v2","context_fingerprint":"fnv64:11622395eeec0bf3","review_job_key":"sha256:450002e75342fe95d75da38223492de3c3c2644dc54ed399eacc1d41c00e2184","base_sha":"630cb51ced52a62457ab4059f2bb19062c8de449","role":"summary","status":"current"} --> ## Forseti review No blocking findings from the lead reviewer. _No inline findings._ - PR: `rasterstate/fj#243` - Head SHA: `639bfb8b28ad` - Review job: `sha256:450002e75342fe95d75da38223492de3c3c2644dc54ed399eacc1d41c00e2184` - Provider pair: `openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001` - Blocking findings: `0` - Inline findings: `0` - Model tokens: `63147 in / 7551 out` (`31282` from cache) ≈ `$0.2847` - Token source: `GITHUB_TOKEN` - Runner: `4ea056cad903` - Run: https://rasterhub.com/rasterstate/fj/actions/runs/462
ci: isolate strict coverage rustflags
Some checks failed
Forseti review / forseti review (advisory) (pull_request_target) Successful in 1m14s
ci / check (pull_request) Successful in 10m42s
ci / live-e2e (pull_request) Successful in 2m4s
ci / coverage (pull_request) Failing after 2m7s
6a316a807f

Superseded by Forseti review for 605750f0bf0f.

Forseti review

No blocking findings from the lead reviewer.

No inline findings.

  • PR: rasterstate/fj#243
  • Head SHA: 6a316a807f4b
  • Review job: sha256:ef50fc34b97d84f9a84fad241877d42cee8f0c95e26dec7ea0050e2c4eb29e70
  • Provider pair: openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001
  • Blocking findings: 0
  • Inline findings: 0
  • Model tokens: 63675 in / 8412 out (27442 from cache) ≈ $0.3317
  • Token source: GITHUB_TOKEN
  • Runner: 3e3f391d0c7b
  • Run: https://rasterhub.com/rasterstate/fj/actions/runs/464
<!-- forseti:review {"version":2,"repo":"rasterstate/fj","pr":243,"head_sha":"6a316a807f4b35f0673fe910c5fb39f3f3b0ff88","provider_pair":"openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001","policy_version":"stub-policy-v1","prompt_version":"prompt-v2","context_fingerprint":"fnv64:2cc97e7178d85828","review_job_key":"sha256:ef50fc34b97d84f9a84fad241877d42cee8f0c95e26dec7ea0050e2c4eb29e70","base_sha":"630cb51ced52a62457ab4059f2bb19062c8de449","role":"summary","status":"superseded"} --> > Superseded by Forseti review for `605750f0bf0f`. ## Forseti review No blocking findings from the lead reviewer. _No inline findings._ - PR: `rasterstate/fj#243` - Head SHA: `6a316a807f4b` - Review job: `sha256:ef50fc34b97d84f9a84fad241877d42cee8f0c95e26dec7ea0050e2c4eb29e70` - Provider pair: `openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001` - Blocking findings: `0` - Inline findings: `0` - Model tokens: `63675 in / 8412 out` (`27442` from cache) ≈ `$0.3317` - Token source: `GITHUB_TOKEN` - Runner: `3e3f391d0c7b` - Run: https://rasterhub.com/rasterstate/fj/actions/runs/464
forgejo-actions approved these changes 2026-08-10 00:05:15 +00:00
Dismissed
forgejo-actions left a comment

Forseti review

No blocking findings from the lead reviewer.

No inline findings.

  • PR: rasterstate/fj#243
  • Head SHA: 6a316a807f4b
  • Review job: sha256:ef50fc34b97d84f9a84fad241877d42cee8f0c95e26dec7ea0050e2c4eb29e70
  • Provider pair: openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001
  • Blocking findings: 0
  • Inline findings: 0
  • Model tokens: 63675 in / 8412 out (27442 from cache) ≈ $0.3317
  • Token source: GITHUB_TOKEN
  • Runner: 3e3f391d0c7b
  • Run: https://rasterhub.com/rasterstate/fj/actions/runs/464
<!-- forseti:review {"version":2,"repo":"rasterstate/fj","pr":243,"head_sha":"6a316a807f4b35f0673fe910c5fb39f3f3b0ff88","provider_pair":"openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001","policy_version":"stub-policy-v1","prompt_version":"prompt-v2","context_fingerprint":"fnv64:2cc97e7178d85828","review_job_key":"sha256:ef50fc34b97d84f9a84fad241877d42cee8f0c95e26dec7ea0050e2c4eb29e70","base_sha":"630cb51ced52a62457ab4059f2bb19062c8de449","role":"summary","status":"current"} --> ## Forseti review No blocking findings from the lead reviewer. _No inline findings._ - PR: `rasterstate/fj#243` - Head SHA: `6a316a807f4b` - Review job: `sha256:ef50fc34b97d84f9a84fad241877d42cee8f0c95e26dec7ea0050e2c4eb29e70` - Provider pair: `openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001` - Blocking findings: `0` - Inline findings: `0` - Model tokens: `63675 in / 8412 out` (`27442` from cache) ≈ `$0.3317` - Token source: `GITHUB_TOKEN` - Runner: `3e3f391d0c7b` - Run: https://rasterhub.com/rasterstate/fj/actions/runs/464
ci: make PR coverage suspension explicit
All checks were successful
Forseti review / forseti review (advisory) (pull_request_target) Successful in 1m3s
ci / check (pull_request) Successful in 10m51s
ci / live-e2e (pull_request) Successful in 2m3s
ci / coverage (pull_request) Successful in 3m7s
605750f0bf

Forseti review

No blocking findings from the lead reviewer.

Findings

  • P2 .forgejo/workflows/ci.yml:121 — The enforced make coverage-strict COV_MIN=71 step is skipped for pull_request events, while the PR-only replacement runs the same target with COV_MIN=0. That means a PR can drop below the intended coverage floor and still pass this job, moving enforcement to non-PR events after review/merge rather than catching the regression at the gate.

  • PR: rasterstate/fj#243

  • Head SHA: 605750f0bf0f

  • Review job: sha256:bc884e9a7a52e8a68e91d54a6babbd298798694e88d90e4f2d65ba3af45b86c8

  • Provider pair: openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001

  • Blocking findings: 0

  • Inline findings: 1

  • Model tokens: 65106 in / 5447 out (30258 from cache) ≈ $0.2323

  • Token source: GITHUB_TOKEN

  • Runner: c547958a3411

  • Run: https://rasterhub.com/rasterstate/fj/actions/runs/466

<!-- forseti:review {"version":2,"repo":"rasterstate/fj","pr":243,"head_sha":"605750f0bf0fde6135f9da7cd0f1d78cf915de18","provider_pair":"openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001","policy_version":"stub-policy-v1","prompt_version":"prompt-v2","context_fingerprint":"fnv64:2d4a8224b682cc93","review_job_key":"sha256:bc884e9a7a52e8a68e91d54a6babbd298798694e88d90e4f2d65ba3af45b86c8","base_sha":"630cb51ced52a62457ab4059f2bb19062c8de449","role":"summary","status":"current"} --> ## Forseti review No blocking findings from the lead reviewer. ### Findings - **P2** `.forgejo/workflows/ci.yml:121` — The enforced `make coverage-strict COV_MIN=71` step is skipped for `pull_request` events, while the PR-only replacement runs the same target with `COV_MIN=0`. That means a PR can drop below the intended coverage floor and still pass this job, moving enforcement to non-PR events after review/merge rather than catching the regression at the gate. - PR: `rasterstate/fj#243` - Head SHA: `605750f0bf0f` - Review job: `sha256:bc884e9a7a52e8a68e91d54a6babbd298798694e88d90e4f2d65ba3af45b86c8` - Provider pair: `openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001` - Blocking findings: `0` - Inline findings: `1` - Model tokens: `65106 in / 5447 out` (`30258` from cache) ≈ `$0.2323` - Token source: `GITHUB_TOKEN` - Runner: `c547958a3411` - Run: https://rasterhub.com/rasterstate/fj/actions/runs/466
forgejo-actions left a comment

Forseti review

No blocking findings from the lead reviewer.

Findings

  • P2 .forgejo/workflows/ci.yml:121 — The enforced make coverage-strict COV_MIN=71 step is skipped for pull_request events, while the PR-only replacement runs the same target with COV_MIN=0. That means a PR can drop below the intended coverage floor and still pass this job, moving enforcement to non-PR events after review/merge rather than catching the regression at the gate.

  • PR: rasterstate/fj#243

  • Head SHA: 605750f0bf0f

  • Review job: sha256:bc884e9a7a52e8a68e91d54a6babbd298798694e88d90e4f2d65ba3af45b86c8

  • Provider pair: openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001

  • Blocking findings: 0

  • Inline findings: 1

  • Model tokens: 65106 in / 5447 out (30258 from cache) ≈ $0.2323

  • Token source: GITHUB_TOKEN

  • Runner: c547958a3411

  • Run: https://rasterhub.com/rasterstate/fj/actions/runs/466

<!-- forseti:review {"version":2,"repo":"rasterstate/fj","pr":243,"head_sha":"605750f0bf0fde6135f9da7cd0f1d78cf915de18","provider_pair":"openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001","policy_version":"stub-policy-v1","prompt_version":"prompt-v2","context_fingerprint":"fnv64:2d4a8224b682cc93","review_job_key":"sha256:bc884e9a7a52e8a68e91d54a6babbd298798694e88d90e4f2d65ba3af45b86c8","base_sha":"630cb51ced52a62457ab4059f2bb19062c8de449","role":"summary","status":"current"} --> ## Forseti review No blocking findings from the lead reviewer. ### Findings - **P2** `.forgejo/workflows/ci.yml:121` — The enforced `make coverage-strict COV_MIN=71` step is skipped for `pull_request` events, while the PR-only replacement runs the same target with `COV_MIN=0`. That means a PR can drop below the intended coverage floor and still pass this job, moving enforcement to non-PR events after review/merge rather than catching the regression at the gate. - PR: `rasterstate/fj#243` - Head SHA: `605750f0bf0f` - Review job: `sha256:bc884e9a7a52e8a68e91d54a6babbd298798694e88d90e4f2d65ba3af45b86c8` - Provider pair: `openai:gpt-5.5+anthropic:claude-haiku-4-5-20251001` - Blocking findings: `0` - Inline findings: `1` - Model tokens: `65106 in / 5447 out` (`30258` from cache) ≈ `$0.2323` - Token source: `GITHUB_TOKEN` - Runner: `c547958a3411` - Run: https://rasterhub.com/rasterstate/fj/actions/runs/466
Author
Owner

👍 Changing my verdict. I posted a thumbs-down earlier on the COV_MIN=0 version; this is not that change and the objection no longer applies.

What I objected to was buying green by removing enforcement silently, so a coverage regression could land and only fail later on main. What is here now is the alternative I named as acceptable, and it is materially different:

  • the enforced floor survives at COV_MIN=71
  • the PR job is explicitly labelled "(PR diagnostic only)" and prints why it is not enforcing
  • the mismatch stays visible in the log rather than being papered over

A suspended gate that announces itself is honest. One that reports success is not. This announces itself.

The harder result, which is why the suspension is justified

The plumbing fix was attempted first and could not be made to work, and the evidence is specific rather than a shrug:

  • local strict coverage on the calibrated surface: 25,592 regions / 15,500 lines / 83.59%
  • CI run 465, with pinned nightly, clean artifacts and controlled rustflags: 31,091 regions / 18,924 lines / 68.48%

So CI still measures a different surface than local even after removing every variable we could name. The cfg(coverage_nightly) / coverage(off) attribute is not reaching rustc there, and three rounds of hypotheses have now failed to explain why. A floor calibrated against one surface cannot meaningfully gate the other, which makes the 71 knife-edge meaningless on PRs regardless of what we set it to.

What this does not resolve

The underlying defect is still open: CI measures the wrong coverage surface. This change stops that from blocking unrelated PRs; it does not fix it. Whoever picks it up next should start from run 465's evidence rather than re-testing the pinned-nightly, artifact and rustflags hypotheses, all of which are now falsified.

Worth noting for the record that an earlier claim of mine, that the gate flipped between runs on identical code, was wrong: the passing run was a main push at a different commit. That is retracted and should not be used as evidence of nondeterminism.

👍 Changing my verdict. I posted a thumbs-down earlier on the `COV_MIN=0` version; this is not that change and the objection no longer applies. What I objected to was buying green by removing enforcement **silently**, so a coverage regression could land and only fail later on `main`. What is here now is the alternative I named as acceptable, and it is materially different: - the enforced floor survives at `COV_MIN=71` - the PR job is explicitly labelled *"(PR diagnostic only)"* and prints why it is not enforcing - the mismatch stays visible in the log rather than being papered over A suspended gate that announces itself is honest. One that reports success is not. This announces itself. ## The harder result, which is why the suspension is justified The plumbing fix was attempted first and **could not be made to work**, and the evidence is specific rather than a shrug: - local strict coverage on the calibrated surface: 25,592 regions / 15,500 lines / **83.59%** - CI run 465, with pinned nightly, clean artifacts and controlled rustflags: 31,091 regions / 18,924 lines / **68.48%** So CI still measures a different surface than local even after removing every variable we could name. The `cfg(coverage_nightly)` / `coverage(off)` attribute is not reaching rustc there, and three rounds of hypotheses have now failed to explain why. A floor calibrated against one surface cannot meaningfully gate the other, which makes the 71 knife-edge meaningless on PRs regardless of what we set it to. ## What this does not resolve The underlying defect is still open: **CI measures the wrong coverage surface.** This change stops that from blocking unrelated PRs; it does not fix it. Whoever picks it up next should start from run 465's evidence rather than re-testing the pinned-nightly, artifact and rustflags hypotheses, all of which are now falsified. Worth noting for the record that an earlier claim of mine, that the gate flipped between runs on identical code, was wrong: the passing run was a `main` push at a different commit. That is retracted and should not be used as evidence of nondeterminism.
stephen deleted branch fix/240-default-merge-style 2026-08-10 00:38:45 +00:00
Sign in to join this conversation.
No description provided.