diff --git a/book/src/SUMMARY.md b/book/src/SUMMARY.md
index 9adf58e9..55efc260 100644
--- a/book/src/SUMMARY.md
+++ b/book/src/SUMMARY.md
@@ -23,5 +23,6 @@
- [Variable-base scalar multiplication](design/circuit/gadgets/ecc/var-base-scalar-mul.md)
- [Sinsemilla](design/circuit/gadgets/sinsemilla.md)
- [MerkleCRH](design/circuit/gadgets/sinsemilla/merkle-crh.md)
+ - [CommitIvk](design/circuit/gadgets/sinsemilla/commit-ivk.md)
- [Lookup Range Check](design/circuit/gadgets/lookup_range_check.md)
- [Decomposition](design/circuit/gadgets/decomposition.md)
diff --git a/book/src/design/circuit/gadgets/sinsemilla/commit-ivk.md b/book/src/design/circuit/gadgets/sinsemilla/commit-ivk.md
new file mode 100644
index 00000000..3cd56e9d
--- /dev/null
+++ b/book/src/design/circuit/gadgets/sinsemilla/commit-ivk.md
@@ -0,0 +1,76 @@
+# CommitIvk
+
+## Message decomposition
+$\mathsf{SinsemillaShortCommit}$ is used in the [$\mathsf{CommitIvk}$ function](https://zips.z.cash/protocol/protocol.pdf#concretesinsemillacommit). The input to $\mathsf{SinsemillaShortCommit}$ is:
+
+$$\mathsf{I2LEBSP}_{\ell_{\textsf{base}}^{\textsf{Orchard}}}(ak) || \mathsf{I2LEBSP}_{\ell_{\textsf{base}}^{\textsf{Orchard}}}(nk),$$
+
+where $\mathsf{ak, nk}$ are Pallas base field elements, and $\ell_{\textsf{base}}^{\textsf{Orchard}} = 255.$
+
+We break these inputs into the following `MessagePiece`s:
+
+$$
+\begin{aligned}
+a \text{ (250 bits)} &= \text{bits } 0..=249 \text{ of } \mathsf{ak} \\
+b \text{ (10 bits)} &= b_0||b_1||b_2 \\
+ &= (\text{bits } 250..=253 \text{ of } \mathsf{ak}) || (\text{bit } 254 \text{ of } \mathsf{ak}) || (\text{bits } 0..=4 \text{ of } \mathsf{nk}) \\
+c \text{ (240 bits)} &= \text{bits } 5..=244 \text{ of } \mathsf{nk} \\
+d \text{ (10 bits)} &= d_0||d_1 \\
+ &= (\text{bits } 245..=253 \text{ of } \mathsf{nk}) || (\text{bit } 254 \text{ of } \mathsf{nk})
+\end{aligned}
+$$
+
+$a,b,c,d$ are constrained by the $\textsf{SinsemillaHash}$ to be $250$ bits, $10$ bits, $240$ bits, and $10$ bits respectively.
+
+In a custom gate, we check this message decomposition by enforcing the following constraints:
+
+1. $b = b_0 + 2^4 \cdot b_1 + 2^5 \cdot b_2$
+
+$b_0, b_2$ are witnessed outside this gate, and constrained to be $4$ bits and $5$ bits respectively. $b_1$ is witnessed and boolean-constrained in this gate:
+$$(b_1)(1 - b_1) = 0.$$
+From these witnessed subpieces, we check that we recover the original `MessagePiece` input to the hash:
+$$b = b_0 + 2^4 \cdot b_1 + 2^5 \cdot b_2.$$
+
+2. $d = d_0 + 2^9 \cdot d_1$
+
+$d_0$ is witnessed outside this gate, and constrained to be $9$ bits. $d_1$ is witnessed and boolean-constrained in this gate:
+$$(d_1)(1 - d_1) = 0.$$
+From these witnessed subpieces, we check that we recover the original `MessagePiece` input to the hash:
+$$d = d_0 + 2^9 \cdot d_1.$$
+
+We have now derived or witnessed every subpiece, and range-constrained every subpiece:
+- $b_0$ ($4$ bits) is witnessed and constrained outside the gate;
+- $b_1$ ($1$ bits) is witnessed and boolean-constrained in the gate;
+- $b_2$ ($5$ bits) is witnessed and constrained outside the gate;
+- $d_0$ ($9$ bits) is witnessed and constrained outside the gate;
+- $d_1$ ($1$ bits) is witnessed and boolean-constrained in the gate,
+and we use them to reconstruct the original field element inputs:
+
+3. $\textsf{ak} = a + 2^{250} \cdot b_0 + 2^{254} \cdot b_1$
+4. $\textsf{nk} = b_2 + 2^5 \cdot c + 2^{245} \cdot d_0 + 2^{254} \cdot d_1$
+
+## Canonicity
+The modulus of the Pallas base field is $p = 2^{254} + t_p,$ where $t_p = 45560315531419706090280762371685220353 < 2^{126}.$
+
+### $\textsf{ak} = a (250 \text{ bits}) || b_0 (4 \text{ bits}) || b_1 (1 \text{ bit})$
+We check that $\mathsf{I2LEBSP_{\ell_{base}^{Orchard}}(ak)}$ is a canonically-encoded $255$-bit value, i.e. $\textsf{ak} < p$. If the high bit is not set $b_1 = 0$, we are guaranteed that $\textsf{ak} < 2^{254}$. Thus, we are only interested in cases when $b_1 = 1 \implies \textsf{ak} \geq 2^{254}$. In these cases, we check that $\textsf{ak}_{0..=253} < t_p < 2^{126}$:
+
+1. $b_1 = 1 \implies b_0 = 0.$
+Since $b_1 = 1 \implies \textsf{ak}_{0..=253} < 2^{126},$ we know that $\textsf{ak}_{126..=253} = 0,$ and in particular $b_0 = \textsf{ak}_{250..=253} = 0.$ So, we constrain $$b_1 \cdot b_0 = 0.$$
+
+2. $b_1 = 1 \implies 0 \leq a < 2^{126}.$
+To check that $a < 2^{126}$, we use two constraints:
+
+ a) $0 \leq a < 2^{130}$. This is expressed in the custom gate as $$b_1 \cdot z_{13,a} = 0,$$ where $z_{13,a}$ is the index-13 running sum output by $\textsf{SinsemillaHash}(a).$
+
+ b) $0 \leq a + 2^{130} - t_p < 2^{130}$. To check this, we decompose $a' = a + 2^{130} - t_p$ into thirteen 10-bit words (little-endian) using a running sum $z_{a'}$, looking up each word in a $10$-bit lookup table. We then enforce in the custom gate that $$b_1 \cdot z_{13, a'} = 0.$$
+
+### $\textsf{nk} = b_2 (5 \text{ bits}) || c (240 \text{ bits}) || d_0 (9 \text{ bits}) || d_1 (1 \text{ bit})$
+We check that $\mathsf{I2LEBSP}_{\ell_{\textsf{base}}^{\textsf{Orchard}}}(nk)$ is a canonically-encoded $255$-bit value, i.e. $\textsf{nk} < p$. If the high bit is not set $d_1 = 0$, we are guaranteed that $nk < 2^{254}$. Thus, we are only interested in cases when $d_1 = 1 \implies nk \geq 2^{254}$. In these cases, we check that $\textsf{nk}_{0..=253} < t_p < 2^{126}$:
+
+1. $d_1 = 1 \implies 0 \leq b_2 + 2^5 \cdot c < 2^{126}.$
+To check that $0 \leq b_2 + 2^5 \cdot c < 2^{126}$, we use two constraints:
+
+ a) $0 \leq b_2 + 2^5 \cdot c < 2^{140}$. $b_2$ is already constrained individually to be a $5$-bit value. $z_{13, c}$ is the index-13 running sum output by $\textsf{SinsemillaHash}(c).$ By constraining $$d_1 \cdot z_{13,c} = 0,$$ we constrain $b_2 + 2^5 \cdot c < 2^{135} < 2^{140}.$
+
+ b) $0 \leq b_2 + 2^5 \cdot c + 2^{140} - t_p < 2^{140}$. To check this, we decompose $b' = b_2 + 2^5 \cdot c + 2^{140} - t_p$ into fourteen 10-bit words (little-endian) using a running sum $z_{b'}$, looking up each word in a $10$-bit lookup table. We then enforce in the custom gate that $$d_1 \cdot z_{14, b'} = 0.$$
\ No newline at end of file
diff --git a/book/src/design/circuit/gadgets/sinsemilla/commit_ivk.md b/book/src/design/circuit/gadgets/sinsemilla/commit_ivk.md
deleted file mode 100644
index 30404ce4..00000000
--- a/book/src/design/circuit/gadgets/sinsemilla/commit_ivk.md
+++ /dev/null
@@ -1 +0,0 @@
-TODO
\ No newline at end of file