Prerequisites. Direct starred prerequisites: none. No later core chapter depends on this route.
A function type describes one call. A protocol type describes the whole conversation that follows from one channel endpoint. The distinction first appears when a client sends an argument, receives a result, and then reaches the terminal protocol: neither the argument type nor the result type records that order. This chapter fixes a finite, binary, intuitionistic linear session calculus whose proof theory does record it. A later, explicitly marked route studies graded non-linear communication in a different calculus. Results do not transfer between the two cards.
A finite logical session calculus
Session types are propositions of intuitionistic linear logic: 𝐴,𝐵::=𝟏∣𝐴⊗𝐵∣𝐴⊸𝐵∣𝐴⊕𝐵∣𝐴&𝐵∣!𝐴. The provider of 𝑧:𝐴 offers the behavior 𝐴 on 𝑧. The synchronous binary-choice pi-calculus has grammar 𝑃,𝑄::=𝟎∣𝑃∣𝑄∣(𝜈𝑥)𝑃∣𝑥⟨𝑦⟩.𝑃∣𝑥(𝑦).𝑃∣!𝑥(𝑦).𝑃∣𝑥.𝗂𝗇𝗅;𝑃∣𝑥.𝗂𝗇𝗋;𝑃∣𝑥.𝖼𝖺𝗌𝖾(𝑃,𝑄). A linear context Δ contains endpoints that it must use exactly once; an unrestricted context Γ contains replicated services. The judgment is Γ;Δ⊢𝑃::𝑧:𝐴. Names in Γ, Δ, and 𝑧 are pairwise disjoint. In the rules, (𝜈𝑥)(𝑃∣𝑄) abbreviates (𝜈𝑥)(𝑃∣𝑄), and (𝜈𝑦)𝑥⟨𝑦⟩.(𝑃∣𝑄) abbreviates (𝜈𝑦)𝑥⟨𝑦⟩.(𝑃∣𝑄). Thus 𝑃 provides the fresh channel 𝑦, while 𝑄 continues on 𝑥. These are typed abbreviations, not new process constructors.
The rules below fix the polarity of every constructor. Exchange is admissible for both contexts; contraction and weakening are admissible only for Γ.
Γ;⋅⊢𝟎::𝑧:𝟏
1R
Γ;Δ⊢𝑃::𝑧:𝐶
Γ;Δ,𝑥:𝟏⊢𝑃::𝑧:𝐶
1L
Γ;Δ1⊢𝑃::𝑦:𝐴Γ;Δ2⊢𝑄::𝑥:𝐵
Γ;Δ1,Δ2⊢(𝜈𝑦)𝑥⟨𝑦⟩.(𝑃∣𝑄)::𝑥:𝐴⊗𝐵
Γ;Δ,𝑦:𝐴,𝑥:𝐵⊢𝑃::𝑧:𝐶
Γ;Δ,𝑥:𝐴⊗𝐵⊢𝑥(𝑦).𝑃::𝑧:𝐶
Γ;Δ,𝑦:𝐴⊢𝑃::𝑥:𝐵
Γ;Δ⊢𝑥(𝑦).𝑃::𝑥:𝐴⊸𝐵
μltimapR
Γ;Δ1⊢𝑃::𝑦:𝐴Γ;Δ2,𝑥:𝐵⊢𝑄::𝑧:𝐶
Γ;Δ1,Δ2,𝑥:𝐴⊸𝐵⊢(𝜈𝑦)𝑥⟨𝑦⟩.(𝑃∣𝑄)::𝑧:𝐶
μltimapL
Γ;Δ1⊢𝑃::𝑥:𝐴Γ;Δ2,𝑥:𝐴⊢𝑄::𝑧:𝐶
Γ;Δ1,Δ2⊢(𝜈𝑥)(𝑃∣𝑄)::𝑧:𝐶
Cut
For 𝐴⊕𝐵, the provider selects and the client branches; for 𝐴&𝐵, the client selects and the provider branches. The full additive rule sheet is
Γ;Δ⊢𝑃::𝑥:𝐴
Γ;Δ⊢𝑥.𝗂𝗇𝗅;𝑃::𝑥:𝐴⊕𝐵
⊕R_1
Γ;Δ⊢𝑃::𝑥:𝐵
Γ;Δ⊢𝑥.𝗂𝗇𝗋;𝑃::𝑥:𝐴⊕𝐵
⊕R_2
Γ;Δ,𝑥:𝐴⊢𝑃::𝑧:𝐶Γ;Δ,𝑥:𝐵⊢𝑄::𝑧:𝐶
Γ;Δ,𝑥:𝐴⊕𝐵⊢𝑥.𝖼𝖺𝗌𝖾(𝑃,𝑄)::𝑧:𝐶
⊕L
Γ;Δ⊢𝑃::𝑥:𝐴Γ;Δ⊢𝑄::𝑥:𝐵
Γ;Δ⊢𝑥.𝖼𝖺𝗌𝖾(𝑃,𝑄)::𝑥:𝐴&𝐵
Γ;Δ,𝑥:𝐴⊢𝑃::𝑧:𝐶
Γ;Δ,𝑥:𝐴&𝐵⊢𝑥.𝗂𝗇𝗅;𝑃::𝑧:𝐶
_1
Γ;Δ,𝑥:𝐵⊢𝑃::𝑧:𝐶
Γ;Δ,𝑥:𝐴&𝐵⊢𝑥.𝗂𝗇𝗋;𝑃::𝑧:𝐶
_2
The exponential and persistent-cut rules are
Γ;⋅⊢𝑃::𝑦:𝐴
Γ;⋅⊢!𝑥(𝑦).𝑃::𝑥:!𝐴
!R
Γ,𝑢:𝐴;Δ⊢𝑃::𝑧:𝐶
Γ;Δ,𝑥:!𝐴⊢𝑃[𝑥/𝑢]::𝑧:𝐶
!L
Γ,𝑢:𝐴;Δ,𝑦:𝐴⊢𝑃::𝑧:𝐶
Γ,𝑢:𝐴;Δ⊢(𝜈𝑦)𝑢⟨𝑦⟩.𝑃::𝑧:𝐶
Copy
Γ;⋅⊢𝑃::𝑦:𝐴Γ,𝑢:𝐴;Δ⊢𝑄::𝑧:𝐶
Γ;Δ⊢(𝜈𝑢)(!𝑢(𝑦).𝑃∣𝑄)::𝑧:𝐶
Cut!
The replicated cut requires its provider to have no linear clients. This empty-context premise is the operational reason that copies do not duplicate linear endpoints.
The unit protocol already gives a complete interaction. Define 𝑅𝑥:=(𝜈𝑚)𝑥⟨𝑚⟩.(𝟎∣𝟎),𝑃𝑥:=𝑥(𝑛).𝑥.𝗂𝗇𝗅;𝑅𝑥,𝑄𝑥:=(𝜈𝑛)𝑥⟨𝑛⟩.(𝟎∣𝑥.𝖼𝖺𝗌𝖾(𝑥(𝑚).𝟎,𝟎)). Here 𝑃𝑥 provides 𝑥:𝟏⊸((𝟏⊗𝟏)⊕𝟏). The process 𝑄𝑥 consumes that channel and provides 𝑧:𝟏. Every channel of type 𝟏 is discharged by 1L, while the final 𝟎 is typed by 1R. Put 𝐴:=𝟏⊸((𝟏⊗𝟏)⊕𝟏). The complete derivation has the following spine; the displayed rule sheet determines the omitted nullary 1R leaves: ⋅;⋅⊢𝟎::𝑚:𝟏⋅;⋅⊢𝟎::𝑥:𝟏⋅;𝑛:𝟏⊢𝑅𝑥::𝑥:𝟏⊗𝟏⋅;𝑛:𝟏⊢𝑥.𝗂𝗇𝗅;𝑅𝑥::𝑥:(𝟏⊗𝟏)⊕𝟏⊕R1⋅;⋅⊢𝑃𝑥::𝑥:𝐴μltimapR⋅;⋅⊢𝟎::𝑛:𝟏⋅;𝑚:𝟏,𝑥:𝟏⊢𝟎::𝑧:𝟏⋅;𝑥:𝟏⊗𝟏⊢𝑥(𝑚).𝟎::𝑧:𝟏⋅;𝑥:𝟏⊢𝟎::𝑧:𝟏⋅;𝑥:(𝟏⊗𝟏)⊕𝟏⊢𝑥.𝖼𝖺𝗌𝖾(𝑥(𝑚).𝟎,𝟎)::𝑧:𝟏⊕L⋅;𝑥:𝐴⊢𝑄𝑥::𝑧:𝟏μltimapL⋅;⋅⊢(𝜈𝑥)(𝑃𝑥∣𝑄𝑥)::𝑧:𝟏Cut. Here uses of 1L discharge 𝑛,𝑚,𝑥:𝟏 in the indicated leaves. Principal reductions give (𝜈𝑥)(𝑃𝑥∣𝑄𝑥)⊸⇝0(𝜈𝑥)(𝑥.𝗂𝗇𝗅;𝑅𝑥∣𝑥.𝖼𝖺𝗌𝖾(𝑥(𝑚).𝟎,𝟎))⊕⇝0(𝜈𝑥)(𝑅𝑥∣𝑥(𝑚).𝟎)⊗,1⇝0𝟎. The interaction sends a request channel, selects the quotation branch, sends the result channel, and reaches inaction. No close or wait prefix has been silently added to the selected calculus.
★☆☆ Treat 𝖭𝖺𝗍 as a fixed closed protocol for one natural number. Give a type for a service that receives a natural number, sends either a quoted natural number or a refusal, and reaches 𝟏. Write the provider and client actions in order, from each endpoint’s point of view.
Principal cut reductions synchronize dual rule introductions. Representative cases are (𝜈𝑥)((𝜈𝑦)𝑥⟨𝑦⟩.(𝑃∣𝑄)∣𝑥(𝑦).𝑅)⇝0(𝜈𝑥)(𝑄∣(𝜈𝑦)(𝑃∣𝑅)),(𝜈𝑥)(𝑥.𝗂𝗇𝗅;𝑃∣𝑥.𝖼𝖺𝗌𝖾(𝑄1,𝑄2))⇝0(𝜈𝑥)(𝑃∣𝑄1),(𝜈𝑥)(𝟎∣𝑃)≡𝑃when𝑥∉fn(𝑃). Reduction is closed under restriction and parallel contexts, up to the structural congruence that reassociates and commutes independent cuts. Replicated cuts spawn one fresh linear instance per request and retain the shared server.
Proof of Theorem 58.1 — Type preservation for the selected calculus
Proof. Proceed by the reduction derivation. A principal step replaces a cut between the introduction rules for the same connective by cuts on its immediate subformulas. The displayed tensor step uses the two tensor premises and the client continuation, then applies Cut first at 𝑦:𝐴 and then at 𝑥:𝐵. The additive cases select an existing premise. The unit case is structural: 1L adds no process action and 1R contributes only inaction. The exponential case uses the empty linear context of !R; admissible renaming gives the fresh instance. Congruence cases rebuild the typing rule around the induction hypothesis. The persistent case uses Copy to spawn a fresh linear instance while retaining the replicated provider. It remains possible that the cut formula is not principal in one premise. Apply the corresponding commuting conversion to move the cut above that premise’s last rule; its derivation height decreases. The induction hypothesis then types the converted reduct, and the inverse commuting conversion restores the required process modulo structural congruence. This is why preservation is stated for reduction closed under structural congruence, rather than for the three principal contractions alone. ◻
Preservation says that a step respects the protocol. Progress needs an additional syntactic guard. Call 𝑃live when, up to structural congruence, 𝑃≡(𝜈̃𝑛)(𝜋.𝑄∣𝑅), where 𝜋.𝑄 is any nonreplicated guarded process: input, output, left or right selection, or branching. This excludes a process consisting only of replicated servers but includes the intermediate selection state in the worked interaction.
Proof of Theorem 58.2 — Closed progress for the selected calculus
Proof. Normalize the typing derivation by commuting cuts past rules that do not act on the cut channel. Two inversions provide the mechanism. First, if the last rule types a guarded prefix whose subject is 𝑎, then 𝑎 occurs in the typing interface with the connective introduced by that prefix. Second, a cut-free derivation of a non-live process has no nonreplicated guarded prefix. These are inductions on the displayed rule sheet; the additive cases inspect both premises and the exponential case is excluded by nonreplication.
Now suppose the normalized derivation is live. Its guard cannot be exposed at the external interface: the linear context is empty, and the offered channel has type 𝟏, whose only right rule is 1R and has no action. The guard is therefore below a cut. Normality makes that cut principal, so its two premises end in rules introducing the same connective on the cut channel. The matching principal contraction applies. This reconstructs the source’s action-inversion and non-live-derivation lemmas for the closed instance. ◻
The source theorem also has a contextual form: a typed live process either reduces internally or exposes a labelled action whose subject is in its interface; when that interface type is !𝐴, the subject is not the offered channel. Fixing the interface at empty Γ,Δ and 𝑥:𝟏 removes the second alternative: there is no contextual subject, and 𝟏 admits no labelled action on 𝑥[CPT11]. This is a genuine global deadlock-freedom result for this proof-shaped finite calculus. It is not a theorem about arbitrary binary session programs, several independently created sessions, asynchronous queues, fairness, or termination.
★★☆ Explain why preservation alone does not rule out a cycle in which two processes each wait first on a different session. Identify the premise of Theorem 58.2 that prevents using that cycle as a counterexample to the theorem.
The finite grammar cannot describe a server that handles arbitrarily many requests. For this section 𝑆,𝑇 range over the same linear protocol sort as 𝐴,𝐵, extended with variables and equi-recursive types: 𝑆,𝑇::=⋯∣𝑡∣𝜇𝑡.𝑆,𝜇𝑡.𝑆≡𝑆[𝜇𝑡.𝑆/𝑡]. A body is contractive when every occurrence of its bound variable lies strictly beneath a communication constructor—send, receive, internal choice, or external choice. In particular, 𝜇𝑡.𝑡 and 𝜇𝑡.𝜇𝑢.𝑡 are rejected. This chapter makes the additional tail-recursion restriction required by its syntactic duality: at a channel-send or channel-receive constructor, the transmitted session type is closed with respect to every surrounding recursion variable. Thus 𝜇𝑡.(𝐴⊗𝑡) is admitted when 𝑡∉fv(𝐴), whereas 𝜇𝑡.(𝑡⊗𝟏) is not. Recursive variables may still occur in continuations and choice branches.
Write 𝑆≃𝑇 for the greatest relation generated coinductively by matching outer constructors and the two unfolding clauses 𝑆[𝜇𝑡.𝑆/𝑡]≃𝑇𝜇𝑡.𝑆≃𝑇Eq−Unfold−L𝑆≃𝑇[𝜇𝑡.𝑇/𝑡]𝑆≃𝜇𝑡.𝑇Eq−Unfold−R. For example, the tensor congruence clause requires the same closed transmitted type and related continuations. The other four constructor clauses are defined by the same outer-constructor test. Add recursive conversion explicitly: Γ;Δ,𝑥:𝑆⊢𝑃::𝑧:𝐶𝑆≃𝑇Γ;Δ,𝑥:𝑇⊢𝑃::𝑧:𝐶T−Rec−Conv. This rule is the only way recursive equality enters typing.
The following syntactic duality is an auxiliary endpoint view; the intuitionistic judgment above itself assigns the same cut formula to provider and client. It is defined on the linear fragment, not on the unrestricted service constructor !𝐴: ――𝟏=𝟏――𝑡=𝑡,――――𝐴⊗𝑆=𝐴⊸――𝑆――――𝐴⊸𝑆=𝐴⊗――𝑆,――――𝑆⊕𝑇=――𝑆&――𝑇――――𝑆&𝑇=――𝑆⊕――𝑇,―――𝜇𝑡.𝑆=𝜇𝑡.――𝑆. On the contractive, tail-recursive fragment it satisfies ―――𝜇𝑡.𝑆=𝜇𝑡.――𝑆,――――𝑆=𝑆 up to recursive session equality. Contractiveness makes observation of the next communication productive; closed transmitted types make the displayed syntactic duality sound.
For contractive, tail-recursive 𝑆, unfolding either endpoint once preserves duality: ――――――𝑆[𝜇𝑡.𝑆/𝑡]≡――𝑆[𝜇𝑡.――𝑆/𝑡]. Moreover, T-Rec-Conv preserves one-step typing reduction: if its premise types 𝑃 and 𝑃⟶𝑄, then its conclusion types 𝑄.
Proof. First prove the displayed substitution equation by induction on the tail-recursive formation derivation. At send and receive, the recursion substitution does not enter the closed transmitted type; it enters only the continuation, where the induction hypothesis applies. Choice uses the hypothesis branchwise; variables and 𝟏 are immediate. Contractiveness ensures that coinductive comparison exposes one of these constructors after finitely many unfoldings.
For typing preservation, invert T-Rec-Conv. Apply theorem 58.1 to its premise and the same process step, then reapply T-Rec-Conv with the unchanged equality 𝑆≃𝑇. If the redex is a cut exposed only after unfolding, use the substitution equation to obtain matching outer constructors, take the finite principal step, and reapply conversion to the residual continuation. Thus the new case does not assume the desired result. ◻
Contractiveness alone is insufficient. For 𝑅=𝜇𝑡.(𝑡⊗𝟏), naively dualizing the recursive syntax gives a received payload ――𝑅, whereas dualizing the unfolding requires the unchanged payload 𝑅. The two need not be equal. The source proves naive syntactic duality sound only for tail-recursive types, meaning that every message type is closed. Arbitrary contractive session types require message closure or one of the paper’s corrected duality functions [GTV20]; neither is silently folded into this local extension.
★★☆ Define a contractive protocol that repeatedly offers either a natural-number request followed by a natural-number answer, or termination. Compute its dual and unfold both sides once.
The finite rules can prescribe the kind and order of messages, but the continuation type cannot depend on the value just received. Adding such a dependency requires index equality, substitution into protocols, and a decision about whether indices are erased or communicated. Those are new proof obligations, not decorations on the finite logical rules.
This section changes calculi. It follows the final journal system of Marshall and Orchard, where a linear channel can be promoted to a shared, replicated, multicast, or graded service [MO24b]. No theorem in this section is obtained by translating the finite logical calculus in section 58.1.
The operational state distinguishes typed terms, processes, and channel configurations. Write a channel configuration as 𝐶;Δ, with resource environment Δ. Before stating progress, define 𝖻𝗎𝖿𝖿𝖾𝗋𝖾𝖽(𝐶,Δ): every runtime channel 𝑐 assigned 𝖢𝗁𝖺𝗇(𝖱𝖾𝖼𝗏𝐴𝑃) by Δ contains at least one head value. The inductive clauses leave empty buffers available at 𝖤𝗇𝖽 and 𝖲𝖾𝗇𝖽-typed channels; all other structurally paired configuration clauses are discharged without a buffer-nonemptiness premise. The syntactic predicate 𝗋𝖾𝗌𝗈𝗎𝗋𝖼𝖾𝖠𝗅𝗅𝗈𝖼𝖺𝗍𝗈𝗋(𝑡) classifies terms whose reduction creates a channel, including reducible uses of the fork primitives. Graded promotion requires ¬𝗋𝖾𝗌𝗈𝗎𝗋𝖼𝖾𝖠𝗅𝗅𝗈𝖼𝖺𝗍𝗈𝗋(𝑡). A lambda containing a fork is not yet an allocator because evaluation does not proceed beneath lambdas.
Each non-linear primitive carries its own side conditions:
Shared service.
𝖿𝗈𝗋𝗄𝖭𝗈𝗇𝖫𝗂𝗇𝖾𝖺𝗋 requires 𝖲𝗂𝗇𝗀𝗅𝖾𝖠𝖼𝗍𝗂𝗈𝗇 and 𝖤𝗑𝖺𝖼𝗍𝖲𝖾𝗆𝗂𝗋𝗂𝗇𝗀. The latter excludes approximate grades. The journal’s surface presentation lists five shapes: 𝖤𝗇𝖽𝖲𝖾𝗇𝖽𝐴𝖤𝗇𝖽𝖱𝖾𝖼𝗏𝐴𝖤𝗇𝖽𝖮𝖿𝖿𝖾𝗋𝖤𝗇𝖽𝖤𝗇𝖽𝖲𝖾𝗅𝖾𝖼𝗍𝖤𝗇𝖽𝖤𝗇𝖽. The core runtime-context definition lists only the first three shapes, whereas the surface rules and implementation also admit the two choices. This chapter uses the five-shape surface predicate and records the discrepancy.
Repeated receive.
𝖿𝗈𝗋𝗄𝖱𝖾𝗉𝗅𝗂𝖼𝖺𝗍𝖾 requires 𝖱𝖾𝖼𝖾𝗂𝗏𝖾𝖯𝗋𝖾𝖿𝗂𝗑; the replicated body begins with a receive or an external offer rather than with an unrelated action.
Multicast.
𝖿𝗈𝗋𝗄𝖬𝗎𝗅𝗍𝗂𝖼𝖺𝗌𝗍 requires 𝖲𝖾𝗇𝖽𝗌(𝑃). Its channel type contains 𝖦𝗋𝖺𝖽𝖾𝖽𝑛𝑃, the recursively defined type function that grades every payload by 𝑛; 𝖦𝗋𝖺𝖽𝖾𝖽 is not a predicate or an additional premise.
Dropping these conditions can strand a client or allocate a different number of endpoints from the one recorded in the configuration type.
Use the final journal calculus. Its primitive rules require 𝖲𝗂𝗇𝗀𝗅𝖾𝖠𝖼𝗍𝗂𝗈𝗇 and 𝖤𝗑𝖺𝖼𝗍𝖲𝖾𝗆𝗂𝗋𝗂𝗇𝗀 for 𝖿𝗈𝗋𝗄𝖭𝗈𝗇𝖫𝗂𝗇𝖾𝖺𝗋, 𝖱𝖾𝖼𝖾𝗂𝗏𝖾𝖯𝗋𝖾𝖿𝗂𝗑 for 𝖿𝗈𝗋𝗄𝖱𝖾𝗉𝗅𝗂𝖼𝖺𝗍𝖾, and 𝖲𝖾𝗇𝖽𝗌 for 𝖿𝗈𝗋𝗄𝖬𝗎𝗅𝗍𝗂𝖼𝖺𝗌𝗍, whose input has type 𝖢𝗁𝖺𝗇(𝖦𝗋𝖺𝖽𝖾𝖽𝑛𝑃); a promotion body 𝑢 must satisfy ¬𝗋𝖾𝗌𝗈𝗎𝗋𝖼𝖾𝖠𝗅𝗅𝗈𝖼𝖺𝗍𝗈𝗋(𝑢).
If a term 𝑡:𝐴, process configuration 𝑃:𝐵, and channel configuration 𝐶 are well typed at runtime context Δ, and 𝖻𝗎𝖿𝖿𝖾𝗋𝖾𝖽(𝐶,Δ), then 𝑡 is a value or the whole configuration ((𝑃∣𝑡);𝐶) takes a global step, possibly changing all three parts.
If a process configuration 𝑃:𝐴 and channel configuration 𝐶 are well typed at Δ, and 𝖻𝗎𝖿𝖿𝖾𝗋𝖾𝖽(𝐶,Δ), then every process is a value, forwarder, or watcher, or (𝑃;𝐶) takes a global step.
If a well-typed process/channel configuration at runtime context Δ steps, then there exists a post-context Δ′ in which the reduct is well typed; the theorem does not assert Δ′=Δ.
Proof of Theorem 58.4 — Journal progress and preservation card
Imported proof. The first two clauses are respectively Theorems 1 and 2 on term and global progress in Appendix C of [MO24b]; the third is Theorem 3 on preservation, stated on physical PDF p. 21 and proved in Appendix D on physical PDF pp. 46–53. Their hypotheses mention typed terms, processes, channels, and bufferedness separately. Suppressing those distinctions produces a stronger and false slogan.
A small example ladder separates the primitives. A shared logger uses 𝖿𝗈𝗋𝗄𝖭𝗈𝗇𝖫𝗂𝗇𝖾𝖺𝗋 for any number of single-action clients. A pool of exactly 𝑘 workers additionally uses an exact natural grade and an allocator that partitions 𝑘. A multicast announcement uses 𝖿𝗈𝗋𝗄𝖬𝗎𝗅𝗍𝗂𝖼𝖺𝗌𝗍; its 𝖲𝖾𝗇𝖽𝗌 witness records that its protocol sends, while the type function 𝖦𝗋𝖺𝖽𝖾𝖽𝑛 marks every payload for 𝑛 recipients. These programs share notation, but their side-condition proofs are different.
The pinned 2022 Granule merge supplies an exact version map. Its examples/Sessions.gr contains the PLACES-era sendVec, recvVec, and graded reusable-channel example, while frontend/tests/cases/positive/testConstraintSessions.gr exercises forkNonLinear. In that snapshot its type requires SingleAction but omits the journal rule’s ExactSemiring; this is version evidence, not a derivation of the journal rule. No pinned example or test names forkReplicate or forkMulticast; the file named replicate.gr duplicates an ordinary graded value, not a session. Therefore only the earlier shared-channel fragment has exercising examples and tests in that snapshot, although the other primitives are implemented. The journal core additionally separates term, process, and channel configurations, states buffered progress, and introduces runtime forms and side conditions that the snapshot does not certify. The final article also leaves deadlock freedom as future work. We claim neither that conjecture nor an implementation correspondence with the journal calculus. ◻
★★★ For each of 𝖲𝗂𝗇𝗀𝗅𝖾𝖠𝖼𝗍𝗂𝗈𝗇, 𝖱𝖾𝖼𝖾𝗂𝗏𝖾𝖯𝗋𝖾𝖿𝗂𝗑, and 𝖲𝖾𝗇𝖽𝗌, describe one smallest process shape that violates it and the stuck or mistyped configuration that the condition excludes.
Binary session typing turns a protocol into a linear proof: cut elimination executes the conversation, preservation protects its shape, and the exact closed logical fragment proves progress. Recursive types add an explicitly contractive, tail-recursive observation principle. Graded non-linear communication changes the calculus and therefore changes the theorem hypotheses. Several roles and asynchronous queues require more than a single pair of dual endpoints.
Chapter seminar
The companion Kappa corpus at artifacts/ch58-session-protocols/ encodes finite action traces, pointwise action duality, and compatibility. Its empty trace marks type 𝟏; it is not a close or wait action. The acceptance matrix contains empty termination, tensor communication, both choices, a pre-unrolled request/answer trace, and a deliberately mismatched pair. The executable is a checker for these examples, not an implementation of the process calculus or a mechanization of either theorem card.
★★☆ Reconstruct the typing derivation for the tensor principal contraction in section 58.2. Identify the two smaller cut formulas and show that the external context is unchanged.
★★☆ Show that (𝜈𝑥)(𝑥.𝗂𝗇𝗅;𝑃∣𝑥.𝖼𝖺𝗌𝖾(𝑄1,𝑄2)) is live under the chapter’s definition even when neither 𝑃 nor 𝑄𝑖 begins with input or output. Then explain why the earlier, input/output-only definition would make the progress theorem unusable for this state.
★★☆ For 𝑆=𝜇𝑡.(𝟏⊸𝑡), unfold provider and endpoint-dual views once. Exhibit the use of T-Rec-Conv required before the next principal communication and state why tail recursion holds.
★★★Practical project.binary-session-protocol-checker Run the corpus, add one compatible and one incompatible pre-unrolled trace drawn from a tail-recursive protocol, and explain which outer dual constructors the checker compares at each step. State why this finite test is not a check of recursive duality.