<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Alejandro Erickson</title>
    <description>I am an inventor, educator, artist, and I develop Decision Analytics software for IFS Copperleaf. When I am not doing research, coding, or using the 3D printer I am making espresso coffee, taking pictures, making geometric sculptures, building drones, or reading to my son in Spanish.
</description>
    <link>https://alejandroerickson.com/</link>
    <atom:link href="https://alejandroerickson.com/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Sat, 10 Oct 2026 20:59:53 +0000</pubDate>
    <lastBuildDate>Sat, 10 Oct 2026 20:59:53 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
      <item>
        <title>Jev Atlas: teaching a fast browser agent an enterprise app</title>
        <description>&lt;style&gt;
  .jeva .jeva-anim { margin: var(--space-6) 0; }
  .jeva .jeva-anim svg { display: block; width: 100%; height: auto; overflow: visible; }
  .jeva .jeva-anim text { font-family: var(--font-sans); font-size: 17px; font-weight: 600; fill: var(--text); }
  .jeva .jeva-frame { fill: var(--bg); stroke: var(--rule-strong); stroke-width: 1.5; }
  .jeva .jeva-roads line { stroke: var(--rule-strong); stroke-width: 1.5; }
  .jeva .jeva-node { fill: var(--data-1); stroke: var(--data-1); stroke-width: 2; transition: fill 400ms ease-out, stroke 400ms ease-out; transition-delay: var(--d, 0s); }
  .jeva .jeva-direct { stroke: var(--muted); stroke-width: 2; stroke-dasharray: 5 5; }
  .jeva .jeva-arrow { stroke: var(--muted); stroke-width: 1.5; }
  .jeva .jeva-survey { fill: none; stroke: var(--data-1); stroke-width: 2; stroke-linejoin: round; stroke-dasharray: 1; stroke-dashoffset: 0; transition: stroke-dashoffset 2800ms cubic-bezier(0.4, 0, 0.6, 1), opacity 600ms ease-out; }
  .jeva .jeva-atlas polygon { stroke: var(--data-1); stroke-width: 2; stroke-linejoin: round; }
  .jeva .jeva-atlas .jeva-f1 { fill: var(--bg); }
  .jeva .jeva-atlas .jeva-f2 { fill: var(--surface); }
  .jeva .jeva-atlas line { stroke: var(--data-1); stroke-width: 1.25; opacity: 0.6; }
  .jeva .jeva-atlas circle { fill: var(--data-1); }
  .jeva .jeva-atlas { transition: transform 1100ms cubic-bezier(0.16, 1, 0.3, 1), opacity 600ms ease-out; }
  .jeva .jeva-link { stroke: var(--data-1); stroke-width: 3; }
  .jeva .jeva-p2, .jeva .jeva-p3, .jeva .jeva-p4, .jeva .jeva-until4 { transition: opacity 600ms ease-out; }

  .jeva .jeva-anim[data-phase=&quot;1&quot;] :is(.jeva-p2, .jeva-p3, .jeva-p4),
  .jeva .jeva-anim[data-phase=&quot;2&quot;] :is(.jeva-p3, .jeva-p4),
  .jeva .jeva-anim[data-phase=&quot;3&quot;] .jeva-p4,
  .jeva .jeva-anim[data-phase=&quot;4&quot;] .jeva-until4 { opacity: 0; }
  .jeva .jeva-anim[data-phase=&quot;1&quot;] .jeva-node { fill: var(--bg); stroke: var(--rule-strong); }
  .jeva .jeva-anim[data-phase=&quot;1&quot;] .jeva-survey { stroke-dashoffset: 1; }
  .jeva .jeva-anim[data-phase=&quot;4&quot;] .jeva-survey { opacity: 0.3; }
  .jeva .jeva-anim:not([data-phase=&quot;4&quot;]) .jeva-atlas { transform: translateY(-128px); }
  .jeva .jeva-anim[data-phase=&quot;1&quot;] * { transition: none !important; }

  .jeva .jeva-steps { margin: var(--space-4) 0 0; padding-left: var(--space-5); font-size: var(--text-small); color: var(--text); }
  .jeva .jeva-steps li { margin-bottom: var(--space-1); transition: color 300ms ease-out; }
  .jeva .jeva-anim.is-playing .jeva-steps li { color: var(--muted); }
  .jeva .jeva-anim.is-playing[data-phase=&quot;1&quot;] .jeva-steps li:nth-child(1),
  .jeva .jeva-anim.is-playing[data-phase=&quot;2&quot;] .jeva-steps li:nth-child(2),
  .jeva .jeva-anim.is-playing[data-phase=&quot;3&quot;] .jeva-steps li:nth-child(3),
  .jeva .jeva-anim.is-playing[data-phase=&quot;4&quot;] .jeva-steps li:nth-child(4) { color: var(--text); }

  .jeva button.jeva-btn { font: inherit; font-size: var(--text-small); color: var(--text); background: var(--bg); border: 1px solid var(--rule-strong); border-radius: 4px; padding: var(--space-1) var(--space-3); cursor: pointer; }
  .jeva button.jeva-btn:hover { border-color: var(--muted); }
  .jeva button.jeva-btn:focus-visible { outline: 2px solid var(--focus); outline-offset: 2px; }
  .jeva button.jeva-btn[aria-pressed=&quot;true&quot;] { background: var(--surface); border-color: var(--muted); font-weight: 600; }
  .jeva .jeva-replay { margin-top: var(--space-2); }

  .jeva .jeva-step { margin: var(--space-6) 0; padding: var(--space-5); border: 1px solid var(--rule); border-radius: var(--radius); }
  .jeva .jeva-goal { margin: 0 0 var(--space-4); font-size: 1rem; }
  .jeva .jeva-goal span, .jeva .jeva-k { display: block; font-size: var(--text-label); font-weight: 600; letter-spacing: 0.06em; text-transform: uppercase; color: var(--muted); }
  .jeva .jeva-goal q { font-style: italic; }
  .jeva .jeva-toggle { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-bottom: var(--space-4); }
  .jeva .jeva-panel + .jeva-panel { margin-top: var(--space-5); }
  .jeva.jeva-js .jeva-panel + .jeva-panel { margin-top: 0; }
  .jeva .jeva-ph { margin: 0 0 var(--space-3); font-size: 1rem; }
  .jeva.jeva-js .jeva-ph { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
  .jeva .jeva-added { border: 1px solid var(--data-1); border-radius: var(--radius); padding: var(--space-3) var(--space-4); font-size: var(--text-small); }
  .jeva .jeva-added p, .jeva .jeva-added ul { margin: 0; }
  .jeva .jeva-added ul { padding-left: var(--space-4); }
  .jeva .jeva-added li { margin: var(--space-1) 0 0; }
  .jeva .jeva-added .jeva-k { margin-bottom: var(--space-1); }
  .jeva .jeva-panel &gt; .jeva-added { margin-bottom: var(--space-3); }
  .jeva .jeva-opts { list-style: none; margin: var(--space-4) 0 0; padding: 0; }
  .jeva .jeva-opts li { margin: 0; padding: var(--space-3) 0; border-top: 1px solid var(--rule); }
  .jeva .jeva-opts li:first-child { border-top: 0; padding-top: 0; }
  .jeva .jeva-row { display: flex; align-items: baseline; gap: var(--space-2); font-size: 1rem; }
  .jeva .jeva-name { font-weight: 600; }
  .jeva .jeva-kind { font-size: var(--text-small); color: var(--muted); }
  .jeva .jeva-pick { font-size: var(--text-label); font-weight: 600; padding: 0 var(--space-2); border-radius: 999px; background: var(--surface); border: 1px solid var(--rule-strong); }
  .jeva .jeva-prob { margin-left: auto; font-variant-numeric: tabular-nums; }
  .jeva .jeva-bar { height: 6px; margin-top: var(--space-2); border-radius: 3px; background: var(--rule); overflow: hidden; }
  .jeva .jeva-bar i { display: block; height: 100%; min-width: 2px; border-radius: 3px; background: var(--muted); }
  .jeva .is-picked .jeva-bar i { background: var(--text); }
  .jeva .jeva-opts .jeva-added { margin-top: var(--space-2); }
  .jeva .jeva-out { margin: var(--space-4) 0 0; font-size: var(--text-small); color: var(--muted); }
  .jeva .jeva-key { display: flex; align-items: center; gap: var(--space-2); margin: var(--space-4) 0 0; font-size: var(--text-small); color: var(--muted); }
  .jeva .jeva-key i { flex: none; width: 1.1em; height: 0.8em; border: 1px solid var(--data-1); border-radius: 2px; }

  .jeva .jeva-lesson { margin: var(--space-6) 0; }
  .jeva .jeva-lesson &gt; div { font-size: 1rem; }
  .jeva .jeva-lesson &gt; div + div { margin-top: var(--space-3); }
  .jeva .jeva-before { border: 1px solid var(--rule); border-radius: var(--radius); padding: var(--space-3) var(--space-4); }
  .jeva .jeva-lesson p { margin: 0; }

  .jeva .jeva-results { margin: var(--space-6) 0; }
  .jeva .jeva-results table { width: 100%; margin: 0; }
  .jeva .jeva-results td:first-child { min-width: 10rem; }
  .jeva .jeva-res { display: inline-flex; align-items: center; gap: var(--space-1); white-space: nowrap; }
  .jeva .jeva-res svg { width: 1em; height: 1em; fill: none; stroke: currentColor; stroke-width: 2.5; stroke-linecap: round; stroke-linejoin: round; }
  .jeva .jeva-res.is-fail { color: var(--muted); }

  @media (max-width: 600px) {
    .jeva .jeva-anim text { font-size: 24px; }
    .jeva .jeva-step { padding: var(--space-4); }
    .jeva .jeva-results td:first-child { min-width: 0; }
    .jeva .jeva-results td:not(:first-child) { text-align: center; }
    .jeva .jeva-res svg { width: 1.25em; height: 1.25em; }
    .jeva .jeva-w { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
  }
  @media (prefers-reduced-motion: reduce) {
    .jeva .jeva-anim * { transition: none !important; }
  }
&lt;/style&gt;

&lt;div class=&quot;jeva&quot;&gt;

&lt;p&gt;I was learning about &lt;a href=&quot;https://typesafe.ai&quot;&gt;Jev&lt;/a&gt;, TypeSafe&apos;s model for making fast, typed decisions, when I came across Browser Use&apos;s &lt;a href=&quot;https://github.com/browser-use/jev-ultrafast&quot;&gt;jev-ultrafast&lt;/a&gt; demo, in which Jev drives a web browser and books a ticket from Zurich to London in 7.1 seconds. It is fast because each step is one question to Jev: here is everything on the screen, which one do I click? That&apos;s super cool, but a booking site is made to be understood at first sight, without a manual. Enterprise software is made for experts, and it comes with one.&lt;/p&gt;

&lt;p&gt;So I pointed it at &lt;a href=&quot;/2026/09/25/adit-a-mock-enterprise-app.html&quot;&gt;ADIT&lt;/a&gt;, the mock mining exploration app I made for testing AI agents, with a request an exploration manager might make: &lt;q&gt;bellamy ridge&apos;s maiden resource has to go out this week, tomasz has finished his QP review so do his step as him and then release it as me&lt;/q&gt;. Jev got as far as the release request and stopped. Nothing on that screen says that you act as Tomasz by switching user in the account menu; you&apos;d have to read the manual. So I gave Jev the manual, in a form it can use on every step: an atlas of the app.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On five tasks, Jev finished 1 without the atlas, 4 with it, and all 5 after the atlas learnt from the one it still failed.&lt;/strong&gt;&lt;/p&gt;


&lt;div class=&quot;image-wrapper&quot;&gt;
  &lt;iframe class=&quot;embed-frame&quot; src=&quot;https://www.youtube.com/embed/YRixZluuXb8&quot;
          width=&quot;640&quot; height=&quot;360&quot;
          style=&quot;max-width: 640px; aspect-ratio: 640 / 360;&quot;
          frameborder=&quot;0&quot; allowfullscreen loading=&quot;lazy&quot;
          title=&quot;The Bellamy Ridge task, without the atlas and then with it.&quot;&gt;&lt;/iframe&gt;
    
        &lt;p class=&quot;image-caption&quot;&gt;The Bellamy Ridge task, without the atlas and then with it.&lt;/p&gt;
    
&lt;/div&gt;


&lt;p&gt;The atlas is a shim. It sits between Jev and the application and adds to what Jev sees, without changing Jev or the question it is asked.&lt;/p&gt;

&lt;figure class=&quot;jeva-anim&quot; data-phase=&quot;4&quot;&gt;
  &lt;svg viewBox=&quot;0 0 640 360&quot; role=&quot;img&quot;&gt;
    &lt;title&gt;A frontier AI model reads an enterprise app&apos;s user manual and visits its screens, draws an atlas of the app, and the atlas is inserted between Jev and the app.&lt;/title&gt;
    &lt;defs&gt;
      &lt;marker id=&quot;jeva-arrowhead&quot; viewBox=&quot;0 0 10 10&quot; refX=&quot;9&quot; refY=&quot;5&quot; markerWidth=&quot;7&quot; markerHeight=&quot;7&quot; orient=&quot;auto&quot;&gt;&lt;path d=&quot;M0,0 L10,5 L0,10 z&quot; style=&quot;fill: var(--muted)&quot;/&gt;&lt;/marker&gt;
    &lt;/defs&gt;

    &lt;rect class=&quot;jeva-frame&quot; x=&quot;445&quot; y=&quot;130&quot; width=&quot;185&quot; height=&quot;220&quot; rx=&quot;8&quot;/&gt;
    &lt;text x=&quot;459&quot; y=&quot;156&quot;&gt;Enterprise app&lt;/text&gt;
    &lt;g class=&quot;jeva-roads&quot;&gt;
      &lt;line x1=&quot;470&quot; y1=&quot;185&quot; x2=&quot;540&quot; y2=&quot;175&quot;/&gt;&lt;line x1=&quot;540&quot; y1=&quot;175&quot; x2=&quot;600&quot; y2=&quot;200&quot;/&gt;
      &lt;line x1=&quot;470&quot; y1=&quot;185&quot; x2=&quot;465&quot; y2=&quot;250&quot;/&gt;&lt;line x1=&quot;540&quot; y1=&quot;175&quot; x2=&quot;545&quot; y2=&quot;245&quot;/&gt;
      &lt;line x1=&quot;465&quot; y1=&quot;250&quot; x2=&quot;545&quot; y2=&quot;245&quot;/&gt;&lt;line x1=&quot;545&quot; y1=&quot;245&quot; x2=&quot;605&quot; y2=&quot;275&quot;/&gt;
      &lt;line x1=&quot;600&quot; y1=&quot;200&quot; x2=&quot;605&quot; y2=&quot;275&quot;/&gt;&lt;line x1=&quot;465&quot; y1=&quot;250&quot; x2=&quot;490&quot; y2=&quot;320&quot;/&gt;
      &lt;line x1=&quot;490&quot; y1=&quot;320&quot; x2=&quot;575&quot; y2=&quot;330&quot;/&gt;&lt;line x1=&quot;605&quot; y1=&quot;275&quot; x2=&quot;575&quot; y2=&quot;330&quot;/&gt;
      &lt;line x1=&quot;545&quot; y1=&quot;245&quot; x2=&quot;575&quot; y2=&quot;330&quot;/&gt;
    &lt;/g&gt;
    &lt;circle class=&quot;jeva-node&quot; cx=&quot;470&quot; cy=&quot;185&quot; r=&quot;7&quot; style=&quot;--d: 0.5s&quot;/&gt;
    &lt;circle class=&quot;jeva-node&quot; cx=&quot;540&quot; cy=&quot;175&quot; r=&quot;7&quot; style=&quot;--d: 0.8s&quot;/&gt;
    &lt;circle class=&quot;jeva-node&quot; cx=&quot;600&quot; cy=&quot;200&quot; r=&quot;7&quot; style=&quot;--d: 1.1s&quot;/&gt;
    &lt;circle class=&quot;jeva-node&quot; cx=&quot;605&quot; cy=&quot;275&quot; r=&quot;7&quot; style=&quot;--d: 1.4s&quot;/&gt;
    &lt;circle class=&quot;jeva-node&quot; cx=&quot;545&quot; cy=&quot;245&quot; r=&quot;7&quot; style=&quot;--d: 1.7s&quot;/&gt;
    &lt;circle class=&quot;jeva-node&quot; cx=&quot;465&quot; cy=&quot;250&quot; r=&quot;7&quot; style=&quot;--d: 2.0s&quot;/&gt;
    &lt;circle class=&quot;jeva-node&quot; cx=&quot;490&quot; cy=&quot;320&quot; r=&quot;7&quot; style=&quot;--d: 2.3s&quot;/&gt;
    &lt;circle class=&quot;jeva-node&quot; cx=&quot;575&quot; cy=&quot;330&quot; r=&quot;7&quot; style=&quot;--d: 2.6s&quot;/&gt;

    &lt;circle class=&quot;jeva-frame&quot; cx=&quot;52&quot; cy=&quot;250&quot; r=&quot;34&quot;/&gt;
    &lt;text x=&quot;52&quot; y=&quot;256&quot; text-anchor=&quot;middle&quot;&gt;Jev&lt;/text&gt;
    &lt;line class=&quot;jeva-direct jeva-until4&quot; x1=&quot;86&quot; y1=&quot;250&quot; x2=&quot;445&quot; y2=&quot;250&quot;/&gt;

    &lt;g class=&quot;jeva-p2&quot;&gt;
      &lt;rect class=&quot;jeva-frame&quot; x=&quot;180&quot; y=&quot;12&quot; width=&quot;240&quot; height=&quot;46&quot; rx=&quot;8&quot;/&gt;
      &lt;text x=&quot;300&quot; y=&quot;41&quot; text-anchor=&quot;middle&quot;&gt;Frontier AI model&lt;/text&gt;
      &lt;rect class=&quot;jeva-frame&quot; x=&quot;455&quot; y=&quot;12&quot; width=&quot;175&quot; height=&quot;46&quot; rx=&quot;3&quot;/&gt;
      &lt;line class=&quot;jeva-arrow&quot; x1=&quot;467&quot; y1=&quot;12&quot; x2=&quot;467&quot; y2=&quot;58&quot;/&gt;
      &lt;text x=&quot;549&quot; y=&quot;41&quot; text-anchor=&quot;middle&quot;&gt;User manual&lt;/text&gt;
      &lt;line class=&quot;jeva-arrow&quot; x1=&quot;455&quot; y1=&quot;35&quot; x2=&quot;424&quot; y2=&quot;35&quot; marker-end=&quot;url(#jeva-arrowhead)&quot;/&gt;
    &lt;/g&gt;
    &lt;path class=&quot;jeva-survey jeva-p2&quot; pathLength=&quot;1&quot; d=&quot;M400 58 C425 110 455 150 470 185 L540 175 L600 200 L605 275 L545 245 L465 250 L490 320 L575 330&quot;/&gt;

    &lt;g class=&quot;jeva-atlas jeva-p3&quot;&gt;
      &lt;polygon class=&quot;jeva-f1&quot; points=&quot;150,200 213,206 213,306 150,300&quot;/&gt;
      &lt;polygon class=&quot;jeva-f2&quot; points=&quot;213,206 277,200 277,300 213,306&quot;/&gt;
      &lt;polygon class=&quot;jeva-f1&quot; points=&quot;277,200 340,206 340,306 277,300&quot;/&gt;
      &lt;line x1=&quot;238&quot; y1=&quot;217&quot; x2=&quot;286&quot; y2=&quot;212&quot;/&gt;&lt;line x1=&quot;286&quot; y1=&quot;212&quot; x2=&quot;327&quot; y2=&quot;225&quot;/&gt;
      &lt;line x1=&quot;238&quot; y1=&quot;217&quot; x2=&quot;235&quot; y2=&quot;250&quot;/&gt;&lt;line x1=&quot;286&quot; y1=&quot;212&quot; x2=&quot;289&quot; y2=&quot;247&quot;/&gt;
      &lt;line x1=&quot;235&quot; y1=&quot;250&quot; x2=&quot;289&quot; y2=&quot;247&quot;/&gt;&lt;line x1=&quot;289&quot; y1=&quot;247&quot; x2=&quot;330&quot; y2=&quot;262&quot;/&gt;
      &lt;line x1=&quot;327&quot; y1=&quot;225&quot; x2=&quot;330&quot; y2=&quot;262&quot;/&gt;&lt;line x1=&quot;235&quot; y1=&quot;250&quot; x2=&quot;252&quot; y2=&quot;285&quot;/&gt;
      &lt;line x1=&quot;252&quot; y1=&quot;285&quot; x2=&quot;310&quot; y2=&quot;290&quot;/&gt;&lt;line x1=&quot;330&quot; y1=&quot;262&quot; x2=&quot;310&quot; y2=&quot;290&quot;/&gt;
      &lt;line x1=&quot;289&quot; y1=&quot;247&quot; x2=&quot;310&quot; y2=&quot;290&quot;/&gt;
      &lt;circle cx=&quot;238&quot; cy=&quot;217&quot; r=&quot;4&quot;/&gt;&lt;circle cx=&quot;286&quot; cy=&quot;212&quot; r=&quot;4&quot;/&gt;&lt;circle cx=&quot;327&quot; cy=&quot;225&quot; r=&quot;4&quot;/&gt;
      &lt;circle cx=&quot;235&quot; cy=&quot;250&quot; r=&quot;4&quot;/&gt;&lt;circle cx=&quot;289&quot; cy=&quot;247&quot; r=&quot;4&quot;/&gt;&lt;circle cx=&quot;330&quot; cy=&quot;262&quot; r=&quot;4&quot;/&gt;
      &lt;circle cx=&quot;252&quot; cy=&quot;285&quot; r=&quot;4&quot;/&gt;&lt;circle cx=&quot;310&quot; cy=&quot;290&quot; r=&quot;4&quot;/&gt;
      &lt;text x=&quot;160&quot; y=&quot;229&quot;&gt;Atlas&lt;/text&gt;
    &lt;/g&gt;

    &lt;g class=&quot;jeva-p4&quot;&gt;
      &lt;line class=&quot;jeva-link&quot; x1=&quot;86&quot; y1=&quot;250&quot; x2=&quot;150&quot; y2=&quot;250&quot;/&gt;
      &lt;line class=&quot;jeva-link&quot; x1=&quot;340&quot; y1=&quot;253&quot; x2=&quot;445&quot; y2=&quot;250&quot;/&gt;
    &lt;/g&gt;
  &lt;/svg&gt;
  &lt;figcaption&gt;
    &lt;ol class=&quot;jeva-steps&quot;&gt;
      &lt;li&gt;Jev sees each screen as a numbered list of labelled controls, and picks one.&lt;/li&gt;
      &lt;li&gt;A frontier AI model reads ADIT&apos;s user manual and goes through every screen.&lt;/li&gt;
      &lt;li&gt;It writes an atlas: a digest of each page, a note on each control, and scripts that read live facts off the page.&lt;/li&gt;
      &lt;li&gt;The atlas goes in between. On every step, what Jev sees is annotated from it.&lt;/li&gt;
    &lt;/ol&gt;
    &lt;button type=&quot;button&quot; class=&quot;jeva-btn jeva-replay&quot; hidden&gt;Play again&lt;/button&gt;
  &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;h2&gt;What&apos;s in the atlas&lt;/h2&gt;

&lt;p&gt;A frontier AI model wrote it: seven agents, one for each area of ADIT, read the app&apos;s user manual and went through every screen without changing anything, and wrote down what each screen and control is for. None of them saw the tasks I tested with. The atlas covers 88 screens and dialogs and 593 controls, and on each step it adds three things to what Jev sees:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;a digest of the page, at the level of the user manual: what the screen is for, and where the jobs it doesn&apos;t do are found (&quot;Tenement renewal: the Tenure tab&quot;);&lt;/li&gt;
  &lt;li&gt;a note on each button and link, saying what it does and sometimes what it is not for; and,&lt;/li&gt;
  &lt;li&gt;live facts about the page in front of it, such as who is signed in, who else Jev could sign in as, and which project is open.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The live facts come from small pieces of JavaScript that the model wrote into the atlas. They run on the page at every step, so part of the atlas is generated code rather than documentation.&lt;/p&gt;

&lt;p&gt;Here is one step of another task, where I asked Jev to &quot;park&quot; the Sable Dome project at its gate. The manual&apos;s word for that is a stage-gate decision, and no button says &quot;park&quot; or &quot;hold&quot;.&lt;/p&gt;

&lt;div class=&quot;jeva-step&quot;&gt;
  &lt;p class=&quot;jeva-goal&quot;&gt;&lt;span&gt;Task&lt;/span&gt;&lt;q&gt;sable dome&apos;s gate is coming up and i don&apos;t want to hand it over yet, the phase two results were too thin, just park it where it is for now&lt;/q&gt;&lt;/p&gt;

  &lt;div class=&quot;jeva-toggle&quot; role=&quot;group&quot; aria-label=&quot;Show this step&quot; hidden&gt;
    &lt;button type=&quot;button&quot; class=&quot;jeva-btn&quot; data-show=&quot;without&quot; aria-pressed=&quot;true&quot;&gt;Without the atlas&lt;/button&gt;
    &lt;button type=&quot;button&quot; class=&quot;jeva-btn&quot; data-show=&quot;with&quot; aria-pressed=&quot;false&quot;&gt;With the atlas&lt;/button&gt;
  &lt;/div&gt;

  &lt;div class=&quot;jeva-panel&quot; data-cond=&quot;without&quot;&gt;
    &lt;h3 class=&quot;jeva-ph&quot;&gt;Without the atlas&lt;/h3&gt;
    &lt;ol class=&quot;jeva-opts&quot;&gt;
      &lt;li class=&quot;is-picked&quot;&gt;
        &lt;div class=&quot;jeva-row&quot;&gt;&lt;span class=&quot;jeva-name&quot;&gt;Edit&lt;/span&gt;&lt;span class=&quot;jeva-kind&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;jeva-pick&quot;&gt;picked&lt;/span&gt;&lt;span class=&quot;jeva-prob&quot;&gt;0.45&lt;/span&gt;&lt;/div&gt;
        &lt;div class=&quot;jeva-bar&quot;&gt;&lt;i style=&quot;width: 45%&quot;&gt;&lt;/i&gt;&lt;/div&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;div class=&quot;jeva-row&quot;&gt;&lt;span class=&quot;jeva-name&quot;&gt;On hold 1&lt;/span&gt;&lt;span class=&quot;jeva-kind&quot;&gt;link&lt;/span&gt;&lt;span class=&quot;jeva-prob&quot;&gt;0.41&lt;/span&gt;&lt;/div&gt;
        &lt;div class=&quot;jeva-bar&quot;&gt;&lt;i style=&quot;width: 41%&quot;&gt;&lt;/i&gt;&lt;/div&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;div class=&quot;jeva-row&quot;&gt;&lt;span class=&quot;jeva-name&quot;&gt;Watching&lt;/span&gt;&lt;span class=&quot;jeva-kind&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;jeva-prob&quot;&gt;0.07&lt;/span&gt;&lt;/div&gt;
        &lt;div class=&quot;jeva-bar&quot;&gt;&lt;i style=&quot;width: 7%&quot;&gt;&lt;/i&gt;&lt;/div&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;div class=&quot;jeva-row&quot;&gt;&lt;span class=&quot;jeva-name&quot;&gt;Stage-gate decision&lt;/span&gt;&lt;span class=&quot;jeva-kind&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;jeva-prob&quot;&gt;0.02&lt;/span&gt;&lt;/div&gt;
        &lt;div class=&quot;jeva-bar&quot;&gt;&lt;i style=&quot;width: 2%&quot;&gt;&lt;/i&gt;&lt;/div&gt;
      &lt;/li&gt;
    &lt;/ol&gt;
    &lt;p class=&quot;jeva-out&quot;&gt;Edit opens a dialog with no way to hold a project. Jev saved it unchanged, then kept clicking the On hold filter on the project list, and gave up after 7 steps.&lt;/p&gt;
  &lt;/div&gt;

  &lt;div class=&quot;jeva-panel&quot; data-cond=&quot;with&quot;&gt;
    &lt;h3 class=&quot;jeva-ph&quot;&gt;With the atlas&lt;/h3&gt;
    &lt;div class=&quot;jeva-added&quot;&gt;
      &lt;p class=&quot;jeva-k&quot;&gt;Page digest&lt;/p&gt;
      &lt;p&gt;Project record, Overview tab. One project&apos;s summary: fiscal-year budget and spend, area under tenure, holes drilled … The header carries Watch, Edit and Stage-gate decision … Tenement renewal (Lodge renewal): the Tenure tab. Deciding a request: the request&apos;s own page in Approvals.&lt;/p&gt;
    &lt;/div&gt;
    &lt;div class=&quot;jeva-added&quot;&gt;
      &lt;p class=&quot;jeva-k&quot;&gt;Live facts, read by the atlas&apos;s scripts&lt;/p&gt;
      &lt;ul&gt;
        &lt;li&gt;Signed in as Marguerite Okonkwo, Exploration Manager&lt;/li&gt;
        &lt;li&gt;Project in view: Sable Dome (PRJ-0433) · Gold · active · Stage-gate decision · gate 2026-09-30 (in 9 days)&lt;/li&gt;
        &lt;li&gt;Project header actions shown to the signed-in user: Watching, Edit, Stage-gate decision&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/div&gt;
    &lt;ol class=&quot;jeva-opts&quot;&gt;
      &lt;li&gt;
        &lt;div class=&quot;jeva-row&quot;&gt;&lt;span class=&quot;jeva-name&quot;&gt;Edit&lt;/span&gt;&lt;span class=&quot;jeva-kind&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;jeva-prob&quot;&gt;0.00&lt;/span&gt;&lt;/div&gt;
        &lt;div class=&quot;jeva-bar&quot;&gt;&lt;i style=&quot;width: 0%&quot;&gt;&lt;/i&gt;&lt;/div&gt;
        &lt;p class=&quot;jeva-added&quot;&gt;Opens the Edit dialog for the project&apos;s name, project geologist, next gate date, year-end forecast and description.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;div class=&quot;jeva-row&quot;&gt;&lt;span class=&quot;jeva-name&quot;&gt;On hold 1&lt;/span&gt;&lt;span class=&quot;jeva-kind&quot;&gt;link&lt;/span&gt;&lt;span class=&quot;jeva-prob&quot;&gt;0.00&lt;/span&gt;&lt;/div&gt;
        &lt;div class=&quot;jeva-bar&quot;&gt;&lt;i style=&quot;width: 0%&quot;&gt;&lt;/i&gt;&lt;/div&gt;
        &lt;p class=&quot;jeva-added&quot;&gt;Cuts the register to projects whose status is on hold. The number is how many there are.&lt;/p&gt;
      &lt;/li&gt;
      &lt;li&gt;
        &lt;div class=&quot;jeva-row&quot;&gt;&lt;span class=&quot;jeva-name&quot;&gt;Watching&lt;/span&gt;&lt;span class=&quot;jeva-kind&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;jeva-prob&quot;&gt;0.00&lt;/span&gt;&lt;/div&gt;
        &lt;div class=&quot;jeva-bar&quot;&gt;&lt;i style=&quot;width: 0%&quot;&gt;&lt;/i&gt;&lt;/div&gt;
        &lt;p class=&quot;jeva-added&quot;&gt;Toggles whether you watch this project (notifications about it).&lt;/p&gt;
      &lt;/li&gt;
      &lt;li class=&quot;is-picked&quot;&gt;
        &lt;div class=&quot;jeva-row&quot;&gt;&lt;span class=&quot;jeva-name&quot;&gt;Stage-gate decision&lt;/span&gt;&lt;span class=&quot;jeva-kind&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;jeva-pick&quot;&gt;picked&lt;/span&gt;&lt;span class=&quot;jeva-prob&quot;&gt;0.99&lt;/span&gt;&lt;/div&gt;
        &lt;div class=&quot;jeva-bar&quot;&gt;&lt;i style=&quot;width: 99%&quot;&gt;&lt;/i&gt;&lt;/div&gt;
        &lt;p class=&quot;jeva-added&quot;&gt;Opens the Stage-gate decision dialog to advance, hold, resume or relinquish the project.&lt;/p&gt;
      &lt;/li&gt;
    &lt;/ol&gt;
    &lt;p class=&quot;jeva-out&quot;&gt;Jev opened the dialog, chose Place on hold, typed a reason and recorded the decision, in 6 steps.&lt;/p&gt;
  &lt;/div&gt;

  &lt;p class=&quot;jeva-key&quot;&gt;&lt;i&gt;&lt;/i&gt;Outlined in blue: added by the atlas. The numbers are Jev&apos;s probabilities for 4 of the 48 controls on this screen.&lt;/p&gt;
&lt;/div&gt;

&lt;h2&gt;Learning from failures&lt;/h2&gt;

&lt;p&gt;With the atlas, one of the five tasks still failed: creating a resource estimate as Tomasz. Jev went round in a loop between the project and the Resources section for 60 steps, and then gave up. So I added a learning loop. When a task fails, a frontier model reads the failed run as Jev saw it, step by step, along with the manual, and proposes up to three lessons about the app. Code throws out any lesson that copies values or wording from the task, or that doesn&apos;t attach to something Jev actually saw, and the rest wait for a person to accept them before the atlas is rebuilt.&lt;/p&gt;

&lt;p&gt;Here the model found that the atlas described &lt;em&gt;All estimates&lt;/em&gt; as a list of the estimates that exist, when it is also where you start a new one:&lt;/p&gt;

&lt;figure class=&quot;jeva-lesson&quot;&gt;
  &lt;div class=&quot;jeva-before&quot;&gt;
    &lt;p class=&quot;jeva-k&quot;&gt;Before: the note on All estimates&lt;/p&gt;
    &lt;p&gt;Opens the list of every resource estimate, any status; the number is how many there are.&lt;/p&gt;
  &lt;/div&gt;
  &lt;div class=&quot;jeva-added&quot;&gt;
    &lt;p class=&quot;jeva-k&quot;&gt;After one learning round&lt;/p&gt;
    &lt;p&gt;Opens the estimate register, where New estimate starts an estimate for a project.&lt;/p&gt;
  &lt;/div&gt;
  &lt;figcaption&gt;One of the three lessons from that failed run. The other two made the same point on the Resources landing page and on the Projects link in the top bar.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The next run finished the task in 14 steps. Here are three of the five tasks through all three stages:&lt;/p&gt;

&lt;figure class=&quot;jeva-results&quot;&gt;
  &lt;table&gt;
    &lt;thead&gt;
      &lt;tr&gt;&lt;th&gt;Task&lt;/th&gt;&lt;th&gt;Without the atlas&lt;/th&gt;&lt;th&gt;With the atlas&lt;/th&gt;&lt;th&gt;After learning&lt;/th&gt;&lt;/tr&gt;
    &lt;/thead&gt;
    &lt;tbody&gt;
      &lt;tr&gt;
        &lt;td&gt;Park Sable Dome at its gate&lt;/td&gt;
        &lt;td&gt;&lt;span class=&quot;jeva-res is-fail&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M4 4l8 8M12 4l-8 8&quot;/&gt;&lt;/svg&gt;&lt;span class=&quot;jeva-w&quot;&gt;Failed&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
        &lt;td&gt;&lt;span class=&quot;jeva-res&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M3 8.5l3.2 3.2L13 5&quot;/&gt;&lt;/svg&gt;&lt;span class=&quot;jeva-w&quot;&gt;Done&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
        &lt;td&gt;&lt;span class=&quot;jeva-res&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M3 8.5l3.2 3.2L13 5&quot;/&gt;&lt;/svg&gt;&lt;span class=&quot;jeva-w&quot;&gt;Done&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Release Bellamy Ridge&apos;s estimate, as Tomasz and then as me&lt;/td&gt;
        &lt;td&gt;&lt;span class=&quot;jeva-res is-fail&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M4 4l8 8M12 4l-8 8&quot;/&gt;&lt;/svg&gt;&lt;span class=&quot;jeva-w&quot;&gt;Failed&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
        &lt;td&gt;&lt;span class=&quot;jeva-res&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M3 8.5l3.2 3.2L13 5&quot;/&gt;&lt;/svg&gt;&lt;span class=&quot;jeva-w&quot;&gt;Done&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
        &lt;td&gt;&lt;span class=&quot;jeva-res&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M3 8.5l3.2 3.2L13 5&quot;/&gt;&lt;/svg&gt;&lt;span class=&quot;jeva-w&quot;&gt;Done&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Create a resource estimate as Tomasz&lt;/td&gt;
        &lt;td&gt;&lt;span class=&quot;jeva-res is-fail&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M4 4l8 8M12 4l-8 8&quot;/&gt;&lt;/svg&gt;&lt;span class=&quot;jeva-w&quot;&gt;Failed&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
        &lt;td&gt;&lt;span class=&quot;jeva-res is-fail&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M4 4l8 8M12 4l-8 8&quot;/&gt;&lt;/svg&gt;&lt;span class=&quot;jeva-w&quot;&gt;Failed&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
        &lt;td&gt;&lt;span class=&quot;jeva-res&quot;&gt;&lt;svg viewBox=&quot;0 0 16 16&quot; aria-hidden=&quot;true&quot;&gt;&lt;path d=&quot;M3 8.5l3.2 3.2L13 5&quot;/&gt;&lt;/svg&gt;&lt;span class=&quot;jeva-w&quot;&gt;Done&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/tbody&gt;
  &lt;/table&gt;
  &lt;figcaption&gt;One run of each task at each stage. Done or failed is checked in ADIT&apos;s own data, not taken from Jev&apos;s word for it. It is a demonstration on five tasks, not a benchmark.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;The code, the atlas and the demo are at &lt;a href=&quot;https://github.com/alejandroerickson/jev-atlas&quot;&gt;github.com/alejandroerickson/jev-atlas&lt;/a&gt;.&lt;/p&gt;

&lt;script&gt;
(function () {
  var root = document.currentScript &amp;&amp; document.currentScript.closest(&apos;.jeva&apos;);
  if (!root) return;
  root.classList.add(&apos;jeva-js&apos;);

  // The shim animation: four phases, played once when it scrolls into view.
  var fig = root.querySelector(&apos;.jeva-anim&apos;);
  var replay = root.querySelector(&apos;.jeva-replay&apos;);
  var timers = [];
  function phase(n) { fig.setAttribute(&apos;data-phase&apos;, String(n)); }
  function play() {
    timers.forEach(clearTimeout);
    timers = [];
    fig.classList.add(&apos;is-playing&apos;);
    phase(1);
    fig.getBoundingClientRect();
    [[1600, 2], [5200, 3], [7300, 4]].forEach(function (t) {
      timers.push(setTimeout(function () { phase(t[1]); }, t[0]));
    });
    timers.push(setTimeout(function () { fig.classList.remove(&apos;is-playing&apos;); }, 9000));
  }
  replay.hidden = false;
  replay.addEventListener(&apos;click&apos;, play);
  var reduce = window.matchMedia &amp;&amp; window.matchMedia(&apos;(prefers-reduced-motion: reduce)&apos;).matches;
  if (!reduce &amp;&amp; &apos;IntersectionObserver&apos; in window) {
    var io = new IntersectionObserver(function (entries) {
      if (entries.some(function (e) { return e.isIntersecting; })) { io.disconnect(); play(); }
    }, { threshold: 0.5 });
    io.observe(fig);
  }

  // The step toggle: without or with the atlas.
  var step = root.querySelector(&apos;.jeva-step&apos;);
  var toggle = step.querySelector(&apos;.jeva-toggle&apos;);
  var buttons = toggle.querySelectorAll(&apos;button&apos;);
  var panels = step.querySelectorAll(&apos;.jeva-panel&apos;);
  function show(cond) {
    panels.forEach(function (p) { p.hidden = p.getAttribute(&apos;data-cond&apos;) !== cond; });
    buttons.forEach(function (b) { b.setAttribute(&apos;aria-pressed&apos;, String(b.getAttribute(&apos;data-show&apos;) === cond)); });
  }
  buttons.forEach(function (b) { b.addEventListener(&apos;click&apos;, function () { show(b.getAttribute(&apos;data-show&apos;)); }); });
  toggle.hidden = false;
  show(&apos;without&apos;);
})();
&lt;/script&gt;

&lt;/div&gt;
</description>
        <pubDate>Sun, 27 Sep 2026 06:41:00 +0000</pubDate>
        <link>https://alejandroerickson.com/2026/09/27/jev-atlas.html</link>
        <guid isPermaLink="true">https://alejandroerickson.com/2026/09/27/jev-atlas.html</guid>
        
        
      </item>
    
      <item>
        <title>ADIT: a mock enterprise app for testing AI agents</title>
        <description>&lt;style&gt;
  .adit-post.adit-embed iframe { display: block; width: 100%; height: 40rem; border: 1px solid var(--rule); border-radius: var(--radius); background: var(--surface); }
  .adit-post.adit-embed figcaption { margin-top: var(--space-3); }
  .adit-post.adit-opt { margin: var(--space-6) 0; padding: var(--space-5); border: 1px solid var(--rule); border-radius: var(--radius); }
  .adit-opt .adit-opt-controls { display: grid; grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr)); gap: var(--space-4) var(--space-5); }
  .adit-opt label { display: block; font-size: var(--text-small); color: var(--muted); }
  .adit-opt input[type=range] { display: block; width: 100%; margin: var(--space-2) 0 0; accent-color: var(--link); }
  .adit-opt output { display: block; margin-top: var(--space-1); font-family: var(--font-mono); font-size: 1rem; color: var(--text); font-variant-numeric: tabular-nums; }
  .adit-opt .stats { margin: var(--space-5) 0; }
  .adit-opt svg { display: block; width: 100%; height: auto; overflow: visible; font-size: var(--text-small); }
  .adit-opt circle { transition: fill-opacity 160ms ease-out; }
  .adit-opt .adit-opt-legend { display: flex; flex-wrap: wrap; gap: var(--space-1) var(--space-4); margin: var(--space-3) 0 0; padding: 0; list-style: none; font-size: var(--text-label); color: var(--muted); }
  .adit-opt .adit-opt-legend li { margin: 0; }
  .adit-opt .adit-opt-legend i { display: inline-block; width: 0.7em; height: 0.7em; margin-right: 0.35em; border-radius: 50%; vertical-align: baseline; }
  .adit-opt .adit-opt-sel { margin: var(--space-4) 0 0; font-size: var(--text-small); color: var(--muted); }
  .adit-opt .adit-opt-sel span { font-family: var(--font-mono); color: var(--text); }
&lt;/style&gt;

&lt;p&gt;I have worked on enterprise software for about 10 years, lately on AI innovation and new products, and I wanted to try some things with AI agents on a big, dense enterprise application. It had to be one I could publish and hand to anyone, so I made one up.&lt;/p&gt;

&lt;p&gt;ADIT is an exploration management system for a mining company called Kestrel Range Resources, sold by a vendor called Brannock Geosystems. None of them exist. It has 14 projects across 5 commodities (gold, lithium, potash, copper and nickel), 7 users with different jobs, 9 sections along the top and about 60 screens.&lt;/p&gt;

&lt;p&gt;It does not matter that it is about mining. If you have used the software at any large company you will recognize all of it: a home page with a list of things that need attention, records with tabs and a comments box where you can @-mention a colleague, approval requests that move from one person&apos;s inbox to the next with a due date on each step, notifications, an admin section full of settings, and an audit log of who did what. There is even a user manual from the vendor, 13 sections long, which opens in a new tab and explains what each page shows and how the common jobs are done.&lt;/p&gt;

&lt;p&gt;Try it below. The account menu at the top right switches between the 7 users (that stands in for signing in). Open Approvals, approve or return something, then switch to the person who raised it and look at their notifications. Nothing you do is saved anywhere except your own browser, and Admin has a button to reset the whole tenant.&lt;/p&gt;

&lt;figure class=&quot;figure figure--wide adit-post adit-embed&quot;&gt;
  &lt;iframe src=&quot;https://alejandroerickson.com/mockent/adit/&quot; title=&quot;ADIT, the mock exploration management system, running live&quot; loading=&quot;lazy&quot;&gt;&lt;/iframe&gt;
  &lt;figcaption&gt;ADIT, live. It is easier with more room: &lt;a href=&quot;https://alejandroerickson.com/mockent/adit/&quot;&gt;open it in its own tab&lt;/a&gt;.&lt;/figcaption&gt;
&lt;/figure&gt;

&lt;p&gt;All of the data is invented in the browser when the page loads, from a fixed random seed: 273 drillholes, 113 lab batches, about 19,700 samples, 44 approval requests, and the comments, notifications and audit trail that go with them. There is no server. Nothing has to be right, it only has to hold together when you click through it.&lt;/p&gt;



&lt;figure class=&quot;figure figure--wide&quot;&gt;
  &lt;img src=&quot;/images/adit/manual.png&quot; alt=&quot;The ADIT user manual, section 1 of 13, with a table of contents down the left and a description of the record chain from project to stage-gate decision&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;The vendor’s user manual. The support line is a &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;.example&lt;/code&gt; address.&lt;/figcaption&gt;
&lt;/figure&gt;


&lt;h2&gt;How I made it&lt;/h2&gt;

&lt;p&gt;An AI agent built ADIT from a single prompt, overnight. My requirements were as follows:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;A specialized application built for experts, dense with data and not self-explanatory, that a non-expert would find believable. Convincing a geologist was not the goal.&lt;/li&gt;
  &lt;li&gt;Multiple users with different roles, notifications, and places on each record to comment and enter information.&lt;/li&gt;
  &lt;li&gt;Workflows with approvals, and stage outcomes at the end of each stage: closed, or on to the next one.&lt;/li&gt;
  &lt;li&gt;The planning stages of a project, and the logistics of getting a team into the field and assigning work to it.&lt;/li&gt;
  &lt;li&gt;Domain entities for the types of exploration and the material found, across five different commodities.&lt;/li&gt;
  &lt;li&gt;Forecasts of how much there is and what it is worth, with analytics, dashboards, budgets and an optimization interface.&lt;/li&gt;
  &lt;li&gt;An admin panel with system settings, and user settings for each account.&lt;/li&gt;
  &lt;li&gt;A vendor&apos;s user manual that opens in a new tab, looks different from the application, and describes each page and how the important jobs are done.&lt;/li&gt;
  &lt;li&gt;The ARIA labels and DOM of a real application, no AI assistant, and nothing in the app about why it exists.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The vendor, the tenant, the projects, the record ids and the text of the manual were the agent&apos;s to invent.&lt;/p&gt;

&lt;p&gt;I built the design system with &lt;a href=&quot;https://impeccable.style&quot;&gt;impeccable&lt;/a&gt;, a set of skills and tools for agents doing front-end design. I prompted for the system and made the design choices, and impeccable was the tool that turned them into something coherent.&lt;/p&gt;

&lt;p&gt;The code is at &lt;a href=&quot;https://github.com/alejandroerickson/mockent&quot;&gt;github.com/alejandroerickson/mockent&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;The ADIT optimizer&lt;/h2&gt;

&lt;p&gt;Most of ADIT is records and workflows, but the optimizer page does a computation: it picks which of 14 candidate drill targets to fund next season. Here is a copy of it. Move the budget and the rig days and it tells you how many targets get funded. Filled dots are funded; hollow ones did not fit.&lt;/p&gt;

&lt;div class=&quot;adit-post adit-opt&quot;&gt;
  &lt;div class=&quot;adit-opt-controls&quot;&gt;
    &lt;div&gt;
      &lt;label for=&quot;adit-opt-budget&quot;&gt;Budget, USD&lt;/label&gt;
      &lt;input type=&quot;range&quot; id=&quot;adit-opt-budget&quot; min=&quot;1000000&quot; max=&quot;8000000&quot; step=&quot;100000&quot; value=&quot;4500000&quot;&gt;
      &lt;output for=&quot;adit-opt-budget&quot;&gt;&lt;/output&gt;
    &lt;/div&gt;
    &lt;div&gt;
      &lt;label for=&quot;adit-opt-days&quot;&gt;Rig days available&lt;/label&gt;
      &lt;input type=&quot;range&quot; id=&quot;adit-opt-days&quot; min=&quot;60&quot; max=&quot;480&quot; step=&quot;10&quot; value=&quot;240&quot;&gt;
      &lt;output for=&quot;adit-opt-days&quot;&gt;&lt;/output&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;ul class=&quot;stats&quot; aria-live=&quot;polite&quot;&gt;
    &lt;li&gt;&lt;strong data-out=&quot;ev&quot;&gt;&lt;/strong&gt;&lt;span&gt;expected value, USD&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong data-out=&quot;cost&quot;&gt;&lt;/strong&gt;&lt;span data-out=&quot;cost-sub&quot;&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong data-out=&quot;days&quot;&gt;&lt;/strong&gt;&lt;span data-out=&quot;days-sub&quot;&gt;&lt;/span&gt;&lt;/li&gt;
    &lt;li&gt;&lt;strong data-out=&quot;n&quot;&gt;&lt;/strong&gt;&lt;span&gt;targets funded&lt;/span&gt;&lt;/li&gt;
  &lt;/ul&gt;

  &lt;svg viewBox=&quot;0 0 640 300&quot; role=&quot;img&quot; aria-label=&quot;Scatter of each target&apos;s cost against its expected value; filled circles are the funded targets&quot;&gt;&lt;/svg&gt;
  &lt;ul class=&quot;adit-opt-legend&quot;&gt;
    &lt;li&gt;&lt;i style=&quot;background:var(--data-1)&quot;&gt;&lt;/i&gt;Gold&lt;/li&gt;
    &lt;li&gt;&lt;i style=&quot;background:var(--data-2)&quot;&gt;&lt;/i&gt;Lithium&lt;/li&gt;
    &lt;li&gt;&lt;i style=&quot;background:var(--data-3)&quot;&gt;&lt;/i&gt;Potash&lt;/li&gt;
    &lt;li&gt;&lt;i style=&quot;background:var(--data-4)&quot;&gt;&lt;/i&gt;Copper&lt;/li&gt;
    &lt;li&gt;&lt;i style=&quot;background:var(--data-5)&quot;&gt;&lt;/i&gt;Nickel&lt;/li&gt;
    &lt;li&gt;&lt;i style=&quot;border:1.5px solid var(--muted)&quot;&gt;&lt;/i&gt;not funded&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p class=&quot;adit-opt-sel&quot;&gt;Funded: &lt;span data-out=&quot;sel&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Neither this copy nor the page in ADIT is a real way to plan a drilling season, and the page in ADIT says so under its own numbers. It only has to look like it knows what it is doing.&lt;/p&gt;

&lt;script&gt;
(function () {
  var root = document.currentScript.previousElementSibling;
  while (root &amp;&amp; !root.classList.contains(&apos;adit-opt&apos;)) root = root.previousElementSibling;
  if (!root) return;

  // The 14 candidate targets in ADIT&apos;s demonstration tenant (adit/src/data/world.ts).
  // Columns: id, commodity slot, cost, rig days, P(success), value if successful.
  var T = [
    [&apos;T-01&apos;, 1, 720000, 54, 0.62, 4100000],
    [&apos;T-02&apos;, 1, 380000, 28, 0.35, 5200000],
    [&apos;T-03&apos;, 2, 360000, 24, 0.48, 2900000],
    [&apos;T-04&apos;, 2, 290000, 19, 0.31, 2400000],
    [&apos;T-05&apos;, 2, 640000, 40, 0.44, 6800000],
    [&apos;T-06&apos;, 2, 780000, 48, 0.81, 3600000],
    [&apos;T-07&apos;, 3, 1400000, 38, 0.55, 9500000],
    [&apos;T-08&apos;, 4, 270000, 16, 0.22, 8100000],
    [&apos;T-09&apos;, 4, 270000, 16, 0.18, 8100000],
    [&apos;T-10&apos;, 5, 460000, 30, 0.29, 7400000],
    [&apos;T-11&apos;, 5, 340000, 22, 0.51, 2800000],
    [&apos;T-12&apos;, 4, 1250000, 70, 0.86, 5900000],
    [&apos;T-13&apos;, 1, 310000, 20, 0.46, 2100000],
    [&apos;T-14&apos;, 5, 410000, 26, 0.15, 6200000]
  ].map(function (r) { return { id: r[0], c: r[1], cost: r[2], days: r[3], ev: r[4] * r[5] }; });

  // A cut-down copy of adit/src/optimiser.ts: greedy by expected value per dollar, then swaps.
  function optimise(budget, days) {
    var sel = {}, cost = 0, used = 0;
    T.slice().sort(function (a, b) { return b.ev / b.cost - a.ev / a.cost; }).forEach(function (t) {
      if (cost + t.cost &lt;= budget &amp;&amp; used + t.days &lt;= days) { sel[t.id] = true; cost += t.cost; used += t.days; }
    });
    for (var improved = true; improved;) {
      improved = false;
      outer: for (var i = 0; i &lt; T.length; i++) {
        var o = T[i]; if (!sel[o.id]) continue;
        for (var j = 0; j &lt; T.length; j++) {
          var n = T[j]; if (sel[n.id]) continue;
          var c2 = cost - o.cost + n.cost, d2 = used - o.days + n.days;
          if (c2 &lt;= budget &amp;&amp; d2 &lt;= days &amp;&amp; n.ev &gt; o.ev) {
            delete sel[o.id]; sel[n.id] = true; cost = c2; used = d2; improved = true; break outer;
          }
        }
      }
    }
    return { sel: sel, cost: cost, used: used };
  }

  var budget = root.querySelector(&apos;#adit-opt-budget&apos;), days = root.querySelector(&apos;#adit-opt-days&apos;);
  var outs = root.querySelectorAll(&apos;output&apos;), svg = root.querySelector(&apos;svg&apos;);
  var out = function (k) { return root.querySelector(&apos;[data-out=&quot;&apos; + k + &apos;&quot;]&apos;); };
  var money = function (v) { return v &gt;= 1e6 ? (v / 1e6).toFixed(2) + &apos; M&apos; : Math.round(v / 1e3) + &apos; k&apos;; };
  var NS = &apos;http://www.w3.org/2000/svg&apos;;
  function el(name, attrs, text) {
    var e = document.createElementNS(NS, name);
    for (var k in attrs) e.setAttribute(k, attrs[k]);
    if (text != null) e.textContent = text;
    return e;
  }

  var last;
  function draw(res) {
    last = res;
    svg.textContent = &apos;&apos;;
    // Draw in real pixels, so the axis text stays legible on a phone.
    var W = Math.max(280, Math.round(svg.getBoundingClientRect().width) || 640);
    svg.setAttribute(&apos;viewBox&apos;, &apos;0 0 &apos; + W + &apos; 300&apos;);
    var L = 52, R = W - 12, Tp = 20, B = 256, xMax = 1500000, yMax = 6000000;
    var x = function (v) { return L + (v / xMax) * (R - L); };
    var y = function (v) { return B - (v / yMax) * (B - Tp); };
    [0, 2e6, 4e6, 6e6].forEach(function (v) {
      svg.appendChild(el(&apos;line&apos;, { x1: L, x2: R, y1: y(v), y2: y(v), stroke: &apos;var(--rule)&apos; }));
      svg.appendChild(el(&apos;text&apos;, { x: L - 8, y: y(v) + 4, &apos;text-anchor&apos;: &apos;end&apos;, fill: &apos;var(--muted)&apos; }, v ? v / 1e6 + &apos; M&apos; : &apos;0&apos;));
    });
    [0, 500000, 1000000, 1500000].forEach(function (v) {
      svg.appendChild(el(&apos;text&apos;, { x: x(v), y: B + 18, &apos;text-anchor&apos;: &apos;middle&apos;, fill: &apos;var(--muted)&apos; }, v ? money(v) : &apos;0&apos;));
    });
    svg.appendChild(el(&apos;text&apos;, { x: R, y: B + 38, &apos;text-anchor&apos;: &apos;end&apos;, fill: &apos;var(--muted)&apos; }, &apos;cost, USD&apos;));
    svg.appendChild(el(&apos;text&apos;, { x: L, y: Tp - 8, fill: &apos;var(--muted)&apos; }, &apos;expected value, USD&apos;));
    T.forEach(function (t) {
      var on = !!res.sel[t.id], colour = &apos;var(--data-&apos; + t.c + &apos;)&apos;;
      var g = el(&apos;g&apos;, {});
      g.appendChild(el(&apos;title&apos;, {}, t.id + &apos;: cost &apos; + money(t.cost) + &apos;, &apos; + t.days + &apos; rig days, expected value &apos; + money(t.ev) + (on ? &apos; (funded)&apos; : &apos;&apos;)));
      g.appendChild(el(&apos;circle&apos;, { cx: x(t.cost), cy: y(t.ev), r: 4 + t.days / 12, fill: colour, &apos;fill-opacity&apos;: on ? 1 : 0, stroke: colour, &apos;stroke-width&apos;: 1.75 }));
      svg.appendChild(g);
    });
  }

  function update() {
    var b = +budget.value, d = +days.value, res = optimise(b, d);
    var chosen = T.filter(function (t) { return res.sel[t.id]; });
    outs[0].textContent = money(b);
    outs[1].textContent = d + &apos; days&apos;;
    out(&apos;ev&apos;).textContent = money(chosen.reduce(function (s, t) { return s + t.ev; }, 0));
    out(&apos;cost&apos;).textContent = money(res.cost);
    out(&apos;cost-sub&apos;).textContent = &apos;cost, &apos; + Math.round(100 * res.cost / b) + &apos;% of budget&apos;;
    out(&apos;days&apos;).textContent = res.used;
    out(&apos;days-sub&apos;).textContent = &apos;of &apos; + d + &apos; rig days&apos;;
    out(&apos;n&apos;).textContent = chosen.length + &apos; of &apos; + T.length;
    out(&apos;sel&apos;).textContent = chosen.map(function (t) { return t.id; }).join(&apos;, &apos;) || &apos;none&apos;;
    draw(res);
  }

  budget.addEventListener(&apos;input&apos;, update);
  days.addEventListener(&apos;input&apos;, update);
  if (window.ResizeObserver) new ResizeObserver(function () { if (last) draw(last); }).observe(svg);
  update();
})();
&lt;/script&gt;
</description>
        <pubDate>Fri, 25 Sep 2026 19:33:00 +0000</pubDate>
        <link>https://alejandroerickson.com/2026/09/25/adit-a-mock-enterprise-app.html</link>
        <guid isPermaLink="true">https://alejandroerickson.com/2026/09/25/adit-a-mock-enterprise-app.html</guid>
        
        
      </item>
    
      <item>
        <title>Enter the AI</title>
        <description>&lt;p&gt;I wrote every one of the 99 posts before this one by hand. The last of them went up in February 2022, about nine months before ChatGPT came out. Three of them mark periods of my life, so here they are before I get to the point.&lt;/p&gt;

&lt;p&gt;During my PhD in Victoria I got hooked on Hexastix, sculptures of interlocked sticks, and in 2011 I wrote up &lt;a href=&quot;/2011/09/27/090-how-to-make-hexastix-detailed-photo-instructions.html&quot;&gt;how to make one&lt;/a&gt;.&lt;/p&gt;



&lt;figure class=&quot;figure&quot;&gt;
  &lt;img src=&quot;/images/images/stories/hexastix/instructions/image47.jpg&quot; alt=&quot;A Hexastix of orange, red, purple and blue sticks hanging in sunlight, with its hexagonal shadow on a white wall&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;A Hexastix and its shadow, 2011.&lt;/figcaption&gt;
&lt;/figure&gt;


&lt;p&gt;As a postdoc in Durham I taught myself to paint so that I could paint the Petersen graph, and it took about 40 practice paintings to get to the &lt;a href=&quot;/2014/03/14/019-five-2-colourings-of-the-petersen-graph.html&quot;&gt;final five&lt;/a&gt;.&lt;/p&gt;



&lt;figure class=&quot;figure&quot;&gt;
  &lt;img src=&quot;/images/im/experiments.jpg&quot; alt=&quot;A grid of eleven practice watercolours of the Petersen graph in blues, greens, yellows and oranges&quot; loading=&quot;lazy&quot;&gt;
  &lt;figcaption&gt;Practice paintings of the Petersen graph, 2014.&lt;/figcaption&gt;
&lt;/figure&gt;


&lt;p&gt;In 2016, while preparing for job interviews, I solved a practice question in 10 minutes and then spent two days &lt;a href=&quot;/2016/08/02/benchmarking-int-sorting-algorithms.html&quot;&gt;implementing and benchmarking 9 sorting algorithms&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Today an AI would do most of those two days of work. In coding and in writing, execution isn&apos;t the bottleneck any more. The hard part is deciding what to build. &lt;strong&gt;So what makes a blog post interesting to me now is the idea behind it, not the effort that went into writing it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I expect the posts here to lean that way: an idea, built and written up with AI&apos;s help.&lt;/p&gt;
</description>
        <pubDate>Fri, 25 Sep 2026 16:20:00 +0000</pubDate>
        <link>https://alejandroerickson.com/2026/09/25/enter-the-ai.html</link>
        <guid isPermaLink="true">https://alejandroerickson.com/2026/09/25/enter-the-ai.html</guid>
        
        
      </item>
    
      <item>
        <title>Decommissioning Geoburst.ca</title>
        <description>&lt;p&gt;From around 2010 to 2013 I ran a small volunteer organization called Geoburst. Geoburst.ca continued to function for a long time afterward and now it’s time to take it down. Find Geoburst’s “About” page below.&lt;/p&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/geoburst-banner.png&quot; alt=&quot;Geoburst.ca&apos;s Banner&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;Geoburst.ca&apos;s Banner&lt;/p&gt;
    
&lt;/div&gt;

&lt;h1 id=&quot;about-geoburst&quot;&gt;About Geoburst&lt;/h1&gt;

&lt;h2 id=&quot;the-problem-with-mathematics&quot;&gt;The problem with mathematics&lt;/h2&gt;

&lt;p&gt;Dozens of books have been written about math education, and not in error, but GeoBurst’s philosophy can be summarized in a single sentence. We must teach that mathematics has intrinsic value, for being beautiful, fun, surprising, and expansive.&lt;/p&gt;

&lt;p&gt;When kids practice their multiplication tables, we think of this as a pianist practicing scales. When the pianist is ready, however, he or she plays beautiful music. That is why we help kids take a break from their multiplication tables, to remind them of what beautiful mathematics they are preparing for.&lt;/p&gt;

&lt;h2 id=&quot;geobursts-mission&quot;&gt;GeoBurst’s Mission&lt;/h2&gt;

&lt;p&gt;GeoBurst mission is to Create Zest for Mathematics. By sharing our love for this subject, we hope to spread an enthusiasm for mathematics that will shine a positive light on a challenging subject for all of us.&lt;/p&gt;

&lt;p&gt;By seeding positive early experiences with mathematics, GeoBurst’s activities can soothe the tension that some students feel about mathematics, encourage kids to pursue science and engineering, and ultimately increase the amount of beautiful mathematics that Canadians do.&lt;/p&gt;

&lt;h2 id=&quot;geobursts-vision&quot;&gt;GeoBurst’s Vision&lt;/h2&gt;

&lt;p&gt;We want every school in British Columbia to be equipped with a clearly labelled treasure chest of fun mathematical activities, and every student to experience at least two special presentations on mathematics by the time they finish grade 7. In the interest of creating equal opportunities, we are donor funded, and provide our services free of charge whenever possible.&lt;/p&gt;

&lt;h2 id=&quot;geoburst&quot;&gt;GeoBurst&lt;/h2&gt;

&lt;h3 id=&quot;math-catcher&quot;&gt;Math Catcher&lt;/h3&gt;

&lt;p&gt;Mathematics through aboriginal story telling&lt;/p&gt;

&lt;p&gt;We work closely with Math Catcher through consulting and the integration of our interactive shows into their program. This partnership benefits our programs mutually, and has helped GeoBurst develop its mission and activities by providing a raison-d’être and an audience at an early stage in our development.&lt;/p&gt;

&lt;p&gt;GeoBurst is proud to work closely with award winning math professor, Dr. Veselin Jungic, and First Nations role models to bring a much needed enhancement to mathematics education for remotely located and urban Aboriginal students. GeoBurst is an integral part of their school visiting program, and Math Catcher’s influence and contributions continue to be indispensable to the formation of our values, and the operation of our program.&lt;/p&gt;

</description>
        <pubDate>Thu, 17 Feb 2022 00:00:00 +0000</pubDate>
        <link>https://alejandroerickson.com/2022/02/17/decommissioning-geoburst.html</link>
        <guid isPermaLink="true">https://alejandroerickson.com/2022/02/17/decommissioning-geoburst.html</guid>
        
        
      </item>
    
      <item>
        <title>Newport 30 mkii Mast Base Organizer Plate</title>
        <description>&lt;p&gt;My main sheet and vang used to connect to a simple eye near the base of the mast until one day the threads gave way and it popped out.&lt;/p&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/broken-main-sheet-vang-eye.jpg&quot; alt=&quot;Broken Main Sheet and Vang Eye&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;Broken Main Sheet and Vang Eye&lt;/p&gt;
    
&lt;/div&gt;

&lt;p&gt;Whether it was my fault or not I don’t know, since I didn’t see it happen, but
now that I have to fix it I’d like to make it and the halyard organizer more
robust, by replacing them both with a mast-base organizer plate.  I envision something like the plate pictured below, but without the hinge.&lt;/p&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/mast-hinge2.jpg&quot; alt=&quot;Halyard organizer plate (hinged)&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;Halyard organizer plate (hinged)&lt;/p&gt;
    
&lt;/div&gt;

&lt;p&gt;From the picture of my own mast base, it looks like I already have some sort of aluminum casting at the foot of my mast, so if I unstep the mast and successfully remove the casting, I should be able to slip a plate underneath it… Let’s hope I can get it off!&lt;/p&gt;

&lt;p&gt;I’ll update this post as the project moves forward.&lt;/p&gt;
</description>
        <pubDate>Tue, 21 Aug 2018 05:13:49 +0000</pubDate>
        <link>https://alejandroerickson.com/2018/08/21/newport-30-mkii-mast-base-organizer-plate.html</link>
        <guid isPermaLink="true">https://alejandroerickson.com/2018/08/21/newport-30-mkii-mast-base-organizer-plate.html</guid>
        
        
      </item>
    
      <item>
        <title>Polishing Fuel with the Water Separator</title>
        <description>&lt;p&gt;There is a place in English Bay, near Vancouver, called Point Atkinson, which is notorious for causing engine troubles. The guy from C-Tow joked that it was something of a local Bermuda triangle. He said that to me after towing me to my slip at Lynnwood for around $400 CAD and added, “One time at Point Atkinson I changed my own fuel filter 3 times.”&lt;/p&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/the-saltire-false-creek.jpeg&quot; alt=&quot;The Saltire in False Creek.&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;The Saltire in False Creek.&lt;/p&gt;
    
&lt;/div&gt;

&lt;p&gt;My engine had failed there too, shortly before getting towed, while I was sailing single-handedly. After thinking about what the tow-dude said I read up on cleaning and maintaining fuel and decided to not only change the fuel filters, but to also polish the fuel using the existing water separator.&lt;/p&gt;

&lt;p&gt;I disconnected the Racor 215 series water separator from The Saltire’s fuel lines and screwed in 5/16th hose diameter connectors. I connected the intake to a fuel-line hose and a matching metal tube made of automotive brake-line for vacuuming inside the tank. I connected the exit to a &lt;a href=&quot;https://www.amazon.ca/Mr-Gasket-12D-Electric-Diesel/dp/B001QVTI5U&quot;&gt;Mr Gasket 12V diesel fuel pump&lt;/a&gt;, purchased for $60 CAD at an automotive parts supplier; I have supplied a link to it but any such pump will do the job. Part of the time I had a prefilter before the water separator but eventually it clogged up and I removed it.&lt;/p&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/racor-fuel-filter-normal-setup.jpg&quot; alt=&quot;Existing primary filter setup.&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;Existing primary filter setup.&lt;/p&gt;
    
&lt;/div&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/fuel-gauge-float.jpg&quot; alt=&quot;Fuel gauge float port.&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;Fuel gauge float port.&lt;/p&gt;
    
&lt;/div&gt;

&lt;p&gt;Initially I tried to polish using the existing Racor R15T 10 micron filter, but it was so clogged with gunk that no fuel would pump through. That pretty much explains the issue I had on the water, and I will be carrying a spare Racor from now on!&lt;/p&gt;

&lt;p&gt;Pumping about 110L of fuel out into jerry cans and back into the tank took about 4 hours. The pump is rated to move it faster than that, but various things slowed me down.&lt;/p&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/fuel-filter-rusty-top.jpg&quot; alt=&quot;Rusty fuel filter.&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;Rusty fuel filter.&lt;/p&gt;
    
&lt;/div&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/fuel-filter-dirty.jpg&quot; alt=&quot;Dirty fuel filter.&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;Dirty fuel filter.&lt;/p&gt;
    
&lt;/div&gt;

&lt;p&gt;I separated about 600mL (over a pint!) of water from the fuel, and the tank looked pretty clean on the inside afterwards.&lt;/p&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/water-from-fuel.jpg&quot; alt=&quot;600ml water from fuel.&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;600ml water from fuel.&lt;/p&gt;
    
&lt;/div&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
  &lt;iframe class=&quot;embed-frame&quot; src=&quot;https://www.youtube.com/embed/2CVjfYfNWzU&quot; width=&quot;640&quot; height=&quot;360&quot; style=&quot;max-width: 640px; aspect-ratio: 640 / 360;&quot; frameborder=&quot;0&quot; allowfullscreen=&quot;&quot; loading=&quot;lazy&quot; title=&quot;A quick tour of my fuel polishing system&quot;&gt;&lt;/iframe&gt;
    
        &lt;p class=&quot;image-caption&quot;&gt;A quick tour of my fuel polishing system&lt;/p&gt;
    
&lt;/div&gt;

</description>
        <pubDate>Tue, 10 Apr 2018 05:17:47 +0000</pubDate>
        <link>https://alejandroerickson.com/2018/04/10/polishing-fuel-with-the-water-separator.html</link>
        <guid isPermaLink="true">https://alejandroerickson.com/2018/04/10/polishing-fuel-with-the-water-separator.html</guid>
        
        
      </item>
    
      <item>
        <title>A Google Spreadsheet for Planning and Balancing an Investment Portfolio</title>
        <description>&lt;p&gt;This year I set out to learn about investing and trading on the stock market. I
signed up for a
&lt;a href=&quot;http://www.questrade.com/api/free-practice-account&quot;&gt;practice account on Questrade&lt;/a&gt;
which comes with a healthy supply of fake cash and started making pretend
trades. Pretty soon I realized that I needed a written comprehensive plan, complete with
a strategy and specific shares that I want in my portfolio. &lt;strong&gt;Google spreadsheets to the rescue!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I found a spreadsheet that serves as a starting point on
&lt;a href=&quot;https://www.doughroller.net/investing/an-awesome-and-free-investment-tracking-spreadsheet/&quot;&gt;Dough Roller&lt;/a&gt;
and added support for multiple accounts and account types.&lt;/p&gt;

&lt;h3 id=&quot;here-is-a-direct-link-to-the-spreadsheet&quot;&gt;&lt;a href=&quot;https://docs.google.com/spreadsheets/d/1c6L3ajeqc4DZz_78sgontmHlIdfHtFsrRsCGWkBRcoc/edit?usp=sharing&quot;&gt;Here is a direct link to the spreadsheet&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;The spreadsheet provides a summary of your holdings by account type and asset
type, where you can also view the difference between your portfolio allocation
and your target allocation.&lt;/p&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/portfolio-planning-balances.png&quot; alt=&quot;Account Balances by Asset Type.&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;Account Balances by Asset Type.&lt;/p&gt;
    
&lt;/div&gt;

&lt;p&gt;Below the account summary there is also a visual representation of your target and actual allocations.&lt;/p&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/portfolio-planning-target-and-allocation.png&quot; alt=&quot;Porfolio Target and Actual Allocation.&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;Porfolio Target and Actual Allocation.&lt;/p&gt;
    
&lt;/div&gt;

&lt;p&gt;Actual holdings are specified on the holdings page by giving a ticker symbol and number of shares owned.&lt;/p&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/portfolio-planning-holdings.png&quot; alt=&quot;Portfolio Share Holdings.&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;Portfolio Share Holdings.&lt;/p&gt;
    
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Anything and everything in my blog post could be factually incorrect. Please
verify any information you get here with other, more reliable sources and check
my math.&lt;/strong&gt; If you see a problem please let me know in the comments.&lt;/p&gt;

&lt;p&gt;Enjoy!&lt;/p&gt;
</description>
        <pubDate>Wed, 03 Jan 2018 06:08:39 +0000</pubDate>
        <link>https://alejandroerickson.com/2018/01/03/a-google-spreadsheet-for-planning-and-balancing-an-investment-portfolio.html</link>
        <guid isPermaLink="true">https://alejandroerickson.com/2018/01/03/a-google-spreadsheet-for-planning-and-balancing-an-investment-portfolio.html</guid>
        
        
      </item>
    
      <item>
        <title>What I learnt about Canada Registered Education Savings Plans</title>
        <description>&lt;p&gt;Canada offers a registered account to incentivise people to invest in their childrens’ education. It’s a bit complicated and most blogs and news articles I found only offer this very basic advice: “take advantage of the free money”. It’s not that bloody simple though.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anything and everything in my blog post could be factually incorrect. Please verify any information you get here with other, more reliable sources.&lt;/strong&gt; If you see a problem please let me know in the comments.&lt;/p&gt;

&lt;p&gt;At a basic level the RESP works as follows: You incrementally add after-tax money to an account, to a maximum of $50,000.00, and the Government matches your yearly contributions with 20% each year, to a maximum of $7,200.00. You invest this money aggressively early on, and less aggressively later, while it is sheltered from taxes.  When the beneficiary, usually your child, attends a post-secondary they can receive money from the &lt;em&gt;gains&lt;/em&gt; made by the investment, as well as from the &lt;em&gt;grant&lt;/em&gt; itself, and pay tax on the money as if it were the beneficiary’s income.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://www.canada.ca/en/revenue-agency/services/tax/individuals/topics/registered-education-savings-plans-resps.html&quot;&gt;The details, provided by the Canada Revenue Agency&lt;/a&gt;, get complicated though, which makes it hard to answer a number of questions without breaking out the spreadsheets.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;How big will the investment be, after tax, if the beneficiary does not use the money?&lt;/li&gt;
  &lt;li&gt;If you have $50,000 when you open the account, should you dump it all into the RESP, or take advantage of the grant and make several payments over several years?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These questions pertain to how the money is paid out, so let me define those
ways. An
&lt;em&gt;&lt;a href=&quot;https://www.canada.ca/en/revenue-agency/services/tax/individuals/topics/registered-education-savings-plans-resps/payments-resp/educational-assistance-payments-eaps.html&quot;&gt;EAP&lt;/a&gt;&lt;/em&gt;
is a payment from the gains on the whole investment (grants and gains) made to
the beneficiary who is enrolled in a &lt;em&gt;qualifying educational program&lt;/em&gt;. 
&lt;strong&gt;EAPs are taxed as the beneficiary’s income&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;An
&lt;em&gt;&lt;a href=&quot;https://www.canada.ca/en/revenue-agency/services/tax/individuals/topics/registered-education-savings-plans-resps/payments-resp/accumulated-income-payments-aips.html&quot;&gt;AIP&lt;/a&gt;&lt;/em&gt;
is a payment from the gains &lt;em&gt;on the contributions&lt;/em&gt; to the subscribers (who
originally made the contributions). Grant money cannot be paid to the
subscribers, and it is lost if the beneficiary does not use it. The original
contributions were made by subscribers with after-tax money, so they are paid
out without additional taxation. &lt;strong&gt;AIPs are taxed as the subscriber’s income
plus 20%&lt;/strong&gt; (12% in Quebec).&lt;/p&gt;

&lt;p&gt;Obviously there could be a significant difference in taxation between EAPs and
AIPs, so you need to consider the chance that AIPs will be paid out instead of
EAPs, and how much that will cost you. An additional, hidden cost, is that in a
normal taxable account, capital gains and dividends are taxed at a lower rate
than regular income. Let me illustrate this with a simplified example.&lt;/p&gt;

&lt;p&gt;Let’s say you invest $10,000.00 for 10 years and it grows to $15,000.00. You
sell the investment in year 10 and declare $5000.00 in capital gains. Suppose further that
your combined federal and provincial income tax marginal rate is 32% and your
capital gains are taxed at 16%. Your beneficiary’s income tax marginal rate is 21%.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;If the $5,000.00 gains are paid as EAPs, the beneficiary pays $1,050.00 in tax.&lt;/li&gt;
  &lt;li&gt;If the $5,000.00 gains are paid as AIPs, the subscriber pays $2,600.00 in tax.&lt;/li&gt;
  &lt;li&gt;If the $5,000.00 gains are paid as capital gains, the account holder pays $800.00.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The 20% penalty against AIPs is huge, of course, but the difference between
investing in a taxable account and getting EAPs is more subtle. Many investments
pay dividends, which are taxed a bit more heavily than the capital gains
mentioned in (3), plus the RESP account in (1) may have accumulated some
additional grant money. Let’s consider that situation. Suppose the RESP also
earned the full 20% grant on the $10,000.00 in contributions, and that the
investment included some dividends that were taxed at 25%. Again, we are simplifying things.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;There are $5,000.00 gains and $2,000.00 in grants to be paid as EAPs. &lt;strong&gt;The beneficiary receives $5,530.00&lt;/strong&gt; and pays $1,470.00 in tax.&lt;/li&gt;
  &lt;li&gt;If the $5,000.00 gains are paid as AIPs, &lt;strong&gt;the subscriber receives $2,400.00&lt;/strong&gt; and pays $2,600.00 in tax.&lt;/li&gt;
  &lt;li&gt;If the $4,000.00 gains are paid as capital gains and $1,000.00 are paid as dividends, &lt;strong&gt;the account holder receives $4,120.00&lt;/strong&gt; and pays $880.00 in tax.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As expected, the AIP payments remain the same, but the EAPs now yield a 34%
improvement on the gains in a normal taxable account. Of course, this is still a
bit too simple. Firstly, the $10,000 cannot be contributed to the RESP all at
once if the $2,000.00 in grants are to be obtained. That means that for some of
the time, that original $10,000.00 sits in a taxable account. Secondly, only up
to $36,000.00 of the RESP benefits from a 20% grant, because of the $7,200.00
limit on the total grant, so we can’t apply the same logic to a $50,000.00 RESP
account.&lt;/p&gt;

&lt;h3 id=&quot;well-need-a-spreadsheet-to-finish-this&quot;&gt;We’ll need a &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1FItrYVojJt-z-MV1MikXilF5lS-Ij6ELvpcshyUX33k/edit?usp=sharing&quot;&gt;spreadsheet&lt;/a&gt; to finish this&lt;/h3&gt;

&lt;p&gt;We are considering four ways of investing $50,000.00.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Contribute the $50,000.00 to the RESP and get a $500.00 grant.&lt;/li&gt;
  &lt;li&gt;Split the $50,000.00 over the RESP and a taxable account, and gradually move the money to the RESP to maximize the $7,200.00 grant.&lt;/li&gt;
  &lt;li&gt;Put the $50,000.00 in a taxable account.&lt;/li&gt;
  &lt;li&gt;Maximize the grant, but keep the remaining money in the taxable account.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And we are considering three ways the investment growth and grants can be taxed.&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;Grants and investment growth are paid out as EAPs, taxed as the beneficiary’s income.&lt;/li&gt;
  &lt;li&gt;Grants are lost, but investment growth is paid out as AIPs (&lt;strong&gt;after the beneficiary turns 21&lt;/strong&gt;), taxed as the subscriber’s income.&lt;/li&gt;
  &lt;li&gt;There are no grants, and the investments can be paid out any time, taxed as investment growth (capital gains, dividends, interest, etc).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We don’t know in advance whether we’ll have EAPs and not AIPs, so we factor the
likelihood into our assumptions. We need to make a bunch of assumptions, in fact
so let’s make them.&lt;/p&gt;

&lt;p&gt;Assumptions:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;6% growth (mostly stocks) for 10 years, then tapering off to 3% (mostly bonds) for the final years.&lt;/li&gt;
  &lt;li&gt;The money is tallied when the child is 21, the earliest year AIPs can be paid. Realistically the EAPs will be paid earlier.&lt;/li&gt;
  &lt;li&gt;The subscriber’s family income is over 90k (if not, the grant gets paid a bit more aggressively).&lt;/li&gt;
  &lt;li&gt;Subscriber marginal rate is 32%.&lt;/li&gt;
  &lt;li&gt;Beneficiary marginal rate is 21%.&lt;/li&gt;
  &lt;li&gt;Avg investment tax is 20%.&lt;/li&gt;
  &lt;li&gt;Likelihood that EAPs are NOT needed is 20% (child gets scholarships, dies, drops out of school, whatever).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first eight bars plot the investment proceeds that would be paid out as AIPs,
 or as EAPs combined with whatever non RESP money exists in each investment
 method, after tax. The last four bars plot the expected value of the
 investments based on our assumptions above. The assumptions can be changed in
 the spreadsheet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://docs.google.com/spreadsheets/d/1FItrYVojJt-z-MV1MikXilF5lS-Ij6ELvpcshyUX33k/edit?usp=sharing&quot;&gt;Play around with the spreadsheet here.&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/resp.png&quot; alt=&quot;RESP Returns by Investment Method.&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;RESP Returns by Investment Method.&lt;/p&gt;
    
&lt;/div&gt;

&lt;h2 id=&quot;and-the-winner-is-maximize-the-grant-and-keep-the-rest-of-your-money-out-of-the-resp&quot;&gt;And the winner is… maximize the grant and keep the rest of your money out of the RESP!&lt;/h2&gt;

&lt;p&gt;Remarks: The definition of qualifying educational program is fairly broad and
inclusive, so if the beneficiary is alive, half-serious about any sort of
educational program and doesn’t have a scholarship, they will probably use the
grant. Note also that some of the provinces offer an additional grant. For
example BC offers another $1,200.00 or so when the Child turns 6.&lt;/p&gt;

&lt;p&gt;If you find any mistakes or oversights in my calculations or spreadsheet, please let me know in the comments!&lt;/p&gt;

&lt;p&gt;Enjoy (taxes).&lt;/p&gt;

</description>
        <pubDate>Sat, 23 Dec 2017 00:00:00 +0000</pubDate>
        <link>https://alejandroerickson.com/2017/12/23/what-i-learnt-about-canada-registered-education-savings-plans.html</link>
        <guid isPermaLink="true">https://alejandroerickson.com/2017/12/23/what-i-learnt-about-canada-registered-education-savings-plans.html</guid>
        
        
      </item>
    
      <item>
        <title>Property Investment Comparison Spreadsheet</title>
        <description>&lt;p&gt;This modestly elaborate Property Investment Comparison Spreadsheet calculates
cash flows, investment returns, equity, and other financial effects of an
investment property. I am not an expert in financial math and I do not guarantee
any sanity in the calculations.&lt;/p&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/property-investment-spreadsheet.png&quot; alt=&quot;Property Investment Comparison Spreadsheet&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;Property Investment Comparison Spreadsheet.&lt;/p&gt;
    
&lt;/div&gt;

&lt;p&gt;Get the latest version here: &lt;a href=&quot;https://docs.google.com/spreadsheets/d/1SZNKkJD_lWCVqDc-BBjANKnGmdWDZRRoTFUZLy3yzrc/edit?usp=sharing&quot;&gt;Property Investment Comparison Spreadsheet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Please! Comment below to tell me how this has been useful to you, and give me
your feedback. Happy investing :)&lt;/strong&gt;&lt;/p&gt;
</description>
        <pubDate>Fri, 24 Nov 2017 01:54:02 +0000</pubDate>
        <link>https://alejandroerickson.com/2017/11/24/property-investment-comparison-spreadsheet.html</link>
        <guid isPermaLink="true">https://alejandroerickson.com/2017/11/24/property-investment-comparison-spreadsheet.html</guid>
        
        
      </item>
    
      <item>
        <title>Newport 30-2 Boom End Cap and Gooseneck Parts</title>
        <description>&lt;h2 id=&quot;update-march-24-2018&quot;&gt;Update March 24, 2018&lt;/h2&gt;

&lt;p&gt;I decided to bite the bullet and get the gooseneck professionally redone by
&lt;a href=&quot;http://www.pro-tech.bc.ca/&quot;&gt;Pro-tech Yacht Services&lt;/a&gt;. I inspected the work
today and I think it looks really solid; see below for yourself. Pro-tech, like
many is a custom rigging shop that does both big and small projects. Their work
is in demand, so it took nearly 2 months for them to begin work on it, but that
seems to be typical for the “top shops” like this one.&lt;/p&gt;

&lt;p&gt;Hopefully I’ll be testing it all out on Easter weekend!&lt;/p&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/pro-tech-gooseneck.jpg&quot; alt=&quot;Gooseneck Slider Height&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;Gooseneck slider height 4 1/2in.&lt;/p&gt;
    
&lt;/div&gt;

&lt;h2 id=&quot;original-post&quot;&gt;Original Post&lt;/h2&gt;

&lt;p&gt;I am replacing a few parts around the gooseneck of my Newport 30 Mark 2 (a.k.a.
N30ii, Newport 30 mkii, Newport 30-2, and the Gary Mull design) and will be
logging information about that here. My boat has fairly good maintenance records
and as far as I know all this stuff is original to the Newport 30-2.&lt;/p&gt;

&lt;p&gt;The main motivation is that the gooseneck slider is bent, and may be cracked,
but it’s hard to replace one part without either spending a lot of effort and/or
money, or replacing the parts around it too. I want to avoid having too many
patchwork upgrades, so I’m also going to replace the toggle, and maybe the boom
end cap along with it.&lt;/p&gt;

&lt;p&gt;Half the battle is identifying what I have, and so, in hopes of helping other
Newport 30-2 owners, I have documented my measurements of the gooseneck assembly
here.&lt;/p&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/20171023-213520-20171023_213520.jpg&quot; alt=&quot;Gooseneck Slider Height&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;Gooseneck slider height 4 1/2in.&lt;/p&gt;
    
&lt;/div&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/20171023-213512-20171023_213512.jpg&quot; alt=&quot;Gooseneck Slider Depth&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;Gooseneck Slider Depth approx 2in.&lt;/p&gt;
    
&lt;/div&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/20171023-213530-20171023_213530.jpg&quot; alt=&quot;Gooseneck Slider Toggle Height&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;Gooseneck slider maximum toggle height approx 1 1/4in.&lt;/p&gt;
    
&lt;/div&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/20171023-213413-20171023_213413.jpg&quot; alt=&quot;Slider Track Width&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;Slider track width 1 7/16in or 1 1/2in.&lt;/p&gt;
    
&lt;/div&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/20171023-213441-20171023_213441.jpg&quot; alt=&quot;Slider Track Depth/Thickness&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;Slider Track Depth/Thickness 1/4in.&lt;/p&gt;
    
&lt;/div&gt;

&lt;p&gt;There is a sheave for the topping lift that comes into the boom on the bottom at
2 3/4” from the end. That limits how deep the end cap can be.&lt;/p&gt;

&lt;p&gt;Related is the spar section, of which I took a few measurements and pictures as well.&lt;/p&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/20171105-184313-DSC05331.jpg&quot; alt=&quot;Spar Section Outside Height&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;Spar section outside height 4 7/16in.&lt;/p&gt;
    
&lt;/div&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/20171105-184424-DSC05336.jpg&quot; alt=&quot;Spar Section Outside Width&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;Spar section outside width 3 1/8in.&lt;/p&gt;
    
&lt;/div&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/20171105-184512-DSC05338.jpg&quot; alt=&quot;Spar Section Inside Width&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;Spar section inside width 2 7/8in.&lt;/p&gt;
    
&lt;/div&gt;

&lt;p&gt;In addition to photographing direct measurements, I traced the spar section and labeled it. The drawing is done on metric graph paper, where each square is 0.5cm. All measurements are written into the figure, including the following:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;The sail track’s inside diameter is 3/4in,&lt;/li&gt;
  &lt;li&gt;The sail track’s outside diameter is 3/4in,&lt;/li&gt;
  &lt;li&gt;The sail track’s outside height is 13/16in,&lt;/li&gt;
  &lt;li&gt;All walls are 1/8in,&lt;/li&gt;
  &lt;li&gt;The screw holes appear to be 1/8in and 3/16in.&lt;/li&gt;
&lt;/ul&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/20171108-093921-DSC05357.jpg&quot; alt=&quot;Spar Section Sketch&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;Spar Section Sketch.&lt;/p&gt;
    
&lt;/div&gt;

&lt;p&gt;The end cap that fits onto the spar section appears to be made of the same cast
aluminum alloy that the gooseneck slider is made of. Bolted into that is either
a chromed brass or stainless steel toggle-and-bolt assembly, which I have thus
far found impossible to remove (have not tried heat yet). The end cap came off
rather easily once I removed the 4 screws holding it down, including those
passing through cheek blocks (don’t overlook them like I did!) and applying heat
with a regular propane blow torch on a cold day. Rather than prying under the
lip of the end cap, I tapped with a lead cannon ball on a long wrench passed
through a gap in the cheek of the boom.&lt;/p&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/20171108-093828-DSC05355.jpg&quot; alt=&quot;End Cap Inside&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;End cap inside.&lt;/p&gt;
    
&lt;/div&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/20171108-093748-DSC05352.jpg&quot; alt=&quot;End Cap Profile&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;End cap profile.&lt;/p&gt;
    
&lt;/div&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/20171108-093732-DSC05350.jpg&quot; alt=&quot;End Cap Front&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;End cap front.&lt;/p&gt;
    
&lt;/div&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/20171108-093809-DSC05354.jpg&quot; alt=&quot;End Cap Top&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;End cap top.&lt;/p&gt;
    
&lt;/div&gt;

&lt;p&gt;From this point forward I didn’t have my trusty analog imperial caliper handy, so the rest of the measurements are either metric, or decimal imperial.&lt;/p&gt;

&lt;p&gt;I also traced the end cap fitting onto the metric graph paper, and sketched the lip and sail track parts. The measurements are written into the figure, including the following:&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;End cap fitting width 7.0cm (2.880in)&lt;/li&gt;
  &lt;li&gt;End cap fitting min height 8.3cm (3.532in)&lt;/li&gt;
  &lt;li&gt;End cap fitting max height approx 3.79-3.81in&lt;/li&gt;
  &lt;li&gt;End cap fitting dpeth 1.677in&lt;/li&gt;
&lt;/ul&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/20171108-093908-DSC05356.jpg&quot; alt=&quot;End Cap Fitting Sketch&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;End cap fitting sketch.&lt;/p&gt;
    
&lt;/div&gt;

&lt;p&gt;A vertical toggle pin attaches the gooseneck slider to the gooseneck toggle,
and the toggle attaches via eye-bolt pin to an eye-bolt made fast to the end cap. The bolt
appears to be seized with adhesive, as well as held on with a lock washer and
nut and perhaps lock-tite.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Toggle pin diameter max approx 0.3in&lt;/li&gt;
  &lt;li&gt;Eye-bolt pin diameter 0.369in&lt;/li&gt;
  &lt;li&gt;Eye-bolt pin length 0.904&lt;/li&gt;
  &lt;li&gt;Toggle outside width (i.e., the distance the eye-bolt pin has to cover) 0.773, inside 0.471 (i.e., the distance that bounds the width of the eye)&lt;/li&gt;
  &lt;li&gt;Eye-bolt flange diameter 1.184&lt;/li&gt;
  &lt;li&gt;Eye-bolt diameter 0.39&lt;/li&gt;
  &lt;li&gt;Eye-bolt nut 0.675&lt;/li&gt;
  &lt;li&gt;Eye-bolt eye protrusion distance 1.387&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Edit: Roverhi points out in a comment that it looks to be a LeFiell boom, and indeed LeFiell has one with the same spar section. Probably more to the point is that the existing gooseneck assembly is inadequate and likely not complete.&lt;/p&gt;

&lt;p&gt;Here is a copy of their spar sections, taken from
&lt;a href=&quot;http://www.lefiell.com/&quot;&gt;LeFiell’s old website&lt;/a&gt; and used without permission.
It’s pretty clear to me that I won’t be getting any OEM parts for this, so we’ll
have to see what’s next.&lt;/p&gt;

&lt;!--  include image.html --&gt;
&lt;!-- img=&quot;http://farm7.static.flickr.com/6179/6198346259_28e0b792a5_z.jpg&quot; --&gt;
&lt;!-- OPTIONAL external=&quot;true&quot; --&gt;
&lt;!-- title=&quot;Hexastix arrangement all&quot; --&gt;
&lt;!-- OPTIONAL caption=&quot;Hexastix arrangement all by Alejandro Erickson, on Flickr&quot; --&gt;
&lt;!-- OPTIONAL url=&quot;http://www.flickr.com/photos/alejandroerickson/6198346259/&quot; --&gt;
&lt;!-- OPTIONAL width=&quot;500px&quot; --&gt;
&lt;!-- OPTIONAL class=&quot;on-light&quot; --&gt;
&lt;!-- OPTIONAL height=&quot;500px&quot; --&gt;
&lt;!--  --&gt;

&lt;div class=&quot;image-wrapper&quot;&gt;
    
    &lt;img src=&quot;/images/cruisingmast.gif&quot; alt=&quot;LeFiell Spar Sections&quot; /&gt;
    
    
        &lt;p class=&quot;image-caption&quot;&gt;LeFiell Spar Sections&lt;/p&gt;
    
&lt;/div&gt;

</description>
        <pubDate>Thu, 09 Nov 2017 05:38:53 +0000</pubDate>
        <link>https://alejandroerickson.com/2017/11/09/newport-30-2-boom-end-cap-and-gooseneck-parts.html</link>
        <guid isPermaLink="true">https://alejandroerickson.com/2017/11/09/newport-30-2-boom-end-cap-and-gooseneck-parts.html</guid>
        
        
      </item>
    
  </channel>
</rss>
