<?xml version="1.0" encoding="UTF-8"?>
<rss  xmlns:atom="http://www.w3.org/2005/Atom" 
      xmlns:media="http://search.yahoo.com/mrss/" 
      xmlns:content="http://purl.org/rss/1.0/modules/content/" 
      xmlns:dc="http://purl.org/dc/elements/1.1/" 
      version="2.0">
<channel>
<title>Mark Jani — Writing</title>
<link>https://markjani.com/writing.html</link>
<atom:link href="https://markjani.com/writing.xml" rel="self" type="application/rss+xml"/>
<description>Research notes on AI safety, fintech, and applied econometrics.</description>
<generator>quarto-1.10.18</generator>
<lastBuildDate>Wed, 26 Aug 2026 00:00:00 GMT</lastBuildDate>
<item>
  <title>Why I’m publishing my AI safety work in the open</title>
  <link>https://markjani.com/posts/2026-08-why-publish/</link>
  <description><![CDATA[ 




<p>I’ve spent the last year moving my research focus from FinTech economics toward AI safety by way of BlueDot Impact’s Technical AI Safety programme and a lot of Python. The empirical habits I built doing panel econometrics (identification, uncertainty, scepticism about my own results) apply directly to AI evaluations.</p>
<p>This site is where that work goes. Three kinds of posts to expect:</p>
<ol type="1">
<li><strong>Working analyses.</strong> Empirical pieces with the code attached, starting with capability-evaluation questions and the economics of AI deployment.</li>
<li><strong>Technical notes.</strong> Things I had to understand properly to make progress: evaluation methodology, threat modelling, the machinery behind modern LLMs.</li>
<li><strong>Field notes.</strong> Honest write-ups of the transition itself, what a quantitative social scientist has to learn (and unlearn) to contribute to technical safety work.</li>
</ol>
<p>Everything substantive gets cross-posted to <a href="https://www.lesswrong.com">LessWrong</a>, where the safety research conversation actually happens. This site is the canonical home.</p>
<p>If you’re working on capability evaluations, evaluation assurance, or the economics of AI and want to compare notes — <a href="mailto:research@markjani.com">email me</a>.</p>



 ]]></description>
  <category>meta</category>
  <category>ai-safety</category>
  <guid>https://markjani.com/posts/2026-08-why-publish/</guid>
  <pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate>
</item>
<item>
  <title>My analysis pipeline: notebooks, Quarto, and reproducible posts</title>
  <link>https://markjani.com/posts/2026-08-analysis-pipeline/</link>
  <description><![CDATA[ 




<p>Every empirical post on this site is a Quarto document: Markdown for the prose, with Python code cells that are <strong>executed when the site is built</strong>. The chart below isn’t a screenshot — it’s generated from the code you can see, every time the page is rendered. That means results and code can’t drift apart, which is the whole point of reproducible research.</p>
<p>Here’s a minimal example: simulating the classic econometric cautionary tale of spurious correlation between two independent random walks.</p>
<div id="cell-fig-spurious" class="cell" data-execution_count="1">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb1" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb1-1"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> numpy <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> np</span>
<span id="cb1-2"><span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">import</span> matplotlib.pyplot <span class="im" style="color: #00769E;
background-color: null;
font-style: inherit;">as</span> plt</span>
<span id="cb1-3"></span>
<span id="cb1-4">rng <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.random.default_rng(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>)</span>
<span id="cb1-5">n <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">250</span></span>
<span id="cb1-6">x <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.cumsum(rng.normal(size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>n))</span>
<span id="cb1-7">y <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> np.cumsum(rng.normal(size<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>n))</span>
<span id="cb1-8"></span>
<span id="cb1-9">fig, ax <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> plt.subplots(figsize<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span>(<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">8</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">4</span>))</span>
<span id="cb1-10">ax.plot(x, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#197A56"</span>, lw<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.6</span>, label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Series X"</span>)</span>
<span id="cb1-11">ax.plot(y, color<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"#566070"</span>, lw<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="fl" style="color: #AD0000;
background-color: null;
font-style: inherit;">1.6</span>, label<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Series Y"</span>)</span>
<span id="cb1-12">ax.set_xlabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"t"</span>)</span>
<span id="cb1-13">ax.set_ylabel(<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"Value"</span>)</span>
<span id="cb1-14">ax.legend(frameon<span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span><span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb1-15">ax.spines[[<span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"top"</span>, <span class="st" style="color: #20794D;
background-color: null;
font-style: inherit;">"right"</span>]].set_visible(<span class="va" style="color: #111111;
background-color: null;
font-style: inherit;">False</span>)</span>
<span id="cb1-16">plt.tight_layout()</span>
<span id="cb1-17">plt.show()</span></code></pre></div></div>
<div class="cell-output cell-output-display">
<div id="fig-spurious" class="quarto-float quarto-figure quarto-figure-center anchored">
<figure class="quarto-float quarto-float-fig figure">
<div aria-describedby="fig-spurious-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
<img src="https://markjani.com/posts/2026-08-analysis-pipeline/index_files/figure-html/fig-spurious-output-1.png" width="758" height="374" class="figure-img">
</div>
<figcaption class="quarto-float-caption-bottom quarto-float-caption quarto-float-fig" id="fig-spurious-caption-0ceaefa1-69ba-4598-a22c-09a6ac19f8ca">
Figure&nbsp;1: Two independent random walks. They share no causal link, yet their correlation is high — the classic spurious regression problem (Granger &amp; Newbold, 1974).
</figcaption>
</figure>
</div>
</div>
</div>
<p>And the punchline, computed live:</p>
<div id="25b641e9" class="cell" data-execution_count="2">
<div class="code-copy-outer-scaffold"><div class="sourceCode cell-code" id="cb2" style="background: #f1f3f5;"><pre class="sourceCode python code-with-copy"><code class="sourceCode python"><span id="cb2-1">corr <span class="op" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">=</span> <span class="bu" style="color: null;
background-color: null;
font-style: inherit;">float</span>(np.corrcoef(x, y)[<span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">0</span>, <span class="dv" style="color: #AD0000;
background-color: null;
font-style: inherit;">1</span>])</span>
<span id="cb2-2"><span class="bu" style="color: null;
background-color: null;
font-style: inherit;">print</span>(<span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">f"Pearson correlation between the two independent walks: </span><span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">{</span>corr<span class="sc" style="color: #5E5E5E;
background-color: null;
font-style: inherit;">:.2f}</span><span class="ss" style="color: #20794D;
background-color: null;
font-style: inherit;">"</span>)</span></code></pre></div></div>
<div class="cell-output cell-output-stdout">
<pre><code>Pearson correlation between the two independent walks: -0.90</code></pre>
</div>
</div>
<p>Two series with no relationship whatsoever, and a correlation near −0.9 that would excite any careless analyst. Non-stationarity does that. It’s a two-line simulation, but it’s also the reason unit-root tests exist, and a decent metaphor for why evaluation results need the same statistical care as any other empirical claim.</p>
<p>The workflow, end to end:</p>
<ol type="1">
<li>Explore in a Jupyter notebook inside VS Code.</li>
<li>When the analysis stabilises, move it into a <code>.qmd</code> file like this one.</li>
<li><code>quarto render</code> executes the code and builds the page; results are cached (Quarto’s <em>freeze</em>) so the site rebuilds fast.</li>
<li>Push to GitHub, an Action publishes the site automatically.</li>
</ol>
<p>Code, results, and write-up live in one file, in version control, in public.</p>



 ]]></description>
  <category>methods</category>
  <category>python</category>
  <guid>https://markjani.com/posts/2026-08-analysis-pipeline/</guid>
  <pubDate>Tue, 25 Aug 2026 00:00:00 GMT</pubDate>
</item>
</channel>
</rss>
