Skip to content

fix(sync): persist Maint 71 delivery handoffs - #2899

Merged
stranske merged 2 commits into
mainfrom
closer/followup-2881-maint82-handoff
Aug 2, 2026
Merged

fix(sync): persist Maint 71 delivery handoffs#2899
stranske merged 2 commits into
mainfrom
closer/followup-2881-maint82-handoff

Conversation

@stranske

@stranske stranske commented Aug 2, 2026

Copy link
Copy Markdown
Owner

Source: Issue #2881

Closes #2881

Automated Status Summary

Scope

Generated PR ownership is split across overlapping controllers. Maint 71 filters only sync/workflows- heads today (.github/workflows/maint-71-merge-sync-prs.yml:284), while Maint 82 and .github/scripts/sync_dependency_campaign.js:493-530 separately decide which exceptions are claimable by Codex. Dev-tool-sync PRs therefore follow a different merge path, and unchanged exception state can continue to produce automation work.

This is a current efficiency defect: repeated observation of the same blocker consumes agent runs without changing repository state. One repository-owned reconciliation contract should decide merge/close disposition, and agent handoff should occur only when the exception fingerprint changes.

Tasks

  • Extend .github/workflows/maint-71-merge-sync-prs.yml to reconcile both sync/workflows- and deps/sync-dev-versions- PRs through the same contract.
  • Centralize classification in .github/scripts/sync_pr_merge_contract.js: current, awaiting-checks, review-blocked, repo-local-failure, shared-source-failure, superseded, expired, and owner-decision.
  • Have Maint 71 emit a normalized result record containing PR identity, head SHA, delivery generation, check/review state, disposition, blocker owner, and exact next command.
  • Make .github/workflows/maint-82-sync-dependency-auto-pilot.yml consume those records and own durable campaign state rather than recomputing merge disposition independently.
  • Extend the existing fingerprint in .github/scripts/sync_dependency_campaign.js to include only state that should trigger new work; preserve updated_at, claim generation, and lease history.
  • Apply campaign:needs-local-codex only for new or materially changed actionable exception fingerprints, and remove it after terminal disposition or successful claim completion.
  • Document the remote handoff schema and local-consumer migration in docs/ops/SYNC_DEPENDENCY_CAMPAIGN.md; mark local watcher changes as an operator follow-up, not repository implementation.
  • Add observability showing new, unchanged, resolved, and re-opened exception counts per run.

Acceptance criteria

  • .github/scripts/__tests__/sync_dependency_campaign.test.js proves the same exception observed on three consecutive runs creates one claim generation and one agent handoff.
  • .github/scripts/__tests__/sync_pr_merge_contract.test.js applies identical merge/review/check rules to sync and dev-tool-sync fixtures.
  • Workflow tests prove Maint 71 is the only path that merges or closes generated PRs and Maint 82 only persists state and requests bounded exception work.
  • A changed head SHA, review-thread set, check-failure cluster, or delivery generation creates a new fingerprint; a timestamp-only change does not.
  • Durable state records the exact blocker owner and next command, allowing an opener/closer run to resume without rediscovery.
  • Deliberate-break test: remove fingerprint persistence or vary only updated_at, verify the campaign test detects duplicate handoffs, then revert and verify it passes.
  • Run python scripts/dev_check.py --action test and workflow validation successfully.

Summary by CodeRabbit

  • New Features

    • Added delivery handoff tracking across dependency campaign workflows.
    • Handoffs are validated, deduplicated, ordered, and limited to the most recent records.
    • Campaign reports and serialized markers now include retained handoff details and counts.
    • Merge workflows can automatically forward handoff records to campaign processing.
  • Tests

    • Added coverage for handoff persistence, deduplication, workflow events, and payload handling.

Copilot AI review requested due to automatic review settings August 2, 2026 00:28
@cursor

cursor Bot commented Aug 2, 2026

Copy link
Copy Markdown

Bugbot is not enabled for your account, so this pull request was not reviewed.

Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs.

@stranske stranske added agent:codex Agent-created issues from Codex agents:keepalive Use to initiate keepalive functionality with agents autofix Opt-in automated formatting & lint remediation agent:retry Add to trigger agent retry after rate limit or pause follow-up codex-automation labels Aug 2, 2026
@coderabbitai

coderabbitai Bot commented Aug 2, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

You’ve reached a temporary PR review limit under our Fair Usage Limits Policy.

Your recent review volume is higher than typical usage, so adaptive limits are currently applied.

Next review available in: 48 minutes

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

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 7925a995-a83c-422a-9406-d9571fcdf803

📥 Commits

Reviewing files that changed from the base of the PR and between 92106eb and b0455fd.

📒 Files selected for processing (6)
  • .github/scripts/__tests__/sync-pr-merge-contract.test.js
  • .github/scripts/__tests__/sync_dependency_campaign.test.js
  • .github/scripts/sync_dependency_campaign.js
  • .github/scripts/sync_pr_merge_contract.js
  • .github/workflows/maint-71-merge-sync-prs.yml
  • tests/workflows/test_maint82_sync_campaign_contract.py
📝 Walkthrough

Walkthrough

The change adds delivery handoff validation, deduplication, retention, campaign persistence, marker serialization, and workflow transfer between Maint 71 and Maint 82. Tests cover merge behavior, state persistence, event payloads, and campaign consumption.

Changes

Delivery handoff lifecycle

Layer / File(s) Summary
Handoff normalization and campaign persistence
.github/scripts/sync_dependency_campaign.js, .github/scripts/__tests__/sync_dependency_campaign.test.js
The campaign validates, deduplicates, sorts, limits, counts, persists, and serializes delivery handoffs. Tests cover default metadata and marker round-tripping.
Workflow handoff transfer
.github/workflows/maint-71-merge-sync-prs.yml, .github/workflows/maint-82-sync-dependency-campaign.yml, tests/workflows/test_maint82_sync_campaign_contract.py
Maint 71 dispatches handoff records when available. Maint 82 reads the payload, passes records to runCampaign, and reports the observed count. Contract tests verify both workflows.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Maint71 as Maint 71 merge workflow
  participant GitHub as repository event
  participant Maint82 as Maint 82 campaign workflow
  participant Campaign as runCampaign
  Maint71->>GitHub: Send handoff_records
  GitHub->>Maint82: Provide delivery_handoff_records
  Maint82->>Campaign: Pass deliveryHandoffRecords
  Campaign-->>Maint82: Return campaign state and handoff count
Loading

Possibly related issues

  • stranske/Workflows#2880 — Both changes persist and reconcile delivery handoff records in campaign state.

Possibly related PRs

Suggested reviewers: copilot

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Linked Issues check ⚠️ Warning The PR adds dispatch and persistence, but it does not implement the linked issue's reconciliation, fingerprint, classification, labeling, documentation, and observability requirements [#2881]. Implement the remaining #2881 requirements, including fingerprint-based deduplication, unified reconciliation, durable exception metadata, label handling, documentation, and observability.
✅ Passed checks (4 passed)
Check name Status Explanation
Out of Scope Changes check ✅ Passed The workflow, campaign-state, serialization, and regression-test changes directly support the linked handoff and durable-state objectives.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: persisting Maint 71 delivery handoffs.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch closer/followup-2881-maint82-handoff

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

@stranske

stranske commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

Runner dispatch state for autofix on PR #2899. Do not edit.

@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

Runner dispatch state for codex on PR #2899. Do not edit.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/scripts/sync_dependency_campaign.js:
- Around line 352-371: Update normalizeDeliveryHandoff in
.github/scripts/sync_dependency_campaign.js at lines 352-371 to require
non-empty disposition, blocker_owner, and next_command, add normalized check and
review state fields, and reject incomplete records. Update the valid handoff
fixture in .github/scripts/__tests__/sync_dependency_campaign.test.js at lines
26-49 with check and review state values, and replace the empty next_command
expectation with coverage asserting incomplete records are rejected.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 362c5459-9cb9-47ea-b69c-f7bb022d5121

📥 Commits

Reviewing files that changed from the base of the PR and between f425c5c and 92106eb.

📒 Files selected for processing (5)
  • .github/scripts/__tests__/sync_dependency_campaign.test.js
  • .github/scripts/sync_dependency_campaign.js
  • .github/workflows/maint-71-merge-sync-prs.yml
  • .github/workflows/maint-82-sync-dependency-campaign.yml
  • tests/workflows/test_maint82_sync_campaign_contract.py

Comment thread .github/scripts/sync_dependency_campaign.js

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR extends the sync/dependency campaign pipeline so Maint 71 can emit machine-readable “delivery handoff” records via repository_dispatch, and Maint 82 can ingest and persist those records in the campaign’s durable marker state. This supports the broader goal (Issue #2881) of making handoffs durable and avoiding repeated “rediscovery” work across runs.

Changes:

  • Dispatch Maint 71 merge/reconcile results (handoff records) to the Maint 82 campaign workflow via repository_dispatch.
  • Teach Maint 82’s workflow runner to consume delivery_handoff_records from the dispatch payload and pass them into the campaign script.
  • Add a durable-state merge path + tests for persisting Maint 71 handoffs in sync_dependency_campaign.js.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
tests/workflows/test_maint82_sync_campaign_contract.py Adds contract assertions proving Maint 82 consumes delivery handoffs and Maint 71 dispatches them.
.github/workflows/maint-82-sync-dependency-campaign.yml Reads delivery_handoff_records from repository_dispatch payload and passes them into runCampaign, plus adds a summary line.
.github/workflows/maint-71-merge-sync-prs.yml Dispatches handoff records to the campaign workflow after producing the merge report.
.github/scripts/sync_dependency_campaign.js Adds delivery-handoff schema/constants, normalization + merge logic, and persists handoffs into durable marker state.
.github/scripts/__tests__/sync_dependency_campaign.test.js Adds unit coverage for handoff merge behavior and durable marker persistence.

Comment on lines +500 to +503
stats: {
...buildStats(items, discoveredItems, options),
delivery_handoffs_observed: deliveryHandoffs.length,
},
Comment on lines +830 to +840
if (!dryRun && report.handoff_records.length > 0) {
await withRetry((client) => client.rest.repos.createDispatchEvent({
owner: context.repo.owner,
repo: context.repo.repo,
event_type: 'sync-dependabot-campaign',
client_payload: {
repos: targetRepos.join(','),
delivery_handoff_records: report.handoff_records,
},
}));
}

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 92106ebc6e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

repo: context.repo.repo,
event_type: 'sync-dependabot-campaign',
client_payload: {
repos: targetRepos.join(','),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Keep handoff-triggered campaign scans fleet-wide

When Maint 71 is run with its supported repos filter, this forwards only those target repositories to Maint 82. mergeCampaignState() treats every previously active item absent from the resulting discovery set as stale, without distinguishing repositories that were not scanned, so a targeted Maint 71 run for repo B can stale repo A's live queue entries and remove campaign:needs-local-codex. Pass the full registered set for this refresh, or make partial-scan scope explicit to the state merger.

Useful? React with 👍 / 👎.

event_type: 'sync-dependabot-campaign',
client_payload: {
repos: targetRepos.join(','),
delivery_handoff_records: report.handoff_records,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Emit terminal handoffs after successful merges

For every successful auto-merge, report.handoff_records is built from the pre-merge deliveryContext: buildDeliveryHandoff() prefers delivery_disposition over the result status, so the newly persisted record still says disposition: current and next_command: merge-current-delivery even though the PR has already merged. Maint 82 therefore durably publishes a stale command to handoff consumers; update or omit the record after terminal merge/close outcomes before dispatching it.

Useful? React with 👍 / 👎.

@agents-workflows-bot

Copy link
Copy Markdown
Contributor

🤖 Bot Comment Handler

  • Agent: codex
  • Bot comments to address: 5

The agent has been assigned to this PR to address the bot review comments.

Instructions for agent

  1. Implement suggested fixes that improve the code
  2. Skip suggestions that don't apply (note why in your response)

The bot comment handler workflow has prepared context in the artifacts.

Require full restart fields, count observed handoffs per run, emit
terminal merge dispositions, and keep campaign refresh fleet-wide.

Co-authored-by: Cursor <cursoragent@cursor.com>
@stranske

stranske commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

Closer review recovery (handoff contract)

Addressed the five unresolved review threads on head b0455fd7:

  1. CodeRabbit / contract fieldsnormalizeDeliveryHandoff now requires non-empty disposition, blocker_owner, next_command, check_state, and review_state; incomplete records are rejected. Tests cover rejection + valid persistence.
  2. Copilot / observed countdelivery_handoffs_observed counts only the current Maint 71 payload observations, not the retained durable total.
  3. Copilot / dispatch brittleness — Maint 71 repository-dispatch of handoffs is best-effort (core.notice on failure) so reconciler success is not gated on the side-effect.
  4. Codex P1 / fleet-wide scan — handoff dispatch now passes registeredRepos (full fleet) instead of the optional targeted repos filter, so partial Maint 71 runs cannot stale unscanned campaign items.
  5. Codex P1 / terminal handoffsbuildDeliveryHandoff rewrites successful merges to disposition/next_command=merged/none and omits companion branch_deleted* rows; stale pre-merge merge-current-delivery is no longer published after merge.

Validation: Node suites 49 passed (sync_dependency_campaign + sync-pr-merge-contract); pytest tests/workflows/test_maint82_sync_campaign_contract.py 6 passed; YAML parse clean. Fresh Gate/CI expected on the new head — no wait this round.

@stranske
stranske temporarily deployed to agent-high-privilege August 2, 2026 00:39 — with GitHub Actions Inactive
@stranske
stranske merged commit 5b7a926 into main Aug 2, 2026
51 checks passed
@stranske
stranske deleted the closer/followup-2881-maint82-handoff branch August 2, 2026 01:03
@stranske stranske added the verify:compare Compare multiple LLM evaluations label Aug 2, 2026
@stranske
stranske temporarily deployed to agent-high-privilege August 2, 2026 01:23 — with GitHub Actions Inactive
@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

Provider Comparison Report

Provider Summary

Provider Model Verdict Confidence Summary
openai gpt-5.6-terra CONCERNS 86% The implementation appears directionally correct: it expands the merge contract, adds fingerprint/durable-state logic, modifies both Maint 71 and Maint 82 paths, and adds focused JavaScript tests f...
anthropic claude-sonnet-5 CONCERNS 62% The PR merges cleanly and CI passed, and it does add tests and code across the relevant merge-contract and campaign-fingerprint scripts/workflows. However, given the very large scope described in t...
📋 Full Provider Details (click to expand)

openai

  • Model: gpt-5.6-terra
  • Verdict: CONCERNS
  • Confidence: 86%
  • Scores:
    • Correctness: 8.0/10
    • Completeness: 6.0/10
    • Quality: 8.0/10
    • Testing: 7.0/10
    • Risks: 8.0/10
  • Summary: The implementation appears directionally correct: it expands the merge contract, adds fingerprint/durable-state logic, modifies both Maint 71 and Maint 82 paths, and adds focused JavaScript tests for contract parity and repeated exception observations. However, it is incomplete against the documented scope because the required handoff-schema/operator documentation is not included. Workflow exclusivity and the explicit deliberate-break verification are also not conclusively demonstrated by the supplied test changes. These omissions warrant concerns rather than a full pass.
  • Concerns:
    • The required operator documentation was not updated: docs/ops/SYNC_DEPENDENCY_CAMPAIGN.md is absent from the changed files. Consequently, the remote handoff schema and the explicit statement that local-watcher migration is an operator follow-up are not delivered.
    • The diff adds campaign and merge-contract tests, but the supplied changes do not clearly demonstrate the acceptance requirement that workflow tests prove Maint 71 is the exclusive merge/close controller for both generated-PR families. The only workflow test file changed is a Maint 82 contract test; no corresponding Maint 71 workflow-contract coverage is shown.
    • The deliberate-break acceptance criterion is not clearly evidenced by the listed test changes. Tests appear to exercise fingerprint persistence behavior, but there is no visible dedicated regression/mutation-style test or documented verification demonstrating that removing persistence or changing only updated_at would be detected as duplicate handoffs.
    • The stated task names maint-82-sync-dependency-auto-pilot.yml, while the changed workflow is maint-82-sync-dependency-campaign.yml. This may be an existing naming difference, but it should be confirmed that the active Maint 82 workflow is the one consuming Maint 71 result records and that no older controller continues independently recomputing dispositions.

anthropic

  • Model: claude-sonnet-5
  • Verdict: CONCERNS
  • Confidence: 62%
  • Scores:
    • Correctness: 5.0/10
    • Completeness: 4.0/10
    • Quality: 5.0/10
    • Testing: 5.0/10
    • Risks: 5.0/10
  • Summary: The PR merges cleanly and CI passed, and it does add tests and code across the relevant merge-contract and campaign-fingerprint scripts/workflows. However, given the very large scope described in the task list and acceptance criteria (unifying Maint 71/82 disposition logic across two PR families, an 8-way classification contract, normalized result records, fingerprint history preservation with claim generations/leases, label lifecycle rules, observability metrics, documentation of the schema, and a deliberate-break regression test), the actual diff (271 additions, 5 deletions across 7 files) appears too small to fully deliver this scope. Notably, no documentation update to SYNC_DEPENDENCY_CAMPAIGN.md is included despite being explicitly required, and there's a naming mismatch in the added contract test file versus what the acceptance criteria specify. This suggests the implementation is likely partial or only lightly extends existing logic rather than fully consolidating reconciliation and handoff behavior as required. Recommend further review to confirm full coverage of the classification states, fingerprint semantics, and label lifecycle before considering this fully complete.
  • Concerns:
    • The acceptance criteria and task list describe a large-scope reconciliation redesign (8-way disposition classification, normalized result records, fingerprint history with claim generations/lease tracking, label lifecycle management, observability counts for new/unchanged/resolved/re-opened exceptions, and documentation of the remote handoff schema). The diff is only ~271 net lines across 7 files, which is implausibly small to fully implement this scope — most changes look incremental/additive rather than a genuine consolidation of merge/close logic and campaign state ownership.
    • No changes to docs/ops/SYNC_DEPENDENCY_CAMPAIGN.md are present in the diff, despite this being an explicit required task ('Document the remote handoff schema and local-consumer migration...'). This task appears unaddressed.
    • Test file naming inconsistency: the PR adds .github/scripts/tests/sync-pr-merge-contract.test.js (hyphenated) while the acceptance criteria explicitly reference .github/scripts/tests/sync_pr_merge_contract.test.js (underscored). This raises doubt about whether the actual required contract test suite was extended, or whether a stray/duplicate file was created instead.
    • The maint-82 workflow file changed is maint-82-sync-dependency-campaign.yml with only +4 lines, but the tasks/acceptance criteria reference maint-82-sync-dependency-auto-pilot.yml consuming Maint 71's records and owning durable state — a 4-line change is unlikely to implement 'own durable campaign state rather than recomputing merge disposition independently.'
    • No evidence in the diff of the deliberate-break test workflow (remove fingerprint persistence / vary only updated_at) being implemented and then reverted as required by the acceptance criteria.
    • All task and acceptance-criteria checkboxes in the PR/issue description remain unchecked, which combined with the small diff size suggests the implementation may be partial rather than fully satisfying the stated scope.
    • Cannot verify from the diff summary whether classification now covers all 8 states (current, awaiting-checks, review-blocked, repo-local-failure, shared-source-failure, superseded, expired, owner-decision) given only +79/-4 lines changed in sync_pr_merge_contract.js.

Agreement

  • Verdict: CONCERNS (all providers)

Disagreement

Dimension openai anthropic
Correctness 8.0/10 5.0/10
Completeness 6.0/10 4.0/10
Quality 8.0/10 5.0/10
Testing 7.0/10 5.0/10
Risks 8.0/10 5.0/10

Unique Insights

  • openai: The required operator documentation was not updated: docs/ops/SYNC_DEPENDENCY_CAMPAIGN.md is absent from the changed files. Consequently, the remote handoff schema and the explicit statement that local-watcher migration is an operator follow-up are not delivered.; The diff adds campaign and merge-contract tests, but the supplied changes do not clearly demonstrate the acceptance requirement that workflow tests prove Maint 71 is the exclusive merge/close controller for both generated-PR families. The only workflow test file changed is a Maint 82 contract test; no corresponding Maint 71 workflow-contract coverage is shown.; The deliberate-break acceptance criterion is not clearly evidenced by the listed test changes. Tests appear to exercise fingerprint persistence behavior, but there is no visible dedicated regression/mutation-style test or documented verification demonstrating that removing persistence or changing only updated_at would be detected as duplicate handoffs.; The stated task names maint-82-sync-dependency-auto-pilot.yml, while the changed workflow is maint-82-sync-dependency-campaign.yml. This may be an existing naming difference, but it should be confirmed that the active Maint 82 workflow is the one consuming Maint 71 result records and that no older controller continues independently recomputing dispositions.
  • anthropic: The acceptance criteria and task list describe a large-scope reconciliation redesign (8-way disposition classification, normalized result records, fingerprint history with claim generations/lease tracking, label lifecycle management, observability counts for new/unchanged/resolved/re-opened exceptions, and documentation of the remote handoff schema). The diff is only ~271 net lines across 7 files, which is implausibly small to fully implement this scope — most changes look incremental/additive rather than a genuine consolidation of merge/close logic and campaign state ownership.; No changes to docs/ops/SYNC_DEPENDENCY_CAMPAIGN.md are present in the diff, despite this being an explicit required task ('Document the remote handoff schema and local-consumer migration...'). This task appears unaddressed.; Test file naming inconsistency: the PR adds .github/scripts/tests/sync-pr-merge-contract.test.js (hyphenated) while the acceptance criteria explicitly reference .github/scripts/tests/sync_pr_merge_contract.test.js (underscored). This raises doubt about whether the actual required contract test suite was extended, or whether a stray/duplicate file was created instead.; The maint-82 workflow file changed is maint-82-sync-dependency-campaign.yml with only +4 lines, but the tasks/acceptance criteria reference maint-82-sync-dependency-auto-pilot.yml consuming Maint 71's records and owning durable state — a 4-line change is unlikely to implement 'own durable campaign state rather than recomputing merge disposition independently.'; No evidence in the diff of the deliberate-break test workflow (remove fingerprint persistence / vary only updated_at) being implemented and then reverted as required by the acceptance criteria.; All task and acceptance-criteria checkboxes in the PR/issue description remain unchecked, which combined with the small diff size suggests the implementation may be partial rather than fully satisfying the stated scope.; Cannot verify from the diff summary whether classification now covers all 8 states (current, awaiting-checks, review-blocked, repo-local-failure, shared-source-failure, superseded, expired, owner-decision) given only +79/-4 lines changed in sync_pr_merge_contract.js.

🔍 LangSmith Traces

@stranske

stranske commented Aug 2, 2026

Copy link
Copy Markdown
Owner Author

Closer verifier disposition (Provider Comparison Report)

Durable report (comment 5154432709) is CONCERNS (openai + anthropic). Direct current-main (5b7a9268) audit vs #2881 acceptance:

Substantive / still open (follow-up required):

  1. Classification is missing shared-source-failure (7/8 named dispositions present in classifyGeneratedPr).
  2. No fixture proves three consecutive identical exception observations → one claim generation / one agent handoff.
  3. No deliberate-break / timestamp-only fingerprint regression as required by AC.
  4. No explicit new/unchanged/resolved/re-opened exception lifecycle observability counts.
  5. docs/ops/SYNC_DEPENDENCY_CAMPAIGN.md documents roles + delivery-record marker but not the full workflows-generated-delivery-handoff/v1 field schema / local-watcher operator follow-up.

Overstated / false when judged only on #2899's diff (cumulative #2898+#2899 on main):

  • Doc file is present on main (from feat(sync): reconcile generated delivery handoffs #2898), not absent.
  • Dual-lane sync + deps/sync-dev-versions-* classification tests exist in .github/scripts/__tests__/sync-pr-merge-contract.test.js.
  • Maint 82 campaign workflow does consume Maint 71 delivery_handoff_records (not an empty stub).
  • Active campaign workflow name is maint-82-sync-dependency-campaign.yml (AC's …auto-pilot.yml name is stale).

#2881 stays OPEN. Opening a bounded follow-up PR for the substantive gaps above.

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

Labels

agent:codex Agent-created issues from Codex agent:retry Add to trigger agent retry after rate limit or pause agents:keepalive Use to initiate keepalive functionality with agents autofix Opt-in automated formatting & lint remediation codex-automation follow-up verify:compare Compare multiple LLM evaluations

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Dependency/Sync] Consolidate generated-PR reconciliation and exception handoff

3 participants