--- created_at: 2026-10-28T19:30:20Z generated_by: harness: opencode provider: openai model: openai/gpt-6-astra git_ref: b64c89f0 scope: code substantive: true raw_file: 20261028T193020Z_b64c89f0_cached_owner.raw.md --- ## Prompt and scope The human authorized investigation in an isolated Tractor worktree after cherry-picking Piker's original 4af885d9 onto the in-use e929fdc2 baseline (replay eb0514c3). They asked to verify related connectivity work, challenged calling this a Tractor regression, and then said to investigate the issue for real. The separate worktree is wkt/cached_aio_owner_exit, rooted at b64c89f05a9fc8ac2878551eb5eda36574ebef6a. Installed environments and the original Piker ownership patch are preserved. No verified dialog ID was available, so dialog/worktree association was not recorded. ## Live evidence On October 28, QQQ backfill hit IB pacing error 162 at 15:02:57. Farm reset proceeded to recovery messages at 15:02:59--15:03:00. QQQ and MNQ quote consumers closed their cached owners to restart. _Cache.run_ctx injected TrioTaskExited into producer tasks 23 and 11. The exit signal escaped through translate_aio_errors() and the cache into stream_quotes(), entering PDB and cancelling the daemon tree. The final root error after debugger continuation still named the datad.ib TrioTaskExited. Broken pipes, late cancel acknowledgements, and EMS ContextCancelled groups followed the initial failure. This is an operational reset failure rather than ordinary SIGINT noise. The evaluated Piker history already contains socket-disconnect propagation efa72980 and bounded reset coordination 0846cbd4. Its missing timer/sampler changes d126302f, c0dae89a and a26e060c do not alter this bridge exit path. They remain separate integration work. ## Contract and implementation docs/guide/asyncio.rst already states that the default suppress_graceful_exits=True absorbs TaskExited signals. A reduced Tractor-only test reproduces the violation without IB or Piker. No historical first-bad Tractor commit has been established. LinkedTaskChannel._aio_owner_exit records the exact object issued by open_channel_from() at owner exit. The done callback consumes that echo instead of cancelling its owner and raising it again. The translator preserves genuine Trio errors, suppresses normal echoes by default, and reports the same object under explicit policy. Type-only suppression is deliberately avoided; cleanup errors and newly constructed TrioTaskExited instances retain propagation. ## Verification Tractor environment: existing /home/goodboy/repos/tractor/.venv, pytest 9.1.0, Trio 0.33.0, Greenback 1.2.1, msgspec 0.21.1. TRACTOR_SPAWN_METHOD and TRACTOR_LOGLEVEL were unset. PYTHONPATH selected only this worktree. Greenback required the existing Nix GCC library directory in LD_LIBRARY_PATH; no packages were installed. Initial development runs exposed two test-environment/harness issues: successful RPCs left the test actor running until its nursery timed out, and Greenback could not load libstdc++. Those were corrected in the test shutdown and process-local environment respectively. They are not evidence of additional production runtime failures. - Original pin + corrected new test: 8 failures / 4 passes. Normal owner exits fail with the echoed signal; strict reporting also fails its exact-identity assertion. Independent-error controls pass. Both native and Greenback paths are exercised. - Fixed new matrix: 12 passes, including overlapping cached users in distinct Trio tasks, two generations and two RPCs per case. - New matrix + root infection + selected infected-asyncio tests: 36 passes, 18 deselected, 24 multiprocessing deprecation warnings. SIGINT and interactive debugger selections were excluded; those paths are not claimed qualified by this run. - Frozen Piker e929fdc2 + original 4af885d9 + existing real bridge reproducer, with the duplicate --ll compatibility removal: 4 passes with candidate Tractor imported via process-local paths. Both actor survival and strict callback cleanliness now pass. External IB and VNC inputs in that reproducer are replayed; its actor, cache, bridge, event delivery and lifetime boundaries are real. - The human advanced the evaluation worktree during investigation to sampler_tick_time_guard at 790dc0a51c9d93e77258360f954c959d11d09a7c. Repeated the same four Piker checks on that exact source tip with candidate Tractor and the same test-only harness adaptation: 4 passed. Its working tree/index were preserved, and its installed to_asyncio.py still has the original b64c89f0 blob fingerprint. The Piker integration used its existing py313 environment and pinned native dependency paths. Import probes verified both source roots. Raw baseline/integration output remains in the session scratch files cached-owner-baseline-final.log and cached-owner-piker-final.log. The human subsequently reported that a backfill data-connection reset no longer crashed at the previous owner-exit failure. Supplied live traces resolve Tractor to this worktree and show both asyncio task and completion acknowledgements of the issued owner-exit signal. At 16:29:07, a separate initial IB get_quote() timeout survived proxy teardown with both owner-exit acknowledgements. After the human continued PDB at 16:31:40, the chart received that TimeoutError at 16:31:41. IB also reported competing-session error 10197 for MNQ request 822; its identity with the timed-out request is unverified. This is bounded live evidence, not complete recovery qualification. Separate unresolved observations include final-result send_nowait() raising BrokenResourceError and a callback bookkeeping assertion; samplerd result delivery on a closed socket; cancellation-only exception groups relayed as errors on SIGINT; Qt self-SIGINT during close; and Piker EMS request loss followed by a req=None fill crash. Sampler timestamp warnings and volume spikes also remain separate. Live connection, TSDB, VNC, account and order operations were performed only by the human. The agent misread a request for a commit plan and created commit 6142d52efc0e5797a240eba0c0b00a24b211fe0e. The human clarified that review must precede committing and authorized a soft reset to b64c89f05a9fc8ac2878551eb5eda36574ebef6a. All five files were preserved staged; the replacement plan is human-executed. ## Files changed - tractor/to_asyncio.py: exact owner-exit echo classification. - tests/test_cached_aio_owner_exit.py: real contract regressions. - docs/guide/asyncio.rst: explain ownership-specific suppression. - This provenance pair. ## Human edits The human supplied live failures and teardown traces, required reuse inspection of connectivity branches, and corrected the distinction between a contract defect and an established historical regression. No direct manual edits to this new Tractor worktree were observed.