Skip to content

[Defect] tab_handle_refresh can return an unattributed blank target without cleanup proof #175

Closed

Description

@ecochran76

Expected behavior

tab_handle_refresh with repairPolicy=open_if_missing must return a caller-bound service tab handle plus explicit proof that no duplicate or peer cleanup was attempted. A consumer must be able to distinguish safe reuse from incomplete or cross-caller adoption.

Observed behavior

On Agent Browser 0.28.0, refresh of a released Books Receipts handle returned success with decision reused_compatible_target and reused an about:blank target whose retained trace belonged to another caller. The response omitted the required duplicateCleanupAttempted: false proof, so the Books Receipts driver failed closed with tab_handle_refresh_cleanup_unexpected.

Service job: mcp-service-request-tab_handle_refresh-7516ee13-3808-445d-8e5b-c39218e49fbb.
Terminal effect state: verified_effect.
No BILL transaction or accounting effect occurred.

Bounded reproduction

  1. Start one retained shared-profile browser.
  2. Persist a valid service tab handle, then release its exact physical tab.
  3. Call tab_handle_refresh on the persisted handle with repairPolicy=open_if_missing.
  4. Observe selection of an unattributed compatible blank target and an incomplete refresh response.
  5. A strict consumer requiring caller identity and explicit no-cleanup proof refuses the returned handle.

External-effect posture: No live effect required. A targetless service fixture can reproduce this contract drift.

Activity

  1. added
    bugSomething isn't working
    lane/bugfixReliability and bug fixes
    lane/authCredentials and automated authentication
    state/triageNeeds outcome and priority refinement
    effect/no-liveNo live external effect required
    and removed
    state/triageNeeds outcome and priority refinement
    on Sep 17, 2026
  2. ecochran76 commented on Sep 17, 2026

    @ecochran76
    Author

    Plan 0207 is admitted for provider-free repair planning.

    Accountable owner: @ecochran76
    Product lane: PL-BUGFIX
    Branch: fix/p207-tab-handle-refresh-custody
    Plan: docs/dev/plans/0207-2026-09-16-tab-handle-refresh-custody-repair.md
    Source baseline: 2632e31ce34e62873598088d0c92c498357aafe2

    Bounded outcome: make tab_handle_refresh reuse only caller-bound compatible targets, preserve canonical caller attribution, and return explicit no-cleanup proof. Foreign or unattributed peer targets must remain untouched.

    Known overlaps: PR #157 owns pending generated service-request and documentation changes; P205 owns Service-model extraction. P207 will keep the first repair packet in the browser-lifecycle adapter and tests, then reconcile public contract files after the shared checkpoint. No browser, provider, credential, installed-runtime, production, or release effect is authorized.

  3. ecochran76 commented on Sep 17, 2026

    @ecochran76
    Author

    P207 durable plan published.

    • Branch: fix/p207-tab-handle-refresh-custody
    • Plan checkpoint: 2e1b1d4d798736b39d47a629859a37bfd4aadace
    • Current metadata head: 52c06647
    • Plan: docs/dev/plans/0207-2026-09-16-tab-handle-refresh-custody-repair.md
    • Planning contract audit: passed
    • CI: deliberately not dispatched; branch pushes created no Actions run
    • Next packet: pure planner seam plus the exact caller-A versus caller-B red regression
  4. ecochran76 commented on Sep 17, 2026

    @ecochran76
    Author

    P207 source repair is published in draft PR #184.

    Implementation checkpoint: c3d69f3e

    Qualified evidence:

    • 8 focused tab_handle_refresh Rust tests pass, including caller-A versus caller-B blank-target rejection, durable canonical replacement readback, and peer-preserving duplicate selection.
    • Rust formatting and strict workspace Clippy pass.
    • Direct service-request client, generated client types, service client contract, API/MCP parity, docs build, JavaScript syntax, and diff hygiene pass.
    • Full CI was intentionally not dispatched.

    Targeted browser acceptance remains blocked before Chrome launch: both disposable attempts returned stock_chrome_capability_selection_failed: no_matching_preference_binding because the isolated Service State lacked a reviewed stock-Chrome preference binding. Both attempts cleaned up; no Chrome process or external effect occurred.

    The issue remains open and PR #184 remains draft until that exact isolated capability-registry prerequisite is supplied and targeted browser acceptance passes.

  5. ecochran76 commented on Sep 17, 2026

    @ecochran76
    Author

    Real-browser acceptance now passes at 838b771a. The disposable stock-Chrome smoke exercised exact stale-target close, canonical replacement persistence, peer survival, and cleanup. Draft PR #184 is ready for review; full CI remains intentionally excluded.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingeffect/no-liveNo live external effect requiredlane/authCredentials and automated authenticationlane/bugfixReliability and bug fixesstate/in-progressAccepted by an active lane owner

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions