Compositional Linearizability and Modular Concurrent Objects
Prerequisites. Direct starred prerequisites: Chapter 86. No later core chapter depends on this route.
Two exchanger calls overlap. Thread 0 offers 2 and returns 4; thread 1 offers 4 and returns 2. No ordering of two independent deterministic atomic exchanges explains both results: the first ordered operation would have to return before the second offer was available. A paired specification can perform the two calls and the two returns as one concurrency class. The problem is to expose that behavior as a black box without losing composition.
Finite traces make the obstruction calculable
Fix a finite number 𝑇:ℕ of threads and put 𝖭𝖺𝗆𝖾(𝑇):={𝑖:ℕ∣𝑖<𝑇}. An effect signature 𝐸 assigns to each result type 𝐴 a type 𝐸(𝐴) of operations returning values of type 𝐴. A thread event is 𝑖:𝖼𝖺𝗅𝗅(𝑚)or𝑖:𝗋𝖾𝗍(𝑚,𝑣),𝑖:𝖭𝖺𝗆𝖾(𝑇),𝑚:𝐸(𝐴),𝑣:𝐴.
An active map 𝑎 assigns to each thread either no operation or one package ⟨𝐴,𝑚:𝐸(𝐴)⟩. The judgment 𝖲𝖾𝗊𝖢𝗈𝗇𝗌(𝑎,𝑝) is generated from the end of a finite trace by
A complete history begins under the everywhere-empty active map and ends under the everywhere-empty active map. A pending history may instead be completed by appending matching returns or by deleting pending calls. Every comparison in this chapter applies the same completion choice to its two sides.
The trace 0:𝖼𝖺𝗅𝗅(𝗂𝗇𝖼);0:𝗋𝖾𝗍(𝗂𝗇𝖼,1);1:𝖼𝖺𝗅𝗅(𝗀𝖾𝗍);1:𝗋𝖾𝗍(𝗀𝖾𝗍,1) satisfies CL-Seq-call, CL-Seq-ret, CL-Seq-call, and CL-Seq-ret in that order. A return by thread 1 before its call fails the first premise of CL-Seq-ret.
A specification is an element 𝑉:𝖲𝗉𝖾𝖼𝑇(𝐸). Its data are a state type 𝑆𝑉, an initial state 𝑠𝑉, and a labelled relation 𝑠𝖲𝗍𝖾𝗉𝑉(𝑒)𝑠′(𝑒:𝖭𝖺𝗆𝖾(𝑇)×𝖤𝗏𝖾𝗇𝗍(𝐸)). It also contains a proof that every trace from 𝑠𝑉 satisfies 𝖲𝖾𝗊𝖢𝗈𝗇𝗌 under the empty active map. Write 𝖳𝗋(𝑉) for its finite traces from 𝑠𝑉.
The sequential-consistency proof is data in the card because later linking must not manufacture a return for a call that never occurred. An arbitrary labelled graph is therefore not a 𝖲𝗉𝖾𝖼𝑇(𝐸).
★☆☆ Let the one-thread counter have states 𝑛:ℕ: an 𝗂𝗇𝖼 call keeps 𝑛 fixed, and its matching return emits 𝑛+1 and moves to 𝑛+1. Starting at zero, list every visible length-two prefix whose first event is 0:𝖼𝖺𝗅𝗅(𝗂𝗇𝖼). Reject the prefix that returns 2, and name the state-transition premise that rejects it.
For an underlay signature 𝐸, programs are given by 𝖯𝗋𝗈𝗀𝐸(𝐴)::=𝖱𝖾𝗍𝗎𝗋𝗇(𝑎)∣𝖳𝖺𝗎(𝑝)∣𝖵𝗂𝗌(𝑚,𝑘), where 𝑎:𝐴, 𝑚:𝐸(𝐵), and 𝑘:𝐵→𝖯𝗋𝗈𝗀𝐸(𝐴). An implementation 𝑀:𝖨𝗆𝗉𝗅(𝐸,𝐹) maps each 𝑚:𝐹(𝐴) to a program 𝑀(𝑚):𝖯𝗋𝗈𝗀𝐸(𝐴). The displayed grammar denotes the greatest fixed point of the operator F(𝑋):=𝐴+𝑋+∑𝐵:𝖳𝗒𝗉𝖾𝐸(𝐵)×(𝐵→𝑋). Consequently its constructors are observations, not a finite syntax induction principle. For example, guarded corecursion defines 𝗌𝗉𝗂𝗇:𝖯𝗋𝗈𝗀𝐸(𝐴) by 𝗌𝗉𝗂𝗇=𝖳𝖺𝗎(𝗌𝗉𝗂𝗇).
The bridge from definition 86.1 is the constructor-preserving map 𝖱𝖾𝗍𝗎𝗋𝗇↦𝖱𝖾𝗍,𝖳𝖺𝗎↦𝖳𝖺𝗎,𝖵𝗂𝗌↦𝖵𝗂𝗌. It preserves finite traces by induction on the observer budget. It does not identify the two libraries or transfer a Rocq theorem between them.
For a relation 𝑆 on programs, the artifact-local one-layer relation 𝖤𝗎𝗍𝗍𝖥(𝑆) matches equal returns, matches equal visible operations with 𝑆-related continuations, and has the three silent clauses
𝑆(𝑝,𝑞)
𝖤𝗎𝗍𝗍𝖥(𝑆,𝖳𝖺𝗎(𝑝),𝖳𝖺𝗎(𝑞))
𝖤𝗎𝗍𝗍𝖥(𝑆,𝑝,𝑞)
𝖤𝗎𝗍𝗍𝖥(𝑆,𝖳𝖺𝗎(𝑝),𝑞)
𝖤𝗎𝗍𝗍𝖥(𝑆,𝑝,𝑞)
𝖤𝗎𝗍𝗍𝖥(𝑆,𝑝,𝖳𝖺𝗎(𝑞))
Write 𝑝≈𝖯𝑞 for the greatest fixed point of this monotone operator. It is termination sensitive: the two asymmetric clauses remove a finite silent prefix inside one inductive layer, but do not equate 𝗌𝗉𝗂𝗇 with a return. For modules 𝑀,𝑁:𝖨𝗆𝗉𝗅(𝐸,𝐹), the displayed notation 𝑀≈𝖯𝑁 below denotes its pointwise lifting: 𝑀(𝑚)≈𝖯𝑁(𝑚) for every result type 𝐴 and operation 𝑚:𝐹(𝐴).
The artifact makes substitution productive by defining it mutually with a continuation operation. For 𝑘:𝐵→𝖯𝗋𝗈𝗀𝐹(𝐴) and 𝑝:𝖯𝗋𝗈𝗀𝐸(𝐵), the complete observation equations are 𝗌𝗎𝖻𝗌𝗍𝑀(𝖱𝖾𝗍𝗎𝗋𝗇(𝑎)):=𝖱𝖾𝗍𝗎𝗋𝗇(𝑎),𝗌𝗎𝖻𝗌𝗍𝑀(𝖳𝖺𝗎(𝑝)):=𝖳𝖺𝗎(𝗌𝗎𝖻𝗌𝗍𝑀(𝑝)),𝗌𝗎𝖻𝗌𝗍𝑀(𝖵𝗂𝗌(𝑚,𝑘)):=𝖳𝖺𝗎(𝖻𝗂𝗇𝖽𝖲𝗎𝖻𝗌𝗍𝑀(𝑘,𝑀(𝑚))),𝖻𝗂𝗇𝖽𝖲𝗎𝖻𝗌𝗍𝑀(𝑘,𝖱𝖾𝗍𝗎𝗋𝗇(𝑏)):=𝖳𝖺𝗎(𝗌𝗎𝖻𝗌𝗍𝑀(𝑘(𝑏))),𝖻𝗂𝗇𝖽𝖲𝗎𝖻𝗌𝗍𝑀(𝑘,𝖳𝖺𝗎(𝑝)):=𝖳𝖺𝗎(𝖻𝗂𝗇𝖽𝖲𝗎𝖻𝗌𝗍𝑀(𝑘,𝑝)),𝖻𝗂𝗇𝖽𝖲𝗎𝖻𝗌𝗍𝑀(𝑘,𝖵𝗂𝗌(𝑢,ℎ)):=𝖵𝗂𝗌(𝑢,𝜆𝑥.𝖻𝗂𝗇𝖽𝖲𝗎𝖻𝗌𝗍𝑀(𝑘,ℎ(𝑥))). Every recursive call is guarded by 𝖳𝖺𝗎 or lies in a visible continuation. The administrative silent steps are why the module laws below hold at ≈𝖯 rather than by constructor equality. These operations are local to the artifact and do not use 𝗂𝗇𝗍𝖾𝗋𝗉 from chapter 86.
Running 𝑀:𝖨𝗆𝗉𝗅(𝐸,𝐹) above 𝑉:𝖲𝗉𝖾𝖼𝑇(𝐸) produces the linked specification 𝑉▹𝑀:𝖲𝗉𝖾𝖼𝑇(𝐹). An overlay call starts 𝑀(𝑚) for the selected thread. A visible operation of 𝑀(𝑚) becomes an underlay call and return in 𝑉. A program 𝖳𝖺𝗎 changes only the thread state. The next four rules exhibit the thread-local cases.
𝑞(𝑖)=𝖨𝖽𝗅𝖾
𝑞𝑖:𝖼𝖺𝗅𝗅(𝑚)𝑞[𝑖↦𝖢𝗈𝗇𝗍(𝑚,𝑀(𝑚))]
CL-Overlay-call
𝑞(𝑖)=𝖢𝗈𝗇𝗍(𝑚,𝖱𝖾𝗍𝗎𝗋𝗇(𝑣))
𝑞𝑖:𝗋𝖾𝗍(𝑚,𝑣)𝑞[𝑖↦𝖨𝖽𝗅𝖾]
CL-Overlay-ret
𝑞(𝑖)=𝖢𝗈𝗇𝗍(𝑚,𝖵𝗂𝗌(𝑢,𝑘))𝑠𝖲𝗍𝖾𝗉𝑉(𝑖:𝖼𝖺𝗅𝗅(𝑢))𝑠′
(𝑞,𝑠)⟶𝖢𝖫(𝑞[𝑖↦𝖴𝖢𝖺𝗅𝗅(𝑚,𝑢,𝑘)],𝑠′)
CL-Underlay-call
𝑞(𝑖)=𝖴𝖢𝖺𝗅𝗅(𝑚,𝑢,𝑘)𝑠𝖲𝗍𝖾𝗉𝑉(𝑖:𝗋𝖾𝗍(𝑢,𝑣))𝑠′
(𝑞,𝑠)⟶𝖢𝖫(𝑞[𝑖↦𝖢𝗈𝗇𝗍(𝑚,𝑘(𝑣))],𝑠′)
CL-Underlay-ret
The silent case sends 𝖢𝗈𝗇𝗍(𝑚,𝖳𝖺𝗎(𝑝)) to 𝖢𝗈𝗇𝗍(𝑚,𝑝) without changing 𝑠. Thus no scheduler object is part of the signature: one transition chooses one thread name and applies its matching rule.
Let 𝑀:𝖨𝗆𝗉𝗅(𝐸,𝐹) and 𝑁:𝖨𝗆𝗉𝗅(𝐹,𝐺). Vertical module composition substitutes 𝑀 into the upper program 𝑁(𝑔): (𝑀;𝑁)(𝑔):=𝗌𝗎𝖻𝗌𝗍𝑀(𝑁(𝑔)),(𝑀;𝑁)(𝑔):𝖯𝗋𝗈𝗀𝐸(𝐴)(𝑔:𝐺(𝐴)). The identity module is 𝗂𝖽𝖬(𝑚):=𝖵𝗂𝗌(𝑚,𝖱𝖾𝗍𝗎𝗋𝗇).
For tagged signatures 𝐸1+𝐸2 and specifications 𝑉𝑖:𝖲𝗉𝖾𝖼𝑇(𝐸𝑖) over the same finite thread set, the horizontal tensor 𝑉1⊗𝑉2:𝖲𝗉𝖾𝖼𝑇(𝐸1+𝐸2) has state 𝖠𝖼𝗍𝗂𝗏𝖾𝑇(𝐸1+𝐸2)×𝑆𝑉1×𝑆𝑉2. On a left call by 𝑖, the active entry for 𝑖 must be empty, becomes the left-tagged operation, and the first component specification takes the corresponding call step; the right state is unchanged. A left return requires that same left-tagged active operation and clears the entry. The two right-tagged clauses exchange the component roles. All active entries for 𝑗≠𝑖 are preserved. This shared active map rules out a call in one component followed by a return through the other, even though a thread may use either component at different times. The tensor 𝑀1⊗𝑀2 dispatches on operation tags and maps every event generated by the chosen module through the same tag.
Let the data have types 𝑉:𝖲𝗉𝖾𝖼𝑇(𝐸),𝑀:𝖨𝗆𝗉𝗅(𝐸,𝐹),𝑁:𝖨𝗆𝗉𝗅(𝐹,𝐺),𝐿:𝖨𝗆𝗉𝗅(𝐺,𝐻). The local weak equivalence satisfies 𝗂𝖽𝖬;𝑀≈𝖯𝑀,𝑀;𝗂𝖽𝖬≈𝖯𝑀,(𝑀;𝑁);𝐿≈𝖯𝑀;(𝑁;𝐿),(𝑉▹𝑀)▹𝑁≅𝑉▹(𝑀;𝑁),(𝑉1⊗𝑉2)▹(𝑀1⊗𝑀2)=(𝑉1▹𝑀1)⊗(𝑉2▹𝑀2) where the tensor equation additionally quantifies over 𝑉𝑖:𝖲𝗉𝖾𝖼𝑇(𝐸𝑖) and 𝑀𝑖:𝖨𝗆𝗉𝗅(𝐸𝑖,𝐹𝑖); the signature sums are tagged. The relation ≅ is linked-LTS isomorphism up to renaming the nested thread and product states. There is deliberately no law 𝑉▹𝗂𝖽𝖬=𝑉: the left side is the identity saturation 𝖪(𝑉) and exposes linearization brackets absent from 𝑉.
Proof. For the module unit and associativity laws, coinduct on the local program. Return and silent forms are immediate. At a visible form, substitution expands one local bind; its return, silent, and visible cases establish the two unit equations and reassociate the nested substitutions. This produces ≈𝖯 because only a finite administrative silent prefix can differ.
For linking compatibility, relate the nested linked state containing the outer continuation to the single linked state containing its substituted program. The overlay rules match directly. An underlay call/return pair in the nested state corresponds to the visible substitution clause in the single state. This establishes the displayed ≅ without erasing an overlay bracket.
For tensor, induct on a finite execution. A left-tagged event changes only the first component on both sides; a right-tagged event changes only the second. The shared active-map premise preserves the selected tagged operation until its matching return, and every unselected entry is unchanged. These facts exhaust the transition relation and preserve global 𝖲𝖾𝗊𝖢𝗈𝗇𝗌. ◻
★★☆ Prove the two module unit laws of lemma 87.5 for one visible program 𝖵𝗂𝗌(𝑚,𝑘). Expand local substitution and bind, then match the returned continuation pointwise. Finally exhibit a two-thread trace of 𝖪(𝑉)=𝑉▹𝗂𝖽𝖬 whose two overlay calls occur before either underlay return, explaining why this does not prove 𝑉▹𝗂𝖽𝖬=𝑉.
Write 𝖱𝖾𝖿(𝑉′,𝑉) when every completed finite trace of 𝑉′ is a completed finite trace of 𝑉, under the same pending-call convention. Define 𝖪(𝑉):=𝑉▹𝗂𝖽𝖬.𝖪(𝑉) exposes the bracket between an overlay call and its corresponding underlay action. Its overlay trace set can be strictly larger than that of 𝑉 because different threads may overlap these brackets. We say 𝑉′ is compositionally linearizable with respect to 𝑉, written 𝖫𝗂𝗇(𝑉′,𝑉), if and only if 𝖱𝖾𝖿(𝑉′,𝖪(𝑉)).
The direction of 𝖱𝖾𝖿 is fixed by the trace inclusion: the concrete 𝑉′ occurs first. Reversing the arguments would allow a concrete object to add behaviors not admitted by its specification.
Let 𝑉′𝐸,𝑉𝐸:𝖲𝗉𝖾𝖼𝑇(𝐸),𝑀:𝖨𝗆𝗉𝗅(𝐸,𝐺). If 𝖫𝗂𝗇(𝑉′𝐸,𝑉𝐸), then 𝖱𝖾𝖿(𝑉′𝐸▹𝑀,𝑉𝐸▹𝑀). For tagged signatures over the same finite thread set, with 𝑉′𝑖,𝑉𝑖:𝖲𝗉𝖾𝖼𝑇(𝐸𝑖), 𝖫𝗂𝗇(𝑉′1⊗𝑉′2,𝑉1⊗𝑉2)⟺𝖫𝗂𝗇(𝑉′1,𝑉1)∧𝖫𝗂𝗇(𝑉′2,𝑉2).
Proof of Theorem 87.7 — Observational refinement and locality
Proof. For observational refinement, take a trace of 𝑉′𝐸▹𝑀. Projecting away the program states yields a trace of 𝑉′𝐸. The hypothesis places that trace in 𝖪(𝑉𝐸)=𝑉𝐸▹𝗂𝖽𝖬. Reinsert the same 𝑀 transitions. Linking compatibility gives (𝑉𝐸▹𝗂𝖽𝖬)▹𝑀≅𝑉𝐸▹(𝗂𝖽𝖬;𝑀)≅𝑉𝐸▹𝑀, where the last step is the module unit law. Thus the reinserted execution is an execution of 𝑉𝐸▹𝑀; no equation 𝖪(𝑉𝐸)=𝑉𝐸 is used.
For locality from right to left, project a tensor trace to its left and right tags. The two hypotheses linearize the projections independently. Their shuffle preserves per-thread order because the shared active map permits at most one tagged operation of a thread at a time. The tensor clause of lemma 87.5 reconstructs a trace of 𝖪(𝑉1⊗𝑉2).
For the reverse implication, take a trace of 𝑉′1 and tensor it with the empty trace of 𝑉′2. Tensor linearizability and left projection give 𝖫𝗂𝗇(𝑉′1,𝑉1). The right result follows by exchanging the two product projections; this exchange preserves the trace, completion, and thread-order hypotheses. ◻
For 𝑖∈{1,2}, let 𝑉′𝐸𝑖:𝖲𝗉𝖾𝖼𝑇𝑖(𝐸𝑖), 𝑀𝑖:𝖨𝗆𝗉𝗅(𝐸𝑖,𝐹𝑖), and 𝑉𝐹𝑖:𝖲𝗉𝖾𝖼𝑇𝑖(𝐹𝑖), where 𝑇1=𝑇2=𝑇 and both signature sums are tagged. Write 𝑉′𝑖:=𝑉′𝐸𝑖 and 𝑉𝑖:=𝑉𝐹𝑖. If 𝖫𝗂𝗇(𝑉′1▹𝑀1,𝑉1) and 𝖫𝗂𝗇(𝑉′2▹𝑀2,𝑉2), then 𝖫𝗂𝗇((𝑉′1⊗𝑉′2)▹(𝑀1⊗𝑀2),𝑉1⊗𝑉2). For the vertical statement, let 𝑉𝐸:𝖲𝗉𝖾𝖼𝑇(𝐸),𝑀𝐸:𝖨𝗆𝗉𝗅(𝐸,𝐹),𝑉𝐹:𝖲𝗉𝖾𝖼𝑇(𝐹),𝑀𝐹:𝖨𝗆𝗉𝗅(𝐹,𝐺),𝑉𝐺:𝖲𝗉𝖾𝖼𝑇(𝐺). If 𝖫𝗂𝗇(𝑉𝐸▹𝑀𝐸,𝑉𝐹) and 𝖫𝗂𝗇(𝑉𝐹▹𝑀𝐹,𝑉𝐺), then 𝖫𝗂𝗇(𝑉𝐸▹(𝑀𝐸;𝑀𝐹),𝑉𝐺).
Proof of Theorem 87.8 — Horizontal and vertical composition
Proof. The tensor equation in lemma 87.5, followed by the two directions of theorem 87.7, gives the horizontal claim. For the vertical claim, apply observational refinement to the first hypothesis with client 𝑀𝐹. Compose the resulting trace inclusion with the second hypothesis, then reassociate linking by lemma 87.5. The right-hand specification is 𝖪(𝑉𝐺), as required by the definition of the displayed linearizability judgment. ◻
Atomic, set, and interval boundaries
For an atomic specification, each call is immediately followed by its return. Then an execution of 𝖪(𝑉) chooses one point between the overlay call and return at which the atomic transition occurs. Hence 𝖫𝗂𝗇(−,𝑉) specializes to Herlihy–Wing linearizability, with the completion convention of definition 87.1.
The exchanger trace 0:𝖼𝖺𝗅𝗅(𝖾𝗑𝖼𝗁(2));1:𝖼𝖺𝗅𝗅(𝖾𝗑𝖼𝗁(4));0:𝗋𝖾𝗍(𝖾𝗑𝖼𝗁(2),4);1:𝗋𝖾𝗍(𝖾𝗑𝖼𝗁(4),2) has no atomic linearization. If thread 0 is first, its return 4 depends on thread 1’s later offer. If thread 1 is first, its return 2 depends on thread 0’s later offer. A paired set step sees both offers and returns the crossed pair.
★★☆ Enumerate the two total orders of the exchanger operations. For each order, write the first return required by a deterministic atomic specification and show why the required offered value is unavailable at that point.
Fix a finite history 𝐻 and a particular partition 𝜋=(𝐶1,…,𝐶𝑛) into nonempty concurrency classes. Suppose each class contains at most one operation per thread, the class order respects real-time and per-thread order, and both the set-sequential and linked-LTS readings use the same pending-call completion. Let 𝑉𝗌𝖾𝗍 be the ordinary event-labelled LTS whose traces are exactly the invocation-then-response sequentializations admitted by those classes. Then (𝐻,𝜋) is accepted by the set-sequential specification if and only if the event trace of 𝐻 lies in 𝖪(𝑉𝗌𝖾𝗍) through a linked execution whose underlay trace is one of the sequentializations determined by 𝜋.
Proof of Theorem 87.9 — Restricted set specialization
Proof. From left to right, choose the invocation and response orders supplied by the set-sequential witness for each 𝐶𝑞={𝑜𝑞,1,…,𝑜𝑞,𝑟𝑞}. In 𝖪(𝑉𝗌𝖾𝗍), emit the overlay calls in their history order, take the individual event-labelled underlay call/return steps in the chosen class sequentialization, and then emit the corresponding overlay returns in their history order. Nonemptiness and the at-most-one-operation condition keep every thread state single-valued. Real-time and per-thread order show that concatenating these segments preserves 𝖲𝖾𝗊𝖢𝗈𝗇𝗌.
From right to left, use the stipulated underlay witness belonging to 𝜋. Its successive class sequentializations are traces of 𝑉𝗌𝖾𝗍; erase the identity-module brackets and read each segment back as 𝐶𝑞. The thread-state invariant and the hypotheses on 𝜋 give single-valued thread states, real-time order, and per-thread order. Apply the shared completion convention to pending final calls. This reconstructs an accepted set-sequential execution for the same fixed partition, rather than silently replacing 𝜋 by an existentially chosen grouping. ◻
Deleting the at-most-one-operation condition invalidates the reverse construction: one thread state cannot contain two active operations. Allowing an empty class invalidates the forward construction because it contributes no event-labelled underlay segment.
★★★ Apply theorem 87.9 to the two-operation exchanger class. Construct both directions explicitly. Then put two operations of thread 0 in the same class and identify the exact thread-state invariant that fails.
Interval-sequential specifications are different. An operation may influence several alternating invocation and response classes. A one-shot write-snapshot can therefore return a set reflecting an interval of overlap rather than one atomic or set transition. This chapter uses that example only under its one-shot and blocking assumptions; the restricted set theorem does not imply the interval result.
Suggested first pass.
None of these problems is a prerequisite. Begin with exercise 87.1 and exercise 87.3; for the practical sequence, complete stages 1–3 before the two composition checks.
★★★ Reconstruct both directions of locality for two one-bit registers over the same two-thread set and tagged operation signatures. Give the two trace projections, show that each preserves completion and per-thread order, and interleave the two linearized projections into a tensor trace. Use the shared active map to exclude overlapping left and right operations by one thread.
★★☆ Give a one-shot write-snapshot history in which one operation overlaps two others. Show that no atomic point yields its returned set, then write the three interval classes that do. Do not apply theorem 87.9: explain which single-class premise is absent.
★★★Practical project.compositional-lts-checker Implement in Kappa a parser for the supplied finite LTS fixtures and a breadth-first trace-inclusion checker. Maintain the invariant that the queue is ordered first by depth and then by thread, tag, and value. Stage 1 checks the atomic counter through depth 6; stage 2 reports the first four-event atomic-exchanger counterexample; stage 3 accepts the paired-set exchanger through depth 4; stage 4 implements horizontal composition; stage 5 checks two counters through depth 6. The exact summary lines are atomic-counter: PASS depth=6 (bounded), the four-event exchanger failure, exchanger-vs-paired-set: PASS depth=4 (bounded), and two-counter-horizontal: PASS depth=6 (bounded). Reversing the thread tie order must change the reported first counterexample and fail the canonical-trace test.
Sources. The identity-saturation definition and Theorems 4–6 are frozen to the LTS presentation of Hatti, Oliveira Vale, Wang, Feng, and Shao. The more general game-semantic account of Oliveira Vale, Shao, and Chen supplies provenance and the Karoubi construction, but no game-semantic theorem is silently transferred to the displayed LTS. Herlihy and Wing own the atomic history definition; Castañeda, Rajsbaum, and Raynal own the interval-sequential comparison. The restricted set theorem above is book-owned and has exactly the hypotheses stated in theorem 87.9. The theorem owners and comparison sources are [HOVW^+26, OVSC24, HW90, CRR15].