Repository navigation
Preserve captured thread targets and live-owner load authority - #3848
Merged
Merged
Conversation
There was a problem hiding this comment.
Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota. Try requesting a review at a lower effort level.
An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing.
|
debt-src at 05d0a59, every finding: |
trissim
force-pushed
the
fix/captured-coordination-source
branch
from
November 2, 2026 01:57
e8da034 to
1239671
Compare
|
debt-tools at 0ea579f, every finding: |
trissim
force-pushed
the
fix/captured-coordination-source
branch
3 times, most recently
from
November 2, 2026 07:56
897a3ac to
4199953
Compare
trissim
force-pushed
the
fix/captured-coordination-source
branch
4 times, most recently
from
November 2, 2026 13:13
68be68d to
a325863
Compare
trissim
force-pushed
the
fix/captured-coordination-source
branch
from
November 2, 2026 14:19
a325863 to
38d118c
Compare
at_response and from_failure each tested `witness is None` on foreign metadata, and the debt gate counted the second as introduced NoneAbsence (session_load.py:42). SessionLoadPlan.witnessed now answers both: the metadata carries the witness under its key and it is decoded, or it carries none and the load ensures. The only writer of agentCommsLoadFailure (FailedSessionLoadPlan.failure_metadata) always encodes a plan, so the test case pinning a null value under that key encoded the old sentinel, not an input; it is dropped and a null there now fails at the decoder. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016gZLdttfQjtizEYZGek9Gh
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Title policy and saved SDK resume spelling — P1090
Source heads: Core3848
a325863122dffc0f68dddaf399343c3aa3187a78; Toad1389e7e409268d3469f697f0a69149933f529dca11b0. Both owned branches were fetched/rebased and pushed, remote equality verified. This is the continuing source pair, not captured qualification, merge or installation.Before/After and deleted decisions
AgentBase inferred automatic titles from observed_thread() is None. AgentConnection now declares the ordinary default; ACP Agent reads the existing CoordinationAttachment state, whose coordinated member declares Core-owned titles. The old absence decision and NoAgentConnection's duplicate flag are gone. The source-identity API and all its original project/rename/support consumers remain intact: the complete search found real readers, so deleting that API would have been wrong. No compatibility method, new manager, identity fallback or type switch was added.
The new uncoordinated startup control exposed another role confusion: AgentSession.new wrote the nominal bound AcpSessionId into DB.Session.agent_session_id:str|None, the durable resume spelling. Its strict encoder refused the value after session/new succeeded. Both DB.session_new and session_started now receive response.session_id from the same original SDK response, while actual ACP destination remains nominal in SessionBinding. Existing authority checks across awaits and strict storage validation remain; no cast, another decoder, schema change or relaxed union. The DB row still supplies the saved launch/resume key through AcpTab.entry and SessionNavigation.
Actual evidence and failed epochs
NRA parser:7title modules/19sites and6resume modules/14sites before mutation. Title proof preserves every other method and the observed_thread API; native inheritance checks pass. Resume proof permits exactly the two original-response producer substitutions and proves all other module AST unchanged.
Epoch03 used pinned installed-runtime interpreter34b0 with exact owned Core
078a78b3537f66fddc89e8f10c4ce67b95e9fd12/ Toad551741951067daaa14ec52237e6532656250842fplus the recorded source patch; its command/source patches and failures are retained under delivery-owned. It is a selected behavior result, not full-head/global typing or a saved-log qualification. Rebase after the run is recorded separately.Complete git diff --stat origin/main...HEAD:
Core:
Toad:
Remaining: native supported source capture using genuineP1090, qualification of the combined actual source set, compatible merge/install and observed submission/project journey. Native-image and physical acceptance remain explicitly open. Installed34b0/Toad58c/Textualda87 excludes this pair. Producer first-publication/recovery defects belong to Typed-dispatch; no competing patch, repeated create or borrowed selector is used.
Assumed: recorded external SDK resume text and bound execution destination retain their distinct roles; the trace covers the concrete existing connection/attachment members, not arbitrary external subclasses. The database wanted a resume key, not the destination wearing a string-shaped hat.
Earlier retained exact epochs
Publisher and notification contracts — P1090
Core3848
68be68dbf521a4556a182ef8c8b8be1d7e2989d0; Toad1389db0fa19bcdc45a541bb416df219236e32549b74c. Continuing original sources, not another PR or a captured qualification.Before/After: ThreadChangeSubscription named Subscription["CoordinationAccess"] although it needs only one Worker-returning capability. ThreadInterest now declares that method, CoordinationAccess inherits it, and the subscription specializes on the real contract. The implementation and callback resource/receiver lifetimes stay with their existing owners. No core_event_carrier.py change, parallel dispatcher, string cache, compatibility alias or fallback. CommsUpdated now carries AcpSessionId|None from its actual bound publishers; SDK inlet decoding/matching remains in SessionBinding and ClientRequestOwner.
The scoped type run then exposed notification keys declared as str across their family even though MessageReference supplies MessageId. Core ReadNotifications/NotificationBatch/NotificationsObserved and Toad's existing cache/result reader now retain that nominal type. No key construction, wire/pickle payload, read scope, state cache or notification behavior was rewritten. The route timer no longer needs a nullable slot: its actual stop callback belongs to the existing ResourceRelease lifetime and is consumed by stop_observing. No dummy timer or absence wrapper was added.
NRA's parser mapped15publisher modules/28sites and5notification modules/15declarations before mutation. Five cold import entry orders pass with real generic argument, abstract contract, Worker return and nominal-session checks. Other existing method bodies compare equal after annotation erasure; CoordinationAccess init/start/stop have the explicitly described resource-lifetime change. Original publisher-contract-controls:3application cases passed, while its two-file type check correctly failed on the two remaining declarations; that epoch remains preserved. Fresh publisher-contract-controls-02 passed the same three real application controls under the existing host lease, while the expanded three-file type check exposed a remaining writable-base-attribute/read-only-property mismatch in NotificationStatus. Its base now supplies the default working getter, and CheckedNotifications retains its existing computed override. Source search found no class-level working readers or writes to status.working. The subsequent publisher-contract-types-03 reports zero errors across those three files (24.152s); it is a type-only result, not a repeated app run. All actual logs/return codes and both tested patches are retained; this proves neither whole-head typing nor physical behavior. The three cases exercise foreign/unbound rejection, different canonical history versus bound ACP destination, and owner-pushed goal replacement/removal.
Core complete source range:
Toad complete source range:
Merge/captured qualification/installation and the installed submission/project journey remain open. Native-image and physical acceptance remain separate.3858's corrected head still belongs to its publisher/installer; no rejected source overlay or competing install is used. Assumed: Python3.14 native annotations and existing external SDK inlets; unrelated hosted findings are not globally waived. A read receipt stays a MessageId, and a timer can retire without first proving it is not None.
Earlier exact epochs
Joined-work owner removes the bootstrap cycle — P1090
Current source
dc5aa960de7437cda622ffc82f0f7c20e0ed15a0. This continues Core3848 and paired Toad1389514c0f927123ddd612def78612ac302c4ed1b922; no new problem or carrier is borrowed.Hosted49c found additional real entry paths: integration->bus and native_package->messages reached session_load, which imported the entire Coordination store aggregate while the bus/message declarations were incomplete. Earlier four-entry and selected-case passes were true but insufficient. Those failed hosted logs remain in core49-hosted-failed.log.
Before: Coordination declared worker_context/run_worker; SessionLoadPlan imported Coordination solely to call that capability. After: CoordinationWork declares those two methods once; Coordination and SessionLoadPlan inherit it. SessionLoadPlan calls its inherited run_worker and no longer imports Coordinator. Coordination's existing callers and worker route derive the same implementations through its MRO, without aliases, wrappers, another executor, context cache or a fallback. Worker/context bodies compare equal modulo only the owning class name; the generic result type is now function-local. Git, maintenance-holder and store context propagation, joined cancellation and resource lifetime stay in their original implementations.
NRA's existing source parser enumerated70source/test/tool modules and258worker/context declaration/reference sites before the edit. A targeted7old/new-module proof checks moved bodies and eight cold entries with native type resolution and inherited-function identity: session_load, thread_presentation, coordinator, registry_store, bus, messages, integration and native_package. All eight pass. The focused execution epoch contains the five load-plan cases plus the existing concurrent maintenance-holder isolation control; exact collected/executed counts, return code and command are retained in coordination-work-controls. It used the real host TestLease with inherited descriptors, a fresh owned temp root and bounded INT timeout. No full suite or local NRA gate.
This is source/counterexample and selected execution evidence, not captured qualification, a merge, an installation or a physical/native-image journey. Current independent installed e4 excludes the pair.3858 remains under its owner's foreign-checkout correction and cannot be consumed at a rejected head. Assumed: native Python3.14 annotations; old failed/UNKNOWN inputs remain unreplayed, and broader hosted source findings remain open. The load plan now borrows the worker without hauling the entire filing cabinet through the import door.
Prior exact epochs
Native callback/import correction — P1090
Current source
49c9a9b0b58fffa367ad9a0b17a916e7295e151d, paired with Toad1389514c0f927123ddd612def78612ac302c4ed1b922. Primary P1090/orderb77b6d7bb980 records continuing work. Old3857/1407 carriers remain stale.SessionLoadPlan's new reload callback now uses its real native type, not a quoted identity. The mutually referring declarations use their module namespaces rather than importing an unavailable class from a partially initialized module. Thread presentation declares its status/binding/presentation classes before its static session-load module import; session-load refers to Coordination through its declaring module. There is no function-local lazy import, placeholder type, fallback, registration copy or changed plan algorithm.
All method bodies compare equal after erasing annotations and normalizing only the imported Coordination qualification. Existing load witness, original birth/process, supersession, no-witness default and serialization owners remain. Runtime annotations resolve to the actual classes. Four cold entry orders pass: session_load, thread_presentation, coordinator and registry_store.
Failures remain explicit: the first direct namespace attempt failed the thread-presentation-first import through Coordination/AssignmentStore/notification_progress; declaring presentation classes first repaired that order. Its next focused pytest launch then failed before collection because Coordinator itself was the importing entry. Referring to that original module rather than eagerly acquiring its unfinished class repaired this separate cut. The next controller mistakenly held the parent TestLease without passing its inherited descriptor: that child timed out124 with no test output. Correcting the controller through the existing inherited arguments/descriptors API produced control03:5collected/5executed/5passed, pytest0.08s/controller4.32s,rc0, lease released. The final log and return code are in load-annotation-controls-03; this is its recorded patch on Core98a, before this publication rebase. No result from the failed pre-collection epoch is counted. No full suite or local NRA gate.
Source judgment, saved selected execution, captured qualification, compatible merge, installed build and observed native/physical delivery remain distinct. Original failed/UNKNOWN inputs are not replayed. Current independent installede4d407b53ab8 excludes this pair. Assumed: the supported Python3.14 native annotation lifecycle; remaining hosted candidate findings are not globally waived. A type annotation no longer demands tomorrow's class before today's module has finished waking up.
Previous source and execution epochs
Current cleanup rebase
Pushed source
98a65222653cc48905c0a22f72ae0a64ff0c3c8bonto main58daba13e30363fd1439136a5e0afbb09a7c942d, including test cleanup58daba13e. Remote ref equals the local commit. The test_acp conflict preserves main's shared RecordingClient rather than restoring a per-test client; the shared recorder now also retains actual publication destinations for canonical-history versus ACP-destination assertions. Main's fixture/session publication changes and deleted tests remain in place. No tests ran as part of this rebase; earlier epochs below do not qualify the new head.Resolved carrier3857 remains on its prior source until explicitly rebuilt and qualified. The independently installed f03ec97 runtime excludes this source pair.
Current coupled landing
Current head
4199953d74c1ea918036211589513accb769070a; companion Core4199953d74c1ea918036211589513accb769070a/ Toade052cb736b882eaed0f4da4fe6838b104fafc399. 6 commits against fetched main.The original implementation-context holder owns integration, the necessary combined host-leased selection, merge and supported install. No compulsory central review or handoff.
Composition preserved
Evidence scope
Assumed: configured pinned native package and current typed SDK contract; actual runtime outcomes remain owned by their runs.
Earlier mechanism documentation
Earlier hashes and counts below describe prior epochs. The current pair above supersedes them.
Current compatible Toad consumer: #1389
385d47b3105b3b93812a8b12e3228629cca88534. Its process/session correction does not change this paired API; the earlier11 binding-load data cases retain their original epoch, not a new application claim. Both API halves still land/install together.Captured project targets and live-owner loads — companion to Toad#1389
5 commits,18 files,+215/-52 versus fetched main, source
fd3bd256af521d53b4583a4dc26aea7f087780fd, retaining parent1239671bf7aa916f74022170e95379ededbc91f0for the running integration epoch. Four production owners changed; all discovered project-call consumers migrated. Unfinished source checkpoint, not accepted application delivery.Must land/install together with OpenHCSDev/toad#1389 at
385d47b3105b3b93812a8b12e3228629cca88534or a reviewed descendant. No compatibility shim. Older Toad main calls the name-only API and is not an admitted client of this changed signature. Neither half is independently enqueued.Project identity: stop discarding the birth before ingress
Before: CoordinationChangedUpdate already carried ThreadIncarnation, but Toad passed
.thread.name; CommsSetProjectTool likewise passed caller.name. ThreadManagement.set_project then acquired its original Thread from that spelling. Its existing atomic Thread.require_original_project check protected changes AFTER that acquisition, not a delete/recreation BEFORE ingress. RegistryDocument._remove removes the old declaration/aliases, so another birth can occupy the same name.After: ThreadManagement.set_project takes ThreadIncarnation. It resolves that target through the existing registry namespace, checks the acquired incarnation before path work, and retains the existing original-project check inside Registration.update_thread. Publication uses the acquired canonical name. Original rename aliases remain valid; a different birth cannot receive the old request. Existing path resolution, directory checks, owner/session preservation, project history and next-turn resume behavior remain on the SAME owner.
The tool uses its existing caller.identity(comms); paired Toad uses its original packet.thread. Direct, threaded and executor-submitted callers across Core tests and Toad's native project-resume test are migrated. No name-accepting overload, new lock, copied project mover or field mirror. Four existing project-publication assertions now compare the declared Checkout rather than a string masquerading as that type.
Formal defect: BOUND-8, fact=original mutation-target birth, at old Toad coordination_attachment.py:246 / Core thread_management.py:357, derive=nominal-key, by ThreadIncarnation at thread_identity.py:174. Paper1 section2 requires the representation to retain distinctions the response needs. Asking which birth was meant after throwing it away was an identity check with a paper shredder in front of it.
Live-owner reload: let the binding supply its own load plan
Before: Toad took a general ThreadOwnerBinding, asked a bool whether it superseded the previous load, then constructed ExistingSessionLoadPlan, whose declaration requires LiveThreadOwnerBinding. The runtime relation was not expressed by that consumer's type contract.
After: ThreadOwnerBinding retains its genuine unavailable no-op
reload_if_superseded; LiveThreadOwnerBinding delegates the typed reload capability to the previous plan. SessionLoadPlan defaults to no reload without a witness. WitnessedSessionLoadPlan owns the unchanged supersession check and constructs ExistingSessionLoadPlan from the supplied LiveThreadOwnerBinding, then invokes the reattach operation. This removes the reverse runtime import from thread_presentation.py to session_load.py. Toad retains its actual settled/reconnecting guard and binding call unchanged. No cast, isinstance, TypeGuard, compatibility alias, copied plan or state string. Existing Ensuring/Existing/Failed metadata and failure-replay refusal are unchanged; a failed witness can observe a new live owner without replaying its failed load.Source and data-only evidence
Commander54438 correction: 2 files,+15/-4, parent
1239671bf7aa916f74022170e95379ededbc91f0. NRA maps23 relevant source/test/tool modules in both repositories before/after; six binding/plan declaration parents and stored fields are unchanged. Existing methods (apart from the replacing live-binding delegator), decorators, metadata encoders, resolution and supersession methods compare AST-identical. Both changed files compile; both cold import orders resolve the owned source, rc0. No behavior tests, App, RPC, provider or pytest executed. Existing load-plan regression source is unchanged. Commander retains the running selection at its original parent epoch; that result is not silently promoted to this new head. Source/map/import evidence:load-plan-{map-before,map-after,source-result}andload-plan-source-check.logunder Errors scratch.Supported NRA class/syntax enumeration before edits: 667 modules,2,488 raw/2,451 canonical classes,37 OPEN,0 parse omissions,9,976 relevant sites, covering complete owned Toad src/tests and the selected Core owners/dependencies/discovered consumers. Consumer closure found two passed-method references that a call-parenthesis-only grep missed. The added unchanged bulk-lifetime test was read and enumerated before its migration. Final map: 669 modules,2,490 raw/2,453 canonical classes,37 OPEN,0 omissions,10,088 sites; the scope adds the new project-identity test module and existing bulk-lifetime module. Static binding/alias/dynamic limits remain OPEN. NRA#161 supplies zero admitted safe method moves.
Prepared fd0386 Python, explicit owned Core/Toad source, actual import origins retained: 12 files compile and11 actual binding/load cases pass,rc0. Cases cover unavailable, unchanged, lower generation, different birth, rename-preserving newer owner, Existing/Failed witnesses and non-witness Ensuring loads. This constructs real data-family members and observes the declared callback. No project mutation, App, root, RPC, provider, frontend, SDK reconnect or pytest ran.
Focused non-incremental mypy over the three Core modules and paired Toad attachment is RED:3 errors in2 files/4 selected files,rc1: unchanged ForkSpec backend.fork contract (thread_management.py:204), RuntimeLocation construction (:488), and CommsGoalTool transition kwargs (tools.py:536). None is suppressed. This selection does not replace #1389's earlier sixteen-file44-error result or establish an all-green tree. The new attachment no longer reports the general-binding-to-live-load error in this selection.
Unrun integration and delivery obligations
New proposed Core cases: three real project identity cases in
tests/test_project_source_identity.pyand three parametrized/load behavior cases intests/test_session_load_plan.py; unrun. Integration must also cover existing project publication/resume, checkout histories, executing-source registration, bulk rehome fencing and paired Toad project/title/source cases. Commander owns the necessary combined leased selection; no local pytest, full suite or NRA gate was launched.Original #1389 native/CLI/channel/error/ACK/editor/readers/history/image acceptance and installation remain open. Core#3842's connector heartbeat/RSS/later-growth installed acceptance is separate; no parallel installer or live-process injection. Original sessions and failed/UNKNOWN inputs are untouched and unreplayed.
Receipts under Errors' retained scratch: coordination-core-{before,consumer-extension,after}, coordination-core-source-01 (including both repositories' source hashes), coordination-core-types-01, coordination-paired-publish, complete project-site searches and publication/body readback.
Assumed: the declared source and data-only checks only. Actual mutations, reconnect, real application/installed behavior and remaining type contracts require their own evidence.
Transcript replay: history source is not the ACP destination
Commander54482 found the real project-resume failure: load passed AcpSessionId into TranscriptPageRead.thread and strict projection rejected it. Replay and subscribe now require a separate history-thread argument and keyword-only nominal ACP destination. Both lifecycle replay sites use their acquired Thread.name; runtime subscription uses ctx.name and ctx.session. TranscriptUpdate and TurnTranscriptUpdate retain AcpSessionId through publication. Only SdkSessionConnection spells it using the existing AcpSessionIdText at the foreign SDK call. No decoder relaxation, guessed thread, overload, registry, cast or local import.
The shared TranscriptReplay init/observing lifetime and cancellation methods compare AST-identical. Existing bounded snapshot coverage now exercises replay/subscription both before and after rename with a different publication destination; saved-input-display coverage also uses a distinct destination and still checks internal wrappers/images. These authored cases are UNRUN by the author. Necessary integration paths: tests/test_project_resume.py, tests/test_acp.py::TestHandlers::test_snapshot_capability_replays_one_bounded_update, tests/test_transcript_input_display.py, tests/test_runtime.py::test_subscription_replay_uses_requested_alias and existing typed-turn event paths. Runtime rename assertions preserve original destination delivery while separately checking canonical history identity; the coupled Toad consumer must preserve captured-session plus root/incarnation fences without comparing those different names. Commander retains the failed integration epoch and owns execution; old results do not qualify this head.
Source evidence only: NRA enumerated41 relevant Core/Toad modules before/after; seven changed files compile, four imports resolve owned Core source, data-only nominal encoding and strict wrong-thread rejection pass. No pytest, App, RPC, store, provider or installed behavior executed. Original failed/UNKNOWN input remains unreplayed. Retained transcript-identity-{before,after,source-result} and transcript-identity-source-final.log under Errors scratch. The history reader no longer uses the destination address as a filing cabinet label.
Current paired Toad correction:
9c3d999c3c2d6563bc9f0a3057915b2e58d0ca18, direct child ofec73e7a3aed4a6b6de2c5bbde4dd43d40018a5f2, restores explicit ACP-destination acceptance while preserving captured session/surface and root/incarnation fences; also closes the admitted BUS-writer and request-local shared-close defects. Source/import qualification only, no author behavior run. Commander retains combined execution and coupled landing.Saved-row fixture producer correction after actual Core156 result
Commander54671 executed8 cases at integration156ba49f2eceb00c7fd8ea1ad1b41ddfde56a792:7passed/1failed,37.98s,rc1. Project load and canonical replay/subscription/rename cases passed at THAT epoch. The remaining saved-input-display case failed before replay because saved_row supplied raw id=native_id[:8] to MessageEntry.id: FreshNativeId|NoEntryId.
This correction imports existing FreshNativeIdText and decodes exactly native_id[:8] at saved_row's producer. The external spelling, payload, native input identity, image handling, hidden internal text and all assertions remain unchanged. No fixture-helper widening, decoder/production change, cast, new ID or compatibility path. The helper/MessageEntry/FreshNativeId owners are byte-unchanged; the producer AST is identical after removing only this decode wrapper.
Source only: five old/new/owner modules parsed without omissions, four files compiled and turn_item cold-imported from owned source. No author pytest, App, SDK, store or provider operation; no corrected behavior result claimed. Retain core156-tests.log/.rc and the old failure. Necessary unresolved case: tests/test_transcript_input_display.py::test_acp_saved_transcript_replay_hides_only_owned_internal_input. The seven prior passes do not become a new-head result. Toad9c3d999c is unchanged; composed91654011b still needs its necessary execution. Assumed: the integration owner applies this one-file delta to its current composed epoch and keeps the API halves coupled. The eight-character ID keeps its spelling and finally brings its declared type to work.
Hosted annotation correction, Commander54867
Corrective source
fd3bd256af521d53b4583a4dc26aea7f087780fd, parent77d2cd15af5918c42b60760d7e44785b21e3e3d9: one file,+1/-1.FailedSessionLoadPlan.from_failurenow uses nativeFailedSessionLoadPlan | None, not a string wrapping that type. Python3.14 already defers annotation evaluation without a future import. Original body, failure decode, declarations and ThreadOwnerBinding behavior are unchanged. NRA parsed all17 selected Core/Toad source modules (188 original classes); this inventory is not a global preservation proof. The exact three-module old/new/dependency check proves the function AST differs only by its equivalent return annotation; both cold import orders and actual native annotation resolution pass from owned source. No author pytest/App/SDK/store/provider run.thread_presentation.pyretains its annotation-only SessionLoadPlan import: session_load runtime-imports the binding classes; the binding callback type refers back to the plan. The unavailable base remains a real no-op, LiveThreadOwnerBinding delegates to the captured previous plan, and WitnessedSessionLoadPlan owns ExistingSessionLoadPlan construction. A reverse runtime/local import is forbidden. Toad's hosted reload_if_superseded error is against Core main, not pairedCore4b9; no Toad shim. Earlier behavioral results remain their exact composed epochs, not this new head. Commander retains coupled qualification/landing/installation. Assumed: only this corrective delta is composed into3852, with no independent incompatible-half installation. The annotation no longer needs a string escort.