Skip to content

test(salvage): the two pieces of #43/#51 that #70's salvage dropped - #82

Merged
stranske merged 1 commit into
mainfrom
claude/salvage-43-51-remnants
Aug 23, 2026
Merged

test(salvage): the two pieces of #43/#51 that #70's salvage dropped#82
stranske merged 1 commit into
mainfrom
claude/salvage-43-51-remnants

Conversation

@stranske

Copy link
Copy Markdown
Owner

Workflow Source

Started from:

Automation intent:

  • Verifier should review this
  • Keepalive may manage this PR
  • Human-only unless checks fail

Notes:
Recovers the two pieces of the #43#51#70 salvage chain that #70 did not carry, found while
auditing closed-unmerged branches before deleting them.

Summary

#43 → #51 → #70 is a salvage chain, and #70 merged — so both predecessors read as "closed, work
already landed". Verified file-by-file instead of trusting that. #70 carried
capability_activation_audit.py, test_capability_set_coverage.py and .verify-floor.json, and
absent_entrypoint_note / entrypoint_presence are on main in four files. Two pieces were not
carried
— and both are the kind of omission that reads as landed because its neighbours did.

1. #51's exp_id_template assertions — exploration_backfill.py

Main has exp_id_template in production code at two sites and zero selftest assertions
pinning either:

Site Code
built (:330) exp_id = f"backfill-{_exp_id_slug(target)}"
consumed (:573) exp_id = f"{job.get('exp_id_template')}-{int(time.time())}"

So the derivation o/r#1backfill-o-r-1, and the link between the planned template and the
dispatched exp_id, were both unasserted. A change to the slugging would silently rename every
backfill experiment and surface much later as unjoinable experiment artifacts.

Both halves are asserted deliberately: pinning the template alone would leave the two free to drift
apart, which is the same shape as a gate whose measuring window differs from its draining window.

2. #43's fetch-first pointer — CLAUDE.md

#51's own title advertised it — "salvage PR #43's pytest coverage and fetch-first pointer" — and
#70 dropped CLAUDE.md entirely. Main has no occurrence of "fetch" in that file.

The trap is specific, and it cost a full session on 2026-08-22: --all searches the refs this
checkout has
, so git log --all --oneline -- <file> over an unfetched sibling branch returns
empty and reads as "no such file was ever committed anywhere". That false negative is what produced
the wrong verdict the surrounding bullet exists to prevent — so the bullet was documenting the
conclusion while omitting the step that got it wrong.

Testing

python3 verify.py: 427 passed, 0 failed, 0/26 skipped, 84/84 selftests, 43/43 can-fire, 5/5
gates.
Floor untouched — both assertions live inside an existing --selftest, so nothing new is
collected. ruff and black -l 100 clean.

Deliberate-break → revert, both reverted clean

  1. Slug prefix backfill-bf-: assertion 1 fires, reporting exp_id_template: 'bf-o-r-1'.
  2. Dispatched id stops deriving from the template (f"detached-{int(time.time())}"): assertion 2
    fires
    , reporting exp_id: 'detached-1787524963'. Assertion 1 still passes under this break —
    which is precisely why both are needed rather than either alone.

For the reviewer

Branches claude/dazzling-kirch-19e81d (#43) and claude/entrypoint-diagnosis-tests (#51) are safe
to delete once this lands; everything else on them is already on main. Their tip SHAs are recorded in
the session notes in case anything else is wanted from them later.

#43 -> #51 -> #70 is a salvage chain and #70 MERGED, so both predecessors read as "closed, work
already landed". Checked file-by-file rather than trusting that: #70 carried
`capability_activation_audit.py`, `test_capability_set_coverage.py` and `.verify-floor.json`, and
`absent_entrypoint_note` / `entrypoint_presence` are on main in four files. Two pieces were NOT
carried, and both are the kind of thing that reads as landed because its neighbours did.

1. #51's exp_id_template assertions (`exploration_backfill.py`). Main has `exp_id_template` in
   PRODUCTION code at two sites — built as `f"backfill-{_exp_id_slug(target)}"` and consumed as
   `f"{job.get('exp_id_template')}-{int(time.time())}"` — and ZERO selftest assertions pinning
   either. So the derivation `o/r#1` -> `backfill-o-r-1` and the link between the planned template
   and the DISPATCHED exp_id were both unasserted: a change to the slugging would silently rename
   every backfill experiment and surface much later as unjoinable experiment artifacts. Both halves
   are asserted, deliberately, because pinning the template alone would leave the two free to drift
   apart — the same shape as a gate whose measuring window differs from its draining window.

2. #43's FETCH-FIRST pointer (`CLAUDE.md`). #51's own title advertised it ("salvage PR #43's pytest
   coverage and fetch-first pointer") and #70 dropped `CLAUDE.md` entirely; main has no occurrence of
   "fetch" in that file. The trap is specific and cost a full session on 2026-08-22: `--all` searches
   the refs this checkout HAS, so `git log --all --oneline -- <file>` over an UNFETCHED sibling branch
   returns empty and reads as "no such file was ever committed anywhere". That false negative is what
   produced the wrong verdict the surrounding bullet exists to prevent, so the bullet was documenting
   the conclusion while omitting the step that got it wrong.

DELIBERATE-BREAK -> REVERT, both reverted clean:
  * slug prefix `backfill-` -> `bf-`: assertion 1 fires, reporting `exp_id_template: 'bf-o-r-1'`.
  * dispatched id stops deriving from the template (`f"detached-{int(time.time())}"`): assertion 2
    fires, reporting `exp_id: 'detached-1787524963'`. Assertion 1 still PASSES under this break,
    which is why both are needed rather than either alone.

Verified with `python3 verify.py`: 427 passed, 0 failed, 0/26 skipped, 84/84 selftests, 43/43
can-fire, 5/5 gates. Floor untouched — both assertions live inside an existing `--selftest`, so
nothing new is collected. ruff + black -l 100 clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Aug 23, 2026

Copy link
Copy Markdown

Warning

Review limit reached

Next included review available in 56 minutes.

View limit details

Limit details: You’ve used the included review currently available. Your 74 included PR review attempts over the past 7 days set your current allowance at 1 review per hour.

Your organization has reached its usage spending cap. Adjust your spending cap in the billing tab.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: bafe31d3-c463-442e-bb7f-cd52100e014d

📥 Commits

Reviewing files that changed from the base of the PR and between a034f8e and 7618c00.

📒 Files selected for processing (2)
  • CLAUDE.md
  • exploration_backfill.py

Comment @coderabbitai help to get the list of available commands.

@agents-workflows-bot

Copy link
Copy Markdown
Contributor

Workflow source needed

PR #82 needs either a linked GitHub issue or one valid non-issue Workflow Source before PR metadata automation can manage it safely.

Please do one of:

  • Add <!-- meta:issue:123 --> or a normal Closes #123 / Related to #123 line.
  • Check one Workflow Source option in the PR body.
  • Add a hidden marker such as <!-- workflow-source:local_request -->, <!-- workflow-source:manual_remote -->, <!-- workflow-source:review_followup -->, <!-- workflow-source:sync_campaign -->, or <!-- workflow-source:dependabot -->.
  • Add a workflow source label such as workflow:source-direct-pr, workflow:source-local-request, workflow:source-review-followup, workflow:source-sync, or workflow:no-automation.

Once a valid source is present, this warning will not be reposted.

@stranske-keepalive

Copy link
Copy Markdown

Automated Status Summary

Head SHA: 81e4a23
Latest Runs: ⏳ pending — Gate
Required: core tests (3.12): ⏳ pending, core tests (3.13): ⏳ pending, docker smoke: ⏳ pending, gate: ⏳ pending

Workflow / Job Result Logs
(no jobs reported) ⏳ pending

Coverage Overview

  • Coverage history entries: 1

Coverage Trend

Metric Value
Current 48.28%
Baseline 0.00%
Delta +48.28%
Minimum 70.00%
Status ❌ Below minimum

Top Coverage Hotspots (lowest coverage)

File Coverage Missing
outcomes.py 9.0% 243
watch.py 9.6% 431
capability_recurrence_check.py 10.4% 421
durability_sweep.py 12.2% 339
keepalive_shadow.py 13.0% 282
capability_outcome_bridge.py 13.5% 295
capability_advisor.py 13.7% 957
keepalive_outcomes.py 14.0% 339
adversarial.py 14.1% 164
langsmith_fetch.py 14.3% 409
gh_capacity.py 14.6% 228
runtime_ac_panel.py 14.7% 290
redirect_shadow.py 16.9% 476
cross_repo_lane.py 17.3% 268
experiment_recovery.py 18.4% 164

Low Coverage Files (<50.0%)

File Coverage Missing
outcomes.py 9.0% 243
watch.py 9.6% 431
capability_recurrence_check.py 10.4% 421
durability_sweep.py 12.2% 339
keepalive_shadow.py 13.0% 282
capability_outcome_bridge.py 13.5% 295
capability_advisor.py 13.7% 957
keepalive_outcomes.py 14.0% 339
adversarial.py 14.1% 164
langsmith_fetch.py 14.3% 409
gh_capacity.py 14.6% 228
runtime_ac_panel.py 14.7% 290
redirect_shadow.py 16.9% 476
cross_repo_lane.py 17.3% 268
experiment_recovery.py 18.4% 164

Updated automatically; will refresh on subsequent CI/Docker completions.


Keepalive checklist

Scope

No scope information available

Tasks

  • No tasks defined

Acceptance criteria

  • No acceptance criteria defined

@stranske
stranske merged commit bcc68cd into main Aug 23, 2026
34 checks passed
@stranske
stranske deleted the claude/salvage-43-51-remnants branch August 23, 2026 22:51
@github-actions

Copy link
Copy Markdown
Contributor

Workflow state fingerprint for Agents Gate Followups. Do not edit.

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