diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,26 @@
+# Changelog for `gongju`
+
+All notable changes to the `gongju` package will be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
+and this project adheres to the Haskell Package Versioning Policy (PVP).
+
+## [0.1.0.0] — 2026-10-24
+
+### Added
+- **`Gongju.Peano`**: Inductive Peano type kind (`Peano`, `'Z`, `'S`), compile-time natural bridge (`ToPeano`, `FromPeano`), and reflection typeclasses.
+- **`Gongju.Composition`**: Variadic function composition (`compN @n`, `ComposeN`) and nested functor mapping (`fmapN @n`, `FmapN`) with bidirectional functional dependencies.
+- **`Gongju.Positional`**: In-place curried arrow combinators without heap allocation:
+  - `slipr @n` (`Yank`): Pull the $n$-th argument to position 0.
+  - `slipl @n` (`Shove`): Push argument 0 deeper to position $n$.
+  - `twist @n` (`Twist`): Swap adjacent arguments at depth $n$ and $n + 1$.
+- **`Gongju.Permute`**: Arbitrary curried function argument permutation (`permute @indices`, `Permute`) via iterated `Yank` and index adjustment (`Adjust`, `MapAdjust`), with full support for duplicate argument types.
+- **`Gongju.Indexed`**: Indexed monads, indexed applicatives, and indexed comonads (`IxFunctor`, `IxApplicative`, `IxMonad`, `IxComonad`).
+- **`Gongju.Comonad`**: Canonical comonad and distributive integrations (`Comonad`, `Distributive`, `Representable`, `W`, `PullDist`).
+- **`Gongju.Adjunction`**: Categorical adjunctions and dual pairing annihilation (`Adjunction`, `zapLR`, `zapRL`, `AdjU`, `AdjC`).
+- **`Gongju.Kan`**: Right and Left Kan extensions, Yoneda and Coyoneda $O(1)$ fusion, and Codensity CPS monad optimization (`Ran`, `Lan`, `Yoneda`, `Coyoneda`, `Codensity`, `Density`).
+- **`Gongju.Profunctor`**: Profunctor mapping grids (`dimap`, `lmap`, `rmap`), Curried category arrow permutation (`CurriedCat`, `yankCat`, `permuteCat`), right-nested tuple spine arrow permutations (`yankTuple`, `permuteTuple`), and profunctor strand input/output reordering (`permuteInputs`, `permuteOutputs`, `permuteHandler`).
+- **`Gongju.Contravariant`**: Contravariant syntax grids: positional pre-composition (`precomposeAt @n`, `(-.)`, `(-.*)`, `(-.**)`), 2D function splicing (`spliceAt @n @m`), and nested contravariant functor mapping with alternating parity (`contramapN @n`, `(<-$>)`, `(<-$$>)`, `(<-$$$>)`).
+- **`Gongju.Monad`**: Two-phase positional monadic binding (`bindPos @before @after`, `bindAt @n`, `(==<<)`, `(=.=<<)`, `(===<<)`), multi-slot monadic lifting masks (`liftMask @'[MArg, PArg, MArg]`), and arity-indexed Kleisli composition (`liftPureN @n`, `bindKleisliN @n`, `(<=<.)`, `(.>=>)`).
+- **`Gongju.Core`**: Top-level re-exports and Grand Unified Open-World Tape Engine (`withOps`, `(.@)`).
+- **Core Inspection Test Suite**: Automated verification harness ensuring zero residual dictionaries and complete inlining under GHC `-O2`.
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,189 @@
+EUROPEAN UNION PUBLIC LICENCE v. 1.2
+EUPL © the European Union 2007, 2016
+
+This European Union Public Licence (the ‘EUPL’) applies to the Work (as defined below) which is provided under the
+terms of this Licence. Any use of the Work, other than as authorised under this Licence is prohibited (to the extent such
+use is covered by a right of the copyright holder of the Work).
+The Work is provided under the terms of this Licence when the Licensor (as defined below) has placed the following
+notice immediately following the copyright notice for the Work:
+                          Licensed under the EUPL
+or has expressed by any other means his willingness to license under the EUPL.
+
+1.Definitions
+In this Licence, the following terms have the following meaning:
+— ‘The Licence’:this Licence.
+— ‘The Original Work’:the work or software distributed or communicated by the Licensor under this Licence, available
+as Source Code and also as Executable Code as the case may be.
+— ‘Derivative Works’:the works or software that could be created by the Licensee, based upon the Original Work or
+modifications thereof. This Licence does not define the extent of modification or dependence on the Original Work
+required in order to classify a work as a Derivative Work; this extent is determined by copyright law applicable in
+the country mentioned in Article 15.
+— ‘The Work’:the Original Work or its Derivative Works.
+— ‘The Source Code’:the human-readable form of the Work which is the most convenient for people to study and
+modify.
+— ‘The Executable Code’:any code which has generally been compiled and which is meant to be interpreted by
+a computer as a program.
+— ‘The Licensor’:the natural or legal person that distributes or communicates the Work under the Licence.
+— ‘Contributor(s)’:any natural or legal person who modifies the Work under the Licence, or otherwise contributes to
+the creation of a Derivative Work.
+— ‘The Licensee’ or ‘You’:any natural or legal person who makes any usage of the Work under the terms of the
+Licence.
+— ‘Distribution’ or ‘Communication’:any act of selling, giving, lending, renting, distributing, communicating,
+transmitting, or otherwise making available, online or offline, copies of the Work or providing access to its essential
+functionalities at the disposal of any other natural or legal person.
+
+2.Scope of the rights granted by the Licence
+The Licensor hereby grants You a worldwide, royalty-free, non-exclusive, sublicensable licence to do the following, for
+the duration of copyright vested in the Original Work:
+— use the Work in any circumstance and for all usage,
+— reproduce the Work,
+— modify the Work, and make Derivative Works based upon the Work,
+— communicate to the public, including the right to make available or display the Work or copies thereof to the public
+and perform publicly, as the case may be, the Work,
+— distribute the Work or copies thereof,
+— lend and rent the Work or copies thereof,
+— sublicense rights in the Work or copies thereof.
+Those rights can be exercised on any media, supports and formats, whether now known or later invented, as far as the
+applicable law permits so.
+In the countries where moral rights apply, the Licensor waives his right to exercise his moral right to the extent allowed
+by law in order to make effective the licence of the economic rights here above listed.
+The Licensor grants to the Licensee royalty-free, non-exclusive usage rights to any patents held by the Licensor, to the
+extent necessary to make use of the rights granted on the Work under this Licence.
+
+3.Communication of the Source Code
+The Licensor may provide the Work either in its Source Code form, or as Executable Code. If the Work is provided as
+Executable Code, the Licensor provides in addition a machine-readable copy of the Source Code of the Work along with
+each copy of the Work that the Licensor distributes or indicates, in a notice following the copyright notice attached to
+the Work, a repository where the Source Code is easily and freely accessible for as long as the Licensor continues to
+distribute or communicate the Work.
+
+4.Limitations on copyright
+Nothing in this Licence is intended to deprive the Licensee of the benefits from any exception or limitation to the
+exclusive rights of the rights owners in the Work, of the exhaustion of those rights or of other applicable limitations
+thereto.
+
+5.Obligations of the Licensee
+The grant of the rights mentioned above is subject to some restrictions and obligations imposed on the Licensee. Those
+obligations are the following:
+
+Attribution right: The Licensee shall keep intact all copyright, patent or trademarks notices and all notices that refer to
+the Licence and to the disclaimer of warranties. The Licensee must include a copy of such notices and a copy of the
+Licence with every copy of the Work he/she distributes or communicates. The Licensee must cause any Derivative Work
+to carry prominent notices stating that the Work has been modified and the date of modification.
+
+Copyleft clause: If the Licensee distributes or communicates copies of the Original Works or Derivative Works, this
+Distribution or Communication will be done under the terms of this Licence or of a later version of this Licence unless
+the Original Work is expressly distributed only under this version of the Licence — for example by communicating
+‘EUPL v. 1.2 only’. The Licensee (becoming Licensor) cannot offer or impose any additional terms or conditions on the
+Work or Derivative Work that alter or restrict the terms of the Licence.
+
+Compatibility clause: If the Licensee Distributes or Communicates Derivative Works or copies thereof based upon both
+the Work and another work licensed under a Compatible Licence, this Distribution or Communication can be done
+under the terms of this Compatible Licence. For the sake of this clause, ‘Compatible Licence’ refers to the licences listed
+in the appendix attached to this Licence. Should the Licensee's obligations under the Compatible Licence conflict with
+his/her obligations under this Licence, the obligations of the Compatible Licence shall prevail.
+
+Provision of Source Code: When distributing or communicating copies of the Work, the Licensee will provide
+a machine-readable copy of the Source Code or indicate a repository where this Source will be easily and freely available
+for as long as the Licensee continues to distribute or communicate the Work.
+Legal Protection: This Licence does not grant permission to use the trade names, trademarks, service marks, or names
+of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and
+reproducing the content of the copyright notice.
+
+6.Chain of Authorship
+The original Licensor warrants that the copyright in the Original Work granted hereunder is owned by him/her or
+licensed to him/her and that he/she has the power and authority to grant the Licence.
+Each Contributor warrants that the copyright in the modifications he/she brings to the Work are owned by him/her or
+licensed to him/her and that he/she has the power and authority to grant the Licence.
+Each time You accept the Licence, the original Licensor and subsequent Contributors grant You a licence to their contributions
+to the Work, under the terms of this Licence.
+
+7.Disclaimer of Warranty
+The Work is a work in progress, which is continuously improved by numerous Contributors. It is not a finished work
+and may therefore contain defects or ‘bugs’ inherent to this type of development.
+For the above reason, the Work is provided under the Licence on an ‘as is’ basis and without warranties of any kind
+concerning the Work, including without limitation merchantability, fitness for a particular purpose, absence of defects or
+errors, accuracy, non-infringement of intellectual property rights other than copyright as stated in Article 6 of this
+Licence.
+This disclaimer of warranty is an essential part of the Licence and a condition for the grant of any rights to the Work.
+
+8.Disclaimer of Liability
+Except in the cases of wilful misconduct or damages directly caused to natural persons, the Licensor will in no event be
+liable for any direct or indirect, material or moral, damages of any kind, arising out of the Licence or of the use of the
+Work, including without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, loss
+of data or any commercial damage, even if the Licensor has been advised of the possibility of such damage. However,
+the Licensor will be liable under statutory product liability laws as far such laws apply to the Work.
+
+9.Additional agreements
+While distributing the Work, You may choose to conclude an additional agreement, defining obligations or services
+consistent with this Licence. However, if accepting obligations, You may act only on your own behalf and on your sole
+responsibility, not on behalf of the original Licensor or any other Contributor, and only if You agree to indemnify,
+defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against such Contributor by
+the fact You have accepted any warranty or additional liability.
+
+10.Acceptance of the Licence
+The provisions of this Licence can be accepted by clicking on an icon ‘I agree’ placed under the bottom of a window
+displaying the text of this Licence or by affirming consent in any other similar way, in accordance with the rules of
+applicable law. Clicking on that icon indicates your clear and irrevocable acceptance of this Licence and all of its terms
+and conditions.
+Similarly, you irrevocably accept this Licence and all of its terms and conditions by exercising any rights granted to You
+by Article 2 of this Licence, such as the use of the Work, the creation by You of a Derivative Work or the Distribution
+or Communication by You of the Work or copies thereof.
+
+11.Information to the public
+In case of any Distribution or Communication of the Work by means of electronic communication by You (for example,
+by offering to download the Work from a remote location) the distribution channel or media (for example, a website)
+must at least provide to the public the information requested by the applicable law regarding the Licensor, the Licence
+and the way it may be accessible, concluded, stored and reproduced by the Licensee.
+
+12.Termination of the Licence
+The Licence and the rights granted hereunder will terminate automatically upon any breach by the Licensee of the terms
+of the Licence.
+Such a termination will not terminate the licences of any person who has received the Work from the Licensee under
+the Licence, provided such persons remain in full compliance with the Licence.
+
+13.Miscellaneous
+Without prejudice of Article 9 above, the Licence represents the complete agreement between the Parties as to the
+Work.
+If any provision of the Licence is invalid or unenforceable under applicable law, this will not affect the validity or
+enforceability of the Licence as a whole. Such provision will be construed or reformed so as necessary to make it valid
+and enforceable.
+The European Commission may publish other linguistic versions or new versions of this Licence or updated versions of
+the Appendix, so far this is required and reasonable, without reducing the scope of the rights granted by the Licence.
+New versions of the Licence will be published with a unique version number.
+All linguistic versions of this Licence, approved by the European Commission, have identical value. Parties can take
+advantage of the linguistic version of their choice.
+
+14.Jurisdiction
+Without prejudice to specific agreement between parties,
+— any litigation resulting from the interpretation of this License, arising between the European Union institutions,
+bodies, offices or agencies, as a Licensor, and any Licensee, will be subject to the jurisdiction of the Court of Justice
+of the European Union, as laid down in article 272 of the Treaty on the Functioning of the European Union,
+— any litigation arising between other parties and resulting from the interpretation of this License, will be subject to
+the exclusive jurisdiction of the competent court where the Licensor resides or conducts its primary business.
+
+15.Applicable Law
+Without prejudice to specific agreement between parties,
+— this Licence shall be governed by the law of the European Union Member State where the Licensor has his seat,
+resides or has his registered office,
+— this licence shall be governed by Belgian law if the Licensor has no seat, residence or registered office inside
+a European Union Member State.
+
+Appendix
+
+‘Compatible Licences’ according to Article 5 EUPL are:
+— GNU General Public License (GPL) v. 2, v. 3
+— GNU Affero General Public License (AGPL) v. 3
+— Open Software License (OSL) v. 2.1, v. 3.0
+— Eclipse Public License (EPL) v. 1.0
+— CeCILL v. 2.0, v. 2.1
+— Mozilla Public Licence (MPL) v. 2
+— GNU Lesser General Public Licence (LGPL) v. 2.1, v. 3
+— Creative Commons Attribution-ShareAlike v. 3.0 Unported (CC BY-SA 3.0) for works other than software
+— European Union Public Licence (EUPL) v. 1.1, v. 1.2
+— Québec Free and Open-Source Licence — Reciprocity (LiLiQ-R) or Strong Reciprocity (LiLiQ-R+).
+
+The European Commission may update this Appendix to later versions of the above licences without producing
+a new version of the EUPL, as long as they provide the rights granted in Article 2 of this Licence and protect the
+covered Source Code from exclusive appropriation.
+All other changes or additions to this Appendix require the production of a new EUPL version.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,62 @@
+# gongju
+
+**Pure type-level utility functions, arity composition, and positional combinators for Haskell.**
+
+`gongju` (공구 / 工具, tools/implement) replaces Template Haskell arity generation (like `composition-extra`) and tuple generics (like `tuple-sop`) with pure type-level Peano induction, bidirectional functional dependencies, and type-safe argument permutations.
+
+---
+
+## Key Modules
+
+- **[`Gongju.Core`](src/Gongju/Core.hs)** — Re-exports all core modules and the Grand Unified Open-World Tape Engine (`withOps`, `(.@)`).
+- **[`Gongju.Peano`](src/Gongju/Peano.hs)** — Type-level Peano numbers (`'Z`, `'S`), compile-time natural conversion (`ToPeano`, `FromPeano`), and reflection typeclasses.
+- **[`Gongju.Composition`](src/Gongju/Composition.hs)** — Variadic function composition (`compN @n`, `ComposeN`) and nested functor mapping (`fmapN @n`, `FmapN`) with bidirectional functional dependencies.
+- **[`Gongju.Positional`](src/Gongju/Positional.hs)** — In-place curried arrow combinators without heap allocation:
+  - `slipr @n` (`Yank`): Pull the $n$-th argument to position 0.
+  - `slipl @n` (`Shove`): Push argument 0 deeper to position $n$.
+  - `twist @n` (`Twist`): Swap adjacent arguments at depth $n$ and $n + 1$.
+- **[`Gongju.Permute`](src/Gongju/Permute.hs)** — Arbitrary argument permutation (`permute @'[2, 0, 1]`, `Permute`) with full disambiguation of duplicate argument types.
+- **[`Gongju.Indexed`](src/Gongju/Indexed.hs)** — Indexed monads, indexed applicatives, and indexed comonads (`IxFunctor`, `IxApplicative`, `IxMonad`, `IxComonad`).
+- **[`Gongju.Comonad`](src/Gongju/Comonad.hs)** — Integrations with `comonad` and `distributive` (`W`, `PullDist`, `Representable`).
+- **[`Gongju.Adjunction`](src/Gongju/Adjunction.hs)** — Categorical adjunctions and dual pairing annihilation (`zapLR`, `zapRL`, `AdjU`, `AdjC`).
+- **[`Gongju.Kan`](src/Gongju/Kan.hs)** — Kan extensions, Yoneda and Coyoneda $O(1)$ fusion, and Codensity CPS monad optimization (`Ran`, `Lan`, `Yoneda`, `Codensity`).
+- **[`Gongju.Profunctor`](src/Gongju/Profunctor.hs)** — Profunctor mapping grids (`dimap`), Curried category arrow permutation (`CurriedCat`, `yankCat`, `permuteCat`), right-nested tuple spine arrow permutations (`yankTuple`, `permuteTuple`), and profunctor strand input/output reordering (`permuteInputs`, `permuteOutputs`, `permuteHandler`).
+- **[`Gongju.Contravariant`](src/Gongju/Contravariant.hs)** — Contravariant syntax grids: positional pre-composition (`precomposeAt @n`, `(-.)`, `(-.*)`), 2D function splicing (`spliceAt @n @m`), and nested contravariant functor mapping with alternating parity (`contramapN @n`, `(<-$>)`, `(<-$$>)`).
+- **[`Gongju.Monad`](src/Gongju/Monad.hs)** — Two-phase positional monadic binding (`bindPos @before @after`, `bindAt @n`, `(==<<)`, `(=.=<<)`), multi-slot monadic lifting masks (`liftMask @'[MArg, PArg, MArg]`), and arity-indexed Kleisli composition (`liftPureN @n`, `bindKleisliN @n`, `(<=<.)`, `(.>=>)`).
+
+---
+
+## Quick Start
+
+```haskell
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE TypeApplications #-}
+
+import Gongju.Core
+
+main :: IO ()
+main = do
+  -- 1. Variadic composition over a 3-argument function:
+  let add3 x y z = (x + y + z :: Int)
+  print (compN @3 (* 2) add3 1 2 3) -- Prints 12
+
+  -- 2. Permuting arguments of a function:
+  let f x y z = (x, y, z)
+  print (permute @'[2, 0, 1] f True 10 "gongju") -- Prints (10, "gongju", True)
+
+  -- 3. Tape-driven composition:
+  let comp = ((+ 1) .@ [P, P]) (+)
+  print (comp 5 10) -- Prints 16
+```
+
+---
+
+## Zero-Cost Guarantee
+
+Under GHC `-O2`, all combinators inline and simplify into primitive lambda applications with zero residual typeclass dictionaries, verified mechanically by `bin/gongju-inspect-core`.
+
+---
+
+## License
+
+Licensed under the European Union Public Licence (EUPL-1.2) or Apache License 2.0.
diff --git a/gongju.cabal b/gongju.cabal
new file mode 100644
--- /dev/null
+++ b/gongju.cabal
@@ -0,0 +1,85 @@
+cabal-version:      3.0
+name:               gongju
+version:            0.1.0.0
+synopsis:           Pure type-level utility functions, arity composition, and curried combinators
+description:
+    Gongju (공구 / 工具, tools/implement) provides inductive Peano type-level
+    utility functions in pure Haskell, replacing Template Haskell arity splices
+    (e.g. composition-extra) and finite tuple generics (e.g. tuple-sop) with
+    zero-overhead typeclass induction, bidirectional functional dependencies,
+    and TypeApplications-friendly GHC.TypeLits.Nat wrappers.
+
+license:            EUPL-1.2 OR Apache-2.0
+license-files:      LICENSE
+author:             Nadia Yvette Chambers
+maintainer:         nadia.yvette.chambers@ik.me
+homepage:           https://github.com/NadiaYvette/gongju
+bug-reports:        https://github.com/NadiaYvette/gongju/issues
+category:           Types, Functional, Combinators
+build-type:         Simple
+extra-doc-files:
+    README.md
+  , CHANGELOG.md
+  , LICENSE
+
+tested-with:
+    GHC == 9.10.3
+  , GHC == 9.12.4
+  , GHC == 9.14.1
+
+source-repository head
+    type:     git
+    location: https://github.com/NadiaYvette/gongju.git
+    subdir:   packages/gongju
+
+common commons
+    default-language:   Haskell2010
+    ghc-options:
+        -Wall
+        -Wcompat
+        -Wredundant-constraints
+
+library
+    import:             commons
+    hs-source-dirs:     src
+    exposed-modules:
+        Gongju.Core
+        Gongju.Peano
+        Gongju.Composition
+        Gongju.Positional
+        Gongju.Permute
+        Gongju.Indexed
+        Gongju.Comonad
+        Gongju.Adjunction
+        Gongju.Kan
+        Gongju.Profunctor
+        Gongju.Contravariant
+        Gongju.Monad
+    build-depends:
+        base              >= 4.20 && < 5
+      , adjunctions       >= 4.4   && < 5
+      , comonad           >= 5     && < 6
+      , distributive      >= 0.6   && < 1
+      , indexed           >= 0.1   && < 1
+      , indexed-profunctors >= 0.1 && < 1
+      , kan-extensions    >= 5.2   && < 6
+      , profunctors       >= 5.6   && < 6
+      , contravariant     >= 1.5   && < 2
+
+test-suite gongju-test
+    import:             commons
+    type:               exitcode-stdio-1.0
+    hs-source-dirs:     test
+    main-is:            Main.hs
+    other-modules:      CoreInspection
+    build-depends:
+        base              >= 4.20 && < 5
+      , adjunctions       >= 4.4   && < 5
+      , comonad           >= 5     && < 6
+      , contravariant     >= 1.5   && < 2
+      , distributive      >= 0.6   && < 1
+      , gongju
+      , hspec             >= 2.11  && < 3
+      , indexed           >= 0.1   && < 1
+      , kan-extensions    >= 5.2   && < 6
+      , profunctors       >= 5.6   && < 6
diff --git a/src/Gongju/Adjunction.hs b/src/Gongju/Adjunction.hs
new file mode 100644
--- /dev/null
+++ b/src/Gongju/Adjunction.hs
@@ -0,0 +1,173 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE UndecidableSuperClasses #-}
+
+-- | Module: Gongju.Adjunction
+-- Description: Adjunction transitions and dual-functor annihilation for Gongju
+--
+-- Plugs functor adjunctions ('Adjunction', @l ⊣ r@) from 'Data.Functor.Adjunction'
+-- into Gongju's open tape composition engine without modifying Core.
+--
+-- Provides:
+-- * Adjunction unit (@η : Id ⇒ R ∘ L@) and counit (@ε : L ∘ R ⇒ Id@) stack rewrites.
+-- * Day-adjoint pairing ('zapLR', 'zapRL') that annihilates dual adjoint functor
+--   contexts (1 + 1 → 0 active layers).
+-- * Hom-set adjunct lifting ('leftAdjunct', 'rightAdjunct').
+module Gongju.Adjunction
+  ( -- * Re-exported Canonical Adjunction Class
+    Adjunction(..)
+  , zapWithAdjunction
+  , indexAdjunction
+  , tabulateAdjunction
+    -- * Dual Annihilation Workers
+  , zapLR
+  , zapRL
+    -- * Open Adjunction Tags
+  , PAdjU
+  , PAdjC
+  , PZapLR
+  , PZapRL
+  , PAdjL
+    -- * Ergonomic Aliases
+  , AdjU
+  , AdjC
+  , ZapLR
+  , ZapRL
+  , AdjL
+  ) where
+
+import Data.Functor.Adjunction
+  ( Adjunction (..)
+  , indexAdjunction
+  , tabulateAdjunction
+  , zapWithAdjunction
+  )
+import Gongju.Composition
+  ( F
+  , InOrder
+  , MapPath (..)
+  , StepPathMask (..)
+  , StepRole (..)
+  )
+import Gongju.Peano (Append, Init)
+
+-- ---------------------------------------------------------------------------
+-- 1. Dual Adjoint Pairing Workers
+-- ---------------------------------------------------------------------------
+
+-- | Annihilate left adjoint context @l (a -> b)@ and right adjoint context @r a@ into @b@.
+zapLR :: Adjunction l r => l (a -> b) -> r a -> b
+zapLR lab ra = counit (fmap (<$> ra) lab)
+{-# INLINE zapLR #-}
+
+-- | Dual annihilation: @r (a -> b)@ and @l a@ into @b@.
+zapRL :: Adjunction l r => r (a -> b) -> l a -> b
+zapRL rab la = counit (fmap (\a -> fmap ($ a) rab) la)
+{-# INLINE zapRL #-}
+
+-- ---------------------------------------------------------------------------
+-- 2. Open Mode Tags & Aliases
+-- ---------------------------------------------------------------------------
+
+-- | Tag for inserting an adjunction unit: @a -> r (l a)@.
+data PAdjU
+
+-- | Tag for applying an adjunction counit: @l (r a) -> a@.
+data PAdjC
+
+-- | Tag for pairing active left-adjoint @l (a -> b)@ against caller @r a@ (annihilating both).
+data PZapLR
+
+-- | Tag for pairing active right-adjoint @r (a -> b)@ against caller @l a@ (annihilating both).
+data PZapRL
+
+-- | Tag for applying 'leftAdjunct': turns expectation of @l a@ into caller passing pure @a@.
+data PAdjL
+
+-- | In-order adjunction unit alias.
+type AdjU = InOrder PAdjU
+
+-- | In-order adjunction counit alias.
+type AdjC = InOrder PAdjC
+
+-- | In-order Day-adjoint pairing alias (left active, right caller).
+type ZapLR = InOrder PZapLR
+
+-- | In-order Day-adjoint pairing alias (right active, left caller).
+type ZapRL = InOrder PZapRL
+
+-- | In-order hom-set adjunct alias.
+type AdjL = InOrder PAdjL
+
+-- ---------------------------------------------------------------------------
+-- 3. StepRole Instances (Adjunction Transitions)
+-- ---------------------------------------------------------------------------
+
+-- | Adjunction unit: expands inner tip to @r (l inner)@.
+instance forall base active ms m t3 acc acc' out l r inner.
+  ( Adjunction l r
+  , MapPath (Init active) inner (r (l inner)) acc acc'
+  , StepPathMask base (Append active '[ F, F ]) ms m t3 acc' out
+  ) => StepRole PAdjU base active ms m t3 acc out where
+  stepRole f acc =
+    stepPathMask @base @(Append active '[ F, F ]) @ms @m @t3 @acc' @out f
+      (mapPath @(Init active) @inner @(r (l inner)) unit acc)
+  {-# INLINE stepRole #-}
+
+-- | Adjunction counit: collapses @l (r inner)@ at the tip down to @inner@.
+instance forall base active ms m t3 acc acc' out l r inner.
+  ( Adjunction l r
+  , MapPath (Init (Init active)) (l (r inner)) inner acc acc'
+  , StepPathMask base (Init (Init active)) ms m t3 acc' out
+  ) => StepRole PAdjC base active ms m t3 acc out where
+  stepRole f acc =
+    stepPathMask @base @(Init (Init active)) @ms @m @t3 @acc' @out f
+      (mapPath @(Init (Init active)) @(l (r inner)) @inner counit acc)
+  {-# INLINE stepRole #-}
+
+-- | ZapLR: Annihilates active left-adjoint layer with caller right-adjoint argument.
+instance forall base active ms m t3 acc acc' out' l r a rem ra.
+  ( Adjunction l r
+  , ra ~ r a
+  , MapPath (Init active) (l (a -> rem)) rem acc acc'
+  , StepPathMask base (Init active) ms m t3 acc' out'
+  ) => StepRole PZapLR base active ms m t3 acc (ra -> out') where
+  stepRole f acc ra =
+    stepPathMask @base @(Init active) @ms @m @t3 @acc' @out' f
+      (mapPath @(Init active) @(l (a -> rem)) @rem (`zapLR` ra) acc)
+  {-# INLINE stepRole #-}
+
+-- | ZapRL: Annihilates active right-adjoint layer with caller left-adjoint argument.
+instance forall base active ms m t3 acc acc' out' l r a rem la.
+  ( Adjunction l r
+  , la ~ l a
+  , MapPath (Init active) (r (a -> rem)) rem acc acc'
+  , StepPathMask base (Init active) ms m t3 acc' out'
+  ) => StepRole PZapRL base active ms m t3 acc (la -> out') where
+  stepRole f acc la =
+    stepPathMask @base @(Init active) @ms @m @t3 @acc' @out' f
+      (mapPath @(Init active) @(r (a -> rem)) @rem (`zapRL` la) acc)
+  {-# INLINE stepRole #-}
+
+-- | AdjL: Turns @l a -> rem@ in the accumulator into @a -> r rem@.
+instance forall base active ms m t3 acc acc' out' l r a rem.
+  ( Adjunction l r
+  , MapPath active (l a -> rem) (r rem) acc acc'
+  , StepPathMask base (Append active '[ F ]) ms m t3 acc' out'
+  ) => StepRole PAdjL base active ms m t3 acc (a -> out') where
+  stepRole f acc a =
+    stepPathMask @base @(Append active '[ F ]) @ms @m @t3 @acc' @out' f
+      (mapPath @active @(l a -> rem) @(r rem) (`leftAdjunct` a) acc)
+  {-# INLINE stepRole #-}
diff --git a/src/Gongju/Comonad.hs b/src/Gongju/Comonad.hs
new file mode 100644
--- /dev/null
+++ b/src/Gongju/Comonad.hs
@@ -0,0 +1,149 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE UndecidableSuperClasses #-}
+
+-- | Module: Gongju.Comonad
+-- Description: Comonads, Distributive, and Representable Functors for Gongju
+--
+-- Plugs comonadic and distributive functor structures ('Comonad', 'Distributive',
+-- 'Representable') into Gongju's open tape composition engine without modifying Core.
+-- Allows non-Traversable comonads (such as Streams or Store) to commute with
+-- Representable functors via distributive laws.
+module Gongju.Comonad
+  ( -- * Categorical Classes
+    Comonad(..)
+  , Distributive(..)
+  , Representable(..)
+    -- * Open Tags
+  , PW
+  , PWL
+  , Dup
+  , Ex
+  , Dist
+    -- * Ergonomic Aliases
+  , W
+  , WL
+  , PullDist
+  ) where
+
+import Control.Comonad (Comonad (..))
+import Data.Distributive (Distributive (..))
+import Data.Functor.Rep (Representable (..))
+import Gongju.Composition
+  ( ApPath (..)
+  , ApStep (..)
+  , CommutePair (..)
+  , F
+  , InOrder
+  , MapPath (..)
+  , MapStep (..)
+  , PullRet
+  , StepPathMask (..)
+  , StepRole (..)
+  )
+import Gongju.Peano (Append, Init)
+import Gongju.Positional (ExpectArrow)
+
+-- ---------------------------------------------------------------------------
+-- 2. Open Mode & Layer Tags
+-- ---------------------------------------------------------------------------
+
+-- | Tag for lockstep Cokleisli argument consumption ('extend' / 'duplicate').
+data PW
+
+-- | Tag for layered Cokleisli argument consumption ('extend' adds an active layer).
+data PWL
+
+-- | Tag for Comonad context duplication ('duplicate').
+data Dup
+
+-- | Tag for Comonad focal value extraction ('extract').
+data Ex
+
+-- | Tag for Distributive and Representable functor layers.
+data Dist
+
+-- | In-order unindexed comonadic cokleisli alias.
+type W = InOrder PW
+
+-- | In-order unindexed layered comonadic cokleisli alias.
+type WL = InOrder PWL
+
+-- | Commute a 'Dist' layer outward past all active layers.
+type PullDist = PullRet '[Dist]
+
+-- ---------------------------------------------------------------------------
+-- 3. Mapping, Zipping, and Commuting Instances
+-- ---------------------------------------------------------------------------
+
+instance (Distributive g, s ~ g s', t ~ g t', MapPath ls a b s' t')
+  => MapStep Dist ls a b s t where
+  mapStep f = fmap (mapPath @ls f)
+  {-# INLINE mapStep #-}
+
+instance (Representable g, fab ~ g fab', fa ~ g fa', fb ~ g fb', ApPath ls fab' fa' fb')
+  => ApStep Dist ls fab fa fb where
+  apStep fab fa = tabulate (\i -> apPath @ls (index fab i) (index fa i))
+  {-# INLINE apStep #-}
+
+-- | Right-driven Distributive law: commutes 'Dist' outside ANY 'Functor φ'.
+instance (Functor φ, Distributive g, s ~ φ (g inner), t ~ g (φ inner))
+  => CommutePair F Dist s t where
+  commutePair = distribute
+  {-# INLINE commutePair #-}
+
+instance (Traversable g, Applicative φ, s ~ g (φ inner), t ~ φ (g inner))
+  => CommutePair Dist F s t where
+  commutePair = sequenceA
+  {-# INLINE commutePair #-}
+
+-- ---------------------------------------------------------------------------
+-- 4. StepRole Instances (Comonad Transitions)
+-- ---------------------------------------------------------------------------
+
+instance (Comonad φ, ExpectArrow "StepRole PW" acc (φ a) rTail, wa ~ φ a, StepPathMask base '[ F ] ms m t3 (φ rTail) out')
+  => StepRole PW base '[] ms m t3 acc (wa -> out') where
+  stepRole f acc wa = stepPathMask @base @'[ F ] @ms f (extend acc wa)
+  {-# INLINE stepRole #-}
+
+instance forall base active ms m t3 acc acc' out' φ a rTail wa.
+  ( Comonad φ, wa ~ φ a
+  , MapPath active (φ a -> rTail) (φ rTail) acc acc'
+  , StepPathMask base (Append active '[ F ]) ms m t3 acc' out'
+  ) => StepRole PWL base active ms m t3 acc (wa -> out') where
+  stepRole f acc wa =
+    stepPathMask @base @(Append active '[ F ]) @ms @m @t3 @acc' @out' f
+      (mapPath @active @(φ a -> rTail) @(φ rTail) (`extend` wa) acc)
+  {-# INLINE stepRole #-}
+
+instance forall base active ms m t3 acc acc' out φ inner.
+  ( Comonad φ
+  , MapPath (Init active) (φ inner) (φ (φ inner)) acc acc'
+  , StepPathMask base (Append active '[ F ]) ms m t3 acc' out
+  ) => StepRole Dup base active ms m t3 acc out where
+  stepRole f acc =
+    stepPathMask @base @(Append active '[ F ]) @ms @m @t3 @acc' @out f
+      (mapPath @(Init active) @(φ inner) @(φ (φ inner)) duplicate acc)
+  {-# INLINE stepRole #-}
+
+instance forall base active ms m t3 acc acc' out φ inner.
+  ( Comonad φ
+  , MapPath (Init active) (φ inner) inner acc acc'
+  , StepPathMask base (Init active) ms m t3 acc' out
+  ) => StepRole Ex base active ms m t3 acc out where
+  stepRole f acc =
+    stepPathMask @base @(Init active) @ms @m @t3 @acc' @out f
+      (mapPath @(Init active) @(φ inner) @inner extract acc)
+  {-# INLINE stepRole #-}
diff --git a/src/Gongju/Composition.hs b/src/Gongju/Composition.hs
new file mode 100644
--- /dev/null
+++ b/src/Gongju/Composition.hs
@@ -0,0 +1,577 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE FunctionalDependencies #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE RequiredTypeArguments #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeAbstractions #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE UndecidableSuperClasses #-}
+
+-- | Module: Gongju.Composition
+-- Description: The Grand Unified Open-World Tape Engine and Variadic Composition
+--
+-- Provides the open tag-driven state machine ('StepPathMask', 'StepRole') for multi-stage
+-- functor and arrow composition, arbitrary argument permutation ('Permute'), lax monoidal
+-- zipping ('ApPath'), distributive laws ('CommutePast', 'PullPath'), and ergonomic
+-- visible-forall entry points ('composeUnifiedV', 'withOps', 'infixr 9 .@').
+--
+-- Also preserves legacy inductive Peano arity composition ('ComposeN', 'compN') and
+-- nested functor mapping ('FmapN', 'fmapN') with bidirectional functional dependencies.
+module Gongju.Composition
+  ( -- * Open Layer Tags
+    F
+  , C
+  , B1
+  , B2
+  , BB
+  , Fn
+    -- * Open Mapping Primitives
+  , MapStep(..)
+  , MapPath(..)
+    -- * Open Zipping Primitives
+  , ApStep(..)
+  , ApPath(..)
+    -- * Distributive Laws & Commuting
+  , CommutePair(..)
+  , CommutePast(..)
+  , PullPath(..)
+    -- * Open State Machine & Spec Tags
+  , StepRole(..)
+  , StepPathMask(..)
+  , type (#)
+  , InOrder
+  , PP
+  , PZ
+  , PL
+  , PM
+  , J
+  , CS
+  , SwapAt
+  , PullRet
+    -- * Ergonomic Unindexed Aliases
+  , P
+  , Z
+  , M
+  , L
+  , LF
+  , PullF
+    -- * Type Families for Index & Mode Extraction
+  , UnwrapMode
+  , OpModes
+  , HasExplicitIndex
+  , OpIndices
+  , OpIndicesIf
+  , TakePeano
+  , AtPeano
+  , SwapAtPeano
+    -- * Visible Forall & Infix Entry Points
+  , composeUnifiedV
+  , withOps
+  , (.@)
+    -- * Backward-Compatible Variadic Combinators
+  , ComposeN(..)
+  , compN
+  , FmapN(..)
+  , fmapN
+  ) where
+
+import Control.Monad (join)
+import Data.Bifunctor (Bifunctor (bimap, first, second))
+import Data.Bitraversable (Bitraversable (bitraverse), bisequenceA)
+import Data.Functor.Contravariant (Contravariant (contramap))
+import Data.Kind (Type)
+import GHC.TypeLits (Nat)
+import Gongju.Peano
+  ( Append
+  , Init
+  , Peano (..)
+  , Replicate
+  , ToPeano
+  )
+import Gongju.Permute (Permute (..))
+import Gongju.Positional (ExpectArrow)
+
+{- Note [Variadic Composition Bidirectional Fundeps]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+[tag:note-variadic-composition-fundeps]
+Template Haskell composition libraries (such as 'composition-extra') generate static
+operators for fixed arities ((.:), (..:), (...:)). Beyond bloating code size, Template
+Haskell splices cannot be abstracted over dynamically in type-level pipelines.
+
+Gongju replaces these splices with an open tag-driven execution engine ('StepPathMask')
+and inductive arity composition ('ComposeN'), indexed by Peano depth or tape masks.
+
+Crucially, bidirectional functional dependencies are maintained across the engine:
+  - @n b c g -> f@: Propagates input function types forward to determine composite function type.
+  - @n f -> c@: Propagates expected output type backward into the composite structure.
+  - @n f b -> g@: Infers intermediate argument shapes under polymorphic unification.
+-}
+
+-- ---------------------------------------------------------------------------
+-- 1. Open Layer Tags (Extensible by Downstream Modules Without Orphans)
+-- ---------------------------------------------------------------------------
+
+-- | Covariant Functor layer tag.
+data F
+
+-- | Contravariant Functor layer tag.
+data C
+
+-- | Bifunctor first slot tag.
+data B1
+
+-- | Bifunctor second slot tag.
+data B2
+
+-- | Bifunctor diagonal tag (both slots).
+data BB
+
+-- | Replicate @n@ covariant 'F' functor layers.
+type Fn (n :: Nat) = Replicate n F
+
+-- ---------------------------------------------------------------------------
+-- 2. Open Primitive 1: MapStep & MapPath
+-- ---------------------------------------------------------------------------
+
+-- | 1-step mapping class dispatched on the head tag of kind 'Type'.
+class MapStep (tag :: Type) (rest :: [Type]) a b s t where
+  mapStep :: (a -> b) -> s -> t
+
+-- | Sequential path mapping through a type-level stack of functor layers.
+class MapPath (ls :: [Type]) a b s t where
+  mapPath :: (a -> b) -> s -> t
+
+instance (s ~ a, t ~ b) => MapPath '[] a b s t where
+  mapPath f = f
+  {-# INLINE mapPath #-}
+
+instance MapStep tag ls a b s t => MapPath (tag ': ls) a b s t where
+  mapPath = mapStep @tag @ls
+  {-# INLINE mapPath #-}
+
+instance (Functor φ, s ~ φ s', t ~ φ t', MapPath ls a b s' t')
+  => MapStep F ls a b s t where
+  mapStep f = fmap (mapPath @ls f)
+  {-# INLINE mapStep #-}
+
+instance (Contravariant φ, s ~ φ s', t ~ φ t', MapPath ls a b t' s')
+  => MapStep C ls a b s t where
+  mapStep f = contramap (mapPath @ls f)
+  {-# INLINE mapStep #-}
+
+instance (Bifunctor p, s ~ p s' c, t ~ p t' c, MapPath ls a b s' t')
+  => MapStep B1 ls a b s t where
+  mapStep f = first (mapPath @ls f)
+  {-# INLINE mapStep #-}
+
+instance (Bifunctor p, s ~ p c s', t ~ p c t', MapPath ls a b s' t')
+  => MapStep B2 ls a b s t where
+  mapStep f = second (mapPath @ls f)
+  {-# INLINE mapStep #-}
+
+instance (Bifunctor p, s ~ p s' s', t ~ p t' t', MapPath ls a b s' t')
+  => MapStep BB ls a b s t where
+  mapStep f = let g = mapPath @ls f in bimap g g
+  {-# INLINE mapStep #-}
+
+-- ---------------------------------------------------------------------------
+-- 3. Open Primitive 2: ApStep & ApPath (Lax Monoidal Zipping)
+-- ---------------------------------------------------------------------------
+
+-- | 1-step applicative zipping class dispatched on layer tag.
+class ApStep (tag :: Type) (rest :: [Type]) fab fa fb where
+  apStep :: fab -> fa -> fb
+
+-- | Sequential applicative zipping along a stack of functor layers.
+class ApPath (ls :: [Type]) fab fa fb where
+  apPath :: fab -> fa -> fb
+
+instance (fab ~ (fa -> fb)) => ApPath '[] fab fa fb where
+  apPath = id
+  {-# INLINE apPath #-}
+
+instance ApStep tag ls fab fa fb => ApPath (tag ': ls) fab fa fb where
+  apPath = apStep @tag @ls
+  {-# INLINE apPath #-}
+
+instance (Applicative φ, fab ~ φ fab', fa ~ φ fa', fb ~ φ fb', ApPath ls fab' fa' fb')
+  => ApStep F ls fab fa fb where
+  apStep = liftA2 (apPath @ls)
+  {-# INLINE apStep #-}
+
+instance (Applicative (p c), fab ~ p c fab', fa ~ p c fa', fb ~ p c fb', ApPath ls fab' fa' fb')
+  => ApStep B2 ls fab fa fb where
+  apStep = liftA2 (apPath @ls)
+  {-# INLINE apStep #-}
+
+-- ---------------------------------------------------------------------------
+-- 4. Open Primitive 3: CommutePair & PullPath (Distributive Laws)
+-- ---------------------------------------------------------------------------
+
+-- | Commute adjacent effect layers @l1@ and @l2@.
+class CommutePair (l1 :: Type) (l2 :: Type) s t where
+  commutePair :: s -> t
+
+instance (Traversable φ, Applicative ψ, s ~ φ (ψ inner), t ~ ψ (φ inner))
+  => CommutePair F F s t where
+  commutePair = sequenceA
+  {-# INLINE commutePair #-}
+
+instance (Bitraversable p, Applicative ψ, s ~ p c (ψ inner), t ~ ψ (p c inner))
+  => CommutePair B2 F s t where
+  commutePair = bitraverse pure id
+  {-# INLINE commutePair #-}
+
+instance (Bitraversable p, Applicative ψ, s ~ p (ψ inner) c, t ~ ψ (p inner c))
+  => CommutePair B1 F s t where
+  commutePair = bitraverse id pure
+  {-# INLINE commutePair #-}
+
+instance (Bitraversable p, Applicative ψ, s ~ p (ψ inner) (ψ inner), t ~ ψ (p inner inner))
+  => CommutePair BB F s t where
+  commutePair = bisequenceA
+  {-# INLINE commutePair #-}
+
+-- | Bubble an inner layer @r@ outward past an entire @outer@ stack.
+class CommutePast (outer :: [Type]) (r :: Type) s t where
+  commutePast :: s -> t
+
+instance (s ~ t) => CommutePast '[] r s t where
+  commutePast = id
+  {-# INLINE commutePast #-}
+
+instance forall l ls r s mid t subS subT.
+  ( CommutePast ls r subS subT
+  , MapPath '[ l ] subS subT s mid
+  , CommutePair l r mid t
+  ) => CommutePast (l ': ls) r s t where
+  commutePast = commutePair @l @r @mid @t . mapPath @'[ l ] @subS @subT @s @mid (commutePast @ls @r @subS @subT)
+  {-# INLINE commutePast #-}
+
+-- | Pull an entire @retPath@ stack outward past @outer@.
+class PullPath (outer :: [Type]) (retPath :: [Type]) s t where
+  pullPath :: s -> t
+
+instance (s ~ t) => PullPath outer '[] s t where
+  pullPath = id
+  {-# INLINE pullPath #-}
+
+instance forall outer r rs s mid t subS subT.
+  ( CommutePast outer r s mid
+  , PullPath outer rs subS subT
+  , MapPath '[ r ] subS subT mid t
+  ) => PullPath outer (r ': rs) s t where
+  pullPath = mapPath @'[ r ] @subS @subT @mid @t (pullPath @outer @rs @subS @subT) . commutePast @outer @r @s @mid
+  {-# INLINE pullPath #-}
+
+-- ---------------------------------------------------------------------------
+-- 5. Open Primitive 4: StepRole & StepPathMask (The Open State Machine)
+-- ---------------------------------------------------------------------------
+
+-- | Individual operational step executing a transition on the accumulator.
+class StepRole (op :: Type) (base :: [Type]) (active :: [Type]) (ms :: [Type]) m t3 acc out where
+  stepRole :: (m -> t3) -> acc -> out
+
+-- | Tape machine executing a list of operations @ms@ against the active functor stack.
+class StepPathMask (base :: [Type]) (active :: [Type]) (ms :: [Type]) m t3 acc out where
+  stepPathMask :: (m -> t3) -> acc -> out
+
+instance (acc ~ m, out ~ t3) => StepPathMask base active '[] m t3 acc out where
+  stepPathMask f acc = f acc
+  {-# INLINE stepPathMask #-}
+
+instance StepRole op base active ms m t3 acc out
+  => StepPathMask base active (op ': ms) m t3 acc out where
+  stepPathMask = stepRole @op @base @active @ms
+  {-# INLINE stepPathMask #-}
+
+-- | Open spec tag pairing an explicit argument index with a mode.
+infix 6 #
+data (i :: Nat) # (mode :: Type)
+
+-- | Open spec tag for unindexed in-order arguments.
+data InOrder (mode :: Type)
+
+-- | Pure argument mode tag.
+data PP
+
+-- | Applicative zipped argument mode tag.
+data PZ
+
+-- | Layered argument mode tag along sub-stack @sub@.
+data PL (sub :: [Type])
+
+-- | Monadic bind argument mode tag.
+data PM
+
+-- | Monadic return join tag.
+data J
+
+-- | Collapse 2 innermost monadic layers.
+data CS
+
+-- | Swap active layers at depth @d@ and @d + 1@.
+data SwapAt (d :: Nat)
+
+-- | Commute @retPath@ outward past @active@.
+data PullRet (retPath :: [Type])
+
+-- Ergonomic unindexed aliases:
+type P = InOrder PP
+type Z = InOrder PZ
+type M = InOrder PM
+type L (ls :: [Type]) = InOrder (PL ls)
+type LF (n :: Nat) = InOrder (PL (Fn n))
+type PullF (n :: Nat) = PullRet (Fn n)
+
+-- | Recursively unwrap indexed or in-order wrapper tags into underlying modes.
+type family UnwrapMode (op :: Type) :: Type where
+  UnwrapMode (_ # mode) = UnwrapMode mode
+  UnwrapMode (InOrder mode) = UnwrapMode mode
+  UnwrapMode stackOp = stackOp
+
+-- | Map 'UnwrapMode' across a list of operation tags.
+type family OpModes (ops :: [Type]) :: [Type] where
+  OpModes '[] = '[]
+  OpModes (op ': ops) = UnwrapMode op ': OpModes ops
+
+-- | Detect whether any operation in the list specifies an explicit numerical index.
+type family HasExplicitIndex (ops :: [Type]) :: Bool where
+  HasExplicitIndex '[] = 'False
+  HasExplicitIndex ((_ # _) ': _) = 'True
+  HasExplicitIndex (_ ': ops) = HasExplicitIndex ops
+
+-- | Extract the list of indices from an operation list if explicitly indexed.
+type family OpIndices (ops :: [Type]) :: [Peano] where
+  OpIndices ops = OpIndicesIf (HasExplicitIndex ops) ops
+
+-- | Helper family generating the index list depending on explicit tagging.
+type family OpIndicesIf (indexed :: Bool) (ops :: [Type]) :: [Peano] where
+  OpIndicesIf 'False _ = '[]
+  OpIndicesIf 'True '[] = '[]
+  OpIndicesIf 'True ((i # _) ': ops) = ToPeano i ': OpIndicesIf 'True ops
+  OpIndicesIf 'True (InOrder _ ': ops) = 'Z ': OpIndicesIf 'True ops
+  OpIndicesIf 'True (_ ': ops) = OpIndicesIf 'True ops
+
+-- | Take @d@ elements from a type-level list.
+type family TakePeano (d :: Peano) (xs :: [k]) :: [k] where
+  TakePeano 'Z _ = '[]
+  TakePeano ('S d) (x ': xs) = x ': TakePeano d xs
+
+-- | Index into a type-level list at Peano position @d@.
+type family AtPeano (d :: Peano) (xs :: [k]) :: k where
+  AtPeano 'Z (x ': _) = x
+  AtPeano ('S d) (_ ': xs) = AtPeano d xs
+
+-- | Swap adjacent elements in a type-level list at depth @d@.
+type family SwapAtPeano (d :: Peano) (xs :: [k]) :: [k] where
+  SwapAtPeano 'Z (x ': y ': xs) = y ': x ': xs
+  SwapAtPeano ('S d) (x ': xs) = x ': SwapAtPeano d xs
+
+-- Core StepRole Instances:
+
+instance (ExpectArrow "StepRole PP" acc a rTail, StepPathMask base '[] ms m t3 rTail out')
+  => StepRole PP base '[] ms m t3 acc (a -> out') where
+  stepRole f acc a = stepPathMask @base @'[] @ms f (acc a)
+  {-# INLINE stepRole #-}
+
+instance forall base l ls ms m t3 acc acc' out' a rTail.
+  ( MapPath (l ': ls) (a -> rTail) rTail acc acc'
+  , StepPathMask base (l ': ls) ms m t3 acc' out'
+  ) => StepRole PP base (l ': ls) ms m t3 acc (a -> out') where
+  stepRole f acc a =
+    stepPathMask @base @(l ': ls) @ms @m @t3 @acc' @out'
+      f
+      (mapPath @(l ': ls) @(a -> rTail) @rTail @acc @acc' ($ a) acc)
+  {-# INLINE stepRole #-}
+
+instance (ExpectArrow "StepRole PZ" acc a rTail, MapPath base a rTail fa acc', StepPathMask base base ms m t3 acc' out')
+  => StepRole PZ base '[] ms m t3 acc (fa -> out') where
+  stepRole f acc fa =
+    stepPathMask @base @base @ms @m @t3 @acc' @out' f (mapPath @base acc fa)
+  {-# INLINE stepRole #-}
+
+instance (ApPath (l ': ls) acc fa acc', StepPathMask base (l ': ls) ms m t3 acc' out')
+  => StepRole PZ base (l ': ls) ms m t3 acc (fa -> out') where
+  stepRole f acc fa =
+    stepPathMask @base @(l ': ls) @ms @m @t3 @acc' @out' f (apPath @(l ': ls) acc fa)
+  {-# INLINE stepRole #-}
+
+instance forall base active sub ms m t3 acc acc' out' a rTail fa inner.
+  ( MapPath sub a rTail fa inner
+  , MapPath active (a -> rTail) inner acc acc'
+  , StepPathMask base (Append active sub) ms m t3 acc' out'
+  ) => StepRole (PL sub) base active ms m t3 acc (fa -> out') where
+  stepRole f acc fa =
+    stepPathMask @base @(Append active sub) @ms @m @t3 @acc' @out' f
+      (mapPath @active @(a -> rTail) @inner @acc @acc' (\k -> mapPath @sub @a @rTail @fa @inner k fa) acc)
+  {-# INLINE stepRole #-}
+
+instance (Monad φ, ExpectArrow "StepRole PM" acc a rTail, fa ~ φ a, StepPathMask base '[ F ] ms m t3 (φ rTail) out')
+  => StepRole PM base '[] ms m t3 acc (fa -> out') where
+  stepRole f acc fa =
+    stepPathMask @base @'[ F ] @ms f (fmap acc fa)
+  {-# INLINE stepRole #-}
+
+instance forall base l ls ms m t3 acc acc' out' φ a rTail fa.
+  ( Monad φ, fa ~ φ a
+  , MapPath (Init (l ': ls)) (φ (a -> rTail)) (φ rTail) acc acc'
+  , StepPathMask base (l ': ls) ms m t3 acc' out'
+  ) => StepRole PM base (l ': ls) ms m t3 acc (fa -> out') where
+  stepRole f acc fa =
+    stepPathMask @base @(l ': ls) @ms @m @t3 @acc' @out' f
+      (mapPath @(Init (l ': ls)) @(φ (a -> rTail)) @(φ rTail) (\mf -> mf >>= (<$> fa)) acc)
+  {-# INLINE stepRole #-}
+
+instance forall base active ms m t3 acc acc' out φ inner.
+  ( Monad φ
+  , MapPath (Init active) (φ (φ inner)) (φ inner) acc acc'
+  , StepPathMask base active ms m t3 acc' out
+  ) => StepRole J base active ms m t3 acc out where
+  stepRole f acc =
+    stepPathMask @base @active @ms @m @t3 @acc' @out f
+      (mapPath @(Init active) @(φ (φ inner)) @(φ inner) join acc)
+  {-# INLINE stepRole #-}
+
+instance forall base active ms m t3 acc acc' out φ inner.
+  ( Monad φ
+  , MapPath (Init (Init active)) (φ (φ inner)) (φ inner) acc acc'
+  , StepPathMask base (Init active) ms m t3 acc' out
+  ) => StepRole CS base active ms m t3 acc out where
+  stepRole f acc =
+    stepPathMask @base @(Init active) @ms @m @t3 @acc' @out f
+      (mapPath @(Init (Init active)) @(φ (φ inner)) @(φ inner) join acc)
+  {-# INLINE stepRole #-}
+
+instance forall (d :: Nat) base active ms m t3 acc acc' out sMid tMid dp.
+  ( dp ~ ToPeano d
+  , CommutePair (AtPeano dp active) (AtPeano ('S dp) active) sMid tMid
+  , MapPath (TakePeano dp active) sMid tMid acc acc'
+  , StepPathMask base (SwapAtPeano dp active) ms m t3 acc' out
+  ) => StepRole (SwapAt d) base active ms m t3 acc out where
+  stepRole f acc =
+    stepPathMask @base @(SwapAtPeano dp active) @ms @m @t3 @acc' @out f
+      (mapPath @(TakePeano dp active) @sMid @tMid
+        (commutePair @(AtPeano dp active) @(AtPeano ('S dp) active) @sMid @tMid) acc)
+  {-# INLINE stepRole #-}
+
+instance forall (retPath :: [Type]) base active ms m t3 acc acc' out.
+  ( PullPath active retPath acc acc'
+  , StepPathMask base (Append retPath active) ms m t3 acc' out
+  ) => StepRole (PullRet retPath) base active ms m t3 acc out where
+  stepRole f acc =
+    stepPathMask @base @(Append retPath active) @ms @m @t3 @acc' @out f
+      (pullPath @active @retPath @acc @acc' acc)
+  {-# INLINE stepRole #-}
+
+-- ---------------------------------------------------------------------------
+-- 6. Visible-Forall & Infix Entry Points
+-- ---------------------------------------------------------------------------
+
+-- | Fully general visible-forall composition engine parameterized by lifting path, base, and op tape.
+composeUnifiedV ::
+  forall (lpath :: [Type]) ->
+  forall (base :: [Type]) ->
+  forall (ops :: [Type]) ->
+  forall a t3 m m' g gPerm out.
+  ( Permute (OpIndices ops) g gPerm
+  , MapPath lpath a t3 m m'
+  , StepPathMask base '[] (OpModes ops) m m' gPerm out
+  ) =>
+  (a -> t3) -> g -> out
+composeUnifiedV (type lpath) (type base) (type ops) @a @t3 @m @m' @g @gPerm @out f g =
+  stepPathMask @base @'[] @(OpModes ops) @m @m' @gPerm @out
+    (mapPath @lpath @a @t3 @m @m' f)
+    (permute' @(OpIndices ops) @g @gPerm g)
+{-# INLINE composeUnifiedV #-}
+
+-- | Execute an outer function over an inner function with an open operation tape.
+withOps ::
+  forall (ops :: [Type]) ->
+  forall m t3 g gPerm out.
+  ( Permute (OpIndices ops) g gPerm
+  , StepPathMask '[] '[] (OpModes ops) m t3 gPerm out
+  ) =>
+  (m -> t3) -> g -> out
+withOps (type ops) @m @t3 @g @gPerm @out f g =
+  stepPathMask @'[] @'[] @(OpModes ops) @m @t3 @gPerm @out
+    f
+    (permute' @(OpIndices ops) @g @gPerm g)
+{-# INLINE withOps #-}
+
+-- | Infix tape-driven composition operator.
+--
+-- Example:
+--
+-- >>> (show .@ [P, P]) (+) 10 20
+-- "30"
+infixr 9 .@
+(.@) ::
+  forall m t3 g gPerm out.
+  (m -> t3) ->
+  forall (ops :: [Type]) ->
+  ( Permute (OpIndices ops) g gPerm
+  , StepPathMask '[] '[] (OpModes ops) m t3 gPerm out
+  ) =>
+  g -> out
+((.@) f (type ops)) g = withOps ops f g
+{-# INLINE (.@) #-}
+
+-- ---------------------------------------------------------------------------
+-- 7. Backward-Compatible Variadic Arity Composition
+-- ---------------------------------------------------------------------------
+
+-- | Inductive arity composition class parameterized over Peano depth @n@.
+--
+-- See Note [Variadic Composition Bidirectional Fundeps] [ref:note-variadic-composition-fundeps].
+class ComposeN (n :: Peano) b c g f | n b c g -> f, n f -> c, n f b -> g where
+  -- | Internal composition worker operating on inductive 'Peano' terms.
+  composeN' :: (b -> c) -> g -> f
+
+instance ComposeN 'Z b c b c where
+  composeN' f x = f x
+  {-# INLINE composeN' #-}
+
+instance ComposeN n b c r r' => ComposeN ('S n) b c (a -> r) (a -> r') where
+  composeN' f g a = composeN' @n f (g a)
+  {-# INLINE composeN' #-}
+
+-- | Compose a unary function @(b -> c)@ with a curried function consuming @n@ arguments.
+--
+-- Examples:
+--
+-- @
+-- compN @1 == (.)
+-- compN @2 == (.:)
+-- compN @3 == (..:)
+-- @
+compN :: forall (n :: Nat) b c g f. ComposeN (ToPeano n) b c g f => (b -> c) -> g -> f
+compN = composeN' @(ToPeano n)
+{-# INLINE compN #-}
+
+-- | Inductive nested functor mapping class parameterized over nesting depth @n@.
+class FmapN (n :: Peano) a b s t | n a b s -> t, n s t -> a b where
+  -- | Internal functor mapping worker operating on inductive 'Peano' terms.
+  fmapN' :: (a -> b) -> s -> t
+
+instance FmapN 'Z a b a b where
+  fmapN' f = f
+  {-# INLINE fmapN' #-}
+
+instance (Functor f, FmapN n a b s t) => FmapN ('S n) a b (f s) (f t) where
+  fmapN' f = fmap (fmapN' @n f)
+  {-# INLINE fmapN' #-}
+
+-- | Map a transformation @(a -> b)@ through @n@ nested 'Functor' layers.
+fmapN :: forall (n :: Nat) a b s t. FmapN (ToPeano n) a b s t => (a -> b) -> s -> t
+fmapN = fmapN' @(ToPeano n)
+{-# INLINE fmapN #-}
diff --git a/src/Gongju/Contravariant.hs b/src/Gongju/Contravariant.hs
new file mode 100644
--- /dev/null
+++ b/src/Gongju/Contravariant.hs
@@ -0,0 +1,262 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE FunctionalDependencies #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE RequiredTypeArguments #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE UndecidableInstances #-}
+
+-- | Module: Gongju.Contravariant
+-- Description: Contravariant Syntax Grids, Positional Pre-Composition, and Alternating Parity Stacks
+--
+-- Replaces Template Haskell contravariant splices (such as 'composition-extra') with pure
+-- type-level Peano induction, bidirectional functional dependencies, and type-safe argument pre-processing.
+--
+-- Provides:
+-- * Positional curried pre-composition ('PrecomposeAt', 'precomposeAt @n', '(-.)', '(-.*)', '(-.**)', '(-.***)').
+-- * 2D function splicing grid ('SpliceAt', 'spliceAt @n @m').
+-- * Alternating parity contravariant functor mapping ('ContramapN', 'contramapN @n', '(<-$>)', '(<-$$>)', '(<-$$$>)').
+-- * Canonical re-exports of 'Contravariant', 'Divisible', and 'Decidable' from @base@.
+module Gongju.Contravariant
+  ( -- * Positional Pre-Composition
+    PrecomposeAt (..)
+  , precomposeAt
+  , (-.)
+  , (-.*)
+  , (-.**)
+  , (-.***)
+    -- * 2D Function Splicing Grid
+  , SpliceAt (..)
+  , spliceAt
+    -- * Nested Contravariant Mapping (Alternating Parity)
+  , ContramapN (..)
+  , ContravariantN
+  , contramapN
+  , (<-$>)
+  , (<-$$>)
+  , (<-$$$>)
+  , (<-$$$$>)
+    -- * Re-exported Canonical Classes & Types
+  , Contravariant (..)
+  , (>$<)
+  , Predicate (..)
+  , Comparison (..)
+  , Equivalence (..)
+  , Op (..)
+  , Divisible (..)
+  , Decidable (..)
+  ) where
+
+import Data.Functor.Contravariant
+  ( Comparison (..)
+  , Contravariant (..)
+  , Equivalence (..)
+  , Op (..)
+  , Predicate (..)
+  , (>$<)
+  )
+import Data.Functor.Contravariant.Divisible
+  ( Decidable (..)
+  , Divisible (..)
+  )
+import GHC.TypeLits (Nat)
+import Gongju.Composition (ComposeN (..))
+import Gongju.Peano (Peano (..), ToPeano)
+
+{- Note [Contravariant Positional Pre-Composition]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+[tag:note-contravariant-precomposition]
+Because the function arrow @(->)@ is contravariant in its argument position,
+"contravariant function composition" corresponds to pre-composing a transformation
+function onto an argument consumed by another function.
+
+In libraries relying on Template Haskell splices (such as 'composition-extra'),
+operators proliferate along two distinct axes:
+  1. The target argument slot index @n@ of @f@ being pre-composed:
+     @(-.)@ at slot 0, @(-.*)@ at slot 1, @(-.**)@ at slot 2, etc.
+  2. The arity @m@ of arguments consumed by the pre-composed function @h@:
+     @(-.)@ for unary, @(-.:)@ for binary, @(-..:)@ for ternary, etc.
+
+Gongju collapses both axes into two inductively resolved typeclasses:
+  * 'PrecomposeAt': Unary pre-composition at positional depth @n@.
+  * 'SpliceAt': Full 2D generalization splicing an @m@-ary function into slot @n@.
+
+Full bidirectional functional dependencies are maintained across the grid:
+  - @n f -> b@: Determines the target argument type @b@ from slot @n@ and @f@.
+  - @n g -> a@: Determines the new argument type @a@ from slot @n@ and @g@.
+  - @n a f -> g@: Infers the transformed signature @g@ from input @a@ and @f@.
+  - @n b g -> f@: Recovers the original signature @f@ from target @b@ and @g@.
+-}
+
+-- ---------------------------------------------------------------------------
+-- 1. Positional Pre-Composition (PrecomposeAt)
+-- ---------------------------------------------------------------------------
+
+-- | Pre-compose a unary function @(a -> b)@ onto the @n@-th argument (0-indexed) of @f@.
+--
+-- See Note [Contravariant Positional Pre-Composition] [ref:note-contravariant-precomposition].
+class PrecomposeAt (n :: Peano) a b f g | n f -> b, n g -> a, n a f -> g, n b g -> f where
+  -- | Internal inductive worker operating on 'Peano' terms.
+  precomposeAt' :: (a -> b) -> f -> g
+
+instance PrecomposeAt 'Z a b (b -> r) (a -> r) where
+  precomposeAt' h f a = f (h a)
+  {-# INLINE precomposeAt' #-}
+
+instance PrecomposeAt n a b r r' => PrecomposeAt ('S n) a b (x -> r) (x -> r') where
+  precomposeAt' h f x = precomposeAt' @n h (f x)
+  {-# INLINE precomposeAt' #-}
+
+-- | User-facing positional pre-composition parameterized by visible 'Nat' literal @n@.
+--
+-- Example:
+--
+-- >>> let add3 x y z = (x + y + z :: Int)
+-- >>> precomposeAt @1 (* 10) add3 1 2 3
+-- 24
+precomposeAt :: forall (n :: Nat) a b f g. PrecomposeAt (ToPeano n) a b f g => (a -> b) -> f -> g
+precomposeAt = precomposeAt' @(ToPeano n)
+{-# INLINE precomposeAt #-}
+
+-- | Infix pre-composition at argument slot 0: @(h -. f) a = f (h a)@.
+infixr 9 -.
+(-.) :: PrecomposeAt 'Z a b f g => (a -> b) -> f -> g
+(-.) = precomposeAt' @'Z
+{-# INLINE (-.) #-}
+
+-- | Infix pre-composition at argument slot 1: @(h -.* f) x a = f x (h a)@.
+infixr 9 -.*
+(-.*) :: PrecomposeAt ('S 'Z) a b f g => (a -> b) -> f -> g
+(-.*) = precomposeAt' @('S 'Z)
+{-# INLINE (-.*) #-}
+
+-- | Infix pre-composition at argument slot 2: @(h -.** f) x y a = f x y (h a)@.
+infixr 9 -.**
+(-.**) :: PrecomposeAt ('S ('S 'Z)) a b f g => (a -> b) -> f -> g
+(-.**) = precomposeAt' @('S ('S 'Z))
+{-# INLINE (-.**) #-}
+
+-- | Infix pre-composition at argument slot 3: @(h -.*** f) x y z a = f x y z (h a)@.
+infixr 9 -.***
+(-.***) :: PrecomposeAt ('S ('S ('S 'Z))) a b f g => (a -> b) -> f -> g
+(-.***) = precomposeAt' @('S ('S ('S 'Z)))
+{-# INLINE (-.***) #-}
+
+-- ---------------------------------------------------------------------------
+-- 2. 2D Function Splicing Grid (SpliceAt)
+-- ---------------------------------------------------------------------------
+
+-- | Splice an @m@-ary function @h@ directly into the @n@-th argument slot of @f@.
+--
+-- The resulting function @g@ consumes @n@ arguments, then the @m@ arguments required by @h@,
+-- followed by the remaining arguments of @f@.
+--
+-- See Note [Contravariant Positional Pre-Composition] [ref:note-contravariant-precomposition].
+class SpliceAt (n :: Peano) (m :: Peano) h f g | n m h f -> g where
+  -- | Internal inductive worker operating on 'Peano' depths.
+  spliceAt' :: h -> f -> g
+
+instance ComposeN m d r h g => SpliceAt 'Z m h (d -> r) g where
+  spliceAt' h f = composeN' @m f h
+  {-# INLINE spliceAt' #-}
+
+instance SpliceAt n m h r r' => SpliceAt ('S n) m h (a -> r) (a -> r') where
+  spliceAt' h f a = spliceAt' @n @m h (f a)
+  {-# INLINE spliceAt' #-}
+
+-- | User-facing 2D function splicing parameterized by visible 'Nat' literals @n@ (target slot)
+-- and @m@ (spliced function arity).
+--
+-- Example:
+--
+-- >>> let add3 x y z = (x + y + z :: Int)
+-- >>> let mult2 u v = (u * v :: Int)
+-- >>> spliceAt @1 @2 mult2 add3 10 3 4 5
+-- 27
+spliceAt :: forall (n :: Nat) (m :: Nat) h f g. SpliceAt (ToPeano n) (ToPeano m) h f g => h -> f -> g
+spliceAt = spliceAt' @(ToPeano n) @(ToPeano m)
+{-# INLINE spliceAt #-}
+
+{- Note [Contravariant Functor Alternating Parity]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+[tag:note-contravariant-alternating-parity]
+In 'Data.Functor.Contravariant.Syntax' (operators @<-$@, @<-$$@, @<-$$$@, ...),
+mapping a transformation function @(a -> b)@ through nested 'Contravariant' functor layers
+introduces an alternating parity flip:
+  - 1 layer (@1):  @(a -> b) -> f b -> f a@ (contravariant: reverses arrow)
+  - 2 layers (@2): @(a -> b) -> f (g a) -> f (g b)@ (covariant: two reversals cancel!)
+  - 3 layers (@3): @(a -> b) -> f (g (h b)) -> f (g (h a))@ (contravariant again)
+
+With Peano induction, swapping @s@ and @t@ in the recursive constraint:
+  @instance (Contravariant f, ContramapN n a b t s) => ContramapN ('S n) a b (f s) (f t)@
+tracks this variance reversal automatically.
+
+Furthermore, the pair of bidirectional functional dependencies:
+  @n a b s -> t, n a b t -> s@
+mutually inductive-check each other across the parity swap, preserving full type inference.
+-}
+
+-- ---------------------------------------------------------------------------
+-- 3. Nested Contravariant Functor Mapping (Alternating Parity)
+-- ---------------------------------------------------------------------------
+
+-- | Map a transformation through @n@ nested 'Contravariant' functor layers with alternating parity.
+--
+-- See Note [Contravariant Functor Alternating Parity] [ref:note-contravariant-alternating-parity].
+class ContramapN (n :: Peano) a b s t | n s t -> a b, n a b s -> t, n a b t -> s where
+  -- | Internal inductive worker operating on 'Peano' depth.
+  contramapN' :: (a -> b) -> s -> t
+
+instance ContramapN 'Z a b a b where
+  contramapN' f = f
+  {-# INLINE contramapN' #-}
+
+instance (Contravariant f, ContramapN n a b t s) => ContramapN ('S n) a b (f s) (f t) where
+  contramapN' f = contramap (contramapN' @n f)
+  {-# INLINE contramapN' #-}
+
+-- | User-facing constraint synonym parameterized by visible 'Nat' depth @n@.
+type ContravariantN (n :: Nat) a b s t = ContramapN (ToPeano n) a b s t
+
+-- | Map a transformation through @n@ nested 'Contravariant' functor layers.
+--
+-- Examples:
+--
+-- >>> let p = Predicate (> 0) :: Predicate Int
+-- >>> let p' = contramapN @1 (* 2) p
+-- >>> getPredicate p' 5
+-- True
+contramapN :: forall (n :: Nat) a b s t. ContramapN (ToPeano n) a b s t => (a -> b) -> s -> t
+contramapN = contramapN' @(ToPeano n)
+{-# INLINE contramapN #-}
+
+-- | Infix contravariant mapping at depth 1 (equivalent to 'contramap' / '(>$<)').
+infixr 4 <-$>
+(<-$>) :: ContramapN ('S 'Z) a b s t => (a -> b) -> s -> t
+(<-$>) = contramapN' @('S 'Z)
+{-# INLINE (<-$>) #-}
+
+-- | Infix contravariant mapping at depth 2 (covariant due to parity cancellation).
+infixr 4 <-$$>
+(<-$$>) :: ContramapN ('S ('S 'Z)) a b s t => (a -> b) -> s -> t
+(<-$$>) = contramapN' @('S ('S 'Z))
+{-# INLINE (<-$$>) #-}
+
+-- | Infix contravariant mapping at depth 3 (contravariant).
+infixr 4 <-$$$>
+(<-$$$>) :: ContramapN ('S ('S ('S 'Z))) a b s t => (a -> b) -> s -> t
+(<-$$$>) = contramapN' @('S ('S ('S 'Z)))
+{-# INLINE (<-$$$>) #-}
+
+-- | Infix contravariant mapping at depth 4 (covariant).
+infixr 4 <-$$$$>
+(<-$$$$>) :: ContramapN ('S ('S ('S ('S 'Z)))) a b s t => (a -> b) -> s -> t
+(<-$$$$>) = contramapN' @('S ('S ('S ('S 'Z))))
+{-# INLINE (<-$$$$>) #-}
diff --git a/src/Gongju/Core.hs b/src/Gongju/Core.hs
new file mode 100644
--- /dev/null
+++ b/src/Gongju/Core.hs
@@ -0,0 +1,112 @@
+-- | Module: Gongju.Core
+-- Description: Core re-exports and introductory guide for Gongju
+--
+-- @Gongju@ (공구 / 工具, tools/implement) is a pure type-level Haskell utility suite
+-- replacing Template Haskell splices (like 'composition-extra') and finite tuple
+-- generics (like 'tuple-sop') with an open-world tag-driven tape engine, Peano
+-- induction, bidirectional functional dependencies, and arbitrary curried argument
+-- manipulation.
+--
+-- = When to Use This Library
+--
+-- * **Grand Unified Composition:** Infix tape-driven composition with visible type arguments
+--   (@(f .@ [P, P, M]) g@ or @withOps [P, Z, J] f g@).
+-- * **Variadic Arity Composition:** Composing unary functions with functions of arbitrary arities
+--   (@compN @3@ instead of Template Haskell @(...:)@).
+-- * **Positional Argument Manipulation:** Pulling arguments to the front (@slipr @2@), shoving them
+--   deeper (@slipl @2@), or transposing adjacent arguments (@twist @1@).
+-- * **Arbitrary Argument Permutations:** Specifying a desired argument order as a type-level
+--   index list (@permute @'[2, 0, 1]@).
+-- * **Indexed Monads & Comonads:** Composing transition-carrying indexed arrows with zero orphans.
+-- * **Distributive & Representable Functors:** Commuting infinite streams and comonads outside
+--   representable layers without requiring Traversable instances.
+--
+-- = Worked Example
+--
+-- >>> import Gongju.Core
+-- >>> :set -XTypeApplications -XDataKinds -XRequiredTypeArguments
+-- >>> -- 1. Tape-driven composition: mapping and zipping arguments
+-- >>> let add3 x y z = (x + y + z :: Int)
+-- >>> ((+ 100) .@ [P, P, P]) add3 10 20 30
+-- 160
+-- >>> -- 2. Reordering curried arguments via indexed mode tags:
+-- >>> let tuple3 x y z = (x, y, z)
+-- >>> (id .@ [2 # P, 0 # P, 1 # P]) tuple3 True (42 :: Int) "hello"
+-- (42,"hello",True)
+-- >>> -- 3. Positional argument manipulation:
+-- >>> slipr @1 (-) 5 20
+-- 15
+--
+-- = Zero-Cost Compiler Invariants
+--
+-- All inductive typeclasses in Gongju ('ComposeN', 'Permute', 'Yank', 'Shove', 'Twist',
+-- 'PrecomposeAt', 'SpliceAt', 'BindPos', 'BindAfter', 'LiftMask', 'PermuteTuple', 'CurriedCat')
+-- are aggressively annotated with '{-# INLINE #-}'. Under GHC's Simplifier (@-O2@),
+-- all typeclass dictionary passing, Peano induction, and intermediate tuples/records
+-- evaporate completely into direct inlined lambda applications with zero runtime overhead.
+--
+-- See Note [Zero-Cost Inlining and Core Simplification] [ref:note-zero-cost-core-simplification].
+
+{- Note [Zero-Cost Inlining and Core Simplification]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+[tag:note-zero-cost-core-simplification]
+Gongju replaces Template Haskell arity generators and runtime tuple coercions with
+pure typeclass induction over structural Peano numbers. A critical architectural
+invariant is that this high-level inductive machinery must incur zero runtime overhead:
+when compiled under '-O2', every Gongju combinator pipeline must simplify in GHC Core
+into the exact same lambda terms as hand-written, specialized functions.
+
+This zero-cost guarantee is achieved through three cooperating invariants:
+  1. Aggressive Inlining: Every inductive method ('composeN'', 'yank'', 'shove'',
+     'twist'', 'permute'', 'precomposeAt'', 'spliceAt'', 'bindPos'', 'bindAfter'',
+     'liftMask', 'yankTuple'', 'permuteTuple'', 'yankCat'', 'permuteCat'') is annotated
+     with '{-# INLINE #-}'.
+  2. Static Resolution of Peano Depths: Because TypeLits literals (@2, @3, @'[2, 0, 1])
+     are resolved to concrete Peano terms ('Z, 'S 'Z, ...) at compile time, the instance
+     search is completely known and terminated during typechecking.
+  3. Beta-Reduction and Dictionary Elimination: Under GHC's Simplifier (-O2), the
+     inlined dictionary methods unroll statically into direct lambda applications.
+     Intermediate records and typeclass dictionaries ($fComposeN, $fPermute, $fYank,
+     $fPrecomposeAt, $fBindPos, $fYankTuple) are completely eliminated via beta-reduction,
+     yielding pure nested function applications and tuple projections with zero allocations
+     and zero indirect calls.
+
+This invariant is mechanically verified on every build by the automated Core inspection
+gate ('bin/gongju-inspect-core' and 'packages/gongju/test/CoreInspection.hs').
+-}
+module Gongju.Core
+  ( -- * Peano Naturals & Type-Level List Utilities
+    module Gongju.Peano
+    -- * Guarded Positional Combinators
+  , module Gongju.Positional
+    -- * Arbitrary Argument Permutations
+  , module Gongju.Permute
+    -- * Grand Unified Tape Composition Engine
+  , module Gongju.Composition
+    -- * Indexed Functors, Monads, and Comonads
+  , module Gongju.Indexed
+    -- * Comonads, Distributive, and Representable Functors
+  , module Gongju.Comonad
+    -- * Adjunction Transitions and Dual Annihilation
+  , module Gongju.Adjunction
+    -- * Kan Extensions, Yoneda, and Codensity Fusion
+  , module Gongju.Kan
+    -- * Profunctors and Indexed Profunctors
+  , module Gongju.Profunctor
+    -- * Contravariant Syntax Grids & Variance-Flipping Stacks
+  , module Gongju.Contravariant
+    -- * Positional Monadic Binding & Lifting Masks
+  , module Gongju.Monad
+  ) where
+
+import Gongju.Peano
+import Gongju.Positional
+import Gongju.Permute
+import Gongju.Composition
+import Gongju.Indexed
+import Gongju.Comonad
+import Gongju.Adjunction
+import Gongju.Kan
+import Gongju.Profunctor
+import Gongju.Contravariant
+import Gongju.Monad
diff --git a/src/Gongju/Indexed.hs b/src/Gongju/Indexed.hs
new file mode 100644
--- /dev/null
+++ b/src/Gongju/Indexed.hs
@@ -0,0 +1,196 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE UndecidableSuperClasses #-}
+
+-- | Module: Gongju.Indexed
+-- Description: Indexed Monads and Indexed Comonads for Gongju
+--
+-- Plugs indexed functorial structures ('IxFunctor', 'IxApplicative', 'IxMonad',
+-- 'IxComonad') into Gongju's open tape composition engine without modifying Core.
+module Gongju.Indexed
+  ( -- * Re-exported Canonical Indexed Classes
+    IxFunctor(..)
+  , IxPointed(..)
+  , IxCopointed(..)
+  , IxApplicative(..)
+  , ipure
+  , iliftA2
+  , IxMonad(..)
+  , (>>>=)
+  , (=<<<)
+  , ijoin
+  , IxComonad(..)
+  , iduplicate
+    -- * Open Indexed Tags
+  , IxF
+  , PIM
+  , IJ
+  , PIxW
+  , IxDup
+  , IxEx
+    -- * Ergonomic Aliases
+  , IxM
+  , IxW
+  ) where
+
+import Control.Comonad.Indexed
+  ( IxComonad (..)
+  , iduplicate
+  )
+import Control.Monad.Indexed
+  ( IxApplicative (..)
+  , IxMonad (..)
+  , ijoin
+  , (=<<<)
+  , (>>>=)
+  )
+import Data.Functor.Indexed
+  ( IxCopointed (..)
+  , IxFunctor (..)
+  , IxPointed (..)
+  )
+import Data.Kind (Type)
+import Gongju.Composition
+  ( ApPath (..)
+  , ApStep (..)
+  , InOrder
+  , MapPath (..)
+  , MapStep (..)
+  , StepPathMask (..)
+  , StepRole (..)
+  )
+import Gongju.Peano (Append, Init)
+import Gongju.Positional (ExpectArrow)
+
+-- | Ergonomic alias for 'ireturn'.
+ipure :: IxPointed m => a -> m i i a
+ipure = ireturn
+{-# INLINE ipure #-}
+
+-- | Lift a binary function across two indexed applicatives.
+iliftA2 :: IxApplicative m => (a -> b -> c) -> m i j a -> m j l b -> m i l c
+iliftA2 f ma mb = iap (imap f ma) mb
+{-# INLINE iliftA2 #-}
+
+-- ---------------------------------------------------------------------------
+-- 2. Open Indexed Tags
+-- ---------------------------------------------------------------------------
+
+-- | Tag for an indexed functor layer @m i j a@.
+data IxF
+
+-- | Tag for indexed monadic bind ('ibind').
+data PIM
+
+-- | Tag for indexed monadic join ('ijoin').
+data IJ
+
+-- | Tag for indexed comonadic extend ('iextend').
+data PIxW
+
+-- | Tag for indexed comonadic duplication ('iduplicate').
+data IxDup
+
+-- | Tag for indexed comonadic extraction ('iextract').
+data IxEx
+
+-- | In-order unindexed indexed monad bind alias.
+type IxM = InOrder PIM
+
+-- | In-order unindexed indexed comonad extend alias.
+type IxW = InOrder PIxW
+
+-- ---------------------------------------------------------------------------
+-- 3. Mapping & Zipping Instances
+-- ---------------------------------------------------------------------------
+
+instance (IxFunctor m, s ~ m i j s', t ~ m i j t', MapPath ls a b s' t')
+  => MapStep IxF ls a b s t where
+  mapStep f = imap (mapPath @ls f)
+  {-# INLINE mapStep #-}
+
+instance (IxApplicative m, fab ~ m i j fab', fa ~ m j l fa', fb ~ m i l fb', ApPath ls fab' fa' fb')
+  => ApStep IxF ls fab fa fb where
+  apStep = iliftA2 (apPath @ls)
+  {-# INLINE apStep #-}
+
+-- ---------------------------------------------------------------------------
+-- 4. StepRole Instances (IxMonad & IxComonad Transitions)
+-- ---------------------------------------------------------------------------
+
+instance (IxMonad φ, ExpectArrow "StepRole PIM" acc a rTail, fa ~ φ i j a, StepPathMask base '[ IxF ] ms m t3 (φ i j rTail) out')
+  => StepRole PIM base '[] ms m t3 acc (fa -> out') where
+  stepRole f acc fa = stepPathMask @base @'[ IxF ] @ms f (imap acc fa)
+  {-# INLINE stepRole #-}
+
+instance forall base l ls ms m t3 acc acc' out' idx (φ :: idx -> idx -> Type -> Type) i j rIdx a rTail fa.
+  ( IxMonad φ, fa ~ φ j rIdx a
+  , MapPath (Init (l ': ls)) (φ i j (a -> rTail)) (φ i rIdx rTail) acc acc'
+  , StepPathMask base (l ': ls) ms m t3 acc' out'
+  ) => StepRole PIM base (l ': ls) ms m t3 acc (fa -> out') where
+  stepRole f acc fa =
+    stepPathMask @base @(l ': ls) @ms @m @t3 @acc' @out' f
+      (mapPath @(Init (l ': ls)) @(φ i j (a -> rTail)) @(φ i rIdx rTail)
+        (\mf -> mf >>>= (`imap` fa)) acc)
+  {-# INLINE stepRole #-}
+
+instance forall base active ms m t3 acc acc' out idx (φ :: idx -> idx -> Type -> Type) i j rIdx inner.
+  ( IxMonad φ
+  , MapPath (Init active) (φ i j (φ j rIdx inner)) (φ i rIdx inner) acc acc'
+  , StepPathMask base active ms m t3 acc' out
+  ) => StepRole IJ base active ms m t3 acc out where
+  stepRole f acc =
+    stepPathMask @base @active @ms @m @t3 @acc' @out f
+      (mapPath @(Init active) @(φ i j (φ j rIdx inner)) @(φ i rIdx inner) ijoin acc)
+  {-# INLINE stepRole #-}
+
+instance ( IxComonad w
+         , ExpectArrow "StepRole PIxW" acc (w j k a) rTail
+         , wa ~ w i k a
+         , StepPathMask base '[ IxF ] ms m t3 (w i j rTail) out'
+         ) => StepRole PIxW base '[] ms m t3 acc (wa -> out') where
+  stepRole f acc wa = stepPathMask @base @'[ IxF ] @ms f (iextend acc wa)
+  {-# INLINE stepRole #-}
+
+instance forall base active ms m t3 acc acc' out' knd (w :: knd -> knd -> Type -> Type) i j k a rTail wa.
+  ( IxComonad w
+  , wa ~ w i k a
+  , MapPath active (w j k a -> rTail) (w i j rTail) acc acc'
+  , StepPathMask base (Append active '[ IxF ]) ms m t3 acc' out'
+  ) => StepRole PIxW base active ms m t3 acc (wa -> out') where
+  stepRole f acc wa =
+    stepPathMask @base @(Append active '[ IxF ]) @ms @m @t3 @acc' @out' f
+      (mapPath @active @(w j k a -> rTail) @(w i j rTail) (`iextend` wa) acc)
+  {-# INLINE stepRole #-}
+
+instance forall base active ms m t3 acc acc' out knd (w :: knd -> knd -> Type -> Type) i j k inner.
+  ( IxComonad w
+  , MapPath (Init active) (w i k inner) (w i j (w j k inner)) acc acc'
+  , StepPathMask base (Append active '[ IxF ]) ms m t3 acc' out
+  ) => StepRole IxDup base active ms m t3 acc out where
+  stepRole f acc =
+    stepPathMask @base @(Append active '[ IxF ]) @ms @m @t3 @acc' @out f
+      (mapPath @(Init active) @(w i k inner) @(w i j (w j k inner)) iduplicate acc)
+  {-# INLINE stepRole #-}
+
+instance forall base active ms m t3 acc acc' out knd (w :: knd -> knd -> Type -> Type) i inner.
+  ( IxComonad w
+  , MapPath (Init active) (w i i inner) inner acc acc'
+  , StepPathMask base (Init active) ms m t3 acc' out
+  ) => StepRole IxEx base active ms m t3 acc out where
+  stepRole f acc =
+    stepPathMask @base @(Init active) @ms @m @t3 @acc' @out f
+      (mapPath @(Init active) @(w i i inner) @inner iextract acc)
+  {-# INLINE stepRole #-}
diff --git a/src/Gongju/Kan.hs b/src/Gongju/Kan.hs
new file mode 100644
--- /dev/null
+++ b/src/Gongju/Kan.hs
@@ -0,0 +1,375 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE UndecidableSuperClasses #-}
+
+-- | Module: Gongju.Kan
+-- Description: Kan Extensions, Yoneda, and Codensity Fusion for Gongju
+--
+-- Integrates Right and Left Kan extensions ('t:Ran', 't:Lan'), Yoneda lemma embeddings
+-- ('t:Yoneda', 't:Coyoneda'), and Codensity / Density monad-comonad generators
+-- ('t:Codensity', 't:Density') from @kan-extensions@ into Gongju's open tape composition engine.
+--
+-- Enables:
+-- * Structural Kan rewrites without typeclass constraints on @g@ or @h@.
+-- * $O(1)$ functor mapping fusion via 't:Yoneda' and 't:Coyoneda'.
+-- * $O(1)$ monad bind optimization via 't:Codensity' CPS transformations.
+module Gongju.Kan
+  ( -- * Re-exported Canonical Kan Types
+    Lan(..)
+  , Ran(..)
+  , toRan
+  , fromRan
+  , Yoneda(..)
+  , liftYoneda
+  , lowerYoneda
+  , Coyoneda(..)
+  , liftCoyoneda
+  , lowerCoyoneda
+  , Codensity(..)
+  , liftCodensity
+  , lowerCodensity
+  , Density(..)
+  , liftDensity
+  , lowerDensity
+    -- * Kan Structural Unit & Counit Operations
+  , ranCounit
+  , ranUnit
+  , lanUnit
+  , lanCounit
+    -- * Open Kan Tags
+  , PRanC
+  , PRanU
+  , PLanU
+  , PLanC
+  , PCoY
+  , PUnCoY
+  , PYon
+  , PUnYon
+  , PCodM
+  , PUnCod
+  , PDenW
+  , PUnDen
+    -- * Ergonomic Aliases
+  , RanC
+  , RanU
+  , LanU
+  , LanC
+  , CoY
+  , UnCoY
+  , Yon
+  , UnYon
+  , CodM
+  , UnCod
+  , DenW
+  , UnDen
+  ) where
+
+import Control.Comonad (Comonad, extend)
+import Control.Comonad.Density
+  ( Density (..)
+  , liftDensity
+  )
+import Control.Monad.Codensity
+  ( Codensity (..)
+  , lowerCodensity
+  )
+import Data.Functor.Coyoneda
+  ( Coyoneda (..)
+  , liftCoyoneda
+  , lowerCoyoneda
+  )
+import Data.Functor.Kan.Lan
+  ( Lan (..)
+  )
+import Data.Functor.Kan.Ran
+  ( Ran (..)
+  , fromRan
+  , toRan
+  )
+import Data.Functor.Yoneda
+  ( Yoneda (..)
+  , liftYoneda
+  , lowerYoneda
+  )
+import Gongju.Composition
+  ( F
+  , InOrder
+  , MapPath (..)
+  , StepPathMask (..)
+  , StepRole (..)
+  )
+import Gongju.Peano (Append, Init)
+import Gongju.Positional (ExpectArrow)
+
+-- ---------------------------------------------------------------------------
+-- 1. Kan Universal Unit & Counit Operations
+-- ---------------------------------------------------------------------------
+
+-- | Universal Counit of Ran: @Ran g h (g a) -> h a@ (zero constraints).
+ranCounit :: Ran g h (g a) -> h a
+ranCounit (Ran k) = k id
+{-# INLINE ranCounit #-}
+
+-- | Identity Unit of Ran: @a -> Ran g g a@ (zero constraints).
+ranUnit :: a -> Ran g g a
+ranUnit a = Ran ($ a)
+{-# INLINE ranUnit #-}
+
+-- | Universal Unit of Lan: @h a -> Lan g h (g a)@ (zero constraints).
+lanUnit :: h a -> Lan g h (g a)
+lanUnit ha = Lan id ha
+{-# INLINE lanUnit #-}
+
+-- | Identity Counit of Lan: @Lan g g a -> a@ (zero constraints).
+lanCounit :: Lan g g a -> a
+lanCounit (Lan f ga) = f ga
+{-# INLINE lanCounit #-}
+
+-- | Lift a monadic action into 't:Codensity' for CPS fusion.
+liftCodensity :: Monad m => m a -> Codensity m a
+liftCodensity m = Codensity (m >>=)
+{-# INLINE liftCodensity #-}
+
+-- | Lower 't:Density' back into the underlying comonad.
+lowerDensity :: Comonad w => Density w a -> w a
+lowerDensity (Density f wb) = extend f wb
+{-# INLINE lowerDensity #-}
+
+-- ---------------------------------------------------------------------------
+-- 2. Open Mode Tags & Aliases
+-- ---------------------------------------------------------------------------
+
+-- | Tag for Ran Counit: collapses @Ran g h (g inner) -> h inner@.
+data PRanC
+
+-- | Tag for Ran Unit: expands @inner -> Ran g g inner@.
+data PRanU
+
+-- | Tag for Lan Unit: expands @h inner -> Lan g h (g inner)@.
+data PLanU
+
+-- | Tag for Lan Counit: collapses @Lan g g inner -> inner@.
+data PLanC
+
+-- | Tag for lifting arguments into 't:Coyoneda'.
+data PCoY
+
+-- | Tag for lowering 't:Coyoneda' via single 'fmap'.
+data PUnCoY
+
+-- | Tag for lifting arguments into 't:Yoneda'.
+data PYon
+
+-- | Tag for lowering 't:Yoneda' into the underlying functor.
+data PUnYon
+
+-- | Tag for lifting monadic arguments into 't:Codensity'.
+data PCodM
+
+-- | Tag for lowering 't:Codensity' back to the underlying monad.
+data PUnCod
+
+-- | Tag for lifting comonadic arguments into 't:Density'.
+data PDenW
+
+-- | Tag for lowering 't:Density' back to the underlying comonad.
+data PUnDen
+
+-- | In-order Ran Counit alias.
+type RanC = InOrder PRanC
+
+-- | In-order Ran Unit alias.
+type RanU = InOrder PRanU
+
+-- | In-order Lan Unit alias.
+type LanU = InOrder PLanU
+
+-- | In-order Lan Counit alias.
+type LanC = InOrder PLanC
+
+-- | In-order Coyoneda lifting alias.
+type CoY = InOrder PCoY
+
+-- | In-order Coyoneda lowering alias.
+type UnCoY = InOrder PUnCoY
+
+-- | In-order Yoneda lifting alias.
+type Yon = InOrder PYon
+
+-- | In-order Yoneda lowering alias.
+type UnYon = InOrder PUnYon
+
+-- | In-order Codensity lifting alias.
+type CodM = InOrder PCodM
+
+-- | In-order Codensity lowering alias.
+type UnCod = InOrder PUnCod
+
+-- | In-order Density lifting alias.
+type DenW = InOrder PDenW
+
+-- | In-order Density lowering alias.
+type UnDen = InOrder PUnDen
+
+-- ---------------------------------------------------------------------------
+-- 3. StepRole Instances (Kan Extensions & Yoneda Fusion)
+-- ---------------------------------------------------------------------------
+
+-- | Ran Counit: collapses @Ran g h (g inner)@ to @h inner@ at the tip.
+instance forall base active ms m t3 acc acc' out g h inner.
+  ( MapPath (Init (Init active)) (Ran g h (g inner)) (h inner) acc acc'
+  , StepPathMask base (Init active) ms m t3 acc' out
+  ) => StepRole PRanC base active ms m t3 acc out where
+  stepRole f acc =
+    stepPathMask @base @(Init active) @ms @m @t3 @acc' @out f
+      (mapPath @(Init (Init active)) @(Ran g h (g inner)) @(h inner) ranCounit acc)
+  {-# INLINE stepRole #-}
+
+-- | Ran Unit: inserts @Ran g g@ around @inner@.
+instance forall base active ms m t3 acc acc' out g inner.
+  ( MapPath active inner (Ran g g inner) acc acc'
+  , StepPathMask base (Append active '[ F ]) ms m t3 acc' out
+  ) => StepRole PRanU base active ms m t3 acc out where
+  stepRole f acc =
+    stepPathMask @base @(Append active '[ F ]) @ms @m @t3 @acc' @out f
+      (mapPath @active @inner @(Ran g g inner) ranUnit acc)
+  {-# INLINE stepRole #-}
+
+-- | Lan Unit: expands @h inner@ to @Lan g h (g inner)@.
+instance forall base active ms m t3 acc acc' out g h inner.
+  ( MapPath (Init active) (h inner) (Lan g h (g inner)) acc acc'
+  , StepPathMask base (Append active '[ F ]) ms m t3 acc' out
+  ) => StepRole PLanU base active ms m t3 acc out where
+  stepRole f acc =
+    stepPathMask @base @(Append active '[ F ]) @ms @m @t3 @acc' @out f
+      (mapPath @(Init active) @(h inner) @(Lan g h (g inner)) lanUnit acc)
+  {-# INLINE stepRole #-}
+
+-- | Lan Counit: collapses @Lan g g inner@ to @inner@.
+instance forall base active ms m t3 acc acc' out g inner.
+  ( MapPath (Init active) (Lan g g inner) inner acc acc'
+  , StepPathMask base (Init active) ms m t3 acc' out
+  ) => StepRole PLanC base active ms m t3 acc out where
+  stepRole f acc =
+    stepPathMask @base @(Init active) @ms @m @t3 @acc' @out f
+      (mapPath @(Init active) @(Lan g g inner) @inner lanCounit acc)
+  {-# INLINE stepRole #-}
+
+-- | Coyoneda lifting: wraps argument in 't:Coyoneda' with zero constraints.
+instance (ExpectArrow "StepRole PCoY" acc (Coyoneda φ a) rTail, fa ~ φ a, StepPathMask base '[] ms m t3 rTail out')
+  => StepRole PCoY base '[] ms m t3 acc (fa -> out') where
+  stepRole f acc fa = stepPathMask @base @'[] @ms f (acc (liftCoyoneda fa))
+  {-# INLINE stepRole #-}
+
+instance forall base l ls ms m t3 acc acc' out' φ a rTail fa.
+  ( fa ~ φ a
+  , MapPath (l ': ls) (Coyoneda φ a -> rTail) rTail acc acc'
+  , StepPathMask base (l ': ls) ms m t3 acc' out'
+  ) => StepRole PCoY base (l ': ls) ms m t3 acc (fa -> out') where
+  stepRole f acc fa =
+    stepPathMask @base @(l ': ls) @ms @m @t3 @acc' @out' f
+      (mapPath @(l ': ls) @(Coyoneda φ a -> rTail) @rTail (\g -> g (liftCoyoneda fa)) acc)
+  {-# INLINE stepRole #-}
+
+-- | Coyoneda lowering: unrolls 't:Coyoneda' to underlying functor via single 'fmap'.
+instance forall base active ms m t3 acc acc' out φ inner.
+  ( Functor φ
+  , MapPath (Init active) (Coyoneda φ inner) (φ inner) acc acc'
+  , StepPathMask base active ms m t3 acc' out
+  ) => StepRole PUnCoY base active ms m t3 acc out where
+  stepRole f acc =
+    stepPathMask @base @active @ms @m @t3 @acc' @out f
+      (mapPath @(Init active) @(Coyoneda φ inner) @(φ inner) lowerCoyoneda acc)
+  {-# INLINE stepRole #-}
+
+-- | Yoneda lifting: wraps argument in 't:Yoneda' for $O(1)$ composition.
+instance (Functor φ, ExpectArrow "StepRole PYon" acc (Yoneda φ a) rTail, fa ~ φ a, StepPathMask base '[] ms m t3 rTail out')
+  => StepRole PYon base '[] ms m t3 acc (fa -> out') where
+  stepRole f acc fa = stepPathMask @base @'[] @ms f (acc (liftYoneda fa))
+  {-# INLINE stepRole #-}
+
+instance forall base l ls ms m t3 acc acc' out' φ a rTail fa.
+  ( Functor φ, fa ~ φ a
+  , MapPath (l ': ls) (Yoneda φ a -> rTail) rTail acc acc'
+  , StepPathMask base (l ': ls) ms m t3 acc' out'
+  ) => StepRole PYon base (l ': ls) ms m t3 acc (fa -> out') where
+  stepRole f acc fa =
+    stepPathMask @base @(l ': ls) @ms @m @t3 @acc' @out' f
+      (mapPath @(l ': ls) @(Yoneda φ a -> rTail) @rTail (\g -> g (liftYoneda fa)) acc)
+  {-# INLINE stepRole #-}
+
+-- | Yoneda lowering: extracts underlying functor from 't:Yoneda' (zero constraints).
+instance forall base active ms m t3 acc acc' out φ inner.
+  ( MapPath (Init active) (Yoneda φ inner) (φ inner) acc acc'
+  , StepPathMask base active ms m t3 acc' out
+  ) => StepRole PUnYon base active ms m t3 acc out where
+  stepRole f acc =
+    stepPathMask @base @active @ms @m @t3 @acc' @out f
+      (mapPath @(Init active) @(Yoneda φ inner) @(φ inner) lowerYoneda acc)
+  {-# INLINE stepRole #-}
+
+-- | Codensity lifting: lifts monadic argument into 't:Codensity' for CPS fusion.
+instance (Monad m', ExpectArrow "StepRole PCodM" acc (Codensity m' a) rTail, ma ~ m' a, StepPathMask base '[] ms m t3 rTail out')
+  => StepRole PCodM base '[] ms m t3 acc (ma -> out') where
+  stepRole f acc ma = stepPathMask @base @'[] @ms f (acc (liftCodensity ma))
+  {-# INLINE stepRole #-}
+
+instance forall base l ls ms m t3 acc acc' out' m' a rTail ma.
+  ( Monad m', ma ~ m' a
+  , MapPath (l ': ls) (Codensity m' a -> rTail) rTail acc acc'
+  , StepPathMask base (l ': ls) ms m t3 acc' out'
+  ) => StepRole PCodM base (l ': ls) ms m t3 acc (ma -> out') where
+  stepRole f acc ma =
+    stepPathMask @base @(l ': ls) @ms @m @t3 @acc' @out' f
+      (mapPath @(l ': ls) @(Codensity m' a -> rTail) @rTail (\g -> g (liftCodensity ma)) acc)
+  {-# INLINE stepRole #-}
+
+-- | Codensity lowering: runs 't:Codensity' back to underlying monad.
+instance forall base active ms m t3 acc acc' out m' inner.
+  ( Applicative m'
+  , MapPath (Init active) (Codensity m' inner) (m' inner) acc acc'
+  , StepPathMask base active ms m t3 acc' out
+  ) => StepRole PUnCod base active ms m t3 acc out where
+  stepRole f acc =
+    stepPathMask @base @active @ms @m @t3 @acc' @out f
+      (mapPath @(Init active) @(Codensity m' inner) @(m' inner) lowerCodensity acc)
+  {-# INLINE stepRole #-}
+
+-- | Density lifting: lifts comonadic argument into 't:Density'.
+instance (Comonad w, ExpectArrow "StepRole PDenW" acc (Density w a) rTail, wa ~ w a, StepPathMask base '[] ms m t3 rTail out')
+  => StepRole PDenW base '[] ms m t3 acc (wa -> out') where
+  stepRole f acc wa = stepPathMask @base @'[] @ms f (acc (liftDensity wa))
+  {-# INLINE stepRole #-}
+
+instance forall base l ls ms m t3 acc acc' out' w a rTail wa.
+  ( Comonad w, wa ~ w a
+  , MapPath (l ': ls) (Density w a -> rTail) rTail acc acc'
+  , StepPathMask base (l ': ls) ms m t3 acc' out'
+  ) => StepRole PDenW base (l ': ls) ms m t3 acc (wa -> out') where
+  stepRole f acc wa =
+    stepPathMask @base @(l ': ls) @ms @m @t3 @acc' @out' f
+      (mapPath @(l ': ls) @(Density w a -> rTail) @rTail (\g -> g (liftDensity wa)) acc)
+  {-# INLINE stepRole #-}
+
+-- | Density lowering: runs 't:Density' back to underlying comonad.
+instance forall base active ms m t3 acc acc' out w inner.
+  ( Comonad w
+  , MapPath (Init active) (Density w inner) (w inner) acc acc'
+  , StepPathMask base active ms m t3 acc' out
+  ) => StepRole PUnDen base active ms m t3 acc out where
+  stepRole f acc =
+    stepPathMask @base @active @ms @m @t3 @acc' @out f
+      (mapPath @(Init active) @(Density w inner) @(w inner) lowerDensity acc)
+  {-# INLINE stepRole #-}
diff --git a/src/Gongju/Monad.hs b/src/Gongju/Monad.hs
new file mode 100644
--- /dev/null
+++ b/src/Gongju/Monad.hs
@@ -0,0 +1,367 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE FunctionalDependencies #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE RequiredTypeArguments #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UndecidableInstances #-}
+
+-- | Module: Gongju.Monad
+-- Description: Positional Monadic Curried Binding, Multi-Slot Lifting Masks, and Kleisli Arity Chains
+--
+-- Replaces Template Haskell monadic splices (such as 'Control.Monad.Syntax' in 'composition-extra')
+-- with pure type-level Peano induction, bidirectional functional dependencies, and multi-slot
+-- monadic lifting masks.
+--
+-- Provides:
+-- * Two-phase positional monadic binding ('BindAfter', 'BindPos', 'bindPos', 'bindAt').
+-- * Classic monadic binding operators for curried functions:
+--   * Tail binds: '(==<<)', '(===<<)', '(====<<)' and flips '(>>==)', '(>>===)', '(>>====)'.
+--   * Interior binds: '(=.=<<)', '(==.<<)', '(=..<<)' and flips '(>>=.=)', '(>>.==)', '(>>..=)'.
+-- * Multi-slot monadic lifting masks ('LiftMask', 'liftMask', 'ArgMode(Pure, Monadic)').
+-- * Arity-indexed Kleisli composition and pure lifting ('liftPureN', 'bindKleisliN', '(<=<.)', '(<=<..)', '(.>=>)', '(..>=>)').
+module Gongju.Monad
+  ( -- * Two-Phase Positional Monadic Binding
+    BindAfter (..)
+  , BindPos (..)
+  , bindPos
+  , bindAt
+    -- * Tail Monadic Binding Operators (after = 0)
+  , (==<<)
+  , (===<<)
+  , (====<<)
+  , (>>==)
+  , (>>===)
+  , (>>====)
+    -- * Interior Monadic Binding Operators (after > 0)
+  , (=.=<<)
+  , (==.<<)
+  , (=..<<)
+  , (>>=.=)
+  , (>>.==)
+  , (>>..=)
+    -- * Multi-Slot Monadic Lifting Masks
+  , ArgMode (..)
+  , PureArg
+  , MonadicArg
+  , PArg
+  , MArg
+  , LiftMask (..)
+    -- * Arity-Indexed Kleisli Composition & Pure Lifting
+  , liftPureN
+  , bindKleisliN
+  , (<=<.)
+  , (<=<..)
+  , (.>=>)
+  , (..>=>)
+  ) where
+
+import Data.Kind (Type)
+import GHC.TypeLits (Nat)
+import Gongju.Composition (ComposeN (..), compN)
+import Gongju.Peano (Length, Peano (..), ToPeano)
+
+{- Note [Positional Monadic Curried Binding]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+[tag:note-positional-monadic-binding]
+In multi-argument Haskell functions returning a monadic result:
+  @f :: a -> b -> c -> m d@
+one often wishes to bind a monadic value @m b@ into an interior or trailing argument
+slot while leaving all other pure arguments curried outside.
+
+In libraries relying on Template Haskell splices (such as 'composition-extra'),
+separate modules ('Control.Monad.Syntax.Two', '.Three', ..., '.Six') generate fixed
+splices for every permutation of argument count and binding position.
+
+Gongju replaces this combinatorial explosion with two-phase structural Peano induction:
+  1. 'BindAfter (after :: Peano) (m :: Type -> Type) b f g':
+     Floats @after@ trailing pure arguments outside of '(>>=)'.
+     When @after = 0@ (@'Z@), the binding reduces to standard monadic bind @mb >>= f@.
+     When @after > 0@ (@'S after@), applying @f b@ yields a function @c -> r@, not a
+     monadic computation. 'BindAfter' suspends argument @c@, threading it inside the
+     continuation @\b -> f b c@ before executing @mb >>= ...@.
+  2. 'BindPos (before :: Peano) (after :: Peano) (m :: Type -> Type) b f g':
+     Skips @before@ leading pure arguments by peeling them off with lambda abstraction,
+     then delegates to 'BindAfter' to float the remaining @after@ trailing arguments.
+
+Bidirectional functional dependencies:
+  - @before after f -> b m g@: Determines the target argument @b@, monad @m@, and result @g@
+    uniquely from the input function @f@ and position coordinates.
+  - @before after m b g -> f@: Reconstructs the original curried function type @f@ when the
+    bound type and result type are specified.
+-}
+
+-- ---------------------------------------------------------------------------
+-- 1. Two-Phase Positional Monadic Binding (BindAfter & BindPos)
+-- ---------------------------------------------------------------------------
+
+-- | Phase 1: Float @after@ trailing pure arguments outside '(>>=)'.
+--
+-- See Note [Positional Monadic Curried Binding] [ref:note-positional-monadic-binding].
+class Monad m => BindAfter (after :: Peano) (m :: Type -> Type) b f g | after f -> m g, after m b g -> f where
+  -- | Internal inductive worker floating trailing pure arguments outside '(>>=)'.
+  bindAfter' :: (b -> f) -> m b -> g
+
+instance Monad m => BindAfter 'Z m b (m r) (m r) where
+  bindAfter' f mb = mb >>= f
+  {-# INLINE bindAfter' #-}
+
+instance BindAfter after m b r r' => BindAfter ('S after) m b (c -> r) (c -> r') where
+  bindAfter' f mb c = bindAfter' @after (`f` c) mb
+  {-# INLINE bindAfter' #-}
+
+-- | Phase 2: Skip @before@ leading pure arguments, then hand off to 'BindAfter'.
+--
+-- See Note [Positional Monadic Curried Binding] [ref:note-positional-monadic-binding].
+class Monad m => BindPos (before :: Peano) (after :: Peano) (m :: Type -> Type) b f g | before after f -> b m g, before after m b g -> f where
+  -- | Internal inductive worker skipping leading pure arguments.
+  bindPos' :: f -> m b -> g
+
+instance BindAfter after m b rest g => BindPos 'Z after m b (b -> rest) g where
+  bindPos' f mb = bindAfter' @after f mb
+  {-# INLINE bindPos' #-}
+
+instance BindPos before after m b r r' => BindPos ('S before) after m b (a -> r) (a -> r') where
+  bindPos' f mb a = bindPos' @before @after (f a) mb
+  {-# INLINE bindPos' #-}
+
+-- | User-facing positional monadic bind parameterized by visible 'Nat' literals:
+-- @before@ (leading pure arguments to skip) and @after@ (trailing pure arguments to float).
+--
+-- Examples:
+--
+-- >>> let add3 x y z = pure (x + y + z) :: Maybe Int
+-- >>> bindPos @1 @1 add3 (Just 20) 1 3
+-- Just 24
+-- >>> bindPos @0 @2 add3 (Just 10) 2 3
+-- Just 15
+bindPos :: forall (before :: Nat) (after :: Nat) m b f g.
+  BindPos (ToPeano before) (ToPeano after) m b f g => f -> m b -> g
+bindPos = bindPos' @(ToPeano before) @(ToPeano after)
+{-# INLINE bindPos #-}
+
+-- | Top-level positional monadic bind for argument index @n@ (0-indexed) where all
+-- subsequent arguments have already been applied or are pure (@after = 0@).
+--
+-- @bindAt \@0@ corresponds to '(=<<)'.
+-- @bindAt \@1@ corresponds to '(==<<)'.
+-- @bindAt \@2@ corresponds to '(===<<)'.
+--
+-- Example:
+--
+-- >>> let f x y = pure (x * y) :: Maybe Int
+-- >>> bindAt @1 f (Just 7) 6
+-- Just 42
+bindAt :: forall (n :: Nat) m b f g.
+  BindPos (ToPeano n) 'Z m b f g => f -> m b -> g
+bindAt = bindPos' @(ToPeano n) @'Z
+{-# INLINE bindAt #-}
+
+-- ---------------------------------------------------------------------------
+-- 2. Tail Monadic Binding Operators (after = 0)
+-- ---------------------------------------------------------------------------
+
+-- | Infix positional monadic bind at argument slot 1 (@after = 0@).
+-- Binds 'm b' into '(a -> b -> m c)', returning 'a -> m c'.
+infixr 1 ==<<
+(==<<) :: BindPos ('S 'Z) 'Z m b f g => f -> m b -> g
+(==<<) = bindPos' @('S 'Z) @'Z
+{-# INLINE (==<<) #-}
+
+-- | Infix positional monadic bind at argument slot 2 (@after = 0@).
+-- Binds 'm c' into '(a -> b -> c -> m d)', returning 'a -> b -> m d'.
+infixr 1 ===<<
+(===<<) :: BindPos ('S ('S 'Z)) 'Z m b f g => f -> m b -> g
+(===<<) = bindPos' @('S ('S 'Z)) @'Z
+{-# INLINE (===<<) #-}
+
+-- | Infix positional monadic bind at argument slot 3 (@after = 0@).
+-- Binds 'm d' into '(a -> b -> c -> d -> m e)', returning 'a -> b -> c -> m e'.
+infixr 1 ====<<
+(====<<) :: BindPos ('S ('S ('S 'Z))) 'Z m b f g => f -> m b -> g
+(====<<) = bindPos' @('S ('S ('S 'Z))) @'Z
+{-# INLINE (====<<) #-}
+
+-- | Forward positional monadic bind at argument slot 1: @mb >>== f = f ==<< mb@.
+infixl 1 >>==
+(>>==) :: BindPos ('S 'Z) 'Z m b f g => m b -> f -> g
+(>>==) = flip (==<<)
+{-# INLINE (>>==) #-}
+
+-- | Forward positional monadic bind at argument slot 2: @mc >>=== f = f ===<< mc@.
+infixl 1 >>===
+(>>===) :: BindPos ('S ('S 'Z)) 'Z m b f g => m b -> f -> g
+(>>===) = flip (===<<)
+{-# INLINE (>>===) #-}
+
+-- | Forward positional monadic bind at argument slot 3: @md >>==== f = f ====<< md@.
+infixl 1 >>====
+(>>====) :: BindPos ('S ('S ('S 'Z))) 'Z m b f g => m b -> f -> g
+(>>====) = flip (====<<)
+{-# INLINE (>>====) #-}
+
+-- ---------------------------------------------------------------------------
+-- 3. Interior Monadic Binding Operators (after > 0)
+-- ---------------------------------------------------------------------------
+
+-- | Infix positional monadic bind for 3-argument function at slot 1 (@before = 1, after = 1@).
+-- Binds 'm b' into '(a -> b -> c -> m d)', returning 'a -> c -> m d'.
+infixr 1 =.=<<
+(=.=<<) :: BindPos ('S 'Z) ('S 'Z) m b f g => f -> m b -> g
+(=.=<<) = bindPos' @('S 'Z) @('S 'Z)
+{-# INLINE (=.=<<) #-}
+
+-- | Infix positional monadic bind for 3-argument function at slot 0 (@before = 0, after = 2@).
+-- Binds 'm a' into '(a -> b -> c -> m d)', returning 'b -> c -> m d'.
+infixr 1 ==.<<, =..<<
+(==.<<), (=..<<) :: BindPos 'Z ('S ('S 'Z)) m b f g => f -> m b -> g
+(==.<<) = bindPos' @'Z @('S ('S 'Z))
+(=..<<) = bindPos' @'Z @('S ('S 'Z))
+{-# INLINE (==.<<) #-}
+{-# INLINE (=..<<) #-}
+
+-- | Forward positional monadic bind for 3-argument function at slot 1: @mb >>=.= f = f =.=<< mb@.
+infixl 1 >>=.=
+(>>=.=) :: BindPos ('S 'Z) ('S 'Z) m b f g => m b -> f -> g
+(>>=.=) = flip (=.=<<)
+{-# INLINE (>>=.=) #-}
+
+-- | Forward positional monadic bind for 3-argument function at slot 0: @ma >>.== f = f ==.<< ma@.
+infixl 1 >>.==, >>..=
+(>>.==), (>>..=) :: BindPos 'Z ('S ('S 'Z)) m b f g => m b -> f -> g
+(>>.==) = flip (==.<<)
+(>>..=) = flip (=..<<)
+{-# INLINE (>>.==) #-}
+{-# INLINE (>>..=) #-}
+
+{- Note [Multi-Slot Monadic Lifting Masks]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+[tag:note-multislot-monadic-masks]
+In 'Control.Monad.Syntax', operators allow binding only a single monadic argument at a time.
+With a promoted two-element kind 'ArgMode = Pure | Monadic', callers can lift any arbitrary
+subset of a curried function's arguments into 'Monad m' simultaneously in a single pass.
+
+Given @f :: a -> b -> c -> m d@:
+  @liftMask @'[MArg, PArg, MArg] f :: m a -> b -> m c -> m d@
+
+The transformation proceeds inductively on the type-level list @mask :: [ArgMode]@:
+  1. Base case @'[]@: The return type must already be of the form @m r@.
+  2. Pure step @'Pure ': ms@: Leaves the current argument pure @(a -> ...)@ and recurses on @ms@.
+  3. Monadic step @'Monadic ': ms@: Transforms @a@ into @m a@, recurses on @ms@ producing
+     transformed tail @r'@, and uses 'BindAfter (Length ms)' to float all trailing arguments
+     outside the bind. Monadic effects are sequenced strictly from left to right.
+-}
+
+-- ---------------------------------------------------------------------------
+-- 4. Multi-Slot Monadic Lifting Masks (LiftMask)
+-- ---------------------------------------------------------------------------
+
+-- | Argument lifting mode for multi-slot monadic masks.
+-- 'Pure keeps the curried argument as pure @a@.
+-- 'Monadic lifts the argument from @a@ to @m a@ and sequences its monadic effect.
+data ArgMode
+  = Pure     -- ^ Keep the curried argument pure.
+  | Monadic  -- ^ Lift the curried argument into the monad @m@.
+  deriving (Eq, Ord, Show, Enum, Bounded)
+
+-- | Convenient type synonyms for mask annotations.
+type PureArg = 'Pure
+type MonadicArg = 'Monadic
+type PArg = 'Pure
+type MArg = 'Monadic
+
+-- | Multi-slot monadic lifting mask.
+--
+-- Transforms a curried function @f@ into @g@ by lifting arguments marked 'Monadic
+-- into the monad @m@ while preserving pure arguments marked 'Pure'.
+--
+-- See Note [Multi-Slot Monadic Lifting Masks] [ref:note-multislot-monadic-masks].
+class Monad m => LiftMask (mask :: [ArgMode]) (m :: Type -> Type) f g | mask f -> m g, mask m g -> f where
+  -- | Lift a curried function according to the type-level mode mask.
+  liftMask :: f -> g
+
+instance Monad m => LiftMask '[] m (m r) (m r) where
+  liftMask = id
+  {-# INLINE liftMask #-}
+
+instance LiftMask ms m r r' => LiftMask ('Pure ': ms) m (a -> r) (a -> r') where
+  liftMask f a = liftMask @ms (f a)
+  {-# INLINE liftMask #-}
+
+instance (Monad m, BindAfter (Length ms) m a r' g, LiftMask ms m r r')
+  => LiftMask ('Monadic ': ms) m (a -> r) (m a -> g) where
+  liftMask f ma = bindAfter' @(Length ms) (liftMask @ms . f) ma
+  {-# INLINE liftMask #-}
+
+-- ---------------------------------------------------------------------------
+-- 5. Arity-Indexed Kleisli Composition & Pure Lifting
+-- ---------------------------------------------------------------------------
+
+-- | Lift a pure @n@-ary curried function to produce results inside an 'Applicative' functor.
+--
+-- Equivalent to @compN \@n pure@.
+--
+-- Examples:
+--
+-- >>> liftPureN @1 (+ 1) 5 :: Maybe Int
+-- Just 6
+-- >>> liftPureN @2 (+) 3 4 :: Maybe Int
+-- Just 7
+liftPureN :: forall (n :: Nat) m a f g.
+  (Applicative m, ComposeN (ToPeano n) a (m a) f g) => f -> g
+liftPureN = compN @n pure
+{-# INLINE liftPureN #-}
+
+-- | Post-compose a monadic Kleisli arrow @(b -> m c)@ after an @n@-ary curried monadic function
+-- @(a1 -> ... -> an -> m b)@.
+--
+-- Equivalent to @compN \@n (>>= k)@.
+--
+-- Examples:
+--
+-- >>> let f x y = Just (x + y)
+-- >>> let checkEven z = if even z then Just z else Nothing
+-- >>> bindKleisliN @2 checkEven f 2 4
+-- Just 6
+-- >>> bindKleisliN @2 checkEven f 2 3
+-- Nothing
+bindKleisliN :: forall (n :: Nat) m b c f g.
+  (Monad m, ComposeN (ToPeano n) (m b) (m c) f g) => (b -> m c) -> f -> g
+bindKleisliN k = compN @n (>>= k)
+{-# INLINE bindKleisliN #-}
+
+-- | Binary Kleisli composition: post-composes @k :: b -> m c@ onto a binary monadic function.
+--
+-- @(k <=<. f) x y = f x y >>= k@
+infixr 1 <=<.
+(<=<.) :: (Monad m, ComposeN ('S ('S 'Z)) (m b) (m c) f g) => (b -> m c) -> f -> g
+(<=<.) = bindKleisliN @2
+{-# INLINE (<=<.) #-}
+
+-- | Ternary Kleisli composition: post-composes @k :: b -> m c@ onto a ternary monadic function.
+--
+-- @(k <=<.. f) x y z = f x y z >>= k@
+infixr 1 <=<..
+(<=<..) :: (Monad m, ComposeN ('S ('S ('S 'Z))) (m b) (m c) f g) => (b -> m c) -> f -> g
+(<=<..) = bindKleisliN @3
+{-# INLINE (<=<..) #-}
+
+-- | Forward binary Kleisli composition: @(f .>=> k) x y = f x y >>= k@.
+infixr 1 .>=>
+(.>=>) :: (Monad m, ComposeN ('S ('S 'Z)) (m b) (m c) f g) => f -> (b -> m c) -> g
+(.>=>) f k = (<=<.) k f
+{-# INLINE (.>=>) #-}
+
+-- | Forward ternary Kleisli composition: @(f ..>=> k) x y z = f x y z >>= k@.
+infixr 1 ..>=>
+(..>=>) :: (Monad m, ComposeN ('S ('S ('S 'Z))) (m b) (m c) f g) => f -> (b -> m c) -> g
+(..>=>) f k = (<=<..) k f
+{-# INLINE (..>=>) #-}
diff --git a/src/Gongju/Peano.hs b/src/Gongju/Peano.hs
new file mode 100644
--- /dev/null
+++ b/src/Gongju/Peano.hs
@@ -0,0 +1,80 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UndecidableInstances #-}
+
+-- | Module: Gongju.Peano
+-- Description: Bridge between GHC.TypeLits.Nat, inductive Peano data kinds, and type-level list utilities
+--
+-- Provides inductive Peano naturals for driving typeclass induction while exposing
+-- ergonomic 'GHC.TypeLits.Nat' type application interfaces, as well as fundamental
+-- inductive type-level list operations ('Append', 'Init', 'Replicate').
+module Gongju.Peano
+  ( Peano(..)
+  , ToPeano
+  , FromPeano
+  , Append
+  , Init
+  , Replicate
+  , Length
+  ) where
+
+import GHC.TypeLits (Nat, type (-), type (+))
+
+{- Note [Peano TypeLits Bridge]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+[tag:note-peano-typelits-bridge]
+GHC's built-in 'GHC.TypeLits.Nat' represents numeric type literals (0, 1, 2, ...) as
+known runtime symbols, which provides clean ergonomics for call sites (e.g. @compN @3@).
+However, GHC's constraint solver cannot inductively pattern-match on '0' versus 'n + 1'
+during standard typeclass instance resolution without generating overlapping or undecidable
+instance loops.
+
+Conversely, a custom inductive Peano data kind ('Z | 'S Peano) drives typeclass resolution
+and bidirectional functional dependencies effortlessly by structurally peeling one successor
+layer at a time.
+
+By defining closed type families 'ToPeano' and 'FromPeano', Gongju bridges these two representations:
+  - Callers use familiar numeric literals (@0, @1, @2, ...).
+  - Typeclasses induct upon structural 'Peano' terms ('Z, 'S 'Z, 'S ('S 'Z), ...).
+-}
+
+-- | Inductive Peano natural numbers at the type level.
+data Peano = Z | S Peano
+  deriving (Eq, Show)
+
+-- | Convert a 'GHC.TypeLits.Nat' into an inductive 'Peano' representation.
+--
+-- See Note [Peano TypeLits Bridge] [ref:note-peano-typelits-bridge].
+type family ToPeano (n :: Nat) :: Peano where
+  ToPeano 0 = 'Z
+  ToPeano n = 'S (ToPeano (n - 1))
+
+-- | Convert an inductive 'Peano' representation back to a 'GHC.TypeLits.Nat'.
+type family FromPeano (p :: Peano) :: Nat where
+  FromPeano 'Z     = 0
+  FromPeano ('S p) = 1 + FromPeano p
+
+-- | Concatenate two type-level lists.
+type family Append (xs :: [k]) (ys :: [k]) :: [k] where
+  Append '[]       ys = ys
+  Append (x ': xs) ys = x ': Append xs ys
+
+-- | Return all elements of a type-level list except the last element.
+type family Init (xs :: [k]) :: [k] where
+  Init '[]       = '[]
+  Init '[_]      = '[]
+  Init (x ': xs) = x ': Init xs
+
+-- | Generate a type-level list containing @n@ copies of element @x@.
+type family Replicate (n :: Nat) (x :: k) :: [k] where
+  Replicate 0 _ = '[]
+  Replicate n x = x ': Replicate (n - 1) x
+
+-- | Compute the length of a type-level list as an inductive 'Peano' natural.
+type family Length (xs :: [k]) :: Peano where
+  Length '[]       = 'Z
+  Length (_ ': xs) = 'S (Length xs)
diff --git a/src/Gongju/Permute.hs b/src/Gongju/Permute.hs
new file mode 100644
--- /dev/null
+++ b/src/Gongju/Permute.hs
@@ -0,0 +1,92 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE FunctionalDependencies #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UndecidableInstances #-}
+
+-- | Module: Gongju.Permute
+-- Description: Arbitrary curried function argument permutations via iterated Yank
+--
+-- Enables reordering curried function arguments arbitrarily according to a type-level
+-- permutation list, without tuple-size limits or type-directed ambiguity.
+module Gongju.Permute
+  ( -- * Type Families
+    Adjust
+  , MapAdjust
+  , MapToPeano
+    -- * Arbitrary Permutation
+  , Permute(..)
+  , permute
+  ) where
+
+import GHC.TypeLits (Nat)
+import Gongju.Peano (Peano(..), ToPeano)
+import Gongju.Positional (Yank(..))
+
+{- Note [Iterated Yank Index Adjustment]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+[tag:note-iterated-yank-adjustment]
+Arbitrary argument permutation (e.g. taking f :: a -> b -> c -> d -> r and producing
+c -> a -> d -> b -> r via @'[2, 0, 3, 1]) is achieved by decomposing the permutation
+into sequential 'Yank' operations.
+
+When an argument at index `p` is pulled to position 0:
+  1. Any remaining original target index `i > p` shifts down by 1 in the residual function.
+  2. Any remaining original target index `i < p` retains its relative position.
+
+The closed type family 'Adjust' recalculates remaining indices at each inductive step,
+and 'Permute' recurses over the updated index list. This provides:
+  - Zero tuple size limits (functions of arity 10, 20, 50 can be reordered).
+  - Immunity to duplicate types (e.g. Int -> Int -> Int -> r).
+  - Support for partial permutations (arguments not mentioned in the permutation list
+    remain in their original relative positions at the tail).
+-}
+
+-- | Recalculate index @i@ after an element at position @picked@ has been removed.
+--
+-- See Note [Iterated Yank Index Adjustment] [ref:note-iterated-yank-adjustment].
+type family Adjust (picked :: Peano) (i :: Peano) :: Peano where
+  Adjust 'Z     ('S i) = i
+  Adjust ('S p) ('S i) = 'S (Adjust p i)
+  Adjust _      i      = i
+
+-- | Map 'Adjust' over a type-level list of Peano indices.
+type family MapAdjust (p :: Peano) (ps :: [Peano]) :: [Peano] where
+  MapAdjust _ '[]       = '[]
+  MapAdjust p (i ': is) = Adjust p i ': MapAdjust p is
+
+-- | Convert a type-level list of 'Nat' indices to inductive 'Peano' numbers.
+type family MapToPeano (ns :: [Nat]) :: [Peano] where
+  MapToPeano '[]       = '[]
+  MapToPeano (n ': ns) = ToPeano n ': MapToPeano ns
+
+-- | Inductive class computing the permutation of curried function arguments.
+class Permute (ps :: [Peano]) f g | ps f -> g where
+  -- | Internal worker for executing iterated permutation.
+  permute' :: f -> g
+
+instance Permute '[] f f where
+  permute' = id
+  {-# INLINE permute' #-}
+
+instance (Yank p f arg rest, Permute (MapAdjust p ps) rest rest')
+  => Permute (p ': ps) f (arg -> rest') where
+  permute' f arg = permute' @(MapAdjust p ps) (yank' @p f arg)
+  {-# INLINE permute' #-}
+
+-- | Reorder the arguments of a curried function according to a 0-indexed list of 'Nat' positions.
+--
+-- Example:
+--
+-- >>> let f x y z = (x, y, z)
+-- >>> permute @'[2, 0, 1] f 3 1 2
+-- (1, 2, 3)
+permute :: forall (ns :: [Nat]) f g. Permute (MapToPeano ns) f g => f -> g
+permute = permute' @(MapToPeano ns)
+{-# INLINE permute #-}
diff --git a/src/Gongju/Positional.hs b/src/Gongju/Positional.hs
new file mode 100644
--- /dev/null
+++ b/src/Gongju/Positional.hs
@@ -0,0 +1,150 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE FunctionalDependencies #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE UndecidableSuperClasses #-}
+
+-- | Module: Gongju.Positional
+-- Description: Guarded arrow unification and positional combinators (Yank, Shove, Twist)
+--
+-- Provides inductive combinators for manipulating curried function arguments by position:
+-- pulling arguments to the front (Yank), pushing arguments deeper (Shove), and swapping
+-- adjacent arguments (Twist), accompanied by guarded error messages for arity mismatches.
+module Gongju.Positional
+  ( -- * Guarded Arrow Unification
+    CheckArrow
+  , ExpectArrow
+    -- * Yank (Pull to Front)
+  , Yank(..)
+  , slipr
+  , yank
+    -- * Shove (Push Deeper)
+  , Shove(..)
+  , slipl
+  , shove
+    -- * Twist (Adjacent Swap)
+  , Twist(..)
+  , twist
+  ) where
+
+import Data.Kind (Constraint, Type)
+import GHC.TypeLits
+  ( ErrorMessage (ShowType, Text, (:$$:), (:<>:))
+  , Nat
+  , Symbol
+  , TypeError
+  )
+import Gongju.Peano (Peano(..), ToPeano)
+
+{- Note [Positional Curried Arrow Manipulation]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+[tag:note-positional-arrow-manipulation]
+Manipulating the positional arguments of curried functions (a0 -> a1 -> ... -> r) is
+conventionally approached by either:
+  1. Converting to an n-tuple via 'Generics.SOP' / 'tuple-sop', which requires finite
+     tuple instances and loses bidirectional type inference.
+  2. Generating dozens of ad-hoc permutations via Template Haskell.
+
+Gongju manipulates curried function arrows directly in place using three fundamental
+primitives:
+  1. 'Yank' ('slipr'): Pulls the n-th argument (0-indexed) to position 0, shifting
+     intervening arguments [0 .. n-1] one slot to the right.
+  2. 'Shove' ('slipl'): Pushes argument 0 into depth n, shifting intervening arguments
+     [1 .. n] one slot to the left.
+  3. 'Twist' ('twist'): Transposes adjacent arguments at depth n and n+1.
+
+Furthermore, 'CheckArrow' and 'ExpectArrow' provide compile-time guard rails that report
+clear, descriptive custom type errors when arity boundaries are exceeded.
+-}
+
+-- | Guard family asserting that type @f@ is a function arrow @(a -> b)@.
+type family CheckArrow (ctx :: Symbol) (f :: Type) :: Constraint where
+  CheckArrow _ (_ -> _) = ()
+  CheckArrow ctx nonFn =
+    TypeError
+      ( 'Text "• [" :<>: 'Text ctx :<>: 'Text "] Arity / Index Mismatch:"
+      ':$$: 'Text "  Expected a function (a -> r), but reached: " :<>: 'ShowType nonFn
+      )
+
+-- | Constraint requiring @f@ to unify with @(a -> r)@ with diagnostic context @ctx@.
+class (CheckArrow ctx f, f ~ (a -> r)) => ExpectArrow (ctx :: Symbol) f a r
+instance (CheckArrow ctx f, f ~ (a -> r)) => ExpectArrow ctx f a r
+
+-- | Pull the @n@-th curried argument (0-indexed) to the front position.
+--
+-- See Note [Positional Curried Arrow Manipulation] [ref:note-positional-arrow-manipulation].
+class Yank (n :: Peano) f target rest | n f -> target rest where
+  -- | Internal worker for pulling the @n@-th argument forward.
+  yank' :: f -> target -> rest
+
+instance ExpectArrow "Yank" (a -> r) a r => Yank 'Z (a -> r) a r where
+  yank' f target = f target
+  {-# INLINE yank' #-}
+
+instance (ExpectArrow "Yank" (a -> r) a r, Yank n r target rest')
+  => Yank ('S n) (a -> r) target (a -> rest') where
+  yank' f target a = yank' @n (f a) target
+  {-# INLINE yank' #-}
+
+-- | Pull the @n@-th argument (0-indexed) to position 0.
+--
+-- Equivalent to @slipr@ in 'composition-extra'.
+slipr :: forall (n :: Nat) f target rest. Yank (ToPeano n) f target rest => f -> target -> rest
+slipr = yank' @(ToPeano n)
+{-# INLINE slipr #-}
+
+-- | User-facing synonym for 'slipr': pulls the @n@-th argument (0-indexed) to position 0.
+yank :: forall (n :: Nat) f target rest. Yank (ToPeano n) f target rest => f -> target -> rest
+yank = yank' @(ToPeano n)
+{-# INLINE yank #-}
+
+-- | Push the 0-th argument into position @n@, shifting arguments 1 through @n@ to the left.
+class Shove (n :: Peano) a rest f | n a rest -> f, n f -> a rest where
+  -- | Internal worker for pushing the head argument deeper.
+  shove' :: (a -> rest) -> f
+
+instance Shove 'Z a r (a -> r) where
+  shove' = id
+  {-# INLINE shove' #-}
+
+instance Shove n a rest r => Shove ('S n) a (b -> rest) (b -> r) where
+  shove' f b = shove' @n (`f` b)
+  {-# INLINE shove' #-}
+
+-- | Push the 0-th argument into position @n@.
+--
+-- Equivalent to @slipl@ in 'composition-extra'.
+slipl :: forall (n :: Nat) a rest f. Shove (ToPeano n) a rest f => (a -> rest) -> f
+slipl = shove' @(ToPeano n)
+{-# INLINE slipl #-}
+
+-- | User-facing synonym for 'slipl': pushes the 0-th argument into position @n@.
+shove :: forall (n :: Nat) a rest f. Shove (ToPeano n) a rest f => (a -> rest) -> f
+shove = shove' @(ToPeano n)
+{-# INLINE shove #-}
+
+-- | Swap adjacent arguments at depth @n@ and @n + 1@.
+class Twist (n :: Peano) f g | n f -> g, n g -> f where
+  -- | Internal worker for transposing adjacent arguments.
+  twist' :: f -> g
+
+instance Twist 'Z (a -> b -> r) (b -> a -> r) where
+  twist' = flip
+  {-# INLINE twist' #-}
+
+instance Twist n r r' => Twist ('S n) (a -> r) (a -> r') where
+  twist' f a = twist' @n (f a)
+  {-# INLINE twist' #-}
+
+-- | Swap adjacent arguments at depth @n@ and @n + 1@.
+twist :: forall (n :: Nat) f g. Twist (ToPeano n) f g => f -> g
+twist = twist' @(ToPeano n)
+{-# INLINE twist #-}
diff --git a/src/Gongju/Profunctor.hs b/src/Gongju/Profunctor.hs
new file mode 100644
--- /dev/null
+++ b/src/Gongju/Profunctor.hs
@@ -0,0 +1,412 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE FunctionalDependencies #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE RequiredTypeArguments #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE UndecidableSuperClasses #-}
+
+-- | Module: Gongju.Profunctor
+-- Description: Profunctors, Indexed Profunctors, and Effect Handler Permutations for Gongju
+--
+-- Plugs canonical 'Profunctor' from 'Data.Profunctor' and 'IxProfunctor' from
+-- 'Data.Profunctor.Indexed' into Gongju's open tape composition engine, and provides
+-- zero-cost argument permutations for binary profunctor strands and curried effect handlers
+-- (such as in @kernmantle-polytropos@).
+--
+-- Supports:
+-- * Contravariant input pre-processing via 'P1' / 'lmap'.
+-- * Covariant output post-processing via 'P2' / 'rmap'.
+-- * Simultaneous bidirectional mapping via 'dimap'.
+-- * Curried category spine generalization and point-free permutations ('CurriedCat', 'ComposeCatN', 'YankCat', 'PermuteCat').
+-- * Tuple-spine arrow input/output permutations ('YankTuple', 'PermuteTuple', 'permuteInputs', 'permuteOutputs', 'dimapPermute').
+-- * Curried effect handler environment reordering ('permuteHandler', 'compHandlerN').
+module Gongju.Profunctor
+  ( -- * Re-exported Canonical Profunctor Classes
+    Profunctor(..)
+  , dimap'
+  , lmap'
+  , rmap'
+    -- * Re-exported Indexed Profunctors
+  , IxProfunctor
+  , ixcontramap
+    -- * Open Profunctor Tags
+  , P1
+  , P2
+    -- * Ergonomic Aliases
+  , PP1
+  , PP2
+    -- * Curried Category Permutations
+  , CurriedCat (..)
+  , ComposeCatN (..)
+  , compCatN
+  , YankCat (..)
+  , yankCat
+  , PermuteCat (..)
+  , permuteCat
+    -- * Tuple-Spine Arrow Permutations
+  , YankTuple (..)
+  , yankTuple
+  , PermuteTuple (..)
+  , permuteTuple
+    -- * Profunctor Strand Permutations
+  , permuteInputs
+  , permuteOutputs
+  , dimapPermute
+  , swapStrand
+    -- * Curried Effect Handler Permutations
+  , permuteHandler
+  , compHandlerN
+  ) where
+
+import Control.Arrow (Arrow (arr, second))
+import Control.Category (Category)
+import qualified Control.Category as Cat
+import Data.Kind (Type)
+import qualified Data.Profunctor as P
+import Data.Profunctor
+  ( Profunctor (..)
+  )
+import qualified Data.Profunctor.Indexed as IxP
+import GHC.TypeLits (Nat)
+import Gongju.Composition
+  ( ComposeN (..)
+  , InOrder
+  , MapPath (..)
+  , MapStep (..)
+  , PL
+  , compN
+  )
+import Gongju.Peano (Peano (..), ToPeano)
+import Gongju.Permute
+  ( MapAdjust
+  , MapToPeano
+  , Permute (..)
+  , permute
+  )
+import Prelude hiding (id)
+
+{- Note [Profunctor Effect Handler Permutations]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+[tag:note-profunctor-handler-permutations]
+In arrow-based architectures and profunctor effect frameworks (such as 'kernmantle'
+and 'kernmantle-polytropos'), effect strands are modeled as binary profunctors:
+  @strand :: Type -> Type -> Type@
+while effect handlers are curried functions taking environment configuration parameters
+before producing or interpreting a strand:
+  @handler :: env1 -> env2 -> ... -> p a b@
+
+Permuting profunctor handlers requires addressing two distinct structural axes:
+  1. Curried environment parameter permutations:
+     Reordering @env1 -> env2 -> ... -> envk@ via 'permuteHandler @ns' (which delegates
+     to Gongju's Peano-indexed 'Permute' engine).
+  2. Curried category spine generalization:
+     Generalizing from @(->)@ to an arbitrary Cartesian Closed Category ('CurriedCat cat')
+     via 'YankCat' and 'PermuteCat'. Here, arguments are permuted point-free using only
+     'catFlip' and category composition '(.)', never inspecting or allocating Haskell values.
+-}
+
+{- Note [Tuple-Spine Arrow Permutations]
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+[tag:note-tuple-spine-permutations]
+When binary profunctors or arrows consume multiple arguments simultaneously, they package
+their input domain as right-nested tuples:
+  @(a0, (a1, (a2, ())))@
+
+Permuting slots in an arrow input spine requires structural induction dual to curried 'Yank':
+  1. 'YankTuple (n :: Peano) arr s t':
+     Pulls the @n@-th slot of the nested tuple to position 0.
+     - Base case (@'Z@): The 0-th element is already at the head; returns 'Cat.id'.
+     - Step case (@'S n@): Recursively pulls the @n@-th slot in the tail @r@ via
+       'second (yankTuple @n)', then swaps the head and extracted slot using
+       'arr (\(a, (target, rest)) -> (target, (a, rest)))'.
+  2. 'PermuteTuple (ps :: [Peano]) arr s t':
+     Iterates 'YankTuple' across a permutation index list, updating residual indices
+     at each step with 'MapAdjust'.
+  3. 'permuteInputs @ns' and 'permuteOutputs @ns':
+     For any 'Profunctor p', pre-composing 'lmap (permuteTuple @ns)' or post-composing
+     'rmap (permuteTuple @ns)' reorders the strand's input or output domain directly
+     with zero runtime tuple packaging overhead.
+-}
+
+-- ---------------------------------------------------------------------------
+-- 1. Open Profunctor Tags & Re-exports
+-- ---------------------------------------------------------------------------
+
+-- | Profunctor first slot tag (contravariant).
+data P1
+
+-- | Profunctor second slot tag (covariant).
+data P2
+
+-- | In-order profunctor first-slot (contravariant) mapping alias.
+type PP1 = InOrder (PL '[P1])
+
+-- | In-order profunctor second-slot (covariant) mapping alias.
+type PP2 = InOrder (PL '[P2])
+
+-- | Type alias specializing 'Data.Profunctor.Indexed.Profunctor' as 'IxProfunctor'.
+type IxProfunctor = IxP.Profunctor
+
+-- | Re-export indexed profunctor index contramap.
+ixcontramap :: IxProfunctor p => (j -> i) -> p i a b -> p j a b
+ixcontramap = IxP.ixcontramap
+{-# INLINE ixcontramap #-}
+
+-- | Strict variant of 'dimap'.
+dimap' :: Profunctor p => (a -> b) -> (c -> d) -> p b c -> p a d
+dimap' = P.dimap
+{-# INLINE dimap' #-}
+
+-- | Strict variant of 'lmap'.
+lmap' :: Profunctor p => (a -> b) -> p b c -> p a c
+lmap' = P.lmap
+{-# INLINE lmap' #-}
+
+-- | Strict variant of 'rmap'.
+rmap' :: Profunctor p => (b -> c) -> p a b -> p a c
+rmap' = P.rmap
+{-# INLINE rmap' #-}
+
+-- ---------------------------------------------------------------------------
+-- 2. MapStep Instances for Profunctor Layers
+-- ---------------------------------------------------------------------------
+
+-- | Pre-compose argument 1 of a Profunctor contravariantly via 'lmap'.
+instance (Profunctor p, s ~ p b c, t ~ p a c, MapPath ls a b a b)
+  => MapStep P1 ls a b s t where
+  mapStep f = P.lmap (mapPath @ls f)
+  {-# INLINE mapStep #-}
+
+-- | Post-compose argument 2 of a Profunctor covariantly via 'rmap'.
+instance (Profunctor p, s ~ p a b, t ~ p a c, MapPath ls b c b c)
+  => MapStep P2 ls b c s t where
+  mapStep f = P.rmap (mapPath @ls f)
+  {-# INLINE mapStep #-}
+
+-- ---------------------------------------------------------------------------
+-- 3. Curried Category Permutations (CurriedCat)
+-- ---------------------------------------------------------------------------
+
+-- | Cartesian Closed Category / Curried Category with morphism flipping and application.
+--
+-- See Note [Profunctor Effect Handler Permutations] [ref:note-profunctor-handler-permutations].
+class Category cat => CurriedCat (cat :: Type -> Type -> Type) where
+  -- | Post-compose a transformation onto the return slot of a morphism in @cat@.
+  catMap :: (b -> c) -> cat a b -> cat a c
+  -- | Swap the first two curried inputs of a morphism in @cat@.
+  catFlip :: cat a (cat b c) -> cat b (cat a c)
+  -- | Bridge morphism execution from Haskell values.
+  catApply :: cat a b -> a -> b
+
+instance CurriedCat (->) where
+  catMap f g = f . g
+  catFlip f b a = f a b
+  catApply f x = f x
+  {-# INLINE catMap #-}
+  {-# INLINE catFlip #-}
+  {-# INLINE catApply #-}
+
+-- | Generalized arity composition over a 'Category' @cat@ at the leaf.
+class Category cat => ComposeCatN (n :: Peano) (cat :: Type -> Type -> Type) x y z g out | n g -> cat x y, n cat y z g -> out where
+  -- | Internal inductive worker for category composition.
+  composeCatN' :: cat y z -> g -> out
+
+instance (Category cat, g ~ cat x y, out ~ cat x z) => ComposeCatN 'Z cat x y z g out where
+  composeCatN' f g = f Cat.. g
+  {-# INLINE composeCatN' #-}
+
+instance ( Category cat
+         , ComposeCatN n cat x y z r r'
+         , g ~ (a -> r)
+         , out ~ (a -> r')
+         ) => ComposeCatN ('S n) cat x y z g out where
+  composeCatN' f g a = composeCatN' @n @cat @x @y @z f (g a)
+  {-# INLINE composeCatN' #-}
+
+-- | User-facing arity composition over any 'Category' @cat@.
+compCatN :: forall (n :: Nat) cat x y z g out.
+  ComposeCatN (ToPeano n) cat x y z g out => cat y z -> g -> out
+compCatN = composeCatN' @(ToPeano n) @cat @x @y @z
+{-# INLINE compCatN #-}
+
+-- | Point-free bubbling of the @n@-th curried category input using 'catFlip' and 'catMap'.
+--
+-- See Note [Profunctor Effect Handler Permutations] [ref:note-profunctor-handler-permutations].
+class CurriedCat cat => YankCat (n :: Peano) (cat :: Type -> Type -> Type) f g | n f -> g where
+  -- | Internal inductive worker pulling the @n@-th input to position 0.
+  yankCat' :: f -> g
+
+instance (CurriedCat cat, f ~ cat a r, g ~ cat a r) => YankCat 'Z cat f g where
+  yankCat' = Cat.id
+  {-# INLINE yankCat' #-}
+
+instance ( CurriedCat cat
+         , f ~ cat a r
+         , r' ~ cat target rest
+         , g ~ cat target (cat a rest)
+         , YankCat n cat r r'
+         ) => YankCat ('S n) cat f g where
+  yankCat' f = catFlip (catMap (yankCat' @n @cat) f)
+  {-# INLINE yankCat' #-}
+
+-- | User-facing positional yank over any 'CurriedCat'.
+yankCat :: forall (n :: Nat) cat f g.
+  YankCat (ToPeano n) cat f g => f -> g
+yankCat = yankCat' @(ToPeano n) @cat
+{-# INLINE yankCat #-}
+
+-- | Arbitrary permutation of curried category inputs over any 'CurriedCat'.
+--
+-- See Note [Profunctor Effect Handler Permutations] [ref:note-profunctor-handler-permutations].
+class CurriedCat cat => PermuteCat (ps :: [Peano]) (cat :: Type -> Type -> Type) f g | ps f -> g where
+  -- | Internal inductive worker executing iterated point-free permutation.
+  permuteCat' :: f -> g
+
+instance (CurriedCat cat, f ~ g) => PermuteCat '[] cat f g where
+  permuteCat' = Cat.id
+  {-# INLINE permuteCat' #-}
+
+instance ( CurriedCat cat
+         , mid ~ cat arg rest
+         , g ~ cat arg rest'
+         , YankCat p cat f mid
+         , PermuteCat (MapAdjust p ps) cat rest rest'
+         ) => PermuteCat (p ': ps) cat f g where
+  permuteCat' f = catMap (permuteCat' @(MapAdjust p ps) @cat) (yankCat' @p @cat f)
+  {-# INLINE permuteCat' #-}
+
+-- | User-facing permutation of curried category inputs.
+permuteCat :: forall (ns :: [Nat]) cat f g.
+  PermuteCat (MapToPeano ns) cat f g => f -> g
+permuteCat = permuteCat' @(MapToPeano ns) @cat
+{-# INLINE permuteCat #-}
+
+-- ---------------------------------------------------------------------------
+-- 4. Tuple-Spine Arrow Permutations (YankTuple & PermuteTuple)
+-- ---------------------------------------------------------------------------
+
+-- | Pull the @n@-th element of a right-nested tuple @s@ to the front.
+--
+-- See Note [Tuple-Spine Arrow Permutations] [ref:note-tuple-spine-permutations].
+class Arrow ar => YankTuple (n :: Peano) (ar :: Type -> Type -> Type) s t | n s -> t where
+  -- | Internal inductive worker pulling the @n@-th tuple slot to position 0.
+  yankTuple' :: ar s t
+
+instance Arrow ar => YankTuple 'Z ar s s where
+  yankTuple' = Cat.id
+  {-# INLINE yankTuple' #-}
+
+instance ( Arrow ar
+         , YankTuple n ar r (target, rest)
+         ) => YankTuple ('S n) ar (a, r) (target, (a, rest)) where
+  yankTuple' = arr (\(a, (target, rest)) -> (target, (a, rest))) Cat.. second (yankTuple' @n @ar)
+  {-# INLINE yankTuple' #-}
+
+-- | User-facing tuple slot yank for any 'Arrow'.
+yankTuple :: forall (n :: Nat) ar s t.
+  YankTuple (ToPeano n) ar s t => ar s t
+yankTuple = yankTuple' @(ToPeano n) @ar
+{-# INLINE yankTuple #-}
+
+-- | Arbitrary permutation of slots in a right-nested tuple spine for an 'Arrow'.
+--
+-- See Note [Tuple-Spine Arrow Permutations] [ref:note-tuple-spine-permutations].
+class Arrow ar => PermuteTuple (ps :: [Peano]) (ar :: Type -> Type -> Type) s t | ps s -> t where
+  -- | Internal inductive worker executing iterated tuple slot permutation.
+  permuteTuple' :: ar s t
+
+instance Arrow ar => PermuteTuple '[] ar s s where
+  permuteTuple' = Cat.id
+  {-# INLINE permuteTuple' #-}
+
+instance ( Arrow ar
+         , mid ~ (arg, rest)
+         , t ~ (arg, rest')
+         , YankTuple p ar s mid
+         , PermuteTuple (MapAdjust p ps) ar rest rest'
+         ) => PermuteTuple (p ': ps) ar s t where
+  permuteTuple' = second (permuteTuple' @(MapAdjust p ps) @ar) Cat.. yankTuple' @p @ar
+  {-# INLINE permuteTuple' #-}
+
+-- | User-facing tuple spine permutation for any 'Arrow'.
+--
+-- Examples:
+--
+-- >>> let t = (10 :: Int, (20 :: Int, (30 :: Int, ())))
+-- >>> permuteTuple @'[2, 0, 1] t
+-- (30,(10,(20,())))
+permuteTuple :: forall (ns :: [Nat]) ar s t.
+  PermuteTuple (MapToPeano ns) ar s t => ar s t
+permuteTuple = permuteTuple' @(MapToPeano ns) @ar
+{-# INLINE permuteTuple #-}
+
+-- ---------------------------------------------------------------------------
+-- 5. Profunctor Strand Permutations
+-- ---------------------------------------------------------------------------
+
+-- | Permute the right-nested tuple input spine of a 'Profunctor' according to visible 'Nat' list @ns@.
+--
+-- See Note [Tuple-Spine Arrow Permutations] [ref:note-tuple-spine-permutations].
+permuteInputs :: forall (ns :: [Nat]) p s t b.
+  (Profunctor p, PermuteTuple (MapToPeano ns) (->) s t) => p t b -> p s b
+permuteInputs = P.lmap (permuteTuple @ns)
+{-# INLINE permuteInputs #-}
+
+-- | Permute the right-nested tuple output spine of a 'Profunctor' according to visible 'Nat' list @ns@.
+--
+-- See Note [Tuple-Spine Arrow Permutations] [ref:note-tuple-spine-permutations].
+permuteOutputs :: forall (ns :: [Nat]) p a s t.
+  (Profunctor p, PermuteTuple (MapToPeano ns) (->) s t) => p a s -> p a t
+permuteOutputs = P.rmap (permuteTuple @ns)
+{-# INLINE permuteOutputs #-}
+
+-- | Simultaneously permute both the input and output tuple spines of a 'Profunctor'.
+dimapPermute :: forall (nsIn :: [Nat]) (nsOut :: [Nat]) p sIn tIn sOut tOut.
+  ( Profunctor p
+  , PermuteTuple (MapToPeano nsIn) (->) sIn tIn
+  , PermuteTuple (MapToPeano nsOut) (->) sOut tOut
+  ) => p tIn sOut -> p sIn tOut
+dimapPermute = P.dimap (permuteTuple @nsIn) (permuteTuple @nsOut)
+{-# INLINE dimapPermute #-}
+
+-- | Swap the binary pair inputs of a 'Profunctor' strand: @p (b, a) c -> p (a, b) c@.
+swapStrand :: Profunctor p => p (b, a) c -> p (a, b) c
+swapStrand = P.lmap (\(a, b) -> (b, a))
+{-# INLINE swapStrand #-}
+
+-- ---------------------------------------------------------------------------
+-- 6. Curried Effect Handler Permutations
+-- ---------------------------------------------------------------------------
+
+-- | Permute the leading curried environment/configuration arguments of an effect handler.
+--
+-- See Note [Profunctor Effect Handler Permutations] [ref:note-profunctor-handler-permutations].
+--
+-- For example, given @handler :: Env1 -> Env2 -> Env3 -> p a b@:
+--
+-- @
+-- let handler' = permuteHandler @'[2, 0, 1] handler
+-- -- handler' now expects: Env3 -> Env1 -> Env2 -> p a b
+-- @
+permuteHandler :: forall (ns :: [Nat]) f g.
+  Permute (MapToPeano ns) f g => f -> g
+permuteHandler = permute @ns
+{-# INLINE permuteHandler #-}
+
+-- | Post-compose an arrow/profunctor transformation onto an @n@-ary curried effect handler.
+--
+-- For example, applying a strand adapter @(p b c -> q a d)@ to @handler :: env1 -> ... -> envn -> p b c@.
+compHandlerN :: forall (n :: Nat) p q a b c d f g.
+  ComposeN (ToPeano n) (p b c) (q a d) f g => (p b c -> q a d) -> f -> g
+compHandlerN = compN @n
+{-# INLINE compHandlerN #-}
diff --git a/test/CoreInspection.hs b/test/CoreInspection.hs
new file mode 100644
--- /dev/null
+++ b/test/CoreInspection.hs
@@ -0,0 +1,189 @@
+{-# LANGUAGE BlockArguments #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE TypeApplications #-}
+
+-- | Module: CoreInspection
+-- Description: Representative pipelines for mechanical GHC Core zero-cost verification
+--
+-- This module defines concrete, representative combinator pipelines over curried functions,
+-- tuples, monadic bindings, contravariant syntax grids, and profunctor effect handlers.
+--
+-- When compiled under @-O2@, GHC's Simplifier must beta-reduce and inline every single one of
+-- these definitions down to direct lambda expressions with ZERO dictionary allocations and
+-- ZERO indirect typeclass calls ($fComposeN, $fPermute, $fYank, $fPrecomposeAt, $fBindPos, etc.).
+--
+-- Tested and mechanically verified against:
+-- Note [Zero-Cost Inlining and Core Simplification] [ref:note-zero-cost-core-simplification].
+module CoreInspection
+  ( -- * Variadic Composition Fixtures
+    testComp2
+  , testComp3
+    -- * Positional Arrow Manipulation Fixtures
+  , testSlipr1
+  , testSlipl2
+  , testTwist1
+  , testYank1
+  , testShove2
+    -- * Arbitrary Permutation Fixtures
+  , testPermute3
+    -- * Contravariant Grid & Splicing Fixtures
+  , testPrecompose1
+  , testSplice12
+    -- * Positional Monadic Binding Fixtures
+  , testBind1
+  , testBindPos11
+  , testLiftPure2
+    -- * Tuple-Spine Arrow Permutations
+  , testPermuteTuple3
+  , testPermuteInputs
+  , testSwapStrand
+    -- * Curried Category & Handler Permutations
+  , testCatFlip
+  , testCatApply
+  , testCompCat2
+  , testYankCat1
+  , testPermuteCat3
+  , testPermuteHandler3
+  ) where
+
+import Gongju.Core
+
+-- ---------------------------------------------------------------------------
+-- 1. Variadic Arity Composition
+-- ---------------------------------------------------------------------------
+
+-- | Variadic composition over a binary function: simplifies to @\f g x y -> f (g x y)@.
+testComp2 :: (Int -> Int) -> (Int -> Int -> Int) -> Int -> Int -> Int
+testComp2 f g x y = compN @2 f g x y
+{-# NOINLINE testComp2 #-}
+
+-- | Variadic composition over a ternary function: simplifies to @\f g x y z -> f (g x y z)@.
+testComp3 :: (Int -> Int) -> (Int -> Int -> Int -> Int) -> Int -> Int -> Int -> Int
+testComp3 f g x y z = compN @3 f g x y z
+{-# NOINLINE testComp3 #-}
+
+-- ---------------------------------------------------------------------------
+-- 2. Positional Curried Arrow Manipulation
+-- ---------------------------------------------------------------------------
+
+-- | Pull argument 1 to position 0 via 'slipr': simplifies to @\f y x -> f x y@.
+testSlipr1 :: (Int -> Int -> Int) -> Int -> Int -> Int
+testSlipr1 f y x = slipr @1 f y x
+{-# NOINLINE testSlipr1 #-}
+
+-- | Push argument 0 to position 2 via 'slipl': simplifies to @\f x y z -> f z x y@.
+testSlipl2 :: (Int -> Int -> Int -> Int) -> Int -> Int -> Int -> Int
+testSlipl2 f x y z = slipl @2 f x y z
+{-# NOINLINE testSlipl2 #-}
+
+-- | Transpose adjacent arguments 1 and 2 via 'twist': simplifies to @\f x z y -> f x y z@.
+testTwist1 :: (Int -> Int -> Int -> Int) -> Int -> Int -> Int -> Int
+testTwist1 f x z y = twist @1 f x z y
+{-# NOINLINE testTwist1 #-}
+
+-- | Synonym 'yank' pulling argument 1 to position 0: simplifies to @\f y x -> f x y@.
+testYank1 :: (Int -> Int -> Int) -> Int -> Int -> Int
+testYank1 f y x = yank @1 f y x
+{-# NOINLINE testYank1 #-}
+
+-- | Synonym 'shove' pushing argument 0 to position 2: simplifies to @\f x y z -> f z x y@.
+testShove2 :: (Int -> Int -> Int -> Int) -> Int -> Int -> Int -> Int
+testShove2 f x y z = shove @2 f x y z
+{-# NOINLINE testShove2 #-}
+
+-- ---------------------------------------------------------------------------
+-- 3. Arbitrary Permutations
+-- ---------------------------------------------------------------------------
+
+-- | Permute ternary arguments @'[2, 0, 1]@: simplifies to @\f z x y -> f x y z@.
+testPermute3 :: (Int -> Int -> Int -> Int) -> Int -> Int -> Int -> Int
+testPermute3 f z x y = permute @'[2, 0, 1] f z x y
+{-# NOINLINE testPermute3 #-}
+
+-- ---------------------------------------------------------------------------
+-- 4. Contravariant Syntax Grids & 2D Splicing
+-- ---------------------------------------------------------------------------
+
+-- | Precompose at argument slot 1: simplifies to @\h f x y -> f x (h y)@.
+testPrecompose1 :: (Int -> Int) -> (Int -> Int -> Int) -> Int -> Int -> Int
+testPrecompose1 h f x y = precomposeAt @1 h f x y
+{-# NOINLINE testPrecompose1 #-}
+
+-- | Splice a binary function into slot 1 of a ternary function:
+-- simplifies to @\h f x u v z -> f x (h u v) z@.
+testSplice12 :: (Int -> Int -> Int) -> (Int -> Int -> Int -> Int) -> Int -> Int -> Int -> Int -> Int
+testSplice12 h f x u v z = spliceAt @1 @2 h f x u v z
+{-# NOINLINE testSplice12 #-}
+
+-- ---------------------------------------------------------------------------
+-- 5. Positional Monadic Binding
+-- ---------------------------------------------------------------------------
+
+-- | Monadic bind at slot 1: simplifies to direct pattern matching on 'mb'.
+testBind1 :: (Int -> Int -> Maybe Int) -> Maybe Int -> Int -> Maybe Int
+testBind1 f mb x = bindAt @1 f mb x
+{-# NOINLINE testBind1 #-}
+
+-- | Interior monadic bind at slot 1 with 1 trailing argument:
+-- simplifies to direct pattern matching on 'mb' and application to 'z'.
+testBindPos11 :: (Int -> Int -> Int -> Maybe Int) -> Maybe Int -> Int -> Int -> Maybe Int
+testBindPos11 f mb x z = bindPos @1 @1 f mb x z
+{-# NOINLINE testBindPos11 #-}
+
+-- | Pure lifting of binary function into 'Monad': simplifies to @\f x y -> Just (f x y)@.
+testLiftPure2 :: (Int -> Int -> Int) -> Int -> Int -> Maybe Int
+testLiftPure2 f x y = liftPureN @2 f x y
+{-# NOINLINE testLiftPure2 #-}
+
+-- ---------------------------------------------------------------------------
+-- 6. Right-Nested Tuple-Spine Arrow Permutations
+-- ---------------------------------------------------------------------------
+
+-- | Reorder right-nested 3-tuple spine: simplifies to direct nested unboxing and tuple construction.
+testPermuteTuple3 :: (Int, (Int, (Int, ()))) -> (Int, (Int, (Int, ())))
+testPermuteTuple3 t = permuteTuple @'[2, 0, 1] t
+{-# NOINLINE testPermuteTuple3 #-}
+
+-- | Reorder input tuple spine of a profunctor strand: simplifies to direct projection into @p@.
+testPermuteInputs :: ((Int, (Int, (Int, ()))) -> Int) -> (Int, (Int, (Int, ()))) -> Int
+testPermuteInputs p inp = permuteInputs @'[2, 0, 1] p inp
+{-# NOINLINE testPermuteInputs #-}
+
+-- | Swap inputs of binary pair profunctor strand: simplifies to @\p inp -> p (case inp of (a, b) -> (b, a))@.
+testSwapStrand :: ((Int, Int) -> Int) -> (Int, Int) -> Int
+testSwapStrand p inp = swapStrand p inp
+{-# NOINLINE testSwapStrand #-}
+
+-- ---------------------------------------------------------------------------
+-- 7. Curried Category & Effect Handler Permutations
+-- ---------------------------------------------------------------------------
+
+-- | Curried category morphism argument swap: simplifies to @\f y x -> f x y@.
+testCatFlip :: (Int -> Int -> Int) -> Int -> Int -> Int
+testCatFlip f y x = catFlip f y x
+{-# NOINLINE testCatFlip #-}
+
+-- | Bridge category morphism application: simplifies to @\f x y -> f x y@.
+testCatApply :: (Int -> Int -> Int) -> Int -> Int -> Int
+testCatApply f x y = catApply f x y
+{-# NOINLINE testCatApply #-}
+
+-- | Curried category arity composition: simplifies to @\g f x y z -> g (f x y z)@.
+testCompCat2 :: (Int -> Int) -> (Int -> Int -> Int -> Int) -> Int -> Int -> Int -> Int
+testCompCat2 g f x y z = compCatN @2 g f x y z
+{-# NOINLINE testCompCat2 #-}
+
+-- | Pull category input at position 1 forward: simplifies to @\f y x -> f x y@.
+testYankCat1 :: (Int -> Int -> Int) -> Int -> Int -> Int
+testYankCat1 f y x = yankCat @1 f y x
+{-# NOINLINE testYankCat1 #-}
+
+-- | Arbitrary category input permutation: simplifies to @\f z x y -> f x y z@.
+testPermuteCat3 :: (Int -> Int -> Int -> Int) -> Int -> Int -> Int -> Int
+testPermuteCat3 f z x y = permuteCat @'[2, 0, 1] f z x y
+{-# NOINLINE testPermuteCat3 #-}
+
+-- | Effect handler environment parameter permutation: simplifies to @\h z x y env -> h x y z env@.
+testPermuteHandler3 :: (Int -> Int -> Int -> Int -> Int) -> Int -> Int -> Int -> Int -> Int
+testPermuteHandler3 h z x y env = permuteHandler @'[2, 0, 1] h z x y env
+{-# NOINLINE testPermuteHandler3 #-}
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,521 @@
+{-# LANGUAGE BlockArguments #-}
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PolyKinds #-}
+{-# LANGUAGE RequiredTypeArguments #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TupleSections #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+
+-- | Test Suite for Gongju: Grand Unified Open-World Tape Engine and Permutation Library
+--
+-- Validates:
+-- * Peano natural transformations and bidirectional fundep inference.
+-- * Variadic composition and open-world tape execution via visible-forall (.@).
+-- * Positional combinators (slipr, slipl, twist) and arbitrary permutation (permute).
+-- * Indexed monad and comonad transitions (IxFunctor, IxPointed, IxApplicative, IxMonad).
+-- * Canonical comonads, distributive functors, and representable commute laws.
+-- * Canonical adjunctions with dual annihilation (zapLR, zapRL, unit, counit).
+-- * Canonical Kan extensions (Ran, Lan), Yoneda fusion, and Codensity CPS optimizations.
+-- * Canonical profunctors with contravariant/covariant slot mappings.
+module Main (main) where
+
+import Test.Hspec
+import Data.Functor.Identity (Identity (..))
+import Gongju.Core
+import CoreInspection
+
+-- | Minimal Comonad fixture for verifying cokleisli extension via 'W'.
+-- Implements canonical 'Control.Comonad.Comonad'.
+newtype IdW a = IdW a
+  deriving (Eq, Show)
+
+instance Functor IdW where
+  fmap f (IdW a) = IdW (f a)
+
+instance Comonad IdW where
+  extract (IdW a) = a
+  duplicate (IdW a) = IdW (IdW a)
+
+-- | Minimal Distributive and Representable Functor fixture (Reader functor).
+-- Validates effect commutation outside a comonad via 'Dist'.
+newtype ReaderR r a = ReaderR { runReaderR :: r -> a }
+
+instance Functor (ReaderR r) where
+  fmap f (ReaderR g) = ReaderR (f . g)
+
+instance Distributive (ReaderR r) where
+  distribute f = ReaderR \r -> fmap (\(ReaderR g) -> g r) f
+
+instance Representable (ReaderR r) where
+  type Rep (ReaderR r) = r
+  tabulate = ReaderR
+  index (ReaderR f) = f
+
+-- | Minimal Indexed State Monad fixture.
+-- Implements canonical 'Data.Functor.Indexed' and 'Control.Monad.Indexed'.
+newtype IxState i j a = IxState { runIxState :: i -> (a, j) }
+
+instance IxFunctor IxState where
+  imap f (IxState g) = IxState \i ->
+    let (a, j) = g i in (f a, j)
+
+instance IxPointed IxState where
+  ireturn a = IxState (a,)
+
+instance IxApplicative IxState where
+  iap (IxState gf) (IxState ga) = IxState \i ->
+    let (f, j) = gf i
+        (a, l) = ga j
+    in (f a, l)
+
+instance IxMonad IxState where
+  ibind k (IxState g) = IxState \i ->
+    let (a, j) = g i
+    in runIxState (k a) j
+
+main :: IO ()
+main = hspec do
+  -- Tested against Note [Peano TypeLits Bridge] [ref:note-peano-typelits-bridge]
+  describe "Gongju.Peano Naturals & List Type Families" do
+    it "converts numeric TypeLits to Peano and verifies term equality" do
+      show (Z :: Peano) `shouldBe` "Z"
+      show (S Z :: Peano) `shouldBe` "S Z"
+
+  -- Tested against Note [Variadic Composition Bidirectional Fundeps] [ref:note-variadic-composition-fundeps]
+  describe "Gongju.Composition Variadic Composition & Tape Engine" do
+    it "compN @1 behaves identically to standard function composition (.)" do
+      let f = (+ 1) :: Int -> Int
+          g = (* 2) :: Int -> Int
+      compN @1 f g 5 `shouldBe` f (g 5)
+
+    it "compN @2 composes over a 2-argument curried function" do
+      let f = show :: Int -> String
+          add2 x y = (x + y :: Int)
+      compN @2 f add2 10 20 `shouldBe` "30"
+
+    it "compN @3 composes over a 3-argument curried function" do
+      let f = (* 2) :: Int -> Int
+          add3 x y z = (x + y + z :: Int)
+      compN @3 f add3 1 2 3 `shouldBe` 12
+
+    it "fmapN @2 maps through a nested functor layer" do
+      let nested = Just [1, 2, 3 :: Int]
+      fmapN @2 (+ 10) nested `shouldBe` Just [11, 12, 13]
+
+    it "executes tape-driven composition via infix (.@) on pure arguments" do
+      let add3 x y z = (x + y + z :: Int)
+          h = ((+ 100) .@ [P, P, P]) add3
+      h 10 20 30 `shouldBe` 160
+
+    it "executes tape-driven composition with explicit argument indices" do
+      let tuple3 x y z = (x, y, z) :: (Int, String, Bool)
+          p = (id .@ [2 # P, 0 # P, 1 # P]) tuple3
+      p True (42 :: Int) "gongju" `shouldBe` (42, "gongju", True)
+
+    it "executes tape-driven monadic binding" do
+      let mAction :: Int -> Int -> [Int]
+          mAction x y = [x + y, x * y]
+          mComp = (fmap show .@ [P, M]) mAction
+      mComp 3 [10, 20 :: Int] `shouldBe` ["[13,30]", "[23,60]"]
+
+  -- Tested against Note [Positional Curried Arrow Manipulation] [ref:note-positional-arrow-manipulation]
+  describe "Gongju.Positional Combinators" do
+    it "slipr @1 pulls the 1st argument (0-indexed) to position 0" do
+      let sub x y = (x - y :: Int)
+      slipr @1 sub 5 20 `shouldBe` 15
+
+    it "slipr @2 pulls the 2nd argument (0-indexed) to position 0" do
+      let f x y z = (x, y, z) :: (Int, String, Bool)
+      slipr @2 f True 42 "hello" `shouldBe` (42, "hello", True)
+
+    it "slipl @1 pushes the 0th argument to position 1" do
+      let f x y = (x - y :: Int)
+      slipl @1 f 5 20 `shouldBe` 15
+
+    it "twist @0 swaps adjacent arguments at position 0 and 1" do
+      let sub x y = (x - y :: Int)
+      twist @0 sub 5 20 `shouldBe` 15
+
+  -- Tested against Note [Iterated Yank Index Adjustment] [ref:note-iterated-yank-adjustment]
+  describe "Gongju.Permute Arbitrary Argument Permutation" do
+    it "permute @'[2, 0, 1] permutes a 3-argument function" do
+      let f x y z = (x, y, z) :: (Int, String, Bool)
+      permute @'[2, 0, 1] f True 10 "gongju" `shouldBe` (10, "gongju", True)
+
+    it "permutes functions with identical argument types without ambiguity" do
+      let f x y z = (x - y + z :: Int)
+      permute @'[1, 2, 0] f 20 30 10 `shouldBe` (10 - 20 + 30)
+
+  describe "Gongju.Indexed Transitions" do
+    it "composes transitions over indexed state monad" do
+      let step1 :: Int -> Int -> String
+          step1 x y = show (x + y)
+          comp = (imap (++ "!") .@ [P, IxM]) step1
+          res = comp 10 (IxState \s -> (5 :: Int, s + 1))
+      runIxState res (0 :: Int) `shouldBe` ("15!", 1 :: Int)
+
+  describe "Gongju.Comonad & Distributive Functors" do
+    it "extends cokleisli functions using W tag" do
+      let wAction :: IdW Int -> Int -> String
+          wAction (IdW x) y = show (x + y)
+          wComp = (fmap (++ "!") .@ [W, P]) wAction
+      wComp (IdW 5) (10 :: Int) `shouldBe` IdW "15!"
+
+    it "commutes a Representable effect outside a Comonad via PullRet '[Dist]" do
+      let g :: IdW Int -> Int -> ReaderR String Int
+          g (IdW baseVal) multiplier = ReaderR \env -> (baseVal + multiplier) * length env
+          comp = withOps [W, P, PullDist] id g
+          readerRes = comp (IdW 10) (5 :: Int)
+      runReaderR readerRes "abc" `shouldBe` IdW 45
+
+  -- Tested against Data.Functor.Adjunction canonical instances
+  describe "Gongju.Adjunction Dual Annihilation & Adjoints" do
+    -- Dual pairing annihilation: zapLR pairs left adjoint (,) with right adjoint (->)
+    it "performs dual annihilation via zapLR on ((,) e) and ((->) e)" do
+      let pair = (10 :: Int, length :: String -> Int)
+          f e = replicate e 'x'
+      zapLR pair f `shouldBe` 10
+
+    -- Dual pairing annihilation: zapRL pairs right adjoint (->) with left adjoint (,)
+    it "performs dual annihilation via zapRL on ((->) e) and ((,) e)" do
+      let pair = (10 :: Int, "hello")
+          f :: Int -> String -> Int
+          f e str = length str + e
+      zapRL f pair `shouldBe` 15
+
+    -- Adjunction counit: collapses pair of environment and accessor (e, e -> a) to a
+    it "applies adjunction counit via withOps [AdjC]" do
+      let counitTarget = (5 :: Int, (+ 10) :: Int -> Int)
+          comp = withOps [AdjC] id counitTarget
+      comp `shouldBe` 15
+
+  -- Tested against kan-extensions canonical Ran, Lan, Yoneda, Coyoneda, Codensity
+  describe "Gongju.Kan Right/Left Kan Extensions, Yoneda & Codensity" do
+    -- Universal counit of Right Kan extension collapses Ran g h (g a) to h a
+    it "counit collapses Ran to underlying functor via ranCounit" do
+      let ranVal = ranUnit (Identity (42 :: Int))
+      runIdentity (ranCounit ranVal) `shouldBe` 42
+
+    -- Universal unit of Left Kan extension embeds h a into Lan g h (g a)
+    it "unit embeds functor into Lan via lanUnit" do
+      let lanVal = lanUnit (Identity (99 :: Int)) :: Lan Identity Identity (Identity Int)
+      runIdentity (lanCounit lanVal) `shouldBe` 99
+
+    -- Coyoneda allows fmap fusion without requiring Functor constraints until lowering
+    it "fuses mapping via Coyoneda lifting and lowering" do
+      let co = liftCoyoneda [1, 2, 3 :: Int]
+          coMapped = fmap (+ 10) co
+      lowerCoyoneda coMapped `shouldBe` [11, 12, 13]
+
+    -- Yoneda provides O(1) CPS composition for arbitrary covariant functors
+    it "fuses mapping via Yoneda lifting and lowering" do
+      let yon = liftYoneda [1, 2, 3 :: Int]
+          yonMapped = fmap (* 2) yon
+      lowerYoneda yonMapped `shouldBe` [2, 4, 6]
+
+    -- Codensity optimizes right-associated monadic bind chains into O(1) continuations
+    it "optimizes monad bind CPS via Codensity" do
+      let cod = liftCodensity (Just (100 :: Int))
+          codBound = cod >>= \x -> pure (x + 23)
+      lowerCodensity codBound `shouldBe` Just 123
+
+  -- Tested against profunctors canonical Profunctor and dimap
+  describe "Gongju.Profunctor Contravariant/Covariant Mapping" do
+    -- Contravariant pre-processing of input arguments via P1 (lmap)
+    it "maps profunctor first slot contravariantly via mapPath @'[P1]" do
+      let f = (+ 10) :: Int -> Int
+          g = mapPath @'[P1] (* 2) f
+      g 5 `shouldBe` 20
+
+    -- Covariant post-processing of return values via P2 (rmap)
+    it "maps profunctor second slot covariantly via mapPath @'[P2]" do
+      let f = (+ 10) :: Int -> Int
+          g = mapPath @'[P2] (* 2) f
+      g 5 `shouldBe` 30
+
+    -- Simultaneous bidirectional transformation via dimap
+    it "dimaps both profunctor slots simultaneously via dimap" do
+      let f = (+ 10) :: Int -> Int
+          g = dimap (* 2) show f
+      g 5 `shouldBe` "20"
+
+  -- Tested against Note [Contravariant Positional Pre-Composition] [ref:note-contravariant-precomposition]
+  describe "Gongju.Contravariant Positional Pre-Composition & 2D Splicing" do
+    it "precomposeAt @0 and (-.) pre-compose argument 0" do
+      let f x y = (x - y :: Int)
+          g = precomposeAt @0 (* 2) f
+          h = (* 2) -. f
+      g 10 3 `shouldBe` 17
+      h 10 3 `shouldBe` 17
+
+    it "precomposeAt @1 and (-.*) pre-compose argument 1" do
+      let f x y z = (x + y * z :: Int)
+          g = precomposeAt @1 (+ 10) f
+          h = (+ 10) -.* f
+      g 5 2 3 `shouldBe` 41
+      h 5 2 3 `shouldBe` 41
+
+    it "precomposeAt @2 and (-.**) pre-compose argument 2" do
+      let tuple3 x y z = (x, y, z) :: (Int, String, Bool)
+          g = precomposeAt @2 not tuple3
+          h = not -.** tuple3
+      g 10 "abc" False `shouldBe` (10, "abc", True)
+      h 10 "abc" False `shouldBe` (10, "abc", True)
+
+    it "precomposeAt @3 and (-.***) pre-compose argument 3" do
+      let tuple4 w x y z = (w, x, y, z) :: (Int, Int, Int, Int)
+          g = precomposeAt @3 (* 100) tuple4
+          h = (* 100) -.*** tuple4
+      g 1 2 3 4 `shouldBe` (1, 2, 3, 400)
+      h 1 2 3 4 `shouldBe` (1, 2, 3, 400)
+
+    it "spliceAt @1 @2 splices a binary function into slot 1 of a ternary function" do
+      let add3 x y z = (x + y + z :: Int)
+          mult2 u v = (u * v :: Int)
+          spliced = spliceAt @1 @2 mult2 add3
+      spliced 10 3 4 5 `shouldBe` 27
+
+    it "spliceAt @0 @3 splices a ternary function into slot 0" do
+      let add2 a b = (a + b :: Int)
+          prod3 x y z = (x * y * z :: Int)
+          spliced = spliceAt @0 @3 prod3 add2
+      spliced 2 3 4 10 `shouldBe` 34
+
+  -- Tested against Note [Contravariant Functor Alternating Parity] [ref:note-contravariant-alternating-parity]
+  describe "Gongju.Contravariant Alternating Parity Stacks" do
+    it "contramapN @1 and (<-$>) invert variance on 1-layer Predicate" do
+      let isPositive = Predicate (> (0 :: Int))
+          p1 = contramapN @1 (* 2) isPositive
+          p2 = (* 2) <-$> isPositive
+      getPredicate p1 5 `shouldBe` True
+      getPredicate p1 (-1) `shouldBe` False
+      getPredicate p2 5 `shouldBe` True
+      getPredicate p2 (-1) `shouldBe` False
+
+    it "contramapN @2 and (<-$$>) cancel variance inversion on 2-layer Predicate (covariant)" do
+      let pp = Predicate (\(Predicate p) -> p (10 :: Int)) :: Predicate (Predicate Int)
+          pp1 = contramapN @2 (* 2) pp
+          pp2 = (* 2) <-$$> pp
+      getPredicate pp1 (Predicate (> 15)) `shouldBe` True
+      getPredicate pp1 (Predicate (> 25)) `shouldBe` False
+      getPredicate pp2 (Predicate (> 15)) `shouldBe` True
+      getPredicate pp2 (Predicate (> 25)) `shouldBe` False
+
+    it "contramapN @3 and (<-$$$>) invert variance on 3-layer Predicate (contravariant)" do
+      let ppp = Predicate (\(Predicate pp) -> pp (Predicate (> (15 :: Int)))) :: Predicate (Predicate (Predicate Int))
+          ppp1 = contramapN @3 (* 2) ppp
+          ppp2 = (* 2) <-$$$> ppp
+          evalTest val = Predicate (\(Predicate p) -> p (val :: Int))
+      getPredicate ppp1 (evalTest 10) `shouldBe` True
+      getPredicate ppp1 (evalTest 5) `shouldBe` False
+      getPredicate ppp2 (evalTest 10) `shouldBe` True
+      getPredicate ppp2 (evalTest 5) `shouldBe` False
+
+    it "supports Divisible divide combining two predicates" do
+      let pEven = Predicate even :: Predicate Int
+          pPositive = Predicate (> 0) :: Predicate Int
+          pCombined = divide (\x -> (x, x)) pEven pPositive
+      getPredicate pCombined 4 `shouldBe` True
+      getPredicate pCombined 3 `shouldBe` False
+      getPredicate pCombined (-2) `shouldBe` False
+
+  -- Tested against Note [Positional Monadic Curried Binding] [ref:note-positional-monadic-binding]
+  describe "Gongju.Monad Positional Monadic Binding" do
+    it "bindAt @1 and (==<<), (>>==) bind trailing argument slot 1" do
+      let f x y = pure (x * y) :: Maybe Int
+      bindAt @1 f (Just 7) 6 `shouldBe` Just 42
+      (f ==<< Just 7) 6 `shouldBe` Just 42
+      (Just 7 >>== f) 6 `shouldBe` Just 42
+      (f ==<< Nothing) 6 `shouldBe` Nothing
+
+    it "bindAt @2 and (===<<), (>>===) bind trailing argument slot 2" do
+      let add3 x y z = pure (x + y + z) :: Maybe Int
+      bindAt @2 add3 (Just 10) 1 2 `shouldBe` Just 13
+      (add3 ===<< Just 10) 1 2 `shouldBe` Just 13
+      (Just 10 >>=== add3) 1 2 `shouldBe` Just 13
+
+    it "bindAt @3 and (====<<), (>>====) bind trailing argument slot 3" do
+      let add4 w x y z = pure (w + x + y + z) :: Maybe Int
+      bindAt @3 add4 (Just 100) 1 2 3 `shouldBe` Just 106
+      (add4 ====<< Just 100) 1 2 3 `shouldBe` Just 106
+      (Just 100 >>==== add4) 1 2 3 `shouldBe` Just 106
+
+    it "bindPos @1 @1 and (=.=<<), (>>=.=) bind interior slot 1 of 3" do
+      let add3 x y z = pure (x + y + z) :: Maybe Int
+      bindPos @1 @1 add3 (Just 20) 1 3 `shouldBe` Just 24
+      (add3 =.=<< Just 20) 1 3 `shouldBe` Just 24
+      (Just 20 >>=.= add3) 1 3 `shouldBe` Just 24
+      (add3 =.=<< Nothing) 1 3 `shouldBe` Nothing
+
+    it "bindPos @0 @2 and (==.<<), (=..<<), (>>.==), (>>..=) bind interior slot 0 of 3" do
+      let add3 x y z = pure (x + y + z) :: Maybe Int
+      bindPos @0 @2 add3 (Just 10) 2 3 `shouldBe` Just 15
+      (add3 ==.<< Just 10) 2 3 `shouldBe` Just 15
+      (add3 =..<< Just 10) 2 3 `shouldBe` Just 15
+      (Just 10 >>.== add3) 2 3 `shouldBe` Just 15
+      (Just 10 >>..= add3) 2 3 `shouldBe` Just 15
+      (add3 ==.<< Nothing) 2 3 `shouldBe` Nothing
+
+  -- Tested against Note [Multi-Slot Monadic Lifting Masks] [ref:note-multislot-monadic-masks]
+  describe "Gongju.Monad Multi-Slot Lifting Masks" do
+    it "liftMask @'[MArg, PArg, MArg] sequences multiple monadic slots while preserving pure arguments" do
+      let f a b c = pure (a ++ ":" ++ show b ++ ":" ++ c) :: [String]
+          g = liftMask @'[MArg, PArg, MArg] f
+      g ["a", "b"] (42 :: Int) ["x", "y"] `shouldBe` ["a:42:x", "a:42:y", "b:42:x", "b:42:y"]
+
+    it "liftMask @'[PArg, MArg] preserves pure arg 0 and binds monadic arg 1" do
+      let g x y = if y > 0 then Just (x * y) else Nothing :: Maybe Int
+          h = liftMask @'[PArg, MArg] g
+      h (5 :: Int) (Just 3) `shouldBe` Just 15
+      h (5 :: Int) Nothing `shouldBe` Nothing
+
+    it "liftMask @'[MArg, MArg] lifts both arguments into a monad" do
+      let g x y = if y > 0 then Just (x * y) else Nothing :: Maybe Int
+          h = liftMask @'[MArg, MArg] g
+      h (Just 5) (Just 3) `shouldBe` Just 15
+      h Nothing (Just 3) `shouldBe` Nothing
+      h (Just 5) Nothing `shouldBe` Nothing
+
+  describe "Gongju.Monad Arity-Indexed Kleisli Composition & Pure Lifting" do
+    it "liftPureN lifts pure functions to return monadic results" do
+      liftPureN @1 (+ (1 :: Int)) 5 `shouldBe` (Just 6 :: Maybe Int)
+      liftPureN @2 (+) (3 :: Int) 4 `shouldBe` (Just 7 :: Maybe Int)
+      liftPureN @3 (\x y z -> (x + y + z :: Int)) 1 2 3 `shouldBe` (Just 6 :: Maybe Int)
+
+    it "bindKleisliN @2 and (<=<.), (.>=>) post-compose Kleisli arrows after binary functions" do
+      let f x y = Just (x + y :: Int)
+          checkEven z = if even z then Just z else Nothing
+      bindKleisliN @2 checkEven f 2 4 `shouldBe` Just 6
+      bindKleisliN @2 checkEven f 2 3 `shouldBe` Nothing
+      (checkEven <=<. f) 2 4 `shouldBe` Just 6
+      (checkEven <=<. f) 2 3 `shouldBe` Nothing
+      (f .>=> checkEven) 2 4 `shouldBe` Just 6
+      (f .>=> checkEven) 2 3 `shouldBe` Nothing
+
+    it "bindKleisliN @3 and (<=<..), (..>=>) post-compose Kleisli arrows after ternary functions" do
+      let add3M x y z = Just (x + y + z :: Int)
+          checkEven z = if even z then Just z else Nothing
+      bindKleisliN @3 checkEven add3M 1 2 3 `shouldBe` Just 6
+      bindKleisliN @3 checkEven add3M 1 2 4 `shouldBe` Nothing
+      (checkEven <=<.. add3M) 1 2 3 `shouldBe` Just 6
+      (checkEven <=<.. add3M) 1 2 4 `shouldBe` Nothing
+      (add3M ..>=> checkEven) 1 2 3 `shouldBe` Just 6
+      (add3M ..>=> checkEven) 1 2 4 `shouldBe` Nothing
+
+  -- Tested against Note [Profunctor Effect Handler Permutations] [ref:note-profunctor-handler-permutations]
+  describe "Gongju.Profunctor Curried Category & Handler Permutations" do
+    it "catFlip and catApply work over CurriedCat (->)" do
+      let f x y = (x - y :: Int)
+      catFlip f 5 20 `shouldBe` 15
+      catApply f 20 5 `shouldBe` 15
+
+    it "compCatN composes category morphisms at the leaf" do
+      let f x y = \z -> (x + y + z :: Int)
+          g z = show (z * 2)
+      compCatN @2 g f 10 20 5 `shouldBe` "70"
+
+    it "yankCat pulls curried category inputs to position 0" do
+      let sub3 x y z = (x - y - z :: Int)
+      yankCat @1 sub3 10 100 5 `shouldBe` (100 - 10 - 5)
+      yankCat @2 sub3 5 100 10 `shouldBe` (100 - 10 - 5)
+
+    it "permuteCat permutes curried category inputs arbitrarily" do
+      let tuple3 x y z = (x, y, z) :: (Int, String, Bool)
+          perm = permuteCat @'[2, 0, 1] tuple3
+      perm False 100 "hello" `shouldBe` (100, "hello", False)
+
+    it "permuteHandler reorders environment parameters of an effect handler" do
+      let handler env1 env2 env3 = \(x :: Int) -> env1 ++ ":" ++ show env2 ++ ":" ++ env3 ++ ":" ++ show x
+          handler' = permuteHandler @'[2, 0, 1] handler
+      handler' "c" "a" (42 :: Int) 10 `shouldBe` "a:42:c:10"
+
+    it "compHandlerN adapts profunctor strands produced by an effect handler" do
+      let h e1 e2 = \(x :: Int) -> show (x + e1 * e2)
+          adapted = compHandlerN @2 (lmap (* 2)) h
+      adapted 3 4 5 `shouldBe` "22"
+
+  -- Tested against Note [Tuple-Spine Arrow Permutations] [ref:note-tuple-spine-permutations]
+  describe "Gongju.Profunctor Tuple-Spine Arrow & Strand Permutations" do
+    it "yankTuple pulls tuple slots to the head" do
+      let t3 = (10 :: Int, (20 :: Int, (30 :: Int, ())))
+      yankTuple @0 t3 `shouldBe` t3
+      yankTuple @1 t3 `shouldBe` (20, (10, (30, ())))
+      yankTuple @2 t3 `shouldBe` (30, (10, (20, ())))
+
+    it "permuteTuple permutes right-nested tuple slots arbitrarily" do
+      let t3 = (10 :: Int, (20 :: Int, (30 :: Int, ())))
+      permuteTuple @'[2, 0, 1] t3 `shouldBe` (30, (10, (20, ())))
+      permuteTuple @'[1, 2, 0] t3 `shouldBe` (20, (30, (10, ())))
+
+    it "permuteInputs reorders profunctor strand input tuple spines" do
+      let strand = \(z, (x, (y, ()))) -> show (x * 100 + y * 10 + z :: Int)
+          strand' = permuteInputs @'[2, 0, 1] strand
+      strand' (1, (2, (3, ()))) `shouldBe` "123"
+
+    it "permuteOutputs reorders profunctor strand output tuple spines" do
+      let gen = \() -> (10 :: Int, (20 :: Int, (30 :: Int, ())))
+          gen' = permuteOutputs @'[2, 0, 1] gen
+      gen' () `shouldBe` (30, (10, (20, ())))
+
+    it "dimapPermute simultaneously permutes input and output tuple spines" do
+      let biStrand = \(y, (x, ())) -> (x ++ "!", (y + 1 :: Int, ()))
+          d = dimapPermute @'[1, 0] @'[1, 0] biStrand
+      d ("first", (100 :: Int, ())) `shouldBe` (101, ("first!", ()))
+
+    it "swapStrand swaps binary pair inputs of a profunctor strand" do
+      let p = \(b, a) -> (a - b :: Int)
+      p (5, 20) `shouldBe` 15
+      swapStrand p (5, 20) `shouldBe` (-15)
+
+  -- Tested against Note [Zero-Cost Inlining and Core Simplification] [ref:note-zero-cost-core-simplification]
+  describe "Gongju.Core Zero-Cost Inspection Fixtures" do
+    it "testComp2 and testComp3 evaluate arity composition" do
+      testComp2 (* 2) (+) 10 20 `shouldBe` 60
+      testComp3 (* 2) (\x y z -> x + y + z) 1 2 3 `shouldBe` 12
+
+    it "testSlipr1, testSlipl2, testTwist1, testYank1, testShove2 manipulate positional arguments" do
+      let f3 x y z = (x * 100 + y * 10 + z :: Int)
+      testSlipr1 (-) 5 20 `shouldBe` 15
+      testYank1 (-) 5 20 `shouldBe` 15
+      testSlipl2 f3 1 2 3 `shouldBe` 312
+      testShove2 f3 1 2 3 `shouldBe` 312
+      testTwist1 f3 1 3 2 `shouldBe` 123
+
+    it "testPermute3 permutes arguments [2, 0, 1]" do
+      let f3 x y z = (x * 100 + y * 10 + z :: Int)
+      testPermute3 f3 3 1 2 `shouldBe` 123
+
+    it "testPrecompose1 and testSplice12 perform contravariant positional pre-composition" do
+      testPrecompose1 (* 10) (-) 100 5 `shouldBe` 50
+      testSplice12 (*) (\x y z -> x + y + z) 10 3 4 5 `shouldBe` 27
+
+    it "testBind1, testBindPos11, testLiftPure2 perform monadic binding and lifting" do
+      testBind1 (\x y -> Just (x + y)) (Just 20) 10 `shouldBe` Just 30
+      testBind1 (\x y -> Just (x + y)) Nothing 10 `shouldBe` Nothing
+      testBindPos11 (\x y z -> Just (x + y + z)) (Just 20) 10 5 `shouldBe` Just 35
+      testBindPos11 (\x y z -> Just (x + y + z)) Nothing 10 5 `shouldBe` Nothing
+      testLiftPure2 (+) 10 20 `shouldBe` Just 30
+
+    it "testPermuteTuple3, testPermuteInputs, testSwapStrand permute tuple spines and strands" do
+      testPermuteTuple3 (10, (20, (30, ()))) `shouldBe` (30, (10, (20, ())))
+      testPermuteInputs (\(z, (x, (y, ()))) -> x * 100 + y * 10 + z) (1, (2, (3, ()))) `shouldBe` 123
+      testSwapStrand (\(b, a) -> a - b) (5, 20) `shouldBe` (-15)
+
+    it "testCatFlip, testCatApply, testCompCat2, testYankCat1, testPermuteCat3, testPermuteHandler3 manipulate category morphisms" do
+      let f3 x y z = (x * 100 + y * 10 + z :: Int)
+          f4 x y z env = (x * 1000 + y * 100 + z * 10 + env :: Int)
+      testCatFlip (-) 5 20 `shouldBe` 15
+      testCatApply (-) 20 5 `shouldBe` 15
+      testCompCat2 (* 2) (\x y z -> x + y + z) 1 2 3 `shouldBe` 12
+      testYankCat1 (-) 5 20 `shouldBe` 15
+      testPermuteCat3 f3 3 1 2 `shouldBe` 123
+      testPermuteHandler3 f4 3 1 2 4 `shouldBe` 1234
+
+
+
+
+
