Skip to content

Pin Bifrost v0.10.8, holding the usage-scan deadline in the runner - #178

Merged
DavidBakerEffendi merged 2 commits into
mainfrom
dave/pin-bifrost-v0.10.8
Sep 1, 2026
Merged

Pin Bifrost v0.10.8, holding the usage-scan deadline in the runner#178
DavidBakerEffendi merged 2 commits into
mainfrom
dave/pin-bifrost-v0.10.8

Conversation

@DavidBakerEffendi

Copy link
Copy Markdown
Collaborator

v0.10.8 cannot be pinned on its own: it removed max_duration_secs from the
scan tools and now rejects it.

code -32602: scan_usages_by_location does not accept `max_duration_secs`;
deadline policy belongs to the frontend

The runner sent it on every scan, so under v0.10.8 every case with a
declaration-to-usages scan reported error. The freeze gates require
errors == 0, so this would not have produced a wrong number — the freeze
would have failed outright. Two commits, fix first.

1. Hold the deadline in the runner

The removal is deliberate upstream: Bifrost's own test asserts the property is
gone from the tool schema, and ScanUsagesExecutionContext no longer carries a
wall clock at all — only a cancellation token and the file, byte, and callsite
caps. There is no implicit server budget left to inherit, so the frontend
holding its own clock is the intended arrangement.

  • ToolClient gains set_request_timeout, defaulting to a no-op so clients
    with no clock of their own are unaffected.
  • McpSession honours it and clamps to the existing ten-minute process
    envelope, which stays the outer bound.
  • The Bifrost runner sets it from --scan-usages-max-duration-secs and stops
    sending the argument.

The flag, its recorded invocation metadata, and the 300-second default all keep
their meaning.

One semantic does change, and the docs now say so: a budget expiry used to
return structured incomplete evidence from the server. The only lever an MCP
client has now is to stop waiting, so an exhausted budget aborts the call and
reports a case error rather than scoring truncated evidence. For a benchmark
that is the safer direction, and the gates surface it loudly.

Verified no coverage is lost — under v0.10.8 the scan returns the same set as
under v0.10.6: 4 TP, 2 FN, rawStatuses: ["found"].

2. Pin to v0.10.8

8ddf1362, moving the same five places as previous bumps.
candidates-v0.3.0.json stays on v0.10.2 — that registry belongs to a frozen
release.

#170 is unchanged under v0.10.8

Measured on the repository tree with a v0.10.6 control, same machine, same
session:

case v0.10.6 v0.10.8
rust-struct-construction failed — missing Self at src/service.rs:20:49, 21:9 identical
rust-parity-module-declaration-definition failed failed — answers src/lib.rs:1:1 where the case authors 1:9

The second confirms #170's hypothesis: module navigation returns the file
anchor rather than the mod declaration name.

The control is the point. Both report failed with rawStatuses: ["found"]
under v0.10.6, exactly what #170 recorded — so the environment is clean and the
earlier all-error reading was the rejected argument alone, not a regression.
#170 stays open and stays Bifrost-side.

Staged-corpus runs on this machine remain broken for reasons established
earlier and unrelated to any release; the repository-tree proxy was validated
when v0.10.5 reproduced its staged CI result exactly.

Verification

  • cargo test --locked — 247 passed, 0 failed
  • python3 -m unittest discover tests — 42 tests, OK
  • validate-reproduction-contract.sh — exit 0

🤖 Generated with Claude Code

DavidBakerEffendi and others added 2 commits September 1, 2026 12:47
Bifrost v0.10.8 removed `max_duration_secs` from the scan tools and now rejects
it outright:

    code -32602: scan_usages_by_location does not accept `max_duration_secs`;
    deadline policy belongs to the frontend

The runner sent it on every scan, so under v0.10.8 each usage scan failed and
every case with a declaration-to-usages scan reported `error`. Since the freeze
gates require `errors == 0`, a v0.10.8 freeze would not have produced a wrong
number -- it would have failed outright.

The removal is deliberate on the Bifrost side: its own test asserts the
property is absent from the tool schema, and `ScanUsagesExecutionContext` no
longer carries a wall clock at all, only a cancellation token and the file,
byte, and callsite caps. So there is no implicit server budget left to inherit,
and the frontend holding its own clock is the intended arrangement.

`ToolClient` gains `set_request_timeout`, defaulting to a no-op so clients with
no clock of their own are unaffected. `McpSession` honours it for subsequent
requests and clamps it to the existing ten-minute process envelope, which stays
the outer bound. The Bifrost runner sets it from
`--scan-usages-max-duration-secs` before each scan and stops sending the
argument. The flag, its recorded invocation metadata, and the 300-second
default all keep their meaning.

One semantic does change, and the docs now say so. A budget expiry used to come
back as structured incomplete evidence from the server; the only lever an MCP
client has now is to stop waiting, so an exhausted budget aborts the call and
reports a case error instead of scoring truncated evidence. For a benchmark
that is the safer direction, and the freeze gates surface it loudly.

Verified against v0.10.8: `rust-struct-construction` returns the same usage set
as under v0.10.6 -- 4 true positives, 2 false negatives, `rawStatuses: ["found"]`
-- so dropping the argument costs no coverage.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`v0.10.8` is `8ddf1362`. The revision moves in the same five places as previous
bumps, for the same reasons: reference-image.sh refuses to build when the
candidate registry and the reference-environment manifest disagree, the
reproduction contract and the freeze-shard test assert the exact pair, and the
historical v1 page names the active candidate so readers know its own tables
are older evidence. The v0.10.2 pin for candidates-v0.3.0.json is deliberately
untouched; that registry belongs to a frozen release.

This pin depends on the preceding commit. v0.10.8 rejects the per-request scan
deadline the runner used to send, so without that fix every case carrying a
usage scan reports `error`.

Behavioural verification did complete this time, against the repository tree
rather than a staged corpus -- staged runs on this machine remain broken for
reasons established earlier and unrelated to any release. The proxy was
validated when v0.10.5 reproduced its staged CI result exactly.

The two Rust cases in #170 are unchanged under v0.10.8, measured with a v0.10.6
control on the same tree in the same session:

  rust-struct-construction                    failed under both, missing the
                                              capital-Self usages at
                                              src/service.rs:20:49 and 21:9
  rust-parity-module-declaration-definition   failed under both; v0.10.8
                                              answers src/lib.rs:1:1 where the
                                              case authors 1:9, so module
                                              navigation returns the file
                                              anchor rather than the `mod`
                                              declaration name

The control matters: both cases report `failed` with `rawStatuses: ["found"]`
under v0.10.6, which is exactly what #170 recorded, so the environment is clean
and the earlier all-`error` reading was the rejected argument alone.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@DavidBakerEffendi
DavidBakerEffendi merged commit 8bc92a8 into main Sep 1, 2026
5 checks passed
@DavidBakerEffendi
DavidBakerEffendi deleted the dave/pin-bifrost-v0.10.8 branch September 1, 2026 11:21
@DavidBakerEffendi

Copy link
Copy Markdown
Collaborator Author

Added a third commit retiring the published semantic-pack cases, closing #180.

Why retirement rather than a republish

The republish was tried first and got one gate further before failing. The
v0.9.1 bundle is recoverable byte-for-byte and is now archived on the mirror
under the asset-only tag semantic-packs-v0.9.1, serving the exact
a01cb3d7… the cases pinned. Download and checksum verification both pass. The
next gate does not:

verify semantic-pack release bundle: unsupported release bundle schema 1

v0.10.8 requires schema 2 on exact equality (!=, not a minimum) and checks
the generator identity immediately after, so these packs cannot be consumed by
any current pin no matter where they are hosted. Keeping the cases would have
meant re-authoring reviewed ground truth against a schema-2 bundle — three new
hashes each, plus fresh content-addressed bifrost-model:// expectation URIs
derived from them.

The published-pack surface was a casualty of the open-core migration rather than
a contract the corpus still needs, so the cases and their fixtures are retired.

What is deliberately kept

  • Harness support. The schema, document model, and runner path for
    semanticPacks are untouched, so a schema-2 pack case can be authored later
    without rebuilding anything.
  • The archived bundle. Left published on the mirror. It costs nothing and
    restores a content-addressed artifact that any external consumer pinning that
    checksum can resolve again.

Effects

before after
documents 61 59
authored cases 232 230
planned cases 226 224

No promotion or cohort artifact moves — the legacy cohort already skipped these
documents as postdating the frozen 158-case inventory.
requested_totals_cover_the_full_authored_corpus caught the change and is
updated. The evidence map drops its semantic-pack counts, and the generator now
omits the clause rather than publishing "0 semantic-pack cases".

Local: cargo test --locked 247 passed, 42 Python tests, corpus/cohort/promotion
validation and the reproduction contract all clean.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant