<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="/forest/default.xsl"?>
<fr:tree xmlns:fr="http://www.forester-notes.org" xmlns:html="http://www.w3.org/1999/xhtml" xmlns:xml="http://www.w3.org/XML/1998/namespace" root="true" base-url="/forest/">
  <fr:frontmatter>
    <fr:authors />
    <fr:uri>https://kream.codeberg.page/forest/index/</fr:uri>
    <fr:display-uri>index</fr:display-uri>
    <fr:route>/forest/index/</fr:route>
    <fr:title text="Home">Home</fr:title>
    <fr:meta name="author">false</fr:meta>
  </fr:frontmatter>
  <fr:mainmatter>
    <html:p>Welcome to my <fr:link href="https://www.forester-notes.org/" type="external">forest of notes</fr:link>.</html:p>
    <html:p>For navigation, click on links and headers. Use <html:code>Ctrl + K</html:code> to search for tree id or title.</html:p>
    <fr:tree show-metadata="false" toc="false" numbered="false">
      <fr:frontmatter>
        <fr:authors />
        <fr:date>
          <fr:year>2026</fr:year>
          <fr:month>2</fr:month>
          <fr:day>14</fr:day>
        </fr:date>
        <fr:uri>https://kream.codeberg.page/forest/red/</fr:uri>
        <fr:display-uri>red</fr:display-uri>
        <fr:route>/forest/red/</fr:route>
        <fr:title text="red">red</fr:title>
        <fr:taxon>person</fr:taxon>
      </fr:frontmatter>
      <fr:mainmatter>
        <html:p>Hi! I am an undergraduate student currently residing in Boston.</html:p>
        <html:p>I also go by <html:strong>allenxch</html:strong>, <html:strong>kream</html:strong>, and sometimes <html:strong>小红</html:strong>.</html:p>
        <html:p>People I know IRL call me <html:strong>Allen</html:strong>.</html:p>
        <html:p>I love math, logic, and computer science. I can be passionate at times about philosophy and art too.</html:p>
        <html:p>My other hobbies include boomer shooters, indie puzzle games, and fixed gear riding.</html:p>
        <html:p>This forest contains my notes on various topics of interest, with a current focus on:</html:p>
        <html:ul><html:li>Type theory</html:li>
  <html:li>Category theory and topos theory</html:li>
  <html:li>GNU/Linux related technology</html:li>
  <html:li>Minimalism</html:li>
  <html:li>Mathematical visualization and animation</html:li>
  <html:li>Interpreting Hegel with Mathematics</html:li></html:ul>
        <fr:tree show-metadata="false">
          <fr:frontmatter>
            <fr:authors />
            <fr:date>
              <fr:year>2026</fr:year>
              <fr:month>2</fr:month>
              <fr:day>14</fr:day>
            </fr:date>
            <fr:title text="Contacts">Contacts</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:ul><html:li>Codeberg: <html:code>kream</html:code></html:li>
    <html:li>Email: <html:code>allenxch[at]proton[dot]me</html:code></html:li>
    <html:li>Telegram: <html:code>id:redprofilepic</html:code></html:li></html:ul>
          </fr:mainmatter>
        </fr:tree>
      </fr:mainmatter>
    </fr:tree>
    <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
      <fr:frontmatter>
        <fr:authors />
        <fr:title text="Blog">
          <fr:link href="/forest/blog-0001/" title="Blog" uri="https://kream.codeberg.page/forest/blog-0001/" display-uri="blog-0001" type="local">Blog</fr:link>
        </fr:title>
      </fr:frontmatter>
      <fr:mainmatter />
    </fr:tree>
    <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
      <fr:frontmatter>
        <fr:authors />
        <fr:title text="Notes">Notes</fr:title>
      </fr:frontmatter>
      <fr:mainmatter>
        <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors />
            <fr:title text="Math and TT notes">Math and TT notes</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>For notes on Math and Type Theory related topics:</html:p>
            <html:ul><html:li><fr:link href="/forest/cat-0001/" title="Category theory" uri="https://kream.codeberg.page/forest/cat-0001/" display-uri="cat-0001" type="local">Category theory</fr:link></html:li>
      <html:li><fr:link href="/forest/alg-0001/" title="Algebra Notes" uri="https://kream.codeberg.page/forest/alg-0001/" display-uri="alg-0001" type="local">Algebra Notes</fr:link></html:li>
      <html:li><fr:link href="/forest/tt-AVRI/" title="Topos and type theory notes" uri="https://kream.codeberg.page/forest/tt-AVRI/" display-uri="tt-AVRI" type="local">Topos and type theory notes</fr:link></html:li>
      <html:li><fr:link href="/forest/tt-AVSP/" title="Diagrammatical/Graphical Approaches in Algebra, Category Theory, and Computation" uri="https://kream.codeberg.page/forest/tt-AVSP/" display-uri="tt-AVSP" type="local">Diagrammatical/Graphical Approaches in Algebra, Category Theory, and Computation</fr:link></html:li></html:ul>
            <html:p>Reading notes and adapted material:</html:p>
            <html:ul><html:li><fr:link href="/forest/cat-0005/" title="Sheaves in Geometry and Logic notes" uri="https://kream.codeberg.page/forest/cat-0005/" display-uri="cat-0005" type="local">Sheaves in Geometry and Logic notes</fr:link></html:li>
      <html:li><fr:link href="/forest/tt-AVR4/" title="Principles of Dependent Type Theory notes" uri="https://kream.codeberg.page/forest/tt-AVR4/" display-uri="tt-AVR4" type="local">Principles of Dependent Type Theory notes</fr:link></html:li>
      <html:li><fr:link href="/forest/tt-AVSS/" title="A brief history of type theory" uri="https://kream.codeberg.page/forest/tt-AVSS/" display-uri="tt-AVSS" type="local">A brief history of type theory</fr:link></html:li>
      <html:li><fr:link href="/forest/tt-AVRB/" title="Modal Homotopy Type Theory" uri="https://kream.codeberg.page/forest/tt-AVRB/" display-uri="tt-AVRB" type="local">Modal Homotopy Type Theory</fr:link></html:li></html:ul>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors />
            <fr:title text="Misc">Misc</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>For my notes on personal and casual topics:</html:p>
            <html:ul><html:li><fr:link href="/forest/gfx-0007/" title="Graphics" uri="https://kream.codeberg.page/forest/gfx-0007/" display-uri="gfx-0007" type="local">Graphics</fr:link></html:li>
      <html:li><fr:link href="/forest/phil-0009/" title="Philosophy" uri="https://kream.codeberg.page/forest/phil-0009/" display-uri="phil-0009" type="local">Philosophy</fr:link></html:li>
      <html:li><fr:link href="/forest/lit-0001/" title="Literary theory" uri="https://kream.codeberg.page/forest/lit-0001/" display-uri="lit-0001" type="local">Literary theory</fr:link></html:li>
      <html:li><fr:link href="/forest/cog-0001/" title="Cognitive science" uri="https://kream.codeberg.page/forest/cog-0001/" display-uri="cog-0001" type="local">Cognitive science</fr:link></html:li>
      <html:li><fr:link href="/forest/life-0001/" title="Ultralight One-Bag and Camping Gear System" uri="https://kream.codeberg.page/forest/life-0001/" display-uri="life-0001" type="local">Ultralight One-Bag and Camping Gear System</fr:link></html:li>
      <html:li><fr:link href="/forest/life-000A/" title="Music I listen to while working on this forest" uri="https://kream.codeberg.page/forest/life-000A/" display-uri="life-000A" type="local">Music I listen to while working on this forest</fr:link></html:li>
      <html:li><fr:link href="/forest/life-000C/" title="Food System" uri="https://kream.codeberg.page/forest/life-000C/" display-uri="life-000C" type="local">Food System</fr:link></html:li></html:ul>
          </fr:mainmatter>
        </fr:tree>
      </fr:mainmatter>
    </fr:tree>
    <html:p>Code is licensed under <fr:link href="https://www.gnu.org/licenses/gpl-3.0.html" type="external">GPL 3.0</fr:link>. Content is licensed under <fr:link href="https://creativecommons.org/licenses/by-nc-sa/4.0/" type="external">CC BY-NC-SA 4.0</fr:link>. Source available on <fr:link href="https://codeberg.org/kream/forest" type="external">Codeberg</fr:link>.</html:p>
  </fr:mainmatter>
  <fr:backmatter>
    <fr:tree show-metadata="false" hidden-when-empty="true">
      <fr:frontmatter>
        <fr:authors />
        <fr:title text="References">References</fr:title>
      </fr:frontmatter>
      <fr:mainmatter />
    </fr:tree>
    <fr:tree show-metadata="false" hidden-when-empty="true">
      <fr:frontmatter>
        <fr:authors />
        <fr:title text="Context">Context</fr:title>
      </fr:frontmatter>
      <fr:mainmatter />
    </fr:tree>
    <fr:tree show-metadata="false" hidden-when-empty="true">
      <fr:frontmatter>
        <fr:authors />
        <fr:title text="Backlinks">Backlinks</fr:title>
      </fr:frontmatter>
      <fr:mainmatter />
    </fr:tree>
    <fr:tree show-metadata="false" hidden-when-empty="true">
      <fr:frontmatter>
        <fr:authors />
        <fr:title text="Related">Related</fr:title>
      </fr:frontmatter>
      <fr:mainmatter>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors />
            <fr:date>
              <fr:year>2026</fr:year>
              <fr:month>3</fr:month>
              <fr:day>15</fr:day>
            </fr:date>
            <fr:uri>https://kream.codeberg.page/forest/life-000C/</fr:uri>
            <fr:display-uri>life-000C</fr:display-uri>
            <fr:route>/forest/life-000C/</fr:route>
            <fr:title text="Food System">Food System</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>A whole-food-first nutrition system organized by category: supplements, whole food staples, and a dry kit for camping.</html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors />
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>3</fr:month>
                  <fr:day>15</fr:day>
                </fr:date>
                <fr:title text="Supplements">Supplements</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:ul><html:li><html:strong>Creatine</html:strong> — 5g/day, any time, every day</html:li>
    <html:li><html:strong>CoQ10</html:strong> — as directed, with a meal</html:li>
    <html:li><html:strong>Omega 3</html:strong> — 2000mg EPA+DHA, with a meal</html:li>
    <html:li><html:strong>Magnesium glycinate</html:strong> — 300–400mg, before bed</html:li>
    <html:li><html:strong>Vitamin D3</html:strong> — 2000–4000 IU, morning with food</html:li>
    <html:li><html:strong>Vitamin K2 MK-7</html:strong> — 100–200mcg, with D3</html:li>
    <html:li><html:strong>Collagen peptides</html:strong> — 10–15g, with vitamin C source</html:li></html:ul>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors />
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>3</fr:month>
                  <fr:day>15</fr:day>
                </fr:date>
                <fr:title text="Whole Food">Whole Food</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>15</fr:day>
                    </fr:date>
                    <fr:title text="Protein">Protein</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:ul><html:li>Eggs (free range / organic)</html:li>
      <html:li>Ground bison</html:li>
      <html:li>Chicken thighs</html:li>
      <html:li>Chicken breast</html:li>
      <html:li>Salmon (2x/week)</html:li>
      <html:li>Canned sardines (2x/week)</html:li>
      <html:li>Greek yogurt berry parfait (no additives)</html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>15</fr:day>
                    </fr:date>
                    <fr:title text="Produce">Produce</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors />
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>15</fr:day>
                        </fr:date>
                        <fr:title text="Vegetables">Vegetables</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:ul><html:li>Broccoli</html:li>
        <html:li>Leafy greens (spinach / arugula / kale)</html:li>
        <html:li>Onions</html:li>
        <html:li>Carrots</html:li>
        <html:li>Bell peppers</html:li>
        <html:li>Tomato</html:li></html:ul>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors />
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>15</fr:day>
                        </fr:date>
                        <fr:title text="Fruit">Fruit</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:ul><html:li>Apples</html:li>
        <html:li>Blueberries</html:li>
        <html:li>Kiwi</html:li>
        <html:li>Orange</html:li>
        <html:li>Strawberries</html:li></html:ul>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors />
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>15</fr:day>
                        </fr:date>
                        <fr:title text="Legumes">Legumes</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:ul><html:li>Lentils</html:li>
        <html:li>Chickpeas</html:li>
        <html:li>Black beans</html:li></html:ul>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>15</fr:day>
                    </fr:date>
                    <fr:title text="Carbs">Carbs</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:ul><html:li>Multigrain sourdough</html:li>
      <html:li>Whole grain rice</html:li>
      <html:li>Oats</html:li>
      <html:li>Potato</html:li>
      <html:li>Corn / yam</html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>15</fr:day>
                    </fr:date>
                    <fr:title text="Fats">Fats</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:ul><html:li>Mixed nuts</html:li>
      <html:li>Avocado</html:li>
      <html:li>Olive oil</html:li>
      <html:li>Dark chocolate (85 percent or higher)</html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors />
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>3</fr:month>
                  <fr:day>15</fr:day>
                </fr:date>
                <fr:title text="Camp Dry Kit">Camp Dry Kit</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:ul><html:li>Oats</html:li>
    <html:li>Whole grain rice</html:li>
    <html:li>Canned sardines</html:li>
    <html:li>Mixed nuts</html:li>
    <html:li>Nut butter packets</html:li>
    <html:li>Dried fruit (no additives)</html:li>
    <html:li>Dried mushrooms / sundried tomatoes</html:li>
    <html:li>Dark chocolate (85 percent or higher)</html:li>
    <html:li>Protein powder</html:li>
    <html:li>Olive oil (small bottle or packets)</html:li>
    <html:li>Corn tortillas</html:li></html:ul>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2026</fr:year>
              <fr:month>2</fr:month>
              <fr:day>24</fr:day>
            </fr:date>
            <fr:uri>https://kream.codeberg.page/forest/life-000A/</fr:uri>
            <fr:display-uri>life-000A</fr:display-uri>
            <fr:route>/forest/life-000A/</fr:route>
            <fr:title text="Music I listen to while working on this forest">Music I listen to while working on this forest</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Just some music that calms me down.</html:p>
            <html:p>Click on the subtrees below to expand embedded youtube players.</html:p>
            <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>24</fr:day>
                </fr:date>
                <fr:title text="Pharoah Sanders - Farah">Pharoah Sanders - Farah</fr:title>
                <fr:meta name="youtube">oV-wM0JBMsY</fr:meta>
              </fr:frontmatter>
              <fr:mainmatter />
            </fr:tree>
            <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>24</fr:day>
                </fr:date>
                <fr:title text="17 - 椎名林檎">17 - 椎名林檎</fr:title>
                <fr:meta name="youtube">8kpVAvMgUc4</fr:meta>
              </fr:frontmatter>
              <fr:mainmatter />
            </fr:tree>
            <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>24</fr:day>
                </fr:date>
                <fr:title text="Spartacus Love Theme · Soil ＆&quot;Pimp&quot; Sessions">Spartacus Love Theme · Soil ＆"Pimp" Sessions</fr:title>
                <fr:meta name="youtube">9OygsR7gnXQ</fr:meta>
              </fr:frontmatter>
              <fr:mainmatter />
            </fr:tree>
            <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>24</fr:day>
                </fr:date>
                <fr:title text="Xeno Archadia · Hylics 2">Xeno Archadia · Hylics 2</fr:title>
                <fr:meta name="youtube">enjekGHpE_4</fr:meta>
              </fr:frontmatter>
              <fr:mainmatter />
            </fr:tree>
            <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>24</fr:day>
                </fr:date>
                <fr:title text="Sarah · Alex G">Sarah · Alex G</fr:title>
                <fr:meta name="youtube">wQSxzUvQY7k</fr:meta>
              </fr:frontmatter>
              <fr:mainmatter />
            </fr:tree>
            <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>24</fr:day>
                </fr:date>
                <fr:title text="Miraidempa - Unslept">Miraidempa - Unslept</fr:title>
                <fr:meta name="youtube">yLUsISIMgDQ</fr:meta>
              </fr:frontmatter>
              <fr:mainmatter />
            </fr:tree>
            <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>24</fr:day>
                </fr:date>
                <fr:title text="I Just Threw Out The Love Of My Dreams - weezer">I Just Threw Out The Love Of My Dreams - weezer</fr:title>
                <fr:meta name="youtube">r2dosVRzLSM</fr:meta>
              </fr:frontmatter>
              <fr:mainmatter />
            </fr:tree>
            <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>24</fr:day>
                </fr:date>
                <fr:title text="Let Down - Radiohead">Let Down - Radiohead</fr:title>
                <fr:meta name="youtube">duBCwvC1kP4</fr:meta>
              </fr:frontmatter>
              <fr:mainmatter />
            </fr:tree>
            <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>24</fr:day>
                </fr:date>
                <fr:title text="いきのこり●ぼくら · Ichiko Aoba">いきのこり●ぼくら · Ichiko Aoba</fr:title>
                <fr:meta name="youtube">4kzYOqNRrco</fr:meta>
              </fr:frontmatter>
              <fr:mainmatter />
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2026</fr:year>
              <fr:month>2</fr:month>
              <fr:day>23</fr:day>
            </fr:date>
            <fr:uri>https://kream.codeberg.page/forest/tt-AVSP/</fr:uri>
            <fr:display-uri>tt-AVSP</fr:display-uri>
            <fr:route>/forest/tt-AVSP/</fr:route>
            <fr:title text="Diagrammatical/Graphical Approaches in Algebra, Category Theory, and Computation">Diagrammatical/Graphical Approaches in Algebra, Category Theory, and Computation</fr:title>
            <fr:meta name="draft">true</fr:meta>
          </fr:frontmatter>
          <fr:mainmatter>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>23</fr:day>
                </fr:date>
                <fr:title text="Graphical Linear Algebra and related languages">Graphical Linear Algebra and related languages</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:ul><html:li><fr:link href="https://graphicallinearalgebra.net/" type="external">Graphical Linear Algebra</fr:link></html:li>
    <html:li><fr:link href="/forest/qc-0005/" title="The ZX-calculus" uri="https://kream.codeberg.page/forest/qc-0005/" display-uri="qc-0005" type="local">The ZX-calculus</fr:link></html:li>
    <html:li><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link></fr:author></fr:authors><fr:date><fr:year>2026</fr:year><fr:month>3</fr:month><fr:day>5</fr:day></fr:date><fr:uri>https://kream.codeberg.page/forest/tt-AVT7/</fr:uri><fr:display-uri>tt-AVT7</fr:display-uri><fr:route>/forest/tt-AVT7/</fr:route><fr:title text="String diagrams for the λ-calculus?">String diagrams for the λ-calculus?</fr:title><fr:meta name="draft">true</fr:meta></fr:frontmatter><fr:mainmatter><html:p>if you are like me and walked away from most introductions of interaction calculus online unsatisfied, here's a cool article that puts interactive calculus into the perspective of symmetric monoidal categories.</html:p><html:p><fr:link href="https://piedeleu.com/posts/diagrammatic-lambda-calculus" type="external">Link</fr:link></html:p><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link></fr:author></fr:authors><fr:date><fr:year>2026</fr:year><fr:month>3</fr:month><fr:day>5</fr:day></fr:date><fr:title text="Planned links">Planned links</fr:title></fr:frontmatter><fr:mainmatter><html:ul><html:li>interaction calculus</html:li></html:ul></fr:mainmatter></fr:tree></fr:mainmatter></fr:tree></html:li></html:ul>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>23</fr:day>
                </fr:date>
                <fr:title text="Diagrammatic Category Theory">Diagrammatic Category Theory</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:uri>https://kream.codeberg.page/forest/cat-C710/</fr:uri>
                    <fr:display-uri>cat-C710</fr:display-uri>
                    <fr:route>/forest/cat-C710/</fr:route>
                    <fr:title text="String diagram">String diagram</fr:title>
                    <fr:meta name="draft">true</fr:meta>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>A <html:strong>string diagram</html:strong> is a graphical calculus for reasoning in <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/monoidal%20category" type="external">monoidal categories</fr:link></html:span>. Objects are drawn as wires (vertical lines), morphisms as boxes with input wires entering from below and output wires leaving above. Composition is vertical stacking, and the monoidal product is horizontal juxtaposition. The key advantage is that equational reasoning becomes topological: two expressions are equal if and only if their diagrams are related by planar isotopy. See <fr:link href="/forest/cat-C70Z/" title="A survey of graphical languages for monoidal categories" uri="https://kream.codeberg.page/forest/cat-C70Z/" display-uri="cat-C70Z" type="local">A survey of graphical languages for monoidal categories</fr:link> for the standard survey.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:title text="Identity and composition">Identity and composition</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter><html:p>The identity morphism <fr:tex display="inline"><![CDATA[\mathrm {id}_A \colon  A \rightarrow  A]]></fr:tex> is a plain wire. Composition <fr:tex display="inline"><![CDATA[g \circ  f]]></fr:tex> stacks <fr:tex display="inline"><![CDATA[f]]></fr:tex> below <fr:tex display="inline"><![CDATA[g]]></fr:tex>:</html:p>
  <html:center><fr:resource hash="fe8785d9f73e6164ba8660e1e941502c"><fr:resource-content><html:img src="/forest/fe8785d9f73e6164ba8660e1e941502c.svg" /></fr:resource-content><fr:resource-source type="latex" part="preamble"><![CDATA[\usepackage {amsmath}\usepackage {amssymb}\usepackage {tikz}\usetikzlibrary {decorations.markings,calc,arrows.meta,positioning}]]></fr:resource-source><fr:resource-source type="latex" part="body"><![CDATA[    \begin{tikzpicture}[
      box/.style={draw, minimum width=1cm, minimum height=0.7cm, fill=white},
      wire/.style={thick}
    ]
      % Identity wire
      \draw[wire] (0,0) -- (0,2.5);
      \node[left] at (0,1.25) {$A$};
      \node[below] at (0,-0.3) {Identity $\mathrm{id}_A$};

      % Composition
      \begin{scope}[xshift=4cm]
        \draw[wire] (0,0) -- (0,2.5);
        \node[box] at (0,0.7) {$f$};
        \node[box] at (0,1.8) {$g$};
        \node[left] at (0,0) {$A$};
        \node[left] at (0,1.25) {$B$};
        \node[left] at (0,2.5) {$C$};
        \node[below] at (0,-0.3) {$g \circ f$};
      \end{scope}
    \end{tikzpicture}]]></fr:resource-source></fr:resource></html:center>
</fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:title text="Tensor product">Tensor product</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter><html:p>The monoidal product <fr:tex display="inline"><![CDATA[A \otimes  B]]></fr:tex> places wires side by side. A morphism <fr:tex display="inline"><![CDATA[f \otimes  g]]></fr:tex> is two boxes in parallel:</html:p>
  <html:center><fr:resource hash="6bb560f43cdd8fc842a694b6d02dd50e"><fr:resource-content><html:img src="/forest/6bb560f43cdd8fc842a694b6d02dd50e.svg" /></fr:resource-content><fr:resource-source type="latex" part="preamble"><![CDATA[\usepackage {amsmath}\usepackage {amssymb}\usepackage {tikz}\usetikzlibrary {decorations.markings,calc,arrows.meta,positioning}]]></fr:resource-source><fr:resource-source type="latex" part="body"><![CDATA[    \begin{tikzpicture}[
      box/.style={draw, minimum width=1cm, minimum height=0.7cm, fill=white},
      wire/.style={thick}
    ]
      % Parallel wires
      \draw[wire] (0,0) -- (0,2);
      \draw[wire] (1.5,0) -- (1.5,2);
      \node[box] at (0,1) {$f$};
      \node[box] at (1.5,1) {$g$};
      \node[left] at (0,0) {$A$};
      \node[left] at (0,2) {$A'$};
      \node[right] at (1.5,0) {$B$};
      \node[right] at (1.5,2) {$B'$};
      \node[below] at (0.75,-0.3) {$f \otimes g$};
    \end{tikzpicture}]]></fr:resource-source></fr:resource></html:center>
</fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:title text="Symmetry (braiding)">Symmetry (braiding)</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter><html:p>In a symmetric monoidal category, the swap <fr:tex display="inline"><![CDATA[\sigma _{A,B} \colon  A \otimes  B \rightarrow  B \otimes  A]]></fr:tex> is drawn as a crossing:</html:p>
  <html:center><fr:resource hash="d39430fee70214ae7ac8aafd44d37178"><fr:resource-content><html:img src="/forest/d39430fee70214ae7ac8aafd44d37178.svg" /></fr:resource-content><fr:resource-source type="latex" part="preamble"><![CDATA[\usepackage {amsmath}\usepackage {amssymb}\usepackage {tikz}\usetikzlibrary {decorations.markings,calc,arrows.meta,positioning}]]></fr:resource-source><fr:resource-source type="latex" part="body"><![CDATA[    \begin{tikzpicture}[wire/.style={thick}]
      \draw[wire] (0,0) .. controls (0,1) and (1.5,1) .. (1.5,2);
      \draw[wire, white, line width=4pt] (1.5,0) .. controls (1.5,1) and (0,1) .. (0,2);
      \draw[wire] (1.5,0) .. controls (1.5,1) and (0,1) .. (0,2);
      \node[left] at (0,0) {$A$};
      \node[right] at (1.5,0) {$B$};
      \node[left] at (0,2) {$B$};
      \node[right] at (1.5,2) {$A$};
    \end{tikzpicture}]]></fr:resource-source></fr:resource></html:center>
</fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:title text="Cups and caps (duality)">Cups and caps (duality)</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter><html:p>In a monoidal category with duals, the unit <fr:tex display="inline"><![CDATA[\eta  \colon  I \rightarrow  A \otimes  A^{*}]]></fr:tex> and counit <fr:tex display="inline"><![CDATA[\varepsilon  \colon  A^{*} \otimes  A \rightarrow  I]]></fr:tex> are drawn as a cup (U-shape) and cap (inverted U):</html:p>
  <html:center><fr:resource hash="e4047330bdbca897bff7f6b7e798a5e9"><fr:resource-content><html:img src="/forest/e4047330bdbca897bff7f6b7e798a5e9.svg" /></fr:resource-content><fr:resource-source type="latex" part="preamble"><![CDATA[\usepackage {amsmath}\usepackage {amssymb}\usepackage {tikz}\usetikzlibrary {decorations.markings,calc,arrows.meta,positioning}]]></fr:resource-source><fr:resource-source type="latex" part="body"><![CDATA[    \begin{tikzpicture}[wire/.style={thick}]
      % Cup (unit)
      \draw[wire] (0,0) arc (180:0:0.75);
      \node[left] at (0,0) {$A$};
      \node[right] at (1.5,0) {$A^*$};
      \node[below] at (0.75,-0.3) {Cup ($\eta$)};

      % Cap (counit)
      \begin{scope}[xshift=4cm]
        \draw[wire] (0,1.5) arc (180:360:0.75);
        \node[left] at (0,1.5) {$A^*$};
        \node[right] at (1.5,1.5) {$A$};
        \node[above] at (0.75,1.8) {Cap ($\varepsilon$)};
      \end{scope}
    \end{tikzpicture}]]></fr:resource-source></fr:resource></html:center>
</fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:title text="Snake identity">Snake identity</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter><html:p>The zig-zag (snake) identity <fr:tex display="inline"><![CDATA[(\varepsilon  \otimes  \mathrm {id}_A) \circ  (\mathrm {id}_A \otimes  \eta ) = \mathrm {id}_A]]></fr:tex> asserts that a wire can be straightened:</html:p>
  <html:center><fr:resource hash="951c55aa9e3b3df984400ef45eddebc5"><fr:resource-content><html:img src="/forest/951c55aa9e3b3df984400ef45eddebc5.svg" /></fr:resource-content><fr:resource-source type="latex" part="preamble"><![CDATA[\usepackage {amsmath}\usepackage {amssymb}\usepackage {tikz}\usetikzlibrary {decorations.markings,calc,arrows.meta,positioning}]]></fr:resource-source><fr:resource-source type="latex" part="body"><![CDATA[    \begin{tikzpicture}[wire/.style={thick}]
      % Zig-zag
      \draw[wire] (0,0) -- (0,1) arc (180:0:0.5) -- (1,0.5) arc (180:360:0.5) -- (2,2);
      \node[left] at (0,0) {$A$};
      \node[right] at (2,2) {$A$};

      % Equals
      \node at (3,1) {$=$};

      % Straight wire
      \draw[wire] (4,0) -- (4,2);
      \node[left] at (4,0) {$A$};
      \node[left] at (4,2) {$A$};
    \end{tikzpicture}]]></fr:resource-source></fr:resource></html:center>
</fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <html:ul><html:li><fr:link href="/forest/cat-C70Z/" title="A survey of graphical languages for monoidal categories" uri="https://kream.codeberg.page/forest/cat-C70Z/" display-uri="cat-C70Z" type="local">A survey of graphical languages for monoidal categories</fr:link></html:li>
    <html:li>Rosetta Stone</html:li></html:ul>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>23</fr:day>
                </fr:date>
                <fr:title text="Graph-reduction based Computational Models">Graph-reduction based Computational Models</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:ul><html:li><fr:link href="/forest/tt-AVSO/" title="Interaction Nets and Interaction Calculus" uri="https://kream.codeberg.page/forest/tt-AVSO/" display-uri="tt-AVSO" type="local">Interaction Nets and Interaction Calculus</fr:link></html:li>
    <html:li /></html:ul>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>23</fr:day>
                </fr:date>
                <fr:title text="Planned links">Planned links</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:ul><html:li>John Baez Rosetta Stone</html:li>
    <html:li>https://arxiv.org/abs/2307.08891</html:li>
    <html:li>https://github.com/VictorTaelin/Interaction-Calculus</html:li>
    <html:li>HVM</html:li></html:ul>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2026</fr:year>
              <fr:month>2</fr:month>
              <fr:day>20</fr:day>
            </fr:date>
            <fr:uri>https://kream.codeberg.page/forest/tt-AVRB/</fr:uri>
            <fr:display-uri>tt-AVRB</fr:display-uri>
            <fr:route>/forest/tt-AVRB/</fr:route>
            <fr:title text="Modal Homotopy Type Theory">Modal Homotopy Type Theory</fr:title>
            <fr:meta name="draft">true</fr:meta>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Reading notes on <html:em><fr:link href="https://global.oup.com/academic/product/modal-homotopy-type-theory-9780198853404" type="external">Modal Homotopy Type Theory: The Prospect of a New Logic for Philosophy</fr:link></html:em> by David Corfield.</html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>20</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/tt-AVRC/</fr:uri>
                <fr:display-uri>tt-AVRC</fr:display-uri>
                <fr:route>/forest/tt-AVRC/</fr:route>
                <fr:title text="Chapter 1: A Path to a New Logic">Chapter 1: A Path to a New Logic</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:title text="First Encounters">First Encounters</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:title text="Next Steps">Next Steps</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:title text="Encounters with Ordinary Language Philosophy">Encounters with Ordinary Language Philosophy</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:title text="Quadrature">Quadrature</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>20</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/tt-AVRD/</fr:uri>
                <fr:display-uri>tt-AVRD</fr:display-uri>
                <fr:route>/forest/tt-AVRD/</fr:route>
                <fr:title text="Chapter 2: Dependent Types">Chapter 2: Dependent Types</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:title text="The Need for Types">The Need for Types</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:title text="The Analogy between Logic and Arithmetic">The Analogy between Logic and Arithmetic</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:title text="Dependent Sum and 'and'">Dependent Sum and 'and'</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:title text="Dependent Types">Dependent Types</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:title text="Context and Dependency Structure">Context and Dependency Structure</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:title text="Events as Basic Types">Events as Basic Types</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:title text="Revisiting the Philosophical Literature">Revisiting the Philosophical Literature</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>20</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/tt-AVRE/</fr:uri>
                <fr:display-uri>tt-AVRE</fr:display-uri>
                <fr:route>/forest/tt-AVRE/</fr:route>
                <fr:title text="Chapter 3: Homotopy Types">Chapter 3: Homotopy Types</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:title text="HoTT Components">HoTT Components</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:title text="Definite Description in Natural Language">Definite Description in Natural Language</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:title text="The Structure of A">The Structure of A</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>20</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/tt-AVRF/</fr:uri>
                <fr:display-uri>tt-AVRF</fr:display-uri>
                <fr:route>/forest/tt-AVRF/</fr:route>
                <fr:title text="Chapter 4: Modal Types">Chapter 4: Modal Types</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:title text="Modalities as Monads">Modalities as Monads</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:title text="Towards Modal HoTT">Towards Modal HoTT</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:title text="Temporal Type Theory">Temporal Type Theory</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:title text="Mode Theory">Mode Theory</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>20</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/tt-AVRG/</fr:uri>
                <fr:display-uri>tt-AVRG</fr:display-uri>
                <fr:route>/forest/tt-AVRG/</fr:route>
                <fr:title text="Chapter 5: Spatial Types">Chapter 5: Spatial Types</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:title text="Current Geometry">Current Geometry</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:title text="Regaining the Philosophy of Geometry">Regaining the Philosophy of Geometry</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:title text="Capturing Modern Geometry">Capturing Modern Geometry</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:title text="Geometry in Modal HoTT">Geometry in Modal HoTT</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:title text="Simplicity and Representability in Modal HoTT">Simplicity and Representability in Modal HoTT</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>20</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/tt-AVRH/</fr:uri>
                <fr:display-uri>tt-AVRH</fr:display-uri>
                <fr:route>/forest/tt-AVRH/</fr:route>
                <fr:title text="Chapter 6: Conclusion">Chapter 6: Conclusion</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>TODO</html:p>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2026</fr:year>
              <fr:month>2</fr:month>
              <fr:day>17</fr:day>
            </fr:date>
            <fr:uri>https://kream.codeberg.page/forest/tt-AVR4/</fr:uri>
            <fr:display-uri>tt-AVR4</fr:display-uri>
            <fr:route>/forest/tt-AVR4/</fr:route>
            <fr:title text="Principles of Dependent Type Theory notes">Principles of Dependent Type Theory notes</fr:title>
            <fr:meta name="draft">true</fr:meta>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>These are my reading notes for <fr:link href="/forest/angiuli2025principles/" title="Principles of dependent type theory" uri="https://kream.codeberg.page/forest/angiuli2025principles/" display-uri="angiuli2025principles" type="local">Principles of dependent type theory</fr:link>.</html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>17</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/tt-AVRN/</fr:uri>
                <fr:display-uri>tt-AVRN</fr:display-uri>
                <fr:route>/forest/tt-AVRN/</fr:route>
                <fr:title text="Chapter 1: Introduction">Chapter 1: Introduction</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVRT/</fr:uri>
                    <fr:display-uri>tt-AVRT</fr:display-uri>
                    <fr:route>/forest/tt-AVRT/</fr:route>
                    <fr:title text="Uniform dependency: length-indexed vectors">Uniform dependency: length-indexed vectors</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVRU/</fr:uri>
                    <fr:display-uri>tt-AVRU</fr:display-uri>
                    <fr:route>/forest/tt-AVRU/</fr:route>
                    <fr:title text="Non-uniform dependency: computing arities">Non-uniform dependency: computing arities</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVRV/</fr:uri>
                    <fr:display-uri>tt-AVRV</fr:display-uri>
                    <fr:route>/forest/tt-AVRV/</fr:route>
                    <fr:title text="Proving type equations">Proving type equations</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>17</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/tt-AVRO/</fr:uri>
                <fr:display-uri>tt-AVRO</fr:display-uri>
                <fr:route>/forest/tt-AVRO/</fr:route>
                <fr:title text="Chapter 2: Extensional type theory">Chapter 2: Extensional type theory</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVRW/</fr:uri>
                    <fr:display-uri>tt-AVRW</fr:display-uri>
                    <fr:route>/forest/tt-AVRW/</fr:route>
                    <fr:title text="The simply-typed lambda calculus">The simply-typed lambda calculus</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVRX/</fr:uri>
                    <fr:display-uri>tt-AVRX</fr:display-uri>
                    <fr:route>/forest/tt-AVRX/</fr:route>
                    <fr:title text="Towards the syntax of dependent type theory">Towards the syntax of dependent type theory</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVRY/</fr:uri>
                    <fr:display-uri>tt-AVRY</fr:display-uri>
                    <fr:route>/forest/tt-AVRY/</fr:route>
                    <fr:title text="The calculus of substitutions">The calculus of substitutions</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVRZ/</fr:uri>
                    <fr:display-uri>tt-AVRZ</fr:display-uri>
                    <fr:route>/forest/tt-AVRZ/</fr:route>
                    <fr:title text="Internalizing judgmental structure: \Pi , \Sigma , \mathrm {Eq}, \mathrm {Unit}">Internalizing judgmental structure: <fr:tex display="inline"><![CDATA[\Pi , \Sigma , \mathrm {Eq}, \mathrm {Unit}]]></fr:tex></fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVS0/</fr:uri>
                    <fr:display-uri>tt-AVS0</fr:display-uri>
                    <fr:route>/forest/tt-AVS0/</fr:route>
                    <fr:title text="Inductive types: \mathrm {Void}, \mathrm {Bool}, +, \mathbb {N}">Inductive types: <fr:tex display="inline"><![CDATA[\mathrm {Void}, \mathrm {Bool}, +, \mathbb {N}]]></fr:tex></fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVS1/</fr:uri>
                    <fr:display-uri>tt-AVS1</fr:display-uri>
                    <fr:route>/forest/tt-AVS1/</fr:route>
                    <fr:title text="Universes: \mathcal {U}_0, \mathcal {U}_1, \mathcal {U}_2, \ldots ">Universes: <fr:tex display="inline"><![CDATA[\mathcal {U}_0, \mathcal {U}_1, \mathcal {U}_2, \ldots ]]></fr:tex></fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVS2/</fr:uri>
                    <fr:display-uri>tt-AVS2</fr:display-uri>
                    <fr:route>/forest/tt-AVS2/</fr:route>
                    <fr:title text="Propositions and propositional truncation">Propositions and propositional truncation</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>17</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/tt-AVRP/</fr:uri>
                <fr:display-uri>tt-AVRP</fr:display-uri>
                <fr:route>/forest/tt-AVRP/</fr:route>
                <fr:title text="Chapter 3: Metatheory and implementation">Chapter 3: Metatheory and implementation</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVS3/</fr:uri>
                    <fr:display-uri>tt-AVS3</fr:display-uri>
                    <fr:route>/forest/tt-AVS3/</fr:route>
                    <fr:title text="A judgmental reconstruction of proof assistants">A judgmental reconstruction of proof assistants</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVS4/</fr:uri>
                    <fr:display-uri>tt-AVS4</fr:display-uri>
                    <fr:route>/forest/tt-AVS4/</fr:route>
                    <fr:title text="Metatheory for type-checking">Metatheory for type-checking</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVS5/</fr:uri>
                    <fr:display-uri>tt-AVS5</fr:display-uri>
                    <fr:route>/forest/tt-AVS5/</fr:route>
                    <fr:title text="A case study in elaboration: definitions">A case study in elaboration: definitions</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVS6/</fr:uri>
                    <fr:display-uri>tt-AVS6</fr:display-uri>
                    <fr:route>/forest/tt-AVS6/</fr:route>
                    <fr:title text="Models for metatheory">Models for metatheory</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVS7/</fr:uri>
                    <fr:display-uri>tt-AVS7</fr:display-uri>
                    <fr:route>/forest/tt-AVS7/</fr:route>
                    <fr:title text="The set model of type theory">The set model of type theory</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVS8/</fr:uri>
                    <fr:display-uri>tt-AVS8</fr:display-uri>
                    <fr:route>/forest/tt-AVS8/</fr:route>
                    <fr:title text="Equality in extensional type theory is undecidable">Equality in extensional type theory is undecidable</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>17</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/tt-AVRQ/</fr:uri>
                <fr:display-uri>tt-AVRQ</fr:display-uri>
                <fr:route>/forest/tt-AVRQ/</fr:route>
                <fr:title text="Chapter 4: Intensional type theory">Chapter 4: Intensional type theory</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVS9/</fr:uri>
                    <fr:display-uri>tt-AVS9</fr:display-uri>
                    <fr:route>/forest/tt-AVS9/</fr:route>
                    <fr:title text="Programming with propositional equality">Programming with propositional equality</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVSA/</fr:uri>
                    <fr:display-uri>tt-AVSA</fr:display-uri>
                    <fr:route>/forest/tt-AVSA/</fr:route>
                    <fr:title text="Intensional identity types">Intensional identity types</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVSB/</fr:uri>
                    <fr:display-uri>tt-AVSB</fr:display-uri>
                    <fr:route>/forest/tt-AVSB/</fr:route>
                    <fr:title text="Limitations of the intensional identity type">Limitations of the intensional identity type</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVSC/</fr:uri>
                    <fr:display-uri>tt-AVSC</fr:display-uri>
                    <fr:route>/forest/tt-AVSC/</fr:route>
                    <fr:title text="Observational type theory">Observational type theory</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>17</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/tt-AVRR/</fr:uri>
                <fr:display-uri>tt-AVRR</fr:display-uri>
                <fr:route>/forest/tt-AVRR/</fr:route>
                <fr:title text="Chapter 5: Univalent type theories">Chapter 5: Univalent type theories</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVSD/</fr:uri>
                    <fr:display-uri>tt-AVSD</fr:display-uri>
                    <fr:route>/forest/tt-AVSD/</fr:route>
                    <fr:title text="Propositional univalence">Propositional univalence</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVSE/</fr:uri>
                    <fr:display-uri>tt-AVSE</fr:display-uri>
                    <fr:route>/forest/tt-AVSE/</fr:route>
                    <fr:title text="Homotopy type theory">Homotopy type theory</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVSF/</fr:uri>
                    <fr:display-uri>tt-AVSF</fr:display-uri>
                    <fr:route>/forest/tt-AVSF/</fr:route>
                    <fr:title text="Cubical type theory">Cubical type theory</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVSG/</fr:uri>
                    <fr:display-uri>tt-AVSG</fr:display-uri>
                    <fr:route>/forest/tt-AVSG/</fr:route>
                    <fr:title text="Computing with coercions and compositions">Computing with coercions and compositions</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>17</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/tt-AVRS/</fr:uri>
                <fr:display-uri>tt-AVRS</fr:display-uri>
                <fr:route>/forest/tt-AVRS/</fr:route>
                <fr:title text="Chapter 6: Semantics of type theory">Chapter 6: Semantics of type theory</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVSH/</fr:uri>
                    <fr:display-uri>tt-AVSH</fr:display-uri>
                    <fr:route>/forest/tt-AVSH/</fr:route>
                    <fr:title text="Categories with families">Categories with families</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVSI/</fr:uri>
                    <fr:display-uri>tt-AVSI</fr:display-uri>
                    <fr:route>/forest/tt-AVSI/</fr:route>
                    <fr:title text="Pullback squares and \Pi , \Sigma , \mathrm {Eq}, \mathrm {Unit}">Pullback squares and <fr:tex display="inline"><![CDATA[\Pi , \Sigma , \mathrm {Eq}, \mathrm {Unit}]]></fr:tex></fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVSJ/</fr:uri>
                    <fr:display-uri>tt-AVSJ</fr:display-uri>
                    <fr:route>/forest/tt-AVSJ/</fr:route>
                    <fr:title text="Orthogonality and \mathrm {Void}, \mathrm {Bool}, +, \mathbb {N}">Orthogonality and <fr:tex display="inline"><![CDATA[\mathrm {Void}, \mathrm {Bool}, +, \mathbb {N}]]></fr:tex></fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVSK/</fr:uri>
                    <fr:display-uri>tt-AVSK</fr:display-uri>
                    <fr:route>/forest/tt-AVSK/</fr:route>
                    <fr:title text="Cwf morphisms and \mathcal {U}_0, \mathcal {U}_1, \mathcal {U}_2, \ldots ">Cwf morphisms and <fr:tex display="inline"><![CDATA[\mathcal {U}_0, \mathcal {U}_1, \mathcal {U}_2, \ldots ]]></fr:tex></fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVSL/</fr:uri>
                    <fr:display-uri>tt-AVSL</fr:display-uri>
                    <fr:route>/forest/tt-AVSL/</fr:route>
                    <fr:title text="Locally cartesian closed categories and coherence">Locally cartesian closed categories and coherence</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVSM/</fr:uri>
                    <fr:display-uri>tt-AVSM</fr:display-uri>
                    <fr:route>/forest/tt-AVSM/</fr:route>
                    <fr:title text="Canonicity via gluing">Canonicity via gluing</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVSN/</fr:uri>
                    <fr:display-uri>tt-AVSN</fr:display-uri>
                    <fr:route>/forest/tt-AVSN/</fr:route>
                    <fr:title text="A semantic definition of syntax">A semantic definition of syntax</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2026</fr:year>
              <fr:month>2</fr:month>
              <fr:day>17</fr:day>
            </fr:date>
            <fr:uri>https://kream.codeberg.page/forest/gfx-0007/</fr:uri>
            <fr:display-uri>gfx-0007</fr:display-uri>
            <fr:route>/forest/gfx-0007/</fr:route>
            <fr:title text="Graphics">Graphics</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Notes on graphics programming: signed distance functions, ray marching, GLSL shaders, and creative coding.</html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>17</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/blog-0002/</fr:uri>
                <fr:display-uri>blog-0002</fr:display-uri>
                <fr:route>/forest/blog-0002/</fr:route>
                <fr:title text="Building goltorus: Game of Life on a ray-marched torus">Building goltorus: Game of Life on a ray-marched torus</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>This post walks through building <html:code>goltorus.glsl</html:code> — a fragment shader that runs Conway's Game of Life on the surface of a ray-marched torus — in six incremental steps. Each step adds one major concept, and every canvas below is a live shader you can interact with.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="How to interact with the shaders">How to interact with the shaders</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Each shader canvas starts paused behind a dark overlay. Click the <html:strong>play</html:strong> button (or tap on mobile) to start it. Once running, a <html:strong>×</html:strong> close button appears in the top-right corner. On desktop, the shader also stops automatically when your cursor leaves the canvas area. On mobile, tap the close button to stop.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="Why a torus?">Why a torus?</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Conway's Game of Life is usually run on a finite grid with edges that wrap: a glider exiting the right side re-enters on the left, and one exiting the top re-enters at the bottom. This wrapping is implemented with <html:code>mod</html:code> — but it has a precise topological meaning.</html:p>
                    <html:p>Identifying the left and right edges of a rectangle (without twisting) produces a cylinder. Identifying the remaining top and bottom edges then closes it into a <fr:link href="/forest/top-0001/" title="Torus" uri="https://kream.codeberg.page/forest/top-0001/" display-uri="top-0001" type="local">torus</fr:link>. Formally, the flat torus is the quotient of the plane by the integer lattice:</html:p>
                    <fr:tex display="block"><![CDATA[
    T^2 \;\cong \; \mathbb {R}^2 / \mathbb {Z}^2 \;\cong \; S^1 \times  S^1
  ]]></fr:tex>
                    <html:p>So every toroidally-wrapping Game of Life grid is <html:em>already</html:em> living on a torus — the cells just happen to be drawn flat. This project makes that implicit topology explicit: we render the GoL state on the surface of an actual torus, so the visual matches the mathematics.</html:p>
                    <html:p>(Compare: if you <html:em>twist</html:em> one pair of edges before identifying, you get a Möbius strip or Klein bottle instead. The standard <html:code>mod</html:code> wrapping applies no twist, so the resulting surface is genuinely a torus.)</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="What you will need">What you will need</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>This post assumes no prior experience with shader programming. Here is the minimum vocabulary:</html:p>
                    <html:ul><html:li>A <html:em>GLSL fragment shader</html:em> is a small program that runs on the GPU, once per pixel, every frame. It receives the pixel's screen coordinates and outputs a colour. All the visuals in this post are fragment shaders.</html:li>
    <html:li>A <html:em>signed distance function</html:em> (<fr:link href="/forest/gfx-0001/" title="Signed distance function" uri="https://kream.codeberg.page/forest/gfx-0001/" display-uri="gfx-0001" type="local">Signed distance function</fr:link>) is a function that takes a point in 3D space and returns how far that point is from the nearest surface — negative if inside, positive if outside.</html:li>
    <html:li><html:em>Ray marching</html:em> (<fr:link href="/forest/gfx-0002/" title="Ray marching (sphere tracing)" uri="https://kream.codeberg.page/forest/gfx-0002/" display-uri="gfx-0002" type="local">Ray marching (sphere tracing)</fr:link>) is a rendering technique that finds where a camera ray hits a surface by stepping along the ray, using the SDF value as a safe step size.</html:li></html:ul>
                    <html:p>By the end, you will have built a shader that casts rays from a virtual camera, finds a torus surface via sphere tracing, maps 2D cellular automaton state onto it via UV coordinates, and lights the result with Phong shading — all in a single fragment shader running in your browser.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="Step 1: Ray-marching a sphere">Step 1: Ray-marching a sphere</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>We start with the simplest possible ray marcher: a white sphere floating in black space. The shader sets up a virtual camera, casts a ray for each pixel, and marches along it using the <fr:link href="/forest/gfx-0002/" title="Ray marching (sphere tracing)" uri="https://kream.codeberg.page/forest/gfx-0002/" display-uri="gfx-0002" type="local">sphere-tracing algorithm</fr:link>.</html:p>
                    <html:p>The scene contains a single <fr:link href="/forest/gfx-0001/" title="Signed distance function" uri="https://kream.codeberg.page/forest/gfx-0001/" display-uri="gfx-0001" type="local">Signed distance function</fr:link>: a sphere of radius 1 centred at the origin. The camera sits at <fr:tex display="inline"><![CDATA[z = 3]]></fr:tex>, looking down the <fr:tex display="inline"><![CDATA[-z]]></fr:tex> axis:</html:p>
                    <html:pre><![CDATA[float sdSphere(vec3 p, float r) {
    return length(p) - r;
}

float rayMarch(vec3 ro, vec3 rd) {
    float t = 0.0;
    for (int i = 0; i < MAX_STEPS; i++) {
        vec3 p = ro + rd * t;
        float d = getDist(p);
        t += d;
        if (t > MAX_DIST || abs(d) < SURF_DIST) break;
    }
    return t;
}]]></html:pre>
                    <html:p>If the ray reaches a surface (<fr:tex display="inline"><![CDATA[d < d_{\max }]]></fr:tex>), the pixel is white. Otherwise, black.</html:p>
                    <html:canvas class="glslCanvas" width="640" height="640" data-fragment-url="/forest/bafkrmiduuv6vy2hxjzdeb5fdkpq2fit6wfaj7fcnobjiqecini4sjy5clu.frag">Loading shader...</html:canvas>
                    <html:p>Move your cursor over the diagram below to explore the ray marching process. The <html:strong>blue dot</html:strong> is the camera (ray origin). The <html:strong>red arrow</html:strong> is the ray cast from the camera toward the cursor position. The <html:strong>green arrow</html:strong> is the SDF value at the cursor — it points toward the nearest surface and its length is the safe step distance. When the cursor is inside the sphere, the green arrow points outward to the surface.</html:p>
                    <html:canvas class="glslCanvas" width="640" height="640" data-fragment-url="/forest/bafkrmidjyvnpfddlbyhfu7g6rxzr77chudsg6xjya5drk27kyk4lmqnoay.frag">Loading shader...</html:canvas>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="Step 2: Replacing the sphere with a torus">Step 2: Replacing the sphere with a torus</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Now we swap the sphere SDF for a <fr:link href="/forest/gfx-0003/" title="Torus SDF" uri="https://kream.codeberg.page/forest/gfx-0003/" display-uri="gfx-0003" type="local">Torus SDF</fr:link> and add rotation. The torus sits in the <fr:tex display="inline"><![CDATA[xz]]></fr:tex>-plane with major radius <fr:tex display="inline"><![CDATA[R = 1]]></fr:tex> and minor radius <fr:tex display="inline"><![CDATA[r = 0.4]]></fr:tex>:</html:p>
                    <html:pre><![CDATA[float sdTorus(vec3 p, vec2 t) {
    vec2 q = vec2(length(p.xz) - t.x, p.y);
    return length(q) - t.y;
}]]></html:pre>
                    <html:p>To make it visually interesting, we apply a time-dependent rotation <html:em>to the scene</html:em> — rotating the point before evaluating the SDF. This is equivalent to rotating the camera in the opposite direction:</html:p>
                    <html:pre><![CDATA[float getDist(vec3 p) {
    p = rotateX(u_time * 0.5)
      * rotateY(u_time * 0.3) * p;
    return sdTorus(p, vec2(1.0, 0.4));
}]]></html:pre>
                    <html:canvas class="glslCanvas" width="640" height="640" data-fragment-url="/forest/bafkrmihu5iui76ea6qo7eh7wl5hl3gm43qsbmnpr2veil332rgdfmdifke.frag">Loading shader...</html:canvas>
                    <html:p>The same visualisation applied to the torus cross-section. The torus appears as two circles — the tube sliced through the <fr:tex display="inline"><![CDATA[xz]]></fr:tex>-plane. The green arrow always points to the nearest of the two tube walls.</html:p>
                    <html:canvas class="glslCanvas" width="640" height="640" data-fragment-url="/forest/bafkrmichbdxilo5q6yop5a65zwv2om3b4jymjcljxzdq6vys7kiah7d4vy.frag">Loading shader...</html:canvas>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="Step 3: Adding lighting">Step 3: Adding lighting</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>A white silhouette is hard to read. We add Phong-style lighting: diffuse illumination from a point light at <fr:tex display="inline"><![CDATA[(2, 3, 2)]]></fr:tex> plus a specular highlight.</html:p>
                    <html:p>First we need surface normals. Since we don't have an analytic gradient, we estimate it with <fr:link href="/forest/gfx-0004/" title="SDF surface normals via finite differences" uri="https://kream.codeberg.page/forest/gfx-0004/" display-uri="gfx-0004" type="local">SDF surface normals via finite differences</fr:link> — evaluating the SDF at three nearby points:</html:p>
                    <html:pre><![CDATA[vec3 getNormal(vec3 p) {
    float d = getDist(p);
    vec2 e = vec2(0.0001, 0.0);
    vec3 n = d - vec3(
        getDist(p - e.xyy),
        getDist(p - e.yxy),
        getDist(p - e.yyx)
    );
    return normalize(n);
}]]></html:pre>
                    <html:p>The diffuse term is <fr:tex display="inline"><![CDATA[\max (\hat {n} \cdot  \hat {l},\; 0)]]></fr:tex>, and the specular term is <fr:tex display="inline"><![CDATA[\max (\hat {r} \cdot  \hat {v},\; 0)^{32}]]></fr:tex> — a tight Phong highlight.</html:p>
                    <html:canvas class="glslCanvas" width="640" height="640" data-fragment-url="/forest/bafkrmihlbysx54rpzewrs6rzfp22wu7d3gnrnhw3ympwbrnlmdg2ywypka.frag">Loading shader...</html:canvas>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="Step 4: Surface parameterisation (UV mapping)">Step 4: Surface parameterisation (UV mapping)</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>To paint anything on the torus, we need a map from 3D surface points to 2D texture coordinates. A torus is naturally parameterised by two angles: the <html:em>major angle</html:em> <fr:tex display="inline"><![CDATA[\theta ]]></fr:tex> (around the central axis) and the <html:em>minor angle</html:em> <fr:tex display="inline"><![CDATA[\phi ]]></fr:tex> (around the tube cross-section).</html:p>
                    <html:p>The <html:code>interval(y, x)</html:code> helper normalises <html:code>atan2</html:code> to the half-open unit interval, handling the branch cut cleanly. The <html:code>wrapmap</html:code> function uses it to extract both angles from a surface point:</html:p>
                    <html:pre><![CDATA[float interval(float y, float x) {
    vec2 n = normalize(vec2(x, -y));
    return float(n.y < 0.0)
         + atan(n.y, n.x) / 2.0 / PI;
}

vec2 wrapmap(vec3 p) {
    float radius = 1.0;
    float minorx = -dot(
        p.xz - radius * normalize(p.xz),
        normalize(p.xz));
    return vec2(
        mod(interval(p.z, p.x) - 0.25, 1.0),
        interval(p.y, minorx)
    );
}]]></html:pre>
                    <html:p>Here we colour the torus by its UV coordinates — red for <fr:tex display="inline"><![CDATA[\theta ]]></fr:tex>, green for <fr:tex display="inline"><![CDATA[\phi ]]></fr:tex> — to verify the parameterisation before using it for anything more complex.</html:p>
                    <html:canvas class="glslCanvas" width="640" height="640" data-fragment-url="/forest/bafkrmifqfk6ubhcbqg7usdmwjgfip2btggxrhf2h2yjkdeo2254rulppym.frag">Loading shader...</html:canvas>
                    <html:p>Move your cursor over the diagram below to explore the two angles. The <html:strong>left panel</html:strong> shows the torus from above: the <html:strong>red arc</html:strong> is <fr:tex display="inline"><![CDATA[\theta ]]></fr:tex>, the major angle sweeping around the central axis. The <html:strong>right panel</html:strong> shows a cross-section of the tube: the <html:strong>green arc</html:strong> is <fr:tex display="inline"><![CDATA[\phi ]]></fr:tex>, the minor angle wrapping around the tube. Mouse position controls both angles — horizontal for <fr:tex display="inline"><![CDATA[\theta ]]></fr:tex>, vertical for <fr:tex display="inline"><![CDATA[\phi ]]></fr:tex>.</html:p>
                    <html:canvas class="glslCanvas" width="640" height="640" data-fragment-url="/forest/bafkrmidgkktxe53lcqe4qtyzrxqpeetegrlmjc5tefky7okincd2ugrzbm.frag">Loading shader...</html:canvas>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="Step 5: 2D Game of Life">Step 5: 2D Game of Life</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Before mapping it onto a torus, we implement a standalone Conway's Game of Life. Each cell is an <fr:tex display="inline"><![CDATA[8 \times  8]]></fr:tex> pixel block. The state is stored in a <html:em>backbuffer</html:em> — glslCanvas provides <html:code>u_buffer0</html:code>, a texture containing the previous frame's output.</html:p>
                    <html:p>The shader has two compilation passes. When <html:code>BUFFER_0</html:code> is defined, it computes the next GoL generation by summing the eight Moore neighbours:</html:p>
                    <html:pre><![CDATA[float sum =
    get(e.xx, sc) + get(e.xy, sc) + get(e.xz, sc) +
    get(e.yx, sc) +                  get(e.yz, sc) +
    get(e.zx, sc) + get(e.zy, sc) + get(e.zz, sc);

float next = float(sum == 3.0
    || (sum == 2.0 && alive > 0.5));]]></html:pre>
                    <html:p>The grid wraps toroidally via <html:code>mod</html:code>, so gliders that exit one edge re-enter on the opposite side. Hover over the canvas to seed new cells.</html:p>
                    <html:canvas class="glslCanvas" width="640" height="640" data-fragment-url="/forest/bafkrmiatam6jip2i3mkqberu4fw26fgt2pow5rowbwnxdbblsfsbimcnr4.frag">Loading shader...</html:canvas>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="Step 6: Putting it all together">Step 6: Putting it all together</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>The final shader splits the viewport in two. The bottom half runs the Game of Life; the top half ray-marches a rotating torus whose surface colour is sampled from the GoL grid via <html:code>wrapmap</html:code>.</html:p>
                    <html:p>In the buffer pass, GoL state is computed for the bottom half of the framebuffer. In the display pass, <html:code>sampleGoL</html:code> maps each surface point through the wrapmap to a cell coordinate, reading alive/dead from the buffer:</html:p>
                    <html:pre><![CDATA[float sampleGoL(vec3 p) {
    vec2 uv = wrapmap(p);
    vec2 screenCoord = uv * u_resolution;
    vec2 cellCoord = getCellCoord(screenCoord);
    vec2 samplePos = getScreenCoord(cellCoord);
    return texture2D(u_buffer0,
                     samplePos / u_resolution).r;
}]]></html:pre>
                    <html:p>The lighting model is the same as step 3, but the diffuse colour is now binary — white for alive cells, black for dead — with a small ambient term of <fr:tex display="inline"><![CDATA[0.08]]></fr:tex> so the torus shape remains visible even in empty regions. Hover over the lower half to seed cells and watch them propagate across the torus surface above.</html:p>
                    <html:canvas class="glslCanvas" width="640" height="640" data-fragment-url="/forest/bafkrmihtdmsmioqqpakb7w2ge5gpnhlhhliul5bcqqsu6rerd7yu3f6n5i.frag">Loading shader...</html:canvas>
                  </fr:mainmatter>
                </fr:tree>
                <html:p>The full source is adapted from a ShaderEditor shader for Android. The main changes for the web are: replacing <html:code>backbuffer</html:code> with glslCanvas's <html:code>u_buffer0</html:code>, swapping touch-based rotation for auto-rotation, and using the <html:code>BUFFER_0</html:code> preprocessor pass for double-buffered state. The original runs on a phone — this version runs in your browser.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="Planned links">Planned links</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:ul><html:li>Topology hub — when a hub tree exists</html:li>
    <html:li>Conway's Game of Life — formal definition tree</html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
                <html:script src="/forest/lazy-shaders.js"> </html:script>
                <html:script src="/forest/GlslCanvas.min.js"> </html:script>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>17</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/gfx-0005/</fr:uri>
                <fr:display-uri>gfx-0005</fr:display-uri>
                <fr:route>/forest/gfx-0005/</fr:route>
                <fr:title text="Goltorus: Game of Life on a torus">Goltorus: Game of Life on a torus</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p><html:code>goltorus.glsl</html:code> is a GLSL fragment shader that renders Conway's Game of Life on the surface of a ray-marched torus, with interactive touch-based camera rotation. It runs on Android via ShaderEditor.</html:p>
                <html:p>The shader combines several independent ideas. The foundational concepts — signed distance functions, ray marching, and surface normals — are defined in their own trees:</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/gfx-0001/</fr:uri>
                    <fr:display-uri>gfx-0001</fr:display-uri>
                    <fr:route>/forest/gfx-0001/</fr:route>
                    <fr:title text="Signed distance function">Signed distance function</fr:title>
                    <fr:taxon>definition</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>A <html:em>signed distance function</html:em> (SDF) is a function <fr:tex display="inline"><![CDATA[f : \mathbb {R}^3 \to  \mathbb {R}]]></fr:tex> that returns the shortest distance from a point <fr:tex display="inline"><![CDATA[p]]></fr:tex> to the surface of an object. The sign indicates whether the point is inside (negative) or outside (positive) the surface:</html:p>
                    <fr:tex display="block"><![CDATA[
  f(p) \begin {cases}
    > 0 & \text {if } p \text { is outside} \\
    = 0 & \text {if } p \text { is on the surface} \\
    < 0 & \text {if } p \text { is inside}
  \end {cases}
]]></fr:tex>
                    <html:p>SDFs are composable: complex shapes can be built from simple primitives using operations like union, intersection, and smooth blending. They are the foundation of <html:em>ray marching</html:em> renderers, where the distance value at each step tells the marcher how far it can safely advance without overshooting.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>17</fr:day>
                        </fr:date>
                        <fr:title text="Resources">Resources</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:ul><html:li><fr:link href="https://iquilezles.org/articles/distfunctions2d/" type="external">2D distance functions</fr:link> — Inigo Quilez's reference of 2D SDF primitives</html:li>
    <html:li><fr:link href="https://iquilezles.org/articles/distfunctions/" type="external">3D distance functions</fr:link> — Inigo Quilez's reference of 3D SDF primitives, boolean ops, and deformations</html:li></html:ul>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/gfx-0002/</fr:uri>
                    <fr:display-uri>gfx-0002</fr:display-uri>
                    <fr:route>/forest/gfx-0002/</fr:route>
                    <fr:title text="Ray marching (sphere tracing)">Ray marching (sphere tracing)</fr:title>
                    <fr:taxon>definition</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p><html:em>Ray marching</html:em> is a rendering technique that finds ray--surface intersections by stepping along a ray incrementally. In the variant known as <html:em>sphere tracing</html:em>, each step size equals the SDF value at the current position — the radius of the largest sphere guaranteed not to penetrate any surface.</html:p>
                    <html:p>Given a ray origin <fr:tex display="inline"><![CDATA[\mathbf {o}]]></fr:tex> and direction <fr:tex display="inline"><![CDATA[\hat {\mathbf {d}}]]></fr:tex>, the algorithm maintains a distance <fr:tex display="inline"><![CDATA[t]]></fr:tex> along the ray:</html:p>
                    <html:ol><html:li>Evaluate <fr:tex display="inline"><![CDATA[f(\mathbf {o} + t\hat {\mathbf {d}})]]></fr:tex> — the SDF at the current point.</html:li>
  <html:li>If <fr:tex display="inline"><![CDATA[|f| < \epsilon ]]></fr:tex>, the ray has hit a surface. Return <fr:tex display="inline"><![CDATA[t]]></fr:tex>.</html:li>
  <html:li>If <fr:tex display="inline"><![CDATA[t > t_{\max }]]></fr:tex>, the ray has escaped. Return miss.</html:li>
  <html:li>Otherwise, advance <fr:tex display="inline"><![CDATA[t \leftarrow  t + f]]></fr:tex> and repeat.</html:li></html:ol>
                    <html:p>The key insight is that the SDF value is a <html:em>safe step size</html:em>: since <fr:tex display="inline"><![CDATA[f(p)]]></fr:tex> is the distance to the nearest surface, moving <fr:tex display="inline"><![CDATA[f(p)]]></fr:tex> along the ray cannot skip past any geometry.</html:p>
                    <html:p>Typical parameters:</html:p>
                    <html:ul><html:li>Maximum steps: 64--256 (100 is common)</html:li>
  <html:li>Maximum distance <fr:tex display="inline"><![CDATA[t_{\max }]]></fr:tex>: 100.0</html:li>
  <html:li>Surface epsilon <fr:tex display="inline"><![CDATA[\epsilon ]]></fr:tex>: 0.001</html:li></html:ul>
                    <html:p>In GLSL, the core loop looks like:</html:p>
                    <html:pre><![CDATA[float rayMarch(vec3 ro, vec3 rd) {
    float t = 0.0;
    for (int i = 0; i < MAX_STEPS; i++) {
        vec3 p = ro + rd * t;
        float d = sceneSDF(p);
        t += d;
        if (t > MAX_DIST || abs(d) < SURF_DIST)
            break;
    }
    return t;
}]]></html:pre>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/gfx-0003/</fr:uri>
                    <fr:display-uri>gfx-0003</fr:display-uri>
                    <fr:route>/forest/gfx-0003/</fr:route>
                    <fr:title text="Torus SDF">Torus SDF</fr:title>
                    <fr:taxon>definition</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>The <html:em>torus</html:em> signed distance function describes a ring in 3D centred at the origin, lying in the <fr:tex display="inline"><![CDATA[xz]]></fr:tex>-plane. It is parameterised by a major radius <fr:tex display="inline"><![CDATA[R]]></fr:tex> (centre to tube centre) and a minor radius <fr:tex display="inline"><![CDATA[r]]></fr:tex> (tube thickness).</html:p>
                    <fr:tex display="block"><![CDATA[
  f(p) = \left \lVert  \begin {pmatrix} \lVert  p_{xz} \rVert  - R \\ p_y \end {pmatrix} \right \rVert  - r
]]></fr:tex>
                    <html:p>The construction works in two steps:</html:p>
                    <html:ol><html:li>Project onto the <fr:tex display="inline"><![CDATA[xz]]></fr:tex>-plane and subtract <fr:tex display="inline"><![CDATA[R]]></fr:tex> to get the distance from the tube's circular spine: <fr:tex display="inline"><![CDATA[q_x = \lVert  p_{xz} \rVert  - R]]></fr:tex>.</html:li>
  <html:li>Form the 2D vector <fr:tex display="inline"><![CDATA[(q_x,\; p_y)]]></fr:tex> and take its length minus <fr:tex display="inline"><![CDATA[r]]></fr:tex> to get the signed distance from the tube surface.</html:li></html:ol>
                    <html:p>In GLSL:</html:p>
                    <html:pre><![CDATA[float sdTorus(vec3 p, vec2 t) {
    vec2 q = vec2(length(p.xz) - t.x, p.y);
    return length(q) - t.y;
}]]></html:pre>
                    <html:p>This formulation is from Inigo Quilez's distance function reference.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/gfx-0004/</fr:uri>
                    <fr:display-uri>gfx-0004</fr:display-uri>
                    <fr:route>/forest/gfx-0004/</fr:route>
                    <fr:title text="SDF surface normals via finite differences">SDF surface normals via finite differences</fr:title>
                    <fr:taxon>definition</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>The surface normal at a point on an SDF isosurface is the gradient of the distance field:</html:p>
                    <fr:tex display="block"><![CDATA[
  \hat {n}(p) = \frac {\nabla  f(p)}{\lVert  \nabla  f(p) \rVert }
]]></fr:tex>
                    <html:p>Since we rarely have an analytic gradient, we approximate it with <html:em>finite differences</html:em>. For a small <fr:tex display="inline"><![CDATA[\epsilon ]]></fr:tex>, sample the SDF along each axis:</html:p>
                    <fr:tex display="block"><![CDATA[
  \nabla  f(p) \approx  \begin {pmatrix}
    f(p) - f(p - \epsilon  \hat {x}) \\
    f(p) - f(p - \epsilon  \hat {y}) \\
    f(p) - f(p - \epsilon  \hat {z})
  \end {pmatrix}
]]></fr:tex>
                    <html:p>This is a forward-difference approximation (using the value at <fr:tex display="inline"><![CDATA[p]]></fr:tex> as the common reference). The result is then normalised. Typical <fr:tex display="inline"><![CDATA[\epsilon ]]></fr:tex> values range from <fr:tex display="inline"><![CDATA[10^{-5}]]></fr:tex> to <fr:tex display="inline"><![CDATA[10^{-3}]]></fr:tex>, trading accuracy against numerical noise.</html:p>
                    <html:p>In GLSL:</html:p>
                    <html:pre><![CDATA[vec3 getNormal(vec3 p) {
    float d = sceneSDF(p);
    vec2 e = vec2(0.0001, 0.0);
    vec3 n = d - vec3(
        sceneSDF(p - e.xyy),
        sceneSDF(p - e.yxy),
        sceneSDF(p - e.yyx)
    );
    return normalize(n);
}]]></html:pre>
                    <html:p>The <html:code>vec2 e</html:code> trick uses swizzling to avoid writing out three separate offset vectors.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="Screen layout">Screen layout</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>The viewport is split horizontally into two regions:</html:p>
                    <html:ul><html:li><html:strong>Bottom half</html:strong> — a 2D grid running Conway's Game of Life. Cells are <fr:tex display="inline"><![CDATA[17 \times  17]]></fr:tex> pixels. Tapping here toggles cells.</html:li>
    <html:li><html:strong>Top half</html:strong> — the 3D ray-marched torus. Swiping here rotates the camera. The Game of Life state is texture-mapped onto the torus surface.</html:li></html:ul>
                    <html:p>This split is achieved by multiplying each region's colour output by a step function on <html:code>gl_FragCoord.y</html:code>.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="Camera and rotation">Camera and rotation</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Camera rotation is controlled by touch input and persisted across frames using the <html:em>backbuffer</html:em> — a texture containing the previous frame's output.</html:p>
                    <html:p>The rotation state (two angles) is encoded in the red and green channels of a single pixel at a fixed screen location <html:code>(1.0, 1.0)</html:code>. On each frame:</html:p>
                    <html:ol><html:li>Read the stored rotation from the backbuffer.</html:li>
    <html:li>If the user was previously touching and has now released, accumulate the swipe delta into the stored rotation.</html:li>
    <html:li>Apply the rotation as two successive axis rotations (Y then X) to all points before SDF evaluation.</html:li></html:ol>
                    <html:p>The swipe vector is computed as the normalised difference between <html:code>touchStart</html:code> and <html:code>touch</html:code>, and is only active when the touch originates in the top half of the screen (the 3D view).</html:p>
                    <html:p>The rotation is applied <html:em>to the scene</html:em> (not the camera), so the SDF evaluates <html:code>sdTorus(rotate(p), ...)</html:code> — rotating the point before measuring distance. This is equivalent to rotating the camera in the opposite direction.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="Torus surface parameterisation">Torus surface parameterisation</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>To map the 2D Game of Life grid onto the 3D torus surface, the shader needs a function that converts a 3D surface point to 2D texture coordinates — a <html:em>wrapmap</html:em>.</html:p>
                    <html:p>A torus is parameterised by two angles: the <html:em>major angle</html:em> <fr:tex display="inline"><![CDATA[\theta ]]></fr:tex> (around the central axis) and the <html:em>minor angle</html:em> <fr:tex display="inline"><![CDATA[\phi ]]></fr:tex> (around the tube). Given a point <fr:tex display="inline"><![CDATA[p]]></fr:tex> on the torus surface:</html:p>
                    <html:ol><html:li><html:strong>Major angle</html:strong> <fr:tex display="inline"><![CDATA[\theta ]]></fr:tex>: computed from <html:code>atan(p.z, p.x)</html:code>, normalised to the half-open interval from 0 to 1.</html:li>
    <html:li><html:strong>Minor angle</html:strong> <fr:tex display="inline"><![CDATA[\phi ]]></fr:tex>: the tube cross-section angle. Computed by finding the signed distance from <fr:tex display="inline"><![CDATA[p]]></fr:tex> to the spine circle in the <fr:tex display="inline"><![CDATA[xz]]></fr:tex>-plane, then using <html:code>atan</html:code> of <html:code>p.y</html:code> and <html:code>-minorx</html:code> to get the angle around the tube.</html:li></html:ol>
                    <html:p>The <html:code>interval(y, x)</html:code> helper normalises an <html:code>atan2</html:code> result to the range 0 (inclusive) to 1 (exclusive) by handling the branch cut:</html:p>
                    <html:pre><![CDATA[float interval(float y, float x) {
    vec2 n = normalize(vec2(x, -y));
    return float(n.y < 0.) + atan(n.y, n.x) / 2. / PI;
}]]></html:pre>
                    <html:p>The final UV is scaled by <html:code>vec2(1., 0.5)</html:code> to map into the bottom half of the screen where the Game of Life grid lives.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="Game of Life">Game of Life</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>The bottom half of the screen runs a standard Conway's Game of Life. Each cell is a <fr:tex display="inline"><![CDATA[17 \times  17]]></fr:tex> pixel block. The state is read from the backbuffer — each pixel stores whether its cell is alive (red channel <fr:tex display="inline"><![CDATA[> 0]]></fr:tex>).</html:p>
                    <html:p>The <html:code>evaluate</html:code> function sums the 8 neighbours and applies the classic rules:</html:p>
                    <html:ul><html:li>A dead cell with exactly 3 neighbours becomes alive.</html:li>
    <html:li>A live cell with 2 or 3 neighbours survives.</html:li>
    <html:li>All other cells die.</html:li></html:ul>
                    <html:p>The grid wraps toroidally via <html:code>mod</html:code>, matching the topology of the torus it is rendered on. On the first frame (<html:code>time &lt; 0.001</html:code>), a spaceship texture is loaded as the initial seed pattern.</html:p>
                    <html:p>Touch interaction on the bottom half toggles cells alive — the <html:code>tap()</html:code> function checks pointer distance to each cell and returns white if within range.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="Lighting">Lighting</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>The 3D torus uses Phong-style specular lighting with a fixed point light at <html:code>(2, 3, 2)</html:code>:</html:p>
                    <html:ol><html:li>Compute the surface normal via <fr:link href="/forest/gfx-0004/" title="SDF surface normals via finite differences" uri="https://kream.codeberg.page/forest/gfx-0004/" display-uri="gfx-0004" type="local">SDF surface normals via finite differences</fr:link>.</html:li>
    <html:li>Compute the reflection of the light direction about the normal.</html:li>
    <html:li>The specular term is <fr:tex display="inline"><![CDATA[\max (\hat {r} \cdot  \hat {v},\; 0)^{32}]]></fr:tex>, giving a tight highlight.</html:li>
    <html:li>The diffuse colour is binary: white if the corresponding Game of Life cell is alive (sampled via the wrapmap), black otherwise, plus a small ambient term of <fr:tex display="inline"><![CDATA[0.08]]></fr:tex>.</html:li></html:ol>
                    <html:p>The final colour is <html:code>(cellColour + 0.08) + specular * 0.5</html:code>.</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>17</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/gfx-0006/</fr:uri>
                <fr:display-uri>gfx-0006</fr:display-uri>
                <fr:route>/forest/gfx-0006/</fr:route>
                <fr:title text="Embedded shader proof of concept">Embedded shader proof of concept</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>A test of embedding a live GLSL fragment shader in a forester tree using glslCanvas. Move your mouse over the canvas to interact.</html:p>
                <html:canvas class="glslCanvas" width="640" height="400" data-fragment-url="/forest/bafkrmiea7mc7zu5oxrocntyh4hjitwr5mghjreabshfj3wju6keqkueqie.frag">Loading shader...</html:canvas>
                <html:script src="/forest/GlslCanvas.min.js"> </html:script>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors />
            <fr:date>
              <fr:year>2026</fr:year>
              <fr:month>2</fr:month>
              <fr:day>16</fr:day>
            </fr:date>
            <fr:uri>https://kream.codeberg.page/forest/life-0001/</fr:uri>
            <fr:display-uri>life-0001</fr:display-uri>
            <fr:route>/forest/life-0001/</fr:route>
            <fr:title text="Ultralight One-Bag and Camping Gear System">Ultralight One-Bag and Camping Gear System</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>A comprehensive ultralight gear list for one-bag travel and camping, organized by functional system rather than by container. This is an evolving acquisition tracker with research notes on specific products.</html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors />
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>16</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/life-0002/</fr:uri>
                <fr:display-uri>life-0002</fr:display-uri>
                <fr:route>/forest/life-0002/</fr:route>
                <fr:title text="Pack System">Pack System</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Phanny Pack / Daily Sling">Phanny Pack / Daily Sling</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p><fr:link href="https://www.rei.com/product/235577/rei-co-op-ruckpack-waist-pack" type="external">REI Ruckpack Waist Pack</fr:link> — acquired.</html:p>
                    <html:p>Modifications:</html:p>
                    <html:ul><html:li>Sew on bottle carrier</html:li>
    <html:li>Sew additional straps and mounts</html:li>
    <html:li>Add Chrome keychain buckle</html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Backpack Design Concept">Backpack Design Concept</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Custom backpack design with integrated ultralight features:</html:p>
                    <html:ul><html:li>Sleeping pad as back padding (waterproof fabric)</html:li>
    <html:li>Zippers allow folding both sides to convert into a sling for daily use</html:li>
    <html:li>Pockets for carrying inline skates (wheels on skates could double as wheels for bag)</html:li>
    <html:li>Water bottle pockets</html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors />
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>16</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/life-0003/</fr:uri>
                <fr:display-uri>life-0003</fr:display-uri>
                <fr:route>/forest/life-0003/</fr:route>
                <fr:title text="Shelter and Sleep System">Shelter and Sleep System</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Tarp and Ground Sheet">Tarp and Ground Sheet</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
  <html:center><html:img src="/forest/bafkrmicmknu4enfawdfzuobs4a7vf7w74i6iuzs7rl2krdx2bas4vyjfyq.webp" alt="Zpacks dyneema flat tarp" class="figure-content" /></html:center>
<html:p>Primary choice: <fr:link href="https://zpacks.com/collections/tarps" type="external">dyneema tarp</fr:link> with <fr:link href="https://zpacks.com/products/tyvek-groundsheet" type="external">tyvek ground sheet</fr:link>.</html:p><html:p>Budget alternative: silpoly tarp with polycro ground sheet.</html:p></fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Bug Protection">Bug Protection</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Bug net (sourcing from taobao).</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Sleep System">Sleep System</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter><html:p>Sleeping bag — must be machine washable. Specific model TBD.</html:p><html:ul><html:li>Sleeping bag liner</html:li>
    <html:li>Pillow</html:li></html:ul>
  <html:center><html:img src="/forest/bafkrmibs6awlwqfugixgf7in2kg6gnejj4cnmov3pnkj44akmdszqlrc2i.png" alt="Nemo Switchback sleeping pad" class="figure-content" /></html:center>
<html:p>Sleeping pad: <fr:link href="https://www.rei.com/product/141846/nemo-switchback-sleeping-pad" type="external">Nemo Switchback Short</fr:link>, trimmed to waist length.</html:p></fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors />
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>16</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/life-0004/</fr:uri>
                <fr:display-uri>life-0004</fr:display-uri>
                <fr:route>/forest/life-0004/</fr:route>
                <fr:title text="Clothing and Layering System">Clothing and Layering System</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Organized from skin out to shell.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Temperature / Activity Matrix">Temperature / Activity Matrix</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:table>
    <html:thead>
      <html:tr>
        <html:th>Temp range</html:th>
        <html:th>Active (hiking, cycling)</html:th>
        <html:th>Static (camp, transit)</html:th>
      </html:tr>
    </html:thead>
    <html:tbody>
      <html:tr>
        <html:td>&gt; 15 °C</html:td>
        <html:td>Base</html:td>
        <html:td>Base</html:td>
      </html:tr>
      <html:tr>
        <html:td>8 – 15 °C</html:td>
        <html:td>Base</html:td>
        <html:td>Base + shell</html:td>
      </html:tr>
      <html:tr>
        <html:td>3 – 8 °C</html:td>
        <html:td>Base + shell</html:td>
        <html:td>Base + Octa fleece + shell</html:td>
      </html:tr>
      <html:tr>
        <html:td>−5 – 3 °C</html:td>
        <html:td>Base + Octa fleece + shell</html:td>
        <html:td>Base + Octa fleece + down + shell</html:td>
      </html:tr>
      <html:tr>
        <html:td>&lt; −5 °C</html:td>
        <html:td>Base + Octa fleece + down + shell + neckwarmer</html:td>
        <html:td>Sleeping bag + neck warmer</html:td>
      </html:tr>
    </html:tbody>
  </html:table>
                    <html:p>Add sun hoodie for prolonged hours in the sun. Add shell in rain at any temperature. Neck warmer/ski mask below 5 °C.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Base Layer">Base Layer</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:ul><html:li>T-shirts x3 — <fr:link href="https://www.uniqlo.com/us/en/products/E465755-000/00" type="external">Uniqlo Airism</fr:link></html:li>
    <html:li>Underwear x6 — <fr:link href="https://www.uniqlo.com/us/en/products/E456675-000/00" type="external">Uniqlo Airism</fr:link></html:li>
    <html:li>Socks x6</html:li>
    <html:li>Shorts — Uniqlo</html:li>
    <html:li>Long pants — Uniqlo jeans</html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Active / Mid Layer">Active / Mid Layer</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
  <html:center><html:img src="/forest/bafkrmid3mqtf23tbc4p3gnegd3ib6mtqnbhkowjw3ukb4lrb6enijz6cbq.jpg" alt="Leve Teijin Octa fleece hoodie" class="figure-content" /></html:center>
<html:p><fr:link href="https://leveoutdoorco.com/products/leve-octa-hoody-1" type="external">Leve Teijin Octa fleece hoodie</fr:link> (alpha direct alternative).</html:p></fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Insulation Layer">Insulation Layer</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
  <html:center><html:img src="/forest/bafkrmibmmgexrj6owb7y2nzlxvf3tza5w5czlin73soi3ybbwttaxh2a3m.webp" alt="Montbell Plasma 1000 down jacket" class="figure-content" /></html:center>
<html:p>Down jacket: <fr:link href="https://www.montbell.com/us/en/products/detail/2301381" type="external">Montbell Plasma 1000</fr:link>.</html:p></fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Shell / Weather Protection">Shell / Weather Protection</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:ul><html:li>Waterproof jacket — <fr:link href="https://www.decathlon.com/products/mens-hiking-rain-jacket-nh100-raincut-full-zip-150323" type="external">Decathlon Raincut full zip</fr:link></html:li>
    <html:li>Sun hoodie — TBD</html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Extremities and Accessories">Extremities and Accessories</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:ul><html:li>Neck warmer</html:li>
    <html:li>Anti UVA/UVB sunglasses</html:li>
    <html:li>Cycling cap</html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Footwear">Footwear</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:ul><html:li>Outdoor shoes — ultralight waterproof trail runners</html:li>
    <html:li>Flip-flops — <fr:link href="https://www.hotwind.net/" type="external">Hotwind</fr:link> (camp shoes)</html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Packing">Packing</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Compression cube — acquired.</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors />
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>16</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/life-0005/</fr:uri>
                <fr:display-uri>life-0005</fr:display-uri>
                <fr:route>/forest/life-0005/</fr:route>
                <fr:title text="Tech and Electronics">Tech and Electronics</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Devices">Devices</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:ul><html:li><html:center><html:img src="/forest/bafkrmiexgctzoiigltwbim5ag4wblhsi6z6ypx42qmybp7tj2j7dgqpiz4.jpg" alt="XReal One AR glasses" class="figure-content" /></html:center>

    <fr:link href="https://us.shop.xreal.com/products/xreal-one" type="external">XReal One</fr:link> — with prescription lenses</html:li>
    <html:li><fr:link href="https://www.gpd-minipc.com/products/gpd-pocket4" type="external">GPD Pocket 4</fr:link></html:li>
    <html:li><html:center><html:img src="/forest/bafkrmib7p4jzhvvnowxpqq5nmol3iy4sp7fvenassfkdjz7dpj5jvmajra.png" alt="Sweep Bling split keyboard" class="figure-content" /></html:center>

    <fr:link href="https://keebmaker.com/products/ferris-sweep" type="external">Sweep Bling</fr:link> (split keyboard) — <fr:link href="/forest/life-000B/" title="Building a Split Ergonomic Keyboard" uri="https://kream.codeberg.page/forest/life-000B/" display-uri="life-000B" type="local">build notes</fr:link></html:li>
    <html:li><html:center><html:img src="/forest/bafkrmie4n2a7dwyidkjhwb3enqpjvijn7xegma6eisivairgzjcwadzhk4.jpg" alt="Truthear Zero:Red IEM" class="figure-content" /></html:center>

    IEM: <fr:link href="https://truthear.com/products/zero-red" type="external">Truthear Zero:Red</fr:link> + <fr:link href="https://eoe.works/collections/apple-ipod-classic-6th-7th-generation" type="external">iPod Classic Gen 6</fr:link> and cable</html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Power">Power</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter><html:ul><html:li>Battery bank — 20000mAh, 100W</html:li>
    <html:li>Solar panel — TBD</html:li>
    <html:li>Type-C cables x2</html:li></html:ul>
  <html:center><html:img src="/forest/bafkrmiadom6q2difb35pshlge2za6dstlemoshx7x7gwgn7bit5glygwrq.jpg" alt="MOGICS Super Bagel" class="figure-content" /></html:center>
<html:p><fr:link href="https://www.mogics.com/super-bagel" type="external">MOGICS Super Bagel</fr:link></html:p></fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Carry">Carry</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Tech pouch for keyboard, IEM/iPod, and cables. TBD</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Lighting">Lighting</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Headlamp.</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors />
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>16</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/life-0006/</fr:uri>
                <fr:display-uri>life-0006</fr:display-uri>
                <fr:route>/forest/life-0006/</fr:route>
                <fr:title text="Food and Water System">Food and Water System</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Hydration">Hydration</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:ul><html:li>Water filter — <fr:link href="https://www.rei.com/product/232554/platypus-quickdraw-gravity-filter-system-3-liter" type="external">Platypus QuickDraw</fr:link></html:li>
    <html:li>Water bottle</html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Cook Kit">Cook Kit</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Titanium mug — TBD.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Food Strategy">Food Strategy</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>General approach: dehydrate everything.</html:p>
                    <html:ul><html:li>Sweets bag</html:li>
    <html:li>Savory bag</html:li>
    <html:li>Protein bag</html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Supplements">Supplements</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
  <html:center><html:img src="/forest/bafkrmicwd5sc2r4hz7eb44lhaogz5bq76urc4nauwpa3gerwh6ta2ias6a.jpg" alt="Optiventure all-in-one supplement" class="figure-content" /></html:center>
<html:p>Considering all-in-one supplement solutions (<fr:link href="https://optiventure.co/products/optiventure-supplement" type="external">Optiventure</fr:link>).</html:p><html:ul><html:li>Creatine</html:li>
    <html:li>CoQ10</html:li>
    <html:li>Vitamins</html:li>
    <html:li>Electrolytes</html:li></html:ul></fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors />
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>16</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/life-0007/</fr:uri>
                <fr:display-uri>life-0007</fr:display-uri>
                <fr:route>/forest/life-0007/</fr:route>
                <fr:title text="Skate Gear">Skate Gear</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Inline skating setup for travel. Integrates with the custom backpack concept via skate-carrying pockets.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Skates">Skates</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
  <html:center><html:img src="/forest/bafkrmicqcdrwceam7zruiokdjt76a5ess5xxjmrvoe6mizzflwfzozvkie.png" alt="Intuition FR1 inline skate liners" class="figure-content" /></html:center>

  <html:center><html:img src="/forest/bafkrmidhfl5ooqrlwhdhkp2riyecz2fg6fjfa5q7xlldiqyyszcli62pyq.jpg" alt="Sago 90 Plus 2 inline skate frames" class="figure-content" /></html:center>
<html:p><fr:link href="https://www.intuitionskate.com/products/intuition-skate-premium-inline-skate-liners" type="external">Intuition FR1 liners</fr:link>, <fr:link href="https://www.yoyoskateofficial.com/products/yoyoskate-sago-frames-90mmx4" type="external">Sago 90 Plus 2 frames</fr:link>, waterproof bearings.</html:p>
  <html:center><html:img src="/forest/bafkrmiac6qktnyktot5b2adxcaxwfuieyfzwha52p7vpx3x3aq5zcgib4m.webp" alt="FR SL Freeride Intuition carbon boots" class="figure-content" /></html:center>
<html:p>Alternative: <fr:link href="https://frskates.com/freeride/131-sl-freeride.html" type="external">FR SL Freeride Intuition carbon boots</fr:link>.</html:p></fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Protection">Protection</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:ul><html:li><html:center><html:img src="/forest/bafkrmifvq3gvymc5sfhvt4m3zqlwwcywtyvvsaxadlr3ocg6lluclfpwuq.jpg" alt="Ennui Elite Pro helmet" class="figure-content" /></html:center>

    Helmet — <fr:link href="https://powerslide.com/collections/ennui-helmets" type="external">Ennui Elite Pro</fr:link></html:li>
    <html:li>Knee pads</html:li>
    <html:li>Gloves</html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Tools">Tools</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p><fr:link href="https://www.yoyoskateofficial.com/" type="external">YoyoSkate multitool</fr:link>.</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors />
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>16</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/life-0008/</fr:uri>
                <fr:display-uri>life-0008</fr:display-uri>
                <fr:route>/forest/life-0008/</fr:route>
                <fr:title text="Hygiene, First Aid and Repair">Hygiene, First Aid and Repair</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Hygiene">Hygiene</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:ul><html:li>Toothbrush, nail clippers, razor, floss</html:li>
    <html:li>Mini towel (REI)</html:li>
    <html:li><html:center><html:img src="/forest/bafkrmiczgc7b3nxligmmdzvdoppm6msdjxt5gb7l6l27k2wxw72kmjyiha.jpg" alt="Igneous Bottle Cap Bidet" class="figure-content" /></html:center>

    Bidet — <fr:link href="https://igneousgear.com/products/bottle-cap-bidet" type="external">Igneous Bottle Cap Bidet</fr:link> (formerly Common Gear)</html:li>
    <html:li>Sanitary wipes</html:li>
    <html:li>Tissues</html:li>
    <html:li>Sunscreen</html:li>
    <html:li>Vaseline</html:li>
    <html:li>Vagisil (anti-chafe)</html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="First Aid">First Aid</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:ul><html:li>Iodine swabs</html:li>
    <html:li>Band-aids</html:li>
    <html:li>Emergency blanket (REI)</html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Repair and Tools">Repair and Tools</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:ul><html:li>Scissors — acquired</html:li>
    <html:li>Duct tape</html:li>
    <html:li>Zip ties</html:li>
    <html:li>Sewing kit</html:li>
    <html:li>Small knife</html:li>
    <html:li>Lighter</html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors />
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>16</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/life-0009/</fr:uri>
                <fr:display-uri>life-0009</fr:display-uri>
                <fr:route>/forest/life-0009/</fr:route>
                <fr:title text="On-Body EDC and Essentials">On-Body EDC and Essentials</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Items carried on body or kept immediately accessible.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Every-Day Carry">Every-Day Carry</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:ul><html:li>Phone — Pixel 9a</html:li>
    <html:li>Wallet</html:li>
    <html:li>Sunglasses</html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Documents">Documents</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:ul><html:li>Visa</html:li>
    <html:li>Passport</html:li>
    <html:li>Plane ticket</html:li>
    <html:li>ID</html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Fitness">Fitness</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
  <html:center><html:img src="/forest/bafkrmiex6ctyclsw6rahsf3f5qctm4qvpkb3sqbydrnv32fgxowf2wrjeq.jpg" alt="Movement Made Minimal gym rings" class="figure-content" /></html:center>
<html:p>Gym rings — <fr:link href="https://www.movement-made.com/products/rings-c-handle" type="external">Movement Made Minimal rings</fr:link>.</html:p></fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors />
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Miscellaneous">Miscellaneous</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:ul><html:li>Ear plugs</html:li>
    <html:li>Pen and notebook</html:li>
    <html:li>Pencil sharpener</html:li>
    <html:li>Trash bags</html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
              </fr:author>
            </fr:authors>
            <fr:date>
              <fr:year>2025</fr:year>
              <fr:month>2</fr:month>
              <fr:day>26</fr:day>
            </fr:date>
            <fr:uri>https://kream.codeberg.page/forest/tt-AVSS/</fr:uri>
            <fr:display-uri>tt-AVSS</fr:display-uri>
            <fr:route>/forest/tt-AVSS/</fr:route>
            <fr:title text="A brief history of type theory">A brief history of type theory</fr:title>
            <fr:meta name="draft">true</fr:meta>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Translation of Trebor Huang's <html:em>类型论简史</html:em> (<fr:link href="https://github.com/Trebor-Huang/history" type="external">source</fr:link>) — a survey of type theory from Russell through HoTT.</html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>26</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/tt-AVST/</fr:uri>
                <fr:display-uri>tt-AVST</fr:display-uri>
                <fr:route>/forest/tt-AVST/</fr:route>
                <fr:title text="Introduction">Introduction</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>TODO: preamble — Scholze liquid tensor experiment, Lean formalization, type theory as bridge</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>26</fr:day>
                    </fr:date>
                    <fr:title text="What is type theory?">What is type theory?</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>26</fr:day>
                    </fr:date>
                    <fr:title text="Naive syntax">Naive syntax</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>26</fr:day>
                    </fr:date>
                    <fr:title text="Objective and subjective logic">Objective and subjective logic</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>26</fr:day>
                    </fr:date>
                    <fr:title text="Semantics of type theory">Semantics of type theory</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>26</fr:day>
                    </fr:date>
                    <fr:title text="History of type theory">History of type theory</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>26</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/tt-AVSU/</fr:uri>
                <fr:display-uri>tt-AVSU</fr:display-uri>
                <fr:route>/forest/tt-AVSU/</fr:route>
                <fr:title text="Origins">Origins</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>TODO</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>26</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/tt-AVSV/</fr:uri>
                <fr:display-uri>tt-AVSV</fr:display-uri>
                <fr:route>/forest/tt-AVSV/</fr:route>
                <fr:title text="The Curry–Howard Correspondence">The Curry–Howard Correspondence</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>TODO</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>26</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/tt-AVSW/</fr:uri>
                <fr:display-uri>tt-AVSW</fr:display-uri>
                <fr:route>/forest/tt-AVSW/</fr:route>
                <fr:title text="Martin-Löf Type Theory">Martin-Löf Type Theory</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>TODO</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>26</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/tt-AVSX/</fr:uri>
                <fr:display-uri>tt-AVSX</fr:display-uri>
                <fr:route>/forest/tt-AVSX/</fr:route>
                <fr:title text="Categorical Semantics">Categorical Semantics</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>TODO</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>26</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/tt-AVSY/</fr:uri>
                <fr:display-uri>tt-AVSY</fr:display-uri>
                <fr:route>/forest/tt-AVSY/</fr:route>
                <fr:title text="Homotopy Type Theory">Homotopy Type Theory</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>TODO</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>26</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/tt-AVSZ/</fr:uri>
                <fr:display-uri>tt-AVSZ</fr:display-uri>
                <fr:route>/forest/tt-AVSZ/</fr:route>
                <fr:title text="Prospects">Prospects</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>TODO</html:p>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
              </fr:author>
            </fr:authors>
            <fr:uri>https://kream.codeberg.page/forest/alg-0001/</fr:uri>
            <fr:display-uri>alg-0001</fr:display-uri>
            <fr:route>/forest/alg-0001/</fr:route>
            <fr:title text="Algebra Notes">Algebra Notes</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Notes on algebra, focusing on module theory and homological algebra. The central notion of <html:em>module</html:em> — an object with an action by a monoid in a monoidal category — specialises to classical <fr:tex display="inline"><![CDATA[R]]></fr:tex>-modules when the ambient monoidal category is <fr:tex display="inline"><![CDATA[(\mathbf {Ab}, \otimes _{\mathbb {Z}}, \mathbb {Z})]]></fr:tex>, and to <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/algebra%20over%20a%20monad" type="external">Eilenberg–Moore algebras</fr:link></html:span> in the endofunctor category. See also <fr:link href="/forest/cat-0001/" title="Category theory" uri="https://kream.codeberg.page/forest/cat-0001/" display-uri="cat-0001" type="local">Category theory</fr:link> for the categorical perspective.</html:p>
            <html:p>
              <fr:link href="https://www.youtube.com/watch?v=bD8kjpynF6A" type="external">What is Algebra?</fr:link>
            </html:p>
            <fr:tree show-metadata="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:uri>https://kream.codeberg.page/forest/alg-1EC7/</fr:uri>
                <fr:display-uri>alg-1EC7</fr:display-uri>
                <fr:route>/forest/alg-1EC7/</fr:route>
                <fr:title text="Module Theory">Module Theory</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Notes on module theory. The general notion of <html:em>module</html:em> — an object with an action by a monoid in a monoidal category — specialises to classical <fr:tex display="inline"><![CDATA[R]]></fr:tex>-modules when the ambient monoidal category is <fr:tex display="inline"><![CDATA[(\mathbf {Ab}, \otimes _{\mathbb {Z}}, \mathbb {Z})]]></fr:tex>.</html:p>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>18</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/alg-1EC1/</fr:uri>
                    <fr:display-uri>alg-1EC1</fr:display-uri>
                    <fr:route>/forest/alg-1EC1/</fr:route>
                    <fr:title text="Module over a monoid">Module over a monoid</fr:title>
                    <fr:taxon>definition</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Let <fr:tex display="inline"><![CDATA[(C, \otimes , I)]]></fr:tex> be a <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/monoidal%20category" type="external">monoidal category</fr:link></html:span> and <fr:tex display="inline"><![CDATA[(A, \mu , \eta )]]></fr:tex> a <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/monoid%20in%20a%20monoidal%20category" type="external">monoid</fr:link></html:span> in <fr:tex display="inline"><![CDATA[C]]></fr:tex>. A <html:strong>module over <fr:tex display="inline"><![CDATA[A]]></fr:tex></html:strong> (or <html:strong>left <fr:tex display="inline"><![CDATA[A]]></fr:tex>-module</html:strong>) is an object <fr:tex display="inline"><![CDATA[M \in  C]]></fr:tex> equipped with an <html:em>action</html:em> morphism <fr:tex display="inline"><![CDATA[\rho  \colon  A \otimes  M \rightarrow  M]]></fr:tex> satisfying:</html:p>
                    <html:ol><html:li><html:em>Associativity.</html:em> <fr:tex display="inline"><![CDATA[\rho  \circ  (\mu  \otimes  \mathrm {id}_M) = \rho  \circ  (\mathrm {id}_A \otimes  \rho )]]></fr:tex> as morphisms <fr:tex display="inline"><![CDATA[A \otimes  A \otimes  M \rightarrow  M]]></fr:tex>.</html:li>
  <html:li><html:em>Unitality.</html:em> <fr:tex display="inline"><![CDATA[\rho  \circ  (\eta  \otimes  \mathrm {id}_M) = \ell _M]]></fr:tex>, where <fr:tex display="inline"><![CDATA[\ell _M \colon  I \otimes  M \xrightarrow {\sim } M]]></fr:tex> is the left unitor.</html:li></html:ol>
                    <html:p>(Here we write the axioms for a <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/strict%20monoidal%20category" type="external">strict monoidal category</fr:link></html:span>; in the general case, the associator and unitor coherence isomorphisms must be inserted.)</html:p>
                    <html:p>A <html:strong>morphism of <fr:tex display="inline"><![CDATA[A]]></fr:tex>-modules</html:strong> <fr:tex display="inline"><![CDATA[f \colon  (M, \rho _M) \rightarrow  (N, \rho _N)]]></fr:tex> is a morphism <fr:tex display="inline"><![CDATA[f \colon  M \rightarrow  N]]></fr:tex> in <fr:tex display="inline"><![CDATA[C]]></fr:tex> that is <html:em>equivariant</html:em>: <fr:tex display="inline"><![CDATA[\rho _N \circ  (\mathrm {id}_A \otimes  f) = f \circ  \rho _M]]></fr:tex>. The <fr:link href="/forest/cat-0003/" title="Category" uri="https://kream.codeberg.page/forest/cat-0003/" display-uri="cat-0003" type="local">category</fr:link> of left <fr:tex display="inline"><![CDATA[A]]></fr:tex>-modules in <fr:tex display="inline"><![CDATA[C]]></fr:tex> is denoted <fr:tex display="inline"><![CDATA[A\text {-}\mathbf {Mod}(C)]]></fr:tex>.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>18</fr:day>
                        </fr:date>
                        <fr:title text="Special cases">Special cases</fr:title>
                        <fr:taxon>remark</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>By varying the ambient monoidal category <fr:tex display="inline"><![CDATA[C]]></fr:tex>, one recovers many familiar structures:</html:p>
                        <html:ul><html:li><fr:tex display="inline"><![CDATA[C = (\mathbf {Ab}, \otimes _{\mathbb {Z}}, \mathbb {Z})]]></fr:tex>: a monoid is a <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/ring" type="external">ring</fr:link></html:span> and a module is a classical <html:em>module over a ring</html:em>.</html:li>
    <html:li><fr:tex display="inline"><![CDATA[C = (\mathbf {Vect}_k, \otimes _k, k)]]></fr:tex>: a monoid is a <fr:tex display="inline"><![CDATA[k]]></fr:tex>-<html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/algebra" type="external">algebra</fr:link></html:span> and a module is a <html:em>representation</html:em>.</html:li>
    <html:li><fr:tex display="inline"><![CDATA[C = ([\mathbf {C}, \mathbf {C}], \circ , \Id )]]></fr:tex>: a monoid is a <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/monad" type="external">monad</fr:link></html:span> and a module is an <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/algebra%20over%20a%20monad" type="external">Eilenberg–Moore algebra</fr:link></html:span>.</html:li></html:ul>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <html:p>Classical modules over a ring are the special case where the ambient monoidal category is <fr:tex display="inline"><![CDATA[(\mathbf {Ab}, \otimes _{\mathbb {Z}}, \mathbb {Z})]]></fr:tex>.</html:p>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>18</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/alg-1EC2/</fr:uri>
                    <fr:display-uri>alg-1EC2</fr:display-uri>
                    <fr:route>/forest/alg-1EC2/</fr:route>
                    <fr:title text="Module over a ring">Module over a ring</fr:title>
                    <fr:taxon>definition</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>A <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/ring" type="external">ring</fr:link></html:span> <fr:tex display="inline"><![CDATA[R]]></fr:tex> is equivalently a <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/monoid%20in%20a%20monoidal%20category" type="external">monoid</fr:link></html:span> in the monoidal category <fr:tex display="inline"><![CDATA[(\mathbf {Ab}, \otimes _{\mathbb {Z}}, \mathbb {Z})]]></fr:tex> of <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/abelian%20group" type="external">abelian groups</fr:link></html:span> under tensor product. A <html:strong>module over a ring</html:strong> <fr:tex display="inline"><![CDATA[R]]></fr:tex> (or <html:strong><fr:tex display="inline"><![CDATA[R]]></fr:tex>-module</html:strong>) is a <fr:link href="/forest/alg-1EC1/" title="Module over a monoid" uri="https://kream.codeberg.page/forest/alg-1EC1/" display-uri="alg-1EC1" type="local">module over <fr:tex display="inline"><![CDATA[R]]></fr:tex></fr:link> viewed as such a monoid — that is, an abelian group <fr:tex display="inline"><![CDATA[M]]></fr:tex> equipped with an action <fr:tex display="inline"><![CDATA[\rho  \colon  R \otimes _{\mathbb {Z}} M \rightarrow  M]]></fr:tex> satisfying associativity and unitality.</html:p>
                    <html:p>Unwinding the definition (replacing the tensor product action with the equivalent set-level scalar multiplication), a left <fr:tex display="inline"><![CDATA[R]]></fr:tex>-module is an abelian group <fr:tex display="inline"><![CDATA[(M, +)]]></fr:tex> together with a map <fr:tex display="inline"><![CDATA[R \times  M \rightarrow  M]]></fr:tex>, written <fr:tex display="inline"><![CDATA[(r, m) \mapsto  r \cdot  m]]></fr:tex>, such that for all <fr:tex display="inline"><![CDATA[r, s \in  R]]></fr:tex> and <fr:tex display="inline"><![CDATA[m, n \in  M]]></fr:tex>:</html:p>
                    <html:ol><html:li><fr:tex display="inline"><![CDATA[r \cdot  (m + n) = r \cdot  m + r \cdot  n]]></fr:tex></html:li>
  <html:li><fr:tex display="inline"><![CDATA[(r + s) \cdot  m = r \cdot  m + s \cdot  m]]></fr:tex></html:li>
  <html:li><fr:tex display="inline"><![CDATA[(rs) \cdot  m = r \cdot  (s \cdot  m)]]></fr:tex></html:li>
  <html:li><fr:tex display="inline"><![CDATA[1_R \cdot  m = m]]></fr:tex></html:li></html:ol>
                    <html:p>The <fr:link href="/forest/cat-0003/" title="Category" uri="https://kream.codeberg.page/forest/cat-0003/" display-uri="cat-0003" type="local">category</fr:link> of left <fr:tex display="inline"><![CDATA[R]]></fr:tex>-modules and <fr:tex display="inline"><![CDATA[R]]></fr:tex>-linear maps is denoted <fr:tex display="inline"><![CDATA[\mathbf {Mod}_R]]></fr:tex>.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>18</fr:day>
                        </fr:date>
                        <fr:taxon>remark</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>When <fr:tex display="inline"><![CDATA[R]]></fr:tex> is a field <fr:tex display="inline"><![CDATA[k]]></fr:tex>, an <fr:tex display="inline"><![CDATA[R]]></fr:tex>-module is precisely a <fr:tex display="inline"><![CDATA[k]]></fr:tex>-<html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/vector%20space" type="external">vector space</fr:link></html:span>. When <fr:tex display="inline"><![CDATA[R = \mathbb {Z}]]></fr:tex>, an <fr:tex display="inline"><![CDATA[R]]></fr:tex>-module is an <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/abelian%20group" type="external">abelian group</fr:link></html:span>. Module theory thus simultaneously generalises linear algebra and abelian group theory.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <html:p>The <html:em>direct sum</html:em> and <html:em>direct product</html:em> of modules are dual constructions — the coproduct and product in <fr:tex display="inline"><![CDATA[\mathbf {Mod}_R]]></fr:tex>. They coincide for finite index sets (forming <html:em>biproducts</html:em>) but diverge in the infinite case.</html:p>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>26</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/alg-1EBQ/</fr:uri>
                    <fr:display-uri>alg-1EBQ</fr:display-uri>
                    <fr:route>/forest/alg-1EBQ/</fr:route>
                    <fr:title text="Direct product of modules">Direct product of modules</fr:title>
                    <fr:taxon>definition</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Let <fr:tex display="inline"><![CDATA[R]]></fr:tex> be a ring and <fr:tex display="inline"><![CDATA[\{M_i\}_{i \in  I}]]></fr:tex> a family of <fr:tex display="inline"><![CDATA[R]]></fr:tex>-modules. The <html:strong>direct product</html:strong> <fr:tex display="inline"><![CDATA[\prod _{i \in  I} M_i]]></fr:tex> is the <fr:tex display="inline"><![CDATA[R]]></fr:tex>-module whose underlying set is the Cartesian product:</html:p>
                    <fr:tex display="block"><![CDATA[
  \prod _{i \in  I} M_i = \{(a_i)_{i \in  I} \mid  a_i \in  M_i \text { for all } i \in  I\}
]]></fr:tex>
                    <html:p>with componentwise addition and scalar multiplication. It comes equipped with <html:em>canonical projections</html:em> <fr:tex display="inline"><![CDATA[\pi _k : \prod _{i \in  I} M_i \rightarrow  M_k]]></fr:tex> extracting the <fr:tex display="inline"><![CDATA[k]]></fr:tex>-th component.</html:p>
                    <html:p><html:strong>Universal property</html:strong> (product): for any <fr:tex display="inline"><![CDATA[R]]></fr:tex>-module <fr:tex display="inline"><![CDATA[N]]></fr:tex> and family of morphisms <fr:tex display="inline"><![CDATA[g_i : N \rightarrow  M_i]]></fr:tex>, there exists a unique <fr:tex display="inline"><![CDATA[h : N \rightarrow  \prod _{i \in  I} M_i]]></fr:tex> such that <fr:tex display="inline"><![CDATA[\pi _i \circ  h = g_i]]></fr:tex> for all <fr:tex display="inline"><![CDATA[i \in  I]]></fr:tex>.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <html:p>The direct sum is defined dually, as a submodule of the direct product with a finiteness constraint.</html:p>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>26</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/alg-1EBR/</fr:uri>
                    <fr:display-uri>alg-1EBR</fr:display-uri>
                    <fr:route>/forest/alg-1EBR/</fr:route>
                    <fr:title text="Direct sum of modules">Direct sum of modules</fr:title>
                    <fr:taxon>definition</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Let <fr:tex display="inline"><![CDATA[R]]></fr:tex> be a ring and <fr:tex display="inline"><![CDATA[\{M_i\}_{i \in  I}]]></fr:tex> a family of <fr:tex display="inline"><![CDATA[R]]></fr:tex>-modules. The <html:strong>direct sum</html:strong> <fr:tex display="inline"><![CDATA[\bigoplus _{i \in  I} M_i]]></fr:tex> is the submodule of the <fr:link href="/forest/alg-1EBQ/" title="Direct product of modules" uri="https://kream.codeberg.page/forest/alg-1EBQ/" display-uri="alg-1EBQ" type="local">direct product</fr:link> consisting of sequences with <html:em>finite support</html:em>:</html:p>
                    <fr:tex display="block"><![CDATA[
  \bigoplus _{i \in  I} M_i = \{(a_i)_{i \in  I} \in  \prod _{i \in  I} M_i \mid  a_i = 0 \text { for all but finitely many } i\}
]]></fr:tex>
                    <html:p>It comes equipped with <html:em>canonical injections</html:em> <fr:tex display="inline"><![CDATA[\iota _k : M_k \rightarrow  \bigoplus _{i \in  I} M_i]]></fr:tex> sending <fr:tex display="inline"><![CDATA[a \in  M_k]]></fr:tex> to the sequence that is <fr:tex display="inline"><![CDATA[a]]></fr:tex> at position <fr:tex display="inline"><![CDATA[k]]></fr:tex> and <fr:tex display="inline"><![CDATA[0]]></fr:tex> elsewhere.</html:p>
                    <html:p><html:strong>Universal property</html:strong> (coproduct): for any <fr:tex display="inline"><![CDATA[R]]></fr:tex>-module <fr:tex display="inline"><![CDATA[L]]></fr:tex> and family of morphisms <fr:tex display="inline"><![CDATA[\varphi _i : M_i \rightarrow  L]]></fr:tex>, there exists a unique <fr:tex display="inline"><![CDATA[\Phi  : \bigoplus _{i \in  I} M_i \rightarrow  L]]></fr:tex> such that <fr:tex display="inline"><![CDATA[\Phi  \circ  \iota _i = \varphi _i]]></fr:tex> for all <fr:tex display="inline"><![CDATA[i \in  I]]></fr:tex>.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <html:p>When the index set is finite, the finiteness constraint is vacuous and the two constructions coincide.</html:p>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>26</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/alg-1EBS/</fr:uri>
                    <fr:display-uri>alg-1EBS</fr:display-uri>
                    <fr:route>/forest/alg-1EBS/</fr:route>
                    <fr:title text="Biproducts of modules">Biproducts of modules</fr:title>
                    <fr:taxon>proposition</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>When the index set <fr:tex display="inline"><![CDATA[I]]></fr:tex> is finite, the <fr:link href="/forest/alg-1EBR/" title="Direct sum of modules" uri="https://kream.codeberg.page/forest/alg-1EBR/" display-uri="alg-1EBR" type="local">direct sum</fr:link> and <fr:link href="/forest/alg-1EBQ/" title="Direct product of modules" uri="https://kream.codeberg.page/forest/alg-1EBQ/" display-uri="alg-1EBQ" type="local">direct product</fr:link> coincide:</html:p>
                    <fr:tex display="block"><![CDATA[\bigoplus _{i \in  I} M_i \cong  \prod _{i \in  I} M_i]]></fr:tex>
                    <html:p>The finite support condition is vacuous when <fr:tex display="inline"><![CDATA[I]]></fr:tex> is finite, so every element of the product already has finite support. The resulting object is a <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/biproduct" type="external">biproduct</fr:link></html:span>: it is simultaneously a product (with projections <fr:tex display="inline"><![CDATA[\pi _k]]></fr:tex>) and a coproduct (with injections <fr:tex display="inline"><![CDATA[\iota _k]]></fr:tex>), satisfying:</html:p>
                    <html:ul><html:li><fr:tex display="inline"><![CDATA[\pi _k \circ  \iota _k = \mathrm {id}_{M_k}]]></fr:tex></html:li>
  <html:li><fr:tex display="inline"><![CDATA[\pi _k \circ  \iota _j = 0]]></fr:tex> when <fr:tex display="inline"><![CDATA[k \neq  j]]></fr:tex></html:li>
  <html:li><fr:tex display="inline"><![CDATA[\sum _{k} \iota _k \circ  \pi _k = \mathrm {id}]]></fr:tex></html:li></html:ul>
                    <html:p>This biproduct structure is what makes <fr:tex display="inline"><![CDATA[\mathbf {Mod}_R]]></fr:tex> an <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/additive%20category" type="external">additive category</fr:link></html:span>.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <html:p>In the infinite case, however, the direct sum is strictly smaller.</html:p>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>26</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/alg-1EBO/</fr:uri>
                    <fr:display-uri>alg-1EBO</fr:display-uri>
                    <fr:route>/forest/alg-1EBO/</fr:route>
                    <fr:title text="Direct sum embeds properly into direct product">Direct sum embeds properly into direct product</fr:title>
                    <fr:taxon>proposition</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>When <fr:tex display="inline"><![CDATA[I]]></fr:tex> is infinite and each <fr:tex display="inline"><![CDATA[M_i]]></fr:tex> is nontrivial, the canonical inclusion</html:p>
                    <fr:tex display="block"><![CDATA[\bigoplus _{i \in  I} M_i \hookrightarrow  \prod _{i \in  I} M_i]]></fr:tex>
                    <html:p>is a <html:em>proper</html:em> monomorphism. The <fr:link href="/forest/alg-1EBR/" title="Direct sum of modules" uri="https://kream.codeberg.page/forest/alg-1EBR/" display-uri="alg-1EBR" type="local">direct sum</fr:link> is a proper submodule of the <fr:link href="/forest/alg-1EBQ/" title="Direct product of modules" uri="https://kream.codeberg.page/forest/alg-1EBQ/" display-uri="alg-1EBQ" type="local">direct product</fr:link>, and no isomorphism exists between them.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>26</fr:day>
                        </fr:date>
                        <fr:taxon>example</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Take <fr:tex display="inline"><![CDATA[M_i = \mathbb {Z}]]></fr:tex> for all <fr:tex display="inline"><![CDATA[i \in  \mathbb {N}]]></fr:tex>. The sequence <fr:tex display="inline"><![CDATA[(1, 1, 1, \ldots )]]></fr:tex> is an element of <fr:tex display="inline"><![CDATA[\prod _{i \in  \mathbb {N}} \mathbb {Z}]]></fr:tex> but not of <fr:tex display="inline"><![CDATA[\bigoplus _{i \in  \mathbb {N}} \mathbb {Z}]]></fr:tex>, since it has infinitely many nonzero entries.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <html:p>The same constructions apply to rings, but the direct sum of rings loses its unit.</html:p>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>26</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/alg-1EBT/</fr:uri>
                    <fr:display-uri>alg-1EBT</fr:display-uri>
                    <fr:route>/forest/alg-1EBT/</fr:route>
                    <fr:title text="Direct sum and direct product of rings">Direct sum and direct product of rings</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>For a family of rings <fr:tex display="inline"><![CDATA[\{R_i\}_{i \in  I}]]></fr:tex>, the <fr:link href="/forest/alg-1EBQ/" title="Direct product of modules" uri="https://kream.codeberg.page/forest/alg-1EBQ/" display-uri="alg-1EBQ" type="local">direct product</fr:link> <fr:tex display="inline"><![CDATA[\prod _{i \in  I} R_i]]></fr:tex> is again a ring with componentwise multiplication and identity <fr:tex display="inline"><![CDATA[(1_{R_i})_{i \in  I}]]></fr:tex>.</html:p>
                    <html:p>The <fr:link href="/forest/alg-1EBR/" title="Direct sum of modules" uri="https://kream.codeberg.page/forest/alg-1EBR/" display-uri="alg-1EBR" type="local">direct sum</fr:link> <fr:tex display="inline"><![CDATA[\bigoplus _{i \in  I} R_i]]></fr:tex> with componentwise multiplication is only a <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/rng" type="external">rng</fr:link></html:span> (ring without unit) when <fr:tex display="inline"><![CDATA[I]]></fr:tex> is infinite, since the would-be identity <fr:tex display="inline"><![CDATA[(1, 1, 1, \ldots )]]></fr:tex> does not have finite support.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <html:p>Free modules arise as left adjoints to forgetful functors; projective modules generalise them by relaxing the basis requirement to a lifting property.</html:p>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>18</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/alg-1EC3/</fr:uri>
                    <fr:display-uri>alg-1EC3</fr:display-uri>
                    <fr:route>/forest/alg-1EC3/</fr:route>
                    <fr:title text="Free module">Free module</fr:title>
                    <fr:taxon>definition</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Let <fr:tex display="inline"><![CDATA[A]]></fr:tex> be a <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/monoid%20in%20a%20monoidal%20category" type="external">monoid</fr:link></html:span> in a <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/monoidal%20category" type="external">monoidal category</fr:link></html:span> <fr:tex display="inline"><![CDATA[C]]></fr:tex>, and let <fr:tex display="inline"><![CDATA[U \colon  A\text {-}\mathbf {Mod}(C) \rightarrow  C]]></fr:tex> be the <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/forgetful%20functor" type="external">forgetful functor</fr:link></html:span> from the category of <fr:link href="/forest/alg-1EC1/" title="Module over a monoid" uri="https://kream.codeberg.page/forest/alg-1EC1/" display-uri="alg-1EC1" type="local"><fr:tex display="inline"><![CDATA[A]]></fr:tex>-modules</fr:link> to <fr:tex display="inline"><![CDATA[C]]></fr:tex>, sending each module <fr:tex display="inline"><![CDATA[(N, \rho )]]></fr:tex> to its underlying object <fr:tex display="inline"><![CDATA[N]]></fr:tex>.</html:p>
                    <html:p>The <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/adjoint%20functor" type="external">left adjoint</fr:link></html:span> <fr:tex display="inline"><![CDATA[F \colon  C \rightarrow  A\text {-}\mathbf {Mod}(C)]]></fr:tex> to <fr:tex display="inline"><![CDATA[U]]></fr:tex> (when it exists) is the <html:strong>free module</html:strong> construction. Concretely, <fr:tex display="inline"><![CDATA[F]]></fr:tex> sends an object <fr:tex display="inline"><![CDATA[V \in  C]]></fr:tex> to the module <fr:tex display="inline"><![CDATA[F(V) = (A \otimes  V,\; \mu  \otimes  \mathrm {id}_V)]]></fr:tex>, where the action is monoid multiplication on the first factor. The modules in the <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/essential%20image" type="external">essential image</fr:link></html:span> of <fr:tex display="inline"><![CDATA[F]]></fr:tex> are called <html:em>free modules</html:em>.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>18</fr:day>
                        </fr:date>
                        <fr:title text="Free modules over a ring">Free modules over a ring</fr:title>
                        <fr:taxon>proposition</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>For <fr:tex display="inline"><![CDATA[R]]></fr:tex> a <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/ring" type="external">ring</fr:link></html:span>, the free <fr:tex display="inline"><![CDATA[R]]></fr:tex>-module on a <html:em>set</html:em> <fr:tex display="inline"><![CDATA[S]]></fr:tex> arises from composing two adjunctions: the free abelian group <fr:link href="/forest/cat-C70T/" title="Functor" uri="https://kream.codeberg.page/forest/cat-C70T/" display-uri="cat-C70T" type="local">functor</fr:link> <fr:tex display="inline"><![CDATA[\mathbb {Z}[-] \colon  \mathbf {Set} \rightarrow  \mathbf {Ab}]]></fr:tex> followed by <fr:tex display="inline"><![CDATA[F \colon  \mathbf {Ab} \rightarrow  \mathbf {Mod}_R]]></fr:tex> from the general construction above. The composite <fr:tex display="inline"><![CDATA[F \circ  \mathbb {Z}[-] \colon  \mathbf {Set} \rightarrow  \mathbf {Mod}_R]]></fr:tex> is left adjoint to the composite forgetful functor <fr:tex display="inline"><![CDATA[U \colon  \mathbf {Mod}_R \rightarrow  \mathbf {Set}]]></fr:tex>. The free module on <fr:tex display="inline"><![CDATA[S]]></fr:tex> is the <fr:tex display="inline"><![CDATA[|S|]]></fr:tex>-fold <fr:link href="/forest/alg-1EBR/" title="Direct sum of modules" uri="https://kream.codeberg.page/forest/alg-1EBR/" display-uri="alg-1EBR" type="local">direct sum</fr:link>:</html:p>
                        <fr:tex display="block"><![CDATA[ F(S) \cong  \bigoplus _{s \in  S} R ]]></fr:tex>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>18</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/alg-1EC4/</fr:uri>
                    <fr:display-uri>alg-1EC4</fr:display-uri>
                    <fr:route>/forest/alg-1EC4/</fr:route>
                    <fr:title text="Projective module">Projective module</fr:title>
                    <fr:taxon>definition</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter><html:p>An object <fr:tex display="inline"><![CDATA[P]]></fr:tex> of a category <fr:tex display="inline"><![CDATA[C]]></fr:tex> is a <html:strong><html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/projective%20object" type="external">projective object</fr:link></html:span></html:strong> if for every <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/epimorphism" type="external">epimorphism</fr:link></html:span> <fr:tex display="inline"><![CDATA[g \colon  M \twoheadrightarrow  N]]></fr:tex> and every morphism <fr:tex display="inline"><![CDATA[f \colon  P \rightarrow  N]]></fr:tex>, there exists a lift <fr:tex display="inline"><![CDATA[h \colon  P \rightarrow  M]]></fr:tex> such that <fr:tex display="inline"><![CDATA[g \circ  h = f]]></fr:tex>:</html:p>
  <html:center><fr:resource hash="68e4293eca55b69d563d69136122b084"><fr:resource-content><html:img src="/forest/68e4293eca55b69d563d69136122b084.svg" /></fr:resource-content><fr:resource-source type="latex" part="preamble"><![CDATA[\usepackage {tikz-cd}\usepackage {amsopn}\usepackage {amssymb}\usepackage {mathrsfs}\usetikzlibrary {bending}]]></fr:resource-source><fr:resource-source type="latex" part="body"><![CDATA[  \begin{tikzcd}
    & P \arrow[d, "f"] \arrow[dl, dashed, "h"'] \\
    M \arrow[r, two heads, "g"'] & N
  \end{tikzcd}]]></fr:resource-source></fr:resource></html:center>
<html:p>Equivalently, <fr:tex display="inline"><![CDATA[P]]></fr:tex> is projective if and only if the <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/hom%20functor" type="external">hom functor</fr:link></html:span> <fr:tex display="inline"><![CDATA[\operatorname {\mathrm {Hom}}(P, -)]]></fr:tex> preserves epimorphisms.</html:p><html:p>A <html:strong>projective module</html:strong> is a projective object in the category <fr:tex display="inline"><![CDATA[\mathbf {Mod}_R]]></fr:tex> of <fr:link href="/forest/alg-1EC2/" title="Module over a ring" uri="https://kream.codeberg.page/forest/alg-1EC2/" display-uri="alg-1EC2" type="local">modules over a ring</fr:link> <fr:tex display="inline"><![CDATA[R]]></fr:tex>. The following are equivalent:</html:p><html:ol><html:li><fr:tex display="inline"><![CDATA[P]]></fr:tex> is projective (the lifting property above).</html:li>
  <html:li><fr:tex display="inline"><![CDATA[\operatorname {\mathrm {Hom}}_R(P, -)]]></fr:tex> is an <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/exact%20functor" type="external">exact functor</fr:link></html:span>.</html:li>
  <html:li><fr:tex display="inline"><![CDATA[P]]></fr:tex> is a <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/direct%20summand" type="external">direct summand</fr:link></html:span> of a <fr:link href="/forest/alg-1EC3/" title="Free module" uri="https://kream.codeberg.page/forest/alg-1EC3/" display-uri="alg-1EC3" type="local">free module</fr:link>: there exists <fr:tex display="inline"><![CDATA[P']]></fr:tex> and a set <fr:tex display="inline"><![CDATA[S]]></fr:tex> with <fr:tex display="inline"><![CDATA[R^{(S)} \cong  P \oplus  P']]></fr:tex>.</html:li>
  <html:li>Every <fr:link href="/forest/alg-1EBV/" title="Short exact sequence" uri="https://kream.codeberg.page/forest/alg-1EBV/" display-uri="alg-1EBV" type="local">short exact sequence</fr:link> <fr:tex display="inline"><![CDATA[0 \rightarrow  A \rightarrow  B \rightarrow  P \rightarrow  0]]></fr:tex> <fr:link href="/forest/alg-1EBW/" title="Split exact sequence" uri="https://kream.codeberg.page/forest/alg-1EBW/" display-uri="alg-1EBW" type="local">splits</fr:link>.</html:li></html:ol><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link></fr:author></fr:authors><fr:date><fr:year>2026</fr:year><fr:month>3</fr:month><fr:day>18</fr:day></fr:date><fr:taxon>remark</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>Condition (4) says that projective modules are precisely those for which the <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/splitting%20lemma" type="external">splitting lemma</fr:link></html:span> applies whenever they appear as the quotient term of a short exact sequence. Dually, <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/injective%20module" type="external">injective modules</fr:link></html:span> are those for which the sequence splits whenever they appear as the subobject term.</html:p></fr:mainmatter></fr:tree></fr:mainmatter>
                </fr:tree>
                <html:p>The relationship between free and projective modules is a fundamental theme in homological algebra.</html:p>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>18</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/alg-1EC5/</fr:uri>
                    <fr:display-uri>alg-1EC5</fr:display-uri>
                    <fr:route>/forest/alg-1EC5/</fr:route>
                    <fr:title text="Free modules are projective">Free modules are projective</fr:title>
                    <fr:taxon>proposition</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Let <fr:tex display="inline"><![CDATA[(A, \mu , \eta )]]></fr:tex> be a <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/monoid%20in%20a%20monoidal%20category" type="external">monoid</fr:link></html:span> in a <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/monoidal%20category" type="external">monoidal category</fr:link></html:span> <fr:tex display="inline"><![CDATA[(C, \otimes , I)]]></fr:tex>, and let <fr:tex display="inline"><![CDATA[F \dashv  U]]></fr:tex> be the <fr:link href="/forest/alg-1EC3/" title="Free module" uri="https://kream.codeberg.page/forest/alg-1EC3/" display-uri="alg-1EC3" type="local">free-forgetful adjunction</fr:link> between <fr:tex display="inline"><![CDATA[C]]></fr:tex> and <fr:tex display="inline"><![CDATA[A\text {-}\mathbf {Mod}(C)]]></fr:tex>. If <fr:tex display="inline"><![CDATA[V]]></fr:tex> is a <fr:link href="/forest/alg-1EC4/" title="Projective module" uri="https://kream.codeberg.page/forest/alg-1EC4/" display-uri="alg-1EC4" type="local">projective object</fr:link> in <fr:tex display="inline"><![CDATA[C]]></fr:tex> relative to epimorphisms preserved by <fr:tex display="inline"><![CDATA[U]]></fr:tex>, then the free module <fr:tex display="inline"><![CDATA[F(V)]]></fr:tex> is projective in <fr:tex display="inline"><![CDATA[A\text {-}\mathbf {Mod}(C)]]></fr:tex>.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>18</fr:day>
                        </fr:date>
                        <fr:taxon>proof</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Let <fr:tex display="inline"><![CDATA[p \colon  X \twoheadrightarrow  Y]]></fr:tex> be an <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/epimorphism" type="external">epimorphism</fr:link></html:span> in <fr:tex display="inline"><![CDATA[A\text {-}\mathbf {Mod}(C)]]></fr:tex> such that <fr:tex display="inline"><![CDATA[U(p)]]></fr:tex> is an epimorphism in <fr:tex display="inline"><![CDATA[C]]></fr:tex>, and let <fr:tex display="inline"><![CDATA[g \colon  F(V) \rightarrow  Y]]></fr:tex> be any module morphism.</html:p>
                        <html:p>By the adjunction, <fr:tex display="inline"><![CDATA[g]]></fr:tex> corresponds to a unique morphism <fr:tex display="inline"><![CDATA[\tilde {g} \colon  V \rightarrow  U(Y)]]></fr:tex> in <fr:tex display="inline"><![CDATA[C]]></fr:tex>. Since <fr:tex display="inline"><![CDATA[V]]></fr:tex> is projective and <fr:tex display="inline"><![CDATA[U(p) \colon  U(X) \twoheadrightarrow  U(Y)]]></fr:tex> is an epimorphism in <fr:tex display="inline"><![CDATA[C]]></fr:tex>, there exists a lift <fr:tex display="inline"><![CDATA[\tilde {h} \colon  V \rightarrow  U(X)]]></fr:tex> with <fr:tex display="inline"><![CDATA[U(p) \circ  \tilde {h} = \tilde {g}]]></fr:tex>. Transposing back, <fr:tex display="inline"><![CDATA[\tilde {h}]]></fr:tex> corresponds to a module morphism <fr:tex display="inline"><![CDATA[h \colon  F(V) \rightarrow  X]]></fr:tex>. Naturality of the adjunction isomorphism in the codomain variable — the square <fr:tex display="inline"><![CDATA[\operatorname {\mathrm {Hom}}(F(V), X) \xrightarrow {p \circ  -} \operatorname {\mathrm {Hom}}(F(V), Y)]]></fr:tex> over <fr:tex display="inline"><![CDATA[\operatorname {\mathrm {Hom}}(V, U(X)) \xrightarrow {U(p) \circ  -} \operatorname {\mathrm {Hom}}(V, U(Y))]]></fr:tex> — ensures <fr:tex display="inline"><![CDATA[p \circ  h = g]]></fr:tex>.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>18</fr:day>
                        </fr:date>
                        <fr:title text="Diagrammatic proof">Diagrammatic proof</fr:title>
                        <fr:taxon>proof</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter><html:p>We must solve the following lifting problem in <fr:tex display="inline"><![CDATA[A\text {-}\mathbf {Mod}(C)]]></fr:tex>: given an epimorphism <fr:tex display="inline"><![CDATA[p \colon  X \twoheadrightarrow  Y]]></fr:tex> (with <fr:tex display="inline"><![CDATA[U(p)]]></fr:tex> epi) and <fr:tex display="inline"><![CDATA[g \colon  F(V) \rightarrow  Y]]></fr:tex>, find <fr:tex display="inline"><![CDATA[h]]></fr:tex> making the triangle commute.</html:p>
  <html:center><fr:resource hash="cfad8038520e27c937d967b5a749b27d"><fr:resource-content><html:img src="/forest/cfad8038520e27c937d967b5a749b27d.svg" /></fr:resource-content><fr:resource-source type="latex" part="preamble"><![CDATA[\usepackage {tikz-cd}\usepackage {amsopn}\usepackage {amssymb}\usepackage {mathrsfs}\usetikzlibrary {bending}]]></fr:resource-source><fr:resource-source type="latex" part="body"><![CDATA[  \begin{tikzcd}
    & {F(V)} \arrow[d, "g"] \arrow[dl, dashed, "\exists h"'] \\
    X \arrow[r, two heads, "p"'] & Y
  \end{tikzcd}]]></fr:resource-source></fr:resource></html:center>
<html:p>Transpose along <fr:tex display="inline"><![CDATA[F \dashv  U]]></fr:tex> to obtain a lifting problem in <fr:tex display="inline"><![CDATA[C]]></fr:tex>:</html:p>
  <html:center><fr:resource hash="5798196094e46931f9d30ea3631915d9"><fr:resource-content><html:img src="/forest/5798196094e46931f9d30ea3631915d9.svg" /></fr:resource-content><fr:resource-source type="latex" part="preamble"><![CDATA[\usepackage {tikz-cd}\usepackage {amsopn}\usepackage {amssymb}\usepackage {mathrsfs}\usetikzlibrary {bending}]]></fr:resource-source><fr:resource-source type="latex" part="body"><![CDATA[  \begin{tikzcd}
    & V \arrow[d, "\tilde{g}"] \arrow[dl, dashed, "\exists \tilde{h}"'] \\
    {U(X)} \arrow[r, two heads, "{U(p)}"'] & {U(Y)}
  \end{tikzcd}]]></fr:resource-source></fr:resource></html:center>
<html:p>Since <fr:tex display="inline"><![CDATA[V]]></fr:tex> is projective in <fr:tex display="inline"><![CDATA[C]]></fr:tex> and <fr:tex display="inline"><![CDATA[U(p)]]></fr:tex> is epi, the lift <fr:tex display="inline"><![CDATA[\tilde {h}]]></fr:tex> exists. Transposing back gives <fr:tex display="inline"><![CDATA[h \colon  F(V) \rightarrow  X]]></fr:tex>. The naturality square for the adjunction bijection</html:p>
  <html:center><fr:resource hash="838a08e08a148ae7d29c4ab918e170c9"><fr:resource-content><html:img src="/forest/838a08e08a148ae7d29c4ab918e170c9.svg" /></fr:resource-content><fr:resource-source type="latex" part="preamble"><![CDATA[\usepackage {tikz-cd}\usepackage {amsopn}\usepackage {amssymb}\usepackage {mathrsfs}\usetikzlibrary {bending}]]></fr:resource-source><fr:resource-source type="latex" part="body"><![CDATA[  \begin{tikzcd}[column sep=huge]
    {\operatorname{Hom}(F(V), X)} \arrow[r, "{p \circ -}"] \arrow[d, "\cong"'] & {\operatorname{Hom}(F(V), Y)} \arrow[d, "\cong"] \\
    {\operatorname{Hom}(V, U(X))} \arrow[r, "{U(p) \circ -}"'] & {\operatorname{Hom}(V, U(Y))}
  \end{tikzcd}]]></fr:resource-source></fr:resource></html:center>
<html:p>ensures that <fr:tex display="inline"><![CDATA[U(p) \circ  \tilde {h} = \tilde {g}]]></fr:tex> transposes to <fr:tex display="inline"><![CDATA[p \circ  h = g]]></fr:tex>.</html:p></fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>18</fr:day>
                        </fr:date>
                        <fr:title text="Proof tree">Proof tree</fr:title>
                        <fr:taxon>proof</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Write <fr:tex display="inline"><![CDATA[\mathbf {M} = A\text {-}\mathbf {Mod}(C)]]></fr:tex>. All judgments are in context <fr:tex display="inline"><![CDATA[\Gamma ]]></fr:tex> containing <fr:tex display="inline"><![CDATA[F \dashv  U]]></fr:tex>, <fr:tex display="inline"><![CDATA[V : C]]></fr:tex> with</html:p>
                        <fr:tex display="block"><![CDATA[\mathsf {pv} : \Pi (X\, Y : C).\, \Pi (q : \operatorname {\mathrm {Hom}}_C(X, Y)).\, \mathrm {IsEpi}(q) \rightarrow  \Pi (f : \operatorname {\mathrm {Hom}}_C(V, Y)).\, \Sigma (h : \operatorname {\mathrm {Hom}}_C(V, X)).\, q \circ  h = f]]></fr:tex>
                        <html:p>extended with <fr:tex display="inline"><![CDATA[p : \operatorname {\mathrm {Hom}}_{\mathbf {M}}(X, Y)]]></fr:tex>, <fr:tex display="inline"><![CDATA[e : \mathrm {IsEpi}(U(p))]]></fr:tex>, <fr:tex display="inline"><![CDATA[g : \operatorname {\mathrm {Hom}}_{\mathbf {M}}(F(V), Y)]]></fr:tex>. The subderivation <fr:tex display="inline"><![CDATA[\mathcal {D}]]></fr:tex> solves the lifted problem:</html:p>
                        <fr:tex display="block"><![CDATA[\mathcal {D} \;\equiv \; \dfrac {e : \mathrm {IsEpi}(U(p)) \qquad  \dfrac {g : F(V) \rightarrow _{\mathbf {M}} Y}{\mathsf {adj}(g) : V \rightarrow _C U(Y)} \; {\scriptstyle \mathrm {Adj}}}{s : \Sigma (\tilde {h} : V \rightarrow _C U(X)).\, U(p) \circ  \tilde {h} = \mathsf {adj}(g)} \; {\scriptstyle \mathrm {Lift}}]]></fr:tex>
                        <html:p>Both branches reference <fr:tex display="inline"><![CDATA[\mathcal {D}]]></fr:tex> via contraction:</html:p>
                        <fr:tex display="block"><![CDATA[\dfrac {\dfrac {\dfrac {\mathcal {D}}{\pi _1(s) : V \rightarrow _C U(X)} \; {\scriptstyle \pi _1}}{\mathsf {adj}^{-1}(\pi _1(s)) : F(V) \rightarrow _{\mathbf {M}} X} \; {\scriptstyle \mathrm {Adj}^{-1}} \qquad  \dfrac {\dfrac {\mathcal {D}}{\pi _2(s) : U(p) \circ  \pi _1(s) = \mathsf {adj}(g)} \; {\scriptstyle \pi _2}}{\mathsf {nat}(\pi _2(s)) : p \circ  \mathsf {adj}^{-1}(\pi _1(s)) = g} \; {\scriptstyle \mathrm {Nat}}}{\bigl (\mathsf {adj}^{-1}(\pi _1(s)),\; \mathsf {nat}(\pi _2(s))\bigr ) : \Sigma (h : F(V) \rightarrow _{\mathbf {M}} X).\, p \circ  h = g} \; {\scriptstyle \Sigma \text {-I}}]]></fr:tex>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>18</fr:day>
                        </fr:date>
                        <fr:title text="String diagram proof">String diagram proof</fr:title>
                        <fr:taxon>proof</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter><html:p>We depict the adjunction transpose as passing wires through a boundary between <fr:tex display="inline"><![CDATA[A\text {-}\mathbf {Mod}(C)]]></fr:tex> (shaded) and <fr:tex display="inline"><![CDATA[C]]></fr:tex>. The functor <fr:tex display="inline"><![CDATA[U]]></fr:tex> strips the module structure; <fr:tex display="inline"><![CDATA[F]]></fr:tex> freely generates it. A morphism <fr:tex display="inline"><![CDATA[g \colon  F(V) \rightarrow  Y]]></fr:tex> transposes to <fr:tex display="inline"><![CDATA[\tilde {g} \colon  V \rightarrow  U(Y)]]></fr:tex>.</html:p><html:p>Step 1: the lifting problem and its transpose.</html:p>
  <html:center><fr:resource hash="d05a44867e93bc789f0d2d9c143de0a1"><fr:resource-content><html:img src="/forest/d05a44867e93bc789f0d2d9c143de0a1.svg" /></fr:resource-content><fr:resource-source type="latex" part="preamble"><![CDATA[\usepackage {amsmath}\usepackage {amssymb}\usepackage {tikz}\usetikzlibrary {decorations.markings,calc,arrows.meta,positioning}]]></fr:resource-source><fr:resource-source type="latex" part="body"><![CDATA[    \begin{tikzpicture}[
      box/.style={draw, minimum width=1.2cm, minimum height=0.7cm, fill=white},
      wire/.style={thick},
      epi/.style={thick, ->>},
      dashed wire/.style={thick, dashed},
      region/.style={fill=blue!8, draw=none}
    ]
      % Module region
      \fill[region] (-1.2,-0.5) rectangle (2.7,3.2);
      \node[anchor=north west, font=\footnotesize] at (-1.1,3.1) {$A$-$\mathbf{Mod}$};

      % Epi p: X ->> Y
      \draw[wire] (0,0) -- (0,1.5);
      \node[box] at (0,0.75) {$p$};
      \node[below, font=\small] at (0,-0.1) {$X$};
      \node[above, font=\small] at (0,1.6) {$Y$};

      % g: F(V) -> Y
      \draw[wire] (2,1.5) -- (2,2.8);
      \node[box] at (2,2.15) {$g$};
      \node[above, font=\small] at (2,2.9) {$F(V)$};
      \node[below, font=\small] at (2,1.4) {$Y$};

      % Arrow showing transpose
      \node at (4,1.5) {$\xrightarrow{\;\;\mathrm{adj}\;\;}$};

      % Underlying category region
      \begin{scope}[xshift=7cm]
        \fill[region, fill=green!8] (-1.2,-0.5) rectangle (2.7,3.2);
        \node[anchor=north west, font=\footnotesize] at (-1.1,3.1) {$C$};

        % Epi U(p): U(X) ->> U(Y)
        \draw[wire] (0,0) -- (0,1.5);
        \node[box] at (0,0.75) {$U(p)$};
        \node[below, font=\small] at (0,-0.1) {$U(X)$};
        \node[above, font=\small] at (0,1.6) {$U(Y)$};

        % g~: V -> U(Y)
        \draw[wire] (2,1.5) -- (2,2.8);
        \node[box] at (2,2.15) {$\tilde{g}$};
        \node[above, font=\small] at (2,2.9) {$V$};
        \node[below, font=\small] at (2,1.4) {$U(Y)$};
      \end{scope}
    \end{tikzpicture}]]></fr:resource-source></fr:resource></html:center>
<html:p>Step 2: projectivity of <fr:tex display="inline"><![CDATA[V]]></fr:tex> gives a lift <fr:tex display="inline"><![CDATA[\tilde {h}]]></fr:tex> in <fr:tex display="inline"><![CDATA[C]]></fr:tex>, then transposing back gives <fr:tex display="inline"><![CDATA[h]]></fr:tex> in <fr:tex display="inline"><![CDATA[A\text {-}\mathbf {Mod}(C)]]></fr:tex>.</html:p>
  <html:center><fr:resource hash="596f01a8dc2cc672cc63e7bfba7e82c2"><fr:resource-content><html:img src="/forest/596f01a8dc2cc672cc63e7bfba7e82c2.svg" /></fr:resource-content><fr:resource-source type="latex" part="preamble"><![CDATA[\usepackage {amsmath}\usepackage {amssymb}\usepackage {tikz}\usetikzlibrary {decorations.markings,calc,arrows.meta,positioning}]]></fr:resource-source><fr:resource-source type="latex" part="body"><![CDATA[    \begin{tikzpicture}[
      box/.style={draw, minimum width=1.2cm, minimum height=0.7cm, fill=white},
      wire/.style={thick},
      dashed wire/.style={thick, dashed},
      region/.style={fill=green!8, draw=none}
    ]
      % C region: lift exists
      \fill[region] (-1.2,-0.5) rectangle (2.2,3.5);
      \node[anchor=north west, font=\footnotesize] at (-1.1,3.4) {$C$};

      % Wire V -> U(X) -> U(Y) via U(p)
      \draw[wire] (0.5,3) -- (0.5,1.5);
      \node[box] at (0.5,2.25) {$\tilde{h}$};
      \node[above, font=\small] at (0.5,3.1) {$V$};
      \draw[wire] (0.5,1.5) -- (0.5,0);
      \node[box] at (0.5,0.75) {$U(p)$};
      \node[below, font=\small] at (0.5,-0.1) {$U(Y)$};

      % Equals
      \node at (3.2,1.5) {$=$};

      % V -> U(Y) via g~
      \begin{scope}[xshift=4.5cm]
        \draw[wire] (0.5,3) -- (0.5,0);
        \node[box] at (0.5,1.5) {$\tilde{g}$};
        \node[above, font=\small] at (0.5,3.1) {$V$};
        \node[below, font=\small] at (0.5,-0.1) {$U(Y)$};
      \end{scope}

      % Transpose arrow
      \node at (7.5,1.5) {$\xrightarrow{\;\;\mathrm{adj}^{-1}\;\;}$};

      % Module region: result
      \begin{scope}[xshift=10.5cm]
        \fill[blue!8] (-1.2,-0.5) rectangle (2.2,3.5);
        \node[anchor=north west, font=\footnotesize] at (-1.1,3.4) {$A$-$\mathbf{Mod}$};

        % Wire F(V) -> X -> Y via p
        \draw[wire] (0.5,3) -- (0.5,1.5);
        \node[box] at (0.5,2.25) {$h$};
        \node[above, font=\small] at (0.5,3.1) {$F(V)$};
        \draw[wire] (0.5,1.5) -- (0.5,0);
        \node[box] at (0.5,0.75) {$p$};
        \node[below, font=\small] at (0.5,-0.1) {$Y$};
      \end{scope}

      % Final equals
      \node at (13.7,1.5) {$=$};

      \begin{scope}[xshift=15cm]
        \fill[blue!8] (-1.2,-0.5) rectangle (2.2,3.5);

        \draw[wire] (0.5,3) -- (0.5,0);
        \node[box] at (0.5,1.5) {$g$};
        \node[above, font=\small] at (0.5,3.1) {$F(V)$};
        \node[below, font=\small] at (0.5,-0.1) {$Y$};
      \end{scope}
    \end{tikzpicture}]]></fr:resource-source></fr:resource></html:center>
<html:p>Reading left to right: projectivity solves the lifting problem in <fr:tex display="inline"><![CDATA[C]]></fr:tex> (the equation <fr:tex display="inline"><![CDATA[U(p) \circ  \tilde {h} = \tilde {g}]]></fr:tex>), and naturality of the adjunction bijection transports this to <fr:tex display="inline"><![CDATA[p \circ  h = g]]></fr:tex> in the module category.</html:p></fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>18</fr:day>
                        </fr:date>
                        <fr:title text="Projectivity relative to split epimorphisms">Projectivity relative to split epimorphisms</fr:title>
                        <fr:taxon>remark</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>In practice, projectivity in <fr:tex display="inline"><![CDATA[A\text {-}\mathbf {Mod}(C)]]></fr:tex> is often defined relative to <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/split%20epimorphism" type="external">split epimorphisms</fr:link></html:span> — those admitting a section in the underlying category <fr:tex display="inline"><![CDATA[C]]></fr:tex>. Every object of <fr:tex display="inline"><![CDATA[C]]></fr:tex> is projective relative to split epimorphisms (compose with the section), so <html:em>every</html:em> free module <fr:tex display="inline"><![CDATA[F(V)]]></fr:tex> is automatically projective relative to this class, with no assumption on <fr:tex display="inline"><![CDATA[V]]></fr:tex>.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>18</fr:day>
                        </fr:date>
                        <fr:title text="The ring case">The ring case</fr:title>
                        <fr:taxon>remark</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>For <fr:tex display="inline"><![CDATA[R]]></fr:tex> a <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/ring" type="external">ring</fr:link></html:span> (a monoid in <fr:tex display="inline"><![CDATA[(\mathbf {Ab}, \otimes _{\mathbb {Z}}, \mathbb {Z})]]></fr:tex>), the forgetful functor <fr:tex display="inline"><![CDATA[U \colon  \mathbf {Mod}_R \rightarrow  \mathbf {Ab}]]></fr:tex> preserves epimorphisms, and free abelian groups are projective in <fr:tex display="inline"><![CDATA[\mathbf {Ab}]]></fr:tex>. The general theorem then gives: every free <fr:tex display="inline"><![CDATA[R]]></fr:tex>-module <fr:tex display="inline"><![CDATA[R^{(S)} \cong  F(\mathbb {Z}^{(S)})]]></fr:tex> is projective in <fr:tex display="inline"><![CDATA[\mathbf {Mod}_R]]></fr:tex>.</html:p>
                        <html:p>Unwinding the abstract argument yields the classical element-wise proof: given <fr:tex display="inline"><![CDATA[p \colon  M \twoheadrightarrow  N]]></fr:tex> and <fr:tex display="inline"><![CDATA[g \colon  R^{(S)} \rightarrow  N]]></fr:tex>, surjectivity of <fr:tex display="inline"><![CDATA[p]]></fr:tex> provides lifts <fr:tex display="inline"><![CDATA[m_s \in  M]]></fr:tex> of each <fr:tex display="inline"><![CDATA[g(e_s)]]></fr:tex>, and <fr:tex display="inline"><![CDATA[R]]></fr:tex>-linear extension gives the lift.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>18</fr:day>
                        </fr:date>
                        <fr:taxon>remark</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>The converse is false: there exist projective modules that are not free. For example, for <fr:tex display="inline"><![CDATA[R = \mathbb {Z} / 6\mathbb {Z}]]></fr:tex>, the summand <fr:tex display="inline"><![CDATA[\mathbb {Z} / 2\mathbb {Z}]]></fr:tex> in the <fr:link href="/forest/alg-1EBR/" title="Direct sum of modules" uri="https://kream.codeberg.page/forest/alg-1EBR/" display-uri="alg-1EBR" type="local">direct sum</fr:link> decomposition <fr:tex display="inline"><![CDATA[\mathbb {Z} / 6\mathbb {Z} \cong  \mathbb {Z} / 2\mathbb {Z} \oplus  \mathbb {Z} / 3\mathbb {Z}]]></fr:tex> is projective (as a direct summand of a free module) but not free.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:title text="Sources">Sources</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:ul><html:li><html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/module%20over%20a%20monoid" type="external">module over a monoid</fr:link></html:span></html:li>
    <html:li><html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/module" type="external">module</fr:link></html:span></html:li>
    <html:li><html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/free%20module" type="external">free module</fr:link></html:span></html:li>
    <html:li><html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/projective%20module" type="external">projective module</fr:link></html:span></html:li>
    <html:li><html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/direct%20sum" type="external">direct sum</fr:link></html:span></html:li>
    <html:li><html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/biproduct" type="external">biproduct</fr:link></html:span></html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:uri>https://kream.codeberg.page/forest/alg-1EC6/</fr:uri>
                <fr:display-uri>alg-1EC6</fr:display-uri>
                <fr:route>/forest/alg-1EC6/</fr:route>
                <fr:title text="Homological Algebra">Homological Algebra</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Notes on <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/homological%20algebra" type="external">homological algebra</fr:link></html:span> — the study of <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/chain%20complex" type="external">chain complexes</fr:link></html:span>, <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/exact%20sequence" type="external">exact sequences</fr:link></html:span>, and <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/derived%20functor" type="external">derived functors</fr:link></html:span> in <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/abelian%20category" type="external">abelian categories</fr:link></html:span>. The primary setting is the category <fr:tex display="inline"><![CDATA[\mathbf {Mod}_R]]></fr:tex> of <fr:link href="/forest/alg-1EC2/" title="Module over a ring" uri="https://kream.codeberg.page/forest/alg-1EC2/" display-uri="alg-1EC2" type="local">modules over a ring</fr:link> <fr:tex display="inline"><![CDATA[R]]></fr:tex>.</html:p>
                <html:p>An <html:em>exact sequence</html:em> is a sequence of morphisms where the image of each map equals the kernel of the next. Exact sequences are the central organising tool of homological algebra.</html:p>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>26</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/alg-1EBU/</fr:uri>
                    <fr:display-uri>alg-1EBU</fr:display-uri>
                    <fr:route>/forest/alg-1EBU/</fr:route>
                    <fr:title text="Exact sequence">Exact sequence</fr:title>
                    <fr:taxon>definition</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>A sequence of <fr:tex display="inline"><![CDATA[R]]></fr:tex>-module homomorphisms</html:p>
                    <fr:tex display="block"><![CDATA[
  \cdots  \rightarrow  A_{i-1} \xrightarrow {f_{i-1}} A_i \xrightarrow {f_i} A_{i+1} \rightarrow  \cdots 
]]></fr:tex>
                    <html:p>is <html:strong>exact at <fr:tex display="inline"><![CDATA[A_i]]></fr:tex></html:strong> if <fr:tex display="inline"><![CDATA[\operatorname {im}(f_{i-1}) = \ker (f_i)]]></fr:tex>. The sequence is <html:strong>exact</html:strong> if it is exact at every non-terminal position.</html:p>
                    <html:p>Exactness at <fr:tex display="inline"><![CDATA[A_i]]></fr:tex> implies <fr:tex display="inline"><![CDATA[f_i \circ  f_{i-1} = 0]]></fr:tex>, but the converse does not hold in general. The gap between these two conditions is measured by the <html:em>homology</html:em> <fr:tex display="inline"><![CDATA[H_i = \ker (f_i) / \operatorname {im}(f_{i-1})]]></fr:tex>: exactness at <fr:tex display="inline"><![CDATA[A_i]]></fr:tex> is equivalent to <fr:tex display="inline"><![CDATA[H_i = 0]]></fr:tex>.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <html:p>The most important special case is the short exact sequence, which captures the idea of one module sitting inside another with a prescribed quotient.</html:p>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>26</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/alg-1EBV/</fr:uri>
                    <fr:display-uri>alg-1EBV</fr:display-uri>
                    <fr:route>/forest/alg-1EBV/</fr:route>
                    <fr:title text="Short exact sequence">Short exact sequence</fr:title>
                    <fr:taxon>definition</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>A <html:strong>short exact sequence</html:strong> is an <fr:link href="/forest/alg-1EBU/" title="Exact sequence" uri="https://kream.codeberg.page/forest/alg-1EBU/" display-uri="alg-1EBU" type="local">exact sequence</fr:link> of the form</html:p>
                    <fr:tex display="block"><![CDATA[
  0 \rightarrow  A \xrightarrow {\iota } B \xrightarrow {p} C \rightarrow  0
]]></fr:tex>
                    <html:p>Exactness at each position gives:</html:p>
                    <html:ul><html:li>At <fr:tex display="inline"><![CDATA[A]]></fr:tex>: <fr:tex display="inline"><![CDATA[\ker (\iota ) = 0]]></fr:tex>, so <fr:tex display="inline"><![CDATA[\iota ]]></fr:tex> is injective (a monomorphism).</html:li>
  <html:li>At <fr:tex display="inline"><![CDATA[B]]></fr:tex>: <fr:tex display="inline"><![CDATA[\operatorname {im}(\iota ) = \ker (p)]]></fr:tex>.</html:li>
  <html:li>At <fr:tex display="inline"><![CDATA[C]]></fr:tex>: <fr:tex display="inline"><![CDATA[\operatorname {im}(p) = C]]></fr:tex>, so <fr:tex display="inline"><![CDATA[p]]></fr:tex> is surjective (an epimorphism).</html:li></html:ul>
                    <html:p>Equivalently, <fr:tex display="inline"><![CDATA[A]]></fr:tex> embeds as a submodule of <fr:tex display="inline"><![CDATA[B]]></fr:tex> and <fr:tex display="inline"><![CDATA[C \cong  B / \iota (A)]]></fr:tex>. A short exact sequence is also called an <html:em>extension</html:em> of <fr:tex display="inline"><![CDATA[C]]></fr:tex> by <fr:tex display="inline"><![CDATA[A]]></fr:tex>.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>26</fr:day>
                        </fr:date>
                        <fr:taxon>example</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>For any integer <fr:tex display="inline"><![CDATA[n \geq  2]]></fr:tex>:</html:p>
                        <fr:tex display="block"><![CDATA[0 \rightarrow  \mathbb {Z} \xrightarrow {\times  n} \mathbb {Z} \rightarrow  {\mathbb {Z}}/n{\mathbb {Z}} \rightarrow  0]]></fr:tex>
                        <html:p>The image of multiplication by <fr:tex display="inline"><![CDATA[n]]></fr:tex> is exactly the kernel of the quotient map <fr:tex display="inline"><![CDATA[\mathbb {Z} \rightarrow  {\mathbb {Z}}/n{\mathbb {Z}}]]></fr:tex>.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>26</fr:day>
                        </fr:date>
                        <fr:taxon>example</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>For any <fr:tex display="inline"><![CDATA[R]]></fr:tex>-module <fr:tex display="inline"><![CDATA[M]]></fr:tex> and submodule <fr:tex display="inline"><![CDATA[N \subseteq  M]]></fr:tex>:</html:p>
                        <fr:tex display="block"><![CDATA[0 \rightarrow  N \xrightarrow {\iota } M \xrightarrow {\pi } M/N \rightarrow  0]]></fr:tex>
                        <html:p>This is the prototypical short exact sequence.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <html:p>A short exact sequence is <html:em>split</html:em> when the middle term decomposes as a <fr:link href="/forest/alg-1EBR/" title="Direct sum of modules" uri="https://kream.codeberg.page/forest/alg-1EBR/" display-uri="alg-1EBR" type="local">direct sum</fr:link>. This happens automatically for vector spaces, but not in general.</html:p>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>26</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/alg-1EBW/</fr:uri>
                    <fr:display-uri>alg-1EBW</fr:display-uri>
                    <fr:route>/forest/alg-1EBW/</fr:route>
                    <fr:title text="Split exact sequence">Split exact sequence</fr:title>
                    <fr:taxon>definition</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>A <fr:link href="/forest/alg-1EBV/" title="Short exact sequence" uri="https://kream.codeberg.page/forest/alg-1EBV/" display-uri="alg-1EBV" type="local">short exact sequence</fr:link> <fr:tex display="inline"><![CDATA[0 \rightarrow  A \xrightarrow {\iota } B \xrightarrow {p} C \rightarrow  0]]></fr:tex> is <html:strong>split</html:strong> if any of the following equivalent conditions holds:</html:p>
                    <html:ul><html:li>There exists a <html:em>section</html:em> <fr:tex display="inline"><![CDATA[s : C \rightarrow  B]]></fr:tex> such that <fr:tex display="inline"><![CDATA[p \circ  s = \mathrm {id}_C]]></fr:tex>.</html:li>
  <html:li>There exists a <html:em>retraction</html:em> <fr:tex display="inline"><![CDATA[r : B \rightarrow  A]]></fr:tex> such that <fr:tex display="inline"><![CDATA[r \circ  \iota  = \mathrm {id}_A]]></fr:tex>.</html:li>
  <html:li><fr:tex display="inline"><![CDATA[B \cong  A \oplus  C]]></fr:tex> (see <fr:link href="/forest/alg-1EBR/" title="Direct sum of modules" uri="https://kream.codeberg.page/forest/alg-1EBR/" display-uri="alg-1EBR" type="local">Direct sum of modules</fr:link>), and the sequence is isomorphic to the canonical one <fr:tex display="inline"><![CDATA[0 \rightarrow  A \xrightarrow {\iota _1} A \oplus  C \xrightarrow {\pi _2} C \rightarrow  0]]></fr:tex>.</html:li></html:ul>
                    <html:p>The equivalence of these conditions is the <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/splitting%20lemma" type="external">splitting lemma</fr:link></html:span>.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>26</fr:day>
                        </fr:date>
                        <fr:taxon>remark</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Every short exact sequence of <html:em>vector spaces</html:em> splits, since every subspace has a complement. More generally, a short exact sequence <fr:tex display="inline"><![CDATA[0 \rightarrow  A \rightarrow  B \rightarrow  C \rightarrow  0]]></fr:tex> splits whenever <fr:tex display="inline"><![CDATA[C]]></fr:tex> is <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/projective%20module" type="external">projective</fr:link></html:span> or <fr:tex display="inline"><![CDATA[A]]></fr:tex> is <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/injective%20module" type="external">injective</fr:link></html:span>.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <html:p>Applying a functor to a short exact sequence typically breaks exactness. The derived functors measure this failure, assembling the remnants into a long exact sequence.</html:p>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>26</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/alg-1EBX/</fr:uri>
                    <fr:display-uri>alg-1EBX</fr:display-uri>
                    <fr:route>/forest/alg-1EBX/</fr:route>
                    <fr:title text="Long exact sequence">Long exact sequence</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>A <html:em>long exact sequence</html:em> is an <fr:link href="/forest/alg-1EBU/" title="Exact sequence" uri="https://kream.codeberg.page/forest/alg-1EBU/" display-uri="alg-1EBU" type="local">exact sequence</fr:link> extending over many (or infinitely many) terms. They typically arise from applying a functor to a <fr:link href="/forest/alg-1EBV/" title="Short exact sequence" uri="https://kream.codeberg.page/forest/alg-1EBV/" display-uri="alg-1EBV" type="local">short exact sequence</fr:link>.</html:p>
                    <html:p>If <fr:tex display="inline"><![CDATA[F]]></fr:tex> is a left exact functor and <fr:tex display="inline"><![CDATA[0 \rightarrow  A \rightarrow  B \rightarrow  C \rightarrow  0]]></fr:tex> is a short exact sequence, the right <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/derived%20functor" type="external">derived functors</fr:link></html:span> <fr:tex display="inline"><![CDATA[R^i F]]></fr:tex> assemble into a long exact sequence:</html:p>
                    <fr:tex display="block"><![CDATA[
  0 \rightarrow  FA \rightarrow  FB \rightarrow  FC \xrightarrow {\delta } R^1FA \rightarrow  R^1FB \rightarrow  R^1FC \xrightarrow {\delta } R^2FA \rightarrow  \cdots 
]]></fr:tex>
                    <html:p>The maps <fr:tex display="inline"><![CDATA[\delta  : R^i FC \rightarrow  R^{i+1} FA]]></fr:tex> are <html:em>connecting homomorphisms</html:em>. Their existence is established by the <fr:link href="/forest/alg-1EBY/" title="Snake lemma" uri="https://kream.codeberg.page/forest/alg-1EBY/" display-uri="alg-1EBY" type="local">snake lemma</fr:link>.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <html:p>The key diagram-chasing tools for working with exact sequences are the snake lemma and the five lemma.</html:p>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>26</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/alg-1EBY/</fr:uri>
                    <fr:display-uri>alg-1EBY</fr:display-uri>
                    <fr:route>/forest/alg-1EBY/</fr:route>
                    <fr:title text="Snake lemma">Snake lemma</fr:title>
                    <fr:taxon>lemma</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter><html:p>Given a commutative diagram with <fr:link href="/forest/alg-1EBU/" title="Exact sequence" uri="https://kream.codeberg.page/forest/alg-1EBU/" display-uri="alg-1EBU" type="local">exact</fr:link> rows:</html:p>
  <html:center><fr:resource hash="6cfefdafb076f9f1e68fd900d5464b01"><fr:resource-content><html:img src="/forest/6cfefdafb076f9f1e68fd900d5464b01.svg" /></fr:resource-content><fr:resource-source type="latex" part="preamble"><![CDATA[\usepackage {tikz-cd}\usepackage {amsopn}\usepackage {amssymb}\usepackage {mathrsfs}\usetikzlibrary {bending}]]></fr:resource-source><fr:resource-source type="latex" part="body"><![CDATA[  \begin{tikzcd}
    & A \arrow[r, "f"] \arrow[d, "\alpha"] & B \arrow[r, "g"] \arrow[d, "\beta"] & C \arrow[r] \arrow[d, "\gamma"] & 0 \\
    0 \arrow[r] & A' \arrow[r, "f'"'] & B' \arrow[r, "g'"'] & C' &
  \end{tikzcd}]]></fr:resource-source></fr:resource></html:center>
<html:p>there exists a connecting homomorphism <fr:tex display="inline"><![CDATA[\delta  : \ker (\gamma ) \rightarrow  \operatorname {coker}(\alpha )]]></fr:tex> such that the following sequence is exact:</html:p><fr:tex display="block"><![CDATA[
  \ker (\alpha ) \rightarrow  \ker (\beta ) \rightarrow  \ker (\gamma ) \xrightarrow {\delta } \operatorname {coker}(\alpha ) \rightarrow  \operatorname {coker}(\beta ) \rightarrow  \operatorname {coker}(\gamma )
]]></fr:tex><html:p>The map <fr:tex display="inline"><![CDATA[\delta ]]></fr:tex> is constructed by diagram chasing: given <fr:tex display="inline"><![CDATA[c \in  \ker (\gamma )]]></fr:tex>, lift to <fr:tex display="inline"><![CDATA[b \in  B]]></fr:tex> via surjectivity of <fr:tex display="inline"><![CDATA[g]]></fr:tex>, push down to <fr:tex display="inline"><![CDATA[\beta (b) \in  B']]></fr:tex>, then <fr:tex display="inline"><![CDATA[g'(\beta (b)) = \gamma (g(b)) = 0]]></fr:tex> so <fr:tex display="inline"><![CDATA[\beta (b) \in  \ker (g') = \operatorname {im}(f')]]></fr:tex>, and we pull back along <fr:tex display="inline"><![CDATA[f']]></fr:tex> to get a class in <fr:tex display="inline"><![CDATA[\operatorname {coker}(\alpha )]]></fr:tex>.</html:p></fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>26</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/alg-1EBZ/</fr:uri>
                    <fr:display-uri>alg-1EBZ</fr:display-uri>
                    <fr:route>/forest/alg-1EBZ/</fr:route>
                    <fr:title text="Five lemma">Five lemma</fr:title>
                    <fr:taxon>lemma</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter><html:p>Given a commutative diagram with <fr:link href="/forest/alg-1EBU/" title="Exact sequence" uri="https://kream.codeberg.page/forest/alg-1EBU/" display-uri="alg-1EBU" type="local">exact</fr:link> rows:</html:p>
  <html:center><fr:resource hash="f7fe9b7c3aff4e19561cdd518648f6e5"><fr:resource-content><html:img src="/forest/f7fe9b7c3aff4e19561cdd518648f6e5.svg" /></fr:resource-content><fr:resource-source type="latex" part="preamble"><![CDATA[\usepackage {tikz-cd}\usepackage {amsopn}\usepackage {amssymb}\usepackage {mathrsfs}\usetikzlibrary {bending}]]></fr:resource-source><fr:resource-source type="latex" part="body"><![CDATA[  \begin{tikzcd}
    A_1 \arrow[r] \arrow[d, "\alpha_1"] & A_2 \arrow[r] \arrow[d, "\alpha_2"] & A_3 \arrow[r] \arrow[d, "\alpha_3"] & A_4 \arrow[r] \arrow[d, "\alpha_4"] & A_5 \arrow[d, "\alpha_5"] \\
    B_1 \arrow[r] & B_2 \arrow[r] & B_3 \arrow[r] & B_4 \arrow[r] & B_5
  \end{tikzcd}]]></fr:resource-source></fr:resource></html:center>
<html:p>if <fr:tex display="inline"><![CDATA[\alpha _1]]></fr:tex> is surjective, <fr:tex display="inline"><![CDATA[\alpha _2]]></fr:tex> and <fr:tex display="inline"><![CDATA[\alpha _4]]></fr:tex> are isomorphisms, and <fr:tex display="inline"><![CDATA[\alpha _5]]></fr:tex> is injective, then <fr:tex display="inline"><![CDATA[\alpha _3]]></fr:tex> is an isomorphism.</html:p><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link></fr:author></fr:authors><fr:date><fr:year>2026</fr:year><fr:month>2</fr:month><fr:day>26</fr:day></fr:date><fr:title text="Short five lemma">Short five lemma</fr:title><fr:taxon>corollary</fr:taxon></fr:frontmatter><fr:mainmatter><html:p>If we have a morphism of <fr:link href="/forest/alg-1EBV/" title="Short exact sequence" uri="https://kream.codeberg.page/forest/alg-1EBV/" display-uri="alg-1EBV" type="local">short exact sequences</fr:link> where <fr:tex display="inline"><![CDATA[\alpha ]]></fr:tex> and <fr:tex display="inline"><![CDATA[\gamma ]]></fr:tex> are isomorphisms:</html:p>
  <html:center><fr:resource hash="2eebed954e577da093c06372402b90d0"><fr:resource-content><html:img src="/forest/2eebed954e577da093c06372402b90d0.svg" /></fr:resource-content><fr:resource-source type="latex" part="preamble"><![CDATA[\usepackage {tikz-cd}\usepackage {amsopn}\usepackage {amssymb}\usepackage {mathrsfs}\usetikzlibrary {bending}]]></fr:resource-source><fr:resource-source type="latex" part="body"><![CDATA[    \begin{tikzcd}
      0 \arrow[r] & A \arrow[r] \arrow[d, "\alpha", "\sim"'] & B \arrow[r] \arrow[d, "\beta"] & C \arrow[r] \arrow[d, "\gamma", "\sim"'] & 0 \\
      0 \arrow[r] & A' \arrow[r] & B' \arrow[r] & C' \arrow[r] & 0
    \end{tikzcd}]]></fr:resource-source></fr:resource></html:center>
<html:p>then <fr:tex display="inline"><![CDATA[\beta ]]></fr:tex> is also an isomorphism.</html:p></fr:mainmatter></fr:tree></fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:title text="Sources">Sources</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:ul><html:li><html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/homological%20algebra" type="external">homological algebra</fr:link></html:span></html:li>
    <html:li><html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/exact%20sequence" type="external">exact sequence</fr:link></html:span></html:li>
    <html:li><html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/short%20exact%20sequence" type="external">short exact sequence</fr:link></html:span></html:li>
    <html:li><html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/split%20exact%20sequence" type="external">split exact sequence</fr:link></html:span></html:li>
    <html:li><html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/snake%20lemma" type="external">snake lemma</fr:link></html:span></html:li>
    <html:li><html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/five%20lemma" type="external">five lemma</fr:link></html:span></html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
              </fr:author>
            </fr:authors>
            <fr:uri>https://kream.codeberg.page/forest/blog-0001/</fr:uri>
            <fr:display-uri>blog-0001</fr:display-uri>
            <fr:route>/forest/blog-0001/</fr:route>
            <fr:title text="Blog">Blog</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Longer-form writing and essays.<fr:link href="/forest/feed.xml" type="external">RSS feed</fr:link></html:p>
            <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>3</fr:month>
                  <fr:day>9</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/life-000B/</fr:uri>
                <fr:display-uri>life-000B</fr:display-uri>
                <fr:route>/forest/life-000B/</fr:route>
                <fr:title text="Building a Split Ergonomic Keyboard">Building a Split Ergonomic Keyboard</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
  <html:center><html:img src="https://keebmaker.com/cdn/shop/files/customKeeb_ce19d774-a50d-413d-a30c-bba3cf60d393.png?v=1747833014" alt="Sweep Bling LP split keyboard" class="figure-content" /></html:center>
<html:p>Unlike a regular mechanical keyboard, this project is not about a normal monolithic fully fledged thick horizontal-staggered board. This is something else.</html:p><html:p>This is about building a split ergonomic keyboard with <html:strong>vertical staggering</html:strong> and <html:strong>low-profile switches+keycaps</html:strong>. This is inherently better than a normal mechanical keyboard in many different ways:</html:p><html:ol><html:li>Pricewise, this is much cheaper than buying a full set of keyboard components. There is virtually no plate. Every single tap is hitting directly on the PCB.</html:li>
  <html:li>Higher customizability. Most people choosing this option just straight up build their own keyboard from the PCB up.</html:li>
  <html:li>Comfort. This keyboard is really slim so there is no need for a hand rest.</html:li>
  <html:li>Speed. Since I will be using Neovim and Doom Emacs, I really don't need a whole lot of keys to work with. However, I can go a step further with the use of a multi-layered keymapping that supports macros.</html:li></html:ol><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link></fr:author></fr:authors><fr:date><fr:year>2026</fr:year><fr:month>3</fr:month><fr:day>9</fr:day></fr:date><fr:title text="RSI">RSI</fr:title></fr:frontmatter><fr:mainmatter><html:p>As someone who types a lot for coding and documenting, <fr:link href="https://www.healthline.com/health/repetitive-strain-injurysymptoms" type="external">RSI</fr:link> is something that I have to worry about. I do not want my hands to completely break and lose the ability of ever using my hands. A common RSI includes <fr:link href="https://orthoinfo.aaos.org/en/diseases--conditions/carpal-tunnel-syndrome/" type="external">Carpal Tunnel Syndrome</fr:link>.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link></fr:author></fr:authors><fr:date><fr:year>2026</fr:year><fr:month>3</fr:month><fr:day>9</fr:day></fr:date><fr:title text="Research">Research</fr:title></fr:frontmatter><fr:mainmatter><html:p>The project started with exploring the Ferris/Sweep family:</html:p><html:ul><html:li><fr:link href="https://github.com/pierrechevalier83/ferris" type="external">Ferris</fr:link> — a low profile split keyboard</html:li>
    <html:li><fr:link href="https://github.com/davidphilipbarr/Sweep" type="external">Sweep</fr:link> — a small Pro Micro-based keyboard inspired by the Ferris</html:li>
    <html:li><fr:link href="https://github.com/jimmerricks/swoop" type="external">Swoop</fr:link> — a fork from Sweep with encoder support
    
  <html:center><html:img src="https://kbd.news/pic/2022/61/1200.jpg" alt="Swoop keyboard with encoder knob" class="figure-content" /></html:center></html:li></html:ul><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link></fr:author></fr:authors><fr:date><fr:year>2026</fr:year><fr:month>3</fr:month><fr:day>9</fr:day></fr:date><fr:title text="PCB">PCB</fr:title></fr:frontmatter><fr:mainmatter><html:p>One thing I came across as a major difference between different PCB designs was the usage of diodes. Some designs require one diode for every key, while others don't need diodes at all. The usage of diodes increases the complexity of the soldering process by a lot.</html:p><html:p>Because of the lack of pins, you use the same trick used in matrix displays: diodes create a grid of the switches, locating through row and column to pinpoint each switch. This creates roll-over issues that cannot be solved unless you are using analog. With the Sweep's direct-pin design, this isn't a problem.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link></fr:author></fr:authors><fr:date><fr:year>2026</fr:year><fr:month>3</fr:month><fr:day>9</fr:day></fr:date><fr:title text="Firmware">Firmware</fr:title></fr:frontmatter><fr:mainmatter><html:p>ZMK works because it supports one thing: Bluetooth, namely the Nice!Nano microcontrollers. Because I don't want to set up the same thing twice in QMK and ZMK, I stuck with ZMK so I can easily support Bluetooth.</html:p><html:ul><html:li><fr:link href="https://github.com/zmkfirmware/zmk" type="external">ZMK Firmware</fr:link></html:li>
      <html:li><fr:link href="https://zmk.dev/docs/user-setup" type="external">Installing ZMK</fr:link></html:li>
      <html:li><fr:link href="https://www.youtube.com/watch?v=Kx8F4xI5yno" type="external">Beginner ZMK Tutorial</fr:link></html:li></html:ul></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link></fr:author></fr:authors><fr:date><fr:year>2026</fr:year><fr:month>3</fr:month><fr:day>9</fr:day></fr:date><fr:title text="Switches">Switches</fr:title><fr:meta name="youtube">3YBNRXRXG0w</fr:meta></fr:frontmatter><fr:mainmatter><html:p>There's really not that much to choose from if you are focusing only on Kailh Choc Low Profile Switches. I bought a switch tester, but it sadly didn't fit the description of the spring strength according to online sources.</html:p><html:p>I followed <fr:link href="https://www.youtube.com/watch?v=3YBNRXRXG0w" type="external">this guide on modding Kailh Choc switches</fr:link> — O-rings, tape modding, and lubing to improve the sound and feel.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link></fr:author></fr:authors><fr:date><fr:year>2026</fr:year><fr:month>3</fr:month><fr:day>9</fr:day></fr:date><fr:title text="Hot Swap">Hot Swap</fr:title></fr:frontmatter><fr:mainmatter><html:p>This is another thing I wanted on my keyboard. It certainly adds to the extensibility — being able to swap switches without desoldering.</html:p><html:ul><html:li><fr:link href="https://keebsforall.com/products/mill-max-sockets" type="external">Mill-Max Hot Swap Sockets</fr:link> — compatible with Sweep</html:li>
      <html:li><fr:link href="https://splitkb.com/products/kailh-hotswap-sockets?variant=39472161456205" type="external">Kailh Choc v1 hotswap sockets</fr:link></html:li></html:ul></fr:mainmatter></fr:tree></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link></fr:author></fr:authors><fr:date><fr:year>2026</fr:year><fr:month>3</fr:month><fr:day>9</fr:day></fr:date><fr:title text="The Build">The Build</fr:title></fr:frontmatter><fr:mainmatter><html:p>Finally, 2 years later, I had the motivation and time to actually build this thing.</html:p><html:p>I simply bought the <fr:link href="https://shop.beekeeb.com/product/ferris-sweep-bling-lp-low-profile-split-keyboard-diy-kit/" type="external">Ferris Sweep Bling LP Hotswap Choc v1 DIY kit</fr:link> and used the keycaps and switches I bought two years ago.</html:p><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link></fr:author></fr:authors><fr:date><fr:year>2026</fr:year><fr:month>3</fr:month><fr:day>9</fr:day></fr:date><fr:title text="Components">Components</fr:title></fr:frontmatter><fr:mainmatter><html:ul><html:li>Sweep Bling LP PCB (<fr:link href="https://github.com/davidphilipbarr/Sweep/tree/main/Sweep%20Bling%20LP/pcb" type="external">gerber files</fr:link>)</html:li>
      <html:li><html:center><html:img src="https://typeractive.xyz/cdn/shop/products/new-nano-top-small.jpg?v=1671313846" alt="Nice!Nano v2 controller" class="figure-content" /></html:center>

      Nice!Nano v2 controllers ×2</html:li>
      <html:li>Kailh Choc v1 hot-swap sockets</html:li>
      <html:li>Kailh Choc v1 switches (modded)</html:li>
      <html:li>MBK blank keycaps</html:li>
      <html:li>LiPo batteries</html:li>
      <html:li>Power switches</html:li>
      <html:li><fr:link href="https://www.printables.com/model/782368-ferris-sweep-bling-lp" type="external">3D-printable case</fr:link></html:li></html:ul></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link></fr:author></fr:authors><fr:date><fr:year>2026</fr:year><fr:month>3</fr:month><fr:day>9</fr:day></fr:date><fr:title text="Cost">Cost</fr:title></fr:frontmatter><fr:mainmatter><html:p>The final cost came to around <html:strong>$200</html:strong>, which is expected for a keyboard of this kind. Nice!Nanos alone cost a third of the amount.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link></fr:author></fr:authors><fr:date><fr:year>2026</fr:year><fr:month>3</fr:month><fr:day>9</fr:day></fr:date><fr:title text="Soldering and Modding">Soldering and Modding</fr:title></fr:frontmatter><fr:mainmatter><html:p>The Soldering process really wasn't as bad as I thought it would be. Just make sure you have good ventillation and a working soldering iron.</html:p><html:p>The temperature range that you are looking for is at least 200 celcius, and 5V3A phone chargers won't make the cut.</html:p><html:p>The modding process, on the other hand, was very tedious and requires patience. It took me around 3 hours to mod all the switches but the results are rewarding.</html:p></fr:mainmatter></fr:tree></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link></fr:author></fr:authors><fr:date><fr:year>2026</fr:year><fr:month>3</fr:month><fr:day>9</fr:day></fr:date><fr:title text="Firmware and Layout">Firmware and Layout</fr:title></fr:frontmatter><fr:mainmatter><html:p>I customized my own layout and config: <fr:link href="https://github.com/allenxch/zmk-config" type="external">zmk-config</fr:link>.</html:p><html:p>The keymap is QWERTY optimized for Vim with no extra behaviour to ensure a smooth Vim experience. It has 4 layers:</html:p><html:ol><html:li><html:strong>Base</html:strong> — QWERTY with 4 thumb keys</html:li>
    <html:li><html:strong>Numbers/Symbols</html:strong> — top-row numbers, shifted symbols, left-hand modifiers</html:li>
    <html:li><html:strong>Utility</html:strong> — function keys, system controls, right-hand modifiers</html:li>
    <html:li><html:strong>Gaming/Mouse</html:strong> — one-handed gaming on the left, virtual mouse via hjkl on the right</html:li></html:ol><html:p>Notable features:</html:p><html:ul><html:li>Combo: both inner thumb keys toggle the gaming/mouse layer</html:li>
    <html:li>Bluetooth management layer for 5 device profiles</html:li>
    <html:li>Soft-off with GPIO wakeup</html:li></html:ul></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link></fr:author></fr:authors><fr:date><fr:year>2026</fr:year><fr:month>3</fr:month><fr:day>9</fr:day></fr:date><fr:title text="Reflections">Reflections</fr:title></fr:frontmatter><fr:mainmatter><html:p>I am finally putting an end to this thing. This was an incredibly rewarding journey, even though it wasn't the smoothest one. I am just glad I can still find and reignite my passion from two years ago and carry it through. The past 2 years wasn't easy, and I have suffered greatly in a multitude of ways. I just hope it's not too late for me to start again.</html:p><html:p>On a side note, having built this keyboard I also provided help to my friends who are looking to build custom keyboards themselves, like my friend J who built a split low profile keyboard with TKL layout. It's just nice to be part of the keyboard community and I still thoroughly enjoy the aesthetics and the practicality of cool keyboard designs.</html:p></fr:mainmatter></fr:tree><fr:tree show-metadata="false"><fr:frontmatter><fr:authors><fr:author><fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link></fr:author></fr:authors><fr:date><fr:year>2026</fr:year><fr:month>3</fr:month><fr:day>9</fr:day></fr:date><fr:title text="Links">Links</fr:title></fr:frontmatter><fr:mainmatter><html:ul><html:li><fr:link href="https://github.com/allenxch/zmk-config" type="external">zmk-config</fr:link> — my custom ZMK layout and config</html:li>
    <html:li><fr:link href="https://docs.google.com/document/d/1W0jhfqJI2ueJ2FNseR4YAFpNfsUM-_FlREHbpNGmC2o/edit?tab=t.dg66iecr8la0" type="external">Keyboard layouts doc v3</fr:link> - a guide on keyboard layouts</html:li>
    <html:li><fr:link href="https://docs.ergogen.xyz/" type="external">Ergogen</fr:link> — a declarative language for generating ergonomic keyboards</html:li>
    <html:li><fr:link href="https://kbd.news/" type="external">kbd.news</fr:link> — keyboard news and reviews</html:li>
    <html:li><fr:link href="https://www.jonashietala.se/blog/2021/06/03/the-t-34-keyboard-layout/" type="external">The T-34 keyboard layout</fr:link> — Jonas Hietala's 34-key layout for Vim</html:li>
    <html:li><fr:link href="https://keymapdb.com/" type="external">KeymapDB</fr:link> — database of keyboard keymaps</html:li></html:ul></fr:mainmatter></fr:tree></fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>3</fr:month>
                  <fr:day>9</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/blog-0004/</fr:uri>
                <fr:display-uri>blog-0004</fr:display-uri>
                <fr:route>/forest/blog-0004/</fr:route>
                <fr:title text="A New Era of Online Mathematics">A New Era of Online Mathematics</fr:title>
                <fr:meta name="draft">true</fr:meta>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Script for a video essay responding to <fr:link href="https://www.bilibili.com/video/BV1tRAkz4EP2" type="external">Maki's bilibili video</fr:link> on open-source math platforms, while arguing for a broader vision of what online mathematics could become.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="Disclaimer">Disclaimer</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Before we begin: I'm just an undergraduate. My knowledge of both mathematics and technology is limited at best. Nothing in this video is meant as an attack on anyone — not Maki, not the maintainers of any platform I discuss, not anyone in the communities I mention. These are my honest impressions as someone who cares about how we learn and share mathematics, offered in good faith and with full awareness that I might be wrong about any or all of it.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="Hook">Hook</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>We have Duolingo for languages. LeetCode for programming. Khan Academy for high school science. Interactive, gamified, feedback-driven platforms that meet you where you are and push you forward.</html:p>
                    <html:p>But for university-level mathematics? You sit in a lecture hall while a professor writes on a board. You go home and work through problem sets alone, or in small group discussions where everyone is equally lost. The lecture notes are a PDF that hasn't been updated since 2019. When you get stuck, your professor is willing to help — during office hours, if you can make them, and if your question falls within their specialty. Ask an algebraist about homotopy theory and they'll point you to a textbook they haven't opened in ten years.</html:p>
                    <html:p>The entire undergraduate math experience is closed off like this. A small cohort, a fixed curriculum, a handful of professors, and a library. If your university doesn't offer a course in the subject you care about, you're on your own. And "on your own" means hunting for lecture notes from other universities, watching recorded talks you barely follow, and reading textbooks that assume you already know everything except the one thing they're about to teach you. Meanwhile, the lecture notes that <html:em>do</html:em> exist are trapped in their home institutions — a beautiful set of notes on algebraic topology at one university can't link to a complementary treatment of homological algebra at another. Everyone is producing material in isolation, and none of it connects.</html:p>
                    <html:p>Two things are broken: the content is passive, and the ecosystem is fragmented. How did we end up here?</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="The state of online math">The state of online math</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Let's survey what exists. The <fr:link href="https://ncatlab.org/" type="external">nLab</fr:link> is the closest thing category theory, homotopy theory, and mathematical physics have to a comprehensive, research-level knowledge base. It's extraordinary — thousands of densely interlinked pages, community-maintained, and freely available. But it's a wiki. Read-only. Static. The barrier to contributing is high, and the barrier to <html:em>learning from it</html:em> is even higher. If you're not already fluent in the material, nLab pages read like they were written by aliens for aliens. And its coverage reflects who writes it: the nLab is built primarily by categorists and homotopy theorists, so while its pages on category theory and algebraic topology are extraordinarily deep, its coverage of analysis or PDEs is mostly stubs and link collections. It's a deep resource for one tradition within mathematics, not a comprehensive one.</html:p>
                    <html:p>The <fr:link href="https://stacks.math.columbia.edu/" type="external">Stacks Project</fr:link> and <fr:link href="https://kerodon.net/" type="external">Kerodon</fr:link> are different. The Stacks Project, curated by Johan de Jong, and Kerodon, by Jacob Lurie, are tagged, hyperlinked, and internally consistent in a way that no wiki can match. But they're monolithic — single-curator, single-vision projects. The <fr:link href="https://the-clowder-project.github.io/the-clowder-project/" type="external">Clowder Project</fr:link> aims to do for category theory what the Stacks Project did for algebraic geometry, but the fundamental limitation remains: one hierarchy, one editorial voice, one path through the material.</html:p>
                    <html:p>On the other end, <fr:link href="https://www.khanacademy.org/" type="external">Khan Academy</fr:link> and <fr:link href="https://www.3blue1brown.com/" type="external">3Blue1Brown</fr:link> are genuinely wonderful. Grant Sanderson's videos have probably done more to make linear algebra and calculus feel alive than any textbook published in the last century. Khan Academy goes further — it pairs video lessons with tens of thousands of interactive practice exercises, instant feedback, and a mastery system. For K-12 and early undergraduate math, it's remarkable. But its interactivity tops out at filling in answers to pre-written problems. For the kind of mathematics where you need to construct proofs, explore definitions, or build abstractions, a multiple-choice exercise doesn't cut it.</html:p>
                    <html:p>Recently, <fr:link href="https://www.bilibili.com/video/BV1tRAkz4EP2" type="external">Maki posted a video</fr:link> proposing an open-source platform for mathematics — with node maps for visualizing dependencies, customizable PDF generation, and peer review. It's a thoughtful proposal, and the motivation is genuine. But many of the features Maki describes — dependency graphs, modular content, cross-referenced definitions — already exist in a tool called Forester, which has been quietly doing this for years. And Maki's proposal involves building a platform from scratch with a modern web framework stack, which is a lot of engineering effort. I think the energy would be better spent on content than infrastructure. But more fundamentally, Maki's proposal shares a limitation with every platform we've discussed: in all of them, the reader is passive.</html:p>
                    <html:p>You watch a video. You read a wiki page. You skim lecture notes. In every case, the experience is passive — none of these tools ask you to <html:em>do</html:em> anything. And none of it talks to anything else — a video can't link to a formal proof, a wiki can't reference your professor's definitions, and your professor's lecture notes exist in a universe of one. Mathematics, more than almost any other discipline, is something you learn by doing — and by connecting ideas across sources. We have neither.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="The problems">The problems</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>The issues run deeper than any single platform. They're structural, and they're shared by essentially every digital math resource that exists.</html:p>
                    <html:p><html:strong>Linearity.</html:strong> Textbooks and courses impose a single path through material. Chapter 1 before Chapter 2. Prerequisites before results. But mathematics isn't linear — it's a graph. The same definition appears in algebra, topology, and logic with different motivations and different consequences. A single linear ordering loses these connections. I wrote about this in more detail in <fr:link href="/forest/forester-0004/" title="Comparison of forester, org-roam, and Obsidian" uri="https://kream.codeberg.page/forest/forester-0004/" display-uri="forester-0004" type="local">Comparison of forester, org-roam, and Obsidian</fr:link>.</html:p>
                    <html:p><html:strong>Static content.</html:strong> Reading a proof is fundamentally different from constructing one. You can read a proof of the Yoneda lemma a hundred times and still not <html:em>understand</html:em> it the way you would if you'd been forced to fill in the key steps yourself. Every math instructor knows this. Yet our digital tools for math are overwhelmingly read-only.</html:p>
                    <html:p><html:strong>Fragmentation.</html:strong> Knowledge is scattered across PDFs, wikis, videos, textbooks, blog posts, and lecture notes with no interoperability between them. A definition in a textbook can't link to its elaboration on nLab. A video can't reference a formal proof. Everything exists in its own silo.</html:p>
                    <html:p><html:strong>No recontextualization.</html:strong> Content is locked in its original hierarchy. A beautiful explanation of adjoint functors buried at section 4.3.2 of a textbook can't be extracted and placed in a different context without copying it and losing its provenance. This is the h1/h2/h3 problem — HTML and LaTeX hardcode hierarchy into content, making reuse painful. Maki identifies this same issue in his proposal — he wants modular content that can be rearranged. Jon Sterling's <fr:link href="https://www.forester-notes.org/tfmt-0001/" type="external">manifesto on designing tools for scientific thought</fr:link> makes the same argument from a broader perspective: not just education, but research, publishing, and the long-term maintenance of mathematical knowledge. See <fr:link href="/forest/forester-0004/" title="Comparison of forester, org-roam, and Obsidian" uri="https://kream.codeberg.page/forest/forester-0004/" display-uri="forester-0004" type="local">Comparison of forester, org-roam, and Obsidian</fr:link> for more on Sterling's critique.</html:p>
                    <html:p><html:strong>Graph view as gimmick.</html:strong> Tools like Obsidian offer a "graph view" of your notes, which sounds useful until you actually try it. What you get is a force-directed hairball that tells you nothing. In <fr:link href="/forest/forester-0005/" title="Rethinking Graph View for Math Notes" uri="https://kream.codeberg.page/forest/forester-0005/" display-uri="forester-0005" type="local">Rethinking Graph View for Math Notes</fr:link>, I argued that this is because graph view applies a 0-truncation: it collapses all the rich structure of links — their anchor text, their context, their purpose — into bare "connected or not" edges. The result carries almost no information.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="What Forester is">What Forester is</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p><fr:link href="https://www.forester-notes.org/" type="external">Forester</fr:link> is Jon Sterling's tool for scientific thought — an OCaml program that builds densely interlinked mathematical websites from small, atomic notes called "trees." It's open source, it produces static output, and it was designed for mathematics from day one.</html:p>
                    <html:p>What distinguishes Forester from the platforms discussed above is its scope. Sterling designed it to facilitate not just teaching or learning, but authoring, publishing, and the long-term development and interlinking of scientific ideas — the entire lifecycle of mathematical knowledge.</html:p>
                    <html:p>The core ideas are simple. Each tree captures one atomic concept — a definition, a theorem, a remark, a construction. This is the principle of <fr:link href="https://www.forester-notes.org/tfmt-0007/" type="external">atomicity</fr:link>: a note should capture one thing, and ideally <html:em>all</html:em> of that thing, so that understanding it requires only reading it and following its links — not reading everything that came before it in some hierarchy. Traditional math writing fails this completely: you can't understand Theorem 4.3 without reading Sections 1 through 4.2. The guiding principle: "prefer explicit context over implicit context." Larger documents are assembled bottom-up via transclusion: you compose small trees into bigger ones. A definition tree might appear in lecture notes, a homework sheet, and a research paper, contextualised differently each time but never duplicated.</html:p>
                    <html:p>Crucially, section levels are relative. A tree at depth 1 in one document can appear at depth 3 in another without modification. This is Forester's answer to the hierarchy problem: don't hardcode <html:code>h1</html:code>/<html:code>h2</html:code>/<html:code>h3</html:code> into your content. Let the context determine the level. The deeper insight — <fr:link href="https://www.forester-notes.org/tfmt-0006/" type="external">hierarchical structure as non-unique narrative</fr:link>: the same body of definitions and theorems can be assembled into lecture notes, a homework sheet, or a research paper — each imposing a different hierarchy toward different ends. The content doesn't change; only the narrative around it does.</html:p>
                    <html:p>Forester comes with native support for KaTeX, MathML, LaTeX rendering including tikz-cd commutative diagrams, and a custom macro system that shares definitions across the entire forest. Sterling cites the <fr:link href="https://stacks.math.columbia.edu/" type="external">Stacks Project</fr:link> and <fr:link href="https://kerodon.net/" type="external">Kerodon</fr:link> as spiritual predecessors.</html:p>
                    <html:p>The macro system deserves special attention. The <fr:link href="https://www.forester-notes.org/tfmt-000H/" type="external">manifesto argues</fr:link> that any tool whose support for mathematical notation involves a single globally-defined macro package is <html:em>inadequate for mathematical use</html:em>. Notation changes over time, and large clusters of notes share macros while other clusters need different ones. A global macro library means that changing your notation for one project forces a refactoring of everything else — — "one of the main ways that large mathematical projects tend to collapse under their own weight." Forester solves this: each tree specifies which macro libraries it uses, and transcluded notes are rendered with respect to <html:em>their own</html:em> macros, not the parent's. This is why Obsidian and Notion, despite nominally supporting KaTeX, are "so limited that [they are] not usable for a working mathematician."</html:p>
                    <html:p>I compared forester with org-roam and Obsidian in <fr:link href="/forest/forester-0004/" title="Comparison of forester, org-roam, and Obsidian" uri="https://kream.codeberg.page/forest/forester-0004/" display-uri="forester-0004" type="local">Comparison of forester, org-roam, and Obsidian</fr:link>, and studied how different forester users organize their forests in <fr:link href="/forest/forester-0003/" title="How forester users organize their forests: a comparative study" uri="https://kream.codeberg.page/forest/forester-0003/" display-uri="forester-0003" type="local">How forester users organize their forests: a comparative study</fr:link>. The key takeaway is that forester doesn't just support mathematical notation — its entire architecture embodies principles about how mathematical knowledge should be structured.</html:p>
                    <html:p>No framework. No database. No React, no Next.js, no GraphQL. Forester's tech stack is deliberately minimal: an OCaml binary, some XSLT, and plain text files. Yet it comes with everything a mathematical knowledge base needs — KaTeX, tikz-cd, transclusion, cross-references, a macro system, a query language, and static output that hosts anywhere. Much of what Maki proposes building with a modern web stack — node maps, modular content, cross-references — already exists here, in a simpler form. The engineering effort that would go into building and maintaining a framework-heavy platform could instead go into content — into actually writing the mathematics.</html:p>
                    <html:p>It's unfortunate that almost nobody outside the category theory and type theory research community knows Forester exists. Trebor Huang uses it for homological algebra and universal algebra. Utensil has built a forest of over a thousand trees spanning topos theory, Clifford algebra, and computer graphics. Jon Sterling's own forest is a sprawling mathematical Zettelkasten. These are real, active, serious mathematical knowledge bases — and most mathematicians have never heard of the tool that builds them. If Forester had the visibility that Obsidian or Notion has, I think the landscape of online mathematics would look very different.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="Federation: a different model">Federation: a different model</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Maki's proposal envisions a centralized platform with departments, peer review, and editorial oversight. I understand the appeal. Quality control matters, and anyone who's spent time on a wiki knows that open contribution without curation produces inconsistency.</html:p>
                    <html:p>But I think centralization is the wrong answer — and Maki's own history illustrates why. Viewers who have followed him for a while know that his previous project, Maki's Lab, dissolved in 2025 after a conflict with his cofounder Ayumu, who had been the project's primary financial backer. As the lab grew, Ayumu pushed it toward selling self-compiled textbooks and shifting focus to middle and high school content for revenue — abandoning the original mission of advancing university-level math education. The two sides blamed each other for the split. This isn't a criticism of Maki's character or intentions. It's a demonstration of what happens when a project's survival depends on the alignment of a small number of people at the top. Centralized structures are fragile in exactly this way.</html:p>
                    <html:p>The alternative is <html:em>federation</html:em>. Instead of one platform that everyone publishes on, imagine many independent forests — each maintained by an individual, a research group, or a department — that can transclude each other's content. Your forest references my definitions. My forest builds on your constructions. Neither of us controls the other's namespace.</html:p>
                    <html:p>This is what solves Fragmentation and No Recontextualization simultaneously. Picture it concretely: Jon Sterling defines "adjunction" in his forest. A professor in Kyoto transcludes that definition into a course on category theory, adding exercises and commentary. A student forks the course, annotates it with their own examples, and links it to a construction from Trebor Huang's homological algebra forest — all without anyone copying or duplicating content. The definition lives in one place and appears in many contexts. The existing forests — Trebor's, Utensil's, Sterling's — are already the embryo of this network. They just can't talk to each other yet.</html:p>
                    <html:p>Forester 5.0 introduced an experimental mechanism for exactly this: <fr:link href="/forest/forester-0007/" title="Cross-forest transclusion and federation" uri="https://kream.codeberg.page/forest/forester-0007/" display-uri="forester-0007" type="local">publish and implant</fr:link>. A forest can package a fragment of its content as a JSON blob (filtered by a datalog query — publish only what's tagged <html:code>public</html:code>, for instance), and another forest can import that blob and transclude its trees as if they were local. It's static, it's simple, and it preserves authorial independence.</html:p>
                    <html:p>The <fr:link href="https://www.forester-notes.org/005P" type="external">Forester 5.0 release notes</fr:link> frame this as building toward an "Internet of Science" — a federation of many different forests, each independently curated, all interlinked by extending existing protocols with hypermedia controls for content transclusion. I wrote about the technical details and current limitations in <fr:link href="/forest/forester-0007/" title="Cross-forest transclusion and federation" uri="https://kream.codeberg.page/forest/forester-0007/" display-uri="forester-0007" type="local">Cross-forest transclusion and federation</fr:link>.</html:p>
                    <html:p>But what about quality control? Maki's proposal includes peer review for exactly this reason. Sterling addresses this in his manifesto by <fr:link href="https://www.forester-notes.org/tfmt-000Q/" type="external">distinguishing authors from contributors</fr:link>: an <html:em>author</html:em> of a tree is responsible for its content and all its subtrees; a <html:em>contributor</html:em> contributed intellectually but cannot be held responsible for subsequent re-contextualizations. This matters because in a federated system, your definition will be transcluded into contexts you didn't choose and may not endorse. You're responsible for what you wrote, not for how someone else used it. Quality emerges from the same mechanism that makes scientific publishing work: reputation, citation, and the ability to check the source.</html:p>
                    <html:p>AI changes the economics of federation. An MCP server can serve as part of the protocol itself — not just for authoring within a single forest, but for mediating <html:em>between</html:em> forests. When you implant trees from someone else's forest, you inherit their conventions: their macros, their notation, their style of stating definitions. An AI with access to both forests' MCP servers can translate between them — adapting notation, resolving conflicting definitions, suggesting where an imported tree should link into your existing dependency graph. The mechanical friction of working across forests — learning someone else's system, manually cross-referencing their trees with yours — is exactly the kind of overhead that AI handles well.</html:p>
                    <html:p>AI can also curate existing forests in ways that make collaboration and navigation dramatically easier. A forest with hundreds of trees becomes hard to navigate even for its author. An AI that can read every tree, parse the dependency graph, and search across content can identify missing links, flag inconsistencies, suggest reorganization, and generate hub trees that weave scattered atoms into coherent narratives. For a newcomer trying to navigate an unfamiliar forest, an AI assistant that understands the structure can serve as a guide — answering "where is the definition of X?" or "what do I need to read before I can understand this theorem?" by actually traversing the graph rather than guessing. Federation without curation produces a sprawl of disconnected fragments; AI-assisted curation makes the federated network navigable.</html:p>
                    <html:p>This isn't just a technical question. It's a philosophical one. Do we want one authoritative source that everyone must defer to, or a network of independent voices that can reference and build on each other? I lean toward the latter — not because authority is bad, but because the best ideas emerge when different perspectives coexist and compete.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="Interactivity: the missing revolution">Interactivity: the missing revolution</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Now for the second pillar. Math education is almost entirely passive. Even in a college classroom — arguably the most interactive setting mathematics has — the dominant mode is lecture. A professor writes on a board. Students copy it down. Homework is done alone, on paper, with feedback delayed by days.</html:p>
                    <html:p>The main interaction we get as math students trying to learn math is between us and the books, which requires initiative to read, so ultimately us and ourselves.</html:p>
                    <html:p><fr:link href="https://explorabl.es/" type="external">Explorable explanations</fr:link> showed what's possible. Nicky Case's interactive essays on game theory, voting systems, and complex systems let you <html:em>play</html:em> with the ideas — drag sliders, change parameters, watch what happens. The ideas stick because you experienced them, not because you read about them. Bret Victor's <fr:link href="http://worrydream.com/LadderOfAbstraction/" type="external">Ladder of Abstraction</fr:link> made the same point even earlier: understanding requires moving between concrete examples and abstract principles, and that movement should be interactive.</html:p>
                    <html:p>CTFs — Capture The Flag competitions — proved that gamification works for hard technical education. Cybersecurity is at least as difficult as mathematics, and the CTF model has produced a generation of skilled security researchers who learned by doing: progressive difficulty, immediate feedback, competition, and the dopamine hit of solving a puzzle. Nobody learns penetration testing by reading a textbook.</html:p>
                    <html:p>Puzzle games push this further. Stephen's Sausage Roll teaches you a concept that has no name — a spatial intuition about how elongated objects move on a grid — through nothing but carefully designed levels. No tutorials, no explanations, no text. You build the intuition step by step through play. Baba Is You takes this to a meta-level: you manipulate the rules of the game <html:em>within the game</html:em>, pushing word blocks around to rewrite the conditions for winning, losing, and movement. It doesn't teach formal logic explicitly, but it trains exactly the kind of reasoning — what follows from what, what happens when rules conflict, how systems behave under rewriting — that formal logic makes precise.</html:p>
                    <html:p>The <fr:link href="https://adam.math.hhu.de/#/g/leanprover-community/NNG4" type="external">Lean Natural Number Game</fr:link> brought this approach to mathematics. You prove basic properties of natural numbers by writing Lean tactics, with the proof assistant giving you immediate feedback. It works. People who have never touched formal mathematics complete it and come away understanding induction, not because someone explained it, but because they <html:em>did</html:em> it.</html:p>
                    <html:p>What if we could build this for all of mathematics?</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="The Agda widget: a proof of concept">The Agda widget: a proof of concept</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>This is where I show rather than tell. On this site, there's an <fr:link href="https://kream.codeberg.page/forest/agda-0001/" type="external">agda-0001</fr:link> running entirely in the browser via WebAssembly. Editable code blocks with immediate type-checking feedback. You write Agda code — real Agda, not a toy subset — and the proof assistant tells you in seconds whether your proof is correct.</html:p>
                    <html:p>The technical story is nontrivial. Agda compiled to WASM, running in a web worker, with a WASI shim that patches away filesystem errors gracefully. Prebuilt interface files so the first check doesn't take thirty seconds. Cross-tree imports so exercises on one page can build on definitions from another. Scoped contexts, hierarchical modules, compiler flags — all the infrastructure needed to build real courses, not just isolated demos.</html:p>
                    <html:p>The showcase is <fr:link href="https://kream.codeberg.page/forest/agda-0007/" type="external">agda-0007</fr:link>: ten quests teaching homotopy type theory interactively, modeled after the HoTT Game. Each quest uses excluded subtrees for independence — you can attempt them in any order. Each one gives you a type signature and asks you to fill in the proof. The proof assistant is your judge: either it type-checks or it doesn't. No partial credit, no ambiguity.</html:p>
                    <html:p>This is what "interactive math education" can actually look like. Not a video with animations. Not a textbook with exercises at the end of each chapter. An environment where the mathematics itself is executable, where the feedback loop is measured in seconds, and where correctness is enforced by a machine, not a grader.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="Demo: the Agda widget in action">Demo: the Agda widget in action</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO: live demonstration of the Agda widget.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="Demo: category theory notes">Demo: category theory notes</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO: demonstration of the category theory notes, currently in the works.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="AI as co-author">AI as co-author</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>There's a third dimension to this project that I haven't mentioned yet: the role of AI in authoring mathematical content.</html:p>
                    <html:p>The Obsidian community has been experimenting with this. Several MCP servers — notably <fr:link href="https://github.com/iansinnott/obsidian-claude-code-mcp" type="external">obsidian-claude-code-mcp</fr:link> and <fr:link href="https://github.com/MarkusPfundstein/mcp-obsidian" type="external">mcp-obsidian</fr:link> — give Claude structured access to an Obsidian vault: reading notes, searching content, creating and editing files. The idea is simple but powerful: instead of copy-pasting context into a chat window, you give the AI direct access to your knowledge base and let it navigate the structure itself.</html:p>
                    <html:p>I took this idea and built a custom MCP server for Forester. It exposes twelve tools — listing trees, reading their source, full-text search, creating new trees, building the forest, parsing the dependency graph from build output, extracting structured metadata, autocompleting titles. Two resources give Claude the full macro library and a compact syntax reference. The server runs inside <html:code>nix develop</html:code> so it has access to the forester binary and all its dependencies.</html:p>
                    <html:p>But tools alone aren't enough. An LLM with access to <html:code>create_tree</html:code> will happily produce trees that violate every convention the forest has — wrong taxon, missing links, bare text outside paragraph blocks, diagrams without verbatim wrappers, duplicate definitions of concepts that already exist three trees away. The tools give Claude <html:em>access</html:em>; what it needs is <html:em>judgement</html:em>.</html:p>
                    <html:p>That's where skills come in. Claude Code supports skill files — structured prompts that are injected when a specific task type is invoked. I wrote a comprehensive skill for creating mathematical trees that encodes the atomicity principles from Sterling's manifesto, the full forester syntax, the macro library, the prefix and taxon conventions, the linking patterns, the diagram gotchas, and worked examples of atomic definitions, theorems with proofs, and hub trees with narrative interleaving. When I invoke the skill, Claude doesn't just have tools — it has a methodology.</html:p>
                    <html:p>The workflow looks like this: I say "write up the definition of a natural transformation." Claude searches the forest for existing treatments, reads related trees to pick up notation conventions, checks which categories and functors are already defined and where, then produces a tree that links its prerequisites, uses the right macros, follows the right formatting, and fits into the existing dependency graph. I review, adjust, and it's done. What would take me twenty minutes of looking up syntax and cross-referencing trees takes two.</html:p>
                    <html:p>This is not about replacing mathematical thinking with AI. The hard part — deciding what to formalize, choosing the right level of generality, designing the dependency structure, writing the motivation — remains human. What AI handles is the mechanical overhead: remembering which macro renders categories in bold, that display math uses a different delimiter than inline math, that tikz-cd diagrams need verbatim wrappers, that every symbol needs a link to its definition. These are exactly the things that make writing in a formal system tedious, and exactly the things an LLM can reliably do once given the right instructions.</html:p>
                    <html:p>The deeper point connects back to federation. If every forest has its own conventions — its own macros, its own prefixes, its own style — then contributing to someone else's forest means learning their system from scratch. An MCP server plus a skill file captures that system in a form that AI can follow. In principle, you could fork someone's forest, run their MCP server, and have Claude write trees that are indistinguishable from the original author's style. The conventions become portable, not because they're standardized, but because they're machine-readable.</html:p>
                    <html:p>I want to be careful not to overstate this. Current LLMs make mistakes — they hallucinate definitions, they confuse similar concepts, they sometimes produce LaTeX that doesn't compile. Every tree Claude produces still needs human review. But the trajectory is clear: as models improve and as the skill files accumulate more examples and edge cases, the ratio of AI-generated to human-generated content will shift. The forest becomes a collaboration between human mathematical judgement and machine fluency in the notation system.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="A controversial foundation">A controversial foundation</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>I should be upfront about a bias: I think homotopy type theory, category theory, and type theory more broadly are the right foundation for this kind of project.</html:p>
                    <html:p>This is controversial. Most working mathematicians use set theory (ZFC) as their implicit foundation, and many would argue that foundations don't matter for practice. Fair enough. But foundations matter enormously for <html:em>computation and verification</html:em>. Set theory is notoriously hard to mechanize — proof assistants based on set theory exist (Mizar uses Tarski-Grothendieck set theory; Metamath's main library is built on ZFC) but formalization is laborious compared to type-theoretic systems. Type theory, by contrast, is inherently computational: the Curry-Howard correspondence means proofs <html:em>are</html:em> programs, and checking a proof is running a program.</html:p>
                    <html:p>The nLab's "n-point of view" — using category theory as an organizing principle — has proven remarkably effective for connecting disparate areas of mathematics. The same categorical structure (adjunction, limit, Kan extension) appears in algebra, topology, logic, and computer science. Learning this language once gives you a skeleton key for the rest.</html:p>
                    <html:p>This organizing power extends to the meta-level. In <fr:link href="/forest/forester-0005/" title="Rethinking Graph View for Math Notes" uri="https://kream.codeberg.page/forest/forester-0005/" display-uri="forester-0005" type="local">Rethinking Graph View for Math Notes</fr:link>, I sketch (as an unfinished, not-yet-implemented idea) a framework for graph view that would model a forest as a 2-category of mathematical concepts — definitions as 0-cells, typed relationships (generalizes, dualizes, internalizes, categorifies) as 1-cells, and theorems witnessing structure between relationships as 2-cells. The framework draws on how formalization libraries organize knowledge: <fr:link href="https://1lab.dev/" type="external">1lab</fr:link> (cubical Agda), <fr:link href="https://unimath.github.io/UniMath/" type="external">UniMath</fr:link>, and <fr:link href="https://leanprover-community.github.io/mathlib4_docs/" type="external">Mathlib</fr:link> (Lean) all use categorical hierarchies — abstract concepts at the top, instances and specializations below. Category theory gives graph view a mathematical foundation, not just an engineering one: functorial correspondences propagate systematically, internalization layers stratify concepts by ambient category, and duality becomes a first-class operation. This is an independent reason to prefer categorical foundations — they don't just organize <html:em>content</html:em> but the <html:em>relationships between content</html:em>. There's a pleasing resonance with Sterling's principle that forests should be <fr:link href="https://www.forester-notes.org/tfmt-0008/" type="external">flat over deep</fr:link>: in the 2-category, all concepts — groups, topological spaces, adjunctions, whatever — live as 0-cells at the same level. The hierarchy isn't gone; it's encoded in the 1-cells (generalizes, internalizes, categorifies) rather than in nesting depth. Flatness and hierarchy coexist because the structure lives in the morphisms, not in the positions.</html:p>
                    <html:p>There's a deeper reason to care about these foundations. Mathematics is full of structure that is left implicit in traditional presentations — <html:em>invisible mathematics</html:em>, the gap between what mathematicians intuit and what formal systems capture. This tension goes back at least to Brouwer, whose intuitionism insisted that the constructive content of mathematical reasoning outruns any formalism. Every foundational program since has grappled with it. In the category theory community, the theme has taken on a specific character: Emily Riehl's <fr:link href="https://emilyriehl.github.io/files/invisible.pdf" type="external">Newton Institute talk</fr:link> on formalizing invisible mathematics describes how infinity-category theory is full of proofs written without reference to concrete definitions, relying on coherence data that everyone knows is there but nobody writes down. Lawvere's program of <html:em>objective logic</html:em> — formalized in his 1994 paper <fr:link href="https://lawverearchives.com/wp-content/uploads/2024/12/1994-tools-for-the-advancement-of-objective-logic-closed-categories-and-toposes.pdf" type="external">Tools for the Advancement of Objective Logic</fr:link>, rooted in Hegel's <html:em>Science of Logic</html:em> — frames category theory as the language for making this implicit structure explicit. Adjoint functors are Hegel's unity of opposites made precise. The nLab's <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/stuff,%20structure,%20property" type="external">stuff, structure, property</fr:link></html:span> framework, <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/negative%20thinking" type="external">negative thinking</fr:link></html:span>, and the shift from point-set topology to <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/locale" type="external">locale</fr:link></html:span> theory are all instances of the same impulse: formalizing what mathematicians intuit but don't say. Even traditional set theory pursues this — <fr:tex display="inline"><![CDATA[V = L]]></fr:tex> and large cardinal axioms search for the right mathematical universe from above, while topos theory searches for the shared foundational basis from below. Grothendieck universes sit at the intersection: inaccessible cardinals from the set-theoretic side, universe levels from the type-theoretic side, both addressing how large our mathematical universe can be. The graph view sketch in <fr:link href="/forest/forester-0005/" title="Rethinking Graph View for Math Notes" uri="https://kream.codeberg.page/forest/forester-0005/" display-uri="forester-0005" type="local">Rethinking Graph View for Math Notes</fr:link> is a proposed (not yet implemented) attempt to expose this invisible structure: the typed edges (<html:code>generalizes</html:code>, <html:code>dualizes</html:code>, <html:code>internalizes</html:code>) would formalize connections that every mathematician senses but few texts make explicit.</html:p>
                    <html:p>Diagrammatic and graphical reasoning push this further. As the <fr:link href="https://www.forester-notes.org/tfmt-000P/" type="external">manifesto notes</fr:link>, mathematical expressions and diagrams are <html:em>tightly coupled</html:em> — most diagrams contain math expressions involving notational macros, so any diagramming solution must be natively integrated with the math rendering system. This is why PGF/TikZ succeeds in LaTeX and why most web-based diagramming tools fall short. String diagrams for monoidal categories, proof nets for linear logic, pasting diagrams for higher categories — these are not just pretty pictures but rigorous formal systems where geometric intuition and algebraic precision coincide. I've been collecting examples in <fr:link href="/forest/tt-AVSP/" title="Diagrammatical/Graphical Approaches in Algebra, Category Theory, and Computation" uri="https://kream.codeberg.page/forest/tt-AVSP/" display-uri="tt-AVSP" type="local">Diagrammatical/Graphical Approaches in Algebra, Category Theory, and Computation</fr:link>. The ZX-calculus for quantum computing is a striking case: it's a diagrammatic language for quantum circuits that is sound and, for pure qubit quantum mechanics, complete — every equation between ZX-diagrams corresponds to a real equality between quantum processes, and every such equality over qubits can be derived diagrammatically. Working with ZX-diagrams guides intuition far better than the traditional Hilbert space formalism, while sacrificing nothing in rigor. Bob Coecke and Stefano Gogioso's <fr:link href="https://quantuminpictures.org/" type="external">Quantum in Pictures</fr:link> demonstrates this beautifully — teaching quantum theory to a general audience through diagrams alone, no Hilbert spaces required.</html:p>
                    <html:p>This points to a broader goal: we should be building frontends to proof assistants that make the proof process as painless and intuitive as manipulating diagrams, while preserving the full robustness of machine-checked reasoning underneath. The raw syntax of Agda or Lean is powerful but intimidating. Imagine instead an interface where you reason with diagrams, drag-and-drop constructions, or guided tactic suggestions — and the proof assistant verifies every step behind the scenes. The ZX-calculus already demonstrates this is possible for one domain. The challenge is generalizing it.</html:p>
                    <html:p>The connection to interactive education is direct. Type-theoretic foundations make mathematics executable. Category-theoretic organization makes it modular. Diagrammatic languages make it intuitive. Together they give you math that can teach itself: you state a type, the student fills in the term — or manipulates a diagram, or applies a rewrite rule — and the machine verifies. This is the loop that makes the Agda widget work, and it's not a coincidence that it's built on dependent type theory.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="Beyond mathematics">Beyond mathematics</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Everything I've described — atomic notes, transclusion, federation, typed links, interactive verification — was designed for mathematics. But the underlying ideas are not specific to mathematics. They're about how to structure, interlink, and verify knowledge. And knowledge doesn't stop at the borders of the math department.</html:p>
                    <html:p><html:strong>Natural sciences.</html:strong> Scientific knowledge has the same structural problems as mathematical knowledge: fragmentation across journals, linearity imposed by the paper format, passive consumption with no feedback loop. A biologist studying protein folding reads papers that cite definitions from chemistry, invoke results from statistical mechanics, and use computational methods from machine learning — but none of these cross-references are live links. They're parenthetical citations pointing to PDFs in other silos. A federated forest of scientific knowledge, where a chemistry tree can transclude a physics definition and a biology paper can link to both, would make the interdisciplinary structure of science <html:em>navigable</html:em> in a way that the current journal system cannot.</html:p>
                    <html:p>The interactivity story translates directly. Proof assistants verify mathematical proofs; computational notebooks (Jupyter, Observable) verify scientific computations. A tree about Bayesian inference could embed a live code block that lets the reader fit a model to data and see how the posterior changes with the prior — the same "state a type, fill in the term" loop, adapted from proofs to computations. Forester's macro system and transclusion model are agnostic about what the interactive blocks contain; the Agda widget is one instantiation, but a Python widget or an R widget would work the same way.</html:p>
                    <html:p><html:strong>Philosophy.</html:strong> This might seem like a stretch, but it isn't — especially for traditions that have embraced formalization. Alain Badiou's <html:em>Being and Event</html:em> develops an entire ontology grounded in Zermelo-Fraenkel set theory; his later work in <html:em>Logics of Worlds</html:em> moves to topos theory and sheaves. Badiou's philosophical arguments are literally mathematical proofs embedded in prose. A forester treatment of Badiou could transclude the set-theoretic definitions as formal trees, link them to the philosophical arguments that depend on them, and let the reader verify the mathematical content independently of the philosophical interpretation.</html:p>
                    <html:p>Lacan is a more provocative case. His use of topology (Borromean knots, the torus, cross-caps) and algebra (mathemes, the formulas of sexuation) has been dismissed by many mathematicians as pseudoscientific — Sokal and Bricmont's <html:em>Fashionable Nonsense</html:em> is the canonical indictment. But recent work has taken Lacan's mathematical structures seriously, not as metaphors but as genuine formal models. The Borromean knot, for instance, has a precise formalization in knot theory that captures the interdependence of the Real, Symbolic, and Imaginary in a way that prose description cannot. A forester forest could make these formalizations explicit: the knot-theoretic definition linked to the psychoanalytic interpretation, the algebraic structure of the mathemes formalized and type-checked, the topology of the torus of desire presented as an actual mathematical object rather than a hand-drawn diagram in a seminar transcript. The point is not to validate or debunk Lacan but to make the mathematical content precise enough to evaluate — to separate what is rigorous from what is rhetorical.</html:p>
                    <html:p>Hegel poses an even deeper challenge. The <html:em>Science of Logic</html:em> is, on one reading, an attempt to derive the categories of thought from pure negativity — a project that looks suspiciously like building up a type theory from the empty type. Lawvere made this connection precise with his categorical reading of Hegelian unity of opposites as adjunctions. More recently, work on "Hegelian categories" formalizes Aufhebung (sublation) as a specific categorical structure where a pair of adjoint functors mediates between levels of determination. This is the kind of content that <html:em>needs</html:em> forester's linking model: the Hegelian argument is a narrative, the categorical formalization is a precise structure, and the two should be interlinked — the reader should be able to follow the philosophical argument and click through to the mathematical formalization at each step, or vice versa.</html:p>
                    <html:p>The broader point: any discipline where ideas build on each other, where definitions matter, where the same concept appears in multiple contexts with different interpretations — that discipline benefits from atomic notes, transclusion, and typed links. Mathematics is the proving ground because the formal structure is most explicit there. But the tools generalize.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="What's missing and what's coming">What's missing and what's coming</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>I don't want to oversell what exists. The pieces are real, but they're early-stage, and significant work remains.</html:p>
                    <html:p>Forester's federation is experimental. Cross-forest transclusion currently works via static JSON blobs — there's no live remote transclusion, no real-time collaboration, no forking or merging of forests. Forester's XSLT-based rendering model is on borrowed time — browser vendors are removing XSLT support from the web platform (Chrome drops it in November 2026), which means the entire output pipeline needs to move to direct HTML emission.</html:p>
                    <html:p>The Agda widget lacks interaction mode: you can type-check code, but you can't ask the system for goals, do case splitting, or use auto-fill — the features that make Agda productive for working mathematicians. Adding these would transform the widget from a verification tool to a genuine interactive proof environment.</html:p>
                    <html:p>Graph view is actively being developed. <fr:link href="/forest/forester-0005/" title="Rethinking Graph View for Math Notes" uri="https://kream.codeberg.page/forest/forester-0005/" display-uri="forester-0005" type="local">Rethinking Graph View for Math Notes</fr:link> lays out both the critique (traditional graph view as 0-truncation) and a proposed solution: a 2-category of mathematical concepts with typed edges, ambient layers, and functorial correspondences between hierarchies. The theoretical framework is in place — what remains is the implementation: an interactive rendering engine that turns this categorical structure into a navigable visualization at scale.</html:p>
                    <html:p>There's no access control, no collaborative editing model, and no standard for how federated forests should handle conflicting definitions or notation. These are hard problems, and pretending they're solved would be dishonest.</html:p>
                    <html:p>And there's a deeper problem that even Forester's creator is honest about. In a recent piece titled <fr:link href="https://www.forester-notes.org/QHXS/" type="external">Intellectual Junkyards</fr:link>, Sterling describes how evergreen forests can die: you spend a year building up category theory, then realize you want to switch to univalent foundations, the refactoring is too painful, motivation dies, and the forest becomes a junkyard. His conclusion is striking: "mathematics and the sciences are also rapidly moving targets, and if your outlook on them slows its roll long enough for it to become practical to keep a sizable forest evergreen, it may indicate intellectual stagnation more than intellectual wealth." His proposed solution? Federation itself — split off independent "hyperbooks" as separate forests that can be federated with your main one, and don't be afraid of a little "forest fire" when the weight of accumulated ontology becomes crushing. This is not a limitation of Forester so much as an honest reckoning with the nature of knowledge production.</html:p>
                    <html:p>But all of this is open source and actively developed. Forester itself, the Agda widget, the HoTT Game exercises — all of it is publicly available and welcomes contributions.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:title text="A new picture">A new picture</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>So here's the vision, stated plainly.</html:p>
                    <html:p>Federated forests of mathematical knowledge, each independently curated, all interlinked. Not one platform that everyone must join, but many — each maintained by the people who know the material best, connected by a protocol that handles transclusion and attribution automatically. Everything references everything else, but no one controls the whole.</html:p>
                    <html:p>This changes the social structure of mathematics, not just the technical one. No single institution gatekeeps what counts as a valid treatment of a subject. Researchers and students on different continents build on each other's work without coordination, without asking permission — because the protocol handles it. Knowledge becomes a commons, not a hierarchy. The authority of a definition comes from its usefulness and rigor, not from the prestige of the institution that hosts it.</html:p>
                    <html:p>Interactive proofs embedded in every page. Not just reading math but doing it. A definition of a group comes with an exercise: prove that the inverse is unique. A discussion of the fundamental group comes with a quest: construct the loop space. You don't move on until the proof assistant accepts your answer.</html:p>
                    <html:p>Gamified learning paths that build intuition through carefully designed challenges. A CTF for category theory. A puzzle game for homotopy type theory. Progressive difficulty, immediate feedback, and the satisfaction of a green checkmark when your proof compiles.</html:p>
                    <html:p>A foundation in type theory that makes all of this verifiable and computational. Not replacing classical mathematics — supplementing it with a language that machines can check, humans can execute, and education can exploit.</html:p>
                    <html:p>This isn't a fantasy. The pieces exist today: forester provides the infrastructure, the Agda widget provides the interactivity, federation provides the social model. They just need to be assembled — and refined, and extended, and stress-tested by actual mathematicians and students.</html:p>
                    <html:p>If this interests you: build a forest. Write a tree. Contribute an exercise. The tools are ready. The community is small but growing. And the potential — for how we learn, teach, and do mathematics — is enormous.</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>22</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/blog-0003/</fr:uri>
                <fr:display-uri>blog-0003</fr:display-uri>
                <fr:route>/forest/blog-0003/</fr:route>
                <fr:title text="Rumor of Birds and Lawvere's Fixed Point Theorem">Rumor of Birds and Lawvere's Fixed Point Theorem</fr:title>
                <fr:meta name="draft">true</fr:meta>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Raymond Smullyan's To Mock a Mocking Bird is a classic logic puzzle book that introduces combinators in Combinatory Logic as birds.</html:p>
                <html:p>The first exercise given was on the famous diagonalization proof, which in the context of the book is framed as proving the validity of a rumor about some birds in a forest with some given properties.</html:p>
                <html:p>The problem is short and can be presented here in its entirety; this is a great opportunity to observe all the relevant structures that give rise to an instance of <fr:link href="/forest/cat-0004/" title="Lawvere's fixed point theorem" uri="https://kream.codeberg.page/forest/cat-0004/" display-uri="cat-0004" type="local">Lawvere's fixed point theorem</fr:link>.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>22</fr:day>
                    </fr:date>
                    <fr:title text="To Mock a Mockingbird">To Mock a Mockingbird</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>
                      <html:em>The following passage is taken from the book with only formatting changes.</html:em>
                    </html:p>
                    <html:p>A certain enchanted forest is inhabited by talking birds. Given any birds <fr:tex display="inline"><![CDATA[A]]></fr:tex> and <fr:tex display="inline"><![CDATA[B]]></fr:tex>, if you call out the name of <fr:tex display="inline"><![CDATA[B]]></fr:tex> to <fr:tex display="inline"><![CDATA[A]]></fr:tex>, then <fr:tex display="inline"><![CDATA[A]]></fr:tex> will respond by calling out the name of some bird to you; this bird we designate by <fr:tex display="inline"><![CDATA[AB]]></fr:tex>.</html:p>
                    <html:p>Thus <fr:tex display="inline"><![CDATA[AB]]></fr:tex> is the bird named by <fr:tex display="inline"><![CDATA[A]]></fr:tex> upon hearing the name of <fr:tex display="inline"><![CDATA[B]]></fr:tex>. Instead of constantly using the cumbersome phrase "<fr:tex display="inline"><![CDATA[A]]></fr:tex>'s response to hearing the name of <fr:tex display="inline"><![CDATA[B]]></fr:tex>," we shall more simply say: "<fr:tex display="inline"><![CDATA[A]]></fr:tex>'s response to <fr:tex display="inline"><![CDATA[B]]></fr:tex>."</html:p>
                    <html:p>Thus <fr:tex display="inline"><![CDATA[AB]]></fr:tex> is <fr:tex display="inline"><![CDATA[A]]></fr:tex>'s response to <fr:tex display="inline"><![CDATA[B]]></fr:tex>. In general, <fr:tex display="inline"><![CDATA[A]]></fr:tex>'s response to <fr:tex display="inline"><![CDATA[B]]></fr:tex> is not necessarily the same as <fr:tex display="inline"><![CDATA[B]]></fr:tex>'s response to <fr:tex display="inline"><![CDATA[A]]></fr:tex>—in symbols, <fr:tex display="inline"><![CDATA[AB]]></fr:tex> is not necessarily the same bird as <fr:tex display="inline"><![CDATA[BA]]></fr:tex>. Also, given three birds <fr:tex display="inline"><![CDATA[A]]></fr:tex>, <fr:tex display="inline"><![CDATA[B]]></fr:tex>, and <fr:tex display="inline"><![CDATA[C]]></fr:tex>, the bird <fr:tex display="inline"><![CDATA[A(BC)]]></fr:tex> is not necessarily the same as the bird <fr:tex display="inline"><![CDATA[(AB)C]]></fr:tex>. The bird <fr:tex display="inline"><![CDATA[A(BC)]]></fr:tex> is <fr:tex display="inline"><![CDATA[A]]></fr:tex>'s response to the bird <fr:tex display="inline"><![CDATA[BC]]></fr:tex>, whereas the bird <fr:tex display="inline"><![CDATA[(AB)C]]></fr:tex> is the response of the bird <fr:tex display="inline"><![CDATA[AB]]></fr:tex> to the bird <fr:tex display="inline"><![CDATA[C]]></fr:tex>. The use of parentheses is thus necessary to avoid ambiguity; if I just wrote <fr:tex display="inline"><![CDATA[ABC]]></fr:tex>, you could not possibly know whether I meant the bird <fr:tex display="inline"><![CDATA[A(BC)]]></fr:tex> or the bird <fr:tex display="inline"><![CDATA[(AB)C]]></fr:tex>.</html:p>
                    <html:p><html:em>Mockingbirds</html:em>: By a mockingbird is meant a bird <fr:tex display="inline"><![CDATA[M]]></fr:tex> such that for any bird <fr:tex display="inline"><![CDATA[x]]></fr:tex>, the following condition holds: </html:p>
                    <fr:tex display="block"><![CDATA[Mx = xx]]></fr:tex>
                    <html:p><fr:tex display="inline"><![CDATA[M]]></fr:tex> is called a mockingbird for the simple reason that its response to any bird <fr:tex display="inline"><![CDATA[x]]></fr:tex> is the same as <fr:tex display="inline"><![CDATA[x]]></fr:tex>'s response to itself—in other words, <fr:tex display="inline"><![CDATA[M]]></fr:tex> mimics <fr:tex display="inline"><![CDATA[x]]></fr:tex> as far as its response to <fr:tex display="inline"><![CDATA[x]]></fr:tex> goes. This means that if you call out <fr:tex display="inline"><![CDATA[x]]></fr:tex> to <fr:tex display="inline"><![CDATA[M]]></fr:tex> or if you call out <fr:tex display="inline"><![CDATA[x]]></fr:tex> to itself, you will get the same response in either case.</html:p>
                    <html:p>Composition: The last technical detail before the fun starts is this: Given any birds <fr:tex display="inline"><![CDATA[A]]></fr:tex>, <fr:tex display="inline"><![CDATA[B]]></fr:tex>, and <fr:tex display="inline"><![CDATA[C]]></fr:tex> (not necessarily distinct) the bird <fr:tex display="inline"><![CDATA[C]]></fr:tex> is said to compose <fr:tex display="inline"><![CDATA[A]]></fr:tex> with <fr:tex display="inline"><![CDATA[B]]></fr:tex> if for every bird <fr:tex display="inline"><![CDATA[x]]></fr:tex> the following condition holds:</html:p>
                    <fr:tex display="block"><![CDATA[C x = A(B x)]]></fr:tex>
                    <html:p>In words, this means that <fr:tex display="inline"><![CDATA[C]]></fr:tex>'s response to <fr:tex display="inline"><![CDATA[x]]></fr:tex> is the same as <fr:tex display="inline"><![CDATA[A]]></fr:tex>'s response to <fr:tex display="inline"><![CDATA[B]]></fr:tex>'s response to <fr:tex display="inline"><![CDATA[x]]></fr:tex>.</html:p>
                    <html:p>It could happen that if you call out <fr:tex display="inline"><![CDATA[B]]></fr:tex> to <fr:tex display="inline"><![CDATA[A]]></fr:tex>, <fr:tex display="inline"><![CDATA[A]]></fr:tex> might call the same bird <fr:tex display="inline"><![CDATA[B]]></fr:tex> back to you. If this happens, it indicates that <fr:tex display="inline"><![CDATA[A]]></fr:tex> is fond of the bird <fr:tex display="inline"><![CDATA[B]]></fr:tex>. In symbols, <fr:tex display="inline"><![CDATA[A]]></fr:tex> is fond of <fr:tex display="inline"><![CDATA[B]]></fr:tex> means that <fr:tex display="inline"><![CDATA[AB = B]]></fr:tex>.</html:p>
                    <html:p>We are now given that the forest satisfies the following two conditions. </html:p>
                    <html:ul><html:li>C1 (the composition condition): For any two birds <fr:tex display="inline"><![CDATA[A]]></fr:tex> and <fr:tex display="inline"><![CDATA[B]]></fr:tex> (whether the same or different) there is a bird <fr:tex display="inline"><![CDATA[C]]></fr:tex> such that for any bird <fr:tex display="inline"><![CDATA[x]]></fr:tex>, <fr:tex display="inline"><![CDATA[Cx = A(Bx)]]></fr:tex>. In other words, for any birds <fr:tex display="inline"><![CDATA[A]]></fr:tex> and <fr:tex display="inline"><![CDATA[B]]></fr:tex> there is a bird <fr:tex display="inline"><![CDATA[C]]></fr:tex> that composes <fr:tex display="inline"><![CDATA[A]]></fr:tex> with <fr:tex display="inline"><![CDATA[B]]></fr:tex>. </html:li>
    <html:li>C2 (the mockingbird condition): The forest contains a mockingbird <fr:tex display="inline"><![CDATA[M]]></fr:tex>. </html:li></html:ul>
                    <html:p>One rumor has it that every bird of the forest is fond of at least one bird. Another rumor has it that there is at least one bird that is not fond of any bird. The interesting thing is that it is possible to settle the matter completely by virtue of the given conditions C1 and C2. Which of the two rumors is correct?</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <html:p />
                <html:p>Mockingbirds are interesting creatures as they allow for <html:em>self-application</html:em>. This is possible since birds behave like higher order functions. Mockingbirds are powerful and useful, however they do introduce some problems. A hint of this is the fact that it is impossible to type a Mockingbird in most type systems that we use for everyday programming.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>22</fr:day>
                    </fr:date>
                    <fr:title text="Categorial Presentation">Categorial Presentation</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>As abstract nonsense enthusiasts, we </html:p>
                    <html:p>One caveat of this example is that, since we only have birds, we are confined to only 1 type. Combinatory Logic and <fr:link href="/forest/tt-000a/" title="Lambda calculus" uri="https://kream.codeberg.page/forest/tt-000a/" display-uri="tt-000a" type="local">Untyped Lambda Calculus</fr:link> are equivalent(via <fr:link href="/forest/tt-AVRM/" title="Abstraction Elimination" uri="https://kream.codeberg.page/forest/tt-AVRM/" display-uri="tt-AVRM" type="local">Abstraction Elimination</fr:link>) just as they both have only 1 type. 
  In categorical logic, the corresponding category/object is the <fr:link href="/forest/cat-000G/" title="C-monoid" uri="https://kream.codeberg.page/forest/cat-000G/" display-uri="cat-000G" type="local">C-monoid</fr:link>.
  </html:p>
                    <html:p>We can try generalizing this </html:p>
                    <html:p>Now, we are finally ready for the Theorem.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/cat-0004/</fr:uri>
                    <fr:display-uri>cat-0004</fr:display-uri>
                    <fr:route>/forest/cat-0004/</fr:route>
                    <fr:title text="Lawvere's fixed point theorem">Lawvere's fixed point theorem</fr:title>
                    <fr:taxon>theorem</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>For any cartesian closed category, provided object <fr:tex display="inline"><![CDATA[A]]></fr:tex> and exponential object <fr:tex display="inline"><![CDATA[B^A]]></fr:tex> for some object <fr:tex display="inline"><![CDATA[B]]></fr:tex> in this category, if there is a suitable notion of surjectivity for:</html:p>
                    <fr:tex display="block"><![CDATA[\phi  \colon  A \longrightarrow  B^A]]></fr:tex>
                    <html:p>Then every endomorphism <fr:tex display="inline"><![CDATA[f \colon  B \rightarrow  B]]></fr:tex> of <fr:tex display="inline"><![CDATA[B]]></fr:tex> has a <html:strong>fixed point</html:strong>(<fr:tex display="inline"><![CDATA[\exists  s \colon  1 \rightarrow  B]]></fr:tex>, s.t. <fr:tex display="inline"><![CDATA[f s = s]]></fr:tex>).</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>20</fr:day>
                        </fr:date>
                        <fr:uri>https://kream.codeberg.page/forest/cat-1RDZ/</fr:uri>
                        <fr:display-uri>cat-1RDZ</fr:display-uri>
                        <fr:route>/forest/cat-1RDZ/</fr:route>
                        <fr:title text="Proof for point-surjective map">Proof for point-surjective map</fr:title>
                        <fr:taxon>proof</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>First define a notion of point-surjectivity:</html:p>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>2</fr:month>
                              <fr:day>20</fr:day>
                            </fr:date>
                            <fr:uri>https://kream.codeberg.page/forest/cat-C70S/</fr:uri>
                            <fr:display-uri>cat-C70S</fr:display-uri>
                            <fr:route>/forest/cat-C70S/</fr:route>
                            <fr:title text="Point-surjective Morphism">Point-surjective Morphism</fr:title>
                            <fr:taxon>definition</fr:taxon>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>A map <fr:tex display="inline"><![CDATA[f\colon  X \rightarrow  Y]]></fr:tex> is <html:strong>point-surjective</html:strong> if for every point/global element <fr:tex display="inline"><![CDATA[q \colon  1 \rightarrow  Y]]></fr:tex>, there exists <fr:tex display="inline"><![CDATA[p \colon  1 \rightarrow  X]]></fr:tex> that lifts <fr:tex display="inline"><![CDATA[q]]></fr:tex>, such that <fr:tex display="inline"><![CDATA[f p = q]]></fr:tex>.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <html:p>Given <fr:tex display="inline"><![CDATA[f \colon  B \rightarrow  B]]></fr:tex>, let <fr:tex display="inline"><![CDATA[q\colon  1 \rightarrow  B^A]]></fr:tex> name the composite map of:</html:p>
                        <fr:tex display="block"><![CDATA[A \stackrel {\delta }{\rightarrow } A \times  A \stackrel {\phi  \times  1_A}{\rightarrow } B^A \times  A \stackrel {eval}{\rightarrow } B \stackrel {f}{\rightarrow } B]]></fr:tex>
                        <html:p>from <fr:tex display="inline"><![CDATA[A]]></fr:tex> to <fr:tex display="inline"><![CDATA[B]]></fr:tex>.</html:p>
                        <html:p>Since the setting is cartesian closed, we can use the notation from <fr:link href="/forest/tt-AVSR/" title="Compiling To Categories" uri="https://kream.codeberg.page/forest/tt-AVSR/" display-uri="tt-AVSR" type="local">Compiling to Categories</fr:link>:</html:p>
                        <fr:tex display="block"><![CDATA[q = \lambda  a . f \circ  apply ((\phi  \circ  exl) \Delta  (id \circ  exr)) \circ  \delta  (a)]]></fr:tex>
                        <html:p>Translating to <fr:link href="/forest/tt-000a/" title="Lambda calculus" uri="https://kream.codeberg.page/forest/tt-000a/" display-uri="tt-000a" type="local">Lambda calculus</fr:link> notation, <fr:tex display="inline"><![CDATA[q = \lambda  a \colon  A . f ((\phi  a) a)]]></fr:tex>, which reads the evaluation map as application of lambda terms.</html:p>
                        <html:p>Let <fr:tex display="inline"><![CDATA[p \colon  1 \rightarrow  A]]></fr:tex> lift <fr:tex display="inline"><![CDATA[q]]></fr:tex>. Calculate:</html:p>
                        <fr:tex display="block"><![CDATA[(\phi  p) p = q p = (\lambda  a . f ((\phi  a) a)) p = f ((\phi  p) p)]]></fr:tex>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>2</fr:month>
                              <fr:day>20</fr:day>
                            </fr:date>
                            <fr:title text="Agda Code">Agda Code</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
  <html:pre class="agda-code"><![CDATA[{-# OPTIONS --without-K --safe #-}
open import Level
open import Data.Product.Base using (Σ; _,_; proj₁; proj₂; module Σ)
open import Function.Base using (_∘_; id)
open import Relation.Binary.PropositionalEquality
  using (_≡_; refl; sym; subst; cong; cong-app; module ≡-Reasoning)]]></html:pre>

  <html:pre class="agda-code"><![CDATA[module LawvereTheorem where
  surjective : {A B : Set} → (A → B) → Set
  surjective {A} {B} f = (b : B) → Σ A (λ a → f a ≡ b)

  fixedPoint : {A : Set} → (A → A) → Set
  fixedPoint {A} f = Σ A (λ a → f a ≡ a)
  lawvere : {A B : Set}
          → (ϕ : A → (A → B)) 
          → surjective ϕ       
          → (f : B → B)        
          → fixedPoint f       
  lawvere {A} {B} ϕ surj f = (ϕ p p , sym proof)
    where
      q : A → B
      q = λ a → f (ϕ a a)
      
      p : A
      p = Σ.proj₁ (surj q)
      
      open ≡-Reasoning
      proof : ϕ p p ≡ f (ϕ p p)
      proof =
        begin
          ϕ p p
        ≡⟨ cong-app (Σ.proj₂ (surj q)) p ⟩
          q p
        ≡⟨ refl ⟩
          (λ a → f (ϕ a a)) p
        ≡⟨ refl ⟩
          f (ϕ p p)
        ∎]]></html:pre>
</fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>20</fr:day>
                        </fr:date>
                        <fr:title text="Planned Links">Planned Links</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:ul><html:li>nLab source</html:li>
    <html:li>Cartesian Closed Category</html:li>
    <html:li>Fixed points</html:li>
    <html:li><fr:link href="/forest/tt-AVT8/" title="Russell's Paradox" uri="https://kream.codeberg.page/forest/tt-AVT8/" display-uri="tt-AVT8" type="local">Russell's Paradox</fr:link></html:li>
    <html:li>endomorphism</html:li>
    <html:li>Substructual fixed points</html:li>
    <html:li>Proof in topos</html:li></html:ul>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <html:p>For other interesting appearances of birds, check out <fr:link href="/forest/tt-AVRK/" title="Birds in Logic" uri="https://kream.codeberg.page/forest/tt-AVRK/" display-uri="tt-AVRK" type="local">Birds in Logic</fr:link>.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>22</fr:day>
                    </fr:date>
                    <fr:title text="planned links">planned links</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:ul><html:li>Link to To Mock a Mocking Bird book</html:li>
    <html:li>Link to Combinatory Logic</html:li>
    <html:li>Link to Birds in Logic</html:li>
    <html:li>Link to Cartesian Closed Categories</html:li>
    <html:li /></html:ul>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>17</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/blog-0002/</fr:uri>
                <fr:display-uri>blog-0002</fr:display-uri>
                <fr:route>/forest/blog-0002/</fr:route>
                <fr:title text="Building goltorus: Game of Life on a ray-marched torus">Building goltorus: Game of Life on a ray-marched torus</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>This post walks through building <html:code>goltorus.glsl</html:code> — a fragment shader that runs Conway's Game of Life on the surface of a ray-marched torus — in six incremental steps. Each step adds one major concept, and every canvas below is a live shader you can interact with.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="How to interact with the shaders">How to interact with the shaders</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Each shader canvas starts paused behind a dark overlay. Click the <html:strong>play</html:strong> button (or tap on mobile) to start it. Once running, a <html:strong>×</html:strong> close button appears in the top-right corner. On desktop, the shader also stops automatically when your cursor leaves the canvas area. On mobile, tap the close button to stop.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="Why a torus?">Why a torus?</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Conway's Game of Life is usually run on a finite grid with edges that wrap: a glider exiting the right side re-enters on the left, and one exiting the top re-enters at the bottom. This wrapping is implemented with <html:code>mod</html:code> — but it has a precise topological meaning.</html:p>
                    <html:p>Identifying the left and right edges of a rectangle (without twisting) produces a cylinder. Identifying the remaining top and bottom edges then closes it into a <fr:link href="/forest/top-0001/" title="Torus" uri="https://kream.codeberg.page/forest/top-0001/" display-uri="top-0001" type="local">torus</fr:link>. Formally, the flat torus is the quotient of the plane by the integer lattice:</html:p>
                    <fr:tex display="block"><![CDATA[
    T^2 \;\cong \; \mathbb {R}^2 / \mathbb {Z}^2 \;\cong \; S^1 \times  S^1
  ]]></fr:tex>
                    <html:p>So every toroidally-wrapping Game of Life grid is <html:em>already</html:em> living on a torus — the cells just happen to be drawn flat. This project makes that implicit topology explicit: we render the GoL state on the surface of an actual torus, so the visual matches the mathematics.</html:p>
                    <html:p>(Compare: if you <html:em>twist</html:em> one pair of edges before identifying, you get a Möbius strip or Klein bottle instead. The standard <html:code>mod</html:code> wrapping applies no twist, so the resulting surface is genuinely a torus.)</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="What you will need">What you will need</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>This post assumes no prior experience with shader programming. Here is the minimum vocabulary:</html:p>
                    <html:ul><html:li>A <html:em>GLSL fragment shader</html:em> is a small program that runs on the GPU, once per pixel, every frame. It receives the pixel's screen coordinates and outputs a colour. All the visuals in this post are fragment shaders.</html:li>
    <html:li>A <html:em>signed distance function</html:em> (<fr:link href="/forest/gfx-0001/" title="Signed distance function" uri="https://kream.codeberg.page/forest/gfx-0001/" display-uri="gfx-0001" type="local">Signed distance function</fr:link>) is a function that takes a point in 3D space and returns how far that point is from the nearest surface — negative if inside, positive if outside.</html:li>
    <html:li><html:em>Ray marching</html:em> (<fr:link href="/forest/gfx-0002/" title="Ray marching (sphere tracing)" uri="https://kream.codeberg.page/forest/gfx-0002/" display-uri="gfx-0002" type="local">Ray marching (sphere tracing)</fr:link>) is a rendering technique that finds where a camera ray hits a surface by stepping along the ray, using the SDF value as a safe step size.</html:li></html:ul>
                    <html:p>By the end, you will have built a shader that casts rays from a virtual camera, finds a torus surface via sphere tracing, maps 2D cellular automaton state onto it via UV coordinates, and lights the result with Phong shading — all in a single fragment shader running in your browser.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="Step 1: Ray-marching a sphere">Step 1: Ray-marching a sphere</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>We start with the simplest possible ray marcher: a white sphere floating in black space. The shader sets up a virtual camera, casts a ray for each pixel, and marches along it using the <fr:link href="/forest/gfx-0002/" title="Ray marching (sphere tracing)" uri="https://kream.codeberg.page/forest/gfx-0002/" display-uri="gfx-0002" type="local">sphere-tracing algorithm</fr:link>.</html:p>
                    <html:p>The scene contains a single <fr:link href="/forest/gfx-0001/" title="Signed distance function" uri="https://kream.codeberg.page/forest/gfx-0001/" display-uri="gfx-0001" type="local">Signed distance function</fr:link>: a sphere of radius 1 centred at the origin. The camera sits at <fr:tex display="inline"><![CDATA[z = 3]]></fr:tex>, looking down the <fr:tex display="inline"><![CDATA[-z]]></fr:tex> axis:</html:p>
                    <html:pre><![CDATA[float sdSphere(vec3 p, float r) {
    return length(p) - r;
}

float rayMarch(vec3 ro, vec3 rd) {
    float t = 0.0;
    for (int i = 0; i < MAX_STEPS; i++) {
        vec3 p = ro + rd * t;
        float d = getDist(p);
        t += d;
        if (t > MAX_DIST || abs(d) < SURF_DIST) break;
    }
    return t;
}]]></html:pre>
                    <html:p>If the ray reaches a surface (<fr:tex display="inline"><![CDATA[d < d_{\max }]]></fr:tex>), the pixel is white. Otherwise, black.</html:p>
                    <html:canvas class="glslCanvas" width="640" height="640" data-fragment-url="/forest/bafkrmiduuv6vy2hxjzdeb5fdkpq2fit6wfaj7fcnobjiqecini4sjy5clu.frag">Loading shader...</html:canvas>
                    <html:p>Move your cursor over the diagram below to explore the ray marching process. The <html:strong>blue dot</html:strong> is the camera (ray origin). The <html:strong>red arrow</html:strong> is the ray cast from the camera toward the cursor position. The <html:strong>green arrow</html:strong> is the SDF value at the cursor — it points toward the nearest surface and its length is the safe step distance. When the cursor is inside the sphere, the green arrow points outward to the surface.</html:p>
                    <html:canvas class="glslCanvas" width="640" height="640" data-fragment-url="/forest/bafkrmidjyvnpfddlbyhfu7g6rxzr77chudsg6xjya5drk27kyk4lmqnoay.frag">Loading shader...</html:canvas>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="Step 2: Replacing the sphere with a torus">Step 2: Replacing the sphere with a torus</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Now we swap the sphere SDF for a <fr:link href="/forest/gfx-0003/" title="Torus SDF" uri="https://kream.codeberg.page/forest/gfx-0003/" display-uri="gfx-0003" type="local">Torus SDF</fr:link> and add rotation. The torus sits in the <fr:tex display="inline"><![CDATA[xz]]></fr:tex>-plane with major radius <fr:tex display="inline"><![CDATA[R = 1]]></fr:tex> and minor radius <fr:tex display="inline"><![CDATA[r = 0.4]]></fr:tex>:</html:p>
                    <html:pre><![CDATA[float sdTorus(vec3 p, vec2 t) {
    vec2 q = vec2(length(p.xz) - t.x, p.y);
    return length(q) - t.y;
}]]></html:pre>
                    <html:p>To make it visually interesting, we apply a time-dependent rotation <html:em>to the scene</html:em> — rotating the point before evaluating the SDF. This is equivalent to rotating the camera in the opposite direction:</html:p>
                    <html:pre><![CDATA[float getDist(vec3 p) {
    p = rotateX(u_time * 0.5)
      * rotateY(u_time * 0.3) * p;
    return sdTorus(p, vec2(1.0, 0.4));
}]]></html:pre>
                    <html:canvas class="glslCanvas" width="640" height="640" data-fragment-url="/forest/bafkrmihu5iui76ea6qo7eh7wl5hl3gm43qsbmnpr2veil332rgdfmdifke.frag">Loading shader...</html:canvas>
                    <html:p>The same visualisation applied to the torus cross-section. The torus appears as two circles — the tube sliced through the <fr:tex display="inline"><![CDATA[xz]]></fr:tex>-plane. The green arrow always points to the nearest of the two tube walls.</html:p>
                    <html:canvas class="glslCanvas" width="640" height="640" data-fragment-url="/forest/bafkrmichbdxilo5q6yop5a65zwv2om3b4jymjcljxzdq6vys7kiah7d4vy.frag">Loading shader...</html:canvas>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="Step 3: Adding lighting">Step 3: Adding lighting</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>A white silhouette is hard to read. We add Phong-style lighting: diffuse illumination from a point light at <fr:tex display="inline"><![CDATA[(2, 3, 2)]]></fr:tex> plus a specular highlight.</html:p>
                    <html:p>First we need surface normals. Since we don't have an analytic gradient, we estimate it with <fr:link href="/forest/gfx-0004/" title="SDF surface normals via finite differences" uri="https://kream.codeberg.page/forest/gfx-0004/" display-uri="gfx-0004" type="local">SDF surface normals via finite differences</fr:link> — evaluating the SDF at three nearby points:</html:p>
                    <html:pre><![CDATA[vec3 getNormal(vec3 p) {
    float d = getDist(p);
    vec2 e = vec2(0.0001, 0.0);
    vec3 n = d - vec3(
        getDist(p - e.xyy),
        getDist(p - e.yxy),
        getDist(p - e.yyx)
    );
    return normalize(n);
}]]></html:pre>
                    <html:p>The diffuse term is <fr:tex display="inline"><![CDATA[\max (\hat {n} \cdot  \hat {l},\; 0)]]></fr:tex>, and the specular term is <fr:tex display="inline"><![CDATA[\max (\hat {r} \cdot  \hat {v},\; 0)^{32}]]></fr:tex> — a tight Phong highlight.</html:p>
                    <html:canvas class="glslCanvas" width="640" height="640" data-fragment-url="/forest/bafkrmihlbysx54rpzewrs6rzfp22wu7d3gnrnhw3ympwbrnlmdg2ywypka.frag">Loading shader...</html:canvas>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="Step 4: Surface parameterisation (UV mapping)">Step 4: Surface parameterisation (UV mapping)</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>To paint anything on the torus, we need a map from 3D surface points to 2D texture coordinates. A torus is naturally parameterised by two angles: the <html:em>major angle</html:em> <fr:tex display="inline"><![CDATA[\theta ]]></fr:tex> (around the central axis) and the <html:em>minor angle</html:em> <fr:tex display="inline"><![CDATA[\phi ]]></fr:tex> (around the tube cross-section).</html:p>
                    <html:p>The <html:code>interval(y, x)</html:code> helper normalises <html:code>atan2</html:code> to the half-open unit interval, handling the branch cut cleanly. The <html:code>wrapmap</html:code> function uses it to extract both angles from a surface point:</html:p>
                    <html:pre><![CDATA[float interval(float y, float x) {
    vec2 n = normalize(vec2(x, -y));
    return float(n.y < 0.0)
         + atan(n.y, n.x) / 2.0 / PI;
}

vec2 wrapmap(vec3 p) {
    float radius = 1.0;
    float minorx = -dot(
        p.xz - radius * normalize(p.xz),
        normalize(p.xz));
    return vec2(
        mod(interval(p.z, p.x) - 0.25, 1.0),
        interval(p.y, minorx)
    );
}]]></html:pre>
                    <html:p>Here we colour the torus by its UV coordinates — red for <fr:tex display="inline"><![CDATA[\theta ]]></fr:tex>, green for <fr:tex display="inline"><![CDATA[\phi ]]></fr:tex> — to verify the parameterisation before using it for anything more complex.</html:p>
                    <html:canvas class="glslCanvas" width="640" height="640" data-fragment-url="/forest/bafkrmifqfk6ubhcbqg7usdmwjgfip2btggxrhf2h2yjkdeo2254rulppym.frag">Loading shader...</html:canvas>
                    <html:p>Move your cursor over the diagram below to explore the two angles. The <html:strong>left panel</html:strong> shows the torus from above: the <html:strong>red arc</html:strong> is <fr:tex display="inline"><![CDATA[\theta ]]></fr:tex>, the major angle sweeping around the central axis. The <html:strong>right panel</html:strong> shows a cross-section of the tube: the <html:strong>green arc</html:strong> is <fr:tex display="inline"><![CDATA[\phi ]]></fr:tex>, the minor angle wrapping around the tube. Mouse position controls both angles — horizontal for <fr:tex display="inline"><![CDATA[\theta ]]></fr:tex>, vertical for <fr:tex display="inline"><![CDATA[\phi ]]></fr:tex>.</html:p>
                    <html:canvas class="glslCanvas" width="640" height="640" data-fragment-url="/forest/bafkrmidgkktxe53lcqe4qtyzrxqpeetegrlmjc5tefky7okincd2ugrzbm.frag">Loading shader...</html:canvas>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="Step 5: 2D Game of Life">Step 5: 2D Game of Life</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Before mapping it onto a torus, we implement a standalone Conway's Game of Life. Each cell is an <fr:tex display="inline"><![CDATA[8 \times  8]]></fr:tex> pixel block. The state is stored in a <html:em>backbuffer</html:em> — glslCanvas provides <html:code>u_buffer0</html:code>, a texture containing the previous frame's output.</html:p>
                    <html:p>The shader has two compilation passes. When <html:code>BUFFER_0</html:code> is defined, it computes the next GoL generation by summing the eight Moore neighbours:</html:p>
                    <html:pre><![CDATA[float sum =
    get(e.xx, sc) + get(e.xy, sc) + get(e.xz, sc) +
    get(e.yx, sc) +                  get(e.yz, sc) +
    get(e.zx, sc) + get(e.zy, sc) + get(e.zz, sc);

float next = float(sum == 3.0
    || (sum == 2.0 && alive > 0.5));]]></html:pre>
                    <html:p>The grid wraps toroidally via <html:code>mod</html:code>, so gliders that exit one edge re-enter on the opposite side. Hover over the canvas to seed new cells.</html:p>
                    <html:canvas class="glslCanvas" width="640" height="640" data-fragment-url="/forest/bafkrmiatam6jip2i3mkqberu4fw26fgt2pow5rowbwnxdbblsfsbimcnr4.frag">Loading shader...</html:canvas>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="Step 6: Putting it all together">Step 6: Putting it all together</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>The final shader splits the viewport in two. The bottom half runs the Game of Life; the top half ray-marches a rotating torus whose surface colour is sampled from the GoL grid via <html:code>wrapmap</html:code>.</html:p>
                    <html:p>In the buffer pass, GoL state is computed for the bottom half of the framebuffer. In the display pass, <html:code>sampleGoL</html:code> maps each surface point through the wrapmap to a cell coordinate, reading alive/dead from the buffer:</html:p>
                    <html:pre><![CDATA[float sampleGoL(vec3 p) {
    vec2 uv = wrapmap(p);
    vec2 screenCoord = uv * u_resolution;
    vec2 cellCoord = getCellCoord(screenCoord);
    vec2 samplePos = getScreenCoord(cellCoord);
    return texture2D(u_buffer0,
                     samplePos / u_resolution).r;
}]]></html:pre>
                    <html:p>The lighting model is the same as step 3, but the diffuse colour is now binary — white for alive cells, black for dead — with a small ambient term of <fr:tex display="inline"><![CDATA[0.08]]></fr:tex> so the torus shape remains visible even in empty regions. Hover over the lower half to seed cells and watch them propagate across the torus surface above.</html:p>
                    <html:canvas class="glslCanvas" width="640" height="640" data-fragment-url="/forest/bafkrmihtdmsmioqqpakb7w2ge5gpnhlhhliul5bcqqsu6rerd7yu3f6n5i.frag">Loading shader...</html:canvas>
                  </fr:mainmatter>
                </fr:tree>
                <html:p>The full source is adapted from a ShaderEditor shader for Android. The main changes for the web are: replacing <html:code>backbuffer</html:code> with glslCanvas's <html:code>u_buffer0</html:code>, swapping touch-based rotation for auto-rotation, and using the <html:code>BUFFER_0</html:code> preprocessor pass for double-buffered state. The original runs on a phone — this version runs in your browser.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="Planned links">Planned links</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:ul><html:li>Topology hub — when a hub tree exists</html:li>
    <html:li>Conway's Game of Life — formal definition tree</html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
                <html:script src="/forest/lazy-shaders.js"> </html:script>
                <html:script src="/forest/GlslCanvas.min.js"> </html:script>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>16</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/tt-000f/</fr:uri>
                <fr:display-uri>tt-000f</fr:display-uri>
                <fr:route>/forest/tt-000f/</fr:route>
                <fr:title text="The syntax-semantics adjunction">The syntax-semantics adjunction</fr:title>
                <fr:meta name="draft">true</fr:meta>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Recently in my programming language course I was again introduced to the idea of the syntax-semantics adjunction. I guess we can start from this perspective on the relationship between language and meaning and gradually work towards something more abstract.</html:p>
                <html:p>This is very much a work in progress and all of the claims are subject to change (possibly after a more detailed research into <fr:link href="/forest/tt-AVRI/" title="Topos and type theory notes" uri="https://kream.codeberg.page/forest/tt-AVRI/" display-uri="tt-AVRI" type="local">topos theory</fr:link> proper).</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Compilers and interpreters">Compilers and interpreters</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>First, let us talk about compilers and interpreters.</html:p>
                    <html:p>Most kids nowadays are exposed to interpreted languages as their first PL, most likely python. As someone who grew up doing comp programming/leetcode with C/C++, I must say I could not understand what compilation is when I was first introduced to the term. As it turns out, compilation is conceptually very simple: it's just a fancy way of saying translation from source language to target language.</html:p>
                    <html:p>Usually the target language is machine code, which is then run on a CPU. The CPU works with other components on the motherboard, as well as external devices and finally, your computer does <html:em>something</html:em>. Exactly what that thing is depends on your program, but getting <html:em>something</html:em> to happen from just symbols on your monitor felt like magic for the young me. Of course, there's no mysticism at work, it's all just the compiler, libraries, memory maps, proc table, kernel, virtual memory, hard disk, CPU architecture, and transistors as well as quantum tunneling that carries out the logic you intend to encode with your program.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Lacan, psychoanalysis, and the chain of signifiers">Lacan, psychoanalysis, and the chain of signifiers</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Surprisingly, there's a concept from the post-structuralist movement with origins dating back to Ferdinand de Saussure that matches the induced monad/comonad from the syntax-semantics adjunction.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>16</fr:day>
                        </fr:date>
                        <fr:uri>https://kream.codeberg.page/forest/phil-0002/</fr:uri>
                        <fr:display-uri>phil-0002</fr:display-uri>
                        <fr:route>/forest/phil-0002/</fr:route>
                        <fr:title text="Structuralist linguistics">Structuralist linguistics</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>At the core of <fr:link href="/forest/phil-0001/" title="Structuralism" uri="https://kream.codeberg.page/forest/phil-0001/" display-uri="phil-0001" type="local">Structuralism</fr:link> in linguistics is the relationship between the <html:em>signifier</html:em> (the symbol, the sign as it exists) and the <html:em>signified</html:em> (what is implied, the concept referred to).</html:p>
                        <html:p>Saussure held that the signified dominates: meaning is real and stable, and signifiers are merely the conventional symbols we attach to it. The bond between signifier and signified is arbitrary but, once established, fixed by social agreement.</html:p>
                        <html:p>Lacan inverted this. For Lacan, there is no stable internal connection bonding signifier to signified. The signifier dominates, perpetually expanding, sliding over the signified. Meaning is never fully captured — it is always deferred, always elsewhere. The chain of signifiers generates meaning through difference and relation, not through reference to some fixed signified underneath.</html:p>
                        <html:p>This disagreement is not merely technical. It concerns whether language <html:em>expresses</html:em> a pre-existing meaning or whether language <html:em>constitutes</html:em> meaning in the first place.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>16</fr:day>
                        </fr:date>
                        <fr:uri>https://kream.codeberg.page/forest/phil-000a/</fr:uri>
                        <fr:display-uri>phil-000a</fr:display-uri>
                        <fr:route>/forest/phil-000a/</fr:route>
                        <fr:title text="The signifying chain">The signifying chain</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Lacan's <html:em>signifying chain</html:em> radicalises <fr:link href="/forest/phil-0002/" title="Structuralist linguistics" uri="https://kream.codeberg.page/forest/phil-0002/" display-uri="phil-0002" type="local">Saussure's linguistics</fr:link>: signifiers do not attach to fixed signifieds but refer only to other signifiers. Meaning is not found in any single sign — it <html:em>insists</html:em> in the movement from one signifier to the next, constantly deferred along the chain. The subject itself is "nothing other than what slides in a chain of signifiers."</html:p>
                        <html:p>Two rhetorical operations govern the chain. <html:em>Metonymy</html:em> — the horizontal displacement from signifier to signifier — sustains desire by keeping meaning perpetually out of reach. <html:em>Metaphor</html:em> — the substitution of one signifier for another — is the mechanism by which new meaning erupts, as when a symptom stands in for a repressed signifier.</html:p>
                        <html:p>Without some arrest, the chain would slide into pure meaninglessness. Lacan's <html:em>point de capiton</html:em> (quilting point) is the moment at which "the signifier stops the otherwise endless movement of signification," temporarily pinning signifier to signified and producing the necessary illusion of stable meaning. Meaning is thus fixed only retroactively: a sentence acquires its sense at the final full stop, not word by word. In the neurotic subject, enough quilting points hold to sustain coherent speech; when they fail to form, the result is psychosis — the subject is no longer an inhabitant of language but is inhabited by it.</html:p>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>2</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="Planned links">Planned links</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:ul><html:li>The graph of desire — Lacan's full diagram of the signifying chain, demand, and desire</html:li>
    <html:li>The four discourses — master, university, hysteric, analyst as rotations of the signifier chain</html:li>
    <html:li>The Name-of-the-Father — the primordial point de capiton; its foreclosure as the mechanism of psychosis</html:li>
    <html:li>Lacan's mathemes — formalisation of psychoanalytic concepts; connection to topology (Borromean knot)</html:li></html:ul>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Type theory and topos theory">Type theory and topos theory</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Before, we have been working on a pretty abstract level where we don't look into the internal structure of the specific languages and semantic categories. However, now we can do a "brain surgery" (which is to be taken literally if "the unconsciousness is structured like a language") on some language along with its interpretation in a category. The quintessential example of this that combines ideas from <fr:link href="/forest/cat-0001/" title="Category theory" uri="https://kream.codeberg.page/forest/cat-0001/" display-uri="cat-0001" type="local">category theory</fr:link>, topology, formal logic, and programming languages among other things is the relationship between a type theory and its semantic topos.</html:p>
                    <html:p>The relationship between type theory (syntax) — or namely categories of context — and topos theory (semantics) is another example of syntax-semantics adjunction.</html:p>
                    <html:p>A topos can be thought of as a generalised category of sets — a mathematical universe in which one can do mathematics. If categories can be thought of as "domains of discourse", then toposes are domains of discourse that have very nice properties that somewhat mimic how humans (namely logicians, geometrists, and algebraists) talk and reason about the world (of forms?). As you can probably tell, this is a rather platonic view of mathematical language and objects, but I would argue it is much more than just plain idealism, as we do uncover properties of the ideals (not the group theoretic term, although coincides on special cases) through reasoning.</html:p>
                    <html:p>Keep in mind that one of the founders of (elementary) topos theory was F.W. Lawvere (together with Myles Tierney), who was a Marxist-Leninist taking ideas from the leftist philosophical tradition to re-interpret them in a mathematical setting. Am I alluding to a reconciliation of Idealism with Materialism (as opposed to the claim that they are not reconcilable by the Soviets?) and why we should try "material" as logical structures instead of the unknowable Ding an sich? You can decide for yourself when we are finished.</html:p>
                    <html:p>So what is a topos? I guess it's probably better to think of the kinds of structure that is needed for a language to be "expressive".</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>16</fr:day>
                        </fr:date>
                        <fr:uri>https://kream.codeberg.page/forest/tt-0010/</fr:uri>
                        <fr:display-uri>tt-0010</fr:display-uri>
                        <fr:route>/forest/tt-0010/</fr:route>
                        <fr:title text="Mitchell-Bénabou language">Mitchell-Bénabou language</fr:title>
                        <fr:taxon>definition</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>The <html:em>Mitchell-Bénabou language</html:em> of an elementary topos <fr:tex display="inline"><![CDATA[\mathcal {E}]]></fr:tex> is the internal type theory extracted from the categorical structure. It turns <fr:tex display="inline"><![CDATA[\mathcal {E}]]></fr:tex> into a generalised set theory in which statements can be written and proved using first-order intuitionistic predicate logic.</html:p>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>2</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="Types, terms, and formulas">Types, terms, and formulas</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>The language is built from the topos as follows:</html:p>
                            <html:ul><html:li><html:em>Types</html:em> are objects of <fr:tex display="inline"><![CDATA[\mathcal {E}]]></fr:tex>. A product type <fr:tex display="inline"><![CDATA[A \times  B]]></fr:tex> is the categorical product; a function type <fr:tex display="inline"><![CDATA[B^A]]></fr:tex> is the exponential.</html:li>
    <html:li><html:em>Terms</html:em> of type <fr:tex display="inline"><![CDATA[A]]></fr:tex> over a context <fr:tex display="inline"><![CDATA[X]]></fr:tex> are morphisms <fr:tex display="inline"><![CDATA[X \rightarrow  A]]></fr:tex> in <fr:tex display="inline"><![CDATA[\mathcal {E}]]></fr:tex> — that is, generalised elements. A variable <fr:tex display="inline"><![CDATA[x : A]]></fr:tex> in context <fr:tex display="inline"><![CDATA[A]]></fr:tex> is the identity <fr:tex display="inline"><![CDATA[1_A : A \rightarrow  A]]></fr:tex>.</html:li>
    <html:li><html:em>Formulas</html:em> are terms of type <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex>, where <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> is the subobject classifier. Because <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> exists, there is no need to treat formulas separately from terms: a proposition is simply a morphism <fr:tex display="inline"><![CDATA[X \rightarrow  \Omega ]]></fr:tex>, which classifies a subobject of <fr:tex display="inline"><![CDATA[X]]></fr:tex>.</html:li></html:ul>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>2</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="Connectives and quantifiers">Connectives and quantifiers</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>The subobject poset <fr:tex display="inline"><![CDATA[\mathrm {Sub}(X)]]></fr:tex> of any object <fr:tex display="inline"><![CDATA[X]]></fr:tex> is a Heyting algebra, providing the logical connectives:</html:p>
                            <html:ul><html:li><fr:tex display="inline"><![CDATA[\top ]]></fr:tex> is the maximal subobject <fr:tex display="inline"><![CDATA[X \hookrightarrow  X]]></fr:tex>; <fr:tex display="inline"><![CDATA[\bot ]]></fr:tex> is the minimal subobject <fr:tex display="inline"><![CDATA[0 \hookrightarrow  X]]></fr:tex>.</html:li>
    <html:li><fr:tex display="inline"><![CDATA[\wedge ]]></fr:tex> and <fr:tex display="inline"><![CDATA[\vee ]]></fr:tex> are intersection and union of subobjects.</html:li>
    <html:li><fr:tex display="inline"><![CDATA[\Rightarrow ]]></fr:tex> is the Heyting implication, defined as the right adjoint to <fr:tex display="inline"><![CDATA[\wedge ]]></fr:tex>.</html:li>
    <html:li><fr:tex display="inline"><![CDATA[\neg  \varphi  \;=\; \varphi  \Rightarrow  \bot ]]></fr:tex>.</html:li></html:ul>
                            <html:p>Quantifiers arise as adjoints to pullback along projections. For a projection <fr:tex display="inline"><![CDATA[\pi  : X \times  A \rightarrow  X]]></fr:tex>:</html:p>
                            <html:ul><html:li><fr:tex display="inline"><![CDATA[\exists _A]]></fr:tex> is the left adjoint to <fr:tex display="inline"><![CDATA[\pi ^* : \mathrm {Sub}(X) \rightarrow  \mathrm {Sub}(X \times  A)]]></fr:tex> — the image factorisation.</html:li>
    <html:li><fr:tex display="inline"><![CDATA[\forall _A]]></fr:tex> is the right adjoint to <fr:tex display="inline"><![CDATA[\pi ^*]]></fr:tex> — the universal image.</html:li></html:ul>
                            <html:p>Equality <fr:tex display="inline"><![CDATA[a =_A b]]></fr:tex> for terms <fr:tex display="inline"><![CDATA[a, b : X \rightarrow  A]]></fr:tex> is the pullback of the diagonal <fr:tex display="inline"><![CDATA[\delta _A : A \rightarrow  A \times  A]]></fr:tex> along <fr:tex display="inline"><![CDATA[(a, b)]]></fr:tex>.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <html:p>The logic of the Mitchell-Bénabou language is intuitionistic: the law of excluded middle <fr:tex display="inline"><![CDATA[\varphi  \vee  \neg \varphi ]]></fr:tex> need not hold in a general topos. It holds precisely when the topos is Boolean — when every subobject lattice is a Boolean algebra.</html:p>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>2</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="Planned links">Planned links</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:ul><html:li>Subobject Poset - explanation for the construction and some proofs on its behaviour</html:li>
    <html:li>Subobject classifier — detailed definition and examples</html:li>
    <html:li>Heyting algebra — algebraic structure of subobject lattices and intuitionistic logic</html:li>
    <html:li>Elementary topos — full definition with axioms</html:li>
    <html:li>Lawvere's ETCS — Elementary Theory of the Category of Sets as a topos-theoretic foundation</html:li>
    <html:li>Local set theory (Bell) — type-theoretic reading of the Mitchell-Bénabou language</html:li></html:ul>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>16</fr:day>
                        </fr:date>
                        <fr:uri>https://kream.codeberg.page/forest/tt-0011/</fr:uri>
                        <fr:display-uri>tt-0011</fr:display-uri>
                        <fr:route>/forest/tt-0011/</fr:route>
                        <fr:title text="Kripke-Joyal semantics">Kripke-Joyal semantics</fr:title>
                        <fr:taxon>definition</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p><html:em>Kripke-Joyal semantics</html:em> interprets the <fr:link href="/forest/tt-0010/" title="Mitchell-Bénabou language" uri="https://kream.codeberg.page/forest/tt-0010/" display-uri="tt-0010" type="local">Mitchell-Bénabou language</fr:link> of a topos <fr:tex display="inline"><![CDATA[\mathcal {E}]]></fr:tex> by defining when a formula is <html:em>forced</html:em> (satisfied) at a generalised element. It is a higher-order generalisation of Beth-Kripke semantics for intuitionistic logic, due to André Joyal.</html:p>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>2</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="The forcing relation">The forcing relation</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>For a formula <fr:tex display="inline"><![CDATA[\varphi ]]></fr:tex> of the Mitchell-Bénabou language and a generalised element <fr:tex display="inline"><![CDATA[a : U \rightarrow  A]]></fr:tex> (an element of <fr:tex display="inline"><![CDATA[A]]></fr:tex> at stage <fr:tex display="inline"><![CDATA[U]]></fr:tex>), the <html:em>forcing relation</html:em> <fr:tex display="inline"><![CDATA[U \Vdash  \varphi (a)]]></fr:tex> holds when <fr:tex display="inline"><![CDATA[\varphi  \circ  a]]></fr:tex> factors through <fr:tex display="inline"><![CDATA[true : 1 \rightarrow  \Omega ]]></fr:tex> — that is, when the following square commutes:</html:p>
                            <html:div style="text-align: center">
                              <fr:resource hash="4d42ceb19359360989bea739449b736c">
                                <fr:resource-content>
                                  <html:img src="/forest/4d42ceb19359360989bea739449b736c.svg" />
                                </fr:resource-content>
                                <fr:resource-source type="latex" part="preamble"><![CDATA[
    \usepackage {tikz-cd}
    \usetikzlibrary {bending}
  ]]></fr:resource-source>
                                <fr:resource-source type="latex" part="body"><![CDATA[
    \begin {tikzcd}
      U \arrow [r, "a"] \arrow [d, "{!}"'] & A \arrow [d, "\varphi "] \\
      1 \arrow [r, "\mathrm {true}"'] & \Omega 
    \end {tikzcd}
  ]]></fr:resource-source>
                              </fr:resource>
                            </html:div>
                            <html:p>Equivalently, <fr:tex display="inline"><![CDATA[a]]></fr:tex> factors through the subobject <fr:tex display="inline"><![CDATA[\{x : A \mid  \varphi (x)\} \hookrightarrow  A]]></fr:tex> classified by <fr:tex display="inline"><![CDATA[\varphi ]]></fr:tex>. The clauses for compound formulas are built from this by restricting along morphisms <fr:tex display="inline"><![CDATA[f : V \rightarrow  U]]></fr:tex> (change of stage):</html:p>
                            <html:div style="text-align: center">
                              <fr:resource hash="c6ea400ac413f745b8feea40f583ed09">
                                <fr:resource-content>
                                  <html:img src="/forest/c6ea400ac413f745b8feea40f583ed09.svg" />
                                </fr:resource-content>
                                <fr:resource-source type="latex" part="preamble"><![CDATA[
    \usepackage {tikz-cd}
    \usetikzlibrary {bending}
  ]]></fr:resource-source>
                                <fr:resource-source type="latex" part="body"><![CDATA[
    \begin {tikzcd}
      V \arrow [r, "f"] \arrow [dr, "a \circ  f"'] & U \arrow [d, "a"] \\
      & A
    \end {tikzcd}
  ]]></fr:resource-source>
                              </fr:resource>
                            </html:div>
                            <html:p>The forcing relation is then defined inductively:</html:p>
                            <html:ul><html:li><html:strong>Truth</html:strong>: <fr:tex display="inline"><![CDATA[U \Vdash  \top ]]></fr:tex> always.</html:li>
    <html:li><html:strong>Equality</html:strong>: <fr:tex display="inline"><![CDATA[U \Vdash  a =_A b]]></fr:tex> iff <fr:tex display="inline"><![CDATA[a = b]]></fr:tex> as morphisms <fr:tex display="inline"><![CDATA[U \rightarrow  A]]></fr:tex>.</html:li>
    <html:li><html:strong>Conjunction</html:strong>: <fr:tex display="inline"><![CDATA[U \Vdash  \varphi  \wedge  \psi ]]></fr:tex> iff <fr:tex display="inline"><![CDATA[U \Vdash  \varphi ]]></fr:tex> and <fr:tex display="inline"><![CDATA[U \Vdash  \psi ]]></fr:tex>.</html:li>
    <html:li><html:strong>Disjunction</html:strong>: <fr:tex display="inline"><![CDATA[U \Vdash  \varphi  \vee  \psi ]]></fr:tex> iff there exists a jointly epimorphic family <fr:tex display="inline"><![CDATA[f_i : U_i \rightarrow  U]]></fr:tex> such that for each <fr:tex display="inline"><![CDATA[i]]></fr:tex>, either <fr:tex display="inline"><![CDATA[U_i \Vdash  \varphi (a \circ  f_i)]]></fr:tex> or <fr:tex display="inline"><![CDATA[U_i \Vdash  \psi (a \circ  f_i)]]></fr:tex>.</html:li>
    <html:li><html:strong>Implication</html:strong>: <fr:tex display="inline"><![CDATA[U \Vdash  \varphi  \Rightarrow  \psi ]]></fr:tex> iff for every <fr:tex display="inline"><![CDATA[f : V \rightarrow  U]]></fr:tex>, <fr:tex display="inline"><![CDATA[V \Vdash  \varphi (a \circ  f)]]></fr:tex> implies <fr:tex display="inline"><![CDATA[V \Vdash  \psi (a \circ  f)]]></fr:tex>.</html:li>
    <html:li><html:strong>Negation</html:strong>: <fr:tex display="inline"><![CDATA[U \Vdash  \neg \varphi ]]></fr:tex> iff for every <fr:tex display="inline"><![CDATA[f : V \rightarrow  U]]></fr:tex> with <fr:tex display="inline"><![CDATA[V]]></fr:tex> non-initial, <fr:tex display="inline"><![CDATA[V \not \Vdash  \varphi (a \circ  f)]]></fr:tex>.</html:li>
    <html:li><html:strong>Existential</html:strong>: <fr:tex display="inline"><![CDATA[U \Vdash  \exists _{x:B}\, \varphi (x)]]></fr:tex> iff there exists a jointly epimorphic family <fr:tex display="inline"><![CDATA[f_i : U_i \rightarrow  U]]></fr:tex> and elements <fr:tex display="inline"><![CDATA[b_i : U_i \rightarrow  B]]></fr:tex> such that <fr:tex display="inline"><![CDATA[U_i \Vdash  \varphi (b_i)]]></fr:tex> for each <fr:tex display="inline"><![CDATA[i]]></fr:tex>.</html:li>
    <html:li><html:strong>Universal</html:strong>: <fr:tex display="inline"><![CDATA[U \Vdash  \forall _{x:B}\, \varphi (x)]]></fr:tex> iff for every <fr:tex display="inline"><![CDATA[f : V \rightarrow  U]]></fr:tex> and every <fr:tex display="inline"><![CDATA[b : V \rightarrow  B]]></fr:tex>, <fr:tex display="inline"><![CDATA[V \Vdash  \varphi (b)]]></fr:tex>.</html:li></html:ul>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>2</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="Local character">Local character</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>The clauses for disjunction and existential quantification are <html:em>local</html:em>: they require the property to hold only after passing to a cover of <fr:tex display="inline"><![CDATA[U]]></fr:tex>. This reflects the sheaf condition and is what distinguishes Kripke-Joyal semantics from classical Tarskian semantics. In a presheaf topos, the covers are the jointly surjective families, recovering Kripke's original semantics for intuitionistic logic.</html:p>
                            <html:p>Cohen forcing in set theory is a special case: forcing over a poset <fr:tex display="inline"><![CDATA[P]]></fr:tex> corresponds to Kripke-Joyal semantics in the topos of sheaves on <fr:tex display="inline"><![CDATA[P]]></fr:tex>.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>2</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="Planned links">Planned links</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:ul><html:li>Sheaf toposes — main non-trivial examples; sheaf condition as the reason for local clauses</html:li>
    <html:li>Cohen forcing and independence results — forcing as Kripke-Joyal in a specific sheaf topos</html:li>
    <html:li>Presheaf semantics — simpler special case recovering Kripke's original semantics</html:li>
    <html:li>Geometric morphisms — how Kripke-Joyal semantics transfers along maps of toposes</html:li></html:ul>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>16</fr:day>
                    </fr:date>
                    <fr:title text="Planned links">Planned links</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:ul><html:li>Lindenbaum-Tarski algebra — when a tree exists</html:li>
    <html:li>Lawvere's hyperdoctrine — the precise categorical framework for the adjunction</html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="true" expanded="true" toc="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:title text="Video Scripts">Video Scripts</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="true" expanded="true" toc="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>9</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/video-0001-hub/</fr:uri>
                    <fr:display-uri>video-0001-hub</fr:display-uri>
                    <fr:route>/forest/video-0001-hub/</fr:route>
                    <fr:title text="A New Era of Online Mathematics (video series)">A New Era of Online Mathematics (video series)</fr:title>
                    <fr:meta name="draft">true</fr:meta>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>A three-part video essay series on the future of online mathematics — federated knowledge, interactive proofs, and the foundations that make them possible.</html:p>
                    <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>9</fr:day>
                        </fr:date>
                        <fr:uri>https://kream.codeberg.page/forest/video-0001/</fr:uri>
                        <fr:display-uri>video-0001</fr:display-uri>
                        <fr:route>/forest/video-0001/</fr:route>
                        <fr:title text="A New Era of Online Mathematics">A New Era of Online Mathematics</fr:title>
                        <fr:meta name="draft">true</fr:meta>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Script for a video essay responding to <fr:link href="https://www.bilibili.com/video/BV1tRAkz4EP2" type="external">Maki's bilibili video</fr:link> on open-source math platforms, while arguing for a broader vision of what online mathematics could become.</html:p>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>9</fr:day>
                            </fr:date>
                            <fr:title text="Disclaimer">Disclaimer</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>I'm just an undergraduate. My knowledge of mathematics and technology is limited. Nothing here is meant as an attack — not on Maki, not on the maintainers of any platform I discuss, not on anyone in the communities I mention. These are honest impressions from someone who cares about how we learn and share mathematics, offered in good faith. I might be wrong about any or all of it. This is meant to be a friendly discussion.
  Also, unlike Maki, my main concern isn't with having a better system so kids are not forced into paid math extracurriculars scamming them for no actual growth in their abilities. Here I'm mainly focusing on the design of the foundational infrastructure rather than the societal problems. It is important for me personally to see these problems from a materialist and production-oriented perspective, rather than from a societal/moral perspective.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>9</fr:day>
                            </fr:date>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>I'm sure you all have a lot of ideas on what we should do for a better mathematical platform. Here's my two cents at the matter. This is part one of a three-part series about what we could build instead.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>9</fr:day>
                            </fr:date>
                            <fr:title text="The state of online math">The state of online math</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter><html:p>Let's survey what exists. One resource I frequently use, the <fr:link href="https://ncatlab.org/" type="external">nLab</fr:link>, is a densely interlinked wiki on category theory, homotopy theory, and mathematical physics that spawned from the need of recording research level insights which don't fit in papers. It really takes the higher categorical nPOV seriously and covers a wide range of topics from this new lens. However, if you're not fluent in abstract nonsense, its pages read like complete gibberish.</html:p>
  <html:center><html:img src="https://media.mathstodon.xyz/media_attachments/files/113/072/861/511/980/404/original/f26003bde5f3a53a.png" alt="Category Theory meme" class="figure-content" /></html:center>
<html:p>The more conventional resources like <fr:link href="https://stacks.math.columbia.edu/" type="external">Stacks Project</fr:link> and <fr:link href="https://kerodon.net/" type="external">Kerodon</fr:link> are tagged, hyperlinked, and internally consistent in a way no wiki can match — but they're monolithic, single-curator projects. The <fr:link href="https://the-clowder-project.github.io/the-clowder-project/" type="external">Clowder Project</fr:link> aims to do for category theory what the Stacks Project did for algebraic geometry, but the pattern is the same: one hierarchy, one editorial voice, a linear catalog of concepts</html:p><html:p><fr:link href="https://www.3blue1brown.com/" type="external">3Blue1Brown</fr:link> is great for intuition with all the animations. Grant Sanderson's videos have done more to make linear algebra and calculus feel alive than any textbook in the last century. Manim, the python animation library for 3B1B videos, spawned a huge community of math content creators explaining concepts with animations. This is great but the barrier of entry is very high and it's also very time consuming. We don't want the boilerplate behind visualization and video editing to take the fun away from creating organic mathematical content.</html:p><html:p>The barrier of entry should be low and minimal. The process of math content creation should still be communal and fun, after all, it's a learning experience for the creator themselves as well. Maki acknowledges this and it's crucial for a long lasting community.</html:p><html:p>Despite this common vision of a new math platform, the current ones we've discussed shares a lot of the same structural problems. Identified by Sterling, Maki, and others, and synthesized here. This isn't a complete list, but the most prominent issues seen so far.</html:p><html:p><html:strong>Linearity.</html:strong> Textbooks and courses impose a single path through material. Chapter 1 before Chapter 2. Prerequisites before results. But mathematics isn't linear — it's a graph. The same definition appears in algebra, topology, and logic with different motivations and different consequences. A single linear ordering loses these connections. I wrote about this in more detail in <fr:link href="/forest/forester-0004/" title="Comparison of forester, org-roam, and Obsidian" uri="https://kream.codeberg.page/forest/forester-0004/" display-uri="forester-0004" type="local">Comparison of forester, org-roam, and Obsidian</fr:link>.</html:p><html:p><html:strong>Isolation and locked hierarchy.</html:strong> The problem isn't that knowledge lives in many places — that's fine, even desirable. The problem is that none of those places can talk to each other, and content can't escape its original context. A definition in a textbook can't link to its elaboration on nLab. A beautiful explanation of adjoint functors buried at section 4.3.2 can't be extracted and placed in a different context without copying it and losing its provenance. HTML and LaTeX hardcode hierarchy into content — the h1/h2/h3 problem — making reuse painful. What we need, I think, is independently maintained resources that can reference and build on each other. Maki identifies this same issue. Jon Sterling's <fr:link href="https://www.forester-notes.org/tfmt-0001/" type="external">manifesto on designing tools for scientific thought</fr:link> makes the argument from a broader perspective — not just education, but research, publishing, and the long-term maintenance of mathematical knowledge. See <fr:link href="/forest/forester-0004/" title="Comparison of forester, org-roam, and Obsidian" uri="https://kream.codeberg.page/forest/forester-0004/" display-uri="forester-0004" type="local">Comparison of forester, org-roam, and Obsidian</fr:link> for more.</html:p><html:p><html:strong>Visual tools that don't think.</html:strong> Mind maps, dependency graphs, Obsidian and alike's "graph view" — these promise spatial intuition about how ideas connect, but they almost never deliver. Maki's proposal includes a node map for visualizing dependencies. 
This again sounds cool on paper, but we don't have a concrete design yet to guarantee its usefulness. For that, we need to address <html:em>what kind</html:em> of edges the graph should have. 
In <fr:link href="/forest/forester-0005/" title="Rethinking Graph View for Math Notes" uri="https://kream.codeberg.page/forest/forester-0005/" display-uri="forester-0005" type="local">Rethinking Graph View for Math Notes</fr:link>, I argued that this is because these tools apply a 0-truncation: they collapse all the rich structure of links — their type, their context, their direction — into bare "connected or not" edges between notes. A graph that can't distinguish definitional relations such as "generalizes" from "is dual to". We have graphical displays, but not graphical tools.</html:p></fr:mainmatter>
                        </fr:tree>
                        <html:p><html:strong>Passive content.</html:strong> Learning math requires active thinking, but in most cases we only get passive content. Learning requires engaing with the static material, which is especially difficult for beginners who are not well versed in the language. Reading a proof is fundamentally different from constructing one. You can read a proof by induction a hundred times and still not <html:em>understand</html:em> it the way you would if you'd been forced to write one yourself. Interactive platforms do exist but the cost of learning and creating with them is incredibly high and nonstandardized.</html:p>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>9</fr:day>
                            </fr:date>
                            <fr:title text="Introducing Forester">Introducing Forester</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Recently, <fr:link href="https://www.bilibili.com/video/BV1tRAkz4EP2" type="external">Maki posted a video</fr:link> proposing an open-source platform for mathematics — with node maps, customizable PDF generation, and peer review. The motivation is genuine. Many features are teased but implementation and design details are yet to be disclosed — dependency graphs, modular content, cross-referenced definitions — none of this is trivial. His proposal involves building from scratch with a modern web framework stack. I think that energy would be better spent on content than infrastructure. To prevent us from reinventing the wheel, why not look at an existing project that already has most of the features implemented with a much simpler tech stack: forester. </html:p>
                            <html:p>So what would a tool look like that actually addresses these problems? I think one already exists. <fr:link href="https://www.forester-notes.org/" type="external">Forester</fr:link> is Jon Sterling's tool for scientific thought — open source, designed for mathematics from day one. Sterling built it for the entire lifecycle of mathematical knowledge: not just teaching or learning, but authoring, publishing, and the long-term interlinking of scientific ideas.</html:p>
                            <html:p>The core ideas — atomicity, composition — are familiar from Zettelkasten and tools like Obsidian. What sets Forester apart is how seriously it takes them. Transclusion means the same definition can live in your lecture notes, a homework sheet, and a research paper — not as copies, but as the same tree appearing in different contexts. Hierarchy is determined by context, not hardcoded: a definition at section 2 in one document can sit at section 5 in another. Most tools pay lip service to atomicity; Forester builds its entire architecture around it. Much of what Maki proposes building from scratch seems to already exist here. I'll go into the technical details in <fr:link href="/forest/video-0002/" title="Implementation Deep Dive" uri="https://kream.codeberg.page/forest/video-0002/" display-uri="video-0002" type="local">Implementation Deep Dive</fr:link>.</html:p>
                            <html:p>Almost nobody outside the category theory and type theory research community knows Forester exists yet. This isn't surprising — Sterling's inspirations, the Stacks Project and Kerodon, live in fields of mathematics inaccessible to most graduate students, let alone the general public. Specialized research tools don't go viral. But the ideas behind Forester — atomicity, transclusion, relative hierarchy — aren't limited to higher category theory. They apply to any mathematical knowledge base. Trebor Huang, Utensil, Jon Sterling — these are real, active forests, and most mathematicians have never heard of the tool that builds them.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>9</fr:day>
                            </fr:date>
                            <fr:title text="Federation: a different model">Federation: a different model</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Where Forester provides the technical foundation, Maki's proposal takes a different approach: a centralized platform with departments, peer review, and editorial oversight. I understand the appeal — quality control matters, and anyone who's spent time on a wiki knows that open contribution without curation produces inconsistency.
  But centralization is fragile. Centralized projects depend on the continued alignment of their leadership — and when that alignment breaks, the project dies or drifts from its original mission. Viewers who have followed Maki's work know that this isn't hypothetical. It's a pattern that repeats across open-source and educational projects alike. The problem isn't any individual's intentions; it's the structure itself.</html:p>
                            <html:p>The alternative is <html:em>federation</html:em>. Instead of one platform that everyone publishes on, imagine many independent forests — each maintained by an individual, a research group, or a department — that can transclude each other's content. Your forest references my definitions. My forest builds on your constructions. Neither of us controls the other's namespace.</html:p>
                            <html:p>Picture it concretely: Jon Sterling defines "adjunction" in his forest. A professor in Kyoto transcludes that definition into a course on category theory, adding exercises and commentary. A student forks the course, annotates it with their own examples, and links it to a construction from Trebor Huang's homological algebra forest — all without anyone copying or duplicating content. The definition lives in one place and appears in many contexts. The existing forests — Trebor's, Utensil's, Sterling's — are already the embryo of this network. They just can't talk to each other yet.</html:p>
                            <html:p>Quality emerges from the same mechanism that makes scientific publishing work: reputation, citation, and the ability to check the source. Sterling's manifesto <fr:link href="https://www.forester-notes.org/tfmt-000Q/" type="external">distinguishes authors from contributors</fr:link>: you're responsible for what you wrote, not for how someone else used it. This isn't just a technical question — it's a philosophical one. Do we want one authoritative source that everyone must defer to, or a network of independent voices that can reference and build on each other?
  Forester 5.0 already has an experimental mechanism for this — <fr:link href="/forest/forester-0007/" title="Cross-forest transclusion and federation" uri="https://kream.codeberg.page/forest/forester-0007/" display-uri="forester-0007" type="local">publish and implant</fr:link> — and AI can smooth the friction of working across forests by translating between conventions, resolving conflicting definitions, and curating the federated network. I'll demonstrate how this works in practice in <fr:link href="/forest/video-0002/" title="Implementation Deep Dive" uri="https://kream.codeberg.page/forest/video-0002/" display-uri="video-0002" type="local">Implementation Deep Dive</fr:link>.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>9</fr:day>
                            </fr:date>
                            <fr:title text="Interactivity: the missing revolution">Interactivity: the missing revolution</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Federation solves the structural problem — how knowledge is organized and connected. But there's a second pillar. Even if every math resource in the world were perfectly interlinked, they'd still be passive. Even in a college classroom — arguably the most interactive setting mathematics has — the dominant mode is lecture. A professor writes on a board. Students copy it down. Homework is done alone, on paper, with feedback delayed by days.
  The main interaction math students get is with books — which takes initiative to read — so ultimately with ourselves.</html:p>
                            <html:p><fr:link href="https://explorabl.es/" type="external">Explorable explanations</fr:link> showed what's possible. Nicky Case's interactive essays on game theory, voting systems, and complex systems let you <html:em>play</html:em> with the ideas — drag sliders, change parameters, watch what happens. The ideas stick because you experienced them, not because you read about them. Bret Victor's <fr:link href="http://worrydream.com/LadderOfAbstraction/" type="external">Ladder of Abstraction</fr:link> made the same point even earlier: understanding requires moving between concrete examples and abstract principles. That movement should be interactive.</html:p>
                            <html:p>Other fields already know this works. CTFs — Capture The Flag competitions — produced a generation of skilled security researchers who learned by doing: progressive difficulty, immediate feedback, and the dopamine hit of solving a puzzle. Nobody learns penetration testing by reading a textbook.</html:p>
                            <html:p>What if we could build this for all of mathematics?</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>9</fr:day>
                            </fr:date>
                            <fr:title text="The Agda widget: a proof of concept">The Agda widget: a proof of concept</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Formalization is a powerful tool that has become popular over the past few years.</html:p>
                            <html:p>The <fr:link href="https://adam.math.hhu.de/#/g/leanprover-community/NNG4" type="external">Lean Natural Number Game</fr:link> is a prime example of formalization as a gamification of math learning. You prove basic properties of natural numbers by writing Lean tactics, with the proof assistant giving you immediate feedback. It works. People who have never touched formal mathematics complete it and come away understanding induction and proofs, not because someone explained it, but because they <html:em>did</html:em> it.</html:p>
                            <html:p>On my own forester instance I've been exploring this idea a bit. This site has an <fr:link href="https://kream.codeberg.page/forest/agda-0001/" type="external">agda-0001</fr:link> running entirely in the browser via WebAssembly. You write Agda code — real Agda, not a toy subset — and the proof assistant tells you in seconds whether your proof is correct.
   All you need for an interactive experience is some familiarity with agda, and being provided the relevant source code. Of course, formalization is nontrivial work, but as the greater math community is moving towards a formalized foundation, it will only become easier for the average student.
</html:p>
                            <html:p>This is what interactive math education <html:em>could</html:em> look like. An embeddable environment where the mathematics itself is executable, where the feedback loop is measured in seconds, and where correctness is checked by a machine, not a human grader. Imagine having a codeblock for every exercise in a math book, where they build on actual agda definitions and theorems stated previously.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>9</fr:day>
                            </fr:date>
                            <fr:title text="A new picture">A new picture</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>So here's the vision, stated plainly.
  Federated forests of mathematical knowledge, each independently curated, all interlinked. Not one platform that everyone must join, but many — each maintained by the people who know the material best, connected by a protocol that handles transclusion and attribution automatically. Everything references everything else, but no one controls the whole.
  This changes the social structure of mathematics, not just the technical one. No single institution gatekeeps what counts as a valid treatment of a subject. Researchers and students on different continents build on each other's work without coordination, without asking permission — the protocol handles it. The authority of a definition comes from its usefulness and rigor, not from the prestige of the institution that hosts it.</html:p>
                            <html:p>Interactive proofs embedded in every page. Not just reading math but doing it. A definition of a group comes with an exercise: prove that the inverse is unique. A discussion of the fundamental group comes with a quest: construct the loop space. You don't move on until the proof assistant accepts your answer.</html:p>
                            <html:p>Gamified learning paths that build intuition through carefully designed challenges. A CTF for category theory. A puzzle game for homotopy type theory. Progressive difficulty, immediate feedback, and the satisfaction of a green checkmark when your proof compiles.</html:p>
                            <html:p>This isn't a fantasy. The pieces exist today: forester provides the infrastructure, the Agda widget provides the interactivity, federation provides the social model. They just need to be assembled — and refined, and extended, and stress-tested by actual mathematicians and students.
  If this interests you: build a forest. Write a tree. Contribute an exercise. The tools are ready. The community is small but growing. And the potential — for how we learn, teach, and do mathematics — is enormous.</html:p>
                            <html:p>A foundation in type theory that makes all of this verifiable and computational. Not replacing classical mathematics — supplementing it with a language that machines can check, humans can execute, and education can exploit.</html:p>
                            <html:p>In <fr:link href="/forest/video-0002/" title="Implementation Deep Dive" uri="https://kream.codeberg.page/forest/video-0002/" display-uri="video-0002" type="local">Implementation Deep Dive</fr:link>, I'll demonstrate all of this in practice — Forester's features, the Agda widget in action, AI-assisted authoring, and how federation works today. In <fr:link href="/forest/video-0003/" title="Mathematical Foundations for a New Era" uri="https://kream.codeberg.page/forest/video-0003/" display-uri="video-0003" type="local">Mathematical Foundations for a New Era</fr:link>, I'll make the case for the mathematical foundations underneath: why dependent type theory, category theory, and diagrammatic reasoning aren't just convenient tools but the right substrate for interactive, federated mathematical knowledge.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>9</fr:day>
                            </fr:date>
                            <fr:title text="What's missing and what's coming">What's missing and what's coming</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>That's the vision. But I don't want to oversell what exists. The pieces are real, but they're early-stage, and significant work remains.
  Forester's federation is experimental — cross-forest transclusion currently works via static JSON blobs, with no live remote transclusion, no real-time collaboration, no forking or merging of forests. The Agda widget lacks interaction mode: you can type-check code, but you can't ask the system for goals, do case splitting, or use auto-fill. Adding these would transform the widget from a verification tool to a genuine interactive proof environment. Graph view is actively being developed — <fr:link href="/forest/forester-0005/" title="Rethinking Graph View for Math Notes" uri="https://kream.codeberg.page/forest/forester-0005/" display-uri="forester-0005" type="local">Rethinking Graph View for Math Notes</fr:link> lays out a proposed solution, but the implementation remains. There's no access control, no collaborative editing model, and no standard for how federated forests should handle conflicting definitions or notation. These are hard problems, and pretending they're solved would be dishonest.</html:p>
                            <html:p>There's a deeper problem that even Forester's creator is honest about. In <fr:link href="https://www.forester-notes.org/QHXS/" type="external">Intellectual Junkyards</fr:link>, Sterling describes how evergreen forests can die: you spend a year building up category theory, then realize you want to switch to univalent foundations, the refactoring is too painful, motivation dies, and the forest becomes a junkyard. His conclusion is striking: "mathematics and the sciences are also rapidly moving targets, and if your outlook on them slows its roll long enough for it to become practical to keep a sizable forest evergreen, it may indicate intellectual stagnation more than intellectual wealth."
  His proposed solution? Federation itself — split off independent "hyperbooks" as separate forests that can be federated with your main one, and don't be afraid of a little "forest fire" when the weight of accumulated ontology becomes crushing. This is less a limitation of Forester than an honest reckoning with the nature of knowledge production.</html:p>
                            <html:p>But all of this is open source and actively developed. Forester itself, the Agda widget, the HoTT Game exercises — all of it is publicly available and welcomes contributions.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>16</fr:day>
                        </fr:date>
                        <fr:uri>https://kream.codeberg.page/forest/video-0002/</fr:uri>
                        <fr:display-uri>video-0002</fr:display-uri>
                        <fr:route>/forest/video-0002/</fr:route>
                        <fr:title text="Implementation Deep Dive">Implementation Deep Dive</fr:title>
                        <fr:meta name="draft">true</fr:meta>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Second video in the series. A hands-on demonstration of everything described in <fr:link href="/forest/video-0001/" title="A New Era of Online Mathematics" uri="https://kream.codeberg.page/forest/video-0001/" display-uri="video-0001" type="local">A New Era of Online Mathematics</fr:link> — the actual features of Forester, live demos, real workflows, and the technical infrastructure underneath.</html:p>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="Forester in detail">Forester in detail</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>The core ideas are simple. Each tree captures one atomic concept — a definition, a theorem, a remark, a construction. This is the principle of <fr:link href="https://www.forester-notes.org/tfmt-0007/" type="external">atomicity</fr:link>: a note should capture one thing, and ideally <html:em>all</html:em> of that thing, so that understanding it requires only reading it and following its links — not reading everything that came before it in some hierarchy. Traditional math writing fails this completely: you can't understand Theorem 4.3 without reading Sections 1 through 4.2. The guiding principle: "prefer explicit context over implicit context." Larger documents are assembled bottom-up via transclusion: you compose small trees into bigger ones. A definition tree might appear in lecture notes, a homework sheet, and a research paper, contextualised differently each time but never duplicated.</html:p>
                            <html:p>Crucially, section levels are relative. A tree at depth 1 in one document can appear at depth 3 in another without modification. This is Forester's answer to the hierarchy problem: don't hardcode <html:code>h1</html:code>/<html:code>h2</html:code>/<html:code>h3</html:code> into your content. Let the context determine the level. The deeper insight — <fr:link href="https://www.forester-notes.org/tfmt-0006/" type="external">hierarchical structure as non-unique narrative</fr:link>: the same body of definitions and theorems can be assembled into lecture notes, a homework sheet, or a research paper — each imposing a different hierarchy toward different ends. The content doesn't change; only the narrative around it does.</html:p>
                            <html:p>Forester comes with native support for KaTeX, MathML, LaTeX rendering including tikz-cd commutative diagrams, and a custom macro system that shares definitions across the entire forest. Sterling cites the <fr:link href="https://stacks.math.columbia.edu/" type="external">Stacks Project</fr:link> and <fr:link href="https://kerodon.net/" type="external">Kerodon</fr:link> as spiritual predecessors.</html:p>
                            <html:p>The macro system deserves special attention. The <fr:link href="https://www.forester-notes.org/tfmt-000H/" type="external">manifesto argues</fr:link> that any tool whose support for mathematical notation involves a single globally-defined macro package is <html:em>inadequate for mathematical use</html:em>. Notation changes over time, and large clusters of notes share macros while other clusters need different ones. A global macro library means that changing your notation for one project forces a refactoring of everything else — "one of the main ways that large mathematical projects tend to collapse under their own weight." Forester solves this: each tree specifies which macro libraries it uses, and transcluded notes are rendered with respect to <html:em>their own</html:em> macros, not the parent's. This is why Obsidian and Notion, despite nominally supporting KaTeX, are "so limited that [they are] not usable for a working mathematician."</html:p>
                            <html:p>I compared forester with org-roam and Obsidian in <fr:link href="/forest/forester-0004/" title="Comparison of forester, org-roam, and Obsidian" uri="https://kream.codeberg.page/forest/forester-0004/" display-uri="forester-0004" type="local">Comparison of forester, org-roam, and Obsidian</fr:link>, and studied how different forester users organize their forests in <fr:link href="/forest/forester-0003/" title="How forester users organize their forests: a comparative study" uri="https://kream.codeberg.page/forest/forester-0003/" display-uri="forester-0003" type="local">How forester users organize their forests: a comparative study</fr:link>. The key takeaway is that forester doesn't just support mathematical notation — its entire architecture embodies principles about how mathematical knowledge should be structured.</html:p>
                            <html:p>No framework. No database. No React, no Next.js, no GraphQL. Forester's tech stack is deliberately minimal: an OCaml binary, some XSLT, and plain text files. Yet it comes with everything a mathematical knowledge base needs — KaTeX, tikz-cd, transclusion, cross-references, a macro system, a query language, and static output that hosts anywhere.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="Live demo: the Agda widget">Live demo: the Agda widget</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>The technical story is nontrivial. Agda compiled to WASM, running in a web worker, with a WASI shim that patches away filesystem errors gracefully. Prebuilt interface files so the first check doesn't take thirty seconds. Cross-tree imports so exercises on one page can build on definitions from another. Scoped contexts, hierarchical modules, compiler flags — all the infrastructure needed to build real courses, not just isolated demos.</html:p>
                            <html:p>TODO: Interactive proof demo. Show the <fr:link href="https://kream.codeberg.page/forest/agda-0001/" type="external">agda-0001</fr:link> in action — editing code, getting type-checking feedback, fixing errors. Then the <fr:link href="https://kream.codeberg.page/forest/agda-0007/" type="external">agda-0007</fr:link> HoTT Game: walk through a quest, show how excluded subtrees give independence, demonstrate the feedback loop.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="Live demo: category theory notes">Live demo: category theory notes</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>TODO: Walk through the category theory section of the forest. Show tikz-cd commutative diagrams rendering, transclusion in action, how atomic definitions link together. Demonstrate navigating the dependency graph.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="The MCP server: AI workflow in practice">The MCP server: AI workflow in practice</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>The Obsidian community has been experimenting with giving AI structured access to knowledge bases. Several MCP servers — notably <fr:link href="https://github.com/iansinnott/obsidian-claude-code-mcp" type="external">obsidian-claude-code-mcp</fr:link> and <fr:link href="https://github.com/MarkusPfundstein/mcp-obsidian" type="external">mcp-obsidian</fr:link> — give Claude access to an Obsidian vault. I took this idea and built a custom MCP server for Forester. It exposes twelve tools — listing trees, reading their source, full-text search, creating new trees, building the forest, parsing the dependency graph from build output, extracting structured metadata, autocompleting titles. Two resources give Claude the full macro library and a compact syntax reference. The server runs inside <html:code>nix develop</html:code> so it has access to the forester binary and all its dependencies.</html:p>
                            <html:p>But tools alone aren't enough. An LLM with access to <html:code>create_tree</html:code> will happily produce trees that violate every convention the forest has — wrong taxon, missing links, bare text outside paragraph blocks, diagrams without verbatim wrappers, duplicate definitions of concepts that already exist three trees away. The tools give Claude <html:em>access</html:em>; what it needs is <html:em>judgement</html:em>.</html:p>
                            <html:p>That's where skills come in. Claude Code supports skill files — structured prompts that are injected when a specific task type is invoked. I wrote a comprehensive skill for creating mathematical trees that encodes the atomicity principles from Sterling's manifesto, the full forester syntax, the macro library, the prefix and taxon conventions, the linking patterns, the diagram gotchas, and worked examples of atomic definitions, theorems with proofs, and hub trees with narrative interleaving. When I invoke the skill, Claude doesn't just have tools — it has a methodology.</html:p>
                            <html:p>The workflow looks like this: I say "write up the definition of a natural transformation." Claude searches the forest for existing treatments, reads related trees to pick up notation conventions, checks which categories and functors are already defined and where, then produces a tree that links its prerequisites, uses the right macros, follows the right formatting, and fits into the existing dependency graph. I review, adjust, and it's done. What would take me twenty minutes of looking up syntax and cross-referencing trees takes two.</html:p>
                            <html:p>I want to be careful not to overstate this. Current LLMs make mistakes — they hallucinate definitions, they confuse similar concepts, they sometimes produce LaTeX that doesn't compile. Every tree Claude produces still needs human review. But the trajectory is clear: as models improve and as the skill files accumulate more examples and edge cases, the ratio of AI-generated to human-generated content will shift. The forest becomes a collaboration between human mathematical judgement and machine fluency in the notation system.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="Graph view prototype">Graph view prototype</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>TODO: Demonstrate the graph view concepts from <fr:link href="/forest/forester-0005/" title="Rethinking Graph View for Math Notes" uri="https://kream.codeberg.page/forest/forester-0005/" display-uri="forester-0005" type="local">Rethinking Graph View for Math Notes</fr:link> rendered as an interactive visualization. Show typed edges, ambient layers, how the 2-category structure makes navigation meaningful rather than a force-directed hairball.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="Federation in practice">Federation in practice</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Forester 5.0 introduced an experimental mechanism for federation: <fr:link href="/forest/forester-0007/" title="Cross-forest transclusion and federation" uri="https://kream.codeberg.page/forest/forester-0007/" display-uri="forester-0007" type="local">publish and implant</fr:link>. A forest can package a fragment of its content as a JSON blob (filtered by a datalog query — publish only what's tagged <html:code>public</html:code>, for instance), and another forest can import that blob and transclude its trees as if they were local. It's static, it's simple, and it preserves authorial independence.</html:p>
                            <html:p>The <fr:link href="https://www.forester-notes.org/005P" type="external">Forester 5.0 release notes</fr:link> frame this as building toward an "Internet of Science" — a federation of many different forests, each independently curated, all interlinked by extending existing protocols with hypermedia controls for content transclusion. I wrote about the technical details and current limitations in <fr:link href="/forest/forester-0007/" title="Cross-forest transclusion and federation" uri="https://kream.codeberg.page/forest/forester-0007/" display-uri="forester-0007" type="local">Cross-forest transclusion and federation</fr:link>.</html:p>
                            <html:p>AI changes the economics of federation. An MCP server can serve as part of the protocol itself — not just for authoring within a single forest, but for mediating <html:em>between</html:em> forests. When you implant trees from someone else's forest, you inherit their conventions: their macros, their notation, their style of stating definitions. An AI with access to both forests' MCP servers can translate between them — adapting notation, resolving conflicting definitions, suggesting where an imported tree should link into your existing dependency graph.</html:p>
                            <html:p>AI can also curate existing forests in ways that make collaboration and navigation dramatically easier. A forest with hundreds of trees becomes hard to navigate even for its author. An AI that can read every tree, parse the dependency graph, and search across content can identify missing links, flag inconsistencies, suggest reorganization, and generate hub trees that weave scattered atoms into coherent narratives. For a newcomer trying to navigate an unfamiliar forest, an AI assistant that understands the structure can serve as a guide — answering "where is the definition of X?" or "what do I need to read before I can understand this theorem?" by actually traversing the graph rather than guessing. Federation without curation produces a sprawl of disconnected fragments; AI-assisted curation makes the federated network navigable.</html:p>
                            <html:p>TODO: Demonstrate publish and implant live. Show how one forest packages content as a JSON blob, another forest imports it, and trees appear as if local.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>16</fr:day>
                        </fr:date>
                        <fr:uri>https://kream.codeberg.page/forest/video-0003/</fr:uri>
                        <fr:display-uri>video-0003</fr:display-uri>
                        <fr:route>/forest/video-0003/</fr:route>
                        <fr:title text="Mathematical Foundations for a New Era">Mathematical Foundations for a New Era</fr:title>
                        <fr:meta name="draft">true</fr:meta>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Third video in the series. A deep dive into the mathematical and philosophical foundations underlying the vision presented in <fr:link href="/forest/video-0001/" title="A New Era of Online Mathematics" uri="https://kream.codeberg.page/forest/video-0001/" display-uri="video-0001" type="local">A New Era of Online Mathematics</fr:link> — why homotopy type theory, category theory, and diagrammatic reasoning are not just tools but the right <html:em>foundation</html:em> for interactive, federated mathematical knowledge.</html:p>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="A controversial foundation">A controversial foundation</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>I should be upfront about a bias: I think homotopy type theory, category theory, and type theory more broadly are the right foundation for this kind of project.</html:p>
                            <html:p>This is controversial. Most working mathematicians use set theory (ZFC) as their implicit foundation, and many would argue that foundations don't matter for practice. Fair enough. But foundations matter enormously for <html:em>computation and verification</html:em>. Set theory is notoriously hard to mechanize — proof assistants based on set theory exist (Mizar uses Tarski-Grothendieck set theory; Metamath's main library is built on ZFC) but formalization is laborious compared to type-theoretic systems. Type theory, by contrast, is inherently computational: the Curry-Howard correspondence means proofs <html:em>are</html:em> programs, and checking a proof is running a program.</html:p>
                            <html:p>The nLab's "n-point of view" — using category theory as an organizing principle — has proven remarkably effective for connecting disparate areas of mathematics. The same categorical structure (adjunction, limit, Kan extension) appears in algebra, topology, logic, and computer science. Learning this language once gives you a skeleton key for the rest.</html:p>
                            <html:p>The connection to interactive education is direct. Type-theoretic foundations make mathematics executable. Category-theoretic organization makes it modular. Diagrammatic languages make it intuitive. Together they give you math that can teach itself: you state a type, the student fills in the term — or manipulates a diagram, or applies a rewrite rule — and the machine verifies. This is the loop that makes the Agda widget work, and it's not a coincidence that it's built on dependent type theory.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="Invisible mathematics">Invisible mathematics</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Mathematics is full of structure that is left implicit in traditional presentations — <html:em>invisible mathematics</html:em>, the gap between what mathematicians intuit and what formal systems capture. This tension goes back at least to Brouwer, whose intuitionism insisted that the constructive content of mathematical reasoning outruns any formalism. Every foundational program since has grappled with it. In the category theory community, the theme has taken on a specific character: Emily Riehl's <fr:link href="https://emilyriehl.github.io/files/invisible.pdf" type="external">Newton Institute talk</fr:link> on formalizing invisible mathematics describes how infinity-category theory is full of proofs written without reference to concrete definitions, relying on coherence data that everyone knows is there but nobody writes down.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="Lawvere's objective logic and Hegel">Lawvere's objective logic and Hegel</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Lawvere's program of <html:em>objective logic</html:em> — formalized in his 1994 paper <fr:link href="https://lawverearchives.com/wp-content/uploads/2024/12/1994-tools-for-the-advancement-of-objective-logic-closed-categories-and-toposes.pdf" type="external">Tools for the Advancement of Objective Logic</fr:link>, rooted in Hegel's <html:em>Science of Logic</html:em> — frames category theory as the language for making this implicit structure explicit. Adjoint functors are Hegel's unity of opposites made precise. The nLab's <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/stuff,%20structure,%20property" type="external">stuff, structure, property</fr:link></html:span> framework, <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/negative%20thinking" type="external">negative thinking</fr:link></html:span>, and the shift from point-set topology to <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/locale" type="external">locale</fr:link></html:span> theory are all instances of the same impulse: formalizing what mathematicians intuit but don't say.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="The set theory–topos theory spectrum">The set theory–topos theory spectrum</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Even traditional set theory pursues the same goal — <fr:tex display="inline"><![CDATA[V = L]]></fr:tex> and large cardinal axioms search for the right mathematical universe from above, while topos theory searches for the shared foundational basis from below. Grothendieck universes sit at the intersection: inaccessible cardinals from the set-theoretic side, universe levels from the type-theoretic side, both addressing how large our mathematical universe can be.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="The 2-category of mathematical concepts">The 2-category of mathematical concepts</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>In <fr:link href="/forest/forester-0005/" title="Rethinking Graph View for Math Notes" uri="https://kream.codeberg.page/forest/forester-0005/" display-uri="forester-0005" type="local">Rethinking Graph View for Math Notes</fr:link>, I sketch (as an unfinished, not-yet-implemented idea) a framework for graph view that would model a forest as a 2-category of mathematical concepts — definitions as 0-cells, typed relationships (generalizes, dualizes, internalizes, categorifies) as 1-cells, and theorems witnessing structure between relationships as 2-cells. The framework draws on how formalization libraries organize knowledge: <fr:link href="https://1lab.dev/" type="external">1lab</fr:link> (cubical Agda), <fr:link href="https://unimath.github.io/UniMath/" type="external">UniMath</fr:link>, and <fr:link href="https://leanprover-community.github.io/mathlib4_docs/" type="external">Mathlib</fr:link> (Lean) all use categorical hierarchies — abstract concepts at the top, instances and specializations below. Category theory gives graph view a mathematical foundation, not just an engineering one: functorial correspondences propagate systematically, internalization layers stratify concepts by ambient category, and duality becomes a first-class operation.</html:p>
                            <html:p>This is an independent reason to prefer categorical foundations — they don't just organize <html:em>content</html:em> but the <html:em>relationships between content</html:em>. There's a pleasing resonance with Sterling's principle that forests should be <fr:link href="https://www.forester-notes.org/tfmt-0008/" type="external">flat over deep</fr:link>: in the 2-category, all concepts — groups, topological spaces, adjunctions, whatever — live as 0-cells at the same level. The hierarchy isn't gone; it's encoded in the 1-cells (generalizes, internalizes, categorifies) rather than in nesting depth. Flatness and hierarchy coexist because the structure lives in the morphisms, not in the positions.</html:p>
                            <html:p>The graph view sketch in <fr:link href="/forest/forester-0005/" title="Rethinking Graph View for Math Notes" uri="https://kream.codeberg.page/forest/forester-0005/" display-uri="forester-0005" type="local">Rethinking Graph View for Math Notes</fr:link> is a proposed attempt to expose this invisible structure: the typed edges (<html:code>generalizes</html:code>, <html:code>dualizes</html:code>, <html:code>internalizes</html:code>) would formalize connections that every mathematician senses but few texts make explicit. It remains theorized rather than implemented.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="Diagrammatic reasoning">Diagrammatic reasoning</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Diagrammatic and graphical reasoning push this further. As the <fr:link href="https://www.forester-notes.org/tfmt-000P/" type="external">manifesto notes</fr:link>, mathematical expressions and diagrams are <html:em>tightly coupled</html:em> — most diagrams contain math expressions involving notational macros, so any diagramming solution must be natively integrated with the math rendering system. This is why PGF/TikZ succeeds in LaTeX and why most web-based diagramming tools fall short. String diagrams for monoidal categories, proof nets for linear logic, pasting diagrams for higher categories — these are not just pretty pictures but rigorous formal systems where geometric intuition and algebraic precision coincide. I've been collecting examples in <fr:link href="/forest/tt-AVSP/" title="Diagrammatical/Graphical Approaches in Algebra, Category Theory, and Computation" uri="https://kream.codeberg.page/forest/tt-AVSP/" display-uri="tt-AVSP" type="local">Diagrammatical/Graphical Approaches in Algebra, Category Theory, and Computation</fr:link>.</html:p>
                            <html:p>The ZX-calculus for quantum computing is a striking case: it's a diagrammatic language for quantum circuits that is sound and, for pure qubit quantum mechanics, complete — every equation between ZX-diagrams corresponds to a real equality between quantum processes, and every such equality over qubits can be derived diagrammatically. Working with ZX-diagrams guides intuition far better than the traditional Hilbert space formalism, while sacrificing nothing in rigor. Bob Coecke and Stefano Gogioso's <fr:link href="https://quantuminpictures.org/" type="external">Quantum in Pictures</fr:link> demonstrates this beautifully — teaching quantum theory to a general audience through diagrams alone, no Hilbert spaces required.</html:p>
                            <html:p>This points to a broader goal: we should be building frontends to proof assistants that make the proof process as painless and intuitive as manipulating diagrams, while preserving the full robustness of machine-checked reasoning underneath. The raw syntax of Agda or Lean is powerful but intimidating. Imagine instead an interface where you reason with diagrams, drag-and-drop constructions, or guided tactic suggestions — and the proof assistant verifies every step behind the scenes. The ZX-calculus already demonstrates this is possible for one domain. The challenge is generalizing it.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="Beyond mathematics">Beyond mathematics</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Everything described in <fr:link href="/forest/video-0001/" title="A New Era of Online Mathematics" uri="https://kream.codeberg.page/forest/video-0001/" display-uri="video-0001" type="local">A New Era of Online Mathematics</fr:link> — atomic notes, transclusion, federation, typed links, interactive verification — was designed for mathematics. But the underlying ideas are not specific to mathematics. They're about how to structure, interlink, and verify knowledge. And knowledge doesn't stop at the borders of the math department.</html:p>
                            <html:p><html:strong>Natural sciences.</html:strong> Scientific knowledge has the same structural problems as mathematical knowledge: fragmentation across journals, linearity imposed by the paper format, passive consumption with no feedback loop. A biologist studying protein folding reads papers that cite definitions from chemistry, invoke results from statistical mechanics, and use computational methods from machine learning — but none of these cross-references are live links. They're parenthetical citations pointing to PDFs in other silos. A federated forest of scientific knowledge, where a chemistry tree can transclude a physics definition and a biology paper can link to both, would make the interdisciplinary structure of science <html:em>navigable</html:em> in a way that the current journal system cannot.</html:p>
                            <html:p>The interactivity story translates directly. Proof assistants verify mathematical proofs; computational notebooks (Jupyter, Observable) verify scientific computations. A tree about Bayesian inference could embed a live code block that lets the reader fit a model to data and see how the posterior changes with the prior — the same "state a type, fill in the term" loop, adapted from proofs to computations. Forester's macro system and transclusion model are agnostic about what the interactive blocks contain; the Agda widget is one instantiation, but a Python widget or an R widget would work the same way.</html:p>
                            <html:p><html:strong>Philosophy.</html:strong> This might seem like a stretch, but it isn't — especially for traditions that have embraced formalization. Alain Badiou's <html:em>Being and Event</html:em> develops an entire ontology grounded in Zermelo-Fraenkel set theory; his later work in <html:em>Logics of Worlds</html:em> moves to topos theory and sheaves. Badiou's philosophical arguments are literally mathematical proofs embedded in prose. A forester treatment of Badiou could transclude the set-theoretic definitions as formal trees, link them to the philosophical arguments that depend on them, and let the reader verify the mathematical content independently of the philosophical interpretation.</html:p>
                            <html:p>Lacan is a more provocative case. His use of topology (Borromean knots, the torus, cross-caps) and algebra (mathemes, the formulas of sexuation) has been dismissed by many mathematicians as pseudoscientific — Sokal and Bricmont's <html:em>Fashionable Nonsense</html:em> is the canonical indictment. But recent work has taken Lacan's mathematical structures seriously, not as metaphors but as genuine formal models. The Borromean knot, for instance, has a precise formalization in knot theory that captures the interdependence of the Real, Symbolic, and Imaginary in a way that prose description cannot. A forester forest could make these formalizations explicit: the knot-theoretic definition linked to the psychoanalytic interpretation, the algebraic structure of the mathemes formalized and type-checked, the topology of the torus of desire presented as an actual mathematical object rather than a hand-drawn diagram in a seminar transcript. The point is not to validate or debunk Lacan but to make the mathematical content precise enough to evaluate — to separate what is rigorous from what is rhetorical.</html:p>
                            <html:p>Hegel poses an even deeper challenge. The <html:em>Science of Logic</html:em> is, on one reading, an attempt to derive the categories of thought from pure negativity — a project that looks suspiciously like building up a type theory from the empty type. Lawvere made this connection precise with his categorical reading of Hegelian unity of opposites as adjunctions. More recently, work on "Hegelian categories" formalizes Aufhebung (sublation) as a specific categorical structure where a pair of adjoint functors mediates between levels of determination. This is the kind of content that <html:em>needs</html:em> forester's linking model: the Hegelian argument is a narrative, the categorical formalization is a precise structure, and the two should be interlinked — the reader should be able to follow the philosophical argument and click through to the mathematical formalization at each step, or vice versa.</html:p>
                            <html:p>The broader point: any discipline where ideas build on each other, where definitions matter, where the same concept appears in multiple contexts with different interpretations — that discipline benefits from atomic notes, transclusion, and typed links. Mathematics is the proving ground because the formal structure is most explicit there. But the tools generalize.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="true" expanded="true" toc="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:title text="Forester">Forester</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Notes reflecting on the meta aspects of note systems:</html:p>
                <html:ul><html:li><fr:link href="/forest/forester-0001/" title="Tree Syntax Guide" uri="https://kream.codeberg.page/forest/forester-0001/" display-uri="forester-0001" type="local">Tree Syntax Guide</fr:link></html:li>
    <html:li><fr:link href="/forest/forester-0002/" title="Editor tooling for forester" uri="https://kream.codeberg.page/forest/forester-0002/" display-uri="forester-0002" type="local">Editor tooling for forester</fr:link></html:li>
    <html:li><fr:link href="/forest/forester-0003/" title="How forester users organize their forests: a comparative study" uri="https://kream.codeberg.page/forest/forester-0003/" display-uri="forester-0003" type="local">How forester users organize their forests: a comparative study</fr:link></html:li>
    <html:li><fr:link href="/forest/forester-0004/" title="Comparison of forester, org-roam, and Obsidian" uri="https://kream.codeberg.page/forest/forester-0004/" display-uri="forester-0004" type="local">Comparison of forester, org-roam, and Obsidian</fr:link></html:li>
    <html:li><fr:link href="/forest/forester-0005/" title="Rethinking Graph View for Math Notes" uri="https://kream.codeberg.page/forest/forester-0005/" display-uri="forester-0005" type="local">Rethinking Graph View for Math Notes</fr:link></html:li>
    <html:li><fr:link href="/forest/forester-0006/" title="Macro library reference" uri="https://kream.codeberg.page/forest/forester-0006/" display-uri="forester-0006" type="local">Macro library reference</fr:link></html:li>
    <html:li><fr:link href="/forest/forester-0007/" title="Cross-forest transclusion and federation" uri="https://kream.codeberg.page/forest/forester-0007/" display-uri="forester-0007" type="local">Cross-forest transclusion and federation</fr:link></html:li></html:ul>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
              </fr:author>
            </fr:authors>
            <fr:uri>https://kream.codeberg.page/forest/cat-0001/</fr:uri>
            <fr:display-uri>cat-0001</fr:display-uri>
            <fr:route>/forest/cat-0001/</fr:route>
            <fr:title text="Category theory">Category theory</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Notes on category theory — the mathematics of structure-preserving maps. See also <fr:link href="/forest/alg-0001/" title="Algebra Notes" uri="https://kream.codeberg.page/forest/alg-0001/" display-uri="alg-0001" type="local">Algebra Notes</fr:link> for the algebraic perspective.</html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>17</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/cat-0002/</fr:uri>
                <fr:display-uri>cat-0002</fr:display-uri>
                <fr:route>/forest/cat-0002/</fr:route>
                <fr:title text="Category theory overview">Category theory overview</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Category theory is a branch of mathematics that studies structure-preserving maps between mathematical objects. It has proved to be an essential tool for foundational and semantics-based research in computer science, including language design, formal semantics, programming logics, and type systems.</html:p>
                <html:p>Category theory can be understood as the mathematical formalisation of <fr:link href="/forest/phil-0001/" title="Structuralism" uri="https://kream.codeberg.page/forest/phil-0001/" display-uri="phil-0001" type="local">structuralism</fr:link>: what matters is not what objects <html:em>are</html:em> but how they relate to one another through morphisms. Identity is determined by relational position, not intrinsic substance — the same principle that animates structuralist thought across linguistics, anthropology, and philosophy.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/cat-0003/</fr:uri>
                    <fr:display-uri>cat-0003</fr:display-uri>
                    <fr:route>/forest/cat-0003/</fr:route>
                    <fr:title text="Category">Category</fr:title>
                    <fr:taxon>definition</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>A <html:strong>category</html:strong> <fr:tex display="inline"><![CDATA[\mathbf {C}]]></fr:tex> consists of:</html:p>
                    <html:ul><html:li>A collection of <html:em>objects</html:em></html:li>
  <html:li>For each pair of objects <fr:tex display="inline"><![CDATA[A, B]]></fr:tex>, a collection of <html:em>arrows</html:em> (morphisms) <fr:tex display="inline"><![CDATA[f : A \rightarrow  B]]></fr:tex></html:li>
  <html:li>A composition operation: if <fr:tex display="inline"><![CDATA[f : A \rightarrow  B]]></fr:tex> and <fr:tex display="inline"><![CDATA[g : B \rightarrow  C]]></fr:tex>, then <fr:tex display="inline"><![CDATA[g \circ  f : A \rightarrow  C]]></fr:tex></html:li>
  <html:li>An identity arrow <fr:tex display="inline"><![CDATA[\mathrm {id}_A : A \rightarrow  A]]></fr:tex> for each object <fr:tex display="inline"><![CDATA[A]]></fr:tex></html:li></html:ul>
                    <html:p>These must satisfy two axioms: <html:em>associativity</html:em> of composition (<fr:tex display="inline"><![CDATA[h \circ  (g \circ  f) = (h \circ  g) \circ  f]]></fr:tex>), and the <html:em>identity law</html:em> (<fr:tex display="inline"><![CDATA[\mathrm {id}_B \circ  f = f = f \circ  \mathrm {id}_A]]></fr:tex>).</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <html:p>With this definition in hand, we can recognise categorical structure across mathematics.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>17</fr:day>
                    </fr:date>
                    <fr:title text="Familiar categories">Familiar categories</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Many mathematical structures form categories:</html:p>
                    <html:ul><html:li><fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex> — sets and functions</html:li>
    <html:li><fr:tex display="inline"><![CDATA[\mathbf {Grp}]]></fr:tex> — groups and group homomorphisms</html:li>
    <html:li><fr:tex display="inline"><![CDATA[\mathbf {Top}]]></fr:tex> — topological spaces and continuous maps</html:li>
    <html:li><fr:tex display="inline"><![CDATA[\mathbf {Cat}]]></fr:tex> — small categories and functors</html:li></html:ul>
                    <html:p>The power of category theory lies in studying what these diverse structures have in common — the universal properties and constructions that recur across different mathematical domains.</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <html:p>The lambda calculus provides a key example of categorical semantics: a <fr:link href="/forest/cat-000G/" title="C-monoid" uri="https://kream.codeberg.page/forest/cat-000G/" display-uri="cat-000G" type="local">C-monoid</fr:link> (one-object cartesian closed category) models the untyped lambda calculus.</html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>20</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/cat-0004/</fr:uri>
                <fr:display-uri>cat-0004</fr:display-uri>
                <fr:route>/forest/cat-0004/</fr:route>
                <fr:title text="Lawvere's fixed point theorem">Lawvere's fixed point theorem</fr:title>
                <fr:taxon>theorem</fr:taxon>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>For any cartesian closed category, provided object <fr:tex display="inline"><![CDATA[A]]></fr:tex> and exponential object <fr:tex display="inline"><![CDATA[B^A]]></fr:tex> for some object <fr:tex display="inline"><![CDATA[B]]></fr:tex> in this category, if there is a suitable notion of surjectivity for:</html:p>
                <fr:tex display="block"><![CDATA[\phi  \colon  A \longrightarrow  B^A]]></fr:tex>
                <html:p>Then every endomorphism <fr:tex display="inline"><![CDATA[f \colon  B \rightarrow  B]]></fr:tex> of <fr:tex display="inline"><![CDATA[B]]></fr:tex> has a <html:strong>fixed point</html:strong>(<fr:tex display="inline"><![CDATA[\exists  s \colon  1 \rightarrow  B]]></fr:tex>, s.t. <fr:tex display="inline"><![CDATA[f s = s]]></fr:tex>).</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/cat-1RDZ/</fr:uri>
                    <fr:display-uri>cat-1RDZ</fr:display-uri>
                    <fr:route>/forest/cat-1RDZ/</fr:route>
                    <fr:title text="Proof for point-surjective map">Proof for point-surjective map</fr:title>
                    <fr:taxon>proof</fr:taxon>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>First define a notion of point-surjectivity:</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>20</fr:day>
                        </fr:date>
                        <fr:uri>https://kream.codeberg.page/forest/cat-C70S/</fr:uri>
                        <fr:display-uri>cat-C70S</fr:display-uri>
                        <fr:route>/forest/cat-C70S/</fr:route>
                        <fr:title text="Point-surjective Morphism">Point-surjective Morphism</fr:title>
                        <fr:taxon>definition</fr:taxon>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>A map <fr:tex display="inline"><![CDATA[f\colon  X \rightarrow  Y]]></fr:tex> is <html:strong>point-surjective</html:strong> if for every point/global element <fr:tex display="inline"><![CDATA[q \colon  1 \rightarrow  Y]]></fr:tex>, there exists <fr:tex display="inline"><![CDATA[p \colon  1 \rightarrow  X]]></fr:tex> that lifts <fr:tex display="inline"><![CDATA[q]]></fr:tex>, such that <fr:tex display="inline"><![CDATA[f p = q]]></fr:tex>.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <html:p>Given <fr:tex display="inline"><![CDATA[f \colon  B \rightarrow  B]]></fr:tex>, let <fr:tex display="inline"><![CDATA[q\colon  1 \rightarrow  B^A]]></fr:tex> name the composite map of:</html:p>
                    <fr:tex display="block"><![CDATA[A \stackrel {\delta }{\rightarrow } A \times  A \stackrel {\phi  \times  1_A}{\rightarrow } B^A \times  A \stackrel {eval}{\rightarrow } B \stackrel {f}{\rightarrow } B]]></fr:tex>
                    <html:p>from <fr:tex display="inline"><![CDATA[A]]></fr:tex> to <fr:tex display="inline"><![CDATA[B]]></fr:tex>.</html:p>
                    <html:p>Since the setting is cartesian closed, we can use the notation from <fr:link href="/forest/tt-AVSR/" title="Compiling To Categories" uri="https://kream.codeberg.page/forest/tt-AVSR/" display-uri="tt-AVSR" type="local">Compiling to Categories</fr:link>:</html:p>
                    <fr:tex display="block"><![CDATA[q = \lambda  a . f \circ  apply ((\phi  \circ  exl) \Delta  (id \circ  exr)) \circ  \delta  (a)]]></fr:tex>
                    <html:p>Translating to <fr:link href="/forest/tt-000a/" title="Lambda calculus" uri="https://kream.codeberg.page/forest/tt-000a/" display-uri="tt-000a" type="local">Lambda calculus</fr:link> notation, <fr:tex display="inline"><![CDATA[q = \lambda  a \colon  A . f ((\phi  a) a)]]></fr:tex>, which reads the evaluation map as application of lambda terms.</html:p>
                    <html:p>Let <fr:tex display="inline"><![CDATA[p \colon  1 \rightarrow  A]]></fr:tex> lift <fr:tex display="inline"><![CDATA[q]]></fr:tex>. Calculate:</html:p>
                    <fr:tex display="block"><![CDATA[(\phi  p) p = q p = (\lambda  a . f ((\phi  a) a)) p = f ((\phi  p) p)]]></fr:tex>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>20</fr:day>
                        </fr:date>
                        <fr:title text="Agda Code">Agda Code</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
  <html:pre class="agda-code"><![CDATA[{-# OPTIONS --without-K --safe #-}
open import Level
open import Data.Product.Base using (Σ; _,_; proj₁; proj₂; module Σ)
open import Function.Base using (_∘_; id)
open import Relation.Binary.PropositionalEquality
  using (_≡_; refl; sym; subst; cong; cong-app; module ≡-Reasoning)]]></html:pre>

  <html:pre class="agda-code"><![CDATA[module LawvereTheorem where
  surjective : {A B : Set} → (A → B) → Set
  surjective {A} {B} f = (b : B) → Σ A (λ a → f a ≡ b)

  fixedPoint : {A : Set} → (A → A) → Set
  fixedPoint {A} f = Σ A (λ a → f a ≡ a)
  lawvere : {A B : Set}
          → (ϕ : A → (A → B)) 
          → surjective ϕ       
          → (f : B → B)        
          → fixedPoint f       
  lawvere {A} {B} ϕ surj f = (ϕ p p , sym proof)
    where
      q : A → B
      q = λ a → f (ϕ a a)
      
      p : A
      p = Σ.proj₁ (surj q)
      
      open ≡-Reasoning
      proof : ϕ p p ≡ f (ϕ p p)
      proof =
        begin
          ϕ p p
        ≡⟨ cong-app (Σ.proj₂ (surj q)) p ⟩
          q p
        ≡⟨ refl ⟩
          (λ a → f (ϕ a a)) p
        ≡⟨ refl ⟩
          f (ϕ p p)
        ∎]]></html:pre>
</fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>20</fr:day>
                    </fr:date>
                    <fr:title text="Planned Links">Planned Links</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:ul><html:li>nLab source</html:li>
    <html:li>Cartesian Closed Category</html:li>
    <html:li>Fixed points</html:li>
    <html:li><fr:link href="/forest/tt-AVT8/" title="Russell's Paradox" uri="https://kream.codeberg.page/forest/tt-AVT8/" display-uri="tt-AVT8" type="local">Russell's Paradox</fr:link></html:li>
    <html:li>endomorphism</html:li>
    <html:li>Substructual fixed points</html:li>
    <html:li>Proof in topos</html:li></html:ul>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <html:p>A category captures the structure of objects and morphisms. The next step is to study structure-preserving maps <html:em>between</html:em> categories.</html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>3</fr:month>
                  <fr:day>13</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/cat-C70T/</fr:uri>
                <fr:display-uri>cat-C70T</fr:display-uri>
                <fr:route>/forest/cat-C70T/</fr:route>
                <fr:title text="Functor">Functor</fr:title>
                <fr:taxon>definition</fr:taxon>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Let <fr:tex display="inline"><![CDATA[\mathbf {C}]]></fr:tex> and <fr:tex display="inline"><![CDATA[\mathbf {D}]]></fr:tex> be <fr:link href="/forest/cat-0003/" title="Category" uri="https://kream.codeberg.page/forest/cat-0003/" display-uri="cat-0003" type="local">categories</fr:link>. A <html:strong>functor</html:strong> <fr:tex display="inline"><![CDATA[F : \mathbf {C} \rightarrow  \mathbf {D}]]></fr:tex> consists of:</html:p>
                <html:ul><html:li>A mapping on objects: for each object <fr:tex display="inline"><![CDATA[A]]></fr:tex> of <fr:tex display="inline"><![CDATA[\mathbf {C}]]></fr:tex>, an object <fr:tex display="inline"><![CDATA[F(A)]]></fr:tex> of <fr:tex display="inline"><![CDATA[\mathbf {D}]]></fr:tex></html:li>
  <html:li>A mapping on morphisms: for each morphism <fr:tex display="inline"><![CDATA[f : A \rightarrow  B]]></fr:tex> in <fr:tex display="inline"><![CDATA[\mathbf {C}]]></fr:tex>, a morphism <fr:tex display="inline"><![CDATA[F(f) : F(A) \rightarrow  F(B)]]></fr:tex> in <fr:tex display="inline"><![CDATA[\mathbf {D}]]></fr:tex></html:li></html:ul>
                <html:p>These must satisfy two axioms:</html:p>
                <html:ol><html:li><html:em>Preservation of identity</html:em>: <fr:tex display="inline"><![CDATA[F(\mathrm {id}_A) = \mathrm {id}_{F(A)}]]></fr:tex> for every object <fr:tex display="inline"><![CDATA[A]]></fr:tex></html:li>
  <html:li><html:em>Preservation of composition</html:em>: <fr:tex display="inline"><![CDATA[F(g \circ  f) = F(g) \circ  F(f)]]></fr:tex> for all composable morphisms <fr:tex display="inline"><![CDATA[f, g]]></fr:tex></html:li></html:ol>
                <html:p>A functor <fr:tex display="inline"><![CDATA[F : \mathbf {C}^{\mathrm {op}} \rightarrow  \mathbf {D}]]></fr:tex> from the opposite category is called a <html:em>contravariant functor</html:em> from <fr:tex display="inline"><![CDATA[\mathbf {C}]]></fr:tex> to <fr:tex display="inline"><![CDATA[\mathbf {D}]]></fr:tex>.</html:p>
              </fr:mainmatter>
            </fr:tree>
            <html:p>Functors themselves form a category (for fixed source and target), with natural transformations as the morphisms between them.</html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>3</fr:month>
                  <fr:day>13</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/cat-C70U/</fr:uri>
                <fr:display-uri>cat-C70U</fr:display-uri>
                <fr:route>/forest/cat-C70U/</fr:route>
                <fr:title text="Natural transformation">Natural transformation</fr:title>
                <fr:taxon>definition</fr:taxon>
              </fr:frontmatter>
              <fr:mainmatter><html:p>Let <fr:tex display="inline"><![CDATA[F, G : \mathbf {C} \rightarrow  \mathbf {D}]]></fr:tex> be <fr:link href="/forest/cat-C70T/" title="Functor" uri="https://kream.codeberg.page/forest/cat-C70T/" display-uri="cat-C70T" type="local">functors</fr:link> between <fr:link href="/forest/cat-0003/" title="Category" uri="https://kream.codeberg.page/forest/cat-0003/" display-uri="cat-0003" type="local">categories</fr:link> <fr:tex display="inline"><![CDATA[\mathbf {C}]]></fr:tex> and <fr:tex display="inline"><![CDATA[\mathbf {D}]]></fr:tex>. A <html:strong>natural transformation</html:strong> <fr:tex display="inline"><![CDATA[\eta  : F \Rightarrow  G]]></fr:tex> is a family of morphisms <fr:tex display="inline"><![CDATA[\eta _X : F(X) \rightarrow  G(X)]]></fr:tex> in <fr:tex display="inline"><![CDATA[\mathbf {D}]]></fr:tex>, one for each object <fr:tex display="inline"><![CDATA[X]]></fr:tex> of <fr:tex display="inline"><![CDATA[\mathbf {C}]]></fr:tex>, such that for every morphism <fr:tex display="inline"><![CDATA[f : X \rightarrow  Y]]></fr:tex> in <fr:tex display="inline"><![CDATA[\mathbf {C}]]></fr:tex> the following <html:em>naturality square</html:em> commutes:</html:p>
  <html:center><fr:resource hash="e02788165169f44edbe33c86b16f623f"><fr:resource-content><html:img src="/forest/e02788165169f44edbe33c86b16f623f.svg" /></fr:resource-content><fr:resource-source type="latex" part="preamble"><![CDATA[\usepackage {tikz-cd}\usepackage {amsopn}\usepackage {amssymb}\usepackage {mathrsfs}\usetikzlibrary {bending}]]></fr:resource-source><fr:resource-source type="latex" part="body"><![CDATA[\begin{tikzcd}
  {F(X)} \arrow[r, "{F(f)}"] \arrow[d, "{\eta_X}"'] & {F(Y)} \arrow[d, "{\eta_Y}"] \\
  {G(X)} \arrow[r, "{G(f)}"'] & {G(Y)}
\end{tikzcd}]]></fr:resource-source></fr:resource></html:center>
<html:p>That is, <fr:tex display="inline"><![CDATA[G(f) \circ  \eta _X = \eta _Y \circ  F(f)]]></fr:tex> for all <fr:tex display="inline"><![CDATA[f : X \rightarrow  Y]]></fr:tex>. A natural transformation whose components are all isomorphisms is called a <html:em>natural isomorphism</html:em>.</html:p></fr:mainmatter>
            </fr:tree>
            <html:p>Many familiar constructions across mathematics — cartesian products of sets, direct products of groups, products of topological spaces — share a common pattern. Category theory captures this through <html:em>universal properties</html:em>.</html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>3</fr:month>
                  <fr:day>13</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/cat-C70V/</fr:uri>
                <fr:display-uri>cat-C70V</fr:display-uri>
                <fr:route>/forest/cat-C70V/</fr:route>
                <fr:title text="Product">Product</fr:title>
                <fr:taxon>definition</fr:taxon>
              </fr:frontmatter>
              <fr:mainmatter><html:p>Let <fr:tex display="inline"><![CDATA[A]]></fr:tex> and <fr:tex display="inline"><![CDATA[B]]></fr:tex> be objects in a <fr:link href="/forest/cat-0003/" title="Category" uri="https://kream.codeberg.page/forest/cat-0003/" display-uri="cat-0003" type="local">category</fr:link> <fr:tex display="inline"><![CDATA[\mathbf {C}]]></fr:tex>. A <html:strong>product</html:strong> of <fr:tex display="inline"><![CDATA[A]]></fr:tex> and <fr:tex display="inline"><![CDATA[B]]></fr:tex> is an object <fr:tex display="inline"><![CDATA[A \times  B]]></fr:tex> together with morphisms <fr:tex display="inline"><![CDATA[\pi _1 : A \times  B \rightarrow  A]]></fr:tex> and <fr:tex display="inline"><![CDATA[\pi _2 : A \times  B \rightarrow  B]]></fr:tex> (called <html:em>projections</html:em>) satisfying the following universal property: for every object <fr:tex display="inline"><![CDATA[X]]></fr:tex> and pair of morphisms <fr:tex display="inline"><![CDATA[f : X \rightarrow  A]]></fr:tex>, <fr:tex display="inline"><![CDATA[g : X \rightarrow  B]]></fr:tex>, there exists a unique morphism <fr:tex display="inline"><![CDATA[\langle  f, g \rangle  : X \rightarrow  A \times  B]]></fr:tex> such that <fr:tex display="inline"><![CDATA[\pi _1 \circ  \langle  f, g \rangle  = f]]></fr:tex> and <fr:tex display="inline"><![CDATA[\pi _2 \circ  \langle  f, g \rangle  = g]]></fr:tex>.</html:p>
  <html:center><fr:resource hash="5e3fbad4ea6a719c5d85522fb7b0a032"><fr:resource-content><html:img src="/forest/5e3fbad4ea6a719c5d85522fb7b0a032.svg" /></fr:resource-content><fr:resource-source type="latex" part="preamble"><![CDATA[\usepackage {tikz-cd}\usepackage {amsopn}\usepackage {amssymb}\usepackage {mathrsfs}\usetikzlibrary {bending}]]></fr:resource-source><fr:resource-source type="latex" part="body"><![CDATA[\begin{tikzcd}
  & X \arrow[dl, "f"'] \arrow[d, dashed, "{\langle f{,}g \rangle}"{description}] \arrow[dr, "g"] \\
  A & {A \times B} \arrow[l, "{\pi_1}"] \arrow[r, "{\pi_2}"'] & B
\end{tikzcd}]]></fr:resource-source></fr:resource></html:center>
<html:p>The product is unique up to unique isomorphism when it exists. A category in which every pair of objects has a product is said to <html:em>have binary products</html:em>. A category with binary products and a <fr:link href="/forest/cat-C70X/" title="Terminal object" uri="https://kream.codeberg.page/forest/cat-C70X/" display-uri="cat-C70X" type="local">terminal object</fr:link> has all <html:em>finite products</html:em>.</html:p></fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>3</fr:month>
                  <fr:day>13</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/cat-C70W/</fr:uri>
                <fr:display-uri>cat-C70W</fr:display-uri>
                <fr:route>/forest/cat-C70W/</fr:route>
                <fr:title text="Coproduct">Coproduct</fr:title>
                <fr:taxon>definition</fr:taxon>
              </fr:frontmatter>
              <fr:mainmatter><html:p>Let <fr:tex display="inline"><![CDATA[A]]></fr:tex> and <fr:tex display="inline"><![CDATA[B]]></fr:tex> be objects in a <fr:link href="/forest/cat-0003/" title="Category" uri="https://kream.codeberg.page/forest/cat-0003/" display-uri="cat-0003" type="local">category</fr:link> <fr:tex display="inline"><![CDATA[\mathbf {C}]]></fr:tex>.</html:p><html:p>A <html:strong>coproduct</html:strong> of <fr:tex display="inline"><![CDATA[A]]></fr:tex> and <fr:tex display="inline"><![CDATA[B]]></fr:tex> is an object <fr:tex display="inline"><![CDATA[A + B]]></fr:tex> together with morphisms <fr:tex display="inline"><![CDATA[\iota _1 : A \rightarrow  A + B]]></fr:tex> and <fr:tex display="inline"><![CDATA[\iota _2 : B \rightarrow  A + B]]></fr:tex> (called <html:em>injections</html:em> or <html:em>coprojections</html:em>) satisfying the following universal property: for every object <fr:tex display="inline"><![CDATA[X]]></fr:tex> and pair of morphisms <fr:tex display="inline"><![CDATA[f : A \rightarrow  X]]></fr:tex>, <fr:tex display="inline"><![CDATA[g : B \rightarrow  X]]></fr:tex>, there exists a unique morphism <fr:tex display="inline"><![CDATA[[f, g] : A + B \rightarrow  X]]></fr:tex> such that <fr:tex display="inline"><![CDATA[[f, g] \circ  \iota _1 = f]]></fr:tex> and <fr:tex display="inline"><![CDATA[[f, g] \circ  \iota _2 = g]]></fr:tex>.</html:p>
  <html:center><fr:resource hash="46abfcc265515f301a573f8e12586312"><fr:resource-content><html:img src="/forest/46abfcc265515f301a573f8e12586312.svg" /></fr:resource-content><fr:resource-source type="latex" part="preamble"><![CDATA[\usepackage {tikz-cd}\usepackage {amsopn}\usepackage {amssymb}\usepackage {mathrsfs}\usetikzlibrary {bending}]]></fr:resource-source><fr:resource-source type="latex" part="body"><![CDATA[\begin{tikzcd}
  A \arrow[r, "{\iota_1}"] \arrow[dr, "f"'] & {A + B} \arrow[d, dashed, "{[f{,}g]}"{description}] & B \arrow[l, "{\iota_2}"'] \arrow[dl, "g"] \\
  & X
\end{tikzcd}]]></fr:resource-source></fr:resource></html:center>
<html:p>The coproduct is dual to the <fr:link href="/forest/cat-C70V/" title="Product" uri="https://kream.codeberg.page/forest/cat-C70V/" display-uri="cat-C70V" type="local">product</fr:link>: it is the product in the opposite category. In <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex>, the coproduct is the disjoint union.</html:p></fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>3</fr:month>
                  <fr:day>13</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/cat-C70X/</fr:uri>
                <fr:display-uri>cat-C70X</fr:display-uri>
                <fr:route>/forest/cat-C70X/</fr:route>
                <fr:title text="Terminal object">Terminal object</fr:title>
                <fr:taxon>definition</fr:taxon>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>An object <fr:tex display="inline"><![CDATA[1]]></fr:tex> in a <fr:link href="/forest/cat-0003/" title="Category" uri="https://kream.codeberg.page/forest/cat-0003/" display-uri="cat-0003" type="local">category</fr:link> <fr:tex display="inline"><![CDATA[\mathbf {C}]]></fr:tex> is a <html:strong>terminal object</html:strong> if for every object <fr:tex display="inline"><![CDATA[X]]></fr:tex> in <fr:tex display="inline"><![CDATA[\mathbf {C}]]></fr:tex>, there exists a unique morphism <fr:tex display="inline"><![CDATA[! : X \rightarrow  1]]></fr:tex>.</html:p>
                <html:p>The terminal object is unique up to unique isomorphism when it exists. It can be viewed as the empty <fr:link href="/forest/cat-C70V/" title="Product" uri="https://kream.codeberg.page/forest/cat-C70V/" display-uri="cat-C70V" type="local">product</fr:link> (the product of zero objects). In <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex>, the terminal object is any singleton set. In <fr:tex display="inline"><![CDATA[\mathbf {Grp}]]></fr:tex>, it is the trivial group.</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>3</fr:month>
                  <fr:day>13</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/cat-C70Y/</fr:uri>
                <fr:display-uri>cat-C70Y</fr:display-uri>
                <fr:route>/forest/cat-C70Y/</fr:route>
                <fr:title text="Initial object">Initial object</fr:title>
                <fr:taxon>definition</fr:taxon>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>An object <fr:tex display="inline"><![CDATA[0]]></fr:tex> in a <fr:link href="/forest/cat-0003/" title="Category" uri="https://kream.codeberg.page/forest/cat-0003/" display-uri="cat-0003" type="local">category</fr:link> <fr:tex display="inline"><![CDATA[\mathbf {C}]]></fr:tex> is an <html:strong>initial object</html:strong> if for every object <fr:tex display="inline"><![CDATA[X]]></fr:tex> in <fr:tex display="inline"><![CDATA[\mathbf {C}]]></fr:tex>, there exists a unique morphism <fr:tex display="inline"><![CDATA[! : 0 \rightarrow  X]]></fr:tex>.</html:p>
                <html:p>The initial object is dual to the <fr:link href="/forest/cat-C70X/" title="Terminal object" uri="https://kream.codeberg.page/forest/cat-C70X/" display-uri="cat-C70X" type="local">terminal object</fr:link>: it is the terminal object in the opposite category. In <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex>, the initial object is the empty set. In <fr:tex display="inline"><![CDATA[\mathbf {Grp}]]></fr:tex>, the initial object is also the trivial group (making it a <html:em>zero object</html:em> --- both initial and terminal).</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:uri>https://kream.codeberg.page/forest/cat-0005/</fr:uri>
                <fr:display-uri>cat-0005</fr:display-uri>
                <fr:route>/forest/cat-0005/</fr:route>
                <fr:title text="Sheaves in Geometry and Logic notes">Sheaves in Geometry and Logic notes</fr:title>
                <fr:meta name="draft">true</fr:meta>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Reading notes on <html:em><fr:link href="/forest/maclane1992sheaves/" title="Sheaves in geometry and logic: a first introduction to topos theory" uri="https://kream.codeberg.page/forest/maclane1992sheaves/" display-uri="maclane1992sheaves" type="local">Sheaves in geometry and logic: a first introduction to topos theory</fr:link></html:em> by Saunders Mac Lane and Ieke Moerdijk — a first introduction to topos theory.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:uri>https://kream.codeberg.page/forest/cat-0006/</fr:uri>
                    <fr:display-uri>cat-0006</fr:display-uri>
                    <fr:route>/forest/cat-0006/</fr:route>
                    <fr:title text="Prologue: Categorial Preliminaries">Prologue: Categorial Preliminaries</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:uri>https://kream.codeberg.page/forest/cat-0007/</fr:uri>
                    <fr:display-uri>cat-0007</fr:display-uri>
                    <fr:route>/forest/cat-0007/</fr:route>
                    <fr:title text="Chapter I: Categories of Functors">Chapter I: Categories of Functors</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:uri>https://kream.codeberg.page/forest/cat-0008/</fr:uri>
                    <fr:display-uri>cat-0008</fr:display-uri>
                    <fr:route>/forest/cat-0008/</fr:route>
                    <fr:title text="Chapter II: Sheaves of Sets">Chapter II: Sheaves of Sets</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:uri>https://kream.codeberg.page/forest/cat-0009/</fr:uri>
                    <fr:display-uri>cat-0009</fr:display-uri>
                    <fr:route>/forest/cat-0009/</fr:route>
                    <fr:title text="Chapter III: Grothendieck Topologies and Sheaves">Chapter III: Grothendieck Topologies and Sheaves</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:uri>https://kream.codeberg.page/forest/cat-000A/</fr:uri>
                    <fr:display-uri>cat-000A</fr:display-uri>
                    <fr:route>/forest/cat-000A/</fr:route>
                    <fr:title text="Chapter IV: First Properties of Elementary Topoi">Chapter IV: First Properties of Elementary Topoi</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:uri>https://kream.codeberg.page/forest/cat-000B/</fr:uri>
                    <fr:display-uri>cat-000B</fr:display-uri>
                    <fr:route>/forest/cat-000B/</fr:route>
                    <fr:title text="Chapter V: Basic Constructions of Topoi">Chapter V: Basic Constructions of Topoi</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:uri>https://kream.codeberg.page/forest/cat-000C/</fr:uri>
                    <fr:display-uri>cat-000C</fr:display-uri>
                    <fr:route>/forest/cat-000C/</fr:route>
                    <fr:title text="Chapter VI: Topoi and Logic">Chapter VI: Topoi and Logic</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:uri>https://kream.codeberg.page/forest/cat-000D/</fr:uri>
                    <fr:display-uri>cat-000D</fr:display-uri>
                    <fr:route>/forest/cat-000D/</fr:route>
                    <fr:title text="Chapter VII: Geometric Morphisms">Chapter VII: Geometric Morphisms</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:uri>https://kream.codeberg.page/forest/cat-000E/</fr:uri>
                    <fr:display-uri>cat-000E</fr:display-uri>
                    <fr:route>/forest/cat-000E/</fr:route>
                    <fr:title text="Chapter VIII: Classifying Topoi">Chapter VIII: Classifying Topoi</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:uri>https://kream.codeberg.page/forest/cat-000F/</fr:uri>
                    <fr:display-uri>cat-000F</fr:display-uri>
                    <fr:route>/forest/cat-000F/</fr:route>
                    <fr:title text="Appendix: Sites for Topoi">Appendix: Sites for Topoi</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
              </fr:author>
            </fr:authors>
            <fr:uri>https://kream.codeberg.page/forest/cog-0001/</fr:uri>
            <fr:display-uri>cog-0001</fr:display-uri>
            <fr:route>/forest/cog-0001/</fr:route>
            <fr:title text="Cognitive science">Cognitive science</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Notes on cognition, epistemology, and the structures of human understanding.</html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:title text="Structure and abstraction">Structure and abstraction</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>7</fr:month>
                      <fr:day>4</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/cog-0002/</fr:uri>
                    <fr:display-uri>cog-0002</fr:display-uri>
                    <fr:route>/forest/cog-0002/</fr:route>
                    <fr:title text="Structure as abstraction">Structure as abstraction</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p><html:em>Structure</html:em> is what remains when all ornament, spectacle, content, and substance are stripped away — the bare framework of a thing. To perceive structure is to perform an abstraction: discarding the particular and retaining only what is universal.</html:p>
                    <html:p>In aesthetics, this distinction matters. Ornaments are sensory devices that produce immediate but shallow emotional responses — shock, addiction, cheap suspense. They dwell in the particular and lack what Aristotle called <html:em>magnitude</html:em> (see <fr:link href="/forest/lit-0002/" title="Aristotle's Poetics" uri="https://kream.codeberg.page/forest/lit-0002/" display-uri="lit-0002" type="local">Poetics</fr:link>). Structure, by contrast, produces profound responses — awe, catharsis, dread — because it engages what is universal. Structural beauty operates at the level of what might be called <html:em>instinctive aesthetics</html:em>: the recognition of pattern, symmetry, and form that precedes and underlies culturally conditioned taste.</html:p>
                    <html:p>Common ways of describing structure include:</html:p>
                    <html:ul><html:li><fr:link href="/forest/tt-000a/" title="Lambda calculus" uri="https://kream.codeberg.page/forest/tt-000a/" display-uri="tt-000a" type="local">Lambda calculus</fr:link> — the structure of computation</html:li>
  <html:li>Higher-order logics — the structure of reasoning</html:li>
  <html:li>Plot (in the Aristotelian sense) — the structure of narrative</html:li>
  <html:li><fr:link href="/forest/tt-AVR5/" title="Recursion and symmetry" uri="https://kream.codeberg.page/forest/tt-AVR5/" display-uri="tt-AVR5" type="local">Recursion and symmetry</fr:link> — the structure of self-reference and invariance</html:li>
  <html:li>Functional analysis — the structure of infinite-dimensional spaces</html:li></html:ul>
                    <html:p>Structural realism in philosophy of science takes this further: what is real about our best scientific theories is not the entities they posit but the structural relations they describe. This is a powerful position, though it must be tempered by recognising the limits of any formal system's capacity to capture structure — a lesson from <fr:link href="/forest/tt-0009/" title="Undecidability of lambda term equality" uri="https://kream.codeberg.page/forest/tt-0009/" display-uri="tt-0009" type="local">Gödel's incompleteness theorems</fr:link>.</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:title text="Meaning and knowledge">Meaning and knowledge</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2022</fr:year>
                      <fr:month>6</fr:month>
                      <fr:day>25</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/cog-0003/</fr:uri>
                    <fr:display-uri>cog-0003</fr:display-uri>
                    <fr:route>/forest/cog-0003/</fr:route>
                    <fr:title text="Meaning">Meaning</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p><html:em>Meaning</html:em> is what we are ultimately trying to access — and what perpetually resists direct access. It cannot be transmitted as raw data; it must be reconstructed by the receiver. This is the central problem of semantics, and it has no clean solution.</html:p>
                    <html:p>Any vehicle that carries genuine meaning must have a complex, resistant core — something that cannot be penetrated by a single argument or reduced to a simple proposition. Such cores are typically the product of long iterative processes operating over time within a collective. <fr:link href="/forest/cog-0004/" title="The cognitive value of myths" uri="https://kream.codeberg.page/forest/cog-0004/" display-uri="cog-0004" type="local">Myths</fr:link> are a paradigmatic example: their meaning is not designed but distilled through centuries of retelling.</html:p>
                    <html:p>Meaning is never directly conveyed. Information theory (Shannon) concerns the transmission of signals, not the meaning behind them. The gap between information and meaning is the gap between syntax and semantics — a signal can be transmitted perfectly and still be meaningless to the receiver, or meaningful in ways the sender did not intend.</html:p>
                    <html:p>The question of whether meaning originates with the creator or the audience of an artwork has a pragmatic answer: meaning is always constituted by the receiver. The sender can adjust the message in response to feedback, but the act of interpretation is irreducibly the receiver's. This aligns with the hermeneutic tradition (Gadamer) and with the structuralist insight that meaning arises from the system of differences within which a sign is received, not from the sender's intention alone.</html:p>
                    <html:p>Grasping the meaning of something often begins with recognising its <fr:link href="/forest/cog-0007/" title="Significance and meaning" uri="https://kream.codeberg.page/forest/cog-0007/" display-uri="cog-0007" type="local">significance</fr:link> — sensing that something matters before being able to articulate why. True meaning, in its full depth, remains asymptotic: we approach it but never arrive.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2022</fr:year>
                      <fr:month>7</fr:month>
                      <fr:day>4</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/cog-0006/</fr:uri>
                    <fr:display-uri>cog-0006</fr:display-uri>
                    <fr:route>/forest/cog-0006/</fr:route>
                    <fr:title text="Information, knowledge, experience, meaning">Information, knowledge, experience, meaning</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>These four concepts form a rough hierarchy of cognitive engagement, from shallow to deep. Understanding their differences clarifies what it means to truly <html:em>know</html:em> something.</html:p>
                    <html:ul><html:li><html:strong>Information</html:strong> is what is merely perceived — registered in short-term memory but not yet processed. A fact heard and immediately forgotten is pure information. Shannon's information theory operates entirely at this level: it measures the quantity of signal, not its significance.</html:li>
  <html:li><html:strong>Knowledge</html:strong> is information that has been processed, connected, and understood. It resides in long-term memory and carries <html:em>magnitude</html:em> — it has been integrated into a web of associations and implications. Knowledge involves logic, inference, and the ability to apply what has been learned. The Zettelkasten method (linking atomic notes into a network) is explicitly designed to transform information into knowledge through connection.</html:li>
  <html:li><html:strong>Experience</html:strong> is broader than information but operates differently. Experiences naturally carry context, emotion, and implicit meaning. They are valuable partly in proportion to their rarity — a common experience teaches little, while a rare one can reshape understanding. Experience gives rise to what might be called <html:em>ideological aesthetics</html:em>: the sense of beauty or rightness that comes from lived encounter rather than formal structure.</html:li>
  <html:li><html:strong>Meaning</html:strong> is the deepest and most elusive layer. We are never certain whether the meaning we extract from an experience is "real" or projected — yet we cannot help seeking it. Meaning is nonlinear, non-logical, and resists formalisation. It is the horizon toward which knowledge and experience point but never fully reach (see <fr:link href="/forest/cog-0003/" title="Meaning" uri="https://kream.codeberg.page/forest/cog-0003/" display-uri="cog-0003" type="local">meaning</fr:link>).</html:li></html:ul>
                    <html:p>This hierarchy is not strict — the levels interpenetrate. But the distinction is useful: much of what passes for knowledge is merely information (unprocessed, unconnected), and much of what passes for meaning is merely experience (vivid but unexamined).</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2021</fr:year>
                      <fr:month>12</fr:month>
                      <fr:day>8</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/cog-0007/</fr:uri>
                    <fr:display-uri>cog-0007</fr:display-uri>
                    <fr:route>/forest/cog-0007/</fr:route>
                    <fr:title text="Significance and meaning">Significance and meaning</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p><html:em>Significance</html:em> is the recognition that something matters — the felt sense that an object, idea, or connection is important, prior to any articulation of <html:em>why</html:em> it matters. Significance operates at the level of the signifier, not the signified: we grasp that something is significant before we grasp its meaning.</html:p>
                    <html:p>True progress in thinking is not merely agreeing with someone else's conclusions. It is the moment of realising the significance of something — the epiphany. In creation, this comes naturally: we defend our own ideas because their significance is felt from within. In understanding another's work, significance must be discovered, and this discovery is the real intellectual labour.</html:p>
                    <html:p>Discovering significance is, at bottom, <html:em>making connections</html:em> — perceiving that two apparently separate things are related. The magnitude of significance can be roughly measured by the number and depth of connections made. But this metric is incomplete: there are unconscious connections — things we feel are significant yet cannot explain or articulate. This inarticulate surplus is closely related to <fr:link href="/forest/phil-000A/" title="Objet petit a (小他者a)" uri="https://kream.codeberg.page/forest/phil-000A/" display-uri="phil-000A" type="local">objet petit a</fr:link>: the small excess beyond what the symbolic order can capture.</html:p>
                    <html:p>Obtaining this surplus — the significance beyond articulation — is what drives the endless search described in the <fr:link href="/forest/cog-0005/" title="Two cycles: progression and stagnation" uri="https://kream.codeberg.page/forest/cog-0005/" display-uri="cog-0005" type="local">two cycles</fr:link>. It is not mere curiosity but something more primordial: the recognition that there is always something more, just out of reach.</html:p>
                    <html:p>Significance and <fr:link href="/forest/cog-0003/" title="Meaning" uri="https://kream.codeberg.page/forest/cog-0003/" display-uri="cog-0003" type="local">meaning</fr:link> are close but not identical. Significance is the felt weight; meaning is the articulated content. One can recognise significance without grasping meaning (an experience that haunts without being understood), and one can state a meaning without feeling its significance (a proposition accepted but not internalised). The goal of genuine understanding is to unite the two.</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:title text="Myths and time">Myths and time</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2021</fr:year>
                      <fr:month>12</fr:month>
                      <fr:day>6</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/cog-0004/</fr:uri>
                    <fr:display-uri>cog-0004</fr:display-uri>
                    <fr:route>/forest/cog-0004/</fr:route>
                    <fr:title text="The cognitive value of myths">The cognitive value of myths</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Myths are strikingly symbolic and profound — yet they began as byproducts of oral storytelling, entertainment, or religious and governmental functions. Their depth is not authored but <html:em>evolved</html:em>.</html:p>
                    <html:p>The key mechanism is iterative distortion. A story passes from teller to teller; with each retelling, it changes slightly. Over many generations, details that fail to resonate are forgotten, while elements that carry emotional or cognitive weight are preserved and amplified. The story converges on a stable form — not because anyone designed that form, but because the process of collective retelling acts as a filter for <fr:link href="/forest/cog-0003/" title="Meaning" uri="https://kream.codeberg.page/forest/cog-0003/" display-uri="cog-0003" type="local">meaning</fr:link>.</html:p>
                    <html:p>This is a concrete instance of a general principle: any genuine approach to the real must involve some form of iteration. The meaning of a myth is not in what happened (history — the particular) but in what <html:em>might have happened</html:em> that appeals to us (story — the universal). This is precisely Aristotle's distinction in the <fr:link href="/forest/lit-0002/" title="Aristotle's Poetics" uri="https://kream.codeberg.page/forest/lit-0002/" display-uri="lit-0002" type="local">Poetics</fr:link>: poetry is more philosophical than history because it speaks to the probable and the universal rather than the actual and the particular.</html:p>
                    <html:p>A second mechanism is at work in mythic transmission: <html:em>objectification</html:em>. The reteller does not experience the myth as their own creation — the author is long dead, yet the story lives in a new voice. This alienation of the myth from any individual consciousness creates a gap in which the unconscious can operate. The reteller is not expressing their personal concerns but channelling a collective inheritance. After many iterations, the structure of the myth comes to mirror the formation of what Jung called the <html:em>collective unconscious</html:em> — the shared layer of human psychic life that underlies individual experience.</html:p>
                    <html:p>The cognitive value of myths, then, is that they are <html:em>naturally occurring abstractions</html:em>: structures refined by collective iteration to encode what matters most to human beings, in a form that resists reduction to any single interpretation.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2022</fr:year>
                      <fr:month>6</fr:month>
                      <fr:day>25</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/cog-0005/</fr:uri>
                    <fr:display-uri>cog-0005</fr:display-uri>
                    <fr:route>/forest/cog-0005/</fr:route>
                    <fr:title text="Two cycles: progression and stagnation">Two cycles: progression and stagnation</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Human experience oscillates between two fundamental cycles — one that advances and one that traps. Understanding their structure is key to understanding time, memory, addiction, and creativity.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2022</fr:year>
                          <fr:month>6</fr:month>
                          <fr:day>25</fr:day>
                        </fr:date>
                        <fr:title text="The cycle of progression">The cycle of progression</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>The progressive cycle moves through creation and reduction in alternation. Each iteration produces something new, reflects on it, reduces it, and the result seeds the next creation. Hope drives entry into the cycle; curiosity sustains it; and each pass carries a small difference — the cycle spirals rather than circles.</html:p>
                        <html:p>Time moves forward in this cycle. The ultimate destination, approached asymptotically through infinite iteration, is the fixed point — the stable value that the process converges upon. This is the structure of the <fr:link href="/forest/tt-0006/" title="The Y combinator" uri="https://kream.codeberg.page/forest/tt-0006/" display-uri="tt-0006" type="local">Y combinator</fr:link> applied to human experience: a recursive process that produces meaning through self-application. Creation, then reflection. Revision, approach, iteration. This is also the structure of scientific inquiry and of all genuine learning.</html:p>
                        <html:p>The forces that sustain this cycle are curiosity, which branches into both joy and pain. Joy produces enjoyment; pain produces suffering. But in the progressive cycle, both are productive — suffering leads to insight, and enjoyment deepens understanding.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2022</fr:year>
                          <fr:month>6</fr:month>
                          <fr:day>25</fr:day>
                        </fr:date>
                        <fr:title text="The cycle of stagnation">The cycle of stagnation</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>The stagnant cycle moves through fear, pain, and simple pleasure in a closed loop. There is no genuine enjoyment, only momentary relief. Nothing new is reached; time does not advance. Each pass is identical to the last. This is Dante's Inferno; this is also the Buddhist notion of samsara — the cycle of rebirth from which one cannot escape.</html:p>
                        <html:p>This cycle is structurally isomorphic to the <fr:link href="/forest/phil-000B/" title="The Big Other (大他者A)" uri="https://kream.codeberg.page/forest/phil-000B/" display-uri="phil-000B" type="local">Big Other</fr:link>: a closed, mundane, infinite repetition under the control of the symbolic order. The subject is trapped in the loop of demand and partial satisfaction, never reaching genuine desire.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2022</fr:year>
                          <fr:month>6</fr:month>
                          <fr:day>25</fr:day>
                        </fr:date>
                        <fr:title text="The difference between the cycles">The difference between the cycles</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>The two cycles are almost identical in structure — both involve repetition, displacement, and return. The difference is vanishingly small: a tiny surplus, a slight deviation at each pass, distinguishes spiral from circle. This surplus is <fr:link href="/forest/phil-000A/" title="Objet petit a (小他者a)" uri="https://kream.codeberg.page/forest/phil-000A/" display-uri="phil-000A" type="local">objet petit a</fr:link> — the difference between an object and itself, the small deviation on the iterating subject.</html:p>
                        <html:p>In computational terms: the progressive cycle is <html:em>recursion</html:em> (each call builds on the last), while the stagnant cycle is mere <html:em>iteration</html:em> (each pass is independent). Recursion produces depth; iteration produces only repetition.</html:p>
                        <html:p>The transformation from stagnation to progression requires some external or extraordinary force — what the vault notes called "genius, magic, fantasy, and most importantly, hope." The key moment is when fear transforms into hope: an almost impossible reversal, given how small and ethereal the difference (objet petit a) truly is.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:title text="Planned links">Planned links</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:ul><html:li>Embodied cognition — when a tree exists</html:li>
    <html:li>Lakoff/Johnson conceptual metaphor theory — connects to <fr:link href="/forest/phil-000C/" title="Metaphor and metonymy (隐喻与换喻)" uri="https://kream.codeberg.page/forest/phil-000C/" display-uri="phil-000C" type="local">Metaphor and metonymy (隐喻与换喻)</fr:link></html:li></html:ul>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
              </fr:author>
            </fr:authors>
            <fr:uri>https://kream.codeberg.page/forest/lit-0001/</fr:uri>
            <fr:display-uri>lit-0001</fr:display-uri>
            <fr:route>/forest/lit-0001/</fr:route>
            <fr:title text="Literary theory">Literary theory</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Notes on literary theory, criticism, and the structures underlying narrative art.</html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:title text="Foundations">Foundations</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2021</fr:year>
                      <fr:month>4</fr:month>
                      <fr:day>4</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/lit-0002/</fr:uri>
                    <fr:display-uri>lit-0002</fr:display-uri>
                    <fr:route>/forest/lit-0002/</fr:route>
                    <fr:title text="Aristotle's Poetics">Aristotle's Poetics</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Aristotle's <html:em>Poetics</html:em> is the foundational text of Western literary theory. Its central claims — that art is imitation, that plot is the soul of tragedy, and that poetry is more philosophical than history — continue to shape how we think about narrative.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2021</fr:year>
                          <fr:month>4</fr:month>
                          <fr:day>4</fr:day>
                        </fr:date>
                        <fr:title text="Art as imitation">Art as imitation</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>All art, for Aristotle, is <html:em>mimesis</html:em> — imitation or representation. Art can be analysed along three dimensions:</html:p>
                        <html:ul><html:li><html:em>Manner</html:em> — the mode of imitation (narrative, dramatic, mixed)</html:li>
    <html:li><html:em>Medium</html:em> — the material of imitation (rhythm, language, melody)</html:li>
    <html:li><html:em>Object</html:em> — what is imitated (people better than, worse than, or like ourselves)</html:li></html:ul>
                        <html:p>Imitation is not mere copying. It is the selective representation of human action according to probability and necessity — an abstraction from the chaos of actual events into a coherent structure.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2021</fr:year>
                          <fr:month>4</fr:month>
                          <fr:day>4</fr:day>
                        </fr:date>
                        <fr:title text="Plot as the soul of tragedy">Plot as the soul of tragedy</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>The <html:em>plot</html:em> (mythos) is the most important element of tragedy — its "soul." A good plot must have <html:em>magnitude</html:em>: it must be large enough to matter, complex enough to sustain attention, but unified enough to form a whole. Above all, plot must deal with the <html:em>universal</html:em> rather than the particular.</html:p>
                        <html:p>This is the distinction between poetry and history. History records what <html:em>happened</html:em> — the particular facts. Poetry (and by extension all narrative art) represents what <html:em>might happen</html:em> according to probability or necessity — the universal pattern. History deals in contingent truths; poetry deals in necessary possibilities. This is why Aristotle says poetry is "more philosophical" than history: it reveals the general structure of human action, not just its accidental instances.</html:p>
                        <html:p>The implication for aesthetics is that what makes a story powerful is its <fr:link href="/forest/cog-0002/" title="Structure as abstraction" uri="https://kream.codeberg.page/forest/cog-0002/" display-uri="cog-0002" type="local">structure</fr:link>, not its spectacle. Spectacle (opsis) is the least artistic element of tragedy — it produces immediate but shallow effects. Plot, by contrast, produces the deep effects of pity and fear that lead to catharsis.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:title text="Tragedy and modernism">Tragedy and modernism</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2021</fr:year>
                      <fr:month>4</fr:month>
                      <fr:day>25</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/lit-0004/</fr:uri>
                    <fr:display-uri>lit-0004</fr:display-uri>
                    <fr:route>/forest/lit-0004/</fr:route>
                    <fr:title text="On tragedy">On tragedy</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>These reflections extend Aristotle's theory of tragedy beyond its classical form, considering how the tragic structure manifests in different modes — high, common, and potentially "low."</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2021</fr:year>
                          <fr:month>4</fr:month>
                          <fr:day>25</fr:day>
                        </fr:date>
                        <fr:title text="High and common tragedy">High and common tragedy</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Classical tragedy (Sophocles' <html:em>Oedipus Rex</html:em>) features a hero pulled <html:em>upward</html:em> by fate — a noble figure whose greatness leads to catastrophe. The movement is vertical: from height to fall. Arthur Miller's <html:em>Death of a Salesman</html:em> introduces the <html:em>common man</html:em> as tragic hero. Here the forces are horizontal: Willy Loman is not pulled upward by destiny but <html:em>restrained</html:em> from moving by two opposing forces — his dreams and his reality. Miller and Aristotle overlap in their emphasis on structure, but they differ on the direction of tragic force.</html:p>
                        <html:p>A third mode might exist: a tragedy in which the hero is pulled <html:em>downward</html:em> — not a fall from height but a descent from the ordinary. This is the dynamic of Dante's <html:em>Inferno</html:em>, though Dante framed it as comedy. Without articulating this mode as tragedy, the essence of the tragic may remain incomplete — still bound to its substance rather than freed into pure form.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2021</fr:year>
                          <fr:month>4</fr:month>
                          <fr:day>25</fr:day>
                        </fr:date>
                        <fr:title text="Dignity and the tragic hero">Dignity and the tragic hero</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Dignity is the core of every tragic hero. Both Oedipus and Willy Loman make the same structural error: they carve their ideals directly onto their dignity, bypassing the protective buffer of mere pride. Oedipus's hubris makes him question whether ordinary human limitations apply to him. Willy builds a ceiling of the American Dream and tries to mend his dignity with it. In both cases, the hero exposes the most vulnerable part of themselves to forces that will destroy it.</html:p>
                        <html:p>Some unknowns are better left untouched. To reduce dignity — to subject it to logical scrutiny, to attempt to prove it — is fatal. The tragic hero is heroic precisely because they dare this exposure, and tragic precisely because it destroys them.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2021</fr:year>
                          <fr:month>4</fr:month>
                          <fr:day>25</fr:day>
                        </fr:date>
                        <fr:title text="Catharsis and the possibility of victory">Catharsis and the possibility of victory</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>The audience's experience of tragedy is not the hero's. The hero is trapped within the events; the audience can step back and see the whole. It is not the fear of the unknown that produces catharsis, but the pity for the known — the recognition that we understand more than the hero does about what is happening.</html:p>
                        <html:p>This distance is where optimism lives — not in the tragic character, but in the spectator's capacity to see, to understand, to feel. Catharsis is the purgation that comes from this recognition: the tragedy has played itself out, and we are still here, seeing more clearly than before.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2022</fr:year>
                      <fr:month>6</fr:month>
                      <fr:day>25</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/lit-0005/</fr:uri>
                    <fr:display-uri>lit-0005</fr:display-uri>
                    <fr:route>/forest/lit-0005/</fr:route>
                    <fr:title text="Stream of consciousness and modernism">Stream of consciousness and modernism</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Stream of consciousness writing shifts the focus of narrative from external events to internal experience — from what happens to what we <html:em>think about</html:em> what happens. As Robert McKee puts it in <html:em>Story</html:em>: "A storyteller is a life poet, an artist who transforms day-to-day living, inner life and outer life, dream and actuality into a poem whose rhyme scheme is events rather than words."</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2022</fr:year>
                          <fr:month>6</fr:month>
                          <fr:day>25</fr:day>
                        </fr:date>
                        <fr:title text="A new logic of connection">A new logic of connection</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>In traditional <fr:link href="/forest/lit-0004/" title="On tragedy" uri="https://kream.codeberg.page/forest/lit-0004/" display-uri="lit-0004" type="local">tragedy</fr:link>, events are connected by chronological sequence and causality. The modernist innovation, exemplified by Arthur Miller's <html:em>Death of a Salesman</html:em>, introduces a different connective logic: events are linked by <html:em>emotional flow</html:em> rather than temporal order. Scenes follow one another not because one caused the next, but because one provoked the memory of the next.</html:p>
                        <html:p>This mirrors how human cognition actually works. Thought is not linear; memory is not sequential. The past is retrieved not by orderly recall but by emotional resonance — a feeling in the present triggers a recollection from the past. In <html:em>Death of a Salesman</html:em>, the protagonist already inhabits an irreversible situation; the play's movement is not forward toward catastrophe but backward into the memories that led here.</html:p>
                        <html:p>The distortion of perceived time is a hallmark of modernist writing. The thinking process is nonlinear, and modernist form reflects this. Each scene and the next are connected not by "and then" but by "and this reminds me of" — the logic of association rather than causation.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2022</fr:year>
                          <fr:month>6</fr:month>
                          <fr:day>25</fr:day>
                        </fr:date>
                        <fr:title text="The past as the locus of meaning">The past as the locus of meaning</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>In the common-man tragedy, the past is where all apparent meaning resides. The past is always explicable through logic — "it never feels wrong" in retrospect. But this retrospective coherence is itself an illusion: a narrative imposed on events after the fact. The tragic force comes from the gap between the coherence of memory and the chaos of the present.</html:p>
                        <html:p>Camus's claim — "Suicide is the only serious philosophical question" (see <fr:link href="/forest/lit-0003/" title="Absurdism" uri="https://kream.codeberg.page/forest/lit-0003/" display-uri="lit-0003" type="local">absurdism</fr:link>) — hangs over the common-man tragedy. If the past is where meaning lives, and the present is void, then the question of whether to continue becomes inescapable. The modernist hero's answer is not Camus's absurd revolt but something more ambiguous: a compulsive return to memory, seeking the moment where everything went wrong.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2022</fr:year>
                          <fr:month>6</fr:month>
                          <fr:day>25</fr:day>
                        </fr:date>
                        <fr:title text="Symbolism and repetition">Symbolism and repetition</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Modernist tragedy relies on recurring symbols that connect scenes across time without causal links. In <html:em>Death of a Salesman</html:em>, stockings signify material comfort and guilt; the ceiling represents self-imposed limitations and denial of potential; characters embody different facets of Willy's psyche. Linda, the voice of reason, is constantly interrupted by Willy — logic is stifled by the emotional mentality. These repetitions create a structure of <html:em>rhyme</html:em> across the play, replacing the causal chain of classical plot with a pattern of resonance and return.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2022</fr:year>
                      <fr:month>6</fr:month>
                      <fr:day>25</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/lit-0003/</fr:uri>
                    <fr:display-uri>lit-0003</fr:display-uri>
                    <fr:route>/forest/lit-0003/</fr:route>
                    <fr:title text="Absurdism">Absurdism</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p><html:em>Absurdism</html:em> is the philosophical position that arises from the confrontation between the human need for meaning and the universe's indifference to that need. The term is most associated with Albert Camus, particularly his essay <html:em>The Myth of Sisyphus</html:em> (1942).</html:p>
                    <html:p>Absurdity, in Camus's usage, is not a property of the world alone or of the human mind alone, but of the <html:em>relation</html:em> between them. The world is not inherently meaningless — it is simply silent. The absurd arises because we insist on asking questions that the world refuses to answer.</html:p>
                    <html:p>Camus identifies three possible responses to the absurd:</html:p>
                    <html:ol><html:li><html:strong>Physical suicide</html:strong> — giving up entirely. This concedes that life without meaning is not worth living. Camus rejects this as a capitulation.</html:li>
  <html:li><html:strong>Philosophical suicide</html:strong> — a "leap of faith." This involves accepting a transcendent framework (religion, ideology) that supplies meaning from outside. Camus considers this intellectually dishonest — it evades the absurd rather than facing it. He targets Kierkegaard's leap in particular.</html:li>
  <html:li><html:strong>Revolt</html:strong> — continuing to live and search in full awareness that no ultimate meaning will be found. The absurd hero faces the absurd with lucidity and defiance. Sisyphus, condemned to roll his boulder up the hill for eternity, is Camus's image of this stance: "One must imagine Sisyphus happy."</html:li></html:ol>
                    <html:p>Absurdism is closely tied to <fr:link href="/forest/phil-0003/" title="Deconstructuralism" uri="https://kream.codeberg.page/forest/phil-0003/" display-uri="phil-0003" type="local">existentialism</fr:link> and to modernism more broadly. It provides the philosophical foundation for much modernist literature, which confronts the absence of inherent meaning while refusing to collapse into nihilism. The distinction between absurdism and nihilism is crucial: the nihilist accepts meaninglessness as the final word; the absurdist refuses this acceptance and keeps searching.</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:title text="Decadence and meaning">Decadence and meaning</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2021</fr:year>
                      <fr:month>12</fr:month>
                      <fr:day>13</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/lit-0006/</fr:uri>
                    <fr:display-uri>lit-0006</fr:display-uri>
                    <fr:route>/forest/lit-0006/</fr:route>
                    <fr:title text="Decadence and ennui">Decadence and ennui</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p><html:em>Decadence</html:em> is the condition of a materially prosperous yet spiritually void society. <html:em>Ennui</html:em> is the subjective experience of this void — a pervasive boredom and restlessness that no available pleasure can resolve. Together, they define a distinctly modern predicament.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2021</fr:year>
                          <fr:month>12</fr:month>
                          <fr:day>13</fr:day>
                        </fr:date>
                        <fr:title text="The modernist diagnosis">The modernist diagnosis</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>From a modernist perspective, we live surrounded by decadent pleasures that function as cover for an underlying <fr:link href="/forest/lit-0003/" title="Absurdism" uri="https://kream.codeberg.page/forest/lit-0003/" display-uri="lit-0003" type="local">absurdity</fr:link>. We use consumption, entertainment, and distraction not because they satisfy but because they prevent us from confronting the void beneath. The activity matters less than the fact of being occupied; the cover-up need not be substantial — only decorative.</html:p>
                        <html:p>This is the structure of the <fr:link href="/forest/cog-0005/" title="Two cycles: progression and stagnation" uri="https://kream.codeberg.page/forest/cog-0005/" display-uri="cog-0005" type="local">cycle of stagnation</fr:link>: a closed loop of fear, pain, and simple pleasure in which time does not advance. The modern subject cannot sit alone with their thoughts because the emptiness arrives too quickly. They must always be doing <html:em>something</html:em>, and the easier the better — effort is wasted on a cover-up.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2021</fr:year>
                          <fr:month>12</fr:month>
                          <fr:day>13</fr:day>
                        </fr:date>
                        <fr:title text="The asymptotic pursuit">The asymptotic pursuit</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>The answer to ennui is not the discovery of meaning (which would dissolve the problem) but the <html:em>pursuit</html:em> of meaning despite its permanent elusiveness. We know we cannot reach the truth, but this should not stop us from approaching it. Life is not meaningless — it is the chase. The structure of genuine human endeavour is asymptotic: always approaching, never arriving.</html:p>
                        <html:p>This echoes the absurdist's stance (Camus's third option: revolt) and the mathematical structure of the fixed point approached by <fr:link href="/forest/tt-0006/" title="The Y combinator" uri="https://kream.codeberg.page/forest/tt-0006/" display-uri="tt-0006" type="local">infinite iteration</fr:link>. The goal is not to arrive but to transform stagnation into <fr:link href="/forest/cog-0005/" title="Two cycles: progression and stagnation" uri="https://kream.codeberg.page/forest/cog-0005/" display-uri="cog-0005" type="local">progression</fr:link> — to add the tiny surplus at each pass that turns a circle into a spiral.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2021</fr:year>
                          <fr:month>12</fr:month>
                          <fr:day>13</fr:day>
                        </fr:date>
                        <fr:title text="Decadence in the postmodern">Decadence in the postmodern</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Decadence is specifically a <html:em>modern</html:em> phenomenon. The postmodern subject is differently situated: where the modern subject is paralysed by the absence of meaning, the postmodern subject can always manufacture new desires to fill the void. Consumer capitalism provides an inexhaustible supply of wants. This does not solve ennui but displaces it — from the existential plane (no meaning) to the economic plane (insufficient satisfaction). The modern subject suffers from analysis paralysis; the postmodern subject suffers from desire fatigue.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:title text="Planned links">Planned links</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:ul><html:li>Narratology and formalism — when trees exist</html:li>
    <html:li>Barthes's S/Z — structuralist literary analysis</html:li></html:ul>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
              </fr:author>
            </fr:authors>
            <fr:uri>https://kream.codeberg.page/forest/phil-0009/</fr:uri>
            <fr:display-uri>phil-0009</fr:display-uri>
            <fr:route>/forest/phil-0009/</fr:route>
            <fr:title text="Philosophy">Philosophy</fr:title>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Notes on philosophy.</html:p>
            <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>26</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/phil-000F/</fr:uri>
                <fr:display-uri>phil-000F</fr:display-uri>
                <fr:route>/forest/phil-000F/</fr:route>
                <fr:title text="Hegel with Mathematics">Hegel with Mathematics</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Resources for the category/topos theoretic interpretation of Hegel.</html:p>
                <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>1</fr:month>
                      <fr:day>11</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVSQ/</fr:uri>
                    <fr:display-uri>tt-AVSQ</fr:display-uri>
                    <fr:route>/forest/tt-AVSQ/</fr:route>
                    <fr:title text="Cohesive toposes and Lawvere's generic figures: towards a grand Hegelian geometric logic">Cohesive toposes and Lawvere's generic figures: towards a grand Hegelian geometric logic</fr:title>
                    <fr:meta name="draft">true</fr:meta>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Translation of the slides by <fr:link href="/forest/martin-gonzalez/" title="Martin Gonzalez" uri="https://kream.codeberg.page/forest/martin-gonzalez/" display-uri="martin-gonzalez" type="local">Martin Gonzalez</fr:link> for a talk at the <html:em>mamuphi</html:em> seminar, January 11, 2025. Original source: <fr:link href="/forest/gonzalez2025cohesive/" title="Cohesive toposes and Lawvere's generic figures: towards a grand Hegelian geometric logic" uri="https://kream.codeberg.page/forest/gonzalez2025cohesive/" display-uri="gonzalez2025cohesive" type="local">Cohesive toposes and Lawvere's generic figures: towards a grand Hegelian geometric logic</fr:link>.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2025</fr:year>
                          <fr:month>1</fr:month>
                          <fr:day>11</fr:day>
                        </fr:date>
                        <fr:title text="Outline">Outline</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:ol><html:li><html:strong>Review</html:strong>
      <html:ol><html:li>Adjoint triples, contradictions, and Aufhebung in Lawvere</html:li>
        <html:li>Graphs as a model of a (small) logic of a new kind</html:li>
        <html:li>A first obstruction and its philosophical relevance</html:li></html:ol></html:li>
    <html:li><html:strong>Graphs as a Grothendieck topos (à la Lawvere)</html:strong>
      <html:ol><html:li>Graphs as presheaves</html:li>
        <html:li>Topos-theoretic operations</html:li>
        <html:li>Subobject classifier</html:li></html:ol></html:li>
    <html:li><html:strong>Towards an axiomatics of cohesion — Grand Geometric Logic</html:strong>
      <html:ol><html:li>Obstruction of the topos of graphs to being a category of "Being"</html:li>
        <html:li>Towards a solution: reflexive graphs</html:li></html:ol></html:li></html:ol>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2025</fr:year>
                          <fr:month>1</fr:month>
                          <fr:day>11</fr:day>
                        </fr:date>
                        <fr:title text="Review">Review</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                              <fr:month>1</fr:month>
                              <fr:day>11</fr:day>
                            </fr:date>
                            <fr:title text="Dialectical relations: pairs of adjoint functors">Dialectical relations: pairs of adjoint functors</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>A pair of adjoint functors <fr:tex display="inline"><![CDATA[L \dashv  R]]></fr:tex>:</html:p>
                            <html:div style="text-align: center">
                              <fr:resource hash="f7372d7ef746f1ece62c5f6a0ba0704d">
                                <fr:resource-content>
                                  <html:img src="/forest/f7372d7ef746f1ece62c5f6a0ba0704d.svg" />
                                </fr:resource-content>
                                <fr:resource-source type="latex" part="preamble"><![CDATA[
      \usepackage {tikz-cd}
      \usepackage {mathrsfs}
      \usetikzlibrary {bending}
    ]]></fr:resource-source>
                                <fr:resource-source type="latex" part="body"><![CDATA[
      \begin {tikzcd}
        \mathscr {C} \arrow [r, shift right=2, "R"'] & \mathscr {D} \arrow [l, shift right=2, "L"'] \arrow [l, phantom, "\scriptstyle \bot "]
      \end {tikzcd}
    ]]></fr:resource-source>
                              </fr:resource>
                            </html:div>
                            <html:p>Dialecticized opposition between two terms by means of a third term — adjoint triples <fr:tex display="inline"><![CDATA[L \dashv  c \dashv  R]]></fr:tex>:</html:p>
                            <html:div style="text-align: center">
                              <fr:resource hash="bf53ec3e1c094ac0f3c1fdf876e3f8eb">
                                <fr:resource-content>
                                  <html:img src="/forest/bf53ec3e1c094ac0f3c1fdf876e3f8eb.svg" />
                                </fr:resource-content>
                                <fr:resource-source type="latex" part="preamble"><![CDATA[
      \usepackage {tikz-cd}
      \usepackage {mathrsfs}
      \usetikzlibrary {bending}
    ]]></fr:resource-source>
                                <fr:resource-source type="latex" part="body"><![CDATA[
      \begin {tikzcd}
        \mathscr {C} \arrow [r, "c" description] & \mathscr {D} \arrow [l, shift left=5, "L"] \arrow [l, shift right=5, "R"'] \arrow [l, shift left=2, phantom, "\scriptstyle \bot "] \arrow [l, shift right=2, phantom, "\scriptstyle \bot "]
      \end {tikzcd}
    ]]></fr:resource-source>
                              </fr:resource>
                            </html:div>
                            <html:p><fr:tex display="inline"><![CDATA[L]]></fr:tex> and <fr:tex display="inline"><![CDATA[R]]></fr:tex> include <fr:tex display="inline"><![CDATA[\mathscr {D}]]></fr:tex> into <fr:tex display="inline"><![CDATA[\mathscr {C}]]></fr:tex> in a manner that is at once identical and opposed, much like the way a circle inscribes itself into the two ends of a cylinder. This is formalized by the condition</html:p>
                            <fr:tex display="block"><![CDATA[c \circ  L \simeq  \mathrm {Id}_{\mathscr {D}} \simeq  c \circ  R.]]></fr:tex>
                            <html:p>Such an adjoint triple is called a <html:strong>unity and identity of adjoint opposites</html:strong> (UIAO).</html:p>
                            <fr:tree show-metadata="false">
                              <fr:frontmatter>
                                <fr:authors>
                                  <fr:author>
                                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                                  </fr:author>
                                </fr:authors>
                                <fr:date>
                                  <fr:year>2025</fr:year>
                                  <fr:month>1</fr:month>
                                  <fr:day>11</fr:day>
                                </fr:date>
                                <fr:title text="Contradictions at work">Contradictions at work</fr:title>
                              </fr:frontmatter>
                              <fr:mainmatter>
                                <html:p>Contradictions are concentrated on the endofunctors <fr:tex display="inline"><![CDATA[L \circ  c]]></fr:tex> and <fr:tex display="inline"><![CDATA[R \circ  c]]></fr:tex> of <fr:tex display="inline"><![CDATA[\mathscr {C}]]></fr:tex>, which are in adjunction position:</html:p>
                                <html:div style="text-align: center">
                                  <fr:resource hash="9ac0a7a7aba2c294f5e74600166b38ea">
                                    <fr:resource-content>
                                      <html:img src="/forest/9ac0a7a7aba2c294f5e74600166b38ea.svg" />
                                    </fr:resource-content>
                                    <fr:resource-source type="latex" part="preamble"><![CDATA[
        \usepackage {tikz-cd}
        \usepackage {mathrsfs}
        \usetikzlibrary {bending}
      ]]></fr:resource-source>
                                    <fr:resource-source type="latex" part="body"><![CDATA[
        \begin {tikzcd}
          \mathscr {C} \arrow [r, shift right=2, "R \circ  c"'] & \mathscr {C} \arrow [l, shift right=2, "L \circ  c"'] \arrow [l, phantom, "\scriptstyle \bot "]
        \end {tikzcd}
      ]]></fr:resource-source>
                                  </fr:resource>
                                </html:div>
                                <html:p>Finally, "resolution of contradictions" — <html:strong>Aufhebung</html:strong> — as the movement that transforms a UIAO situation into a configuration where this UIAO is factored through an intermediate category, the whole taking the form of a sequence of two UIAOs involving this newly introduced category.</html:p>
                                <html:p>One passes from a single UIAO to a factored configuration:</html:p>
                                <html:div style="text-align: center">
                                  <fr:resource hash="f222663bd4d57ef57249650c3876209f">
                                    <fr:resource-content>
                                      <html:img src="/forest/f222663bd4d57ef57249650c3876209f.svg" />
                                    </fr:resource-content>
                                    <fr:resource-source type="latex" part="preamble"><![CDATA[
        \usepackage {tikz-cd}
        \usepackage {mathrsfs}
        \usetikzlibrary {bending}
      ]]></fr:resource-source>
                                    <fr:resource-source type="latex" part="body"><![CDATA[
        \begin {tikzcd}
          \mathscr {C} \arrow [r, "c_2" description] & \mathscr {B} \arrow [l, shift left=5, "r_2"] \arrow [l, shift right=5, "l_2"'] \arrow [l, shift left=2, phantom, "\scriptstyle \bot "] \arrow [l, shift right=2, phantom, "\scriptstyle \bot "] \arrow [r, "c_1" description] & \mathscr {D} \arrow [l, shift left=5, "r_1"] \arrow [l, shift right=5, "l_1"'] \arrow [l, shift left=2, phantom, "\scriptstyle \bot "] \arrow [l, shift right=2, phantom, "\scriptstyle \bot "]
        \end {tikzcd}
      ]]></fr:resource-source>
                                  </fr:resource>
                                </html:div>
                                <html:p>with adjoint triples <fr:tex display="inline"><![CDATA[r_2 \dashv  c_2 \dashv  l_2]]></fr:tex> and <fr:tex display="inline"><![CDATA[r_1 \dashv  c_1 \dashv  l_1]]></fr:tex>. In total: a first <html:strong>figure of dialectical oppositions</html:strong>.</html:p>
                              </fr:mainmatter>
                            </fr:tree>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                              <fr:month>1</fr:month>
                              <fr:day>11</fr:day>
                            </fr:date>
                            <fr:title text="Directed multigraphs">Directed multigraphs</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>A <html:strong>directed multigraph</html:strong> is given by <fr:tex display="inline"><![CDATA[G = (G_0, G_1)]]></fr:tex> with <fr:tex display="inline"><![CDATA[G_0]]></fr:tex> as the set of vertices and <fr:tex display="inline"><![CDATA[G_1]]></fr:tex> as the set of directed edges.</html:p>
                            <html:p>A <html:strong>subgraph</html:strong> <fr:tex display="inline"><![CDATA[X = (X_0, X_1)]]></fr:tex> of <fr:tex display="inline"><![CDATA[G]]></fr:tex> consists of subsets of vertices and edges such that if an edge is in <fr:tex display="inline"><![CDATA[X_1]]></fr:tex> then its endpoints are in <fr:tex display="inline"><![CDATA[X_0]]></fr:tex>.</html:p>
                            <html:p>The <html:strong>boundary</html:strong> of <fr:tex display="inline"><![CDATA[X]]></fr:tex>: vertices of <fr:tex display="inline"><![CDATA[X]]></fr:tex> that are endpoints of an edge whose other endpoint is not in <fr:tex display="inline"><![CDATA[X_0]]></fr:tex>.</html:p>
                            <html:p>Given a subgraph <fr:tex display="inline"><![CDATA[X]]></fr:tex>, the set-theoretic complement <fr:tex display="inline"><![CDATA[G - X]]></fr:tex> is in general <html:em>not</html:em> a graph (it may contain edges whose endpoints are missing). Hence two complements:</html:p>
                            <html:ul><html:li><fr:tex display="inline"><![CDATA[\neg  X]]></fr:tex> — the largest subgraph disjoint from <fr:tex display="inline"><![CDATA[X]]></fr:tex> (<html:strong>Heyting negation</html:strong>)</html:li>
      <html:li><fr:tex display="inline"><![CDATA[\sim  X]]></fr:tex> — the smallest subgraph whose union with <fr:tex display="inline"><![CDATA[X]]></fr:tex> gives <fr:tex display="inline"><![CDATA[G]]></fr:tex> (<html:strong>co-Heyting negation</html:strong>)</html:li></html:ul>
                            <html:p>The boundary of <fr:tex display="inline"><![CDATA[X]]></fr:tex> is <fr:tex display="inline"><![CDATA[\partial  X = X \cap  {\sim }X]]></fr:tex>.</html:p>
                            <html:p>In total: a model for two types of non-classical negations such that <fr:tex display="inline"><![CDATA[a \wedge  \neg  a = 0]]></fr:tex> (<fr:tex display="inline"><![CDATA[a]]></fr:tex> and <fr:tex display="inline"><![CDATA[\neg  a]]></fr:tex> cannot both be true) and <fr:tex display="inline"><![CDATA[a \vee  {\sim }a = 1]]></fr:tex> (<fr:tex display="inline"><![CDATA[a]]></fr:tex> and <fr:tex display="inline"><![CDATA[\sim  a]]></fr:tex> cannot both be false).</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                              <fr:month>1</fr:month>
                              <fr:day>11</fr:day>
                            </fr:date>
                            <fr:title text="Properties of the two negations">Properties of the two negations</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:ul><html:li><fr:tex display="inline"><![CDATA[X \cup  \neg  X \neq  G]]></fr:tex> in general — <fr:tex display="inline"><![CDATA[\neg ]]></fr:tex> does not satisfy the <html:strong>law of excluded middle</html:strong>.</html:li>
      <html:li><fr:tex display="inline"><![CDATA[X \cap  \neg  X = \varnothing ]]></fr:tex> — <fr:tex display="inline"><![CDATA[\neg ]]></fr:tex> satisfies the <html:strong>law of non-contradiction</html:strong>.</html:li>
      <html:li><fr:tex display="inline"><![CDATA[X \cup  {\sim }X = G]]></fr:tex> — <fr:tex display="inline"><![CDATA[\sim ]]></fr:tex> satisfies the <html:strong>law of excluded middle</html:strong>.</html:li>
      <html:li><fr:tex display="inline"><![CDATA[X \cap  {\sim }X = \partial  X \neq  \varnothing ]]></fr:tex> in general — <fr:tex display="inline"><![CDATA[\sim ]]></fr:tex> does not satisfy the <html:strong>law of non-contradiction</html:strong>.</html:li></html:ul>
                            <html:p>This reflects the fact that the set of subgraphs of <fr:tex display="inline"><![CDATA[G]]></fr:tex> has the structure of a <html:strong>bi-Heyting algebra</html:strong>. The Heyting negation is stronger than the co-Heyting negation in that we always have <fr:tex display="inline"><![CDATA[\neg  X \leqslant  {\sim }X]]></fr:tex>.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                              <fr:month>1</fr:month>
                              <fr:day>11</fr:day>
                            </fr:date>
                            <fr:title text="The impasse of double negations">The impasse of double negations</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>The work of the double negations <fr:tex display="inline"><![CDATA[\neg \neg ]]></fr:tex> and <fr:tex display="inline"><![CDATA[\sim \sim ]]></fr:tex> yields:</html:p>
                            <html:ul><html:li><fr:tex display="inline"><![CDATA[\neg \neg  X]]></fr:tex> incorporates edges that <fr:tex display="inline"><![CDATA[X]]></fr:tex> excluded, while <fr:tex display="inline"><![CDATA[\sim \sim  X]]></fr:tex> discards vertices on the boundary.</html:li>
      <html:li><html:strong>Reversal of forces</html:strong>: the negativity of <fr:tex display="inline"><![CDATA[\sim \sim  X]]></fr:tex> is stronger than that of <fr:tex display="inline"><![CDATA[\neg \neg  X]]></fr:tex>.</html:li>
      <html:li>Neither of these two subgraphs is well-complemented.</html:li>
      <html:li>The renewal process produces nothing new: <fr:tex display="inline"><![CDATA[\neg \neg (\neg \neg  X) = \neg \neg  X]]></fr:tex> and <fr:tex display="inline"><![CDATA[{\sim }{\sim }({\sim }{\sim }X) = {\sim }{\sim }X]]></fr:tex>.</html:li></html:ul>
                            <html:p><html:strong>Obstruction of possibility</html:strong>: these operators cannot affirm in their otherness the very essence of what they negate. For <fr:tex display="inline"><![CDATA[\neg ]]></fr:tex>, every object of the form</html:p>
                            <fr:tex display="block"><![CDATA[G - (\neg \neg (\neg \neg (\ldots (\neg \neg  X))))]]></fr:tex>
                            <html:p>is not a graph, regardless of the length of the chain of double negations.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                              <fr:month>1</fr:month>
                              <fr:day>11</fr:day>
                            </fr:date>
                            <fr:title text="Doubled negations">Doubled negations</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>To advance this affirmative dialectic of negations towards the constitution of complementary graphs, the idea is to:</html:p>
                            <html:ul><html:li>Return to our work <html:em>on boundaries</html:em> and intertwine the two negations in two ways, <fr:tex display="inline"><![CDATA[\neg \sim ]]></fr:tex> and <fr:tex display="inline"><![CDATA[\sim \neg ]]></fr:tex>, yielding two new <html:strong>mixed negations</html:strong>.</html:li>
      <html:li>Resume our work <html:em>on iterations</html:em> and chain these mixed negations so that they result in two new <html:strong>doubled negations</html:strong>.</html:li></html:ul>
                            <html:p>Starting from <fr:tex display="inline"><![CDATA[\Box _0 = \blacklozenge _0 = \mathrm {Id}]]></fr:tex> and as long as our base objects are not well-complemented, we define:</html:p>
                            <fr:tex display="block"><![CDATA[\Box _n := \neg {\sim }\Box _{n-1}, \qquad  \blacklozenge _n := {\sim }\neg \blacklozenge _{n-1}.]]></fr:tex>
                            <html:p>When we land on a well-complemented object, we stop. The <html:em>doubled negations</html:em> are the iterations "at rest": <fr:tex display="inline"><![CDATA[\Box  := \Box _n]]></fr:tex> and <fr:tex display="inline"><![CDATA[\blacklozenge  := \blacklozenge _n]]></fr:tex>.</html:p>
                            <html:p>
                              <html:strong>Maintenance of the reversal of force:</html:strong>
                            </html:p>
                            <fr:tex display="block"><![CDATA[\neg {\sim }X \subseteq  {\sim }{\sim }X \subseteq  X \subseteq  \neg \neg  X \subseteq  {\sim }\neg  X]]></fr:tex>
                            <fr:tree show-metadata="false">
                              <fr:frontmatter>
                                <fr:authors>
                                  <fr:author>
                                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                                  </fr:author>
                                </fr:authors>
                                <fr:date>
                                  <fr:year>2025</fr:year>
                                  <fr:month>1</fr:month>
                                  <fr:day>11</fr:day>
                                </fr:date>
                                <fr:title text="Example on graphs">Example on graphs</fr:title>
                              </fr:frontmatter>
                              <fr:mainmatter>
                                <html:p>The first step gives <fr:tex display="inline"><![CDATA[\Box _1 X \subset  X \subset  \blacklozenge _1 X]]></fr:tex>. The graphs <fr:tex display="inline"><![CDATA[\Box _1 X]]></fr:tex> and <fr:tex display="inline"><![CDATA[\blacklozenge _1 X]]></fr:tex> still not being well-complemented, we continue:</html:p>
                                <fr:tex display="block"><![CDATA[\Box _2 X \subset  \Box _1 X \subset  X \subset  \blacklozenge _1 X \subset  \blacklozenge _2 X]]></fr:tex>
                                <html:p>We observe that <fr:tex display="inline"><![CDATA[\blacklozenge _2 X]]></fr:tex> and <fr:tex display="inline"><![CDATA[\Box _2 X]]></fr:tex> no longer have a boundary and are therefore well-complemented. The recursion stops and the two new subgraphs are obtained:</html:p>
                                <html:ul><html:li><fr:tex display="inline"><![CDATA[\blacklozenge  X]]></fr:tex>: the smallest well-complemented subgraph such that <fr:tex display="inline"><![CDATA[X \subseteq  \blacklozenge  X]]></fr:tex> — the <html:strong>possibility</html:strong> of <fr:tex display="inline"><![CDATA[X]]></fr:tex>. It consists of the elements of <fr:tex display="inline"><![CDATA[G]]></fr:tex> that are <html:strong>accessible by</html:strong> <fr:tex display="inline"><![CDATA[X]]></fr:tex>.</html:li>
        <html:li><fr:tex display="inline"><![CDATA[\Box  X]]></fr:tex>: the largest well-complemented subgraph such that <fr:tex display="inline"><![CDATA[\Box  X \subseteq  X]]></fr:tex> — the <html:strong>necessity</html:strong> of <fr:tex display="inline"><![CDATA[X]]></fr:tex> (Lawvere). It consists of the elements of <fr:tex display="inline"><![CDATA[X]]></fr:tex> that are <html:strong>not accessible from the exterior</html:strong> of <fr:tex display="inline"><![CDATA[X]]></fr:tex>.</html:li></html:ul>
                              </fr:mainmatter>
                            </fr:tree>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                              <fr:month>1</fr:month>
                              <fr:day>11</fr:day>
                            </fr:date>
                            <fr:title text="A first obstruction of philosophical relevance">A first obstruction of philosophical relevance</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>The doubled negations <fr:tex display="inline"><![CDATA[\Box ]]></fr:tex> and <fr:tex display="inline"><![CDATA[\blacklozenge ]]></fr:tex> are not functorial, i.e. they <html:strong>do not satisfy</html:strong></html:p>
                            <fr:tex display="block"><![CDATA[f^*(\blacklozenge  A) = \blacklozenge  f^*(A), \qquad  f^*(\Box  A) = \Box  f^*(A)]]></fr:tex>
                            <html:p>where <fr:tex display="inline"><![CDATA[f]]></fr:tex> is a morphism of graphs. For example, if we take <fr:tex display="inline"><![CDATA[f \colon  X = \{\bullet _a \;\; \bullet _b\} \hookrightarrow  Y = \{\bullet _a \rightarrow  \bullet _b\}]]></fr:tex>, then:</html:p>
                            <html:ul><html:li>The subgraph <fr:tex display="inline"><![CDATA[\{\bullet _a\}]]></fr:tex> is not well-complemented in <fr:tex display="inline"><![CDATA[Y]]></fr:tex>, so <fr:tex display="inline"><![CDATA[\blacklozenge \{\bullet _a\} = Y]]></fr:tex> and hence <fr:tex display="inline"><![CDATA[f^*\blacklozenge \{\bullet _a\} = X]]></fr:tex>.</html:li>
      <html:li><fr:tex display="inline"><![CDATA[f^*(\{\bullet _a\}) = \{\bullet _a\}]]></fr:tex> is well-complemented in <fr:tex display="inline"><![CDATA[X]]></fr:tex>, so <fr:tex display="inline"><![CDATA[\blacklozenge  f^*(\{\bullet _a\}) = \{\bullet _a\}]]></fr:tex>.</html:li></html:ul>
                            <html:p>In total, a strict inclusion <fr:tex display="inline"><![CDATA[\blacklozenge  f^*(\{\bullet _a\}) \subset  f^*\blacklozenge \{\bullet _a\}]]></fr:tex>.</html:p>
                            <html:p>At bottom: the co-Heyting negation <fr:tex display="inline"><![CDATA[{\sim }_X \colon  \mathrm {Sub}_{\mathscr {E}}(X) \rightarrow  \mathrm {Sub}_{\mathscr {E}}(X)]]></fr:tex> does not define a functor <fr:tex display="inline"><![CDATA[X \mapsto  {\sim }_X]]></fr:tex>.</html:p>
                            <html:p><html:strong>Mathematical corollary</html:strong>: in every Grothendieck topos <fr:tex display="inline"><![CDATA[\mathscr {E}]]></fr:tex>, there is no morphism <fr:tex display="inline"><![CDATA[{\sim }_{\mathscr {E}} \colon  \Omega  \rightarrow  \Omega ]]></fr:tex> making its subobject classifier into a bi-Heyting algebra. On the other hand, <fr:tex display="inline"><![CDATA[\mathrm {Sub}_{\mathscr {E}}(X)]]></fr:tex> is one for every <fr:tex display="inline"><![CDATA[X]]></fr:tex>!</html:p>
                            <fr:tree show-metadata="false">
                              <fr:frontmatter>
                                <fr:authors>
                                  <fr:author>
                                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                                  </fr:author>
                                </fr:authors>
                                <fr:date>
                                  <fr:year>2025</fr:year>
                                  <fr:month>1</fr:month>
                                  <fr:day>11</fr:day>
                                </fr:date>
                                <fr:title text="Towards a resolution of this obstruction">Towards a resolution of this obstruction</fr:title>
                              </fr:frontmatter>
                              <fr:mainmatter>
                                <html:p>We have two <html:em>non-functorial</html:em> morphisms <fr:tex display="inline"><![CDATA[\blacklozenge , \Box  \colon  \mathrm {Sub}_{\mathscr {E}}(X) \rightarrow  \mathrm {Sub}_{\mathscr {E}}(X)]]></fr:tex> with characteristic properties:</html:p>
                                <fr:tex display="block"><![CDATA[\Box  \leqslant  \mathrm {Id} \leqslant  \blacklozenge , \qquad  \Box ^2 = \Box , \quad  \blacklozenge ^2 = \blacklozenge , \qquad  \blacklozenge  \dashv  \Box ]]></fr:tex>
                                <html:p>...satisfied by the <html:em>functors</html:em> of adjoint modalities that Lawvere had defined for Aufhebung!</html:p>
                                <html:p>The adjoint modalities arising from the factored UIAOs:</html:p>
                                <fr:tex display="block"><![CDATA[(\blacklozenge _2, \Box _2) := (l_2 c_2,\; r_2 c_2)]]></fr:tex>
                                <fr:tex display="block"><![CDATA[(\blacklozenge _1, \Box _1) := (l_2 l_1 c_1 c_2,\; r_2 r_1 c_1 c_2)]]></fr:tex>
                                <html:p>As with every obstruction, we face a <html:strong>decision</html:strong>:</html:p>
                                <html:ul><html:li>Either we abandon the functoriality (and centrality) of our mixed negation operators <fr:tex display="inline"><![CDATA[\Box ]]></fr:tex> and <fr:tex display="inline"><![CDATA[\blacklozenge ]]></fr:tex>.</html:li>
        <html:li>Or we abandon their universality, and thus make <fr:tex display="inline"><![CDATA[\Box ]]></fr:tex> and <fr:tex display="inline"><![CDATA[\blacklozenge ]]></fr:tex> operators that always play out between two categories, one playing the role of <html:em>rest</html:em>, and the other being a theater of <html:em>change</html:em>.</html:li></html:ul>
                              </fr:mainmatter>
                            </fr:tree>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2025</fr:year>
                          <fr:month>1</fr:month>
                          <fr:day>11</fr:day>
                        </fr:date>
                        <fr:title text="Graphs as a Grothendieck topos (à la Lawvere)">Graphs as a Grothendieck topos (à la Lawvere)</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                              <fr:month>1</fr:month>
                              <fr:day>11</fr:day>
                            </fr:date>
                            <fr:title text="Return to Lawvere">Return to Lawvere</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>To characterize the Hegelian enterprise, Lawvere opts for the second path: it is indispensable to identify the <html:em>particularity</html:em> of the topos of graphs.</html:p>
                            <html:blockquote><html:p>We associate a well-defined distributive lattice which is itself a standard map and which can be considered as consisting of refined "dimensions" in that it parametrizes all ranks in a Hegelian analysis of the topos of all maps; through this distributive lattice, there is a well-defined ascending sequence, obtained by the Hegelian process of "resolution of a unity of opposites by the next one"; the length of this sequence is the geometric dimension of the arrangement in our many examples.</html:p>

      <html:p>What is particularly striking is that the Hegelian analysis of every topos turns out to involve graphic monoids which are in fact bicategories. [...] Although proposed nearly 200 years ago, the Hegelian method of analysis has been largely underused since then; "conflictual" ideological claims according to which it is incoherent, or that it is too marvelously fluid to be made mathematical, have conspired to prevent its teaching on a large scale. We believe that we have demonstrated, by modest examples, that it is coherent (and non-trivial) and that a great part of the method should be made mathematical, which would help those who want to seriously use it, even the part that remains fluid.</html:p>

      <html:p>— Lawvere, <html:em>Display of graphics and their applications, as exemplified by 2-categories and the Hegelian "taco"</html:em> (1989)</html:p></html:blockquote>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                              <fr:month>1</fr:month>
                              <fr:day>11</fr:day>
                            </fr:date>
                            <fr:title text="Relationship between Lawvere and Badiou on Hegel">Relationship between Lawvere and Badiou on Hegel</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>In opposite directions!</html:p>
                            <html:blockquote>
                              <html:p>"The 'historical' companion of the present book is Hegel, thinker par excellence of the dialectical correlation between being and being-there, between essence and existence. It is his <html:em>Science of Logic</html:em> against which we here measure ourselves." (LdM p.110)</html:p>
                            </html:blockquote>
                            <html:blockquote>
                              <html:p>"<html:em>Logiques des mondes</html:em> is to <html:em>L'Être et l'événement</html:em> what Hegel's <html:em>Phenomenology of Spirit</html:em> is to his <html:em>Science of Logic</html:em>, and this, even though the chronological orders are reversed: an immanent grasp of the data of being-there, a local traversal of the figures of the true and of the subject, and not a deductive analytic of the forms of being." (LdM p.16)</html:p>
                            </html:blockquote>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                              <fr:month>1</fr:month>
                              <fr:day>11</fr:day>
                            </fr:date>
                            <fr:title text="Graphs as presheaves">Graphs as presheaves</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:blockquote><html:p>The thesis is that the explicit and adequate development of the science of knowledge will necessitate the use of the mathematical theory of categories. Even from within mathematical experience, only this theory has approached a <html:em>particular</html:em> model of the general, sufficient as a foundation for a <html:em>general</html:em> explanation of all particulars. Born 50 years ago from the needs of geometry, category theory has developed notions such as adjoint functor, topos, fibration, closed category, 2-category, etc., in order to provide:</html:p>

      <html:p>(1) A guide for the complex, but highly non-arbitrary, constructions of concepts and their interactions that arise from the study of space and quantity.</html:p>

      <html:p>It is only the relentless adherence to the needs of this basic subject that has made category theory so well-determined and yet so powerful. [...] If we replace "space and quantity" in (1) above with "every serious object of study", then (1) becomes my working definition of <html:em>objective logic</html:em>.</html:p>

      <html:p>— Lawvere, <html:em>Tools for the advancement of Objective Logic: Closed Categories and Toposes</html:em> (1994)</html:p></html:blockquote>
                            <html:p><html:em>Lawvere's guiding thread</html:em>: introduce the Grothendieck topos <fr:tex display="inline"><![CDATA[\mathbf {Graphs}]]></fr:tex> as a presheaf category <fr:tex display="inline"><![CDATA[\mathrm {PSh}(\mathscr {C})]]></fr:tex> by taking <fr:tex display="inline"><![CDATA[\mathscr {C}]]></fr:tex> to be the simplest possible category so that:</html:p>
                            <html:ul><html:li>Every graph can be thought of as a "receptacle", and realized by gluings from objects of <fr:tex display="inline"><![CDATA[\mathscr {C}]]></fr:tex>, objects which will accordingly be called <html:strong>"generic figures"</html:strong>.</html:li>
      <html:li>The Grothendieck topologies do not play a determining role for the understanding.</html:li></html:ul>
                            <html:p>(We consider, for a small category <fr:tex display="inline"><![CDATA[\mathscr {C}]]></fr:tex>, the category <fr:tex display="inline"><![CDATA[\mathrm {PSh}(\mathscr {C})]]></fr:tex> of contravariant functors <fr:tex display="inline"><![CDATA[\mathscr {C}^{\mathrm {op}} \rightarrow  \mathbf {Sets}]]></fr:tex> and natural transformations between them.)</html:p>
                            <fr:tree show-metadata="false">
                              <fr:frontmatter>
                                <fr:authors>
                                  <fr:author>
                                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                                  </fr:author>
                                </fr:authors>
                                <fr:date>
                                  <fr:year>2025</fr:year>
                                  <fr:month>1</fr:month>
                                  <fr:day>11</fr:day>
                                </fr:date>
                                <fr:title text="Preliminary heuristic">Preliminary heuristic</fr:title>
                              </fr:frontmatter>
                              <fr:mainmatter>
                                <html:p>Suppose that every graph can be obtained by various gluings of two <html:em>generic figures</html:em> which are the <html:strong>point</html:strong> <fr:tex display="inline"><![CDATA[V]]></fr:tex> and the <html:strong>arrow</html:strong> <fr:tex display="inline"><![CDATA[A]]></fr:tex>:</html:p>
                                <fr:tex display="block"><![CDATA[ V = \boxed {\bullet } \qquad \qquad  A = \boxed {\bullet  \longrightarrow  \bullet } ]]></fr:tex>
                                <html:p>Thus, in a graph <fr:tex display="inline"><![CDATA[G]]></fr:tex>, the "figures of type <fr:tex display="inline"><![CDATA[A]]></fr:tex>" are nothing other than the arrows in <fr:tex display="inline"><![CDATA[G]]></fr:tex>.</html:p>
                                <html:p>Consider an example graph <fr:tex display="inline"><![CDATA[X]]></fr:tex> with 5 <fr:tex display="inline"><![CDATA[V]]></fr:tex>-figures (<fr:tex display="inline"><![CDATA[a, b, c, d, e]]></fr:tex>) and 5 <fr:tex display="inline"><![CDATA[A]]></fr:tex>-figures (<fr:tex display="inline"><![CDATA[\alpha , \beta , \gamma , \delta , \varepsilon ]]></fr:tex>). We <html:em>extract</html:em> sources and targets of arrows via <html:strong>right actions</html:strong>:</html:p>
                                <html:ul><html:li><fr:tex display="inline"><![CDATA[\alpha .s = a]]></fr:tex> reads "the source of <fr:tex display="inline"><![CDATA[\alpha ]]></fr:tex> is <fr:tex display="inline"><![CDATA[a]]></fr:tex>"</html:li>
        <html:li><fr:tex display="inline"><![CDATA[\alpha .t]]></fr:tex> reads "the target of <fr:tex display="inline"><![CDATA[\alpha ]]></fr:tex>"</html:li></html:ul>
                                <html:p>The "gluing plan" follows <html:strong>incidence relations</html:strong> — right actions by <fr:tex display="inline"><![CDATA[s]]></fr:tex> and <fr:tex display="inline"><![CDATA[t]]></fr:tex>:</html:p>
                                <fr:tex display="block"><![CDATA[\alpha .s = \beta .s = \gamma .t = a]]></fr:tex>
                                <fr:tex display="block"><![CDATA[\alpha .t = \beta .t = \gamma .s = \delta .s = \delta .t = b]]></fr:tex>
                                <fr:tex display="block"><![CDATA[\varepsilon .s = d, \qquad  \varepsilon .t = e]]></fr:tex>
                                <html:div style="text-align: center">
                                  <fr:resource hash="5d6702bdc5a293566db69a0918e1c530">
                                    <fr:resource-content>
                                      <html:img src="/forest/5d6702bdc5a293566db69a0918e1c530.svg" />
                                    </fr:resource-content>
                                    <fr:resource-source type="latex" part="preamble"><![CDATA[
        \usepackage {tikz}
        \usetikzlibrary {arrows.meta, bending}
      ]]></fr:resource-source>
                                    <fr:resource-source type="latex" part="body"><![CDATA[
        \begin {tikzpicture}[>={Stealth[length=5pt]}, every node/.style={font=\small }, vertex/.style={circle, fill, inner sep=1.5pt}]
          \node [vertex, label=left:{$a$}] (a) at (0,0) {};
          \node [vertex, label=right:{$b$}] (b) at (2.5,0) {};
          \node [vertex, label=below:{$c$}] (c) at (1.25,-1.5) {};
          \node [vertex, label=left:{$d$}] (d) at (4.5,0) {};
          \node [vertex, label=right:{$e$}] (e) at (6.5,0) {};
          \draw [->] (a) to[bend left=20] node[above] {$\alpha $} (b);
          \draw [->] (a) to[bend right=20] node[below] {$\beta $} (b);
          \draw [->] (b) to[bend left=40] node[above] {$\gamma $} (a);
          \draw [->] (b) to[loop right, looseness=8] node[right] {$\delta $} (b);
          \draw [->] (d) to node[above] {$\varepsilon $} (e);
        \end {tikzpicture}
      ]]></fr:resource-source>
                                  </fr:resource>
                                </html:div>
                              </fr:mainmatter>
                            </fr:tree>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                              <fr:month>1</fr:month>
                              <fr:day>11</fr:day>
                            </fr:date>
                            <fr:title text="Construction of \mathscr {C}">Construction of <fr:tex display="inline"><![CDATA[\mathscr {C}]]></fr:tex></fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Every graph consists of a set <fr:tex display="inline"><![CDATA[V]]></fr:tex> of vertices and <fr:tex display="inline"><![CDATA[A]]></fr:tex> of arrows. Take <fr:tex display="inline"><![CDATA[\mathscr {C}]]></fr:tex> with exactly two objects, <fr:tex display="inline"><![CDATA[V]]></fr:tex> and <fr:tex display="inline"><![CDATA[A]]></fr:tex>, one for each "type" of figure. The extraction <fr:tex display="inline"><![CDATA[s]]></fr:tex> of the source and <fr:tex display="inline"><![CDATA[t]]></fr:tex> of the target of an arrow determines two functions <fr:tex display="inline"><![CDATA[A \rightarrow  V]]></fr:tex>. In <fr:tex display="inline"><![CDATA[\mathscr {C}]]></fr:tex>, the non-trivial arrows are <fr:tex display="inline"><![CDATA[s, t \colon  V \rightarrow  A]]></fr:tex> — the direction is reversed because we seek to characterize graphs as <html:strong>contravariant</html:strong> functors.</html:p>
                            <html:p>In total, the category <fr:tex display="inline"><![CDATA[\mathbf {Graphs}]]></fr:tex> of graphs identifies with the category of presheaves on:</html:p>
                            <html:div style="text-align: center">
                              <fr:resource hash="c24344cdd5cb379ae7bc0b8117b28663">
                                <fr:resource-content>
                                  <html:img src="/forest/c24344cdd5cb379ae7bc0b8117b28663.svg" />
                                </fr:resource-content>
                                <fr:resource-source type="latex" part="preamble"><![CDATA[
      \usepackage {tikz-cd}
      \usepackage {mathrsfs}
      \usetikzlibrary {bending}
    ]]></fr:resource-source>
                                <fr:resource-source type="latex" part="body"><![CDATA[
      \begin {tikzcd}
        V \arrow [r, shift left, "s"] \arrow [r, shift right, "t"'] \arrow [loop left, "\mathrm {id}_V"] & A \arrow [loop right, "\mathrm {id}_A"]
      \end {tikzcd}
    ]]></fr:resource-source>
                              </fr:resource>
                            </html:div>
                            <html:p>The generic figures for <fr:tex display="inline"><![CDATA[\mathbf {Graphs}]]></fr:tex> are <fr:tex display="inline"><![CDATA[V = \boxed {\bullet }]]></fr:tex> (point) and <fr:tex display="inline"><![CDATA[A = \boxed {\bullet  \longrightarrow  \bullet }]]></fr:tex> (arrow).</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                              <fr:month>1</fr:month>
                              <fr:day>11</fr:day>
                            </fr:date>
                            <fr:title text="Gluings and incidence relations">Gluings and incidence relations</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>The gluings of generic figures translate into the <html:strong>commutativity of diagrams</html:strong>. A figure <fr:tex display="inline"><![CDATA[\alpha  \colon  A \dashrightarrow  X]]></fr:tex> has source and target determined by:</html:p>
                            <html:div style="text-align: center">
                              <fr:resource hash="473c298694d2387c09aaf63b2f3d297a">
                                <fr:resource-content>
                                  <html:img src="/forest/473c298694d2387c09aaf63b2f3d297a.svg" />
                                </fr:resource-content>
                                <fr:resource-source type="latex" part="preamble"><![CDATA[
      \usepackage {tikz-cd}
      \usepackage {mathrsfs}
      \usetikzlibrary {bending}
    ]]></fr:resource-source>
                                <fr:resource-source type="latex" part="body"><![CDATA[
      \begin {tikzcd}
        A \arrow [r, dashed, "\alpha "] & X & & A \arrow [r, dashed, "\alpha "] & X \\
        V \arrow [u, "s"] \arrow [ur, "{\alpha .s = a}"'] & & & V \arrow [u, "t"'] \arrow [ur, "{\alpha .t = b}"']
      \end {tikzcd}
    ]]></fr:resource-source>
                              </fr:resource>
                            </html:div>
                            <html:p><html:strong>Notation</html:strong>: <fr:tex display="inline"><![CDATA[\sigma  \colon  F \dashrightarrow  X]]></fr:tex>, for <fr:tex display="inline"><![CDATA[F = V, A]]></fr:tex> a generic figure of <fr:tex display="inline"><![CDATA[\mathscr {C}]]></fr:tex>, means "extraction of an <fr:tex display="inline"><![CDATA[F]]></fr:tex>-figure of <fr:tex display="inline"><![CDATA[X]]></fr:tex>" or equivalently "<fr:tex display="inline"><![CDATA[\sigma  \in _F X]]></fr:tex>". Dotted arrows because <fr:tex display="inline"><![CDATA[V]]></fr:tex>, <fr:tex display="inline"><![CDATA[A]]></fr:tex> are objects of <fr:tex display="inline"><![CDATA[\mathscr {C}]]></fr:tex> while the "graph" <fr:tex display="inline"><![CDATA[X]]></fr:tex> is an object of <fr:tex display="inline"><![CDATA[\mathrm {PSh}(\mathscr {C})]]></fr:tex>.</html:p>
                            <fr:tree show-metadata="false">
                              <fr:frontmatter>
                                <fr:authors>
                                  <fr:author>
                                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                                  </fr:author>
                                </fr:authors>
                                <fr:date>
                                  <fr:year>2025</fr:year>
                                  <fr:month>1</fr:month>
                                  <fr:day>11</fr:day>
                                </fr:date>
                                <fr:title text="Yoneda version">Yoneda version</fr:title>
                              </fr:frontmatter>
                              <fr:mainmatter>
                                <html:p>By Yoneda, the dotted arrows express presheaf morphisms:</html:p>
                                <html:div style="text-align: center">
                                  <fr:resource hash="8a74353c165d1b6a42ad54135ae07a7b">
                                    <fr:resource-content>
                                      <html:img src="/forest/8a74353c165d1b6a42ad54135ae07a7b.svg" />
                                    </fr:resource-content>
                                    <fr:resource-source type="latex" part="preamble"><![CDATA[
        \usepackage {tikz-cd}
        \usepackage {mathrsfs}
        \usetikzlibrary {bending}
      ]]></fr:resource-source>
                                    <fr:resource-source type="latex" part="body"><![CDATA[
        \begin {tikzcd}
          h_A \arrow [r, "\alpha "] & X & & h_A \arrow [r, "\alpha "] & X \\
          h_V \arrow [u, "h_s"] \arrow [ur, "a"'] & & & h_V \arrow [u, "h_t"'] \arrow [ur, "b"']
        \end {tikzcd}
      ]]></fr:resource-source>
                                  </fr:resource>
                                </html:div>
                                <html:p><html:strong>Intuition</html:strong>: <fr:tex display="inline"><![CDATA[\sigma ]]></fr:tex> belongs to the <html:em>receptacle</html:em> at level <fr:tex display="inline"><![CDATA[F]]></fr:tex> in the "<fr:tex display="inline"><![CDATA[\mathscr {C}]]></fr:tex>-set <fr:tex display="inline"><![CDATA[X]]></fr:tex>".</html:p>
                                <html:p>The "presheaf" viewpoint for a graph <fr:tex display="inline"><![CDATA[X]]></fr:tex> consists of thinking of it as a "receptacle" at two levels (one for <fr:tex display="inline"><![CDATA[V]]></fr:tex> and another for <fr:tex display="inline"><![CDATA[A]]></fr:tex>):</html:p>
                                <fr:tex display="block"><![CDATA[\frac {V \dashrightarrow  X}{a, b, c, d, e} \qquad  \frac {A \dashrightarrow  X}{\alpha , \beta , \gamma , \delta , \varepsilon } \qquad  + \text { commutative diagrams}]]></fr:tex>
                              </fr:mainmatter>
                            </fr:tree>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                              <fr:month>1</fr:month>
                              <fr:day>11</fr:day>
                            </fr:date>
                            <fr:title text="Three viewpoints summarized">Three viewpoints summarized</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Three equivalent viewpoints on a graph <fr:tex display="inline"><![CDATA[X]]></fr:tex>:</html:p>
                            <html:ul><html:li><html:strong>Graphically</html:strong>: <fr:tex display="inline"><![CDATA[X]]></fr:tex> as a picture with vertices and edges.</html:li>
      <html:li><html:strong>Algebraically</html:strong>: <fr:tex display="inline"><![CDATA[X_1 \rightrightarrows  X_0]]></fr:tex> via <fr:tex display="inline"><![CDATA[u, v]]></fr:tex>, with <fr:tex display="inline"><![CDATA[X_1 = \{\alpha , \beta , \gamma , \delta , \varepsilon \}]]></fr:tex>, <fr:tex display="inline"><![CDATA[X_0 = \{a,b,c,d,e\}]]></fr:tex>, plus incidence relations.</html:li>
      <html:li><html:strong>Categorically</html:strong>: <fr:tex display="inline"><![CDATA[V \rightrightarrows  A]]></fr:tex> via <fr:tex display="inline"><![CDATA[s, t]]></fr:tex>, with <fr:tex display="inline"><![CDATA[V]]></fr:tex>-figures and <fr:tex display="inline"><![CDATA[A]]></fr:tex>-figures (<fr:tex display="inline"><![CDATA[V \dashrightarrow  X]]></fr:tex> and <fr:tex display="inline"><![CDATA[A \dashrightarrow  X]]></fr:tex>), plus commutative diagrams.</html:li></html:ul>
                            <html:p><html:strong>Gluing plans</html:strong>: commutative diagrams that allow one to completely reconstruct a graph:</html:p>
                            <html:p><html:strong>Composable pair</html:strong> <fr:tex display="inline"><![CDATA[\bullet  \xrightarrow {x} \bullet  \xrightarrow {y} \bullet ]]></fr:tex>: two <fr:tex display="inline"><![CDATA[A]]></fr:tex>-figures sharing a vertex, with relation <fr:tex display="inline"><![CDATA[x \circ  t = y \circ  s]]></fr:tex>.</html:p>
                            <html:div style="text-align: center">
                              <fr:resource hash="18e5af92a3a6fdcbe891a75b776a2042">
                                <fr:resource-content>
                                  <html:img src="/forest/18e5af92a3a6fdcbe891a75b776a2042.svg" />
                                </fr:resource-content>
                                <fr:resource-source type="latex" part="preamble"><![CDATA[
      \usepackage {tikz-cd}
      \usepackage {mathrsfs}
      \usetikzlibrary {bending}
    ]]></fr:resource-source>
                                <fr:resource-source type="latex" part="body"><![CDATA[
      \begin {tikzcd}
        & h_V \arrow [dl, "x \circ  t"'] \arrow [dr, "y \circ  s"] & \\
        h_A \arrow [dr, "x"'] & & h_A \arrow [dl, "y"] \\
        & X &
      \end {tikzcd}
    ]]></fr:resource-source>
                              </fr:resource>
                            </html:div>
                            <html:p><html:strong>Parallel pair</html:strong> <fr:tex display="inline"><![CDATA[\bullet  \xrightarrow {x} \bullet ]]></fr:tex>, <fr:tex display="inline"><![CDATA[\bullet  \xrightarrow {y} \bullet ]]></fr:tex> (disjoint): two <fr:tex display="inline"><![CDATA[A]]></fr:tex>-figures with no shared vertex, no relations.</html:p>
                            <html:p><html:strong>Loop</html:strong> <fr:tex display="inline"><![CDATA[\bullet  \circlearrowleft ^{x}]]></fr:tex>: one <fr:tex display="inline"><![CDATA[A]]></fr:tex>-figure whose source equals its target, with relation <fr:tex display="inline"><![CDATA[x \circ  s = x \circ  t]]></fr:tex>.</html:p>
                            <html:div style="text-align: center">
                              <fr:resource hash="491b36e4a60004475f897996dd31df5b">
                                <fr:resource-content>
                                  <html:img src="/forest/491b36e4a60004475f897996dd31df5b.svg" />
                                </fr:resource-content>
                                <fr:resource-source type="latex" part="preamble"><![CDATA[
      \usepackage {tikz-cd}
      \usepackage {mathrsfs}
      \usetikzlibrary {bending}
    ]]></fr:resource-source>
                                <fr:resource-source type="latex" part="body"><![CDATA[
      \begin {tikzcd}
        h_V \arrow [r, "x \circ  s"] \arrow [r, "x \circ  t"'] & X \\
        h_A \arrow [u, "s"] \arrow [u, "t"'] \arrow [ur, "x"'] &
      \end {tikzcd}
    ]]></fr:resource-source>
                              </fr:resource>
                            </html:div>
                            <html:p><html:strong>Span with common target</html:strong> <fr:tex display="inline"><![CDATA[\bullet  \overset {x}{\underset {y}{\rightrightarrows }} \bullet  \xrightarrow {z} \bullet ]]></fr:tex>: three <fr:tex display="inline"><![CDATA[A]]></fr:tex>-figures with relations <fr:tex display="inline"><![CDATA[x \circ  t = y \circ  s]]></fr:tex>, <fr:tex display="inline"><![CDATA[x \circ  s = z \circ  s]]></fr:tex>, <fr:tex display="inline"><![CDATA[y \circ  t = z \circ  t]]></fr:tex>.</html:p>
                            <html:p>The gluing plans are in fact <html:strong>colimits</html:strong>: neither too much nor too little information to construct every graph. In particular, making the loop a generic figure gives a different category from <fr:tex display="inline"><![CDATA[\mathbf {Graphs}]]></fr:tex>.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                              <fr:month>1</fr:month>
                              <fr:day>11</fr:day>
                            </fr:date>
                            <fr:title text="From presheaves back to graphs">From presheaves back to graphs</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Lawvere: inversely, one determines the graph underlying a presheaf <fr:tex display="inline"><![CDATA[X]]></fr:tex> as follows:</html:p>
                            <html:ol><html:li>Distribute the receptacle <fr:tex display="inline"><![CDATA[X]]></fr:tex> across two levels, one for each generic figure <fr:tex display="inline"><![CDATA[V]]></fr:tex> and <fr:tex display="inline"><![CDATA[A]]></fr:tex>.</html:li>
      <html:li>For each level, count the number of existing morphisms in <fr:tex display="inline"><![CDATA[\mathscr {C}]]></fr:tex> with target <fr:tex display="inline"><![CDATA[V]]></fr:tex> then <fr:tex display="inline"><![CDATA[A]]></fr:tex>.</html:li>
      <html:li>For each morphism of <fr:tex display="inline"><![CDATA[A]]></fr:tex>-figures counted, look at the action it defines.</html:li></html:ol>
                            <html:p>Recall: <fr:tex display="inline"><![CDATA[h_V]]></fr:tex> is the presheaf image of <fr:tex display="inline"><![CDATA[V]]></fr:tex> under the <html:strong>Yoneda embedding</html:strong> <fr:tex display="inline"><![CDATA[\mathscr {C} \rightarrow  \mathrm {PSh}(\mathscr {C});\; F \mapsto  h_F = \mathrm {Hom}_{\mathscr {C}}(-, F)]]></fr:tex>.</html:p>
                            <fr:tree show-metadata="false">
                              <fr:frontmatter>
                                <fr:authors>
                                  <fr:author>
                                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                                  </fr:author>
                                </fr:authors>
                                <fr:date>
                                  <fr:year>2025</fr:year>
                                  <fr:month>1</fr:month>
                                  <fr:day>11</fr:day>
                                </fr:date>
                                <fr:title text="Example: h_V">Example: <fr:tex display="inline"><![CDATA[h_V]]></fr:tex></fr:title>
                              </fr:frontmatter>
                              <fr:mainmatter>
                                <html:p>A single morphism <fr:tex display="inline"><![CDATA[V \rightarrow  V]]></fr:tex> (the identity) and no morphism <fr:tex display="inline"><![CDATA[A \rightarrow  V]]></fr:tex>. The identity expresses the trivial action. The graph of <fr:tex display="inline"><![CDATA[h_V]]></fr:tex> thus consists of one <fr:tex display="inline"><![CDATA[V]]></fr:tex>-figure and zero <fr:tex display="inline"><![CDATA[A]]></fr:tex>-figures:</html:p>
                                <fr:tex display="block"><![CDATA[ h_V = \boxed {\bullet } ]]></fr:tex>
                              </fr:mainmatter>
                            </fr:tree>
                            <fr:tree show-metadata="false">
                              <fr:frontmatter>
                                <fr:authors>
                                  <fr:author>
                                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                                  </fr:author>
                                </fr:authors>
                                <fr:date>
                                  <fr:year>2025</fr:year>
                                  <fr:month>1</fr:month>
                                  <fr:day>11</fr:day>
                                </fr:date>
                                <fr:title text="Example: h_A">Example: <fr:tex display="inline"><![CDATA[h_A]]></fr:tex></fr:title>
                              </fr:frontmatter>
                              <fr:mainmatter>
                                <html:p>Two morphisms <fr:tex display="inline"><![CDATA[V \rightarrow  A]]></fr:tex> (<fr:tex display="inline"><![CDATA[s]]></fr:tex> and <fr:tex display="inline"><![CDATA[t]]></fr:tex>) and one morphism <fr:tex display="inline"><![CDATA[A \rightarrow  A]]></fr:tex> (the identity). The identity expresses the action <fr:tex display="inline"><![CDATA[\mathrm {id}_A.s = s]]></fr:tex> and <fr:tex display="inline"><![CDATA[\mathrm {id}_A.t = t]]></fr:tex>. The graph of <fr:tex display="inline"><![CDATA[h_A]]></fr:tex> consists of two <fr:tex display="inline"><![CDATA[V]]></fr:tex>-figures and one <fr:tex display="inline"><![CDATA[A]]></fr:tex>-figure:</html:p>
                                <fr:tex display="block"><![CDATA[ h_A = \boxed {\bullet  \longrightarrow  \bullet } ]]></fr:tex>
                                <html:p>There are exactly two non-trivial presheaf morphisms: <fr:tex display="inline"><![CDATA[h_s, h_t \colon  h_V \rightarrow  h_A]]></fr:tex>.</html:p>
                              </fr:mainmatter>
                            </fr:tree>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                              <fr:month>1</fr:month>
                              <fr:day>11</fr:day>
                            </fr:date>
                            <fr:title text="Topos-theoretic operations">Topos-theoretic operations</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Guiding thread: determine limits (terminal object, product, equalizer, inverse image, pullback) and colimits (initial object, coproduct, coequalizer, direct image, pushout) directly by counting generic figures and finding the right gluing plan.</html:p>
                            <fr:tree show-metadata="false">
                              <fr:frontmatter>
                                <fr:authors>
                                  <fr:author>
                                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                                  </fr:author>
                                </fr:authors>
                                <fr:date>
                                  <fr:year>2025</fr:year>
                                  <fr:month>1</fr:month>
                                  <fr:day>11</fr:day>
                                </fr:date>
                                <fr:title text="Terminal object">Terminal object</fr:title>
                              </fr:frontmatter>
                              <fr:mainmatter>
                                <html:p>The terminal object <fr:tex display="inline"><![CDATA[\mathbf {1}]]></fr:tex> is the <fr:tex display="inline"><![CDATA[\mathscr {C}]]></fr:tex>-set having exactly one <fr:tex display="inline"><![CDATA[F]]></fr:tex>-figure for each generic figure <fr:tex display="inline"><![CDATA[F]]></fr:tex> (here <fr:tex display="inline"><![CDATA[F = V, A]]></fr:tex>), with the trivial action. Immediately:</html:p>
                                <html:ul><html:li>For every <fr:tex display="inline"><![CDATA[\mathscr {C}]]></fr:tex>-set <fr:tex display="inline"><![CDATA[X]]></fr:tex>, there is a unique morphism <fr:tex display="inline"><![CDATA[X \rightarrow  \mathbf {1}]]></fr:tex>.</html:li>
        <html:li>The terminal graph is the loop: a single vertex with a single loop.</html:li></html:ul>
                              </fr:mainmatter>
                            </fr:tree>
                            <fr:tree show-metadata="false">
                              <fr:frontmatter>
                                <fr:authors>
                                  <fr:author>
                                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                                  </fr:author>
                                </fr:authors>
                                <fr:date>
                                  <fr:year>2025</fr:year>
                                  <fr:month>1</fr:month>
                                  <fr:day>11</fr:day>
                                </fr:date>
                                <fr:title text="Products">Products</fr:title>
                              </fr:frontmatter>
                              <fr:mainmatter>
                                <html:p>The product <fr:tex display="inline"><![CDATA[X \times  Y]]></fr:tex> of two <fr:tex display="inline"><![CDATA[\mathscr {C}]]></fr:tex>-sets <fr:tex display="inline"><![CDATA[X]]></fr:tex> and <fr:tex display="inline"><![CDATA[Y]]></fr:tex> is the <fr:tex display="inline"><![CDATA[\mathscr {C}]]></fr:tex>-set whose <fr:tex display="inline"><![CDATA[F]]></fr:tex>-figures are pairs <fr:tex display="inline"><![CDATA[(\sigma , \tau )]]></fr:tex>, where <fr:tex display="inline"><![CDATA[\sigma ]]></fr:tex> (resp. <fr:tex display="inline"><![CDATA[\tau ]]></fr:tex>) is an <fr:tex display="inline"><![CDATA[F]]></fr:tex>-figure of <fr:tex display="inline"><![CDATA[X]]></fr:tex> (resp. <fr:tex display="inline"><![CDATA[Y]]></fr:tex>), with the action</html:p>
                                <fr:tex display="block"><![CDATA[(\sigma , \tau ) \cdot  f = (\sigma  \cdot _X f,\; \tau  \cdot _Y f)]]></fr:tex>
                                <html:p><html:strong>Example</html:strong>: the product <fr:tex display="inline"><![CDATA[h_A \times  h_A]]></fr:tex> has 4 <fr:tex display="inline"><![CDATA[V]]></fr:tex>-figures (the pairs <fr:tex display="inline"><![CDATA[(s,s), (s,t), (t,s), (t,t)]]></fr:tex>) and 1 <fr:tex display="inline"><![CDATA[A]]></fr:tex>-figure (the pair <fr:tex display="inline"><![CDATA[(\mathrm {id}_A, \mathrm {id}_A)]]></fr:tex>). The sole arrow has source <fr:tex display="inline"><![CDATA[(s,s)]]></fr:tex> and target <fr:tex display="inline"><![CDATA[(t,t)]]></fr:tex>.</html:p>
                                <html:p>Incidence relations: denoting <fr:tex display="inline"><![CDATA[s]]></fr:tex> and <fr:tex display="inline"><![CDATA[t]]></fr:tex> the two <fr:tex display="inline"><![CDATA[V]]></fr:tex>-figures of <fr:tex display="inline"><![CDATA[h_A]]></fr:tex>, we obtain the product graph with one arrow from <fr:tex display="inline"><![CDATA[(s,s)]]></fr:tex> to <fr:tex display="inline"><![CDATA[(t,t)]]></fr:tex> and two isolated vertices <fr:tex display="inline"><![CDATA[(s,t)]]></fr:tex> and <fr:tex display="inline"><![CDATA[(t,s)]]></fr:tex>:</html:p>
                                <html:div style="text-align: center">
                                  <fr:resource hash="2da24f85167b0ebeda420a45335615fa">
                                    <fr:resource-content>
                                      <html:img src="/forest/2da24f85167b0ebeda420a45335615fa.svg" />
                                    </fr:resource-content>
                                    <fr:resource-source type="latex" part="preamble"><![CDATA[
        \usepackage {tikz}
        \usetikzlibrary {arrows.meta}
      ]]></fr:resource-source>
                                    <fr:resource-source type="latex" part="body"><![CDATA[
        \begin {tikzpicture}[>={Stealth[length=5pt]}, every node/.style={font=\small }, vertex/.style={circle, fill, inner sep=1.5pt}]
          \node [vertex, label=below left:{$(s{,}s)$}] (ss) at (0,0) {};
          \node [vertex, label=below right:{$(t{,}s)$}] (ts) at (2.5,0) {};
          \node [vertex, label=above left:{$(s{,}t)$}] (st) at (0,2) {};
          \node [vertex, label=above right:{$(t{,}t)$}] (tt) at (2.5,2) {};
          \draw [->] (ss) -- (tt);
        \end {tikzpicture}
      ]]></fr:resource-source>
                                  </fr:resource>
                                </html:div>
                              </fr:mainmatter>
                            </fr:tree>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                              <fr:month>1</fr:month>
                              <fr:day>11</fr:day>
                            </fr:date>
                            <fr:title text="The subobject classifier \Omega  as a graph">The subobject classifier <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> as a graph</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <fr:tree show-metadata="false">
                              <fr:frontmatter>
                                <fr:authors>
                                  <fr:author>
                                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                                  </fr:author>
                                </fr:authors>
                                <fr:date>
                                  <fr:year>2025</fr:year>
                                  <fr:month>1</fr:month>
                                  <fr:day>11</fr:day>
                                </fr:date>
                                <fr:title text="Subgraphs">Subgraphs</fr:title>
                              </fr:frontmatter>
                              <fr:mainmatter>
                                <html:p>A <html:strong>sub-presheaf</html:strong> <fr:tex display="inline"><![CDATA[Y]]></fr:tex> of the presheaf <fr:tex display="inline"><![CDATA[X]]></fr:tex> is a sub-family closed under the right action of <fr:tex display="inline"><![CDATA[\mathscr {C}]]></fr:tex>. With <fr:tex display="inline"><![CDATA[\mathscr {C} = \mathrm {id}_V \circlearrowleft  V \rightrightarrows  A \circlearrowright  \mathrm {id}_A]]></fr:tex>, being closed under the right action reads: if <fr:tex display="inline"><![CDATA[\sigma ]]></fr:tex> is an <fr:tex display="inline"><![CDATA[A]]></fr:tex>-figure of <fr:tex display="inline"><![CDATA[Y]]></fr:tex>, then the results of the two actions <fr:tex display="inline"><![CDATA[\sigma .{_X s}]]></fr:tex> and <fr:tex display="inline"><![CDATA[\sigma .{_X t}]]></fr:tex> are <fr:tex display="inline"><![CDATA[V]]></fr:tex>-figures of <fr:tex display="inline"><![CDATA[Y]]></fr:tex>. In other words, if <fr:tex display="inline"><![CDATA[\sigma ]]></fr:tex> is an arrow of <fr:tex display="inline"><![CDATA[Y]]></fr:tex> then its two endpoint vertices are also in <fr:tex display="inline"><![CDATA[Y]]></fr:tex>.</html:p>
                                <html:p>We very naturally recover the definition of subgraph.</html:p>
                              </fr:mainmatter>
                            </fr:tree>
                            <fr:tree show-metadata="false">
                              <fr:frontmatter>
                                <fr:authors>
                                  <fr:author>
                                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                                  </fr:author>
                                </fr:authors>
                                <fr:date>
                                  <fr:year>2025</fr:year>
                                  <fr:month>1</fr:month>
                                  <fr:day>11</fr:day>
                                </fr:date>
                                <fr:title text="Construction of \Omega ">Construction of <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex></fr:title>
                              </fr:frontmatter>
                              <fr:mainmatter>
                                <html:p>Assume the existence of the subobject classifier <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> for <fr:tex display="inline"><![CDATA[\mathbf {Graphs}]]></fr:tex> viewed as <fr:tex display="inline"><![CDATA[\mathrm {PSh}(\mathscr {C})]]></fr:tex>. This object classifies the subobjects of a given object <fr:tex display="inline"><![CDATA[X]]></fr:tex> via the bijection</html:p>
                                <fr:tex display="block"><![CDATA[\frac {\phi  \colon  X \rightarrow  \Omega }{Y \hookrightarrow  X}]]></fr:tex>
                                <html:p>In the case where the morphism <fr:tex display="inline"><![CDATA[\phi ]]></fr:tex> is given, the property that <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> classifies the subobjects of <fr:tex display="inline"><![CDATA[X]]></fr:tex> translates as:</html:p>
                                <html:ul><html:li><fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> possesses a truth value <fr:tex display="inline"><![CDATA[\top _F]]></fr:tex> for each generic figure <fr:tex display="inline"><![CDATA[F = V, A]]></fr:tex>.</html:li>
        <html:li><fr:tex display="inline"><![CDATA[\phi ]]></fr:tex> (and hence <fr:tex display="inline"><![CDATA[Y]]></fr:tex>) is completely determined by the <fr:tex display="inline"><![CDATA[F]]></fr:tex>-figures that are sent to the corresponding truth values <fr:tex display="inline"><![CDATA[\top _F]]></fr:tex>.</html:li></html:ul>
                                <html:p>The <html:strong>figures of <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex></html:strong> consist of all subgraphs of <fr:tex display="inline"><![CDATA[h_V]]></fr:tex> and <fr:tex display="inline"><![CDATA[h_A]]></fr:tex>.</html:p>
                                <html:p>For <fr:tex display="inline"><![CDATA[h_V = \boxed {\bullet }]]></fr:tex>, there are two subgraphs:</html:p>
                                <html:div style="text-align: center">
                                  <fr:resource hash="da876c4be4807d0c1c728b6ced6f67f2">
                                    <fr:resource-content>
                                      <html:img src="/forest/da876c4be4807d0c1c728b6ced6f67f2.svg" />
                                    </fr:resource-content>
                                    <fr:resource-source type="latex" part="preamble"><![CDATA[
        \usepackage {tikz}
        \usetikzlibrary {arrows.meta}
      ]]></fr:resource-source>
                                    <fr:resource-source type="latex" part="body"><![CDATA[
        \begin {tikzpicture}[>={Stealth[length=5pt]}, every node/.style={font=\small }, vertex/.style={circle, fill, inner sep=1.5pt}, box/.style={draw, minimum width=1.2cm, minimum height=1cm}]
          \node [box, label=below:{$\bot _V$}] (bv) at (0,0) {};
          \node  at (2,0) {$<$};
          \node [box, label=below:{$\top _V$}] (tv) at (4,0) {};
          \node [vertex] at (4,0) {};
        \end {tikzpicture}
      ]]></fr:resource-source>
                                  </fr:resource>
                                </html:div>
                                <html:p>For <fr:tex display="inline"><![CDATA[h_A = \boxed {\bullet  \rightarrow  \bullet }]]></fr:tex>, there are five subgraphs, ordered by inclusion:</html:p>
                                <html:div style="text-align: center">
                                  <fr:resource hash="6df1c0bbdd4ffb25674a0e6264ad925f">
                                    <fr:resource-content>
                                      <html:img src="/forest/6df1c0bbdd4ffb25674a0e6264ad925f.svg" />
                                    </fr:resource-content>
                                    <fr:resource-source type="latex" part="preamble"><![CDATA[
        \usepackage {tikz}
        \usetikzlibrary {arrows.meta}
      ]]></fr:resource-source>
                                    <fr:resource-source type="latex" part="body"><![CDATA[
        \begin {tikzpicture}[>={Stealth[length=5pt]}, every node/.style={font=\small }, vertex/.style={circle, fill, inner sep=1.5pt}, box/.style={draw, minimum width=1.6cm, minimum height=1cm}]
          \node [box, label=below:{$\bot _A$}] (ba) at (0,0) {};
          \node [box, label=below:{$\top _s$}] (ts) at (3,0) {};
          \node [vertex, label=right:{$s$}] at (3,0) {};
          \node [box, label=below:{$\top _t$}] (tt) at (6,0) {};
          \node [vertex, label=right:{$t$}] at (6,0) {};
          \node [box, label=below:{$t_A$}] (ta) at (9,0) {};
          \node [vertex] (ta-s) at (8.5,0) {};
          \node [vertex] (ta-t) at (9.5,0) {};
          \node  at (8.5, -0.3) {$s$};
          \node  at (9.5, -0.3) {$t$};
          \node [box, minimum width=2cm, label=below:{$\top _A$}] (tA) at (12.5,0) {};
          \node [vertex] (tA-s) at (12,0) {};
          \node [vertex] (tA-t) at (13,0) {};
          \draw [->] (tA-s) -- (tA-t);
          \node  at (12, -0.3) {$s$};
          \node  at (13, -0.3) {$t$};
        \end {tikzpicture}
      ]]></fr:resource-source>
                                  </fr:resource>
                                </html:div>
                                <html:p>In total: two <fr:tex display="inline"><![CDATA[V]]></fr:tex>-figures of <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> (the vertices <fr:tex display="inline"><![CDATA[\bot _V]]></fr:tex> and <fr:tex display="inline"><![CDATA[\top _V]]></fr:tex>) and five <fr:tex display="inline"><![CDATA[A]]></fr:tex>-figures (the arrows <fr:tex display="inline"><![CDATA[\bot _A, \top _s, \top _t, t_A, \top _A]]></fr:tex>). The partial order is given by the Hasse diagram of subgraph inclusion.</html:p>
                              </fr:mainmatter>
                            </fr:tree>
                            <fr:tree show-metadata="false">
                              <fr:frontmatter>
                                <fr:authors>
                                  <fr:author>
                                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                                  </fr:author>
                                </fr:authors>
                                <fr:date>
                                  <fr:year>2025</fr:year>
                                  <fr:month>1</fr:month>
                                  <fr:day>11</fr:day>
                                </fr:date>
                                <fr:title text="Incidence relations for \Omega ">Incidence relations for <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex></fr:title>
                              </fr:frontmatter>
                              <fr:mainmatter>
                                <html:p>Sources and targets (from among <fr:tex display="inline"><![CDATA[\bot _V, \top _V]]></fr:tex>) of the arrows (from among <fr:tex display="inline"><![CDATA[\bot _A, \top _s, \top _t, t_A, \top _A]]></fr:tex>) are given by right actions, determined by "inverse image" via <fr:tex display="inline"><![CDATA[h_s, h_t \colon  h_V \rightarrow  h_A]]></fr:tex>. For each <fr:tex display="inline"><![CDATA[A]]></fr:tex>-figure <fr:tex display="inline"><![CDATA[P]]></fr:tex> of <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> (i.e. each subgraph of <fr:tex display="inline"><![CDATA[h_A]]></fr:tex>), we compute <fr:tex display="inline"><![CDATA[P.s = h_s^*(P)]]></fr:tex> and <fr:tex display="inline"><![CDATA[P.t = h_t^*(P)]]></fr:tex> as pullbacks:</html:p>
                                <html:div style="text-align: center">
                                  <fr:resource hash="2c5432e890d6aec50e8d699ddbb377b8">
                                    <fr:resource-content>
                                      <html:img src="/forest/2c5432e890d6aec50e8d699ddbb377b8.svg" />
                                    </fr:resource-content>
                                    <fr:resource-source type="latex" part="preamble"><![CDATA[
        \usepackage {tikz-cd}
        \usepackage {mathrsfs}
        \usetikzlibrary {bending}
      ]]></fr:resource-source>
                                    <fr:resource-source type="latex" part="body"><![CDATA[
        \begin {tikzcd}
          h_s^*(P) \arrow [r, hook] \arrow [d] & P \arrow [d, hook] & & h_t^*(P) \arrow [r, hook] \arrow [d] & P \arrow [d, hook] \\
          h_V \arrow [r, "h_s"'] & h_A & & h_V \arrow [r, "h_t"'] & h_A
        \end {tikzcd}
      ]]></fr:resource-source>
                                  </fr:resource>
                                </html:div>
                                <html:p>Since <fr:tex display="inline"><![CDATA[h_V = \boxed {\bullet }]]></fr:tex> has a single vertex, <fr:tex display="inline"><![CDATA[h_s^*(P)]]></fr:tex> is either <fr:tex display="inline"><![CDATA[\top _V]]></fr:tex> (if <fr:tex display="inline"><![CDATA[h_s]]></fr:tex> lands inside <fr:tex display="inline"><![CDATA[P]]></fr:tex>) or <fr:tex display="inline"><![CDATA[\bot _V]]></fr:tex> (if it does not). Recall that <fr:tex display="inline"><![CDATA[h_s]]></fr:tex> sends the sole vertex of <fr:tex display="inline"><![CDATA[h_V]]></fr:tex> to the vertex <fr:tex display="inline"><![CDATA[s]]></fr:tex> of <fr:tex display="inline"><![CDATA[h_A]]></fr:tex>, and <fr:tex display="inline"><![CDATA[h_t]]></fr:tex> sends it to <fr:tex display="inline"><![CDATA[t]]></fr:tex>.</html:p>
                                <html:ul><html:li>For <fr:tex display="inline"><![CDATA[P = \bot _A]]></fr:tex>: <fr:tex display="inline"><![CDATA[P]]></fr:tex> is empty, so <fr:tex display="inline"><![CDATA[h_s^*(P) = h_t^*(P) = \bot _V]]></fr:tex>. A <html:strong>loop based at <fr:tex display="inline"><![CDATA[\bot _V]]></fr:tex></html:strong>.</html:li>
        <html:li>For <fr:tex display="inline"><![CDATA[P = \top _A = h_A]]></fr:tex>: <fr:tex display="inline"><![CDATA[P]]></fr:tex> contains both <fr:tex display="inline"><![CDATA[s]]></fr:tex> and <fr:tex display="inline"><![CDATA[t]]></fr:tex>, so <fr:tex display="inline"><![CDATA[h_s^*(P) = h_t^*(P) = \top _V]]></fr:tex>. A <html:strong>loop based at <fr:tex display="inline"><![CDATA[\top _V]]></fr:tex></html:strong>.</html:li>
        <html:li>For <fr:tex display="inline"><![CDATA[P = \top _s]]></fr:tex>: <fr:tex display="inline"><![CDATA[P]]></fr:tex> contains only <fr:tex display="inline"><![CDATA[s]]></fr:tex>. Then <fr:tex display="inline"><![CDATA[h_s]]></fr:tex> lands in <fr:tex display="inline"><![CDATA[P]]></fr:tex> (at <fr:tex display="inline"><![CDATA[s]]></fr:tex>), so <fr:tex display="inline"><![CDATA[h_s^*(P) = \top _V]]></fr:tex>. But <fr:tex display="inline"><![CDATA[h_t]]></fr:tex> lands at <fr:tex display="inline"><![CDATA[t \notin  P]]></fr:tex>, so <fr:tex display="inline"><![CDATA[h_t^*(P) = \bot _V]]></fr:tex>. An <html:strong>arrow from <fr:tex display="inline"><![CDATA[\bot _V]]></fr:tex> to <fr:tex display="inline"><![CDATA[\top _V]]></fr:tex></html:strong>.</html:li>
        <html:li>For <fr:tex display="inline"><![CDATA[P = \top _t]]></fr:tex>: <fr:tex display="inline"><![CDATA[P]]></fr:tex> contains only <fr:tex display="inline"><![CDATA[t]]></fr:tex>. Then <fr:tex display="inline"><![CDATA[h_t]]></fr:tex> lands in <fr:tex display="inline"><![CDATA[P]]></fr:tex>, so <fr:tex display="inline"><![CDATA[h_t^*(P) = \top _V]]></fr:tex>. But <fr:tex display="inline"><![CDATA[h_s]]></fr:tex> lands at <fr:tex display="inline"><![CDATA[s \notin  P]]></fr:tex>, so <fr:tex display="inline"><![CDATA[h_s^*(P) = \bot _V]]></fr:tex>. An <html:strong>arrow from <fr:tex display="inline"><![CDATA[\top _V]]></fr:tex> to <fr:tex display="inline"><![CDATA[\bot _V]]></fr:tex></html:strong>.</html:li>
        <html:li>For <fr:tex display="inline"><![CDATA[P = t_A]]></fr:tex>: <fr:tex display="inline"><![CDATA[P]]></fr:tex> contains both <fr:tex display="inline"><![CDATA[s]]></fr:tex> and <fr:tex display="inline"><![CDATA[t]]></fr:tex> (but not the arrow). Then <fr:tex display="inline"><![CDATA[h_s^*(P) = h_t^*(P) = \top _V]]></fr:tex>. A <html:strong>loop based at <fr:tex display="inline"><![CDATA[\top _V]]></fr:tex></html:strong>.</html:li></html:ul>
                                <html:p>
                                  <html:strong>The subobject classifier of <fr:tex display="inline"><![CDATA[\mathbf {Graphs}]]></fr:tex>:</html:strong>
                                </html:p>
                                <html:div style="text-align: center">
                                  <fr:resource hash="f99eb57cff9355fed8a539a8e4222daf">
                                    <fr:resource-content>
                                      <html:img src="/forest/f99eb57cff9355fed8a539a8e4222daf.svg" />
                                    </fr:resource-content>
                                    <fr:resource-source type="latex" part="preamble"><![CDATA[
        \usepackage {tikz-cd}
        \usepackage {mathrsfs}
        \usetikzlibrary {bending}
      ]]></fr:resource-source>
                                    <fr:resource-source type="latex" part="body"><![CDATA[
        \begin {tikzcd}[column sep=large]
          \bullet _{\bot _V} \arrow [rr, bend left=20, "\top _s"] \arrow [loop left, "\bot _A"] & & \bullet _{\top _V} \arrow [ll, bend left=20, "\top _t"] \arrow [loop above, "\top _A"] \arrow [loop right, "t_A"]
        \end {tikzcd}
      ]]></fr:resource-source>
                                  </fr:resource>
                                </html:div>
                                <html:p>We see that <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> is <html:strong>connected</html:strong>! This evokes a "Hegelian air"...</html:p>
                                <html:blockquote><html:p>"When one says that one knows something falsely, this means that knowledge is in non-identity with its substance. But precisely this non-identity is the act of differentiation in general, which is an essential moment. Certainly, from this differentiation their identity arises, and this identity become is truth. But it is not truth in the sense that one has rid oneself of non-identity, as one throws away the separated dross from the pure metal, nor even as one discards the tool once the vessel is finished: non-identity on the contrary is itself still immediately present in the true, as the negative, as the Self."</html:p>

        <html:p>— Hegel, <html:em>Phenomenology of Spirit</html:em></html:p></html:blockquote>
                                <html:p>...which turns out in fact to be deceptive!</html:p>
                              </fr:mainmatter>
                            </fr:tree>
                            <fr:tree show-metadata="false">
                              <fr:frontmatter>
                                <fr:authors>
                                  <fr:author>
                                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                                  </fr:author>
                                </fr:authors>
                                <fr:date>
                                  <fr:year>2025</fr:year>
                                  <fr:month>1</fr:month>
                                  <fr:day>11</fr:day>
                                </fr:date>
                                <fr:title text="\Omega  as a classifier of subgraphs"><fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> as a classifier of subgraphs</fr:title>
                              </fr:frontmatter>
                              <fr:mainmatter>
                                <html:p>Consider a graph morphism <fr:tex display="inline"><![CDATA[\varphi  \colon  \boxed {\bullet _a \xrightarrow {\alpha } \bullet _b} \rightarrow  \Omega ]]></fr:tex>. Then:</html:p>
                                <html:ul><html:li><fr:tex display="inline"><![CDATA[\varphi (\alpha )]]></fr:tex> is among <fr:tex display="inline"><![CDATA[\bot _A, \top _s, \top _t, t_A, \top _A]]></fr:tex></html:li>
        <html:li><fr:tex display="inline"><![CDATA[\varphi (a)]]></fr:tex> and <fr:tex display="inline"><![CDATA[\varphi (b)]]></fr:tex> are among <fr:tex display="inline"><![CDATA[\bot _V, \top _V]]></fr:tex></html:li></html:ul>
                                <html:p>The following relations hold:</html:p>
                                <html:ul><html:li>The arrow <fr:tex display="inline"><![CDATA[f]]></fr:tex> is in <fr:tex display="inline"><![CDATA[\varphi (\alpha )]]></fr:tex> iff <fr:tex display="inline"><![CDATA[\varphi (\alpha ) = \top _A]]></fr:tex>.</html:li>
        <html:li>The source <fr:tex display="inline"><![CDATA[s]]></fr:tex> is in <fr:tex display="inline"><![CDATA[\varphi (\alpha )]]></fr:tex> iff <fr:tex display="inline"><![CDATA[\varphi (a) = \top _V]]></fr:tex>.</html:li>
        <html:li>The target <fr:tex display="inline"><![CDATA[t]]></fr:tex> is in <fr:tex display="inline"><![CDATA[\varphi (\alpha )]]></fr:tex> iff <fr:tex display="inline"><![CDATA[\varphi (b) = \top _V]]></fr:tex>.</html:li></html:ul>
                                <html:p>Every graph morphism to <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> is completely determined once one knows which <fr:tex display="inline"><![CDATA[F]]></fr:tex>-figures are sent to <fr:tex display="inline"><![CDATA[\top _F]]></fr:tex> for every generic figure <fr:tex display="inline"><![CDATA[F]]></fr:tex>.</html:p>
                                <html:p><html:strong>Example</html:strong>: suppose <fr:tex display="inline"><![CDATA[b]]></fr:tex> is the only vertex sent to <fr:tex display="inline"><![CDATA[\top _V]]></fr:tex>. Then <fr:tex display="inline"><![CDATA[\varphi (\alpha )]]></fr:tex> has the target vertex and nothing else: <fr:tex display="inline"><![CDATA[\varphi (\alpha ) = \top _t]]></fr:tex>. Hence <fr:tex display="inline"><![CDATA[\varphi (a) = \bot _V]]></fr:tex>.</html:p>
                              </fr:mainmatter>
                            </fr:tree>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2025</fr:year>
                          <fr:month>1</fr:month>
                          <fr:day>11</fr:day>
                        </fr:date>
                        <fr:title text="Towards an axiomatics of cohesion">Towards an axiomatics of cohesion</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                              <fr:month>1</fr:month>
                              <fr:day>11</fr:day>
                            </fr:date>
                            <fr:title text="Obstruction of the topos of graphs">Obstruction of the topos of graphs</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Recall: an Aufhebung is made possible by UIAOs. The topos of graphs enters into an adjoint triple with the topos of sets:</html:p>
                            <html:div style="text-align: center">
                              <fr:resource hash="7f153669789dc4c9083f1a9fdad85510">
                                <fr:resource-content>
                                  <html:img src="/forest/7f153669789dc4c9083f1a9fdad85510.svg" />
                                </fr:resource-content>
                                <fr:resource-source type="latex" part="preamble"><![CDATA[
      \usepackage {tikz-cd}
      \usepackage {mathrsfs}
      \usetikzlibrary {bending}
    ]]></fr:resource-source>
                                <fr:resource-source type="latex" part="body"><![CDATA[
      \begin {tikzcd}
        \mathrm {PSh}(\mathscr {C}) \arrow [r, shift left=5, "\Pi "] \arrow [r, shift right=5, "\Gamma "'] & \mathbf {Sets} \arrow [l, "\Delta " description] \arrow [l, shift left=2, phantom, "\scriptstyle \bot "] \arrow [l, shift right=2, phantom, "\scriptstyle \bot "]
      \end {tikzcd}
    ]]></fr:resource-source>
                              </fr:resource>
                            </html:div>
                            <html:p>where <fr:tex display="inline"><![CDATA[\Pi  \dashv  \Delta  \dashv  \Gamma ]]></fr:tex>.</html:p>
                            <html:p><html:strong>Problem</html:strong>: this is not a UIAO! What we seek is a quadruple adjunction:</html:p>
                            <fr:tex display="block"><![CDATA[\Pi  \dashv  \Delta  \dashv  \Gamma  \dashv  B]]></fr:tex>
                            <html:p>where <fr:tex display="inline"><![CDATA[\Delta  \dashv  \Gamma  \dashv  B]]></fr:tex> is a UIAO adjoint triple.</html:p>
                            <html:p><html:strong>Obstruction</html:strong>: the category <fr:tex display="inline"><![CDATA[\mathbf {Graphs}]]></fr:tex> (viewed as <fr:tex display="inline"><![CDATA[\mathrm {PSh}(\mathscr {C})]]></fr:tex> for <fr:tex display="inline"><![CDATA[\mathscr {C} = (\bullet  \rightrightarrows  \bullet )]]></fr:tex>) does not admit a right adjoint <fr:tex display="inline"><![CDATA[B]]></fr:tex>.</html:p>
                            <html:p>...the "Hegelian air" was, indeed, not one!</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                              <fr:month>1</fr:month>
                              <fr:day>11</fr:day>
                            </fr:date>
                            <fr:title text="Two obstructions in total">Two obstructions in total</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:ul><html:li>One at the level of the <html:strong>infra-structure</html:strong>: the co-Heyting negation, not being functorial, does not internalize as an endomorphism of the subobject classifier.</html:li>
      <html:li>One at the level of the <html:strong>supra-structure</html:strong>: the non-existence of the right adjoint <fr:tex display="inline"><![CDATA[B]]></fr:tex> to <fr:tex display="inline"><![CDATA[\Gamma ]]></fr:tex> makes it impossible for the topos <fr:tex display="inline"><![CDATA[\mathbf {Graphs}]]></fr:tex> to be considered as a model of a Grand Logic as Lawvere conceives it.</html:li></html:ul>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                              <fr:month>1</fr:month>
                              <fr:day>11</fr:day>
                            </fr:date>
                            <fr:title text="Lawvere's resolution: reflexive graphs">Lawvere's resolution: reflexive graphs</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Consider <html:strong>reflexive graphs</html:strong> (that is, with distinguished loops at every vertex)! Every irreflexive graph admits an underlying reflexive graph.</html:p>
                            <html:p>Lawvere's thread: we do indeed have existence of the functor <fr:tex display="inline"><![CDATA[B]]></fr:tex> for <fr:tex display="inline"><![CDATA[\mathbf {RGraphs} \rightarrow  \mathbf {Sets}]]></fr:tex> and therefore the possibility of Aufhebung!</html:p>
                            <html:p>On what grounds can we compare the toposes <fr:tex display="inline"><![CDATA[\mathbf {Graphs}]]></fr:tex> and <fr:tex display="inline"><![CDATA[\mathbf {RGraphs}]]></fr:tex>?</html:p>
                            <html:ul><html:li>Same subobject classifier!</html:li>
      <html:li>The product <fr:tex display="inline"><![CDATA[h_A \times  h_A]]></fr:tex> is already very different in <fr:tex display="inline"><![CDATA[\mathbf {RGraphs}]]></fr:tex> (reflexive loops appear on all vertices, yielding a much richer product graph).</html:li></html:ul>
                            <html:p>Lawvere: the distinctions between <fr:tex display="inline"><![CDATA[\mathbf {Graphs}]]></fr:tex> and <fr:tex display="inline"><![CDATA[\mathbf {RGraphs}]]></fr:tex> are above all <html:em>qualitative</html:em>.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2025</fr:year>
                              <fr:month>1</fr:month>
                              <fr:day>11</fr:day>
                            </fr:date>
                            <fr:title text="Towards a Grand Geometric Logic">Towards a Grand Geometric Logic</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:blockquote><html:p>In the remarkable article [QDC] (Quotients of Decidable Objects, Cambridge) it is mentioned that there is <html:strong>a certain epsilon-like difference between classes of toposes. This epsilon is in a sense the victory of geometry over narrow logicism</html:strong> and this is what [QDB] (Qualitative Distinctions, Boulder) strives to clarify.</html:p>

      <html:p>— Lawvere, <html:em>Some thoughts on the future of category theory</html:em>, 1991</html:p></html:blockquote>
                            <html:p>The reference [QDB] that Lawvere puts forward is his 1989 paper <html:em>Qualitative distinctions between some toposes of generalized graphs</html:em>, developing ideas from his 1986 article <html:em>Categories of spaces may not be generalized spaces as exemplified by directed graphs</html:em>.</html:p>
                            <html:p>Already in 1986: an attempt at an axiomatics of cohesion. Not quite fully developed: it articulates that the difference between a category of spaces and a generalized space lies in its subobject classifier being "contractible." Problem: <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> is connected and contractible for <html:strong>RGraphs</html:strong> but also for <fr:tex display="inline"><![CDATA[\mathbf {Graphs}]]></fr:tex>! So more is needed.</html:p>
                            <html:p>...but it is manifest that what Lawvere seeks in his program is indeed a <html:strong>Grand Geometric Logic</html:strong>.</html:p>
                            <fr:tree show-metadata="false">
                              <fr:frontmatter>
                                <fr:authors>
                                  <fr:author>
                                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                                  </fr:author>
                                </fr:authors>
                                <fr:date>
                                  <fr:year>2025</fr:year>
                                  <fr:month>1</fr:month>
                                  <fr:day>11</fr:day>
                                </fr:date>
                                <fr:title text="Sketch of a program">Sketch of a program</fr:title>
                              </fr:frontmatter>
                              <fr:mainmatter>
                                <html:ol><html:li><html:strong>Dialectic of geometric and logical morphisms between toposes</html:strong>
          <html:ul><html:li><html:em>Geometric</html:em> nature of the categories of "Being"</html:li>
            <html:li>Necessity of <html:em>logical</html:em> morphisms to express Cohen forcing</html:li>
            <html:li>Dialectical unity between logical and geometric morphisms</html:li></html:ul></html:li>
        <html:li><html:strong>Reflexive graphs (above sets) as a model of a topos of "Being"</html:strong>
          <html:ul><html:li>Correlation with adjoint triples in UIAO situation and with Lawvere's points</html:li>
            <html:li>Description of the remaining topos-theoretic operations (pullback, power objects, ...) which have philosophical significance (cf. <html:em>Logiques des Mondes</html:em>)</html:li>
            <html:li>Differences between "gros" toposes (categories of spaces) and "petit" toposes (generalized spaces)</html:li></html:ul></html:li>
        <html:li><html:strong>Reflexive graphs as a model of a cohesive topos</html:strong>
          <html:ul><html:li>From categories of Being to categories of cohesion; connectedness of <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> and Nullstellensatz</html:li>
            <html:li>Expressing Hegel: Quality, Quantity, Extensivity, Intensivity</html:li>
            <html:li>Necessity of non-classical toposes (i.e. non-Boolean)</html:li></html:ul></html:li></html:ol>
                                <html:p>What consequences for a <html:em>contemporary</html:em> mathematical intellectuality? For a philosophy conditioned (cf. Badiou) on Lawvere's mathematics?</html:p>
                              </fr:mainmatter>
                            </fr:tree>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVT9/</fr:uri>
                    <fr:display-uri>tt-AVT9</fr:display-uri>
                    <fr:route>/forest/tt-AVT9/</fr:route>
                    <fr:title text="From syllogism to topos: a guide for philosophy students">From syllogism to topos: a guide for philosophy students</fr:title>
                    <fr:meta name="draft">true</fr:meta>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Translated and adapted from a Chinese-language essay (从三段论到拓扑斯：给哲学生的完整导引). The goal: starting from Aristotle's syllogism, pass through several <html:em>Momente</html:em> (moments/stages) to arrive at the concept of a <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/topos" type="external">topos</fr:link></html:span>. No mathematical background is assumed — only the willingness to follow each step slowly.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:title text="Syllogism — the starting point of logic">Syllogism — the starting point of logic</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter><html:p><html:strong>The simplest example.</html:strong> Aristotle's syllogism:</html:p><html:ol><html:li>Premise 1: All humans are mortal.</html:li>
    <html:li>Premise 2: Socrates is a human.</html:li>
    <html:li>Conclusion: Therefore, Socrates is mortal.</html:li></html:ol><html:p>This looks trivial, but we must ask: <html:em>why</html:em> is this reasoning valid? What is its structure?</html:p><html:p><html:strong>Dissecting the structure.</html:strong> Three "classes" (Aristotle's <html:em>categories</html:em>) are involved: mortal things (the largest class), humans (the middle class), Socrates (the smallest). The validity of the reasoning depends on a simple fact: <html:em>containment is transitive</html:em>. Socrates belongs to "humans", "humans" belong to "mortal things", so Socrates also belongs to "mortal things".</html:p><html:p><html:strong>Arrows and transitivity.</html:strong> Instead of nested circles, draw arrows:</html:p>
  <html:center><fr:resource hash="84e172733a855c281e780b75f3c81520"><fr:resource-content><html:img src="/forest/84e172733a855c281e780b75f3c81520.svg" /></fr:resource-content><fr:resource-source type="latex" part="preamble"><![CDATA[\usepackage {tikz-cd}\usepackage {amsopn}\usepackage {amssymb}\usepackage {mathrsfs}\usetikzlibrary {bending}]]></fr:resource-source><fr:resource-source type="latex" part="body"><![CDATA[    \begin{tikzcd}[column sep=large]
      \textrm{Socrates} \arrow[r] & \textrm{Humans} \arrow[r] & \textrm{Mortal things}
    \end{tikzcd}]]></fr:resource-source></fr:resource></html:center>
<html:p>Each arrow represents the "belongs to" relation. The core of the syllogism is: <html:strong>arrows can be composed end-to-end into new arrows.</html:strong> Remember this — the entire story that follows is built on this insight.</html:p><html:p><html:strong>Aristotle's hidden assumption.</html:strong> Aristotle used "categories" to refer to fundamental classifications of beings. For him, logic was the study of the membership relations between these categories. But there is a hidden assumption: <html:em>the world is determinate — a proposition is either true or false, with no third possibility.</html:em> This assumption is later called the <html:em>law of excluded middle</html:em>. We note it now; we will challenge it later.</html:p><html:p>One might say the syllogism is an <html:em>an sich</html:em> (in-itself) starting point: it contains the germ of all subsequent development (arrows and transitivity), but has not yet unfolded its own richness and limitations.</html:p></fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:title text="Category theory — making &quot;arrows&quot; into a general theory">Category theory — making "arrows" into a general theory</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p><html:strong>From concrete to abstract.</html:strong> In 1945, Eilenberg and Mac Lane noticed that "arrows plus transitivity" appears everywhere in mathematics: functions in set theory, continuous maps in geometry, homomorphisms in algebra. The common pattern is "objects + arrows + arrows can be composed". They extracted this common structure and called it a <fr:link href="/forest/cat-0003/" title="Category" uri="https://kream.codeberg.page/forest/cat-0003/" display-uri="cat-0003" type="local">category</fr:link>.</html:p>
                        <html:p>This step is a kind of <html:em>Aufhebung</html:em> (sublation): the concrete content of the syllogism (humans, Socrates...) is dropped — category theory no longer cares about these specific things; but the <html:em>form</html:em> (arrows and composition) is preserved and elevated to a higher level of abstraction.</html:p>
                        <html:p><html:strong>The definition of a category.</html:strong> A category needs only:</html:p>
                        <html:ol><html:li>A collection of <html:strong>objects</html:strong>. Category theory does not care what is "inside" an object — an object is just a name.</html:li>
    <html:li><html:strong>Arrows</html:strong> (morphisms) between objects, representing "relations" or "processes".</html:li>
    <html:li>Arrows can be <html:strong>composed</html:strong>. <fr:tex display="inline"><![CDATA[A \rightarrow  B]]></fr:tex> plus <fr:tex display="inline"><![CDATA[B \rightarrow  C]]></fr:tex> yields <fr:tex display="inline"><![CDATA[A \rightarrow  C]]></fr:tex>. This is precisely the transitivity of the syllogism.</html:li>
    <html:li>Every object has an <html:strong>identity arrow</html:strong> from itself to itself — "doing nothing".</html:li>
    <html:li>Composition is <html:strong>associative</html:strong>.</html:li></html:ol>
                        <html:p><html:strong>Relationalism — the priority of mediation.</html:strong> The definition never says what an object <html:em>is</html:em>, only what arrows exist between objects. This is a thoroughgoing <html:em>relational</html:em> stance: <html:em>the essence of a thing lies not in its internal constitution, but in its relations to other things.</html:em></html:p>
                        <html:p>This resonates with Hegel's notion of <html:em>Vermittlung</html:em> (mediation) and with Saussure's insight that language has no isolated meanings, only differences and relations. Category theory says the same of mathematics — an object's "identity" is entirely determined by the arrows it sends and receives.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:title text="The category of sets — the most familiar &quot;world&quot;">The category of sets — the most familiar "world"</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>The most important category is <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex> — all sets as objects, functions as arrows.</html:p>
                        <html:p><html:strong>Logic in <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex>: true or false.</html:strong> In <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex>, a proposition is either true or false. Mathematically, we use <fr:tex display="inline"><![CDATA[\Omega  = \{\top , \bot \}]]></fr:tex> to represent all possible truth values. This <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> is called the <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/subobject%20classifier" type="external">subobject classifier</fr:link></html:span> — the "tool for deciding truth and falsity". In <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex>, <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> has exactly two elements, so the logic is classical two-valued logic and the law of excluded middle holds.</html:p>
                        <html:p>In philosophical terms, <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex> is a domain of <html:em>Verstand</html:em> (understanding): everything is either-or, no grey zones, no transitions. Clear and determinate, but therefore rigid.</html:p>
                        <html:p><html:strong>Products and subobjects.</html:strong> Given sets <fr:tex display="inline"><![CDATA[A]]></fr:tex> and <fr:tex display="inline"><![CDATA[B]]></fr:tex>, their product <fr:tex display="inline"><![CDATA[A \times  B]]></fr:tex> is the set of all ordered pairs. "Humans" is a subset of "animals" — this is precisely the "containment" of Aristotle's syllogism.</html:p>
                        <html:p><html:strong>Exponential objects: turning change into a thing.</html:strong> Fix two sets <fr:tex display="inline"><![CDATA[A]]></fr:tex> and <fr:tex display="inline"><![CDATA[B]]></fr:tex>. How many different functions <fr:tex display="inline"><![CDATA[A \rightarrow  B]]></fr:tex> exist? Take <fr:tex display="inline"><![CDATA[A = \{0,1\}]]></fr:tex> and <fr:tex display="inline"><![CDATA[B = \{0,1,2\}]]></fr:tex>. A function must specify: where does 0 go? where does 1 go? For 0, there are three choices (map to 0, 1, or 2); for 1, also three. Total: <fr:tex display="inline"><![CDATA[3 \times  3 = 9]]></fr:tex> functions. We can list them all:</html:p>
                        <html:table>
    <html:thead>
      <html:tr>
        <html:th />
        <html:th><fr:tex display="inline"><![CDATA[f_1]]></fr:tex></html:th>
        <html:th><fr:tex display="inline"><![CDATA[f_2]]></fr:tex></html:th>
        <html:th><fr:tex display="inline"><![CDATA[f_3]]></fr:tex></html:th>
        <html:th><fr:tex display="inline"><![CDATA[f_4]]></fr:tex></html:th>
        <html:th><fr:tex display="inline"><![CDATA[f_5]]></fr:tex></html:th>
        <html:th><fr:tex display="inline"><![CDATA[f_6]]></fr:tex></html:th>
        <html:th><fr:tex display="inline"><![CDATA[f_7]]></fr:tex></html:th>
        <html:th><fr:tex display="inline"><![CDATA[f_8]]></fr:tex></html:th>
        <html:th><fr:tex display="inline"><![CDATA[f_9]]></fr:tex></html:th>
      </html:tr>
    </html:thead>
    <html:tbody>
      <html:tr>
        <html:td><fr:tex display="inline"><![CDATA[0 \mapsto ]]></fr:tex></html:td>
        <html:td>0</html:td>
        <html:td>1</html:td>
        <html:td>2</html:td>
        <html:td>0</html:td>
        <html:td>1</html:td>
        <html:td>2</html:td>
        <html:td>0</html:td>
        <html:td>1</html:td>
        <html:td>2</html:td>
      </html:tr>
      <html:tr>
        <html:td><fr:tex display="inline"><![CDATA[1 \mapsto ]]></fr:tex></html:td>
        <html:td>0</html:td>
        <html:td>0</html:td>
        <html:td>0</html:td>
        <html:td>1</html:td>
        <html:td>1</html:td>
        <html:td>1</html:td>
        <html:td>2</html:td>
        <html:td>2</html:td>
        <html:td>2</html:td>
      </html:tr>
    </html:tbody>
  </html:table>
                        <html:p>These 9 functions themselves form a new set — a set of size 9. We write it <fr:tex display="inline"><![CDATA[B^A]]></fr:tex>, read "<fr:tex display="inline"><![CDATA[B]]></fr:tex> to the power <fr:tex display="inline"><![CDATA[A]]></fr:tex>" (here <fr:tex display="inline"><![CDATA[3^2 = 9]]></fr:tex> — the name comes from this). This is the <html:em>exponential object</html:em>.</html:p>
                        <html:p>Notice what happened: <html:em>change itself became a thing.</html:em> Originally, a function is an arrow between objects — not an object, but a relation. Now we collect all arrows <fr:tex display="inline"><![CDATA[A \rightarrow  B]]></fr:tex> into a new object — arrows become objects. It is as if you can not only observe changes in the world, but also take "change" itself off the shelf, place it on the table, study it, compare it, operate on it.</html:p>
                        <html:p>The deeper implication: since functions are now objects, you can construct <html:em>functions of functions</html:em> — a higher-order function that takes a function as input and outputs another function. This gives the system a capacity for self-reference: relations no longer exist only between objects; relations themselves become objects available for inspection. The system begins to <html:em>reflect on</html:em> its own transformations.</html:p>
                        <html:p><html:strong>The key question.</html:strong> <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex> is the "home" of classical logic. But now we ask: <html:em>is <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex> the only possible "world"?</html:em> Are there other categories that also possess products, exponentials, and a subobject classifier, but whose logic is not classical? This is the origin of the topos.</html:p>
                        <html:p>This question marks a turning point: we begin to doubt the universality of <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex>, to realize it may be only one special case among many "worlds". As the saying goes, "what is familiar is not for that reason known" — <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex>'s determinacy, its two-valuedness, may be precisely its limitation.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:title text="Local and global — the intuition of sheaves">Local and global — the intuition of sheaves</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p><html:strong>The Buffalo jigsaw.</html:strong> Imagine you are in Buffalo, New York — a city with a special connection to category theory, where the late William <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/Lawvere" type="external">Lawvere</fr:link></html:span> worked for many years, and who first linked topos theory with philosophical speculation.</html:p>
                        <html:p>You and friends scattered across Buffalo are assembling a jigsaw puzzle of the city. Each person holds some pieces. Success requires one condition: <html:em>adjacent pieces must match</html:em> — edge patterns must align. If they all match, the complete picture can be recovered from the fragments.</html:p>
                        <html:p>A <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/sheaf" type="external">sheaf</fr:link></html:span> in mathematics says exactly this: "fragments" are "local information", "matching" is "agreeing on overlaps": <html:em>if each person's local information is mutually consistent on overlaps, a unique piece of complete global information can be assembled.</html:em></html:p>
                        <html:p>
                          <html:strong>What information can be assembled, and what cannot?</html:strong>
                        </html:p>
                        <html:ul><html:li><html:strong>Terrain (a sheaf).</html:strong> Each person observes the terrain of their neighbourhood. Where observations overlap, they agree. Pieced together, all observations yield a complete terrain map. You do not need a god's-eye view — honest local recording plus mutual checking at boundaries suffices.</html:li>
    <html:li><html:strong>Highest point (not a sheaf).</html:strong> Each person finds their neighbourhood's highest point. There is no inconsistency on overlaps. But you cannot assemble "the city's highest point" from "each neighbourhood's highest point" — that requires a <html:em>global comparison</html:em> that local gluing cannot provide.</html:li></html:ul>
                        <html:p><html:strong>Philosophical significance: totality within finitude.</html:strong> No one possesses a "god's-eye view"; every perspective is finite. But if different perspectives are <html:em>mutually consistent at their boundaries</html:em> — if they coordinate at overlaps — then the finitude of the local can be overcome and a global picture can emerge. Hegel's "the true is the whole" (Das Wahre ist das Ganze) expresses a similar conviction: the whole is not given in advance, but assembled through the mediation of finite, one-sided moments.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:title text="Topos — a &quot;generalized universe&quot;">Topos — a "generalized universe"</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p><html:strong>Grothendieck's discovery.</html:strong> In the 1960s, Grothendieck discovered something astonishing: <html:em>collecting all sheaves on a space, the resulting category looks almost identical to <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex></html:em> — it has products, exponentials, and a subobject classifier. He called such a category a <html:strong>topos</html:strong> (Greek for "place"). Lawvere and Tierney then (1969–70) further abstracted this into the axiomatic definition of an <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/elementary%20topos" type="external">elementary topos</fr:link></html:span>.</html:p>
                        <html:p>
                          <html:strong>The four conditions of a topos:</html:strong>
                        </html:p>
                        <html:ol><html:li><html:strong>All finite limits</html:strong> — products, intersections, and other "synthetic" operations.</html:li>
    <html:li><html:strong>All finite colimits</html:strong> — unions, gluings, and other "generative" operations.</html:li>
    <html:li><html:strong>Exponential objects</html:strong> — arrows are themselves objects, giving the topos the capacity for "reflection".</html:li>
    <html:li><html:strong>A subobject classifier <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex></html:strong> — a "truth-value object" that determines the internal logic.</html:li></html:ol>
                        <html:p>(Technical note: strictly, conditions 1, 3, and 4 suffice — Paré proved in 1974 that finite colimits follow from the rest.)</html:p>
                        <html:p>
                          <html:strong>The key point: different toposes can have different <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex>'s.</html:strong>
                        </html:p>
                        <html:p><html:strong>The variation of <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> — logic is no longer fixed.</html:strong> In <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex>, <fr:tex display="inline"><![CDATA[\Omega  = \{\top , \bot \}]]></fr:tex>, with only two values. But in a topos of sheaves, <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> can have many "truth values". For example, in the topos of sheaves on the time line, the truth value of a proposition is not "true" or "false" but <html:em>"from when it becomes true"</html:em>. "It is raining" might have truth value "true from 3pm onwards" — not any element of <fr:tex display="inline"><![CDATA[\{\top , \bot \}]]></fr:tex>, but a <html:em>time interval</html:em>. "Truth" has acquired degree, context, and temporality.</html:p>
                        <html:p><html:strong>The failure of excluded middle.</html:strong> In classical logic, "raining or not raining" is always true. But in the temporal sheaf topos, the union of two open intervals need not cover the whole timeline — at the critical instant, neither holds. This is not ignorance; the <html:em>logical structure of the universe itself</html:em> permits intermediate states. The internal logic of a topos is <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/intuitionistic%20logic" type="external">intuitionistic logic</fr:link></html:span> — it accepts all rules of classical logic except the law of excluded middle.</html:p>
                        <html:p><html:strong>Intuitionistic logic: a different mode of reasoning.</html:strong> Before introducing Heyting algebras, a few more words on intuitionistic logic are warranted. It is not a crippled classical logic, but an independent, self-contained mode of reasoning with its own philosophical motivation.</html:p>
                        <html:p>The core principle of classical logic: true and false are the only two possibilities. You can prove <fr:tex display="inline"><![CDATA[P]]></fr:tex> by showing "<fr:tex display="inline"><![CDATA[\neg  P]]></fr:tex> leads to contradiction" — even if you have no idea <html:em>why</html:em> <fr:tex display="inline"><![CDATA[P]]></fr:tex> holds. This is <html:em>reductio ad absurdum</html:em>, and it depends on excluded middle: since <fr:tex display="inline"><![CDATA[P]]></fr:tex> is either true or false, ruling out false leaves only true.</html:p>
                        <html:p>Intuitionistic logic refuses this step. Its basic stance: <html:em>for a proposition to be true means we possess a construction or evidence for it.</html:em> Merely ruling out "false" does not amount to "constructing" true. An analogy: you are lost in Buffalo. Someone tells you "you are not in the South District" — this eliminates one possibility, but does not tell you where you actually <html:em>are</html:em>. In intuitionistic logic, you must provide a concrete route before you can claim to know your location.</html:p>
                        <html:p>Intuitionistic logic retains most classical rules: "and" (<fr:tex display="inline"><![CDATA[A \land  B]]></fr:tex>), "or" (<fr:tex display="inline"><![CDATA[A \lor  B]]></fr:tex>), "implies" (<fr:tex display="inline"><![CDATA[A \Rightarrow  B]]></fr:tex>), "not" (<fr:tex display="inline"><![CDATA[\neg  A]]></fr:tex>) all remain, as do inference patterns like the syllogism and modus ponens. Only excluded middle and the reductio that depends on it are rejected. This means intuitionistic logic proves <html:em>fewer</html:em> theorems — but each one is more "real": you not only know that something holds, but <html:em>why and how</html:em> it holds.</html:p>
                        <html:p><html:strong>Heyting algebras.</html:strong> Just as <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/Boolean%20algebra" type="external">Boolean algebras</fr:link></html:span> model classical logic, <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/Heyting%20algebra" type="external">Heyting algebras</fr:link></html:span> model intuitionistic logic. In a Boolean algebra, <fr:tex display="inline"><![CDATA[\neg  P]]></fr:tex> is the complement — <fr:tex display="inline"><![CDATA[P \lor  \neg  P]]></fr:tex> covers everything. In a Heyting algebra, <fr:tex display="inline"><![CDATA[\neg  P = (P \Rightarrow  \bot )]]></fr:tex>, and there can be a <html:em>gap</html:em> between <fr:tex display="inline"><![CDATA[P]]></fr:tex> and <fr:tex display="inline"><![CDATA[\neg  P]]></fr:tex>. A concrete example: on the real line, take <fr:tex display="inline"><![CDATA[P = (3, \infty )]]></fr:tex>. Then <fr:tex display="inline"><![CDATA[\neg  P = (-\infty , 3)]]></fr:tex>. Their union <fr:tex display="inline"><![CDATA[(-\infty , 3) \cup  (3, \infty )]]></fr:tex> misses the instant <fr:tex display="inline"><![CDATA[t = 3]]></fr:tex>. Excluded middle fails.</html:p>
                        <html:p><html:strong>The crucial connection:</html:strong> the subobject classifier <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> of <html:em>every</html:em> topos naturally forms an internal Heyting algebra. This is not stipulated — it is a theorem that follows automatically from the categorical structure. Thus the internal logic of a topos is <html:em>inherently intuitionistic</html:em>. Boolean algebra — classical logic — is just the special case when the gap happens to be empty.</html:p>
                        <html:p><html:strong>The internal language: from propositions to a full universe.</html:strong> A Heyting algebra describes intuitionistic logic at the propositional level — only truth values and their operations (and, or, implies, not), with no variables and no quantifiers. But a topos is far richer. Its internal language is a full higher-order intuitionistic type theory — a language that lifts intuitionistic logic from the propositional level to the level of an entire mathematical universe.</html:p>
                        <html:p>What does this "lifting" (sometimes called <html:em>categorification</html:em>) mean? In a Heyting algebra, you have only propositions and logical relations between them — "zeroth-order" logic, static truth-value operations. In a topos, you have objects (analogous to sets or types), morphisms (analogous to functions), quantifiers ("for all <fr:tex display="inline"><![CDATA[x]]></fr:tex>" and "there exists <fr:tex display="inline"><![CDATA[x]]></fr:tex>" can both be defined), and higher-order structure — you can speak of "properties of properties" and "functions of functions", because exponential objects let you treat arrows themselves as objects.</html:p>
                        <html:p>In other words: a topos is a universe in which you can <html:em>do intuitionistic mathematics</html:em>. It tells you not only how propositions compute (Heyting algebra), but how objects are constructed, functions are defined, and quantification proceeds — all within the intuitionistic framework. Lawvere and Tierney proposed the elementary topos precisely because they recognized this: a topos is the semantic model for intuitionistic higher-order logic, and intuitionistic higher-order logic is the internal language of a topos. The two are mirror images.</html:p>
                        <html:p>You can "speak" inside a topos — state and prove theorems in a language resembling ordinary mathematics, except it follows intuitionistic rules. Every sentence in the internal language translates to a categorical diagram; every categorical construction corresponds to an expression in the internal language. This perfect correspondence between language and structure is the <html:em>internal language theorem</html:em>, one of the deepest results of topos theory.</html:p>
                        <html:p>Logical language and categorical structure turn out to be two faces of the same thing — one facing language, one facing structure, their correspondence flowing automatically from the definitions.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:title text="Philosophical significance">Philosophical significance</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p><html:strong>Ontological pluralism.</html:strong> Traditional philosophy assumes one unified world. <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex> is the mathematical realization of this assumption. Toposes shatter it: each topos is a self-sufficient universe with its own objects, relations, and logic. This goes further than Leibniz's possible worlds — different worlds differ not only in "content" but in "logic" itself.</html:p>
                        <html:p><html:strong>The contextuality of logic.</html:strong> Logic is not the "a priori framework" of the world but a reflection of the world's "internal structure". In <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex>, logic is classical because the structure is discrete, global, determinate. In a sheaf topos, logic is intuitionistic because information is local, perspectival, gradual. Logic <html:em>grows from</html:em> categorical structure rather than being <html:em>imposed from outside</html:em>.</html:p>
                        <html:p><html:strong>The fate of the syllogism.</html:strong> In <html:em>any</html:em> topos, the syllogism remains valid — transitivity of arrows is part of the definition of a category. But its <html:em>semantics</html:em> changes: "all humans are mortal" may mean "in these local regions, humans are contained in mortal things". The same inferential form, in different toposes, acquires different depth and texture.</html:p>
                        <html:p><html:strong>From foundationalism to pluralism.</html:strong> Toposes suggest a post-foundationalist stance: there is no uniquely "correct" logic, ontology, or truth value. But this is not nihilism. Each topos has strict internal rules; the sheaf gluing condition ensures local perspectives must be compatible. Each topos is a "one-sided" universe, but because infinitely many toposes are connected by <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/functor" type="external">functors</fr:link></html:span>, a richer picture emerges — not an abstract unity that erases differences, but a coherent totality that encompasses them.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:title text="Internalization versus presupposition">Internalization versus presupposition</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p><html:strong>Two ways of doing mathematics.</html:strong> The standard approach: choose axioms (e.g. ZFC), then build everything on top. Want natural numbers? Construct them. Want the axiom of choice? Add it. This is the way of <html:em>external addition</html:em>: the basic logical framework (classical two-valued logic) is given in advance; the mathematician adjusts the world's properties by adding or removing axioms within this fixed framework. Logic is the unchangeable premise; axioms are the adjustable parameters.</html:p>
                        <html:p>The topos approach is radically different. It presupposes no particular axiom system and no classical logic. Starting from categorical structure alone — "objects", "arrows", "composition" — it lets logic <html:em>emerge</html:em>. The subobject classifier <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> is not "added" but <html:em>grows from</html:em> the categorical structure. This is <html:strong>internalization</html:strong> (Internalisierung) as opposed to external presupposition.</html:p>
                        <html:p><html:strong>The philosophical parallel.</html:strong> Hegel criticized beginning philosophy with unexamined presuppositions — declaring principles "as if shot from a pistol" and then applying them to everything. He favoured letting concepts unfold from within. Axiomatic set theory does the opposite: logic is presupposed, axioms are externally added, the rules are fixed before the game begins.</html:p>
                        <html:p>Category theory and topos theory offer a different posture. In category theory, you do not presuppose what an object <html:em>is</html:em> — identity is determined by position in the arrow network. In a topos, you do not presuppose what logic <html:em>is</html:em> — logic is internally generated by the categorical structure.</html:p>
                        <html:p><html:strong>Significance for mathematics.</html:strong> The topos perspective amounts to a revolution in mathematical worldview. In the traditional view, mathematics has one "absolute background" — the set-theoretic universe <fr:tex display="inline"><![CDATA[V]]></fr:tex>. All mathematical objects "live" in this universe; all theorems are proved here. Mathematicians debate the specific properties of this universe (does the continuum hypothesis hold? do large cardinals exist?), but rarely question the premise that <html:em>there is only one universe</html:em>.</html:p>
                        <html:p>Topos theory shatters this premise. <html:em>Mathematics is not an activity occurring in a single fixed universe, but an activity that can unfold in any topos.</html:em> Different toposes give different mathematics: in Hyland's effective topos, every function <fr:tex display="inline"><![CDATA[\mathbb {R} \rightarrow  \mathbb {R}]]></fr:tex> is continuous; in certain toposes, the real line cannot be decomposed into two complementary nonempty subsets — even the most basic set-theoretic intuitions may fail. These are not curiosities but rigorous theorems.</html:p>
                        <html:p>It is like discovering a "mathematical multiverse" — each topos is a parallel universe with its own physical laws (logic) and natural landscape (the behavior of mathematical objects). Classical mathematics is just one particularly "rigid" universe, not the only possibility.</html:p>
                        <html:p><html:strong>Significance for philosophy.</html:strong> For philosophy, the topos provides not merely an analogy but an <html:em>operational speculative tool</html:em>. Many philosophical debates — realism vs. anti-realism, classical vs. non-classical logic, foundationalism vs. anti-foundationalism — have long remained at the level of opposing stances. Topos theory gives these debates a new dimension: opposing positions may not be either-or choices, but different facets visible in different toposes. Both are legitimate; the arena differs.</html:p>
                        <html:p>More deeply, the topos demonstrates a mode of speculation that does not depend on presuppositions. Analytic philosophy tends to first fix a logic and then discuss problems within it — like doing mathematics in ZFC, you must accept a framework before you can speak. But the topos shows that frameworks <html:em>themselves</html:em> can be "thematized": you can ask "if logic were different, what would the world look like?" — and this question has precise mathematical meaning.</html:p>
                        <html:p><html:strong>Why category theory can carry philosophy.</html:strong> Three reasons:</html:p>
                        <html:ol><html:li><html:strong>It does not presuppose content.</html:strong> A framework that pins down logic and ontology in advance cannot accommodate reflection on its own premises. Category theory presupposes neither. The nature of philosophical speculation is to question all presuppositions.</html:li>
    <html:li><html:strong>It is endogenous.</html:strong> In a topos, logic is not an external decoration but an internal product of structure. As Lawvere put it, "form" is not external to "content" but the manner in which content unfolds itself.</html:li>
    <html:li><html:strong>It maintains unity in difference.</html:strong> Functors and natural transformations describe systematic connections between different structures. Different toposes are not isolated fragments but illuminate each other through functors — not an abstract identity that erases difference, but a coherent unity that pervades it.</html:li></html:ol>
                        <html:p><html:strong>Final words.</html:strong> Topos theory demonstrates that an intellectual activity which does not take external presuppositions as premises — which lets structure itself speak — is possible not only in philosophy, but also in mathematics. The result is a conceptual system in which each stage grows internally from the preceding one, and in which logic is not a rigid rule but a form that unfolds as content unfolds. When mathematics and philosophy meet at this level, the boundary between them may be far more blurred than we supposed.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:title text="The complete journey">The complete journey</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:table>
    <html:thead>
      <html:tr>
        <html:th>Stage</html:th>
        <html:th>Core idea</html:th>
        <html:th>Philosophical import</html:th>
      </html:tr>
    </html:thead>
    <html:tbody>
      <html:tr>
        <html:td>1. Syllogism</html:td>
        <html:td>Membership is transitive</html:td>
        <html:td><html:em>An sich</html:em> starting point</html:td>
      </html:tr>
      <html:tr>
        <html:td>2. Category theory</html:td>
        <html:td>Objects + arrows + composition</html:td>
        <html:td><html:em>Aufhebung</html:em>: abstract elevation of form</html:td>
      </html:tr>
      <html:tr>
        <html:td>3. <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex></html:td>
        <html:td><fr:tex display="inline"><![CDATA[\Omega  = \{\top , \bot \}]]></fr:tex></html:td>
        <html:td>Domain of <html:em>Verstand</html:em>: two-valued logic</html:td>
      </html:tr>
      <html:tr>
        <html:td>4. Sheaves</html:td>
        <html:td>Local information assembles into global</html:td>
        <html:td>Totality within finitude</html:td>
      </html:tr>
      <html:tr>
        <html:td>5. Topos</html:td>
        <html:td><fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> has multiple truth values</html:td>
        <html:td>Concrete totality</html:td>
      </html:tr>
      <html:tr>
        <html:td>6. Intuitionistic logic</html:td>
        <html:td>Heyting algebra; internal language</html:td>
        <html:td>Unity of concept and reality</html:td>
      </html:tr>
    </html:tbody>
  </html:table>
                        <html:p>Aristotle discovered the transitivity of arrows. Category theory made arrows into a general theory. The topos discovered: <html:em>change the world of arrows, and even the meaning of "true" and "false" changes with it.</html:em></html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:title text="Appendix: Frequently asked questions">Appendix: Frequently asked questions</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>
                          <html:strong>Q: Is topos the same thing as "logical pluralism"?</html:strong>
                        </html:p>
                        <html:p>Not exactly. Logical pluralism is a philosophical stance. Topos theory provides one of its mathematical models — showing how logical pluralism can be realized within a rigorous framework.</html:p>
                        <html:p>
                          <html:strong>Q: Is intuitionistic logic "weaker" than classical logic?</html:strong>
                        </html:p>
                        <html:p>From one angle, yes — fewer theorems can be proved. From another angle, it is "stronger": every proof is constructive. If you prove "there exists an <fr:tex display="inline"><![CDATA[x]]></fr:tex>", you can actually produce that <fr:tex display="inline"><![CDATA[x]]></fr:tex>.</html:p>
                        <html:p>
                          <html:strong>Q: Is the Hegel–topos connection a strict correspondence?</html:strong>
                        </html:p>
                        <html:p>The connections drawn in this essay are primarily philosophical analogies. But it is worth noting that <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/Lawvere" type="external">Lawvere</fr:link></html:span>, from the 1980s onward, seriously pursued the category-theoretic formalization of Hegelian logic. He gave precise mathematical definitions for "unity of opposites" and <html:em>Aufhebung</html:em> (using adjoint modalities and the lattice structure of subtoposes), and argued that category theory provides useful formal models for dialectical philosophy. The <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/nLab" type="external">nLab</fr:link></html:span> contains extensive material on this. So the relationship is not merely analogical — in Lawvere's work, it has partly become genuine mathematics.</html:p>
                        <html:p>
                          <html:strong>Q: Why did Grothendieck invent toposes?</html:strong>
                        </html:p>
                        <html:p>The motivation was purely mathematical: the classical notion of "space" in algebraic geometry was insufficient, and he needed more flexible spaces to attack deep problems such as the Weil conjectures. But the philosophical implications of this tool far exceed algebraic geometry itself.</html:p>
                        <html:p>
                          <html:strong>Q: Can you explain the difference between "internalization" and "adding axioms" more plainly?</html:strong>
                        </html:p>
                        <html:p>Here is an analogy. Axiomatic set theory is like a building that has already been constructed: the foundation (classical logic) is fixed, and you can freely renovate inside (add axioms), but you cannot alter the load-bearing structure. A topos is more like a set of architectural principles: it does not give you one specific building, but tells you "what kind of structure qualifies as a building". With these principles you can erect infinitely many different buildings, each with its own foundation and load-bearing design. The difference: the former operates <html:em>within</html:em> one "already-determined" world; the latter moves freely <html:em>between</html:em> possible worlds.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:title text="Highschool Writings">Highschool Writings</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:title text="Structure and meaning">Structure and meaning</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>16</fr:day>
                        </fr:date>
                        <fr:uri>https://kream.codeberg.page/forest/phil-0001/</fr:uri>
                        <fr:display-uri>phil-0001</fr:display-uri>
                        <fr:route>/forest/phil-0001/</fr:route>
                        <fr:title text="Structuralism">Structuralism</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p><html:em>Structuralism</html:em> is a methodology — not a philosophy — that aims to analyse isolated events or meanings in terms of their underlying structural laws. It seeks the <html:em>universal</html:em> by examining the <html:em>particular</html:em>.</html:p>
                        <html:p>Structuralism has had impact across a wide range of fields:</html:p>
                        <html:ul><html:li>Literary criticism</html:li>
  <html:li>Aesthetics</html:li>
  <html:li><fr:link href="/forest/phil-0002/" title="Structuralist linguistics" uri="https://kream.codeberg.page/forest/phil-0002/" display-uri="phil-0002" type="local">Structuralist linguistics</fr:link></html:li>
  <html:li>Sociology and anthropology</html:li>
  <html:li>Psychoanalysis</html:li></html:ul>
                        <html:p>Key figures include Lévi-Strauss (anthropology), Saussure (linguistics), and Barthes (semiotics). All of these are, in one way or another, concerned with the relationship between surface phenomena and the deeper structures that govern them.</html:p>
                        <html:p>In mathematics, <fr:link href="/forest/cat-0001/" title="Category theory" uri="https://kream.codeberg.page/forest/cat-0001/" display-uri="cat-0001" type="local">category theory</fr:link> can be seen as the formalisation of structuralist thinking: it studies not objects in themselves but the structure-preserving maps between them. What a thing <html:em>is</html:em> matters less than how it relates to other things — the same principle that drives structuralism across the humanities.</html:p>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>2</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="Structuralist linguistics">Structuralist linguistics</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>The foundational model is Saussure's division of the sign into <html:em>signifier</html:em> (the symbol, the material form) and <html:em>signified</html:em> (the concept, the meaning). For Saussure, the signified is primary — it exists independently, and the signifier is a conventional label attached to it by social agreement.</html:p>
                            <html:p>Lacan inverts this hierarchy. In Lacan's reading, the signifier dominates and exceeds the signified. There is no stable internal bond between signifier and signified; instead, signifiers constantly expand and proliferate, perpetually deferring the moment of fixed meaning. This reversal is the bridge from structuralism to the <fr:link href="/forest/phil-000a/" title="The signifying chain" uri="https://kream.codeberg.page/forest/phil-000a/" display-uri="phil-000a" type="local">signifying chain</fr:link> and to post-structuralism more broadly.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>2</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="Deconstructionism">Deconstructionism</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>In the pre-modern framework, essence dominates existence. An unquestioned centre — logos, divine reason, natural law — anchors the entire system of meaning. Deconstruction, associated with Derrida, is the process of <html:em>decentring</html:em>: showing that every such centre is itself a construction, that every foundation rests on exclusions it cannot justify. Structuralism reveals the hidden structures; deconstruction reveals that those structures, too, are groundless.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>16</fr:day>
                        </fr:date>
                        <fr:uri>https://kream.codeberg.page/forest/phil-0002/</fr:uri>
                        <fr:display-uri>phil-0002</fr:display-uri>
                        <fr:route>/forest/phil-0002/</fr:route>
                        <fr:title text="Structuralist linguistics">Structuralist linguistics</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>At the core of <fr:link href="/forest/phil-0001/" title="Structuralism" uri="https://kream.codeberg.page/forest/phil-0001/" display-uri="phil-0001" type="local">Structuralism</fr:link> in linguistics is the relationship between the <html:em>signifier</html:em> (the symbol, the sign as it exists) and the <html:em>signified</html:em> (what is implied, the concept referred to).</html:p>
                        <html:p>Saussure held that the signified dominates: meaning is real and stable, and signifiers are merely the conventional symbols we attach to it. The bond between signifier and signified is arbitrary but, once established, fixed by social agreement.</html:p>
                        <html:p>Lacan inverted this. For Lacan, there is no stable internal connection bonding signifier to signified. The signifier dominates, perpetually expanding, sliding over the signified. Meaning is never fully captured — it is always deferred, always elsewhere. The chain of signifiers generates meaning through difference and relation, not through reference to some fixed signified underneath.</html:p>
                        <html:p>This disagreement is not merely technical. It concerns whether language <html:em>expresses</html:em> a pre-existing meaning or whether language <html:em>constitutes</html:em> meaning in the first place.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>16</fr:day>
                        </fr:date>
                        <fr:uri>https://kream.codeberg.page/forest/phil-000a/</fr:uri>
                        <fr:display-uri>phil-000a</fr:display-uri>
                        <fr:route>/forest/phil-000a/</fr:route>
                        <fr:title text="The signifying chain">The signifying chain</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Lacan's <html:em>signifying chain</html:em> radicalises <fr:link href="/forest/phil-0002/" title="Structuralist linguistics" uri="https://kream.codeberg.page/forest/phil-0002/" display-uri="phil-0002" type="local">Saussure's linguistics</fr:link>: signifiers do not attach to fixed signifieds but refer only to other signifiers. Meaning is not found in any single sign — it <html:em>insists</html:em> in the movement from one signifier to the next, constantly deferred along the chain. The subject itself is "nothing other than what slides in a chain of signifiers."</html:p>
                        <html:p>Two rhetorical operations govern the chain. <html:em>Metonymy</html:em> — the horizontal displacement from signifier to signifier — sustains desire by keeping meaning perpetually out of reach. <html:em>Metaphor</html:em> — the substitution of one signifier for another — is the mechanism by which new meaning erupts, as when a symptom stands in for a repressed signifier.</html:p>
                        <html:p>Without some arrest, the chain would slide into pure meaninglessness. Lacan's <html:em>point de capiton</html:em> (quilting point) is the moment at which "the signifier stops the otherwise endless movement of signification," temporarily pinning signifier to signified and producing the necessary illusion of stable meaning. Meaning is thus fixed only retroactively: a sentence acquires its sense at the final full stop, not word by word. In the neurotic subject, enough quilting points hold to sustain coherent speech; when they fail to form, the result is psychosis — the subject is no longer an inhabitant of language but is inhabited by it.</html:p>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>2</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="Planned links">Planned links</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:ul><html:li>The graph of desire — Lacan's full diagram of the signifying chain, demand, and desire</html:li>
    <html:li>The four discourses — master, university, hysteric, analyst as rotations of the signifier chain</html:li>
    <html:li>The Name-of-the-Father — the primordial point de capiton; its foreclosure as the mechanism of psychosis</html:li>
    <html:li>Lacan's mathemes — formalisation of psychoanalytic concepts; connection to topology (Borromean knot)</html:li></html:ul>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>16</fr:day>
                        </fr:date>
                        <fr:uri>https://kream.codeberg.page/forest/phil-0003/</fr:uri>
                        <fr:display-uri>phil-0003</fr:display-uri>
                        <fr:route>/forest/phil-0003/</fr:route>
                        <fr:title text="Deconstructuralism">Deconstructuralism</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p><html:em>Deconstruction</html:em> is the process of de-centring. In pre-modern thought, essence precedes existence: there is always a transcendent centre — a <html:em>logos</html:em>, a divine reason, a natural law — that grounds all meaning. This produces <html:em>logocentrism</html:em>: the privileging of an ultimate foundation from which all structure derives.</html:p>
                        <html:p>Deconstruction identifies and dismantles these centres. It shows that what appears to be a natural foundation is in fact a contingent construction, maintained by the very system of oppositions it claims to ground. The subject/object distinction, the hierarchy of speech over writing, the primacy of presence over absence — these are not given but produced.</html:p>
                        <html:p>This is distinct from mere destruction. Deconstruction does not reject structure; it reveals that structures rely on exclusions and hierarchies that they cannot justify on their own terms. The centre is always already decentred.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:title text="Games, reason, and the subject">Games, reason, and the subject</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>16</fr:day>
                        </fr:date>
                        <fr:uri>https://kream.codeberg.page/forest/phil-0004/</fr:uri>
                        <fr:display-uri>phil-0004</fr:display-uri>
                        <fr:route>/forest/phil-0004/</fr:route>
                        <fr:title text="Finite and infinite games">Finite and infinite games</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>From James P. Carse's <html:em>Finite and Infinite Games</html:em> (1986). The book opens with a single distinction that ramifies into a complete philosophy.</html:p>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>2</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="The distinction">The distinction</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>There are at least two kinds of games:</html:p>
                            <html:ul><html:li>A <html:em>finite game</html:em> is played for the purpose of winning.</html:li>
    <html:li>An <html:em>infinite game</html:em> is played for the purpose of continuing play.</html:li></html:ul>
                            <html:p>A finite game must have an end — the moment someone has won. The winner is decided by the agreement of the players, not the spectators.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>2</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="Freedom of play">Freedom of play</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>It is an invariable principle of all play, finite and infinite, that <html:em>whoever plays, plays freely</html:em>. Whoever <html:em>must</html:em> play, cannot play. There is no finite game unless the players freely choose to play it. No one can play if forced to play.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>2</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="Boundaries">Boundaries</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>A finite game has <html:em>temporal boundaries</html:em> (a precise beginning and end, agreed by all players) and <html:em>numerical boundaries</html:em> (one needs opponents; one cannot play alone).</html:p>
                            <html:p>When a player ignores the agreed-upon boundaries — spatial, temporal, or otherwise — the game is not legitimately won in the eyes of the other players. The war may never be concluded.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>16</fr:day>
                        </fr:date>
                        <fr:uri>https://kream.codeberg.page/forest/phil-0005/</fr:uri>
                        <fr:display-uri>phil-0005</fr:display-uri>
                        <fr:route>/forest/phil-0005/</fr:route>
                        <fr:title text="Reason and time">Reason and time</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Time does not embody reason when going in one direction, without turning back. The discovery of patterns — a human instinct — must rely on memory to function. We can only reason about time by making guesses about the past, by narrating it into stories.</html:p>
                        <html:p>Reason is only present when people are communicating with others. One does not need to justify one's actions when completely alone. Reason is common and shared among all: it is the tool we created in order to communicate. We are always trying to construct and convey meaning through logic, despite the fact that meaning remains unreachable. Logic does not fill our holes. It is not it.</html:p>
                        <html:p>And yet we seek it:</html:p>
                        <html:blockquote><html:p>What is divine in man is elusive and impalpable, and he is easily tempted to embody it in a concrete form — a church, a country, a social system, a leader — so that he may realize it with less effort and serve it with more profit.</html:p>

  <html:p>Yet the attempt to externalize the kingdom of heaven in a temporal shape must end in disaster. It cannot be created by charters or constitutions nor established by arms.</html:p>

  <html:p>Those who seek for it alone will reach it together, and those who seek it in company will perish by themselves.</html:p>

  <html:p>— Hugh Kingsmill, 1944</html:p></html:blockquote>
                        <html:p>Logic, in this light, is the embodiment of truth we construct together and seek. It is divine in the same way that it is communal: not possessed by any one of us, but emergent between us.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>16</fr:day>
                        </fr:date>
                        <fr:uri>https://kream.codeberg.page/forest/phil-0006/</fr:uri>
                        <fr:display-uri>phil-0006</fr:display-uri>
                        <fr:route>/forest/phil-0006/</fr:route>
                        <fr:title text="Intersubjectivity">Intersubjectivity</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p><html:em>Intersubjectivity</html:em> is the move beyond the binary opposition of subject and object. Much of Eastern philosophy and mysticism arrived at this insight long ago; in the modern West, Jung's concept of the <html:em>unus mundus</html:em> brought a version of it into psychoanalysis — a point where the distinction between inner and outer, psyche and matter, dissolves.</html:p>
                        <html:p>Three stances toward the subject can be distinguished:</html:p>
                        <html:ul><html:li><html:em>Pre-modern</html:em>: essence dominates existence. Truth and beauty are pursued as external objects. The subject accepts alienation — meaning is found outside oneself.</html:li>
  <html:li><html:em>Modern</html:em>: the subject inflates. The free, independent, autonomous self emerges. Empathy becomes <html:em>transference</html:em> — the projection of one's own framework onto the other. Transference and semiotic violence are two sides of the same coin.</html:li>
  <html:li><html:em>Intersubjective</html:em>: neither objectification of the other nor inflation of the self. What is authentic is not the object, not the subject, but what passes <html:em>between</html:em> subjects — a mutual sympathy, not transference.</html:li></html:ul>
                        <html:p>Intersubjectivity emphasises harmonious relations between subjects: not being objectified, not objectifying. The authentic is located in the shared space between, not within any single subject.</html:p>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>2</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="原文 (Chinese original)">原文 (Chinese original)</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>主体间性就是超越主客体的二元对立的一种学说。实际上，很多东方哲学和神秘学早就抵达了这个维度。</html:p>
                            <html:p>现代的西方理论中以荣格的unus mundus为首终于在精神分析中出现了主客不分，物我合一，万物归一的理论。这和前现代思想中物的主要位置（真理和美都是在主体外被追求的客体，人在其中接受异化）和现代主义膨胀的主体性（真正自由独立的现代的自我，移情）都是不一样的。移情和符号学暴力实际上是一体两面的。</html:p>
                            <html:p>主体间性强调主体之间的和谐关系，不是被客体化也不是把客体化。这是一种彼此同情，不是移情。本真的不是客体，不是主体，而是主体之间的互通之处。</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:title text="Ideology and culture">Ideology and culture</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>16</fr:day>
                        </fr:date>
                        <fr:uri>https://kream.codeberg.page/forest/phil-0007/</fr:uri>
                        <fr:display-uri>phil-0007</fr:display-uri>
                        <fr:route>/forest/phil-0007/</fr:route>
                        <fr:title text="The mechanics of ideology">The mechanics of ideology</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Following Žižek: ideology does not operate because a person <html:em>believes</html:em> in it and therefore <html:em>acts</html:em> accordingly. It operates because a person <html:em>believes that others believe</html:em>, relaxes their moral vigilance, and performs the action regardless.</html:p>
                        <html:p>An ideology can produce conforming behaviour in a population where not a single individual consciously endorses it. This is its power: it bypasses the reflective self and acts on the social self directly. The flow of power in media follows this pattern.</html:p>
                        <html:p>If this pattern of behaviour persists for two or more generations, the reflective self is also captured. The capacity for thought outside the ideological frame is lost entirely.</html:p>
                        <html:p>Ideology is not identical to the Lacanian Big Other, though they are related. Ideology is the symbolic framework <html:em>under</html:em> the Big Other — it depends not only on internal reinforcement but on opposition and contrast with other symbolic systems for its coherence.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:title text="Psychoanalysis">Psychoanalysis</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2023</fr:year>
                          <fr:month>1</fr:month>
                          <fr:day>20</fr:day>
                        </fr:date>
                        <fr:uri>https://kream.codeberg.page/forest/phil-000A/</fr:uri>
                        <fr:display-uri>phil-000A</fr:display-uri>
                        <fr:route>/forest/phil-000A/</fr:route>
                        <fr:title text="Objet petit a (小他者a)">Objet petit a (小他者a)</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>In Lacanian psychoanalysis, <html:em>objet petit a</html:em> (the small other, 小他者a) designates the object-cause of desire — not the object desired, but the lost remainder that sets desire in motion. It is what falls outside symbolisation: the irreducible surplus that the <fr:link href="/forest/phil-000B/" title="The Big Other (大他者A)" uri="https://kream.codeberg.page/forest/phil-000B/" display-uri="phil-000B" type="local">symbolic order</fr:link> can never fully capture.</html:p>
                        <html:p>Objet petit a is the difference between a thing and itself. It emerges from the constitutive failure of the <fr:link href="/forest/phil-000a/" title="The signifying chain" uri="https://kream.codeberg.page/forest/phil-000a/" display-uri="phil-000a" type="local">signifying chain</fr:link>: whenever the subject attempts to articulate its desire through language, something escapes. This remainder is not a positive entity but a structural gap — the distance between any symbolic representation and what it was meant to capture. In set-theoretic notation, one might write <fr:tex display="inline"><![CDATA[a = \{a, A\}]]></fr:tex>: the object that contains both itself and the <fr:link href="/forest/phil-000B/" title="The Big Other (大他者A)" uri="https://kream.codeberg.page/forest/phil-000B/" display-uri="phil-000B" type="local">Big Other</fr:link>, yet is not reducible to either.</html:p>
                        <html:p>The relation between objet petit a and the Big Other is one of transcendence and negation. The Big Other is the symbolic order — language, law, convention. Objet petit a exceeds this order. It is, in Lacan's formulation, "the desire of the Other" — not what the Other desires, but the fact that the Other itself is lacking, and this lack produces desire in the subject. The infinite repetition of simultaneous failure and attempt gives rise to objet petit a, and with it, to <html:em>jouissance</html:em> — though the subject only ever experiences a castrated form of enjoyment.</html:p>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2023</fr:year>
                              <fr:month>1</fr:month>
                              <fr:day>20</fr:day>
                            </fr:date>
                            <fr:title text="Love and objet petit a">Love and objet petit a</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Lacan's critique of love follows directly from the logic of objet petit a. To love someone is to see in them the embodiment of one's objet petit a — to imagine that possessing this person would make the subject whole. But the beloved is not objet petit a; they are a subject in their own right. To treat them as one's missing piece is to strip them of their subjectivity. Hence Lacan's provocation: "Love is giving something you don't have to someone who doesn't want it."</html:p>
                            <html:p>This aligns with Becker's observation in <html:em>The Denial of Death</html:em> that love in secular modernity is asked to fulfil two contradictory existential needs: the need to feel <html:em>special</html:em> (unique, set apart) and the need to <html:em>belong</html:em> (connected, part of something larger). These needs are in tension — one pushes outward, the other pulls inward — and no single relationship can satisfy both.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2023</fr:year>
                              <fr:month>1</fr:month>
                              <fr:day>20</fr:day>
                            </fr:date>
                            <fr:title text="原文 (Chinese original)">原文 (Chinese original)</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>欲望的客体。无法被语言化的终极剩余。是欲望的辩证法中事物与本身的差异。</html:p>
                            <html:p>小a是超越性的，是诠释、否定了大他者A的存在。是大他者A的欲望。a的构成可以比作 <fr:tex display="inline"><![CDATA[a = \{a, A\}]]></fr:tex>。无限的重复运动（同时发生的失败和尝试）中诞生了a，也诞生为了享乐。但是人只能享受原乐，被阉割的享乐。</html:p>
                            <html:p>小a如同你很喜欢的一个女生，得到她便意味着自身的圆满。但是，你喜欢上的并不是这个女生本人。拉康对于爱的批判是：爱就是把不存在的东西给不想要它的人。实际上就是在描述小a和人的差别。再怎么说，小a还只是一个他者。当我们试图把对方想象成小a的时候，就是在剥夺对方的主体性。所以，爱不是给予，而是剥夺。</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2021</fr:year>
                          <fr:month>12</fr:month>
                          <fr:day>8</fr:day>
                        </fr:date>
                        <fr:uri>https://kream.codeberg.page/forest/phil-000B/</fr:uri>
                        <fr:display-uri>phil-000B</fr:display-uri>
                        <fr:route>/forest/phil-000B/</fr:route>
                        <fr:title text="The Big Other (大他者A)">The Big Other (大他者A)</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>In Lacanian psychoanalysis, the <html:em>Big Other</html:em> (grand Autre, 大他者A) designates the symbolic order itself — the entire field of language, law, and social convention that precedes and constitutes the subject. It is "the Other of the Other": not any particular person, but the anonymous authority of the symbolic as such. Lacan sometimes describes it as a groundless external force — an order that imposes itself on the subject without ultimate justification.</html:p>
                        <html:p>In <fr:link href="/forest/phil-0001/" title="Structuralism" uri="https://kream.codeberg.page/forest/phil-0001/" display-uri="phil-0001" type="local">structuralist</fr:link> terms, the Big Other operates through negation and difference. The Other is the negation internal to the subject: the subject is constituted by what it is not. But this negation is not simple opposition — it is the binary split that structures the symbolic field. The subject's internal contradictions are not resolved but formally reconciled through what Lacan calls the <html:em>constitutive exception</html:em>: an element excluded from the system that paradoxically holds the system together. (See <fr:link href="/forest/phil-000E/" title="Sexuation and the symbolic order (性化秩序)" uri="https://kream.codeberg.page/forest/phil-000E/" display-uri="phil-000E" type="local">sexuation</fr:link> for how this logic structures the sexual order.)</html:p>
                        <html:p>The Big Other is the locus of the <fr:link href="/forest/phil-000a/" title="The signifying chain" uri="https://kream.codeberg.page/forest/phil-000a/" display-uri="phil-000a" type="local">signifying chain</fr:link>. It is the "treasure trove of signifiers" from which the subject draws its speech, but it is also fundamentally lacking — the Other does not possess the final signifier that would guarantee meaning. This lack in the Other is precisely what gives rise to <fr:link href="/forest/phil-000A/" title="Objet petit a (小他者a)" uri="https://kream.codeberg.page/forest/phil-000A/" display-uri="phil-000A" type="local">objet petit a</fr:link> as the object-cause of desire.</html:p>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2021</fr:year>
                              <fr:month>12</fr:month>
                              <fr:day>8</fr:day>
                            </fr:date>
                            <fr:title text="原文 (Chinese original)">原文 (Chinese original)</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>他者的他者。"没凭没据的外部暴力"。他者性在结构主义中就是否定性，与是主体的否定自身。实际上否定不是通俗意义上的否定，而是二分后的对立。主体内部的对立的形式上的和解就是构造一个构成性例外。</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2022</fr:year>
                          <fr:month>4</fr:month>
                          <fr:day>3</fr:day>
                        </fr:date>
                        <fr:uri>https://kream.codeberg.page/forest/phil-000C/</fr:uri>
                        <fr:display-uri>phil-000C</fr:display-uri>
                        <fr:route>/forest/phil-000C/</fr:route>
                        <fr:title text="Metaphor and metonymy (隐喻与换喻)">Metaphor and metonymy (隐喻与换喻)</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Metaphor and metonymy hold a central place in rhetoric, semiotics, <fr:link href="/forest/phil-0002/" title="Structuralist linguistics" uri="https://kream.codeberg.page/forest/phil-0002/" display-uri="phil-0002" type="local">linguistics</fr:link>, psychoanalysis, and cognitive science. In Lacan's reworking of Freud, they become the two fundamental operations of the <fr:link href="/forest/phil-000a/" title="The signifying chain" uri="https://kream.codeberg.page/forest/phil-000a/" display-uri="phil-000a" type="local">signifying chain</fr:link>.</html:p>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2022</fr:year>
                              <fr:month>4</fr:month>
                              <fr:day>3</fr:day>
                            </fr:date>
                            <fr:title text="Linguistic definitions">Linguistic definitions</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p><html:em>Metonymy</html:em> replaces a term with one that stands in a relation of contiguity — part for whole, cause for effect, container for contained. The substitute is structurally adjacent to what it replaces: it belongs to the same associative field. Metonymy is a horizontal, syntagmatic movement along the chain of signifiers.</html:p>
                            <html:p><html:em>Metaphor</html:em> substitutes one signifier for another across a gap of similarity rather than contiguity. The vehicle and the tenor share no structural adjacency — their connection must be constructed by the reader. Metaphor is a vertical, paradigmatic operation: it introduces a third term (the ground of comparison) that abstracts the shared quality.</html:p>
                            <html:p>Both operations involve displacement from literal meaning, but they do so in fundamentally different ways. Metonymy stays within the same associative chain — it is, as Jakobson observed, a movement of combination. Metaphor leaps across chains — it is a movement of selection and substitution. This distinction mirrors Jakobson's two axes of language: the syntagmatic (combination) and the paradigmatic (selection).</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2022</fr:year>
                              <fr:month>4</fr:month>
                              <fr:day>3</fr:day>
                            </fr:date>
                            <fr:title text="Metaphor as complete abstraction">Metaphor as complete abstraction</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Metaphor reveals the <html:em>shared structure</html:em> between two otherwise unrelated domains. By forcing the reader to construct the connection, it achieves what might be called <html:em>complete abstraction</html:em>: the relevant quality is lifted cleanly from its original context and placed in a foreign one, where it can be perceived without the noise of contingent associations. Metonymy, by contrast, performs an <html:em>incomplete abstraction</html:em> — the substitute carries with it the causal and spatial associations of its context, introducing material beyond what the abstraction intends.</html:p>
                            <html:p>This distinction helps explain why the "metaphor revolution" in linguistics elevated metaphor over metonymy. Metaphor is cognitively generative: it creates new conceptual connections. Metonymy is cognitively conservative: it navigates existing ones.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2022</fr:year>
                              <fr:month>4</fr:month>
                              <fr:day>3</fr:day>
                            </fr:date>
                            <fr:title text="Psychoanalytic reading">Psychoanalytic reading</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Lacan maps Freud's dream-work mechanisms onto these rhetorical figures. Freud's <html:em>condensation</html:em> (Verdichtung) — where multiple dream-thoughts are compressed into a single image — corresponds to <html:em>metaphor</html:em>: one signifier substitutes for several. Freud's <html:em>displacement</html:em> (Verschiebung) — where psychic intensity shifts from one idea to an adjacent one — corresponds to <html:em>metonymy</html:em>: desire slides along the chain of signifiers without ever reaching its object.</html:p>
                            <html:p>In Lacan's algebraic notation:</html:p>
                            <html:ul><html:li>Metonymy: <fr:tex display="inline"><![CDATA[f(S \ldots  S') S = S(-) s]]></fr:tex> — combination yields a signifier with diminished signification (desire perpetually deferred)</html:li>
    <html:li>Metaphor: <fr:tex display="inline"><![CDATA[f(S'/S) = S(+) s]]></fr:tex> — substitution yields a signifier with surplus meaning (the symptom as encrypted message)</html:li></html:ul>
                            <html:p>Metaphor is the mechanism by which meaning irrupts — it is how symptoms form, and also how they can be dissolved in analysis. Metonymy is the mechanism by which desire sustains itself — always pointing to the next signifier, never arriving.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2022</fr:year>
                              <fr:month>4</fr:month>
                              <fr:day>3</fr:day>
                            </fr:date>
                            <fr:title text="原文 (Chinese original)">原文 (Chinese original)</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>隐喻和换喻在修辞学，符号学，语言学，精神分析，乃至认知学中，都有着至关重要的地位。</html:p>
                            <html:p>隐喻（metaphor）和换喻（metonymy）属于传统修辞学范畴。但是随着"隐喻革命"（metaphoric revolution），隐喻相比换喻的地位明显提高。</html:p>
                            <html:p>换喻是用一个符号上等值的、含义和语法上平行的结构指代其整体或者延伸。隐喻是用一个符号上不等价、含义和语法不平行的结构指向另一个与之有着相似性的符号。</html:p>
                            <html:p>拉康则用隐喻和换喻来修正弗洛伊德的"压缩"和"移位"。</html:p>
                            <html:p>换喻＝组合→移位；隐喻＝替代→压缩。</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2022</fr:year>
                          <fr:month>6</fr:month>
                          <fr:day>25</fr:day>
                        </fr:date>
                        <fr:uri>https://kream.codeberg.page/forest/phil-000D/</fr:uri>
                        <fr:display-uri>phil-000D</fr:display-uri>
                        <fr:route>/forest/phil-000D/</fr:route>
                        <fr:title text="Genealogy of the subject (有关主体的思考)">Genealogy of the subject (有关主体的思考)</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>The concept of the <html:em>subject</html:em> — what it means to be an "I" — has undergone profound transformations in Western philosophy. Tracing this genealogy reveals that the subject is not a natural given but a historical construction, repeatedly redefined as its philosophical foundations shift.</html:p>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2022</fr:year>
                              <fr:month>6</fr:month>
                              <fr:day>25</fr:day>
                            </fr:date>
                            <fr:title text="The classical rational subject">The classical rational subject</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>The Western philosophical tradition from Aristotle onward treats the subject as an objective, rational observer. Under <html:em>logocentrism</html:em>, logos (reason, language, logic) is the privileged access to truth, and the subject is whoever possesses this capacity. The subject is a detached spectator: rational, self-transparent, standing outside the world it studies.</html:p>
                            <html:p>Descartes radicalises this position with the <html:em>cogito</html:em>. "I think, therefore I am" relocates the subject from the empirical world to the realm of pure thought. The Cartesian subject is absolutely free in its reasoning, defined entirely by its capacity for conscious reflection. It stands outside matter, outside the body, as a sovereign thinking substance.</html:p>
                            <html:p>Lacan's fundamental target is precisely this Cartesian subject: autonomous, transparent, rational, and self-aware. For Lacan, the subject of the cogito is a fiction — an imaginary construction that masks the true, split nature of subjectivity.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2022</fr:year>
                              <fr:month>6</fr:month>
                              <fr:day>25</fr:day>
                            </fr:date>
                            <fr:title text="The social subject">The social subject</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Marx introduces a counter-movement. The human being is not a sovereign thinker but a <html:em>species-being</html:em> (Gattungswesen) — constituted by social relations, labour, and material conditions. The individual subject is an abstraction from the collective; consciousness is not the origin of social life but its product. What appears as autonomous reason is shaped by class position, ideology, and the mode of production. Marx's subject is always already embedded in structures it did not choose.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2022</fr:year>
                              <fr:month>6</fr:month>
                              <fr:day>25</fr:day>
                            </fr:date>
                            <fr:title text="The Lacanian split subject">The Lacanian split subject</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Lacan synthesises and radicalises both traditions. The subject is neither the transparent thinker of Descartes nor simply the social product of Marx, but a <html:em>split subject</html:em> — divided against itself by its entry into language. The subject of the unconscious is not the "I" that speaks but what speaks <html:em>through</html:em> the "I" without the ego's knowledge.</html:p>
                            <html:p>In Lacan's account, the subject is constituted by the <fr:link href="/forest/phil-000B/" title="The Big Other (大他者A)" uri="https://kream.codeberg.page/forest/phil-000B/" display-uri="phil-000B" type="local">Big Other</fr:link> — the symbolic order of language and law — and is perpetually driven by the unattainable <fr:link href="/forest/phil-000A/" title="Objet petit a (小他者a)" uri="https://kream.codeberg.page/forest/phil-000A/" display-uri="phil-000A" type="local">objet petit a</fr:link>. It is a subject defined by lack: the gap between what can be said and what was meant, between demand and desire.</html:p>
                            <html:p>This genealogy — from Aristotle's rational animal, through Descartes' thinking substance, through Marx's social being, to Lacan's split subject — is not simply a story of progress. Each conception of the subject responds to the failures of the previous one, and each introduces new blindnesses of its own.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2022</fr:year>
                              <fr:month>6</fr:month>
                              <fr:day>25</fr:day>
                            </fr:date>
                            <fr:title text="原文 (Chinese original)">原文 (Chinese original)</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>主体客体，是二元对立的两者。主体到底是什么？这个问题困扰了人类多年。</html:p>
                            <html:p>Logocentrism让logos成为通向真理的渠道和学问的中心。而主体则也随之成为了：客观的有逻辑能力的旁观者。这个思想在古典西方哲学中从亚里士多德开始便一脉相传，一直到后来的笛卡尔基本都是围绕着这个思想所展开的。笛卡尔的我思故我在把主体由一个现实世界中（实在界）的人类个体放到了这个世界之外，作为一个绝对理性和思想自由的观察者。</html:p>
                            <html:p>拉康坚决反对的主体概念就是英美哲学中的理性的主体，有意识的主体，或者说"正常"的主体。这一笛卡尔式的主体指的就是自主的、透明的、理性的且具有自我意识的主体。</html:p>
                            <html:p>马克思：人类的类本质，群体本质，个体本质。这里的类本质更加接近主体的概念。</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2021</fr:year>
                          <fr:month>12</fr:month>
                          <fr:day>20</fr:day>
                        </fr:date>
                        <fr:uri>https://kream.codeberg.page/forest/phil-000E/</fr:uri>
                        <fr:display-uri>phil-000E</fr:display-uri>
                        <fr:route>/forest/phil-000E/</fr:route>
                        <fr:title text="Sexuation and the symbolic order (性化秩序)">Sexuation and the symbolic order (性化秩序)</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>In Lacanian theory, <html:em>sexuation</html:em> refers not to biological sex but to the subject's structural position within the symbolic order. "Masculine" and "feminine" are not natural categories but positions defined by their relation to the <html:em>phallus</html:em> — the master signifier that organises the symbolic field.</html:p>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2021</fr:year>
                              <fr:month>12</fr:month>
                              <fr:day>20</fr:day>
                            </fr:date>
                            <fr:title text="The constitutive exception">The constitutive exception</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>The masculine position is defined by a logical structure: <html:em>all</html:em> subjects are subject to symbolic castration, <html:em>except</html:em> for one. This exception — the "at least one" who is not castrated, the mythic primal father of Freud's <html:em>Totem and Taboo</html:em> — is the <html:em>constitutive exception</html:em> that founds the universal. The masculine set is totalised (closed, bounded) precisely because its limit is marked by what lies outside it.</html:p>
                            <html:p>The feminine position, by contrast, admits no exception. There is no "Woman" (with a capital W) who would serve as a boundary. Consequently, the feminine set is <html:em>not-all</html:em> (pas-toute) — open, unbounded, never fully captured by the symbolic. This is the meaning of Lacan's notorious claim that "The Woman does not exist": there is no universal essence of femininity, because the feminine position resists totalisation.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2021</fr:year>
                              <fr:month>12</fr:month>
                              <fr:day>20</fr:day>
                            </fr:date>
                            <fr:title text="The semiotic movement">The semiotic movement</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>The phallus as master signifier arises not from biology but from a contingent historical process. Certain bodily differences were seized upon and elevated into symbols of authority — but the choice of which differences to symbolise was arbitrary. The resulting symbolic order then requires a <html:em>constitutive outside</html:em>: something must be excluded and devalued so that the privileged term can appear necessary rather than contingent.</html:p>
                            <html:p>This is the fundamental mechanism of <fr:link href="/forest/phil-0001/" title="Structuralism" uri="https://kream.codeberg.page/forest/phil-0001/" display-uri="phil-0001" type="local">structuralist</fr:link> meaning-making: significance arises through difference and exclusion. The "feminine" is constituted as the negative term — the repository of whatever the "masculine" symbolic order cannot integrate. As Lacan and Žižek argue, the subject's own fissures and contradictions are projected outward onto a scapegoat, a constitutive Other whose exclusion masks the groundlessness of the order itself.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2021</fr:year>
                              <fr:month>12</fr:month>
                              <fr:day>20</fr:day>
                            </fr:date>
                            <fr:title text="Implications for critique">Implications for critique</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>If the masculine/feminine binary is a product of symbolic construction rather than nature, then genuine critique must target the symbolic mechanism itself — not merely reverse the valences. Movements that simply invert the hierarchy (replacing masculine privilege with feminine privilege) remain within the same structural logic. The more radical move, on this account, is to expose the constitutive exception as groundless: to show that the master signifier has no natural authority, and that the binary it organises is a contingent historical formation.</html:p>
                            <html:p>LGBT movements challenge the symbolic order precisely because they refuse to occupy either of the two prescribed positions, revealing that the binary was never exhaustive. They are, in structural terms, elements that the system cannot classify — further evidence that the symbolic order is constitutively incomplete.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2021</fr:year>
                              <fr:month>12</fr:month>
                              <fr:day>20</fr:day>
                            </fr:date>
                            <fr:title text="原文 (Chinese original)">原文 (Chinese original)</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>一开始万物都是平等，直到出现了"男性"。男性很莫名其妙地发现自己在一些方面比起女性有着"优势"，为了解释其"优势"，便用一个符号（phallus）作为其"优势"的载体，把它视作"神圣"。而任何神圣，都必然会有一个不神圣的东西与之对应。为什么？因为所有神圣都是凭空产生的，所有神圣都是掠夺性的。它从其他人那里掠夺了本不属于它的东西，然后为了掩盖自己的行为根本上是没有任何原因也不正当的，把矛头指向了被它掠夺过的其他人，让其他人承担自己行为的不合理性。</html:p>
                            <html:p>说到底，主体性的游戏就是这样。自身的缺陷和裂纹只要有大他者（语言，符号）的在场就永远能被投射到一个载体上。在男-女的结构中，男性成为了这个掠夺者，而女性则被动承担了其无意义的和不可言述的部分。</html:p>
                            <html:p>这个结构贯彻了我们整个父权社会。在这里，任何东西必然有它的反面（但是这个反面实际上是这个东西主动框定的）。</html:p>
                            <html:p>所以男性解放主义，女权主义和LGBT都是这个大男子主义的对立面，而且都是被大男子主义强行捏出来的概念。</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>4</fr:month>
                          <fr:day>1</fr:day>
                        </fr:date>
                        <fr:uri>https://kream.codeberg.page/forest/phil-000G/</fr:uri>
                        <fr:display-uri>phil-000G</fr:display-uri>
                        <fr:route>/forest/phil-000G/</fr:route>
                        <fr:title text="Lacan and Math">Lacan and Math</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>4</fr:month>
                              <fr:day>1</fr:day>
                            </fr:date>
                            <fr:title text="Sources">Sources</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>https://ncatlab.org/davidcorfield/files/PsychoAMath.pdf</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:title text="Chinese philosophy">Chinese philosophy</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <fr:tree show-metadata="false" expanded="false" toc="false" numbered="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>16</fr:day>
                        </fr:date>
                        <fr:uri>https://kream.codeberg.page/forest/phil-0008/</fr:uri>
                        <fr:display-uri>phil-0008</fr:display-uri>
                        <fr:route>/forest/phil-0008/</fr:route>
                        <fr:title text="缘 — fate in Chinese philosophy">缘 — fate in Chinese philosophy</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>There is no easy English translation for the Chinese character 缘. <html:em>Fate</html:em> and <html:em>destiny</html:em> touch on its surface, but neither captures the depth of the concept.</html:p>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>2</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="Definitions">Definitions</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>The character carries several interleaved meanings:</html:p>
                            <html:ol><html:li>The verge of something; along the edge.</html:li>
    <html:li>The threads of fate.</html:li>
    <html:li>The cause.</html:li>
    <html:li>Serendipity; the story.</html:li>
    <html:li>The probability of an event, depending on the interaction between people.</html:li></html:ol>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>2</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="The threads">The threads</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>The universal metaphor of fate as silk thread is shared among the most ancient civilisations. The thinness of thread encodes the fragility and futility of mortals against the linear progression of time.</html:p>
                            <html:p>But the Chinese interpretation differs from the Western one. 缘 is not a conspiracy by three old women in a dim cave, nor a chaotic wheel crushing human lives beneath it. It is omnipresent, something in the wind, something close to us at all times, connecting all people — but not strings tied to the fingers of a puppet master. These ethereal threads are elusive, usually intangible. Only the wisest can alter their impact.</html:p>
                            <html:p>A Chinese proverb captures this: 天衣无缝 — "the cloths of heaven are so finely woven there is no gap between threads." These threads even exceed the boundaries of life and death: reincarnation itself. A single thread can link people across different ages.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>2</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="缘 in art">缘 in art</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Makoto Shinkai's film <html:em>Your Name</html:em> (君の名は) portrays this concept:</html:p>
                            <html:blockquote>
                              <html:p>Someone who makes braided cords told me before... The cords represent the flow of time itself. The threads twist, tangle, unravel, and connect again. That's time...</html:p>
                            </html:blockquote>
                            <html:p>This is a romantic and aesthetic structure difficult for Western audiences to fully apprehend. It is like tracing tiny fractures — except they form a continuous path toward the person one is destined to meet. The beauty lies partly in the fact that it can <html:em>almost</html:em> be grasped by mortal effort.</html:p>
                            <html:p>The Chinese deity of love, 月老 (the Old Man under the Moon), uses red ropes to connect destined lovers. Love here is not the fierce arrow of Eros, piercing everything in its path, but a gentle bondage that pulls the fated together little by little through the accumulation of subtle forces.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>2</fr:month>
                              <fr:day>16</fr:day>
                            </fr:date>
                            <fr:title text="Singularity of 缘">Singularity of 缘</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>The 桃花源记 (<html:em>The Peach Blossom Spring</html:em>) illustrates that 缘 between two specific beings occurs only once. The underlying rules are incomprehensible to mortals. When we lose the chance, we lose it. There is no return.</html:p>
                            <html:p>The pronunciation of 缘 (yuán) is the same as 圆 (circle) — a symbol of wholeness, completion, and the cyclical nature of all things.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
              </fr:author>
            </fr:authors>
            <fr:uri>https://kream.codeberg.page/forest/cat-0005/</fr:uri>
            <fr:display-uri>cat-0005</fr:display-uri>
            <fr:route>/forest/cat-0005/</fr:route>
            <fr:title text="Sheaves in Geometry and Logic notes">Sheaves in Geometry and Logic notes</fr:title>
            <fr:meta name="draft">true</fr:meta>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Reading notes on <html:em><fr:link href="/forest/maclane1992sheaves/" title="Sheaves in geometry and logic: a first introduction to topos theory" uri="https://kream.codeberg.page/forest/maclane1992sheaves/" display-uri="maclane1992sheaves" type="local">Sheaves in geometry and logic: a first introduction to topos theory</fr:link></html:em> by Saunders Mac Lane and Ieke Moerdijk — a first introduction to topos theory.</html:p>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:uri>https://kream.codeberg.page/forest/cat-0006/</fr:uri>
                <fr:display-uri>cat-0006</fr:display-uri>
                <fr:route>/forest/cat-0006/</fr:route>
                <fr:title text="Prologue: Categorial Preliminaries">Prologue: Categorial Preliminaries</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>TODO</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:uri>https://kream.codeberg.page/forest/cat-0007/</fr:uri>
                <fr:display-uri>cat-0007</fr:display-uri>
                <fr:route>/forest/cat-0007/</fr:route>
                <fr:title text="Chapter I: Categories of Functors">Chapter I: Categories of Functors</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>TODO</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:uri>https://kream.codeberg.page/forest/cat-0008/</fr:uri>
                <fr:display-uri>cat-0008</fr:display-uri>
                <fr:route>/forest/cat-0008/</fr:route>
                <fr:title text="Chapter II: Sheaves of Sets">Chapter II: Sheaves of Sets</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>TODO</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:uri>https://kream.codeberg.page/forest/cat-0009/</fr:uri>
                <fr:display-uri>cat-0009</fr:display-uri>
                <fr:route>/forest/cat-0009/</fr:route>
                <fr:title text="Chapter III: Grothendieck Topologies and Sheaves">Chapter III: Grothendieck Topologies and Sheaves</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>TODO</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:uri>https://kream.codeberg.page/forest/cat-000A/</fr:uri>
                <fr:display-uri>cat-000A</fr:display-uri>
                <fr:route>/forest/cat-000A/</fr:route>
                <fr:title text="Chapter IV: First Properties of Elementary Topoi">Chapter IV: First Properties of Elementary Topoi</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>TODO</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:uri>https://kream.codeberg.page/forest/cat-000B/</fr:uri>
                <fr:display-uri>cat-000B</fr:display-uri>
                <fr:route>/forest/cat-000B/</fr:route>
                <fr:title text="Chapter V: Basic Constructions of Topoi">Chapter V: Basic Constructions of Topoi</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>TODO</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:uri>https://kream.codeberg.page/forest/cat-000C/</fr:uri>
                <fr:display-uri>cat-000C</fr:display-uri>
                <fr:route>/forest/cat-000C/</fr:route>
                <fr:title text="Chapter VI: Topoi and Logic">Chapter VI: Topoi and Logic</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>TODO</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:uri>https://kream.codeberg.page/forest/cat-000D/</fr:uri>
                <fr:display-uri>cat-000D</fr:display-uri>
                <fr:route>/forest/cat-000D/</fr:route>
                <fr:title text="Chapter VII: Geometric Morphisms">Chapter VII: Geometric Morphisms</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>TODO</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:uri>https://kream.codeberg.page/forest/cat-000E/</fr:uri>
                <fr:display-uri>cat-000E</fr:display-uri>
                <fr:route>/forest/cat-000E/</fr:route>
                <fr:title text="Chapter VIII: Classifying Topoi">Chapter VIII: Classifying Topoi</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>TODO</html:p>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:uri>https://kream.codeberg.page/forest/cat-000F/</fr:uri>
                <fr:display-uri>cat-000F</fr:display-uri>
                <fr:route>/forest/cat-000F/</fr:route>
                <fr:title text="Appendix: Sites for Topoi">Appendix: Sites for Topoi</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>TODO</html:p>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
        <fr:tree show-metadata="true" expanded="false" toc="false" numbered="false">
          <fr:frontmatter>
            <fr:authors>
              <fr:author>
                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
              </fr:author>
            </fr:authors>
            <fr:uri>https://kream.codeberg.page/forest/tt-AVRI/</fr:uri>
            <fr:display-uri>tt-AVRI</fr:display-uri>
            <fr:route>/forest/tt-AVRI/</fr:route>
            <fr:title text="Topos and type theory notes">Topos and type theory notes</fr:title>
            <fr:meta name="draft">true</fr:meta>
          </fr:frontmatter>
          <fr:mainmatter>
            <html:p>Reading notes on topos theory and type theory, drawn from multiple sources.</html:p>
            <fr:tree show-metadata="true" expanded="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2025</fr:year>
                  <fr:month>2</fr:month>
                  <fr:day>26</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/tt-AVSS/</fr:uri>
                <fr:display-uri>tt-AVSS</fr:display-uri>
                <fr:route>/forest/tt-AVSS/</fr:route>
                <fr:title text="A brief history of type theory">A brief history of type theory</fr:title>
                <fr:meta name="draft">true</fr:meta>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Translation of Trebor Huang's <html:em>类型论简史</html:em> (<fr:link href="https://github.com/Trebor-Huang/history" type="external">source</fr:link>) — a survey of type theory from Russell through HoTT.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>26</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVST/</fr:uri>
                    <fr:display-uri>tt-AVST</fr:display-uri>
                    <fr:route>/forest/tt-AVST/</fr:route>
                    <fr:title text="Introduction">Introduction</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO: preamble — Scholze liquid tensor experiment, Lean formalization, type theory as bridge</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2025</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>26</fr:day>
                        </fr:date>
                        <fr:title text="What is type theory?">What is type theory?</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>TODO</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2025</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>26</fr:day>
                        </fr:date>
                        <fr:title text="Naive syntax">Naive syntax</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>TODO</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2025</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>26</fr:day>
                        </fr:date>
                        <fr:title text="Objective and subjective logic">Objective and subjective logic</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>TODO</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2025</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>26</fr:day>
                        </fr:date>
                        <fr:title text="Semantics of type theory">Semantics of type theory</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>TODO</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2025</fr:year>
                          <fr:month>2</fr:month>
                          <fr:day>26</fr:day>
                        </fr:date>
                        <fr:title text="History of type theory">History of type theory</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>TODO</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>26</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVSU/</fr:uri>
                    <fr:display-uri>tt-AVSU</fr:display-uri>
                    <fr:route>/forest/tt-AVSU/</fr:route>
                    <fr:title text="Origins">Origins</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>26</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVSV/</fr:uri>
                    <fr:display-uri>tt-AVSV</fr:display-uri>
                    <fr:route>/forest/tt-AVSV/</fr:route>
                    <fr:title text="The Curry–Howard Correspondence">The Curry–Howard Correspondence</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>26</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVSW/</fr:uri>
                    <fr:display-uri>tt-AVSW</fr:display-uri>
                    <fr:route>/forest/tt-AVSW/</fr:route>
                    <fr:title text="Martin-Löf Type Theory">Martin-Löf Type Theory</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>26</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVSX/</fr:uri>
                    <fr:display-uri>tt-AVSX</fr:display-uri>
                    <fr:route>/forest/tt-AVSX/</fr:route>
                    <fr:title text="Categorical Semantics">Categorical Semantics</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>26</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVSY/</fr:uri>
                    <fr:display-uri>tt-AVSY</fr:display-uri>
                    <fr:route>/forest/tt-AVSY/</fr:route>
                    <fr:title text="Homotopy Type Theory">Homotopy Type Theory</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2025</fr:year>
                      <fr:month>2</fr:month>
                      <fr:day>26</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVSZ/</fr:uri>
                    <fr:display-uri>tt-AVSZ</fr:display-uri>
                    <fr:route>/forest/tt-AVSZ/</fr:route>
                    <fr:title text="Prospects">Prospects</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>TODO</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="true" expanded="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:uri>https://kream.codeberg.page/forest/tt-AVT9/</fr:uri>
                <fr:display-uri>tt-AVT9</fr:display-uri>
                <fr:route>/forest/tt-AVT9/</fr:route>
                <fr:title text="From syllogism to topos: a guide for philosophy students">From syllogism to topos: a guide for philosophy students</fr:title>
                <fr:meta name="draft">true</fr:meta>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>Translated and adapted from a Chinese-language essay (从三段论到拓扑斯：给哲学生的完整导引). The goal: starting from Aristotle's syllogism, pass through several <html:em>Momente</html:em> (moments/stages) to arrive at the concept of a <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/topos" type="external">topos</fr:link></html:span>. No mathematical background is assumed — only the willingness to follow each step slowly.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:title text="Syllogism — the starting point of logic">Syllogism — the starting point of logic</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter><html:p><html:strong>The simplest example.</html:strong> Aristotle's syllogism:</html:p><html:ol><html:li>Premise 1: All humans are mortal.</html:li>
    <html:li>Premise 2: Socrates is a human.</html:li>
    <html:li>Conclusion: Therefore, Socrates is mortal.</html:li></html:ol><html:p>This looks trivial, but we must ask: <html:em>why</html:em> is this reasoning valid? What is its structure?</html:p><html:p><html:strong>Dissecting the structure.</html:strong> Three "classes" (Aristotle's <html:em>categories</html:em>) are involved: mortal things (the largest class), humans (the middle class), Socrates (the smallest). The validity of the reasoning depends on a simple fact: <html:em>containment is transitive</html:em>. Socrates belongs to "humans", "humans" belong to "mortal things", so Socrates also belongs to "mortal things".</html:p><html:p><html:strong>Arrows and transitivity.</html:strong> Instead of nested circles, draw arrows:</html:p>
  <html:center><fr:resource hash="84e172733a855c281e780b75f3c81520"><fr:resource-content><html:img src="/forest/84e172733a855c281e780b75f3c81520.svg" /></fr:resource-content><fr:resource-source type="latex" part="preamble"><![CDATA[\usepackage {tikz-cd}\usepackage {amsopn}\usepackage {amssymb}\usepackage {mathrsfs}\usetikzlibrary {bending}]]></fr:resource-source><fr:resource-source type="latex" part="body"><![CDATA[    \begin{tikzcd}[column sep=large]
      \textrm{Socrates} \arrow[r] & \textrm{Humans} \arrow[r] & \textrm{Mortal things}
    \end{tikzcd}]]></fr:resource-source></fr:resource></html:center>
<html:p>Each arrow represents the "belongs to" relation. The core of the syllogism is: <html:strong>arrows can be composed end-to-end into new arrows.</html:strong> Remember this — the entire story that follows is built on this insight.</html:p><html:p><html:strong>Aristotle's hidden assumption.</html:strong> Aristotle used "categories" to refer to fundamental classifications of beings. For him, logic was the study of the membership relations between these categories. But there is a hidden assumption: <html:em>the world is determinate — a proposition is either true or false, with no third possibility.</html:em> This assumption is later called the <html:em>law of excluded middle</html:em>. We note it now; we will challenge it later.</html:p><html:p>One might say the syllogism is an <html:em>an sich</html:em> (in-itself) starting point: it contains the germ of all subsequent development (arrows and transitivity), but has not yet unfolded its own richness and limitations.</html:p></fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:title text="Category theory — making &quot;arrows&quot; into a general theory">Category theory — making "arrows" into a general theory</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p><html:strong>From concrete to abstract.</html:strong> In 1945, Eilenberg and Mac Lane noticed that "arrows plus transitivity" appears everywhere in mathematics: functions in set theory, continuous maps in geometry, homomorphisms in algebra. The common pattern is "objects + arrows + arrows can be composed". They extracted this common structure and called it a <fr:link href="/forest/cat-0003/" title="Category" uri="https://kream.codeberg.page/forest/cat-0003/" display-uri="cat-0003" type="local">category</fr:link>.</html:p>
                    <html:p>This step is a kind of <html:em>Aufhebung</html:em> (sublation): the concrete content of the syllogism (humans, Socrates...) is dropped — category theory no longer cares about these specific things; but the <html:em>form</html:em> (arrows and composition) is preserved and elevated to a higher level of abstraction.</html:p>
                    <html:p><html:strong>The definition of a category.</html:strong> A category needs only:</html:p>
                    <html:ol><html:li>A collection of <html:strong>objects</html:strong>. Category theory does not care what is "inside" an object — an object is just a name.</html:li>
    <html:li><html:strong>Arrows</html:strong> (morphisms) between objects, representing "relations" or "processes".</html:li>
    <html:li>Arrows can be <html:strong>composed</html:strong>. <fr:tex display="inline"><![CDATA[A \rightarrow  B]]></fr:tex> plus <fr:tex display="inline"><![CDATA[B \rightarrow  C]]></fr:tex> yields <fr:tex display="inline"><![CDATA[A \rightarrow  C]]></fr:tex>. This is precisely the transitivity of the syllogism.</html:li>
    <html:li>Every object has an <html:strong>identity arrow</html:strong> from itself to itself — "doing nothing".</html:li>
    <html:li>Composition is <html:strong>associative</html:strong>.</html:li></html:ol>
                    <html:p><html:strong>Relationalism — the priority of mediation.</html:strong> The definition never says what an object <html:em>is</html:em>, only what arrows exist between objects. This is a thoroughgoing <html:em>relational</html:em> stance: <html:em>the essence of a thing lies not in its internal constitution, but in its relations to other things.</html:em></html:p>
                    <html:p>This resonates with Hegel's notion of <html:em>Vermittlung</html:em> (mediation) and with Saussure's insight that language has no isolated meanings, only differences and relations. Category theory says the same of mathematics — an object's "identity" is entirely determined by the arrows it sends and receives.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:title text="The category of sets — the most familiar &quot;world&quot;">The category of sets — the most familiar "world"</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>The most important category is <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex> — all sets as objects, functions as arrows.</html:p>
                    <html:p><html:strong>Logic in <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex>: true or false.</html:strong> In <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex>, a proposition is either true or false. Mathematically, we use <fr:tex display="inline"><![CDATA[\Omega  = \{\top , \bot \}]]></fr:tex> to represent all possible truth values. This <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> is called the <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/subobject%20classifier" type="external">subobject classifier</fr:link></html:span> — the "tool for deciding truth and falsity". In <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex>, <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> has exactly two elements, so the logic is classical two-valued logic and the law of excluded middle holds.</html:p>
                    <html:p>In philosophical terms, <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex> is a domain of <html:em>Verstand</html:em> (understanding): everything is either-or, no grey zones, no transitions. Clear and determinate, but therefore rigid.</html:p>
                    <html:p><html:strong>Products and subobjects.</html:strong> Given sets <fr:tex display="inline"><![CDATA[A]]></fr:tex> and <fr:tex display="inline"><![CDATA[B]]></fr:tex>, their product <fr:tex display="inline"><![CDATA[A \times  B]]></fr:tex> is the set of all ordered pairs. "Humans" is a subset of "animals" — this is precisely the "containment" of Aristotle's syllogism.</html:p>
                    <html:p><html:strong>Exponential objects: turning change into a thing.</html:strong> Fix two sets <fr:tex display="inline"><![CDATA[A]]></fr:tex> and <fr:tex display="inline"><![CDATA[B]]></fr:tex>. How many different functions <fr:tex display="inline"><![CDATA[A \rightarrow  B]]></fr:tex> exist? Take <fr:tex display="inline"><![CDATA[A = \{0,1\}]]></fr:tex> and <fr:tex display="inline"><![CDATA[B = \{0,1,2\}]]></fr:tex>. A function must specify: where does 0 go? where does 1 go? For 0, there are three choices (map to 0, 1, or 2); for 1, also three. Total: <fr:tex display="inline"><![CDATA[3 \times  3 = 9]]></fr:tex> functions. We can list them all:</html:p>
                    <html:table>
    <html:thead>
      <html:tr>
        <html:th />
        <html:th><fr:tex display="inline"><![CDATA[f_1]]></fr:tex></html:th>
        <html:th><fr:tex display="inline"><![CDATA[f_2]]></fr:tex></html:th>
        <html:th><fr:tex display="inline"><![CDATA[f_3]]></fr:tex></html:th>
        <html:th><fr:tex display="inline"><![CDATA[f_4]]></fr:tex></html:th>
        <html:th><fr:tex display="inline"><![CDATA[f_5]]></fr:tex></html:th>
        <html:th><fr:tex display="inline"><![CDATA[f_6]]></fr:tex></html:th>
        <html:th><fr:tex display="inline"><![CDATA[f_7]]></fr:tex></html:th>
        <html:th><fr:tex display="inline"><![CDATA[f_8]]></fr:tex></html:th>
        <html:th><fr:tex display="inline"><![CDATA[f_9]]></fr:tex></html:th>
      </html:tr>
    </html:thead>
    <html:tbody>
      <html:tr>
        <html:td><fr:tex display="inline"><![CDATA[0 \mapsto ]]></fr:tex></html:td>
        <html:td>0</html:td>
        <html:td>1</html:td>
        <html:td>2</html:td>
        <html:td>0</html:td>
        <html:td>1</html:td>
        <html:td>2</html:td>
        <html:td>0</html:td>
        <html:td>1</html:td>
        <html:td>2</html:td>
      </html:tr>
      <html:tr>
        <html:td><fr:tex display="inline"><![CDATA[1 \mapsto ]]></fr:tex></html:td>
        <html:td>0</html:td>
        <html:td>0</html:td>
        <html:td>0</html:td>
        <html:td>1</html:td>
        <html:td>1</html:td>
        <html:td>1</html:td>
        <html:td>2</html:td>
        <html:td>2</html:td>
        <html:td>2</html:td>
      </html:tr>
    </html:tbody>
  </html:table>
                    <html:p>These 9 functions themselves form a new set — a set of size 9. We write it <fr:tex display="inline"><![CDATA[B^A]]></fr:tex>, read "<fr:tex display="inline"><![CDATA[B]]></fr:tex> to the power <fr:tex display="inline"><![CDATA[A]]></fr:tex>" (here <fr:tex display="inline"><![CDATA[3^2 = 9]]></fr:tex> — the name comes from this). This is the <html:em>exponential object</html:em>.</html:p>
                    <html:p>Notice what happened: <html:em>change itself became a thing.</html:em> Originally, a function is an arrow between objects — not an object, but a relation. Now we collect all arrows <fr:tex display="inline"><![CDATA[A \rightarrow  B]]></fr:tex> into a new object — arrows become objects. It is as if you can not only observe changes in the world, but also take "change" itself off the shelf, place it on the table, study it, compare it, operate on it.</html:p>
                    <html:p>The deeper implication: since functions are now objects, you can construct <html:em>functions of functions</html:em> — a higher-order function that takes a function as input and outputs another function. This gives the system a capacity for self-reference: relations no longer exist only between objects; relations themselves become objects available for inspection. The system begins to <html:em>reflect on</html:em> its own transformations.</html:p>
                    <html:p><html:strong>The key question.</html:strong> <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex> is the "home" of classical logic. But now we ask: <html:em>is <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex> the only possible "world"?</html:em> Are there other categories that also possess products, exponentials, and a subobject classifier, but whose logic is not classical? This is the origin of the topos.</html:p>
                    <html:p>This question marks a turning point: we begin to doubt the universality of <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex>, to realize it may be only one special case among many "worlds". As the saying goes, "what is familiar is not for that reason known" — <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex>'s determinacy, its two-valuedness, may be precisely its limitation.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:title text="Local and global — the intuition of sheaves">Local and global — the intuition of sheaves</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p><html:strong>The Buffalo jigsaw.</html:strong> Imagine you are in Buffalo, New York — a city with a special connection to category theory, where the late William <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/Lawvere" type="external">Lawvere</fr:link></html:span> worked for many years, and who first linked topos theory with philosophical speculation.</html:p>
                    <html:p>You and friends scattered across Buffalo are assembling a jigsaw puzzle of the city. Each person holds some pieces. Success requires one condition: <html:em>adjacent pieces must match</html:em> — edge patterns must align. If they all match, the complete picture can be recovered from the fragments.</html:p>
                    <html:p>A <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/sheaf" type="external">sheaf</fr:link></html:span> in mathematics says exactly this: "fragments" are "local information", "matching" is "agreeing on overlaps": <html:em>if each person's local information is mutually consistent on overlaps, a unique piece of complete global information can be assembled.</html:em></html:p>
                    <html:p>
                      <html:strong>What information can be assembled, and what cannot?</html:strong>
                    </html:p>
                    <html:ul><html:li><html:strong>Terrain (a sheaf).</html:strong> Each person observes the terrain of their neighbourhood. Where observations overlap, they agree. Pieced together, all observations yield a complete terrain map. You do not need a god's-eye view — honest local recording plus mutual checking at boundaries suffices.</html:li>
    <html:li><html:strong>Highest point (not a sheaf).</html:strong> Each person finds their neighbourhood's highest point. There is no inconsistency on overlaps. But you cannot assemble "the city's highest point" from "each neighbourhood's highest point" — that requires a <html:em>global comparison</html:em> that local gluing cannot provide.</html:li></html:ul>
                    <html:p><html:strong>Philosophical significance: totality within finitude.</html:strong> No one possesses a "god's-eye view"; every perspective is finite. But if different perspectives are <html:em>mutually consistent at their boundaries</html:em> — if they coordinate at overlaps — then the finitude of the local can be overcome and a global picture can emerge. Hegel's "the true is the whole" (Das Wahre ist das Ganze) expresses a similar conviction: the whole is not given in advance, but assembled through the mediation of finite, one-sided moments.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:title text="Topos — a &quot;generalized universe&quot;">Topos — a "generalized universe"</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p><html:strong>Grothendieck's discovery.</html:strong> In the 1960s, Grothendieck discovered something astonishing: <html:em>collecting all sheaves on a space, the resulting category looks almost identical to <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex></html:em> — it has products, exponentials, and a subobject classifier. He called such a category a <html:strong>topos</html:strong> (Greek for "place"). Lawvere and Tierney then (1969–70) further abstracted this into the axiomatic definition of an <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/elementary%20topos" type="external">elementary topos</fr:link></html:span>.</html:p>
                    <html:p>
                      <html:strong>The four conditions of a topos:</html:strong>
                    </html:p>
                    <html:ol><html:li><html:strong>All finite limits</html:strong> — products, intersections, and other "synthetic" operations.</html:li>
    <html:li><html:strong>All finite colimits</html:strong> — unions, gluings, and other "generative" operations.</html:li>
    <html:li><html:strong>Exponential objects</html:strong> — arrows are themselves objects, giving the topos the capacity for "reflection".</html:li>
    <html:li><html:strong>A subobject classifier <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex></html:strong> — a "truth-value object" that determines the internal logic.</html:li></html:ol>
                    <html:p>(Technical note: strictly, conditions 1, 3, and 4 suffice — Paré proved in 1974 that finite colimits follow from the rest.)</html:p>
                    <html:p>
                      <html:strong>The key point: different toposes can have different <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex>'s.</html:strong>
                    </html:p>
                    <html:p><html:strong>The variation of <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> — logic is no longer fixed.</html:strong> In <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex>, <fr:tex display="inline"><![CDATA[\Omega  = \{\top , \bot \}]]></fr:tex>, with only two values. But in a topos of sheaves, <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> can have many "truth values". For example, in the topos of sheaves on the time line, the truth value of a proposition is not "true" or "false" but <html:em>"from when it becomes true"</html:em>. "It is raining" might have truth value "true from 3pm onwards" — not any element of <fr:tex display="inline"><![CDATA[\{\top , \bot \}]]></fr:tex>, but a <html:em>time interval</html:em>. "Truth" has acquired degree, context, and temporality.</html:p>
                    <html:p><html:strong>The failure of excluded middle.</html:strong> In classical logic, "raining or not raining" is always true. But in the temporal sheaf topos, the union of two open intervals need not cover the whole timeline — at the critical instant, neither holds. This is not ignorance; the <html:em>logical structure of the universe itself</html:em> permits intermediate states. The internal logic of a topos is <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/intuitionistic%20logic" type="external">intuitionistic logic</fr:link></html:span> — it accepts all rules of classical logic except the law of excluded middle.</html:p>
                    <html:p><html:strong>Intuitionistic logic: a different mode of reasoning.</html:strong> Before introducing Heyting algebras, a few more words on intuitionistic logic are warranted. It is not a crippled classical logic, but an independent, self-contained mode of reasoning with its own philosophical motivation.</html:p>
                    <html:p>The core principle of classical logic: true and false are the only two possibilities. You can prove <fr:tex display="inline"><![CDATA[P]]></fr:tex> by showing "<fr:tex display="inline"><![CDATA[\neg  P]]></fr:tex> leads to contradiction" — even if you have no idea <html:em>why</html:em> <fr:tex display="inline"><![CDATA[P]]></fr:tex> holds. This is <html:em>reductio ad absurdum</html:em>, and it depends on excluded middle: since <fr:tex display="inline"><![CDATA[P]]></fr:tex> is either true or false, ruling out false leaves only true.</html:p>
                    <html:p>Intuitionistic logic refuses this step. Its basic stance: <html:em>for a proposition to be true means we possess a construction or evidence for it.</html:em> Merely ruling out "false" does not amount to "constructing" true. An analogy: you are lost in Buffalo. Someone tells you "you are not in the South District" — this eliminates one possibility, but does not tell you where you actually <html:em>are</html:em>. In intuitionistic logic, you must provide a concrete route before you can claim to know your location.</html:p>
                    <html:p>Intuitionistic logic retains most classical rules: "and" (<fr:tex display="inline"><![CDATA[A \land  B]]></fr:tex>), "or" (<fr:tex display="inline"><![CDATA[A \lor  B]]></fr:tex>), "implies" (<fr:tex display="inline"><![CDATA[A \Rightarrow  B]]></fr:tex>), "not" (<fr:tex display="inline"><![CDATA[\neg  A]]></fr:tex>) all remain, as do inference patterns like the syllogism and modus ponens. Only excluded middle and the reductio that depends on it are rejected. This means intuitionistic logic proves <html:em>fewer</html:em> theorems — but each one is more "real": you not only know that something holds, but <html:em>why and how</html:em> it holds.</html:p>
                    <html:p><html:strong>Heyting algebras.</html:strong> Just as <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/Boolean%20algebra" type="external">Boolean algebras</fr:link></html:span> model classical logic, <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/Heyting%20algebra" type="external">Heyting algebras</fr:link></html:span> model intuitionistic logic. In a Boolean algebra, <fr:tex display="inline"><![CDATA[\neg  P]]></fr:tex> is the complement — <fr:tex display="inline"><![CDATA[P \lor  \neg  P]]></fr:tex> covers everything. In a Heyting algebra, <fr:tex display="inline"><![CDATA[\neg  P = (P \Rightarrow  \bot )]]></fr:tex>, and there can be a <html:em>gap</html:em> between <fr:tex display="inline"><![CDATA[P]]></fr:tex> and <fr:tex display="inline"><![CDATA[\neg  P]]></fr:tex>. A concrete example: on the real line, take <fr:tex display="inline"><![CDATA[P = (3, \infty )]]></fr:tex>. Then <fr:tex display="inline"><![CDATA[\neg  P = (-\infty , 3)]]></fr:tex>. Their union <fr:tex display="inline"><![CDATA[(-\infty , 3) \cup  (3, \infty )]]></fr:tex> misses the instant <fr:tex display="inline"><![CDATA[t = 3]]></fr:tex>. Excluded middle fails.</html:p>
                    <html:p><html:strong>The crucial connection:</html:strong> the subobject classifier <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> of <html:em>every</html:em> topos naturally forms an internal Heyting algebra. This is not stipulated — it is a theorem that follows automatically from the categorical structure. Thus the internal logic of a topos is <html:em>inherently intuitionistic</html:em>. Boolean algebra — classical logic — is just the special case when the gap happens to be empty.</html:p>
                    <html:p><html:strong>The internal language: from propositions to a full universe.</html:strong> A Heyting algebra describes intuitionistic logic at the propositional level — only truth values and their operations (and, or, implies, not), with no variables and no quantifiers. But a topos is far richer. Its internal language is a full higher-order intuitionistic type theory — a language that lifts intuitionistic logic from the propositional level to the level of an entire mathematical universe.</html:p>
                    <html:p>What does this "lifting" (sometimes called <html:em>categorification</html:em>) mean? In a Heyting algebra, you have only propositions and logical relations between them — "zeroth-order" logic, static truth-value operations. In a topos, you have objects (analogous to sets or types), morphisms (analogous to functions), quantifiers ("for all <fr:tex display="inline"><![CDATA[x]]></fr:tex>" and "there exists <fr:tex display="inline"><![CDATA[x]]></fr:tex>" can both be defined), and higher-order structure — you can speak of "properties of properties" and "functions of functions", because exponential objects let you treat arrows themselves as objects.</html:p>
                    <html:p>In other words: a topos is a universe in which you can <html:em>do intuitionistic mathematics</html:em>. It tells you not only how propositions compute (Heyting algebra), but how objects are constructed, functions are defined, and quantification proceeds — all within the intuitionistic framework. Lawvere and Tierney proposed the elementary topos precisely because they recognized this: a topos is the semantic model for intuitionistic higher-order logic, and intuitionistic higher-order logic is the internal language of a topos. The two are mirror images.</html:p>
                    <html:p>You can "speak" inside a topos — state and prove theorems in a language resembling ordinary mathematics, except it follows intuitionistic rules. Every sentence in the internal language translates to a categorical diagram; every categorical construction corresponds to an expression in the internal language. This perfect correspondence between language and structure is the <html:em>internal language theorem</html:em>, one of the deepest results of topos theory.</html:p>
                    <html:p>Logical language and categorical structure turn out to be two faces of the same thing — one facing language, one facing structure, their correspondence flowing automatically from the definitions.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:title text="Philosophical significance">Philosophical significance</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p><html:strong>Ontological pluralism.</html:strong> Traditional philosophy assumes one unified world. <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex> is the mathematical realization of this assumption. Toposes shatter it: each topos is a self-sufficient universe with its own objects, relations, and logic. This goes further than Leibniz's possible worlds — different worlds differ not only in "content" but in "logic" itself.</html:p>
                    <html:p><html:strong>The contextuality of logic.</html:strong> Logic is not the "a priori framework" of the world but a reflection of the world's "internal structure". In <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex>, logic is classical because the structure is discrete, global, determinate. In a sheaf topos, logic is intuitionistic because information is local, perspectival, gradual. Logic <html:em>grows from</html:em> categorical structure rather than being <html:em>imposed from outside</html:em>.</html:p>
                    <html:p><html:strong>The fate of the syllogism.</html:strong> In <html:em>any</html:em> topos, the syllogism remains valid — transitivity of arrows is part of the definition of a category. But its <html:em>semantics</html:em> changes: "all humans are mortal" may mean "in these local regions, humans are contained in mortal things". The same inferential form, in different toposes, acquires different depth and texture.</html:p>
                    <html:p><html:strong>From foundationalism to pluralism.</html:strong> Toposes suggest a post-foundationalist stance: there is no uniquely "correct" logic, ontology, or truth value. But this is not nihilism. Each topos has strict internal rules; the sheaf gluing condition ensures local perspectives must be compatible. Each topos is a "one-sided" universe, but because infinitely many toposes are connected by <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/functor" type="external">functors</fr:link></html:span>, a richer picture emerges — not an abstract unity that erases differences, but a coherent totality that encompasses them.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:title text="Internalization versus presupposition">Internalization versus presupposition</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p><html:strong>Two ways of doing mathematics.</html:strong> The standard approach: choose axioms (e.g. ZFC), then build everything on top. Want natural numbers? Construct them. Want the axiom of choice? Add it. This is the way of <html:em>external addition</html:em>: the basic logical framework (classical two-valued logic) is given in advance; the mathematician adjusts the world's properties by adding or removing axioms within this fixed framework. Logic is the unchangeable premise; axioms are the adjustable parameters.</html:p>
                    <html:p>The topos approach is radically different. It presupposes no particular axiom system and no classical logic. Starting from categorical structure alone — "objects", "arrows", "composition" — it lets logic <html:em>emerge</html:em>. The subobject classifier <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> is not "added" but <html:em>grows from</html:em> the categorical structure. This is <html:strong>internalization</html:strong> (Internalisierung) as opposed to external presupposition.</html:p>
                    <html:p><html:strong>The philosophical parallel.</html:strong> Hegel criticized beginning philosophy with unexamined presuppositions — declaring principles "as if shot from a pistol" and then applying them to everything. He favoured letting concepts unfold from within. Axiomatic set theory does the opposite: logic is presupposed, axioms are externally added, the rules are fixed before the game begins.</html:p>
                    <html:p>Category theory and topos theory offer a different posture. In category theory, you do not presuppose what an object <html:em>is</html:em> — identity is determined by position in the arrow network. In a topos, you do not presuppose what logic <html:em>is</html:em> — logic is internally generated by the categorical structure.</html:p>
                    <html:p><html:strong>Significance for mathematics.</html:strong> The topos perspective amounts to a revolution in mathematical worldview. In the traditional view, mathematics has one "absolute background" — the set-theoretic universe <fr:tex display="inline"><![CDATA[V]]></fr:tex>. All mathematical objects "live" in this universe; all theorems are proved here. Mathematicians debate the specific properties of this universe (does the continuum hypothesis hold? do large cardinals exist?), but rarely question the premise that <html:em>there is only one universe</html:em>.</html:p>
                    <html:p>Topos theory shatters this premise. <html:em>Mathematics is not an activity occurring in a single fixed universe, but an activity that can unfold in any topos.</html:em> Different toposes give different mathematics: in Hyland's effective topos, every function <fr:tex display="inline"><![CDATA[\mathbb {R} \rightarrow  \mathbb {R}]]></fr:tex> is continuous; in certain toposes, the real line cannot be decomposed into two complementary nonempty subsets — even the most basic set-theoretic intuitions may fail. These are not curiosities but rigorous theorems.</html:p>
                    <html:p>It is like discovering a "mathematical multiverse" — each topos is a parallel universe with its own physical laws (logic) and natural landscape (the behavior of mathematical objects). Classical mathematics is just one particularly "rigid" universe, not the only possibility.</html:p>
                    <html:p><html:strong>Significance for philosophy.</html:strong> For philosophy, the topos provides not merely an analogy but an <html:em>operational speculative tool</html:em>. Many philosophical debates — realism vs. anti-realism, classical vs. non-classical logic, foundationalism vs. anti-foundationalism — have long remained at the level of opposing stances. Topos theory gives these debates a new dimension: opposing positions may not be either-or choices, but different facets visible in different toposes. Both are legitimate; the arena differs.</html:p>
                    <html:p>More deeply, the topos demonstrates a mode of speculation that does not depend on presuppositions. Analytic philosophy tends to first fix a logic and then discuss problems within it — like doing mathematics in ZFC, you must accept a framework before you can speak. But the topos shows that frameworks <html:em>themselves</html:em> can be "thematized": you can ask "if logic were different, what would the world look like?" — and this question has precise mathematical meaning.</html:p>
                    <html:p><html:strong>Why category theory can carry philosophy.</html:strong> Three reasons:</html:p>
                    <html:ol><html:li><html:strong>It does not presuppose content.</html:strong> A framework that pins down logic and ontology in advance cannot accommodate reflection on its own premises. Category theory presupposes neither. The nature of philosophical speculation is to question all presuppositions.</html:li>
    <html:li><html:strong>It is endogenous.</html:strong> In a topos, logic is not an external decoration but an internal product of structure. As Lawvere put it, "form" is not external to "content" but the manner in which content unfolds itself.</html:li>
    <html:li><html:strong>It maintains unity in difference.</html:strong> Functors and natural transformations describe systematic connections between different structures. Different toposes are not isolated fragments but illuminate each other through functors — not an abstract identity that erases difference, but a coherent unity that pervades it.</html:li></html:ol>
                    <html:p><html:strong>Final words.</html:strong> Topos theory demonstrates that an intellectual activity which does not take external presuppositions as premises — which lets structure itself speak — is possible not only in philosophy, but also in mathematics. The result is a conceptual system in which each stage grows internally from the preceding one, and in which logic is not a rigid rule but a form that unfolds as content unfolds. When mathematics and philosophy meet at this level, the boundary between them may be far more blurred than we supposed.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:title text="The complete journey">The complete journey</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:table>
    <html:thead>
      <html:tr>
        <html:th>Stage</html:th>
        <html:th>Core idea</html:th>
        <html:th>Philosophical import</html:th>
      </html:tr>
    </html:thead>
    <html:tbody>
      <html:tr>
        <html:td>1. Syllogism</html:td>
        <html:td>Membership is transitive</html:td>
        <html:td><html:em>An sich</html:em> starting point</html:td>
      </html:tr>
      <html:tr>
        <html:td>2. Category theory</html:td>
        <html:td>Objects + arrows + composition</html:td>
        <html:td><html:em>Aufhebung</html:em>: abstract elevation of form</html:td>
      </html:tr>
      <html:tr>
        <html:td>3. <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex></html:td>
        <html:td><fr:tex display="inline"><![CDATA[\Omega  = \{\top , \bot \}]]></fr:tex></html:td>
        <html:td>Domain of <html:em>Verstand</html:em>: two-valued logic</html:td>
      </html:tr>
      <html:tr>
        <html:td>4. Sheaves</html:td>
        <html:td>Local information assembles into global</html:td>
        <html:td>Totality within finitude</html:td>
      </html:tr>
      <html:tr>
        <html:td>5. Topos</html:td>
        <html:td><fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> has multiple truth values</html:td>
        <html:td>Concrete totality</html:td>
      </html:tr>
      <html:tr>
        <html:td>6. Intuitionistic logic</html:td>
        <html:td>Heyting algebra; internal language</html:td>
        <html:td>Unity of concept and reality</html:td>
      </html:tr>
    </html:tbody>
  </html:table>
                    <html:p>Aristotle discovered the transitivity of arrows. Category theory made arrows into a general theory. The topos discovered: <html:em>change the world of arrows, and even the meaning of "true" and "false" changes with it.</html:em></html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:title text="Appendix: Frequently asked questions">Appendix: Frequently asked questions</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>
                      <html:strong>Q: Is topos the same thing as "logical pluralism"?</html:strong>
                    </html:p>
                    <html:p>Not exactly. Logical pluralism is a philosophical stance. Topos theory provides one of its mathematical models — showing how logical pluralism can be realized within a rigorous framework.</html:p>
                    <html:p>
                      <html:strong>Q: Is intuitionistic logic "weaker" than classical logic?</html:strong>
                    </html:p>
                    <html:p>From one angle, yes — fewer theorems can be proved. From another angle, it is "stronger": every proof is constructive. If you prove "there exists an <fr:tex display="inline"><![CDATA[x]]></fr:tex>", you can actually produce that <fr:tex display="inline"><![CDATA[x]]></fr:tex>.</html:p>
                    <html:p>
                      <html:strong>Q: Is the Hegel–topos connection a strict correspondence?</html:strong>
                    </html:p>
                    <html:p>The connections drawn in this essay are primarily philosophical analogies. But it is worth noting that <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/Lawvere" type="external">Lawvere</fr:link></html:span>, from the 1980s onward, seriously pursued the category-theoretic formalization of Hegelian logic. He gave precise mathematical definitions for "unity of opposites" and <html:em>Aufhebung</html:em> (using adjoint modalities and the lattice structure of subtoposes), and argued that category theory provides useful formal models for dialectical philosophy. The <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/nLab" type="external">nLab</fr:link></html:span> contains extensive material on this. So the relationship is not merely analogical — in Lawvere's work, it has partly become genuine mathematics.</html:p>
                    <html:p>
                      <html:strong>Q: Why did Grothendieck invent toposes?</html:strong>
                    </html:p>
                    <html:p>The motivation was purely mathematical: the classical notion of "space" in algebraic geometry was insufficient, and he needed more flexible spaces to attack deep problems such as the Weil conjectures. But the philosophical implications of this tool far exceed algebraic geometry itself.</html:p>
                    <html:p>
                      <html:strong>Q: Can you explain the difference between "internalization" and "adding axioms" more plainly?</html:strong>
                    </html:p>
                    <html:p>Here is an analogy. Axiomatic set theory is like a building that has already been constructed: the foundation (classical logic) is fixed, and you can freely renovate inside (add axioms), but you cannot alter the load-bearing structure. A topos is more like a set of architectural principles: it does not give you one specific building, but tells you "what kind of structure qualifies as a building". With these principles you can erect infinitely many different buildings, each with its own foundation and load-bearing design. The difference: the former operates <html:em>within</html:em> one "already-determined" world; the latter moves freely <html:em>between</html:em> possible worlds.</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="true" expanded="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>3</fr:month>
                  <fr:day>24</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/tt-AVTA/</fr:uri>
                <fr:display-uri>tt-AVTA</fr:display-uri>
                <fr:route>/forest/tt-AVTA/</fr:route>
                <fr:title text="Continuation">Continuation</fr:title>
                <fr:meta name="draft">true</fr:meta>
              </fr:frontmatter>
              <fr:mainmatter>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>24</fr:day>
                    </fr:date>
                    <fr:title text="Reviewing Tail recursion">Reviewing Tail recursion</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Tail Recursion is the </html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>24</fr:day>
                        </fr:date>
                        <fr:title text="Length of list function example">Length of list function example</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Using an accumulator:</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>24</fr:day>
                    </fr:date>
                    <fr:title text="Continuation-Pass Style">Continuation-Pass Style</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Instead of maintaining a value with recursive calls, we are maintaining a call that passes in the value as an argument and produce an arbituary effect. Effectively, we are adding it to the context of some computational environment.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>24</fr:day>
                    </fr:date>
                    <fr:title text="Planned Links">Planned Links</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Monadic Effects</html:p>
                    <html:p>Infinitary Lawvere Theory</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="true" expanded="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:date>
                  <fr:year>2026</fr:year>
                  <fr:month>6</fr:month>
                  <fr:day>2</fr:day>
                </fr:date>
                <fr:uri>https://kream.codeberg.page/forest/tt-AVTC/</fr:uri>
                <fr:display-uri>tt-AVTC</fr:display-uri>
                <fr:route>/forest/tt-AVTC/</fr:route>
                <fr:title text="My first proof assistant: the journey towards an ETCS prover">My first proof assistant: the journey towards an ETCS prover</fr:title>
                <fr:meta name="draft">true</fr:meta>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:p>This is a guide/documentation for my implementation of a minimalistic theorem prover based on ETCS. It started as a final mini project for a programming language course, originally written in plait. The current version uses agda, which is meant as an extension on <html:em>Programming Language Foundations in Agda</html:em>.</html:p>
                <html:p>The motivations for this project are as follows:
  <html:ul><html:li>to fill in the gap between a naive implementation of a theorem prover and a modern prover based on Calculus of Inductive Constructions/Dependent Type Theory.</html:li>
    <html:li>as a survey on the different foundations of mathematics(type theory, category theory, and set theory), and bridge in between with something to play with.</html:li>
    <html:li>a first look at the semantics of type theories, in this case we will be mostly concerned with locally cartesian closed categories for interpreting our type theory.</html:li></html:ul></html:p>
                <html:p>From a type-theoretic perspective, the categorical structure of ETCS provides a natural semantics for type systems. The cartesian closed structure interprets simply typed lambda calculus, the subobject classifier internalises propositional logic, and the locally cartesian closed slices interpret dependent types. This makes ETCS a useful bridge between set-theoretic, categorical, and type-theoretic foundations — and a natural target for a proof assistant that aims to connect these traditions.</html:p>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>3</fr:month>
                      <fr:day>2</fr:day>
                    </fr:date>
                    <fr:uri>https://kream.codeberg.page/forest/tt-AVT6/</fr:uri>
                    <fr:display-uri>tt-AVT6</fr:display-uri>
                    <fr:route>/forest/tt-AVT6/</fr:route>
                    <fr:title text="Elementary Theory of the Category of Sets">Elementary Theory of the Category of Sets</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>The <html:strong>Elementary Theory of the Category of Sets</html:strong> (ETCS) is a first-order axiomatisation of set theory introduced by Lawvere in <fr:link href="/forest/lawvere1964elementary/" title="An elementary theory of the category of sets" uri="https://kream.codeberg.page/forest/lawvere1964elementary/" display-uri="lawvere1964elementary" type="local">An elementary theory of the category of sets</fr:link>. Instead of axiomatising a global membership relation <fr:tex display="inline"><![CDATA[\in ]]></fr:tex> (as in ZFC), ETCS axiomatises the <html:em>category</html:em> <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex> directly: its objects are sets, its morphisms are functions, and its axioms assert that this category has enough structure to recover ordinary mathematics.</html:p>
                    <html:p>Concretely, <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex> is required to be a well-pointed topos with a natural number object and choice. 

The difference between ETCS and material set theory (like ZFC) is that sets have no "internal" membership structure — an element of <fr:tex display="inline"><![CDATA[X]]></fr:tex> is a morphism <fr:tex display="inline"><![CDATA[1 \rightarrow  X]]></fr:tex> from the terminal object(the singleton), and two sets are interchangeable whenever they are isomorphic. This makes ETCS a <html:em>structural</html:em> set theory: only the arrows between objects matter, never what objects "contain" internally.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>2</fr:day>
                        </fr:date>
                        <fr:title text="Axiomatic Presentation">Axiomatic Presentation</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Following <fr:link href="/forest/leinster2014rethinking/" title="Rethinking set theory" uri="https://kream.codeberg.page/forest/leinster2014rethinking/" display-uri="leinster2014rethinking" type="local">Leinster</fr:link> (see also his <fr:link href="/forest/leinster2011axiomatic/" title="Axiomatic set theory" uri="https://kream.codeberg.page/forest/leinster2011axiomatic/" display-uri="leinster2011axiomatic" type="local">lecture notes</fr:link> for a fully worked-out treatment), the axioms of ETCS state that <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex> is a category satisfying:</html:p>
                        <html:ol><html:li>Composition of functions obeys associativity and identity laws.</html:li>
    <html:li>There is a set with exactly one element.</html:li>
    <html:li>A function is determined by its effect on elements.</html:li>
    <html:li>There is a set with no elements.</html:li>
    <html:li>Given sets <fr:tex display="inline"><![CDATA[X]]></fr:tex> and <fr:tex display="inline"><![CDATA[Y]]></fr:tex>, one can form their cartesian product <fr:tex display="inline"><![CDATA[X \times  Y]]></fr:tex>.</html:li>
    <html:li>Given sets <fr:tex display="inline"><![CDATA[X]]></fr:tex> and <fr:tex display="inline"><![CDATA[Y]]></fr:tex>, one can form the set of functions from <fr:tex display="inline"><![CDATA[X]]></fr:tex> to <fr:tex display="inline"><![CDATA[Y]]></fr:tex>.</html:li>
    <html:li>Given <fr:tex display="inline"><![CDATA[f : X \rightarrow  Y]]></fr:tex> and <fr:tex display="inline"><![CDATA[y \in  Y]]></fr:tex>, one can form the preimage <fr:tex display="inline"><![CDATA[f^{-1}(y)]]></fr:tex>.</html:li>
    <html:li>The subsets of a set <fr:tex display="inline"><![CDATA[X]]></fr:tex> correspond to the functions from <fr:tex display="inline"><![CDATA[X]]></fr:tex> to <fr:tex display="inline"><![CDATA[\{T, F\}]]></fr:tex>.</html:li>
    <html:li>The natural numbers form a set.</html:li>
    <html:li>Every surjection has a right inverse.</html:li></html:ol>
                        <html:p>Axioms 1–2 and 4–8 say that <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex> is a topos. Axiom 9 gives it a natural number object. Axiom 3 (well-pointedness) and axiom 10 (choice) sharpen this to the classical, well-pointed setting.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>2</fr:day>
                        </fr:date>
                        <fr:title text="Layered first-order presentation">Layered first-order presentation</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>The axioms above can be organised as a tower of first-order theories, each extending the previous with new signature and axioms. The lower layers (<fr:tex display="inline"><![CDATA[Th(\mathbf {Cat})]]></fr:tex>, <fr:tex display="inline"><![CDATA[Th(\mathbf {Lex})]]></fr:tex>) are essentially algebraic, but the full theory is not: well-pointedness and choice require existential and universal quantification over morphisms that go beyond equational or coherent logic. This layered view (following the <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/fully+formal+ETCS" type="external">nLab presentation</fr:link></html:span>) makes the logical dependencies explicit.</html:p>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>2</fr:day>
                            </fr:date>
                            <fr:title text="Th(\mathbf {Cat}) — Theory of categories"><fr:tex display="inline"><![CDATA[Th(\mathbf {Cat})]]></fr:tex> — Theory of categories</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>To avoid set theoretic language completely, we can define categories as a <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/single-sorted+definition+of+a+category" type="external">single-sorted</fr:link></html:span> first-order theory whose terms are morphisms. The signature has unary function symbols <fr:tex display="inline"><![CDATA[s, t]]></fr:tex> (source and target) and a ternary predicate <fr:tex display="inline"><![CDATA[c(f, g, h)]]></fr:tex> (composition). The axioms assert identity existence, composition existence and uniqueness (when <fr:tex display="inline"><![CDATA[s(f) = t(g)]]></fr:tex>), identity laws, and associativity. Objects are not primitive — they are recovered as identity morphisms (those <fr:tex display="inline"><![CDATA[e]]></fr:tex> with <fr:tex display="inline"><![CDATA[s(e) = e]]></fr:tex>).</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>2</fr:day>
                            </fr:date>
                            <fr:title text="Th(\mathbf {Lex}) — Finitely complete categories"><fr:tex display="inline"><![CDATA[Th(\mathbf {Lex})]]></fr:tex> — Finitely complete categories</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Extends <fr:tex display="inline"><![CDATA[Th(\mathbf {Cat})]]></fr:tex> with a unary predicate <fr:tex display="inline"><![CDATA[1(x)]]></fr:tex> (terminal object) and a quaternary predicate <fr:tex display="inline"><![CDATA[p(f, g, h, k)]]></fr:tex> (pullback). The axioms assert the existence of a terminal object and pullbacks for every cospan. Products and equalisers(in fact, all finite limits) are derivable from these.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>2</fr:day>
                            </fr:date>
                            <fr:title text="Th(\mathbf {Topos}) — Elementary toposes"><fr:tex display="inline"><![CDATA[Th(\mathbf {Topos})]]></fr:tex> — Elementary toposes</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Extends <fr:tex display="inline"><![CDATA[Th(\mathbf {Lex})]]></fr:tex> with a power-object operation <fr:tex display="inline"><![CDATA[P]]></fr:tex>, together with an elementhood span <fr:tex display="inline"><![CDATA[(\lambda , \rho )]]></fr:tex> for each object. The axioms assert a universal property: every relation <fr:tex display="inline"><![CDATA[R \rightarrowtail  X \times  Y]]></fr:tex> factors uniquely through the elementhood span of <fr:tex display="inline"><![CDATA[P(Y)]]></fr:tex>. This internalises the subobject classifier and exponentials.</html:p>
                          </fr:mainmatter>
                        </fr:tree>
                        <fr:tree show-metadata="false">
                          <fr:frontmatter>
                            <fr:authors>
                              <fr:author>
                                <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                              </fr:author>
                            </fr:authors>
                            <fr:date>
                              <fr:year>2026</fr:year>
                              <fr:month>3</fr:month>
                              <fr:day>2</fr:day>
                            </fr:date>
                            <fr:title text="Th(\mathbf {ETCS}) — Full ETCS"><fr:tex display="inline"><![CDATA[Th(\mathbf {ETCS})]]></fr:tex> — Full ETCS</fr:title>
                          </fr:frontmatter>
                          <fr:mainmatter>
                            <html:p>Extends <fr:tex display="inline"><![CDATA[Th(\mathbf {Topos})]]></fr:tex> with constants <fr:tex display="inline"><![CDATA[\mathbb {N}, 0, \sigma ]]></fr:tex> for a natural number object, plus three axiom schemas:</html:p>
                            <html:ol><html:li><html:strong>Well-pointedness.</html:strong> Equality of morphisms <fr:tex display="inline"><![CDATA[f, g : X \rightarrow  Y]]></fr:tex> is detected by global elements <fr:tex display="inline"><![CDATA[1 \rightarrow  X]]></fr:tex>.</html:li>
      <html:li><html:strong>Choice.</html:strong> Every epimorphism admits a section.</html:li>
      <html:li><html:strong>NNO.</html:strong> For every <fr:tex display="inline"><![CDATA[q : 1 \rightarrow  A]]></fr:tex> and <fr:tex display="inline"><![CDATA[f : A \rightarrow  A]]></fr:tex>, there exists a unique <fr:tex display="inline"><![CDATA[u : \mathbb {N} \rightarrow  A]]></fr:tex> with <fr:tex display="inline"><![CDATA[u \circ  0 = q]]></fr:tex> and <fr:tex display="inline"><![CDATA[u \circ  \sigma  = f \circ  u]]></fr:tex>.</html:li></html:ol>
                          </fr:mainmatter>
                        </fr:tree>
                        <html:p>Each layer strictly extends the previous, so a model of <fr:tex display="inline"><![CDATA[Th(\mathbf {ETCS})]]></fr:tex> is in particular a model of <fr:tex display="inline"><![CDATA[Th(\mathbf {Topos})]]></fr:tex>, which is a model of <fr:tex display="inline"><![CDATA[Th(\mathbf {Lex})]]></fr:tex>, which is a model of <fr:tex display="inline"><![CDATA[Th(\mathbf {Cat})]]></fr:tex>. The signature grows monotonically: predicates at earlier layers are preserved as structure, not merely properties, so that theory morphisms (homomorphisms of models) respect the full categorical structure at each level.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>2</fr:day>
                        </fr:date>
                        <fr:title text="Structural vs material set theory">Structural vs material set theory</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>The central distinction is between <html:em>structural</html:em> and <html:em>material</html:em> set theories. In ZFC, the membership relation <fr:tex display="inline"><![CDATA[\in ]]></fr:tex> is global and sets carry internal structure: it is meaningful (though mathematically uninteresting) to ask whether <fr:tex display="inline"><![CDATA[3 \in  \pi ]]></fr:tex>. In ETCS, this question is not merely false but <html:em>ill-typed</html:em> — there is no ambient universe in which arbitrary membership queries make sense.</html:p>
                        <html:p>ETCS is equiconsistent with bounded Zermelo set theory with choice (BZSC), a fragment of ZFC that is already sufficient for the vast majority of ordinary mathematics. The <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/ETCS" type="external">ETCS</fr:link></html:span> page gives a detailed comparison with ZFC and discusses the relationship to other categorical set theories (e.g. <html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/SEAR" type="external">SEAR</fr:link></html:span>, the axiom of replacement).</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>3</fr:month>
                          <fr:day>2</fr:day>
                        </fr:date>
                        <fr:title text="References">References</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:ul><html:li><fr:link href="/forest/lawvere1964elementary/" title="An elementary theory of the category of sets" uri="https://kream.codeberg.page/forest/lawvere1964elementary/" display-uri="lawvere1964elementary" type="local">An elementary theory of the category of sets</fr:link> — the original paper introducing ETCS.</html:li>
    <html:li><fr:link href="/forest/leinster2014rethinking/" title="Rethinking set theory" uri="https://kream.codeberg.page/forest/leinster2014rethinking/" display-uri="leinster2014rethinking" type="local">Rethinking set theory</fr:link> — a modern, accessible presentation of the ten axioms.</html:li>
    <html:li><fr:link href="/forest/leinster2011axiomatic/" title="Axiomatic set theory" uri="https://kream.codeberg.page/forest/leinster2011axiomatic/" display-uri="leinster2011axiomatic" type="local">Axiomatic set theory</fr:link> — lecture notes developing set theory from the ETCS axioms in detail.</html:li>
    <html:li><html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/ETCS" type="external">ETCS</fr:link></html:span> — nLab survey, comparisons with ZFC and other categorical set theories.</html:li>
    <html:li><html:span class="nlab"><fr:link href="https://ncatlab.org/nlab/show/fully+formal+ETCS" type="external">Fully formal ETCS</fr:link></html:span> — the axioms rendered in first-order logic.</html:li></html:ul>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>6</fr:month>
                      <fr:day>2</fr:day>
                    </fr:date>
                    <fr:title text="Simply Typed Lambda Calculus">Simply Typed Lambda Calculus</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>First, we start with a very simple type system of STLC. This is our base.</html:p>
                    <html:p>From Curry-Howard-Lambek Correspondence, we know that this type system allows for reasoning in propositional intuitionistic logic, if we read the types associated with each term as a proposition, and the term itself as the proof of that proposition.</html:p>
                    <html:p>The main ingredients for our type system at this stage is the inference rules for:
    <html:ul><html:li>the unit type(singleton set)</html:li>
      <html:li>the empty type(empty set)</html:li>
      <html:li>product types</html:li>
      <html:li>disjoint union types</html:li>
      <html:li>function types</html:li></html:ul></html:p>
                    <html:p>Looking back at the axioms, these types cover the majority of what we need for reasoning in a topos! The only gaps here are that we can't form pullbacks yet, and we don't have a subobject classifier. These two will be discussed in detail in their own section.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>6</fr:month>
                      <fr:day>2</fr:day>
                    </fr:date>
                    <fr:title text="Subobject Classifier and the Proof Layer">Subobject Classifier and the Proof Layer</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>HOL, Higher kinds, etc..</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>6</fr:month>
                      <fr:day>2</fr:day>
                    </fr:date>
                    <fr:title text="Comprehension Types and the Axiom Schema of Seperation">Comprehension Types and the Axiom Schema of Seperation</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Now that we have </html:p>
                    <html:p>In </html:p>
                    <html:p>They are also called extension of a predicate.</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>6</fr:month>
                      <fr:day>2</fr:day>
                    </fr:date>
                    <fr:title text="Induction and the Natural Numbers">Induction and the Natural Numbers</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>6</fr:month>
                          <fr:day>2</fr:day>
                        </fr:date>
                        <fr:title text="Dependent vs. non-dependent recursion">Dependent vs. non-dependent recursion</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>The natural numbers are added as a natural number object (NNO), with a recursor <fr:tex display="inline"><![CDATA[\mathrm {rec}_\mathbb {N}]]></fr:tex>. It is worth being precise about <html:em>which</html:em> recursor we get, because the prover only has the <html:em>non-dependent</html:em> one:</html:p>
                        <html:pre>rec : (T : Type) → T → (ℕ → T → T) → ℕ → T          -- what we have
ind : (P : ℕ → Type) → P 0 → ((k : ℕ) → P k → P (suc k)) → (n : ℕ) → P n   -- dependent</html:pre>
                        <html:p>In <fr:tex display="inline"><![CDATA[\mathrm {rec}]]></fr:tex> the result type <fr:tex display="inline"><![CDATA[T]]></fr:tex> is fixed in advance; in <fr:tex display="inline"><![CDATA[\mathrm {ind}]]></fr:tex> the motive <fr:tex display="inline"><![CDATA[P : \mathbb {N} \rightarrow  \mathrm {Type}]]></fr:tex> lets the result type vary with the index. Concretely, the typing rule for the recursor checks the step branch against the <html:em>same</html:em> type as the base case, so base and step must agree on one <fr:tex display="inline"><![CDATA[T]]></fr:tex>.</html:p>
                        <html:p>This is less of a restriction than it first appears. Dependent recursion <html:em>into the universe of propositions</html:em> <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> is exactly induction, and that we <html:em>do</html:em> have, as a separate proof-term former (<fr:tex display="inline"><![CDATA[\mathrm {natInd}]]></fr:tex>): from <fr:tex display="inline"><![CDATA[P\,0]]></fr:tex> and <fr:tex display="inline"><![CDATA[\forall  k.\, P\,k \Rightarrow  P\,(\mathrm {suc}\,k)]]></fr:tex> it proves <fr:tex display="inline"><![CDATA[\forall  n.\, P\,n]]></fr:tex> for any predicate <fr:tex display="inline"><![CDATA[P : \mathbb {N} \rightarrow  \Omega ]]></fr:tex>. So no <html:em>proposition</html:em> provable by induction is out of reach — the parity theorem <fr:tex display="inline"><![CDATA[\forall  n.\, E\,n \vee  O\,n]]></fr:tex> is proved this way.</html:p>
                        <html:p>What is genuinely missing is dependent recursion <html:em>into</html:em> <fr:tex display="inline"><![CDATA[\mathbf {Set}]]></fr:tex>: defining a <html:em>term</html:em> whose type depends on its <fr:tex display="inline"><![CDATA[\mathbb {N}]]></fr:tex> argument. The canonical example is a length-indexed vector,</html:p>
                        <html:pre>Vec A 0       = 1
Vec A (suc k) = A × Vec A k

countdown : (n : ℕ) → Vec ℕ n
countdown 0       = ()
countdown (suc k) = (suc k , countdown k)</html:pre>
                        <html:p>where <fr:tex display="inline"><![CDATA[\mathrm {countdown}\,0 : \mathbf {1}]]></fr:tex> but <fr:tex display="inline"><![CDATA[\mathrm {countdown}\,3 : \mathbb {N}\times \mathbb {N}\times \mathbb {N}\times \mathbf {1}]]></fr:tex> — the type changes with the index. This cannot even be <html:em>stated</html:em> in the current type layer, let alone proved, because it needs three ingredients we do not have: a type family <fr:tex display="inline"><![CDATA[\mathbb {N} \rightarrow  \mathrm {Type}]]></fr:tex>, a dependent function type <fr:tex display="inline"><![CDATA[(n:\mathbb {N}) \rightarrow  \mathrm {Vec}\,\mathbb {N}\,n]]></fr:tex> (we only have the non-dependent arrow <fr:tex display="inline"><![CDATA[A \rightarrow  B]]></fr:tex>), and the dependent recursor <fr:tex display="inline"><![CDATA[\mathrm {ind}]]></fr:tex> above. Recovering these is precisely the step taken in the Agda version, whose slices interpret dependent types.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>6</fr:month>
                      <fr:day>2</fr:day>
                    </fr:date>
                    <fr:title text="Well-pointedness">Well-pointedness</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter />
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>6</fr:month>
                      <fr:day>2</fr:day>
                    </fr:date>
                    <fr:title text="Axiom of Choice">Axiom of Choice</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter />
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>6</fr:month>
                      <fr:day>2</fr:day>
                    </fr:date>
                    <fr:title text="The Prop/Type Firewall">The Prop/Type Firewall</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>No constructor of <fr:tex display="inline"><![CDATA[\Gamma  \vdash  t : A]]></fr:tex> takes a proof-layer derivation as input. Abel–Coquand (2020): impredicative Prop + proof-irrelevant equality + transport into Type breaks normalization. We have the first two; the firewall blocks the third.</html:p>
                    <html:p>Enforced structurally — <html:code>_⊢_</html:code> and <html:code>_∣_⊢ᵖ_</html:code> are separate datatypes. Agda rejects any constructor that crosses the boundary.</html:p>
                    <html:p>The interaction is one-way: type-layer terms flow <html:em>into</html:em> the proof layer freely (witnesses for <fr:tex display="inline"><![CDATA[\forall  E]]></fr:tex>, <fr:tex display="inline"><![CDATA[\exists  I]]></fr:tex>, predicates for <html:code>cong</html:code>/<html:code>subst</html:code>/<html:code>natind</html:code>, comprehension terms for <html:code>compr-E</html:code>). But proofs never flow into terms. The <html:code>conv</html:code> rule is where NbE is invoked during proof checking — it compares normal forms of propositions, read-only.</html:p>
                    <html:p>Consequences: decidable type-checking, normalization safety, one normalizer (terms only — no need to normalize types or proofs).</html:p>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>6</fr:month>
                      <fr:day>2</fr:day>
                    </fr:date>
                    <fr:title text="Normalization by Evaluation">Normalization by Evaluation</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>Decides definitional equality: <fr:tex display="inline"><![CDATA[t \equiv  s]]></fr:tex> iff <fr:tex display="inline"><![CDATA[\mathrm {nf}(t) = \mathrm {nf}(s)]]></fr:tex>. Evaluate into semantic domain, read back as normal form. Handles open terms, gives <fr:tex display="inline"><![CDATA[\eta ]]></fr:tex> for free, no confluence proof needed.</html:p>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>6</fr:month>
                          <fr:day>2</fr:day>
                        </fr:date>
                        <fr:title text="The Kripke function space">The Kripke function space</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Open terms: a free variable <fr:tex display="inline"><![CDATA[x : A \Rightarrow  B]]></fr:tex> is stuck. But the context might grow later, and <fr:tex display="inline"><![CDATA[x]]></fr:tex> needs to survive weakening.</html:p>
                        <html:p>Solution: a semantic function at context <fr:tex display="inline"><![CDATA[\Gamma ]]></fr:tex> works in <html:em>any future context</html:em> <fr:tex display="inline"><![CDATA[\Delta ]]></fr:tex> extending <fr:tex display="inline"><![CDATA[\Gamma ]]></fr:tex>:</html:p>
                        <fr:tex display="block"><![CDATA[
      \llbracket  A \Rightarrow  B \rrbracket \;\Gamma 
      \;=\; \forall  \{\Delta \}.\; \mathrm {Ren}\;\Gamma \;\Delta 
      \;\rightarrow \; \llbracket  A \rrbracket \;\Delta 
      \;\rightarrow \; \llbracket  B \rrbracket \;\Delta 
    ]]></fr:tex>
                        <html:p>Same idea as Kripke semantics in modal logic — <fr:tex display="inline"><![CDATA[\Gamma ]]></fr:tex> is a "world," the function is defined across all accessible future worlds. Weakening a function = pre-composing the renamings.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>6</fr:month>
                          <fr:day>2</fr:day>
                        </fr:date>
                        <fr:title text="Reflect and reify">Reflect and reify</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p><html:strong>Reflect</html:strong> (neutral <fr:tex display="inline"><![CDATA[\rightarrow ]]></fr:tex> value): embed stuck computations into the domain. At function type, creates a Kripke function. At product type, projects. At unit, trivial.</html:p>
                        <html:p><html:strong>Reify</html:strong> (value <fr:tex display="inline"><![CDATA[\rightarrow ]]></fr:tex> normal form): read back. At function type, create fresh variable, apply, reify result, wrap in <fr:tex display="inline"><![CDATA[\lambda ]]></fr:tex>. This is where <fr:tex display="inline"><![CDATA[\eta ]]></fr:tex>-expansion happens.</html:p>
                        <html:p>Round-trip: term <fr:tex display="inline"><![CDATA[\rightarrow ]]></fr:tex> eval <fr:tex display="inline"><![CDATA[\rightarrow ]]></fr:tex> value <fr:tex display="inline"><![CDATA[\rightarrow ]]></fr:tex> reify <fr:tex display="inline"><![CDATA[\rightarrow ]]></fr:tex> normal form.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                    <fr:tree show-metadata="false">
                      <fr:frontmatter>
                        <fr:authors>
                          <fr:author>
                            <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                          </fr:author>
                        </fr:authors>
                        <fr:date>
                          <fr:year>2026</fr:year>
                          <fr:month>6</fr:month>
                          <fr:day>2</fr:day>
                        </fr:date>
                        <fr:title text="Coverage and limitations">Coverage and limitations</fr:title>
                      </fr:frontmatter>
                      <fr:mainmatter>
                        <html:p>Full <fr:tex display="inline"><![CDATA[{\beta }/{\eta }]]></fr:tex>: functions, products, unit, comprehension, coproducts. Structural: <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex> connectives. Stuck: <html:code>rec</html:code> (termination pending). Coproduct <fr:tex display="inline"><![CDATA[\beta ]]></fr:tex> uses <html:code>NO_POSITIVITY_CHECK</html:code>. NbE can't reduce on abstract module parameter types.</html:p>
                      </fr:mainmatter>
                    </fr:tree>
                  </fr:mainmatter>
                </fr:tree>
                <fr:tree show-metadata="false">
                  <fr:frontmatter>
                    <fr:authors>
                      <fr:author>
                        <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                      </fr:author>
                    </fr:authors>
                    <fr:date>
                      <fr:year>2026</fr:year>
                      <fr:month>6</fr:month>
                      <fr:day>2</fr:day>
                    </fr:date>
                    <fr:title text="The Equational Theory and Soundness">The Equational Theory and Soundness</fr:title>
                  </fr:frontmatter>
                  <fr:mainmatter>
                    <html:p>NbE is an algorithm; the equational theory <fr:tex display="inline"><![CDATA[t \sim  s]]></fr:tex> is the specification. Inductive relation in <html:code>Eq.agda</html:code>: 8 <fr:tex display="inline"><![CDATA[\beta ]]></fr:tex>, 5 <fr:tex display="inline"><![CDATA[\eta ]]></fr:tex>, 17 congruence, equivalence closure.</html:p>
                    <html:p>Completeness: <fr:tex display="inline"><![CDATA[t \sim  s \Rightarrow  \mathrm {nf}(t) = \mathrm {nf}(s)]]></fr:tex> — structural cases proved, rest postulated. Soundness: <fr:tex display="inline"><![CDATA[\mathrm {nf}(t) = \mathrm {nf}(s) \Rightarrow  t \sim  s]]></fr:tex> — reduced to the fundamental lemma (Kripke logical relation), postulated.</html:p>
                    <html:p>Two equalities: definitional (NbE, decidable, used in <html:code>conv</html:code>) vs propositional (in <fr:tex display="inline"><![CDATA[\Omega ]]></fr:tex>, under hypotheses, not decidable). Firewall keeps them separate.</html:p>
                  </fr:mainmatter>
                </fr:tree>
              </fr:mainmatter>
            </fr:tree>
            <fr:tree show-metadata="true" expanded="false" numbered="false">
              <fr:frontmatter>
                <fr:authors>
                  <fr:author>
                    <fr:link href="/forest/red/" title="red" uri="https://kream.codeberg.page/forest/red/" display-uri="red" type="local">red</fr:link>
                  </fr:author>
                </fr:authors>
                <fr:title text="Sources">Sources</fr:title>
              </fr:frontmatter>
              <fr:mainmatter>
                <html:ul>
                  <html:li><fr:link href="https://utensil.github.io/forest/tt-0001/id3" type="external">Utensil's type theory notes</fr:link> — from Utensil's forest</html:li>
                </html:ul>
              </fr:mainmatter>
            </fr:tree>
          </fr:mainmatter>
        </fr:tree>
      </fr:mainmatter>
    </fr:tree>
    <fr:tree show-metadata="false" hidden-when-empty="true">
      <fr:frontmatter>
        <fr:authors />
        <fr:title text="Contributions">Contributions</fr:title>
      </fr:frontmatter>
      <fr:mainmatter />
    </fr:tree>
  </fr:backmatter>
</fr:tree>
