Skip to content

fix(salvage): #42's catalog-resolution commit and #34's README item, both stranded post-merge - #84

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

fix(salvage): #42's catalog-resolution commit and #34's README item, both stranded post-merge#84
stranske merged 1 commit into
mainfrom
claude/salvage-34-42-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:
Companion to #82. Both branches were held out of the branch cleanup because their tips carried commits
pushed after their PR merged — so "PR merged" did not mean "work landed".

Summary

Verified per-symbol, not by diff size: both branches are thousands of lines behind main, so a raw
diff conflates stale with unlanded.

#42 / 4e0d6aeadapters.py catalog resolution

Main had advertised_models and none of the generalisation around it:

Symbol On main before this PR
advertised_catalog / _advertised_catalog / _cached_catalog absent
agy_log_for / AGY_LOG_SUFFIX absent
CATALOG_ROUTING_TAGS / _catalog_model_id absent

This is learning-loop provenance code — CLAUDE.md §2, "never treat a generic trace model as provider
resolution"
— and its point is that the catalog is the authority: a label resolves against the ids
the CLI actually advertises, with routing tags (auto, default, cli-default) refused as
non-identities. The commit's own note records that VENDOR_MODEL_RE rejects 42 of 204 real cursor
ids, so shape-matching an id the CLI itself advertised is both redundant and wrong.

Cherry-picked. adapters.py, dispatcher.py, ledger_reconcile.py applied clean. Two conflicts:

  • .verify-floor.json — took main's. A floor is a property of the merge result, never carried in
    from a branch, so it is re-measured below.
  • test_feedback_model_provenance.py — two different tests in one region: main's
    test_late_sweep_completes_terminal_attempts_never_one_in_flight (fix(provenance): the late sweep may only complete TERMINAL worker attempts #63) and the branch's
    test_gemini_provenance_reads_the_per_run_log_before_the_conversation_store. Kept both — they are
    independent.

#34 / c1dc9a7 — README item 11 for evidence_acquisition.py

Main documented this lane nowhere (zero occurrences). Every factual claim re-verified against main's
code rather than trusted: capabilities.unblock() exists; ORCH_EVIDENCE_ACQUISITION_MAX_FEEDS/_MAX_ITEMS
default to 1 and 3; LIVE_FLAG = "ORCH_EVIDENCE_ACQUISITION" with SHADOW as the documented default; and
the quoted summary line matches the format string verbatim (feedable {n} / capped {n} / candidates {n} / fed {n}). That line is the blocking-vs-drainable pair the latched-gate rule asks for, and this was the
only place reporting it.

Testing

Verified fresh-state — both ORCH_STATE_DIR and ORCH_LOCAL_RUNTIME at empty dirs, reproducing CI:

VERIFIED — 420 tests executed and passed, 79 selftests spoke, 3 of 5 gates green;
8 test(s), 5 selftest(s) and 2 gate(s) SKIPPED for a named missing prerequisite

420 + 8 = 428 = the floor. Floor 427 → 428 for the one new test; note appended, not replaced.
ruff and black -l 100 clean.

Deliberate-break → revert

Emptying CATALOG_ROUTING_TAGS fires assert model_id_for_label("cursor", "Auto (default)") is None
in adapters' own selftest; reverted clean.

Worth recording: pytest test_feedback_model_provenance.py did not catch that break. The guard is
covered by a --selftest, not by a test_*.py — which is exactly why verify.py is the gate and a
pytest subset is not. A redundant pytest test written before checking was dropped rather than kept.

Not fixed here, and not caused here

On the owner's machine, test_capabilities.py's test_gate_blocks_execution_is_opt_in_and_narrow and
test_evidence_gate_kind_is_not_blanket_observer fail on pristine main as well: the hourly fleet
tick mutated the machine-local ledger, so range-lane-rollout now classifies matched_not_invoked
instead of deliberately_gated. That is ledger state, not code — both skip with a named reason
under a fresh ledger, which is what CI uses. Flagging it because it will make any local verify.py on
main read red until the ledger settles.

Once this lands, claude/profile-per-agent and claude/sad-grothendieck-20324b are safe to delete —
they were the last two branches with unlanded work.

…both stranded post-merge

Both branches were held back from the branch cleanup because their tips carried commits pushed AFTER
their PR merged, so "PR merged" did not mean "work landed". Verified per-symbol rather than by diff
size — both branches are thousands of lines behind main, so a raw diff conflates stale with unlanded.

#42 / commit 4e0d6ae — `adapters.py` catalog resolution. Main has `advertised_models` and NONE of
the generalisation around it: `advertised_catalog`, `_advertised_catalog`, `_cached_catalog`,
`agy_log_for`, `AGY_LOG_SUFFIX`, `CATALOG_ROUTING_TAGS`, `_catalog_model_id` were all absent. This is
learning-loop provenance code (CLAUDE.md 2: "never treat a generic trace model as provider
resolution"), and its whole point is that THE CATALOG IS THE AUTHORITY — a label resolves against the
ids the CLI actually advertises, with routing TAGS (`auto`, `default`, `cli-default`) refused as
non-identities. The commit's own note records that `VENDOR_MODEL_RE` rejects 42 of 204 real cursor ids,
so shape-matching an id the CLI itself advertised is both redundant and wrong.

Cherry-picked; `adapters.py`, `dispatcher.py` and `ledger_reconcile.py` applied clean. Two conflicts:
  * `.verify-floor.json` — took main's. A floor is a property of the MERGE RESULT, never carried in
    from a branch, so it is re-measured below.
  * `test_feedback_model_provenance.py` — TWO DIFFERENT tests in one region: main's
    `test_late_sweep_completes_terminal_attempts_never_one_in_flight` (from #63) and the branch's
    `test_gemini_provenance_reads_the_per_run_log_before_the_conversation_store`. Kept BOTH; they are
    independent.

#34 / commit c1dc9a7 — README item 11 for `evidence_acquisition.py`, which main documented nowhere
(zero occurrences). Every factual claim was re-verified against main's code rather than trusted:
`capabilities.unblock()` exists; `ORCH_EVIDENCE_ACQUISITION_MAX_FEEDS`/`_MAX_ITEMS` default to 1 and
3; `LIVE_FLAG = "ORCH_EVIDENCE_ACQUISITION"` with SHADOW as the documented default; and the quoted
summary line matches the format string verbatim (`feedable {n} / capped {n} / candidates {n} /
fed {n}`). It is the drainable-vs-blocking line the latched-gate rule asks for, and it was the only
place that reported it.

DELIBERATE-BREAK -> REVERT: emptying `CATALOG_ROUTING_TAGS` fires
`assert model_id_for_label("cursor", "Auto (default)") is None` in adapters' OWN selftest; reverted
clean. Worth recording that `pytest test_feedback_model_provenance.py` did NOT catch that break —
the guard is covered by a `--selftest`, not by a test_*.py, which is precisely why `verify.py` is the
gate and a pytest subset is not. A redundant pytest test written before checking was dropped.

FLOOR 427 -> 428, one new test, note appended not replaced.

Verified FRESH-STATE (both ORCH_STATE_DIR and ORCH_LOCAL_RUNTIME at empty dirs, reproducing CI):
VERIFIED — 420 passed, 0 failed, 79 selftests, 3/5 gates green, 8 tests + 5 selftests + 2 gates
skipped for named prerequisites; 420 + 8 = 428 = floor. ruff + black -l 100 clean.

NOT FIXED HERE, and not caused here: on this machine `test_capabilities.py`'s
`test_gate_blocks_execution_is_opt_in_and_narrow` and `test_evidence_gate_kind_is_not_blanket_observer`
fail on PRISTINE main too — the hourly fleet tick mutated the machine-local ledger and
range-lane-rollout now classifies `matched_not_invoked` instead of `deliberately_gated`. Ledger STATE,
not code; they skip with a named reason under a fresh ledger, which is what CI uses.

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 27 minutes.

View limit details

Limit details: You’ve used the included review currently available. Your 73 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: 0444cc77-6e6b-480b-a48a-04bb8e3325e2

📥 Commits

Reviewing files that changed from the base of the PR and between bcc68cd and 1dbfa21.

📒 Files selected for processing (6)
  • .verify-floor.json
  • README.md
  • adapters.py
  • dispatcher.py
  • ledger_reconcile.py
  • test_feedback_model_provenance.py

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

@agents-workflows-bot

Copy link
Copy Markdown
Contributor

Workflow source needed

PR #84 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: dad66ce
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.36%
Baseline 0.00%
Delta +48.36%
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

@github-actions

Copy link
Copy Markdown
Contributor

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

@stranske
stranske merged commit f5f1c39 into main Aug 23, 2026
34 checks passed
@stranske
stranske deleted the claude/salvage-34-42-remnants branch August 23, 2026 23:20
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