<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Chris</title>
    <description>The latest articles on Forem by Chris (@papredapp).</description>
    <link>https://forem.com/papredapp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3778373%2Fe62c8236-937e-442b-8cc1-0c6d00aa116e.jpg</url>
      <title>Forem: Chris</title>
      <link>https://forem.com/papredapp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/papredapp"/>
    <language>en</language>
    <item>
      <title>Agreement Is Not Contract. It's the Structure of Reality.</title>
      <dc:creator>Chris</dc:creator>
      <pubDate>Thu, 26 Mar 2026 14:10:53 +0000</pubDate>
      <link>https://forem.com/papredapp/agreement-is-not-contract-its-the-structure-of-reality-5fbo</link>
      <guid>https://forem.com/papredapp/agreement-is-not-contract-its-the-structure-of-reality-5fbo</guid>
      <description>&lt;p&gt;Art is the target: not software, not wealth, not status.&lt;/p&gt;

&lt;p&gt;Consciousness is the medium.&lt;/p&gt;

&lt;p&gt;Every atom of this body.&lt;br&gt;
Every attention unit.&lt;br&gt;
Existence itself.&lt;br&gt;
The inherent bliss of pure awareness.&lt;/p&gt;

&lt;p&gt;The sculptor's tool, shifting, spreading—deployed for one purpose: creating art.&lt;br&gt;
Consciousness painted.&lt;/p&gt;

&lt;p&gt;Sure, we start with business contracts, software development milestone agreements, NDAs, and consulting accords. But that's a remnant of my attorney past.&lt;/p&gt;

&lt;p&gt;Easy entrée into a world of overlapping Agreement.&lt;/p&gt;

&lt;p&gt;It's deeper than that.&lt;/p&gt;

&lt;p&gt;Papre isn't about Agreement for the sake of business efficiency.&lt;/p&gt;

&lt;p&gt;A software developer &lt;em&gt;agrees&lt;/em&gt; with her client. Easy.&lt;/p&gt;

&lt;p&gt;You &lt;em&gt;agree&lt;/em&gt; to follow the laws of your country.&lt;br&gt;
Yes, you agree.&lt;br&gt;
You're free to violate the law, although under duress.&lt;/p&gt;

&lt;p&gt;Bodies &lt;em&gt;agree&lt;/em&gt; to fall at 9.8m/s².&lt;br&gt;
Planets orbit stars.&lt;br&gt;
E=mc².&lt;/p&gt;

&lt;p&gt;Papre is about Agreement as the connective tissue of the Human organism, of material reality itself.&lt;/p&gt;

&lt;p&gt;It's axiomatic in this system.&lt;/p&gt;

&lt;p&gt;It isn't Truth.&lt;/p&gt;

&lt;p&gt;It's a way of ordering the world.&lt;/p&gt;

&lt;p&gt;And when we order the world coherently in this way, as a system of Agreements, we can create an API for the world.&lt;/p&gt;

&lt;p&gt;APIs are usually seen as a way for the world to interface with software.&lt;/p&gt;

&lt;p&gt;Papre is different.&lt;br&gt;
Papre is the world's API.&lt;/p&gt;

&lt;p&gt;By ordering the world in this way, software becomes the world's graph, a system of edges connecting previously disparate components of material reality into explicit systems that can be observed and shifted like a painter moving paint with her brush, eventually manipulating the very structure of reality.&lt;/p&gt;

&lt;p&gt;Crazy? Yes.&lt;/p&gt;

&lt;p&gt;But you already live inside this web of Agreements.&lt;br&gt;
Weave it yourself.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's Been Shipping
&lt;/h2&gt;

&lt;p&gt;A month of quiet violence against the blank canvas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mobile QR signing&lt;/strong&gt; — you scan a code, you sign from your pocket. Agreements escaped the desktop&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Facilitated agreements&lt;/strong&gt; — a third party can now weave an agreement between two others, like a matchmaker who steps aside once the vows are spoken&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The document editor became an instrument&lt;/strong&gt; — bubble menus, slash commands, drag sections like rearranging verses, AI that reads your document and fills the blanks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chain-agnostic architecture&lt;/strong&gt; — Papre no longer cares which blockchain you're on. Switch chains with an environment variable. The protocol is indifferent to the substrate&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API v1&lt;/strong&gt; — the first public interface. Other software can now create and query agreements programmatically. The world's API gets its own API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embed profiles&lt;/strong&gt; — agreement flows that live inside other websites, like a clause that nests inside a stranger's sentence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A design system that breathes&lt;/strong&gt; — warm grays, glass navigation, teal gradients. The interface started looking like something you'd want to touch&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The repo split in half&lt;/strong&gt; — web and API separated into independent deployments. Faster. Cleaner. Two lungs instead of one&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Demo mode&lt;/strong&gt; — a sandboxed reality for showing the product without disturbing the living system&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>web3</category>
      <category>solidity</category>
      <category>typescript</category>
      <category>smartcontracts</category>
    </item>
    <item>
      <title>How We Fixed Firefox's localStorage Race in Playwright: Two Navigation Helpers</title>
      <dc:creator>Chris</dc:creator>
      <pubDate>Tue, 24 Feb 2026 19:47:57 +0000</pubDate>
      <link>https://forem.com/papredapp/how-we-fixed-firefoxs-localstorage-race-in-playwright-two-navigation-helpers-bbi</link>
      <guid>https://forem.com/papredapp/how-we-fixed-firefoxs-localstorage-race-in-playwright-two-navigation-helpers-bbi</guid>
      <description>&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;Firefox's &lt;code&gt;addInitScript&lt;/code&gt; can race against page rendering when seeding localStorage for E2E tests. We fixed it by splitting navigation into two helpers: &lt;code&gt;gotoPage&lt;/code&gt; (fast, &lt;code&gt;commit&lt;/code&gt;) for interactive flows and &lt;code&gt;gotoAgreementPage&lt;/code&gt; (reliable, &lt;code&gt;domcontentloaded&lt;/code&gt;) for data-dependent pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;We use Playwright's &lt;code&gt;addInitScript&lt;/code&gt; to seed localStorage with mock agreement data before each test. This works perfectly in Chromium — the init script runs, sets localStorage, and by the time React mounts, the data is there.&lt;/p&gt;

&lt;p&gt;Firefox? Not so much. About 25% of our lifecycle tests were failing with "Loading agreement..." stuck on screen. The page rendered before the init script finished writing to localStorage.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Diagnosis
&lt;/h2&gt;

&lt;p&gt;Playwright's error context snapshots told the story. On first failure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;paragraph&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Loading agreement...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On retry (with more time):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;heading "Retainer Agreement"&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;button "Connect Wallet"&lt;/span&gt;  &lt;span class="c1"&gt;# Auth data missing too!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The page loaded fine on retry, but auth data from localStorage wasn't picked up either. Classic timing issue.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Fix
&lt;/h2&gt;

&lt;p&gt;We had one navigation helper:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;gotoPage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;waitUntil&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;commit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByRole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;link&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/Papre/i&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitFor&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;visible&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30000&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;commit&lt;/code&gt; returns as soon as the server responds — before scripts execute. Fast for interactive tests, but too fast for Firefox when init scripts need to complete.&lt;/p&gt;

&lt;p&gt;We added a second helper:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;gotoAgreementPage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Page&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;goto&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;waitUntil&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;domcontentloaded&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;page&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getByRole&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;link&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sr"&gt;/Papre/i&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;waitFor&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;visible&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;30000&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;domcontentloaded&lt;/code&gt; waits for the HTML to be fully parsed and all deferred scripts to execute. This gives &lt;code&gt;addInitScript&lt;/code&gt; time to complete before React reads localStorage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The key insight:&lt;/strong&gt; you can't use &lt;code&gt;domcontentloaded&lt;/code&gt; everywhere. Our wizard/create tests use keyboard shortcuts (&lt;code&gt;Ctrl+Shift+D&lt;/code&gt; for auto-fill) immediately after navigation. The extra wait from &lt;code&gt;domcontentloaded&lt;/code&gt; caused those tests to timeout — the page wasn't interactive fast enough.&lt;/p&gt;

&lt;p&gt;So: &lt;code&gt;gotoPage&lt;/code&gt; for interactive flows, &lt;code&gt;gotoAgreementPage&lt;/code&gt; for data-dependent pages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Before: 23 Firefox failures out of 240 overnight tests&lt;/li&gt;
&lt;li&gt;After: 240/240 pass across Chromium, Firefox, WebKit, Mobile Chrome, Mobile Safari&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Broader Session
&lt;/h2&gt;

&lt;p&gt;Beyond the Firefox fix, we shipped:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;8 retainer lifecycle tests (full state machine)&lt;/li&gt;
&lt;li&gt;NDA gap tests (one-way variant, terminate action)&lt;/li&gt;
&lt;li&gt;Safety-net gap tests (expired deadline enforcement, dispute evidence)&lt;/li&gt;
&lt;li&gt;GitHub Actions overnight workflow&lt;/li&gt;
&lt;li&gt;3 app bugs found only through E2E coverage&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Builder's Note
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Spent most of the day thinking about fragmentation — how splitting yourself into roles creates anxiety. The code mirrored that perfectly: scattered tests across directories, inconsistent browser behavior. Consolidation brought clarity to both. Wholeness is ease.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Building &lt;a href="https://papre.co" rel="noopener noreferrer"&gt;Papre&lt;/a&gt; — composable agreement infrastructure for trustless coordination.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>web3</category>
      <category>playwright</category>
      <category>testing</category>
      <category>typescript</category>
    </item>
    <item>
      <title>How We Replaced Hardcoded Legal Templates with Accord TemplateMark: Composable Prose for Smart Contracts</title>
      <dc:creator>Chris</dc:creator>
      <pubDate>Mon, 23 Feb 2026 16:02:07 +0000</pubDate>
      <link>https://forem.com/papredapp/how-we-replaced-hardcoded-legal-templates-with-accord-templatemark-composable-prose-for-smart-58ck</link>
      <guid>https://forem.com/papredapp/how-we-replaced-hardcoded-legal-templates-with-accord-templatemark-composable-prose-for-smart-58ck</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; We migrated 9 agreement types from hardcoded legal templates to Accord Project's TemplateMark system — typed data models, reusable clause packages, and a generic evaluation pipeline. 21 commits across 4 days. Here's the full architecture.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Our agreement platform had hardcoded HTML templates for each agreement type. Adding a new type meant copy-pasting a template, manually wiring up field interpolation, and hoping the field names matched the smart contract interface. At 9 types this was already painful. At 100 it would be impossible.&lt;/p&gt;

&lt;p&gt;Worse, the legal prose had no typed data model. Field names were strings, validation was ad-hoc, and there was no systematic way to verify that the prose template matched the smart contract's ABI. A typo in a field name wouldn't surface until someone tried to create an agreement on-chain.&lt;/p&gt;

&lt;p&gt;We needed composable prose that mirrors our composable on-chain architecture — both layers built from atomic, reusable primitives.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Approach: Accord Project
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://accordproject.org/" rel="noopener noreferrer"&gt;Accord Project&lt;/a&gt; provides two key technologies:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Concerto&lt;/strong&gt; — a modeling language for typed data structures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TemplateMark&lt;/strong&gt; — a templating language that binds Concerto models to legal prose&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each clause becomes a self-contained package with four files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;clauses/{slug}/
  package.json          # Faceted metadata (function, domain, on-chain mapping)
  model/model.cto       # Concerto model (typed fields with decorators)
  text/grammar.tem.md   # TemplateMark prose template
  test/sample.json      # Sample data for testing
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clauses compose into contracts via manifests:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"software-milestone"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Software Contractor Milestone Agreement"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"org.papre.contracts.milestone@1.0.0.SoftwareMilestoneContract"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sections"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"heading"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1. Parties"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"clause"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"parties"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"as"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"parties"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"heading"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2. Project Overview"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"clause"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"project-scope"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"as"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"projectScope"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"heading"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"3. Milestones"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"clause"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"milestone-payment"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"as"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"milestonePayment"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"heading"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"4. Deliverables"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"clause"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deliverables"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"as"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deliverables"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"heading"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"5. IP Assignment"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"clause"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ip-assignment"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"as"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ipAssignment"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An assembler reads the manifest, fetches clause templates from the library, and stitches them into a single TemplateMark document wrapped in &lt;code&gt;{{#clause}}&lt;/code&gt; blocks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The On-Chain Bridge
&lt;/h2&gt;

&lt;p&gt;This is where it gets interesting. Concerto models can declare their Solidity parameter mappings directly using custom decorators:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;concept MilestonePaymentClause {
  @OnChain("_descriptions,_amounts,_deadlines", "bytes32[],uint256[],uint256[]")
  @Conversion("milestones")
  o MilestoneItem[] milestones

  @OnChain("_paymentToken", "address")
  @Conversion("tokenAddress")
  o PaymentCurrency currency default="ETH"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;@OnChain&lt;/code&gt; decorator maps a prose-layer field to its Solidity counterpart — name and type. The &lt;code&gt;@Conversion&lt;/code&gt; decorator specifies the transformation function. The assembler can extract these to produce an ABI parameter summary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@OnChain ABI parameters:
  _client : address (from client)
  _contractor : address (from contractor)
  _descriptions : bytes32[] (from milestones)
  _amounts : uint256[] (from milestones)
  _deadlines : uint256[] (from milestones)
  _paymentToken : address (from currency)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This connects the prose layer to the smart contract interface at the model level. When someone fills out the legal template, the system knows exactly how to encode the data for the on-chain call. A mismatch between the prose and the contract is caught at build time, not at transaction time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Evaluation Pipeline
&lt;/h2&gt;

&lt;p&gt;The runtime pipeline flows through Redis KV and a VM sandbox:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;papre-accord repo → seed-accord.mjs → Redis KV
   → /api/accord/template/[id] → clause stitching → rendered prose
   → /api/accord/evaluate → VM sandbox → ALLOW/DENY/NEEDS_INPUT
   → intent-executor → writeContract()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Seeding&lt;/strong&gt;: &lt;code&gt;seed-accord.mjs&lt;/code&gt; reads clause packages from the &lt;code&gt;papre-accord&lt;/code&gt; repo and stores them in Redis KV:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;accord:clause:{slug}        → clause grammar, model, facets
accord:metadata:{id}        → template metadata, field manifests
accord:evaluator:{id}       → compiled TypeScript evaluator logic
accord:index                → list of all available templates
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Template resolution&lt;/strong&gt;: The &lt;code&gt;/api/accord/template/[contractId]&lt;/code&gt; route fetches clause grammars from KV and stitches them into a single TemplateMark document at request time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evaluation&lt;/strong&gt;: The client sends form data to &lt;code&gt;/api/accord/evaluate&lt;/code&gt;, which runs Accord's TypeScript logic in a Node.js VM sandbox. The evaluator returns a &lt;code&gt;GenericActionDecision&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Three possible outcomes:&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ALLOW&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;All requirements met&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DENY&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Missing required field: ...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;NEEDS_INPUT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Please provide: ...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On &lt;code&gt;ALLOW&lt;/code&gt;, the intent-executor encodes the parameters per the &lt;code&gt;@OnChain&lt;/code&gt; decorator mappings and calls &lt;code&gt;writeContract()&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Accept Strategy Pattern
&lt;/h2&gt;

&lt;p&gt;Each agreement type registers a self-describing strategy that handles the on-chain creation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;AcceptStrategy&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;templateId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;singletonAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;abi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt;&lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="nl"&gt;usesEncryption&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;usesMultiSignerAcceptance&lt;/span&gt;&lt;span class="p"&gt;?:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;createOnChain&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="s2"&gt;`0x&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nf"&gt;buildPartyMapping&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nx"&gt;PartyMapping&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Strategies self-register at module scope:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// In acceptStrategies.ts&lt;/span&gt;
&lt;span class="nf"&gt;registerAcceptStrategy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;software-milestone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;templateId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;software-milestone&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;singletonAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;MILESTONE_AGREEMENT_ADDRESS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;abi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;MILESTONE_AGREEMENT_ABI&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;usesEncryption&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;createOnChain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;buildPartyMapping&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="cm"&gt;/* ... */&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;9 strategies across 3 categories:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;5 traditional&lt;/strong&gt; — dedicated Solidity contracts (freelance, milestone, retainer, safety-net, NDA)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;3 Accord&lt;/strong&gt; — generic factory via &lt;code&gt;createAccordStrategy()&lt;/code&gt; (equipment-rental, papreboat-rental, liability-waiver)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;1 simple-document&lt;/strong&gt; — generic on-chain anchor for non-contract templates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Adding a new agreement type is now: write a manifest, register a strategy, seed to KV.&lt;/p&gt;

&lt;h2&gt;
  
  
  Clause Library Design
&lt;/h2&gt;

&lt;p&gt;The clause library uses &lt;strong&gt;faceted classification&lt;/strong&gt; instead of folder hierarchy. Each clause carries independent metadata facets:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"facets"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"function"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"payment"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"escrow"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"domain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"software"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"freelance"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"construction"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"onChain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"MilestoneClause"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EscrowClause"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"lifecycle"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"execution"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"risk"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"financial"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"variables"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A single hierarchy breaks when a clause belongs in multiple categories (an "Escrow with Dispute Resolution" clause would need to go in &lt;code&gt;financial/&lt;/code&gt; or &lt;code&gt;governance/&lt;/code&gt;, but not both). Facets solve this — you can search from any direction: "all financial-risk clauses," "all clauses that map to EscrowClause," "all static prose for universal use."&lt;/p&gt;

&lt;p&gt;Inspired by DigiKey's parametric component catalog, Ranganathan's Colon Classification, and legal clause banks like SALI and Practical Law.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;9 agreement types running through one generic pipeline&lt;/li&gt;
&lt;li&gt;0 hardcoded templates remaining&lt;/li&gt;
&lt;li&gt;12 reusable clause packages in the library&lt;/li&gt;
&lt;li&gt;Adding a new agreement type = manifest + strategy + seed&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Else Shipped This Week
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API v1 with public signing&lt;/strong&gt; — external users can sign agreements without a Papre account&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Terms of Service migrated to papre-accord&lt;/strong&gt; — no more special-case rendering&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ctrl+Shift+D test data&lt;/strong&gt; for 3 new agreement types (equipment-rental, papreboat-rental, liability-waiver)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lit Protocol encryption&lt;/strong&gt; gracefully degrades instead of crashing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embedded wallet fallback&lt;/strong&gt; when smart wallet unavailable on Fuji&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;104 ESLint warnings eliminated&lt;/strong&gt;, deduplicated hooks across the codebase&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;16 architecture documents&lt;/strong&gt; written (7 new, 6 migrated to vault, 3 updated)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CHANGELOG catch-up&lt;/strong&gt; with 12 missing entries&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Builder's Note&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Blockchain development, running group therapy, managing staff and clients, and personal meditation and yoga practice create an ever-changing, ever-shifting flow. All I can do is relax into it and let it pass through me. If I clench, the current catches me and throws me around. If I stay present but relaxed, the flow leaves nothing behind except the invigoration of energy in motion and the bliss of exploration.&lt;/p&gt;

&lt;p&gt;Stress and anxiety in me are reactions, not to external circumstances, but to my own clenching against those circumstances. In private work with others, I often hear a familiar fear: if they meditate too much, they'll lose their edge. They'll lose their drive to succeed.&lt;/p&gt;

&lt;p&gt;Maybe. And if you do, it's only because you've shifted out of the energy flow your biology, your family, your society, your experience have imposed upon you. By relaxing, you stop doing their bidding. You enter a more natural flow, where life is, frankly, easier. But releasing the NEED to achieve isn't universal in those who meditate, or in those who go deep within themselves to discover.&lt;/p&gt;

&lt;p&gt;Others—like me—dig deep and find that the natural course is to attempt to make big changes in reality, to bring lots of energy to bear on the material world.&lt;/p&gt;

&lt;p&gt;That's the thing about deep internal work: you don't get to choose where it heads ahead of time. I should say, your ego doesn't get to choose ahead of time. In my life, I've come to feel like there's a kind of higher-self calling the shots. I've come to experience this higher-order autonomy, not as an idea, but as something alive in me.&lt;/p&gt;

&lt;p&gt;When I let go of the need to control, what I thought I wanted and needed usually falls away, and something far better manifests itself. This has happened over and over and over. My wife is 10x the woman I was seeking. My project is 1000x as incredible as I envisioned. My life is indescribably better than anything I imagined, even at my most optimistic. And it sure as hell is an improvement over the version of me that would have been satisfied with not dying totally broken and alone.&lt;/p&gt;

&lt;p&gt;Sometimes it feels like I've died, and that God—if there is one—is so merciful that it shifted me to heaven. And in order to keep me from freaking out, that heaven looks a lot like the world I left at death.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>web3</category>
      <category>solidity</category>
      <category>typescript</category>
      <category>smartcontracts</category>
    </item>
    <item>
      <title>What Running a Sober Living Facility Taught Me About Building a Web3 Startup</title>
      <dc:creator>Chris</dc:creator>
      <pubDate>Fri, 20 Feb 2026 01:38:39 +0000</pubDate>
      <link>https://forem.com/papredapp/what-running-a-sober-living-facility-taught-me-about-building-a-web3-startup-29e7</link>
      <guid>https://forem.com/papredapp/what-running-a-sober-living-facility-taught-me-about-building-a-web3-startup-29e7</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Sometimes the best day for your project is the one where you don't write any code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Two Lives
&lt;/h2&gt;

&lt;p&gt;I direct a men's sober living facility by day. I build composable agreement infrastructure on Avalanche by night. These two jobs could not be more different — and yet they're teaching me the same lesson.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Consensus Trap
&lt;/h2&gt;

&lt;p&gt;I've always managed by consensus. I like alignment. I like people feeling heard. I like building something that feels like &lt;em&gt;ours&lt;/em&gt;, not &lt;em&gt;mine&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;When the team is mature and motivated, consensus is a force multiplier. But it has a cost:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It slows decisions.&lt;/strong&gt; Every voice needs to be heard before moving.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It blurs accountability.&lt;/strong&gt; When the outcome belongs to "everyone," no one owns it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It becomes a veto system.&lt;/strong&gt; One hesitant voice can stall the move that matters most.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In sober living, I can't afford that. When someone violates probation terms, when an employee isn't performing, when 26 men are counting on the structure I provide — decisions have to land.&lt;/p&gt;

&lt;h2&gt;
  
  
  Applying It to Papre
&lt;/h2&gt;

&lt;p&gt;Papre needs the same clarity. As I scale from solo builder to team:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// The old pattern
function decide(proposal) {
  const votes = await pollEveryone(proposal);
  if (votes.some(v =&amp;gt; v === 'no')) return STALL;
  return MOVE;
}

// The new pattern
function decide(proposal) {
  const input = await gatherPerspectives(proposal);
  const decision = evaluate(input, vision);
  communicate(decision, reasoning);
  return MOVE;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Collaboration without drift. Input without paralysis. Culture without confusion.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Compound Effect
&lt;/h2&gt;

&lt;p&gt;If each job induces 100 units of growth, the total isn't 200. It's in the thousands. The skills compound because they're exercised in completely different contexts.&lt;/p&gt;

&lt;p&gt;Yesterday I shipped an Accord evaluator integration — 56 tests, dual-path execution, feature-flagged rollout. But today's leadership reflection will outlast any commit.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Builder's Note:&lt;/strong&gt; I dream about where Agreement technology can take humanity over the next 250, or even 1000 years, and then I reverse engineer that future by creating today's code. Some days that means writing TypeScript. Some days it means learning to hold the line.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Building &lt;a href="https://papre.co" rel="noopener noreferrer"&gt;Papre&lt;/a&gt; — composable agreement infrastructure for trustless coordination.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>web3</category>
      <category>startup</category>
      <category>leadership</category>
      <category>typescript</category>
    </item>
    <item>
      <title>How AI Changed the Way I Build (Not Just the Speed): A Solo Founder's Reflection</title>
      <dc:creator>Chris</dc:creator>
      <pubDate>Tue, 17 Feb 2026 22:34:33 +0000</pubDate>
      <link>https://forem.com/papredapp/how-ai-changed-the-way-i-build-not-just-the-speed-a-solo-founders-reflection-3o1g</link>
      <guid>https://forem.com/papredapp/how-ai-changed-the-way-i-build-not-just-the-speed-a-solo-founders-reflection-3o1g</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; I spent years thinking I had executive dysfunction. AI didn't cure anything — it just matched my cognitive throughput, which turned out to be the actual bottleneck.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;I've struggled with executive function all my life. The kind that doesn't respond to self-help books, willpower, or any of the countless interventions I tried.&lt;/p&gt;

&lt;p&gt;Before AI, I was at my best when working on five unrelated projects simultaneously. More context-switching, paradoxically, meant more output. My brain needed the throughput.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Shift
&lt;/h2&gt;

&lt;p&gt;With modern AI, I can devote all my time to one project — &lt;a href="https://github.com/papre" rel="noopener noreferrer"&gt;Papre&lt;/a&gt;, composable agreement infrastructure for trustless coordination on Ethereum. Instead of trying to type 1,000 words a minute to keep up with my thoughts, I break the work into well-defined pieces and delegate.&lt;/p&gt;

&lt;p&gt;The workflow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Thinking → Breaking into pieces → AI implements → I review/redirect → Ship
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Thinking → Typing frantically → Context lost → Start over → Burn out
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What I'm Building
&lt;/h2&gt;

&lt;p&gt;Papre is composable agreement infrastructure. Think of it as microservices for legal contracts — atomic clauses that compose into agreements, both on-chain (Solidity) and off-chain (TypeScript).&lt;/p&gt;

&lt;p&gt;I'm a transactional lawyer, CS/math grad, and meditation teacher. That unique combination is exactly what this project needs. AI didn't replace any of those skills. It just let me use them all at once without the friction.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;If you've struggled with executive function and found that AI changed your work life — I'd argue it's not that AI fixed you. It's that the tooling finally matched your cognitive throughput.&lt;/p&gt;

&lt;p&gt;The dysfunction was never in the brain. It was in the gap between thinking and building.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Builder's Note:&lt;/strong&gt; Day 5 of building Papre. 12-14 hour days, hyperfocused. The throughput is the therapy.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>productivity</category>
      <category>ai</category>
      <category>buildinpublic</category>
      <category>webdev</category>
    </item>
    <item>
      <title>How We Replaced a 310-Line Translation Layer with Native TemplateMark Parsing</title>
      <dc:creator>Chris</dc:creator>
      <pubDate>Tue, 17 Feb 2026 21:44:23 +0000</pubDate>
      <link>https://forem.com/papredapp/how-we-replaced-a-310-line-translation-layer-with-native-templatemark-parsing-3c8i</link>
      <guid>https://forem.com/papredapp/how-we-replaced-a-310-line-translation-layer-with-native-templatemark-parsing-3c8i</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: We deleted 310 lines of template middleware by switching to native Accord Project TemplateMark grammar. Zero regressions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Our legal agreement templates needed to render in the browser. We had a translation layer converting TemplateMark grammar into an intermediate format — 310 lines of middleware that existed for no good reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Approach
&lt;/h2&gt;

&lt;p&gt;TemplateMark already has a formal grammar. We were translating to an intermediate format unnecessarily.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Before: translate TemplateMark -&amp;gt; intermediate -&amp;gt; render&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;intermediate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;translateTemplate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;templateMark&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;renderIntermediate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;intermediate&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// After: render TemplateMark directly&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;renderTemplateMark&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;templateMark&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Result
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;310 lines deleted&lt;/li&gt;
&lt;li&gt;Zero regressions across 6 agreement types&lt;/li&gt;
&lt;li&gt;Simpler mental model for contributors&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Builder's Note
&lt;/h2&gt;

&lt;p&gt;Spent most of the day convinced the tests would break. They didn't. Sometimes the best code you write is the code you delete.&lt;/p&gt;

</description>
      <category>web3</category>
      <category>typescript</category>
      <category>opensource</category>
      <category>blockchain</category>
    </item>
  </channel>
</rss>
