{
  "schema_version": "3.0",
  "rubric_version": 3,
  "dataset_version": "929cac713d30",
  "generated_from": {
    "entries": {
      "path": "interviews/entries.json",
      "sha256": "b782dafabdfb7811cba03ba8b8226495d1cfbd91d11ebac7ec76ad72c90c0fdc"
    },
    "rubric": {
      "path": "interviews/RUBRIC.md",
      "sha256": "a2fcb831b0cca1d13f56513da5c697f4bedfea97283672c83fc607e1efaf82c3",
      "note": "Lens prose is authored in generate.py from this file's scope notes, with every anchor and rubric numeral removed. The hash records which revision it was written against."
    },
    "generator": "generate.py"
  },
  "identity": {
    "display_name": "KL D'Souza",
    "full_name_on_page": false,
    "email_on_page": false,
    "site_url": "https://lyndonkl.github.io",
    "links": [
      {
        "label": "GitHub",
        "url": "https://github.com/lyndonkl"
      },
      {
        "label": "Substack",
        "url": "https://thethinkersnotebook.substack.com/"
      }
    ]
  },
  "study": {
    "title": "Every project I have built with AI, June 2024 to July 2026",
    "subtitle": "One person, twenty-three projects, written down as I went.",
    "measurement_basis": "retrospective_self_report",
    "instrumentation": "none",
    "raters": 1,
    "sample_frame": "public repositories, completed projects only",
    "publishes_numbers": false,
    "survivorship_disclosed": true,
    "renders_aggregate": false,
    "no_single_trend_line": true,
    "finding": "What changed is which kinds of work I could do at all, not any single number. There is no score on this page and no line going up. There is no fair way to give one score to work this different.",
    "finding_narrative": [
      "Through 2024 and most of 2025 I built models by hand, with AI as a tutor and as autocomplete. There is not one team of AI agents in that whole stretch.",
      "Late 2025 is the pivot. The shared toolkit of agents opens in October and is still in use. The first project run start to finish by agents lands in December. By March I am betting real money on what a team of them tells me.",
      "From April 2026 the jobs handed to a team of AI agents take over. I never build another model checked against a real answer. Even the web pages that close this page were themselves built by teams of agents."
    ],
    "disclosures": [
      "Nothing here is scored. There are no numbers attached to any project.",
      "Every judgement here is me remembering afterwards and writing it down. Nothing was measured while it happened, nobody checked my answers, and there are no visitor numbers.",
      "Only finished projects are here. That flatters me, and I would rather say so than hide it.",
      "Public repositories only. Private work is left off entirely.",
      "At my job I measure AI with proper logging and automatic grading. None of that is here. Everything on this page was built on the same AI subscription anyone can buy: no company tools, no special access."
    ],
    "prose_only_origin": {
      "period": "2023",
      "note": "Private tinkering with the raw APIs. Mentioned in the introduction, counted nowhere."
    },
    "window": {
      "start": "2024-06",
      "end": "2026-07"
    }
  },
  "archetypes": [
    {
      "key": "models_outside_arbiter",
      "name": "Models checked against a real answer",
      "ordinal": 1,
      "classification_only": true,
      "definition": "I built a model to predict something real, and something outside the chat decided whether it worked. That might be data the model never saw while it was learning. It might be the result a published paper already got, a competition leaderboard, or a target I wrote down before I looked. Neither the AI nor I can argue our way to a pass.",
      "short_definition": "I built a model to predict something real, and something outside the chat decided whether it worked: data the model never saw while it was learning, a published result, or a competition leaderboard.",
      "lens": {
        "what_i_look_at": "I look at how much of the dull work AI did for me, turning messy real-world data into numbers a model can read. Whether it suggested a design I could stand behind. Whether it helped me chase bugs on a rented machine I could not see into. Whether a real result ever came back, one that could have come back bad. And whether the code stayed honest about what actually ran.",
        "what_i_am_not_claiming": "I am not claiming these have a screen, an audience, or that anyone but me ever installed one. Most of them have no user at all. I am not claiming teams of agents either: the training here is split across graphics cards, not across agents. And I am not claiming the science was any good. A model can be honestly built, cleanly tested, and still lose to the simplest guess."
      },
      "era_character": "All early. Three of the four land before October 2025, the last in December 2025, and none appears after that.",
      "member_slugs": [
        "cographnet",
        "cricketmodel",
        "foodprediction",
        "mol_protein_graphs"
      ],
      "published_n": 4,
      "span": {
        "start": "2024-06",
        "end": "2025-12"
      }
    },
    {
      "key": "shipped_explainers",
      "name": "Web pages that explain a hard idea",
      "ordinal": 2,
      "classification_only": true,
      "definition": "A web page anyone can open, where the story moves as you scroll. Its job is to get one hard idea into the head of someone who has never met me. It counts here if I built it for a stranger to read.",
      "short_definition": "A web page anyone can open, where the story moves as you scroll, built to get one hard idea into the head of a stranger.",
      "lens": {
        "what_i_look_at": "I look at how much of the design and writing I did not have to do myself. I look at the gap between a page that merely appears on screen and a page that actually reads well. Then how much of that gap the AI closed on its own. I look at whether the AI could see the page it had just built and fix it. That was impossible in 2025 and routine by 2026. Then the shape of the story and the voice. Then how honestly the page marks what was measured against what was guessed. And how much of the final polish before a reader sees it the AI did.",
        "what_i_am_not_claiming": "I am not claiming deep statistics, and nothing here rewards the harder technical road for being harder. I am not claiming size: a short page with a few well-marked charts stands next to a long one carrying hundreds. Some of these were built by whole teams of agents, and I still claim nothing about that. I am putting up the page for judgement, not the machine that made it. There are no visitor numbers here, so a page nobody found stands next to one that travelled. And none of this catches whether the argument on the page is right."
      },
      "era_character": "The one constant. It is the only kind of work present in every stretch. That is what makes the earliest page and the newest page worth opening side by side.",
      "member_slugs": [
        "ai-structured-thinking-presentation",
        "chipandadmarketresearch",
        "cursor-product-eng-workflow",
        "fifaworldcup2026",
        "iplprogress",
        "medgraphragpost",
        "understandingsoccer"
      ],
      "published_n": 7,
      "span": {
        "start": "2025-01",
        "end": "2026-08"
      }
    },
    {
      "key": "machines",
      "name": "Jobs I handed to a team of AI agents",
      "ordinal": 3,
      "classification_only": true,
      "definition": "Not one AI doing a job, but several. I split the job across several AI agents and gave each one its own role. I decided what each hands to the next, and where I have to sign off. Then I ran it and lived with what came back.",
      "short_definition": "Several AI agents, each with its own role, working one job between them: I set the roles, decide what passes from one to the next, and live with what comes back.",
      "lens": {
        "what_i_look_at": "I look at whether the roles were genuinely different jobs or just different labels on the same prompt. And whether they held once it actually ran. Whether the handovers survived a live run. Whether it caught its own failures instead of waiting for me to. Where I drew the line it could not cross, and where it had to stop and ask me. And whether handing the job over was worth it, which comes down to whether I used what came back or did it again myself.",
        "what_i_am_not_claiming": "I am not claiming the answers were right. One of these keeps a public forecasting log. Another has nothing to check itself against. Accuracy belongs in what I wrote about each project. I am not claiming these are well-built software: some are a folder of notes and one script. And size earns nothing. More agents, longer runs and wider splits count for nothing unless the roles held, the handovers held, and I used what came out."
      },
      "era_character": "Entirely 2026, and the biggest single change on this page.",
      "member_slugs": [
        "aiengconf",
        "allbirdsanalysis",
        "investing-notebook",
        "ipl2026forecasts",
        "medgemmachallenge",
        "papersynthesis"
      ],
      "published_n": 6,
      "span": {
        "start": "2026-02",
        "end": "2026-06"
      }
    },
    {
      "key": "taught_me",
      "name": "Had AI teach me a hard subject",
      "ordinal": 4,
      "classification_only": true,
      "definition": "I picked a subject I actually wanted to learn and had AI build the course around me: the lessons, the exercises and the tests. The code left behind is just the leftovers. What I was after is what stuck in my head, and that is the one thing a code repository cannot show you.",
      "short_definition": "I picked a subject I wanted to learn and had AI build the course around me: the lessons, the exercises and the tests.",
      "lens": {
        "what_i_look_at": "I look at what the course left out rather than what it put in. Covering everything is easy to fake. Knowing what to cut is hard. Whether it was right about the subject and not just about the code. Whether the exercises could tell me I was wrong. Whether it still held up when I came back to it later. And what stuck, of the part I actually worked through.",
        "what_i_am_not_claiming": "I am not claiming the code in these is proper engineering. There are tests and a hand-written graphics-card routine in here, and none of it is software with users or a life in production. They are exercises. I claim nothing about teams of agents either, even where a team delivered the course. There the machinery is the subject rather than the claim. I am not claiming I finished: how far I got is my own follow-through, and I say so plainly in each write-up. And the last thing on that list you simply have to take on trust, because nobody can audit what is in my head."
      },
      "era_character": "Entirely 2026. It only appears once agents can hold a whole course in mind and remember where I had got to between sessions.",
      "member_slugs": [
        "gpuprogramming",
        "learnbiostats",
        "learning-erlang-otp"
      ],
      "published_n": 3,
      "span": {
        "start": "2026-01",
        "end": "2026-05"
      }
    },
    {
      "key": "reasoned_take",
      "name": "An argument I worked out with AI",
      "ordinal": 5,
      "classification_only": true,
      "definition": "The whole project is an argument. Nothing was built: no code, no screen, no team of agents. I pointed a model at a question you cannot settle by looking something up. I made it work all the way through a method I had taught it from a book. What came out was writing. Delete everything except the writing and the project is still intact.",
      "short_definition": "The whole project is an argument — no code and no screen, just a model worked all the way through a method I had taught it from a book.",
      "lens": {
        "what_i_look_at": "I look at whether working through the method actually changed the answer, or whether it just decorated a position the question already implied. How hard the opposing case was built. Whether the argument ends somewhere you can check. Where the load-bearing claims came from. And whether the self-check was honest, because a model once graded its own work as flawless against my own questions.",
        "what_i_am_not_claiming": "I am not claiming the conclusion turned out to be right. The question has not resolved yet, so how it lands belongs in the write-up. I am not claiming engineering, design, packaging or a team of agents. There is no code here. One long conversation that follows a set of steps is a method, not a team. And I am not claiming length or difficulty. A long analysis and a short forecast get exactly the same questions."
      },
      "era_character": "One month, November 2025, that never comes back. The same appetite returns in 2026 with machinery attached.",
      "member_slugs": [
        "mariah-3b-forecast"
      ],
      "published_n": 1,
      "span": {
        "start": "2025-11",
        "end": "2025-11"
      }
    },
    {
      "key": "tools",
      "name": "Tools other programs plug into",
      "ordinal": 6,
      "classification_only": true,
      "definition": "Something I packaged up so other software can install and use it: a website, or an AI app like Claude Desktop. Not something a person opens and looks at. The honest test is whether it runs on somebody else's computer.",
      "short_definition": "Something I packaged up so other software can install and use it, rather than something a person opens and looks at.",
      "lens": {
        "what_i_look_at": "I look at it from the point of view of whatever software is calling it. How you call it, and whether the names make sense. Which side has to remember what, and whether the job is split into sensible pieces. Whether AI could cope with somebody else's platform while its rules kept changing underneath me. Whether a stranger can install it. Whether the documentation was part of the job rather than an afterthought. And whether there is any evidence it ran somewhere that is not my own machine.",
        "what_i_am_not_claiming": "I am not claiming machine-learning quality: naming an AI model inside a package does not make it machine-learning work. There are no datasets here, so no statistics. There is no screen, so no design, and an example interface shipped alongside is not the point. Serving one AI client is not the same as running a team of them, so I claim nothing about that either. And take-up is out entirely: downloads, stars, whether anyone else ever installed it, and how soon I stopped touching it earn and cost nothing here."
      },
      "era_character": "Strictly 2025. Not because I got worse at it. Packaging things up stopped being a project of its own and became a normal part of bigger ones.",
      "member_slugs": [
        "gemma-worker-wrapper",
        "graphragmcp"
      ],
      "published_n": 2,
      "span": {
        "start": "2025-03",
        "end": "2025-09"
      }
    },
    {
      "key": "substrate",
      "name": "The shared toolkit",
      "ordinal": 7,
      "classification_only": true,
      "definition": "One folder of reusable AI helpers I wrote once and now use everywhere: a forecasting agent, a design agent, a research agent. It does no job on its own, so it is not really a project like the others. Every project after October 2025 is built out of it. That is why it is drawn as a bar under the timeline instead of a dot on it.",
      "short_definition": "One folder of reusable AI helpers I wrote once and now use everywhere; every project after October 2025 is built out of it.",
      "lens": {
        "what_i_look_at": "I look at whether pulling these out was worth it. Did a way of thinking I took from a book, or from work I already knew, turn into something I could use again? That means using it again without writing it out from scratch. And whether the later projects really do use it. You do not have to take my word for that: every project from October 2025 onward is built out of it.",
        "what_i_am_not_claiming": "I do not read this as a team of agents doing a job. It runs nothing start to finish, so the questions I ask of those have nothing to grip here. I am not claiming packaging, although you can install it into Claude Code as an add-on. And I am not claiming that reusing it made the later projects better. Only that they ran on it."
      },
      "era_character": "Opens in October 2025 and is still in use. Everything after it is built out of it.",
      "member_slugs": [
        "claude-repo"
      ],
      "published_n": 1,
      "span": {
        "start": "2025-10",
        "end": null
      }
    }
  ],
  "phases": [
    {
      "id": "p1",
      "ordinal": 1,
      "label": "Models, and no machines",
      "start": "2024-06",
      "end": "2025-09",
      "open_ended": false,
      "months": 16,
      "n": 7,
      "mix": {
        "models_outside_arbiter": 3,
        "shipped_explainers": 2,
        "machines": 0,
        "taught_me": 0,
        "reasoned_take": 0,
        "tools": 2,
        "substrate": 0
      },
      "member_slugs": [
        "mol_protein_graphs",
        "cursor-product-eng-workflow",
        "cographnet",
        "gemma-worker-wrapper",
        "foodprediction",
        "medgraphragpost",
        "graphragmcp"
      ],
      "lede": "I write every line of code myself and use AI as a tutor and an autocomplete. Nothing here runs on its own."
    },
    {
      "id": "p2",
      "ordinal": 2,
      "label": "The pivot",
      "start": "2025-10",
      "end": "2026-03",
      "open_ended": false,
      "months": 6,
      "n": 7,
      "mix": {
        "models_outside_arbiter": 1,
        "shipped_explainers": 1,
        "machines": 2,
        "taught_me": 1,
        "reasoned_take": 1,
        "tools": 0,
        "substrate": 1
      },
      "member_slugs": [
        "claude-repo",
        "ai-structured-thinking-presentation",
        "mariah-3b-forecast",
        "cricketmodel",
        "learning-erlang-otp",
        "medgemmachallenge",
        "ipl2026forecasts"
      ],
      "lede": "In October I start the folder of reusable agents I still use today. By December they are running a whole project without me."
    },
    {
      "id": "p3",
      "ordinal": 3,
      "label": "Machines and orchestration",
      "start": "2026-04",
      "end": null,
      "open_ended": true,
      "months": 4,
      "n": 10,
      "mix": {
        "models_outside_arbiter": 0,
        "shipped_explainers": 4,
        "machines": 4,
        "taught_me": 2,
        "reasoned_take": 0,
        "tools": 0,
        "substrate": 0
      },
      "member_slugs": [
        "allbirdsanalysis",
        "investing-notebook",
        "learnbiostats",
        "papersynthesis",
        "gpuprogramming",
        "aiengconf",
        "iplprogress",
        "understandingsoccer",
        "chipandadmarketresearch",
        "fifaworldcup2026"
      ],
      "lede": "I build no more models. One set of instructions now splits a job across many agents at once, then pulls their answers back together."
    }
  ],
  "entries": [
    {
      "slug": "mol_protein_graphs",
      "title": "Leash Belka — small molecule–protein binding with GNNs",
      "what_it_does": "Predicts which drug-like molecules stick to which proteins. That's normally lab work.",
      "plain_note": "The model learns from molecules drawn as dots and links, then trains on graphics chips rented by the hour.",
      "glosses": [
        {
          "term": "GNN",
          "gloss": "graph neural network: AI that reads connection maps"
        },
        {
          "term": "graph neural networks",
          "gloss": "software that learns from dot-and-line maps"
        },
        {
          "term": "PyTorch Geometric",
          "gloss": "a free code library for building those models"
        },
        {
          "term": "RunPod",
          "gloss": "a service that rents powerful graphics-card computers"
        },
        {
          "term": "DDP",
          "gloss": "training one model across several graphics cards"
        },
        {
          "term": "distributed training",
          "gloss": "splitting one training job across several machines"
        },
        {
          "term": "Kaggle",
          "gloss": "a website that runs public data-science contests"
        },
        {
          "term": "Leash Belka",
          "gloss": "the contest's public dataset of molecule-protein tests"
        },
        {
          "term": "small molecule-protein binding",
          "gloss": "whether a drug-sized chemical sticks to a protein"
        },
        {
          "term": "VS Code AI autocomplete",
          "gloss": "the editor suggesting your next line of code"
        }
      ],
      "extra_routes": [],
      "subtitle": null,
      "date": "2024-06",
      "date_end": "2024-11",
      "order_hint": 0,
      "open_ended": false,
      "kind": "repo",
      "presentation": "point",
      "featured": false,
      "era": "ide",
      "phase": "p1",
      "archetype": "models_outside_arbiter",
      "archetype_name": "Models checked against a real answer",
      "url": null,
      "repo": "https://github.com/lyndonkl/mol_protein_graphs",
      "tools": [
        "ChatGPT (learning PyTorch Geometric)",
        "Gemini (learning PyTorch Geometric)",
        "VS Code AI autocomplete"
      ],
      "verdict": "My first attempt at using AI assistance for coding, and a really fun one. It was the Leash Belka Kaggle competition — predicting small molecule–protein binding. The goal was to take my understanding of graph neural networks, learn PyTorch Geometric, and apply it to the competition dataset. AI's role was narrow and honest: I used ChatGPT and Gemini to learn the framework, and autocomplete inside Visual Studio while I wrote. Not code generation. It took four and a half months, and it was a great learning experience.",
      "taught_me": "How to build and train these models properly. I rented time on powerful machines to train the final ones, and what I learned there I used again on two later projects.",
      "taught_me_blank": false,
      "ai_reach": "AI carried the domain encoding well — getting raw molecular data into a form the model could eat was where it helped most. It could argue the architecture about half the way. Beyond that it did nothing: I hadn't started using models for debugging at this point, and nothing about evaluation or keeping the repo honest involved AI at all.",
      "secondary_archetype_note": null,
      "in_service": null,
      "markers": [
        {
          "type": "craft_thread",
          "display": "glyph",
          "thread": "domain-tutor",
          "position": 1,
          "confirmed": true
        }
      ],
      "craft_threads": [
        {
          "thread": "domain-tutor",
          "position": 1,
          "confirmed": true
        }
      ],
      "thread_refs": [
        {
          "thread": "ddp",
          "role": "origin"
        },
        {
          "thread": "runpod",
          "role": "origin"
        }
      ],
      "prose_notes": [
        {
          "id": "baseline",
          "text": "It ran longer than anything else here, and it is the project where AI did the least."
        }
      ],
      "media": null,
      "provenance": {
        "interviewed": "2026-08-01",
        "approved": true,
        "dossier": "dossiers/mol_protein_graphs.md"
      }
    },
    {
      "slug": "cursor-product-eng-workflow",
      "title": "Running a whole product process through Cursor",
      "what_it_does": "I had an AI code editor plan, schedule and build an entire website: a scrolling chart of world economic growth.",
      "plain_note": "An agent is an AI left to run a task; a skill is the written recipe it follows.",
      "glosses": [
        {
          "term": "Cursor",
          "gloss": "a code editor with AI built in"
        },
        {
          "term": ".cursorrules",
          "gloss": "a standing instruction file for Cursor"
        },
        {
          "term": "Jira tickets",
          "gloss": "numbered work items on a team's task board"
        },
        {
          "term": "epics",
          "gloss": "an epic: one big job, many tickets"
        },
        {
          "term": "progressive disclosure",
          "gloss": "showing the AI only what it needs now"
        },
        {
          "term": "sub-agents",
          "gloss": "helper AIs, each handed one narrow task"
        },
        {
          "term": "skills",
          "gloss": "written instructions teaching an AI one job"
        }
      ],
      "extra_routes": [],
      "subtitle": null,
      "date": "2025-01",
      "date_end": null,
      "order_hint": 0,
      "open_ended": false,
      "kind": "repo",
      "presentation": "point",
      "featured": false,
      "era": "ide",
      "phase": "p1",
      "archetype": "shipped_explainers",
      "archetype_name": "Web pages that explain a hard idea",
      "url": null,
      "repo": "https://github.com/lyndonkl/cursor-product-eng-workflow",
      "tools": [
        "Cursor",
        "borrowed community .cursorrules"
      ],
      "verdict": "An early experiment with Cursor, before I found skills and agents. I was trying to give different roles access to specific subfolders, then have AI run the whole engineering process itself — write the project plan, cut its own Jira tickets, group them into epics, break those down into implementation detail. I wouldn't call it a success. I battled it constantly, and the tooling was too early to support what I was reaching for. But it gave me the grounding for how to visualize the framework. Most of my current projects run on what I worked out here: how to organize context inside a folder structure, and how to let an agent reach that context. It's also the project that drove me from Cursor to Claude. Progressive disclosure, skills, and sub-agents were what I'd been trying to build by hand.",
      "taught_me": "A lot, with no measurable outcome — which is its own kind of result. The framework survived; the project didn't.",
      "taught_me_blank": false,
      "ai_reach": null,
      "secondary_archetype_note": null,
      "in_service": null,
      "markers": [
        {
          "type": "hinge",
          "display": "glyph",
          "note": "The project that drove me from Cursor to Claude. It is where I worked out how to organise context in folders, which every later project still uses."
        }
      ],
      "craft_threads": [],
      "thread_refs": [],
      "prose_notes": [
        {
          "id": "missing-url",
          "text": "I built it to be published and never put it online, so there is nothing to visit."
        }
      ],
      "media": null,
      "provenance": {
        "interviewed": "2026-08-01",
        "approved": true,
        "dossier": "dossiers/cursor-product-eng-workflow.md"
      }
    },
    {
      "slug": "cographnet",
      "title": "Replicating CoGraphNet from the paper",
      "what_it_does": "Rebuilds a published research method that sorts medical article summaries into disease categories by mapping how words and sentences connect.",
      "plain_note": null,
      "glosses": [
        {
          "term": "CoGraphNet",
          "gloss": "a published design for sorting documents by topic"
        },
        {
          "term": "graph neural network",
          "gloss": "software that learns from dot-and-line maps"
        },
        {
          "term": "RunPod",
          "gloss": "a service that rents powerful graphics-card computers"
        },
        {
          "term": "Cursor",
          "gloss": "a code editor with AI built in"
        },
        {
          "term": "architectures",
          "gloss": "the layout of a model's parts"
        },
        {
          "term": "replicated the paper",
          "gloss": "rebuilt it and got the same results"
        }
      ],
      "extra_routes": [],
      "subtitle": null,
      "date": "2025-02",
      "date_end": "2025-04",
      "order_hint": 0,
      "open_ended": false,
      "kind": "repo",
      "presentation": "point",
      "featured": false,
      "era": "ide",
      "phase": "p1",
      "archetype": "models_outside_arbiter",
      "archetype_name": "Models checked against a real answer",
      "url": null,
      "repo": "https://github.com/lyndonkl/cographnet",
      "tools": [
        "ChatGPT / OpenAI code assistance",
        "Cursor"
      ],
      "verdict": "A fun project, and the first where I leaned on heavy AI-assisted code generation rather than just completion. I replicated the CoGraphNet paper successfully on the dataset it referenced. Then I tried to port it to another dataset and couldn't quite get that running. I'd still call it a success: I reproduced the paper's results using AI to generate the code. It also built directly on the molecule–protein graph work — setting up a graph neural network, training it, deploying it, running it on RunPod. AI helped enormously with the models, and just as much with preparing the datasets. This was also where I used it to understand RunPod itself. It helped me set up and train there, though it couldn't yet drive RunPod for me. That came later.",
      "taught_me": "That I could take technical papers, architectures, and images and get AI to convert them into code. That realization is what made every later replication project possible. Dataset preparation, not modeling, is where it saved me the most time.",
      "taught_me_blank": false,
      "ai_reach": null,
      "secondary_archetype_note": null,
      "in_service": null,
      "markers": [
        {
          "type": "hinge",
          "display": "glyph",
          "note": "Where papers, architectures, and diagrams became code. The first project using heavy AI code generation rather than completion."
        },
        {
          "type": "craft_thread",
          "display": "glyph",
          "thread": "domain-tutor",
          "position": 2,
          "confirmed": true
        }
      ],
      "craft_threads": [
        {
          "thread": "domain-tutor",
          "position": 2,
          "confirmed": true
        }
      ],
      "thread_refs": [
        {
          "thread": "ddp",
          "role": "carried_into"
        },
        {
          "thread": "runpod",
          "role": "carried_into"
        }
      ],
      "prose_notes": [],
      "media": null,
      "provenance": {
        "interviewed": "2026-08-01",
        "approved": true,
        "dossier": "dossiers/cographnet.md"
      }
    },
    {
      "slug": "gemma-worker-wrapper",
      "title": "Gemma in the browser",
      "what_it_does": "Lets any website run Google's Gemma chatbot model inside the visitor's own browser rather than on a server.",
      "plain_note": "A browser has nothing like the power of a server behind it, so only the smallest models fit.",
      "glosses": [
        {
          "term": "Gemma",
          "gloss": "Google's small, free-to-download chatbot model"
        },
        {
          "term": "MediaPipe",
          "gloss": "Google's toolkit for running models on your device"
        },
        {
          "term": "LLM",
          "gloss": "large language model: the engine behind chatbots"
        },
        {
          "term": "inference",
          "gloss": "running a model to get an answer"
        },
        {
          "term": "wrapper",
          "gloss": "a small layer that simplifies using something"
        },
        {
          "term": "intent recognition",
          "gloss": "working out what a user is asking for"
        },
        {
          "term": "context window",
          "gloss": "how much text a model can hold"
        },
        {
          "term": "browser models",
          "gloss": "language models that run inside a web browser"
        }
      ],
      "extra_routes": [],
      "subtitle": null,
      "date": "2025-03",
      "date_end": null,
      "order_hint": 0,
      "open_ended": false,
      "kind": "repo",
      "presentation": "point",
      "featured": false,
      "era": "ide",
      "phase": "p1",
      "archetype": "tools",
      "archetype_name": "Tools other programs plug into",
      "url": null,
      "repo": "https://github.com/lyndonkl/gemma-worker-wrapper",
      "tools": [
        "Cursor",
        "Google MediaPipe"
      ],
      "verdict": "A very small project, and my first time using Google's MediaPipe library. I wanted to write a wrapper that loads Gemma into the browser and see what an LLM could actually do there. It worked — you can load a model in the browser and run inference on it. I didn't take it much further, because browser models at that point couldn't do a lot beyond intent recognition, and the context windows were small.",
      "taught_me": "That this is nascent rather than limited, and the potential is large. It matters for privacy, and it matters for whether language models can run on smaller devices. If they can, a lot opens up — think of a model running on a robot that cleans a room, where you can tell it to avoid an obstacle that drops in front of it. I don't know how far this has come since. It's worth another look.",
      "taught_me_blank": false,
      "ai_reach": null,
      "secondary_archetype_note": null,
      "in_service": null,
      "markers": [
        {
          "type": "still_open",
          "display": "glyph",
          "note": "Something I would come back to. Models that run on your own device matter for privacy and for small hardware. I do not know how far browser models have come since March 2025."
        },
        {
          "type": "craft_thread",
          "display": "glyph",
          "thread": "cheap-no",
          "position": 1,
          "confirmed": true
        }
      ],
      "craft_threads": [
        {
          "thread": "cheap-no",
          "position": 1,
          "confirmed": true
        }
      ],
      "thread_refs": [],
      "prose_notes": [],
      "media": null,
      "provenance": {
        "interviewed": "2026-08-01",
        "approved": true,
        "dossier": "dossiers/gemma-worker-wrapper.md"
      }
    },
    {
      "slug": "foodprediction",
      "title": "Food prediction from mass spectrometry data",
      "what_it_does": "Works out which food a lab sample came from by matching the chemicals in it against nutrition records.",
      "plain_note": null,
      "glosses": [
        {
          "term": "mass spectrometry",
          "gloss": "a lab method that lists a sample's molecules"
        },
        {
          "term": "graph neural networks",
          "gloss": "software that learns from dot-and-line maps"
        },
        {
          "term": "ticket decomposition",
          "gloss": "splitting work into small numbered task files"
        },
        {
          "term": "code generation",
          "gloss": "asking the AI to write the code itself"
        }
      ],
      "extra_routes": [],
      "subtitle": null,
      "date": "2025-07",
      "date_end": null,
      "order_hint": 0,
      "open_ended": false,
      "kind": "repo",
      "presentation": "point",
      "featured": false,
      "era": "ide",
      "phase": "p1",
      "archetype": "models_outside_arbiter",
      "archetype_name": "Models checked against a real answer",
      "url": null,
      "repo": "https://github.com/lyndonkl/foodprediction",
      "tools": [
        "Cursor"
      ],
      "verdict": "A friend at UCSD reached out to explore some data, and we worked on it together. I'd call it a success based on the outcomes from the model we built. It was interesting for two reasons. I got to apply what I'd learned about graph neural networks, and I used AI to understand mass spectrometry — a domain I didn't know. There was no agent-style ticket decomposition here. This was purely about building a model for food prediction and understanding the data. It was all code generation.",
      "taught_me": "That AI could get me productive in an unfamiliar scientific domain fast enough to be useful to someone who actually works in it.",
      "taught_me_blank": false,
      "ai_reach": null,
      "secondary_archetype_note": null,
      "in_service": null,
      "markers": [
        {
          "type": "craft_thread",
          "display": "glyph",
          "thread": "domain-tutor",
          "position": 3,
          "confirmed": true
        },
        {
          "type": "collaboration",
          "display": "prose_only",
          "with": "a friend at UCSD",
          "note": "Kept in the verdict prose. No badge on the timeline."
        }
      ],
      "craft_threads": [
        {
          "thread": "domain-tutor",
          "position": 3,
          "confirmed": true
        }
      ],
      "thread_refs": [],
      "prose_notes": [],
      "media": null,
      "provenance": {
        "interviewed": "2026-08-01",
        "approved": true,
        "dossier": "dossiers/foodprediction.md"
      }
    },
    {
      "slug": "medgraphragpost",
      "title": "GraphRAG, explained by scrolling",
      "what_it_does": "A web page that explains, as you scroll, how AI answers medical questions by searching a map of linked facts. That search method is GraphRAG.",
      "plain_note": null,
      "glosses": [
        {
          "term": "GraphRAG",
          "gloss": "answering questions by searching a map of facts"
        },
        {
          "term": "scrollytelling",
          "gloss": "a page whose graphics change as you scroll"
        },
        {
          "term": "Scrollama",
          "gloss": "a small tool that triggers visuals on scroll"
        },
        {
          "term": "D3",
          "gloss": "a tool for drawing charts on web pages"
        },
        {
          "term": "data-driven journalism",
          "gloss": "news stories built around charts and data"
        }
      ],
      "extra_routes": [],
      "subtitle": null,
      "date": "2025-07",
      "date_end": null,
      "order_hint": 0,
      "open_ended": false,
      "kind": "live",
      "presentation": "point",
      "featured": true,
      "era": "ide",
      "phase": "p1",
      "archetype": "shipped_explainers",
      "archetype_name": "Web pages that explain a hard idea",
      "url": "https://lyndonkl.github.io/medgraphragpost/",
      "repo": "https://github.com/lyndonkl/medgraphragpost",
      "tools": [
        "Cursor",
        "D3",
        "Scrollama"
      ],
      "verdict": "I've always been a huge fan of data-driven journalism and the scrollytelling experience. This was my very first attempt at using Scrollama with AI to build something I could present. I took two papers I'd read and presented them as a scrollytelling piece. I'd call it a success. It's one of the first I did, and you can see that in the work itself. Since then I've done it many more times, and I've gotten much better at understanding how to get the best experiences out of AI. Simple, and it worked. I have no complaints about it. It served its purpose.",
      "taught_me": "How to build a scrollytelling piece with AI at all. Everything I've made in the format since started here.",
      "taught_me_blank": false,
      "ai_reach": null,
      "secondary_archetype_note": null,
      "in_service": null,
      "markers": [
        {
          "type": "craft_thread",
          "display": "glyph",
          "thread": "scrollytelling",
          "position": 1,
          "confirmed": true
        }
      ],
      "craft_threads": [
        {
          "thread": "scrollytelling",
          "position": 1,
          "confirmed": true
        }
      ],
      "thread_refs": [],
      "prose_notes": [],
      "media": null,
      "provenance": {
        "interviewed": "2026-08-01",
        "approved": true,
        "dossier": "dossiers/medgraphragpost.md"
      }
    },
    {
      "slug": "graphragmcp",
      "title": "GraphRAG knowledge behind an MCP server",
      "what_it_does": "A server that feeds an AI assistant, section by section, my notes on building searchable maps of linked facts. MCP is the socket an assistant plugs into.",
      "plain_note": null,
      "glosses": [
        {
          "term": "MCP server",
          "gloss": "a program an AI assistant can plug into"
        },
        {
          "term": "MCP",
          "gloss": "a shared standard for plugging tools into AI"
        },
        {
          "term": "GraphRAG",
          "gloss": "answering questions by searching a map of facts"
        },
        {
          "term": "knowledge graph",
          "gloss": "a map of facts joined by their links"
        },
        {
          "term": "semantic indexes",
          "gloss": "a lookup that matches meaning, not spelling"
        },
        {
          "term": "metapaths",
          "gloss": "named routes between kinds of linked things"
        },
        {
          "term": "embedding",
          "gloss": "turning text into numbers a computer can compare"
        },
        {
          "term": "agent",
          "gloss": "AI that carries out tasks by itself"
        },
        {
          "term": "Claude Code",
          "gloss": "Anthropic's AI assistant that writes code"
        },
        {
          "term": "Claude Desktop",
          "gloss": "Anthropic's chat app for a laptop"
        }
      ],
      "extra_routes": [],
      "subtitle": null,
      "date": "2025-09",
      "date_end": null,
      "order_hint": 0,
      "open_ended": false,
      "kind": "repo",
      "presentation": "point",
      "featured": false,
      "era": "agent",
      "phase": "p1",
      "archetype": "tools",
      "archetype_name": "Tools other programs plug into",
      "url": null,
      "repo": "https://github.com/lyndonkl/graphragmcp",
      "tools": [
        "Claude Code",
        "Claude Desktop",
        "MCP"
      ],
      "verdict": "My first project using Claude, and the start of my experimentation with MCP. I wanted to take what I'd learned building GraphRAG on earlier projects and put it behind an MCP server — a service an AI agent can call to look things up, instead of me re-explaining what I know every time. The idea was that an agent could use the server to work with an end user and construct the right knowledge graph for their own domain. I finished it, and I started using it as an MCP server on other projects at work.",
      "taught_me": "How to build an MCP server, and that my own accumulated knowledge was worth packaging as something an agent could reach rather than something I re-explained each time.",
      "taught_me_blank": false,
      "ai_reach": null,
      "secondary_archetype_note": null,
      "in_service": null,
      "markers": [
        {
          "type": "hinge",
          "display": "glyph",
          "note": "First Claude project, and the first server I built for an AI to call rather than a person. This is where I switch from AI in my code editor to AI agents. It is also the working answer to the problem I set myself in January, on Running a whole product process through Cursor."
        }
      ],
      "craft_threads": [],
      "thread_refs": [],
      "prose_notes": [],
      "media": null,
      "provenance": {
        "interviewed": "2026-08-01",
        "approved": true,
        "dossier": "dossiers/graphragmcp.md"
      }
    },
    {
      "slug": "claude-repo",
      "title": "The shared toolkit — my reusable agents and skills",
      "what_it_does": "I keep a library of written instructions, each teaching an AI assistant one job: forecast a result, read a bank statement.",
      "plain_note": null,
      "glosses": [
        {
          "term": "agents",
          "gloss": "an AI given one job and its rules"
        },
        {
          "term": "skills",
          "gloss": "written instructions teaching an AI one job"
        },
        {
          "term": "substrate",
          "gloss": "the shared parts everything else is built on"
        },
        {
          "term": "superforecaster agent",
          "gloss": "an AI that puts odds on future events"
        },
        {
          "term": "Claude Code",
          "gloss": "Anthropic's coding assistant, driven from a terminal"
        },
        {
          "term": "fan-out",
          "gloss": "one job split across many agents at once"
        },
        {
          "term": "MCP server",
          "gloss": "a plug letting AI reach outside tools"
        },
        {
          "term": "Kalshi",
          "gloss": "a market where you bet on real events"
        },
        {
          "term": "TCGA",
          "gloss": "a public archive of cancer tumour data"
        },
        {
          "term": "Triton",
          "gloss": "a language for writing graphics-card code"
        },
        {
          "term": "MediaPipe",
          "gloss": "Google's ready-made toolkit for reading images and video"
        },
        {
          "term": "Vite",
          "gloss": "a tool that packages a website's code"
        },
        {
          "term": "DCF",
          "gloss": "valuing a company by its future cash"
        }
      ],
      "extra_routes": [],
      "subtitle": null,
      "date": "2025-10",
      "date_end": null,
      "order_hint": 0,
      "open_ended": true,
      "kind": "repo",
      "presentation": "span",
      "featured": false,
      "era": "agent",
      "phase": "p2",
      "archetype": "substrate",
      "archetype_name": "The shared toolkit",
      "url": null,
      "repo": "https://github.com/lyndonkl/claude",
      "tools": [
        "Claude Code"
      ],
      "verdict": "This is the most important repository of everything, because it contains all the agents and skills I used for every project that came after it. Every single one of them uses it — the AI investment value analysis, the 3B forecast, the cricket model, the MedGemma challenge, the IPL forecast, the Allbirds analysis, the investing notebook, paper synthesis, GPU programming, IPL progress, understanding soccer.",
      "taught_me": "Building this was an exercise in abstraction — taking thinking from various domains and turning it into a series of agents and skills I could reuse. The superforecaster agent is the clearest case: the same one drives IPL prediction, the World Cup projects and investment analysis. It's taking ideas from engineering and applying them to thinking itself.",
      "taught_me_blank": false,
      "ai_reach": null,
      "secondary_archetype_note": {
        "archetype": "tools",
        "note": "It also counts as a tool: anyone can install it into Claude Code as an add-on."
      },
      "in_service": null,
      "markers": [
        {
          "type": "still_open",
          "display": "glyph",
          "note": "Still running. These are the agents and skills every later project is built out of."
        }
      ],
      "craft_threads": [],
      "thread_refs": [
        {
          "thread": "substrate",
          "role": "origin"
        }
      ],
      "prose_notes": [],
      "media": null,
      "provenance": {
        "interviewed": "2026-08-01",
        "approved": true,
        "dossier": "dossiers/claude-repo.md"
      }
    },
    {
      "slug": "ai-structured-thinking-presentation",
      "title": "Working with agentic systems, as a scrollytelling primer",
      "what_it_does": "I built a scrolling web page showing how to hand an AI a method to work through rather than a question. Scrollytelling means the graphics move as you scroll.",
      "plain_note": null,
      "glosses": [
        {
          "term": "scrollytelling",
          "gloss": "a page whose visuals move as you scroll"
        },
        {
          "term": "agentic systems",
          "gloss": "AI that carries out tasks, not just chats"
        },
        {
          "term": "MedGraphRAG post",
          "gloss": "my earlier scrolling page on medical AI search"
        },
        {
          "term": "GraphRAG",
          "gloss": "AI answering from a map of linked facts"
        },
        {
          "term": "D3",
          "gloss": "a library for drawing charts in browsers"
        },
        {
          "term": "Scrollama",
          "gloss": "code that triggers visuals as you scroll"
        },
        {
          "term": "GSAP",
          "gloss": "a library that animates things on webpages"
        }
      ],
      "extra_routes": [],
      "subtitle": null,
      "date": "2025-11",
      "date_end": null,
      "order_hint": 0,
      "open_ended": false,
      "kind": "live",
      "presentation": "point",
      "featured": true,
      "era": "agent",
      "phase": "p2",
      "archetype": "shipped_explainers",
      "archetype_name": "Web pages that explain a hard idea",
      "url": "https://lyndonkl.github.io/ai-structured-thinking-presentation/",
      "repo": "https://github.com/lyndonkl/ai-structured-thinking-presentation",
      "tools": [
        "Claude Code",
        "D3",
        "Scrollama",
        "GSAP"
      ],
      "verdict": "The second presentation I tried after the MedGraphRAG post. It's a scrollytelling presentation of my thoughts on how to work with agentic systems. Nothing major to say about it. It's very similar to the MedGraphRAG one, and it's a useful primer for anyone who wants to work with agents and understand why agents and skills matter.",
      "taught_me": null,
      "taught_me_blank": true,
      "ai_reach": null,
      "secondary_archetype_note": null,
      "in_service": null,
      "markers": [
        {
          "type": "craft_thread",
          "display": "glyph",
          "thread": "scrollytelling",
          "position": 2,
          "confirmed": true
        }
      ],
      "craft_threads": [
        {
          "thread": "scrollytelling",
          "position": 2,
          "confirmed": true
        }
      ],
      "thread_refs": [
        {
          "thread": "substrate",
          "role": "carried_into"
        }
      ],
      "prose_notes": [],
      "media": null,
      "provenance": {
        "interviewed": "2026-08-01",
        "approved": true,
        "dossier": "dossiers/ai-structured-thinking-presentation.md"
      }
    },
    {
      "slug": "mariah-3b-forecast",
      "title": "Encoding Tetlock into an agent",
      "what_it_does": "I worked out the odds, step by step, that Mariah Carey's Christmas song hits three billion Spotify plays by Christmas 2026.",
      "plain_note": "A base rate is how often something like this has happened before, which is where a forecast starts.",
      "glosses": [
        {
          "term": "Tetlock",
          "gloss": "Philip Tetlock, who studies who forecasts well"
        },
        {
          "term": "superforecasting",
          "gloss": "a tested, rule-based way of predicting"
        },
        {
          "term": "base rates",
          "gloss": "how often this sort of thing happens"
        },
        {
          "term": "agent",
          "gloss": "an AI given one job and its rules"
        }
      ],
      "extra_routes": [],
      "subtitle": null,
      "date": "2025-11",
      "date_end": null,
      "order_hint": 0,
      "open_ended": false,
      "kind": "repo",
      "presentation": "point",
      "featured": false,
      "era": "agent",
      "phase": "p2",
      "archetype": "reasoned_take",
      "archetype_name": "An argument I worked out with AI",
      "url": null,
      "repo": "https://github.com/lyndonkl/mariah-3b-forecast",
      "tools": [
        "Claude Code"
      ],
      "verdict": "A really interesting one. I'd just read Phil Tetlock's book on superforecasting, and I was curious how well I could encode those rules into an AI agent. This is where my superforecaster agent was born. The project was my first attempt at using it not just to forecast, but to gather the prerequisite data — the base rates, the specifics — and apply the techniques from the book. It was a fun project.",
      "taught_me": "That a reasoning discipline out of a book could be encoded into an agent and then reused. The superforecaster agent came out of this and went on to drive the IPL predictions, the World Cup work and the investment analysis.",
      "taught_me_blank": false,
      "ai_reach": null,
      "secondary_archetype_note": null,
      "in_service": null,
      "markers": [
        {
          "type": "hinge",
          "display": "glyph",
          "note": "Where my forecasting agent was born. It is the one I have reused more than any other."
        }
      ],
      "craft_threads": [],
      "thread_refs": [
        {
          "thread": "substrate",
          "role": "carried_into"
        },
        {
          "thread": "superforecaster",
          "role": "origin"
        }
      ],
      "prose_notes": [],
      "media": null,
      "provenance": {
        "interviewed": "2026-08-01",
        "approved": true,
        "dossier": "dossiers/mariah-3b-forecast.md"
      }
    },
    {
      "slug": "cricketmodel",
      "title": "The first end-to-end agent project",
      "what_it_does": "I built a model that predicts what happens on the next ball of a Twenty20 cricket match, from everything before it.",
      "plain_note": "Training a model means running it over the same data again and again, each pass sharpening it.",
      "glosses": [
        {
          "term": "RunPod",
          "gloss": "a site renting graphics cards by the hour"
        },
        {
          "term": "Weights & Biases",
          "gloss": "a dashboard that watches a training run"
        },
        {
          "term": "epochs",
          "gloss": "one epoch: one pass through all the data"
        },
        {
          "term": "training error",
          "gloss": "how wrong the model still is"
        },
        {
          "term": "ML models",
          "gloss": "software that learns patterns from past data"
        },
        {
          "term": "DDP",
          "gloss": "splitting one training run across several graphics cards"
        },
        {
          "term": "GNN",
          "gloss": "a model that learns from connections between things"
        },
        {
          "term": "PyTorch Geometric",
          "gloss": "a toolkit for building graph-based AI models"
        },
        {
          "term": "Twenty20",
          "gloss": "the short, three-hour form of cricket"
        }
      ],
      "extra_routes": [],
      "subtitle": null,
      "date": "2025-12",
      "date_end": null,
      "order_hint": 0,
      "open_ended": false,
      "kind": "repo",
      "presentation": "point",
      "featured": false,
      "era": "agent",
      "phase": "p2",
      "archetype": "models_outside_arbiter",
      "archetype_name": "Models checked against a real answer",
      "url": null,
      "repo": "https://github.com/lyndonkl/cricketmodel",
      "tools": [
        "Claude Code agents",
        "RunPod",
        "Weights & Biases"
      ],
      "verdict": "I finished this one, and it's one I want to revisit at some point. It was the first project where everything, end to end, was done by AI agents: understanding the dataset, performing the data analysis with me as the driver but AI doing the work, designing the different kinds of ML models, setting up training on RunPod, pushing the data there, running the training, and monitoring Weights & Biases. Every single one of those was done by an agent. I didn't get the results I wanted out of the model itself. But the success was that I started to become confident letting AI monitor and report back to me. I'd work with it to set up a training run on RunPod, and it would watch — and when it noticed the training error wasn't improving after a certain number of epochs, it would kill the run and tell me. That was the biggest thing I got out of this project.",
      "taught_me": "That I could hand over the whole loop and trust the reporting. Killing a run that has stopped learning, and telling me why, is the point where monitoring stopped being my job.",
      "taught_me_blank": false,
      "ai_reach": null,
      "secondary_archetype_note": null,
      "in_service": null,
      "markers": [
        {
          "type": "hinge",
          "display": "glyph",
          "note": "First project where every stage — data, analysis, model design, training, monitoring — was run by an agent."
        },
        {
          "type": "still_open",
          "display": "glyph",
          "note": "I want to revisit it; the model results were not what I wanted."
        }
      ],
      "craft_threads": [],
      "thread_refs": [
        {
          "thread": "ddp",
          "role": "carried_into"
        },
        {
          "thread": "runpod",
          "role": "carried_into"
        },
        {
          "thread": "substrate",
          "role": "carried_into"
        }
      ],
      "prose_notes": [],
      "media": null,
      "provenance": {
        "interviewed": "2026-08-01",
        "approved": true,
        "dossier": "dossiers/cricketmodel.md"
      }
    },
    {
      "slug": "learning-erlang-otp",
      "title": "Learning Erlang and Elixir with a tutor",
      "what_it_does": "I had AI write me a course in two programming languages, Erlang and Elixir — 26 lessons I could run and change.",
      "plain_note": null,
      "glosses": [
        {
          "term": "Erlang/OTP",
          "gloss": "a language, plus toolkit, for always-on systems"
        },
        {
          "term": "Elixir",
          "gloss": "a newer language that runs on Erlang"
        },
        {
          "term": "multi-agent framework",
          "gloss": "software for many AIs working together"
        },
        {
          "term": "learnbiostats",
          "gloss": "my learning project on crop genetics"
        }
      ],
      "extra_routes": [],
      "subtitle": null,
      "date": "2026-01",
      "date_end": null,
      "order_hint": 0,
      "open_ended": false,
      "kind": "repo",
      "presentation": "point",
      "featured": false,
      "era": "agent",
      "phase": "p2",
      "archetype": "taught_me",
      "archetype_name": "Had AI teach me a hard subject",
      "url": null,
      "repo": "https://github.com/lyndonkl/learning-erlang-otp",
      "tools": [
        "Claude Code"
      ],
      "verdict": "A fun one, and similar to learnbiostats. What I was trying to do was interactive learning of Erlang and Elixir. I completed it end to end, got all the basics right, and learned the language well enough to get started programming in it. Another one where I used AI as a tutor. Through the exercise I also worked with AI on the original idea — building a multi-agent framework in Erlang — and learned that it didn't solve the kinds of problems I wanted to solve. I dropped that idea, but I came away with the language and the framework.",
      "taught_me": "Enough Erlang and Elixir to start writing it. And that the multi-agent framework I had in mind wasn't the right tool for my problems — which I found out by working it through with AI rather than by building it first.",
      "taught_me_blank": false,
      "ai_reach": null,
      "secondary_archetype_note": null,
      "in_service": null,
      "markers": [
        {
          "type": "craft_thread",
          "display": "glyph",
          "thread": "cheap-no",
          "position": 2,
          "confirmed": true
        },
        {
          "type": "craft_thread",
          "display": "glyph",
          "thread": "domain-tutor",
          "position": 4,
          "confirmed": true
        }
      ],
      "craft_threads": [
        {
          "thread": "cheap-no",
          "position": 2,
          "confirmed": true
        },
        {
          "thread": "domain-tutor",
          "position": 4,
          "confirmed": true
        }
      ],
      "thread_refs": [
        {
          "thread": "substrate",
          "role": "carried_into"
        }
      ],
      "prose_notes": [],
      "media": null,
      "provenance": {
        "interviewed": "2026-08-01",
        "approved": true,
        "dossier": "dossiers/learning-erlang-otp.md"
      }
    },
    {
      "slug": "medgemmachallenge",
      "title": "Biomarkers from a biopsy slide",
      "what_it_does": "Reads a photo of bowel-cancer tissue, predicts what an expensive lab test would say, and suggests drugs.",
      "plain_note": "The slides come from a free public cancer archive, and the model reads each one as thousands of tiles.",
      "glosses": [
        {
          "term": "biomarkers",
          "gloss": "chemical clues in tissue that guide cancer treatment"
        },
        {
          "term": "biopsy slide",
          "gloss": "a sliver of tissue on a glass slide"
        },
        {
          "term": "TCGA",
          "gloss": "a free public archive of cancer tissue data"
        },
        {
          "term": "RunPod",
          "gloss": "a service renting powerful computers by the hour"
        },
        {
          "term": "MedGemma",
          "gloss": "Google's free AI model for medical work"
        },
        {
          "term": "Google HAI-DEF models",
          "gloss": "Google's free AI models for health data"
        },
        {
          "term": "multi-instance classifier",
          "gloss": "judges a whole slide from thousands of tiles"
        },
        {
          "term": "oncology",
          "gloss": "cancer medicine"
        },
        {
          "term": "Kaggle competition",
          "gloss": "an online contest for data-science problems"
        },
        {
          "term": "scrollytelling",
          "gloss": "a story that unfolds as you scroll down"
        },
        {
          "term": "UI",
          "gloss": "the screens a person actually clicks through"
        },
        {
          "term": "deep learning",
          "gloss": "software that learns patterns from many examples"
        },
        {
          "term": "Vite",
          "gloss": "a tool that builds website code"
        }
      ],
      "extra_routes": [],
      "subtitle": null,
      "date": "2026-02",
      "date_end": null,
      "order_hint": 0,
      "open_ended": false,
      "kind": "live",
      "presentation": "point",
      "featured": true,
      "era": "agent",
      "phase": "p2",
      "archetype": "machines",
      "archetype_name": "Jobs I handed to a team of AI agents",
      "url": "https://lyndonkl.github.io/medgemmachallenge/",
      "repo": "https://github.com/lyndonkl/medgemmachallenge",
      "tools": [
        "Claude Code with custom agents",
        "MedGemma",
        "Google HAI-DEF models",
        "RunPod"
      ],
      "verdict": "An amazing project. I did it for the Kaggle competition, and everything was done end to end with my custom agents: brainstorming what to build, researching the domain itself — oncology, its pain points, and the technology there today — pulling the slide data from TCGA, building the model to train a multi-instance classifier, designing the UI and how to present the information, running MedGemma and the various open-source Google healthcare models on RunPod for specific tasks, and deploying the UI. The entire thing was managed end to end by AI, driven by me. This was the first project where I brought multiple agents together — for brainstorming, estimation, understanding a domain, design, deep learning geometry, deep learning architecture, and cognitive design. It was the first project where I really started leveraging the power of multi-agent co-human development.",
      "taught_me": "This is where I started really working with multiple specialist agents. They brought in knowledge from various domains — agents I'd built to learn with, or designed from books I'd read. That let me work on this project much faster than I could have without them, because the encoded specialist knowledge was already there. I could lean on it to understand things, build things and design things.",
      "taught_me_blank": false,
      "ai_reach": null,
      "secondary_archetype_note": {
        "archetype": "shipped_explainers",
        "note": "It also counts as a web page that explains a hard idea. And as a model checked against a real answer: 89 biopsy slides from the public TCGA cancer archive. The model never saw those 89 while it was learning. The five-tab dashboard and the ten-scene scrolling story would each stand on their own."
      },
      "in_service": null,
      "markers": [
        {
          "type": "hinge",
          "display": "glyph",
          "note": "First project where I put several specialist agents on one job together, with me steering."
        },
        {
          "type": "craft_thread",
          "display": "glyph",
          "thread": "scrollytelling",
          "position": 3,
          "confirmed": true
        }
      ],
      "craft_threads": [
        {
          "thread": "scrollytelling",
          "position": 3,
          "confirmed": true
        }
      ],
      "thread_refs": [
        {
          "thread": "substrate",
          "role": "carried_into"
        }
      ],
      "prose_notes": [],
      "media": null,
      "provenance": {
        "interviewed": "2026-08-01",
        "approved": true,
        "dossier": "dossiers/medgemmachallenge.md"
      }
    },
    {
      "slug": "ipl2026forecasts",
      "title": "Forecasting IPL matches, with real money on it",
      "what_it_does": "Predicts who wins each Indian Premier League cricket match and bets real money when the odds look wrong. A contract pays $1 if it happens, so its price is the odds.",
      "plain_note": "Prices swing all through a match, so the same contract can be cheap one minute and expensive the next.",
      "glosses": [
        {
          "term": "IPL",
          "gloss": "India's big professional cricket league"
        },
        {
          "term": "Kalshi",
          "gloss": "a legal US exchange for betting on events"
        },
        {
          "term": "prediction market",
          "gloss": "a market where people bet on outcomes"
        },
        {
          "term": "Kelly fractions",
          "gloss": "a rule for how much to stake"
        },
        {
          "term": "an edge",
          "gloss": "when your odds beat the market's price"
        },
        {
          "term": "in-game price variance",
          "gloss": "prices swinging while the match is playing"
        },
        {
          "term": "substrate repo",
          "gloss": "my own library of reusable AI agents"
        },
        {
          "term": "multi-agent team",
          "gloss": "several AI agents, each with one job"
        }
      ],
      "extra_routes": [],
      "subtitle": null,
      "date": "2026-03",
      "date_end": "2026-04",
      "order_hint": 0,
      "open_ended": false,
      "kind": "repo",
      "presentation": "point",
      "featured": false,
      "era": "agent",
      "phase": "p2",
      "archetype": "machines",
      "archetype_name": "Jobs I handed to a team of AI agents",
      "url": null,
      "repo": "https://github.com/lyndonkl/ipl2026forecasts",
      "tools": [
        "Claude Code",
        "multi-agent team built from my reusable agents",
        "Kalshi"
      ],
      "verdict": "The first project where I put my agents to use and traded real money on them. I designed a multi-agent team using agents from my Claude repository to analyse and forecast IPL matches — player performances, data, web search — and I let the agents learn from their own history, which was logged. I acted on the analysis that came through. I learned a lot, because I had never bought a Kalshi contract before this, and I had never bet in my life. It taught me how to understand sports markets on Kalshi, how to read odds, how to tell whether you actually have an edge, how much to stake when you do (Kelly fractions), and how to stay disciplined buying contracts against in-game price variance.",
      "taught_me": "The agents were never meant to teach me any of that. They were designed to do game-by-game analysis, and I learned through the process of using them. This is the first project that showed me AI can genuinely teach you to do something when you encode knowledge from your own domains and then carry it into a parallel one.",
      "taught_me_blank": false,
      "ai_reach": null,
      "secondary_archetype_note": null,
      "in_service": null,
      "markers": [
        {
          "type": "hinge",
          "display": "glyph",
          "note": "First project where I traded real money on agent output."
        }
      ],
      "craft_threads": [],
      "thread_refs": [
        {
          "thread": "kalshi",
          "role": "origin"
        },
        {
          "thread": "learning-byproduct",
          "role": "origin"
        },
        {
          "thread": "substrate",
          "role": "carried_into"
        },
        {
          "thread": "superforecaster",
          "role": "carried_into"
        }
      ],
      "prose_notes": [],
      "media": null,
      "provenance": {
        "interviewed": "2026-08-01",
        "approved": true,
        "dossier": "dossiers/ipl2026forecasts.md"
      }
    },
    {
      "slug": "allbirdsanalysis",
      "title": "A ten-agent dialectical valuation",
      "what_it_does": "Ten AI analysts argue what Allbirds shares are worth after the shoe company suddenly turned itself into an AI company.",
      "plain_note": null,
      "glosses": [
        {
          "term": "dialectical",
          "gloss": "two sides arguing on purpose, then compared"
        },
        {
          "term": "valuation",
          "gloss": "working out what a company is worth"
        },
        {
          "term": "Aswath Damodaran",
          "gloss": "a finance professor who teaches company valuation"
        },
        {
          "term": "corporate finance",
          "gloss": "how companies raise and spend their money"
        },
        {
          "term": "cognitive design architect",
          "gloss": "an agent that makes information easy to read"
        },
        {
          "term": "DCF",
          "gloss": "what a company's future cash is worth today"
        },
        {
          "term": "scrollytelling",
          "gloss": "a story that unfolds as you scroll down"
        }
      ],
      "extra_routes": [],
      "subtitle": null,
      "date": "2026-04",
      "date_end": null,
      "order_hint": 0,
      "open_ended": false,
      "kind": "live",
      "presentation": "point",
      "featured": true,
      "era": "agent",
      "phase": "p3",
      "archetype": "machines",
      "archetype_name": "Jobs I handed to a team of AI agents",
      "url": "https://lyndonkl.github.io/allbirdsanalysis/",
      "repo": "https://github.com/lyndonkl/allbirdsanalysis",
      "tools": [
        "Claude Code",
        "ten-agent dialectical team",
        "cognitive design architect agent"
      ],
      "verdict": "A fun project. I designed a series of agents based on Aswath Damodaran's online courses on corporate finance and valuation, and put them to work alongside a cognitive design architect. The goal was to see three things: how well AI could pull data, how well the agents could run a financial analysis from that data, and how well they could present it in a coherent format. The page itself is the visible byproduct — it's what lets you judge whether they managed it.",
      "taught_me": "This was the first instance where AI could pull data, use it to run an analysis, and then present that in a coherent form. The intermediate outputs were vastly different formats — one numerical, one long-form prose and reports — but the final output was pitched at precisely the right level for a human reviewer. That mattered to me, because AI output is genuinely hard to review with all the intermediate text it generates.",
      "taught_me_blank": false,
      "ai_reach": null,
      "secondary_archetype_note": {
        "archetype": "shipped_explainers",
        "note": "It reads as a page that explains something, and it moves as you scroll. But I call the page a by-product. The team of agents is the point, and the page exists to show what they found."
      },
      "in_service": null,
      "markers": [
        {
          "type": "craft_thread",
          "display": "glyph",
          "thread": "scrollytelling",
          "position": 4,
          "confirmed": true
        }
      ],
      "craft_threads": [
        {
          "thread": "scrollytelling",
          "position": 4,
          "confirmed": true
        }
      ],
      "thread_refs": [
        {
          "thread": "substrate",
          "role": "carried_into"
        }
      ],
      "prose_notes": [],
      "media": null,
      "provenance": {
        "interviewed": "2026-08-01",
        "approved": true,
        "dossier": "dossiers/allbirdsanalysis.md",
        "needs_confirm": "Spelling of 'Aswath Damodaran' — transcribed from speech, not yet confirmed by the owner."
      }
    },
    {
      "slug": "investing-notebook",
      "title": "A macro analysis pipeline, fanned out",
      "what_it_does": "Traces big economic trends down to the companies they affect, works out what thirty are worth, and ranks them.",
      "plain_note": null,
      "glosses": [
        {
          "term": "fan-out",
          "gloss": "splitting one job across many agents at once"
        },
        {
          "term": "fan-in",
          "gloss": "pulling all their answers back together"
        },
        {
          "term": "orchestrator",
          "gloss": "the agent that hands work to other agents"
        },
        {
          "term": "parallelisation",
          "gloss": "many agents working at the same time"
        },
        {
          "term": "macroeconomic factors",
          "gloss": "big forces like interest rates and oil prices"
        },
        {
          "term": "valuations",
          "gloss": "estimates of what a company is worth"
        },
        {
          "term": "DCF",
          "gloss": "what a company's future cash is worth today"
        },
        {
          "term": "portfolio construction",
          "gloss": "deciding what to buy and how much"
        },
        {
          "term": "ETFs",
          "gloss": "a single fund holding many companies' shares"
        },
        {
          "term": "the prompt",
          "gloss": "the written instructions you give the AI"
        }
      ],
      "extra_routes": [],
      "subtitle": null,
      "date": "2026-05",
      "date_end": null,
      "order_hint": 0,
      "open_ended": false,
      "kind": "repo",
      "presentation": "point",
      "featured": false,
      "era": "agent",
      "phase": "p3",
      "archetype": "machines",
      "archetype_name": "Jobs I handed to a team of AI agents",
      "url": null,
      "repo": "https://github.com/lyndonkl/investing-notebook",
      "tools": [
        "Claude Code",
        "many agents running in parallel"
      ],
      "verdict": "A really interesting one. This is my notebook for doing end-to-end macro analysis. It's the first project where I have a controller that splits the work across many AI agents running at once — the orchestrator prompt controls how information should flow through a graph of parallelised agents, when it should come in, and what output should go where. The goal is portfolio construction: an internal analysis of macroeconomic factors, which industries those factors impact, then the companies likely to be affected run through valuations, and a potential portfolio report out the other end. I use it as a guide. I've not bought the portfolio as it stands, but I use the report to pick companies, or ETFs that hold a subset of them.",
      "taught_me": "That you could split work across many agents, gather it all back, and run a real investment pipeline on it.",
      "taught_me_blank": false,
      "ai_reach": null,
      "secondary_archetype_note": null,
      "in_service": "I use the report as a guide to pick companies, or ETFs holding a subset of them.",
      "markers": [
        {
          "type": "hinge",
          "display": "glyph",
          "note": "First time one set of instructions split a job across many agents running at once. It also said exactly how their answers should come back together."
        }
      ],
      "craft_threads": [],
      "thread_refs": [
        {
          "thread": "fan-out",
          "role": "origin"
        },
        {
          "thread": "substrate",
          "role": "carried_into"
        },
        {
          "thread": "superforecaster",
          "role": "carried_into"
        }
      ],
      "prose_notes": [],
      "media": null,
      "provenance": {
        "interviewed": "2026-08-01",
        "approved": true,
        "dossier": "dossiers/investing-notebook.md"
      }
    },
    {
      "slug": "learnbiostats",
      "title": "A learning machine for crop genetics",
      "what_it_does": "A course that teaches the genetics of breeding better crops, run by AI tutors that quiz you and set exercises.",
      "plain_note": "Genes come in versions; the course covers which versions get passed on, and how much traits vary.",
      "glosses": [
        {
          "term": "crop genetics",
          "gloss": "the genes that decide how crops grow"
        },
        {
          "term": "biostatistics",
          "gloss": "statistics for biology and medicine"
        },
        {
          "term": "Socratic",
          "gloss": "teaching by asking questions instead of lecturing"
        },
        {
          "term": "spaced repetition",
          "gloss": "re-asking a fact just before you forget"
        },
        {
          "term": "alleles",
          "gloss": "the different versions one gene can take"
        },
        {
          "term": "crossover",
          "gloss": "when paired chromosomes swap matching pieces"
        },
        {
          "term": "recombination",
          "gloss": "the new gene mixtures that swapping creates"
        },
        {
          "term": "variance at a population level",
          "gloss": "how much a trait varies across a group"
        },
        {
          "term": "Opus 4.8 (1M context)",
          "gloss": "a Claude model that holds huge documents"
        },
        {
          "term": "GNN",
          "gloss": "a model that learns from networks of connections"
        },
        {
          "term": "PyTorch Geometric",
          "gloss": "a free code library for network-shaped data"
        },
        {
          "term": "Triton",
          "gloss": "a language for programming graphics chips directly"
        },
        {
          "term": "Erlang/OTP",
          "gloss": "a language built for systems that never stop"
        },
        {
          "term": "TCGA",
          "gloss": "a public database of cancer genetics"
        }
      ],
      "extra_routes": [],
      "subtitle": null,
      "date": "2026-05",
      "date_end": null,
      "order_hint": 0,
      "open_ended": false,
      "kind": "live",
      "presentation": "point",
      "featured": true,
      "era": "agent",
      "phase": "p3",
      "archetype": "taught_me",
      "archetype_name": "Had AI teach me a hard subject",
      "url": "https://lyndonkl.github.io/learnbiostats/",
      "repo": "https://github.com/lyndonkl/learnbiostats",
      "tools": [
        "Claude Code",
        "Opus 4.8 (1M context)",
        "custom biostat-* agents",
        "Workflow scripts"
      ],
      "verdict": "This was a project to teach me biostatistics, and it actually worked really well. I did the first two modules and learned about crossover, recombination, alleles, and how to measure variance at a population level. The interactive nature of the course was teaching me a lot. I just didn't have the bandwidth to go through all five phases. The interface was the structure it generated — a modular, incremental, Socratic process. It worked because the AI could sense when I was forgetting something. I could go back to a previous topic to remember things, or forward to the right next module, which I can't do in a traditional course. It would create sample datasets or pull real ones for me to analyse.",
      "taught_me": "Real genetics, not just a system that could teach it: crossover, recombination, alleles, and how to measure variance at a population level. I cross-checked it later against Yale and Stanford course material and everything held up. The spaced repetition is why it stuck — it gave me exercises, asked me questions, and made me recap.",
      "taught_me_blank": false,
      "ai_reach": null,
      "secondary_archetype_note": null,
      "in_service": null,
      "markers": [
        {
          "type": "craft_thread",
          "display": "glyph",
          "thread": "domain-tutor",
          "position": 5,
          "confirmed": true
        }
      ],
      "craft_threads": [
        {
          "thread": "domain-tutor",
          "position": 5,
          "confirmed": true
        }
      ],
      "thread_refs": [
        {
          "thread": "substrate",
          "role": "carried_into"
        }
      ],
      "prose_notes": [],
      "media": null,
      "provenance": {
        "interviewed": "2026-08-01",
        "approved": true,
        "dossier": "dossiers/learnbiostats.md"
      }
    },
    {
      "slug": "papersynthesis",
      "title": "Turning a research question into a written digest",
      "what_it_does": "Turns one research question into many searches, collects the newest scientific papers, reads them, and writes one combined summary.",
      "plain_note": null,
      "glosses": [
        {
          "term": "query expansion",
          "gloss": "turning one question into many different searches"
        },
        {
          "term": "fan-out",
          "gloss": "splitting one job across many agents at once"
        },
        {
          "term": "fan-in",
          "gloss": "pulling all their answers back together"
        },
        {
          "term": "synthesised digest",
          "gloss": "one summary written from many papers"
        },
        {
          "term": "parallel lanes",
          "gloss": "several searches running side by side"
        },
        {
          "term": "retrieval",
          "gloss": "how software finds the right documents"
        },
        {
          "term": "analytical reading pass",
          "gloss": "reading a paper closely, not just skimming"
        }
      ],
      "extra_routes": [],
      "subtitle": null,
      "date": "2026-05",
      "date_end": null,
      "order_hint": 1,
      "open_ended": false,
      "kind": "repo",
      "presentation": "point",
      "featured": false,
      "era": "agent",
      "phase": "p3",
      "archetype": "machines",
      "archetype_name": "Jobs I handed to a team of AI agents",
      "url": null,
      "repo": "https://github.com/lyndonkl/papersynthesis",
      "tools": [
        "Claude Code",
        "many agents running in parallel"
      ],
      "verdict": "Similar to the investing notebook — I did both around the same time, and they use a lot of the same techniques. It takes a high-level query, something like \"tell me what's happening in retrieval over the last six months.\" It does query expansion, fans out into parallel lanes for agents to pull specific papers against their expanded queries, summarises the main points, does an analytical reading pass, then fans back in and synthesises a report out of it.",
      "taught_me": "This is where I started splitting work across many agents and gathering it back, all the time.",
      "taught_me_blank": false,
      "ai_reach": null,
      "secondary_archetype_note": null,
      "in_service": null,
      "markers": [],
      "craft_threads": [],
      "thread_refs": [
        {
          "thread": "fan-out",
          "role": "carried_into"
        },
        {
          "thread": "substrate",
          "role": "carried_into"
        }
      ],
      "prose_notes": [],
      "media": null,
      "provenance": {
        "interviewed": "2026-08-01",
        "approved": true,
        "dossier": "dossiers/papersynthesis.md"
      }
    },
    {
      "slug": "gpuprogramming",
      "title": "A week with GPU kernels",
      "what_it_does": "A team of AI agents teaches me to program GPUs, the chips that run AI, by walking me into deliberate mistakes.",
      "plain_note": null,
      "glosses": [
        {
          "term": "GPU",
          "gloss": "the chip that runs graphics and AI"
        },
        {
          "term": "kernel",
          "gloss": "a small program that runs on the GPU"
        },
        {
          "term": "Triton",
          "gloss": "a simpler language for writing GPU code"
        },
        {
          "term": "Erlang (the Erlang project)",
          "gloss": "a programming language built for never-crashing systems"
        },
        {
          "term": "learnbiostats",
          "gloss": "my crop-genetics learning project on this page"
        }
      ],
      "extra_routes": [],
      "subtitle": null,
      "date": "2026-05",
      "date_end": null,
      "order_hint": 2,
      "open_ended": false,
      "kind": "repo",
      "presentation": "point",
      "featured": false,
      "era": "agent",
      "phase": "p3",
      "archetype": "taught_me",
      "archetype_name": "Had AI teach me a hard subject",
      "url": null,
      "repo": "https://github.com/lyndonkl/gpuprogramming",
      "tools": [
        "Claude Code",
        "multi-agent tutor"
      ],
      "verdict": "Similar to learnbiostats and the Erlang project. I designed a similar learning system, and very quickly — within the first week — realised this is not for me. I was quite bored by what GPU programming actually involves. It was still helpful: it saved me from spending money or time on books and resources, and it gave me a good sense of what it's like to wet my feet.",
      "taught_me": "That a week with a learning system is a cheap way to find out a subject isn't for you.",
      "taught_me_blank": false,
      "ai_reach": null,
      "secondary_archetype_note": null,
      "in_service": null,
      "markers": [
        {
          "type": "craft_thread",
          "display": "glyph",
          "thread": "cheap-no",
          "position": 3,
          "confirmed": true
        },
        {
          "type": "craft_thread",
          "display": "prose_only",
          "thread": "domain-tutor",
          "position": 6,
          "confirmed": false
        }
      ],
      "craft_threads": [
        {
          "thread": "cheap-no",
          "position": 3,
          "confirmed": true
        },
        {
          "thread": "domain-tutor",
          "position": 6,
          "confirmed": false
        }
      ],
      "thread_refs": [
        {
          "thread": "substrate",
          "role": "carried_into"
        }
      ],
      "prose_notes": [],
      "media": null,
      "provenance": {
        "interviewed": "2026-08-01",
        "approved": true,
        "dossier": "dossiers/gpuprogramming.md"
      }
    },
    {
      "slug": "aiengconf",
      "title": "A schedule builder for the World's Fair",
      "what_it_does": "Reads all 556 sessions at a four-day AI conference, asks a few either-or questions, then builds your day-by-day schedule.",
      "plain_note": null,
      "glosses": [
        {
          "term": "World's Fair",
          "gloss": "a four-day AI conference in San Francisco"
        },
        {
          "term": "fan-out",
          "gloss": "splitting one job across many agents at once"
        },
        {
          "term": "agent pipeline",
          "gloss": "several AI programs run in a fixed order"
        },
        {
          "term": "MCP server",
          "gloss": "a plug-in that gives an AI new tools"
        },
        {
          "term": "GraphRAG",
          "gloss": "answering questions from a linked map of facts"
        },
        {
          "term": "RunPod",
          "gloss": "a service that rents graphics cards hourly"
        },
        {
          "term": "DDP",
          "gloss": "training one model across several graphics cards"
        },
        {
          "term": "Vite",
          "gloss": "a tool that builds and previews web pages"
        }
      ],
      "extra_routes": [],
      "subtitle": null,
      "date": "2026-06",
      "date_end": null,
      "order_hint": 0,
      "open_ended": false,
      "kind": "repo",
      "presentation": "point",
      "featured": false,
      "era": "agent",
      "phase": "p3",
      "archetype": "machines",
      "archetype_name": "Jobs I handed to a team of AI agents",
      "url": null,
      "repo": "https://github.com/lyndonkl/aiengconf",
      "tools": [
        "Claude Code",
        "four-stage agent pipeline"
      ],
      "verdict": "This was for the AI Engineer World's Fair 2026 in San Francisco. I used it to plan which talks and sessions I wanted to go to. Nothing major to see here — it's on the page mostly so people know I attended.",
      "taught_me": null,
      "taught_me_blank": true,
      "ai_reach": null,
      "secondary_archetype_note": null,
      "in_service": null,
      "markers": [],
      "craft_threads": [],
      "thread_refs": [
        {
          "thread": "fan-out",
          "role": "carried_into"
        },
        {
          "thread": "substrate",
          "role": "carried_into"
        }
      ],
      "prose_notes": [],
      "media": null,
      "provenance": {
        "interviewed": "2026-08-01",
        "approved": true,
        "dossier": "dossiers/aiengconf.md"
      }
    },
    {
      "slug": "iplprogress",
      "title": "Every Ball Ever",
      "what_it_does": "Draws all 316,199 balls ever bowled in India's pro cricket leagues as dots, and shows how the game changed since 2008.",
      "plain_note": "In a dynamic workflow the AI decides its own steps; it is told what is wanted, not how.",
      "glosses": [
        {
          "term": "scrollytelling",
          "gloss": "a story that unfolds as you scroll"
        },
        {
          "term": "unit visualisation",
          "gloss": "one dot stands for one real thing"
        },
        {
          "term": "object constancy",
          "gloss": "the same dots move instead of being redrawn"
        },
        {
          "term": "dynamic workflows",
          "gloss": "agents work out their own steps"
        },
        {
          "term": "orchestration",
          "gloss": "deciding which agent does what, and when"
        },
        {
          "term": "IPL",
          "gloss": "India's main professional cricket league"
        },
        {
          "term": "WPL",
          "gloss": "India's women's professional cricket league"
        },
        {
          "term": "Fable",
          "gloss": "one of the Claude AI models"
        },
        {
          "term": "grill-me skill",
          "gloss": "a prompt that interrogates you before starting"
        }
      ],
      "extra_routes": [],
      "subtitle": null,
      "date": "2026-07",
      "date_end": null,
      "order_hint": 1,
      "open_ended": false,
      "kind": "live",
      "presentation": "point",
      "featured": true,
      "era": "agent",
      "phase": "p3",
      "archetype": "shipped_explainers",
      "archetype_name": "Web pages that explain a hard idea",
      "url": "https://lyndonkl.github.io/iplprogress/",
      "repo": "https://github.com/lyndonkl/iplprogress",
      "tools": [
        "Claude Code",
        "Claude Fable, planning its own work"
      ],
      "verdict": "A really cool project, and where I started letting the AI plan its own work — instead of me setting out every step, and stepping out of the specifics. I forced myself to think in abstract terms about what a project would need. The goal was to pull all the data for every single IPL and get AI to analyse how the game has changed, and I wanted it visualised in a cool new format, because I'm a fan of scrollytelling. Data journalism taught me about unit visualisation with object constancy, which I'd never known before. It produced some extremely valuable insights about the IPL. I thought it was a great success, because it was the first time I could see AI take a generic high-level prompt and a set of questions and run with it. It's also where I started using the grill-me skill to ask me a ton of questions about what I actually wanted out of it. It ran end to end — a multi-hour run, more than nine hours.",
      "taught_me": "Unit visualisation with object constancy, which I'd never come across before. And that a high-level prompt plus the right questions was now enough — I didn't have to specify the orchestration.",
      "taught_me_blank": false,
      "ai_reach": null,
      "secondary_archetype_note": null,
      "in_service": null,
      "markers": [
        {
          "type": "hinge",
          "display": "glyph",
          "note": "Where I stopped writing the plumbing myself. I described what the project needed and let the agents work out the order for themselves."
        },
        {
          "type": "craft_thread",
          "display": "glyph",
          "thread": "scrollytelling",
          "position": 5,
          "confirmed": true
        }
      ],
      "craft_threads": [
        {
          "thread": "scrollytelling",
          "position": 5,
          "confirmed": true
        }
      ],
      "thread_refs": [
        {
          "thread": "constrained-question",
          "role": "carried_into"
        },
        {
          "thread": "substrate",
          "role": "carried_into"
        }
      ],
      "prose_notes": [],
      "media": null,
      "provenance": {
        "interviewed": "2026-08-01",
        "approved": true,
        "dossier": "dossiers/iplprogress.md"
      }
    },
    {
      "slug": "understandingsoccer",
      "title": "The Two Meanings of 26¢",
      "what_it_does": "A page explaining how betting-market prices work, using a World Cup bet that cost 26 cents twice and meant opposite things.",
      "plain_note": "A hypothesis is a hunch about what moves prices, and testing one means checking it against the data.",
      "glosses": [
        {
          "term": "Kalshi",
          "gloss": "a market where people bet on real events"
        },
        {
          "term": "contract",
          "gloss": "a bet that pays $1 if it happens"
        },
        {
          "term": "prediction market",
          "gloss": "a market whose prices work as odds"
        },
        {
          "term": "hypothesis generation",
          "gloss": "coming up with hunches worth checking"
        },
        {
          "term": "hypothesis testing",
          "gloss": "checking a hunch against the actual data"
        },
        {
          "term": "MediaPipe",
          "gloss": "Google's free tool for tracking bodies in video"
        }
      ],
      "extra_routes": [],
      "subtitle": null,
      "date": "2026-07",
      "date_end": null,
      "order_hint": 2,
      "open_ended": false,
      "kind": "live",
      "presentation": "point",
      "featured": true,
      "era": "agent",
      "phase": "p3",
      "archetype": "shipped_explainers",
      "archetype_name": "Web pages that explain a hard idea",
      "url": "https://lyndonkl.github.io/understandingsoccer/",
      "repo": "https://github.com/lyndonkl/understandingsoccer",
      "tools": [
        "Claude Code",
        "Claude Fable, planning its own work"
      ],
      "verdict": "A similar project. The high-level goal was to pull all the Kalshi contracts and give me insights. This is what set me up to realise that AI has arrived. What I got out of these two projects was massive data analysis, hypothesis generation, hypothesis testing, visualisation, report generation, dashboards, scrollytelling — and all of the orchestration changing without me giving directives to the project.",
      "taught_me": "That I now need to use everything I've learned to start asking extremely pointed questions of AI, to see what the research gives me back. These two projects are laying the foundation for what comes next in my work.",
      "taught_me_blank": false,
      "ai_reach": null,
      "secondary_archetype_note": null,
      "in_service": null,
      "markers": [
        {
          "type": "craft_thread",
          "display": "glyph",
          "thread": "scrollytelling",
          "position": 6,
          "confirmed": true
        }
      ],
      "craft_threads": [
        {
          "thread": "scrollytelling",
          "position": 6,
          "confirmed": true
        }
      ],
      "thread_refs": [
        {
          "thread": "constrained-question",
          "role": "carried_into"
        },
        {
          "thread": "kalshi",
          "role": "carried_into"
        },
        {
          "thread": "substrate",
          "role": "carried_into"
        }
      ],
      "prose_notes": [],
      "media": null,
      "provenance": {
        "interviewed": "2026-08-01",
        "approved": true,
        "dossier": "dossiers/understandingsoccer.md"
      }
    },
    {
      "slug": "chipandadmarketresearch",
      "title": "What it costs to train a model, and who set the price of an ad",
      "what_it_does": "Answers two specific money questions: what it costs to train an AI model, and how the US advertising market decided its own prices.",
      "plain_note": null,
      "glosses": [],
      "extra_routes": [
        {
          "label": "The Economics of Intelligence",
          "url": "https://lyndonkl.github.io/chipandadmarketresearch/p1/"
        },
        {
          "label": "Who Holds the Yardstick",
          "url": "https://lyndonkl.github.io/chipandadmarketresearch/p2-v2/"
        }
      ],
      "subtitle": null,
      "date": "2026-07",
      "date_end": "2026-08",
      "order_hint": 3,
      "open_ended": false,
      "kind": "live",
      "presentation": "point",
      "featured": true,
      "era": "agent",
      "phase": "p3",
      "archetype": "shipped_explainers",
      "archetype_name": "Web pages that explain a hard idea",
      "url": "https://lyndonkl.github.io/chipandadmarketresearch/",
      "repo": "https://github.com/lyndonkl/chipandadmarketresearch",
      "tools": [
        "Claude Code"
      ],
      "verdict": "One of the last projects here, and where I pushed on AI capability by giving it specific questions to answer rather than open-ended research like the IPL or the FIFA contracts. I combined two. The first was the chip and training-cost market: what it actually costs to train a model, broken into data-centre electricity, personnel, data quality, data-gathering fees, licensing fees and inference costs. The second was the advertising market: its history, who the buyers were, who the sellers were, how much money went through it, who decided the price, and how audiences were understood. To answer them I let the model go and find the sources itself, but across a very constrained search space, and I built a knowledge graph out of what it found. Then I allowed unconstrained explanation within that knowledge graph, and that is what generated the second article.",
      "taught_me": "The tool doesn't set the ceiling — you do. AI is as good as the best person using it and as bad as the worst. The strange part is that the same person can be at either end of that range on any given day. It comes down to how creatively you decide to use it.",
      "taught_me_blank": false,
      "ai_reach": null,
      "secondary_archetype_note": null,
      "in_service": null,
      "markers": [
        {
          "type": "craft_thread",
          "display": "glyph",
          "thread": "scrollytelling",
          "position": 7,
          "confirmed": true
        }
      ],
      "craft_threads": [
        {
          "thread": "scrollytelling",
          "position": 7,
          "confirmed": true
        }
      ],
      "thread_refs": [
        {
          "thread": "constrained-question",
          "role": "origin"
        },
        {
          "thread": "substrate",
          "role": "carried_into"
        }
      ],
      "prose_notes": [],
      "media": null,
      "provenance": {
        "interviewed": "2026-08-02",
        "approved": true,
        "dossier": "dossiers/chipandadmarketresearch.md"
      }
    },
    {
      "slug": "fifaworldcup2026",
      "title": "Regulation Time",
      "what_it_does": "Retells the 2026 World Cup through the $12.8 billion people bet on it, drawing every $75,000 traded as one dot.",
      "plain_note": "A market is well calibrated when its prices match how often those things actually happen.",
      "glosses": [
        {
          "term": "Regulation Time",
          "gloss": "football's ninety minutes, before any extra time"
        },
        {
          "term": "tick-level data",
          "gloss": "every single trade, one at a time"
        },
        {
          "term": "well calibrated",
          "gloss": "its odds match how often things happen"
        },
        {
          "term": "volume",
          "gloss": "how much money changes hands"
        },
        {
          "term": "multi-agent",
          "gloss": "several AI programs working together on one job"
        },
        {
          "term": "gated pipeline",
          "gloss": "stages that stop for a check between each"
        },
        {
          "term": "hypotheses",
          "gloss": "hunches the data can support or kill"
        },
        {
          "term": "DCF",
          "gloss": "valuing a company by its future cash"
        }
      ],
      "extra_routes": [],
      "subtitle": null,
      "date": "2026-07",
      "date_end": null,
      "order_hint": 3,
      "open_ended": false,
      "kind": "live",
      "presentation": "point",
      "featured": true,
      "era": "agent",
      "phase": "p3",
      "archetype": "shipped_explainers",
      "archetype_name": "Web pages that explain a hard idea",
      "url": "https://lyndonkl.github.io/fifaworldcup2026/",
      "repo": "https://github.com/lyndonkl/fifaworldcup2026",
      "tools": [
        "Claude Code",
        "dynamic multi-agent workflows (Fable 5 + Opus 4.8)",
        "gated pipeline"
      ],
      "verdict": "This was the project where I leaned hardest on letting the AI plan its own work — and it ran end-to-end: pulled the tick-level data, analyzed it, generated its own hypotheses, tested them, and brought me plots showing which ones survived. Implementation, ownership, AI-driven analysis: all of it was great. My push is on value: out of everything it found, only three or four hypotheses made me think \"I need to watch for this on Kalshi next time.\" The AI could do it. Whether what it found was worth having is the part I'm still pushing on — and that's what I'm aiming at in the next projects.",
      "taught_me": "Trust contracts priced $0–$0.30 only when volume is high — that's where the market is well calibrated; avoid low-volume, low-price contracts. And watch how a contract on one game moves the price of a team that isn't playing in it.",
      "taught_me_blank": false,
      "ai_reach": null,
      "secondary_archetype_note": {
        "archetype": "machines",
        "note": "It also counts as a job handed to a team of AI agents. A team of them came up with its own hypotheses and tested them, stopping for a check between each stage. I filed it as a web page because all that machinery existed to get the page in front of a stranger."
      },
      "in_service": null,
      "markers": [
        {
          "type": "craft_thread",
          "display": "glyph",
          "thread": "scrollytelling",
          "position": 8,
          "confirmed": true
        }
      ],
      "craft_threads": [
        {
          "thread": "scrollytelling",
          "position": 8,
          "confirmed": true
        }
      ],
      "thread_refs": [
        {
          "thread": "constrained-question",
          "role": "carried_into"
        },
        {
          "thread": "fan-out",
          "role": "carried_into"
        },
        {
          "thread": "kalshi",
          "role": "carried_into"
        },
        {
          "thread": "substrate",
          "role": "carried_into"
        },
        {
          "thread": "superforecaster",
          "role": "carried_into"
        }
      ],
      "prose_notes": [],
      "media": null,
      "provenance": {
        "interviewed": "2026-08-01",
        "approved": true,
        "dossier": "dossiers/fifaworldcup2026.md"
      }
    }
  ],
  "threads": [
    {
      "id": "constrained-question",
      "name": "narrowing the question",
      "kind": "technique",
      "from": "chipandadmarketresearch",
      "to": [
        "iplprogress",
        "understandingsoccer",
        "fifaworldcup2026"
      ],
      "to_is_derived": false,
      "note": "The July 2026 pieces were open-ended: one paragraph from him, nine hours of running. This one narrows the question deliberately and searches a constrained space instead. The contrast is the point of the entry.",
      "closes": false,
      "closes_from": null,
      "closes_to": null
    },
    {
      "id": "ddp",
      "name": "training one model across several graphics cards",
      "kind": "technique",
      "from": "mol_protein_graphs",
      "to": [
        "cographnet",
        "cricketmodel"
      ],
      "to_is_derived": false,
      "note": "I learned this on RunPod while training the final Leash Belka models: splitting one training run across several graphics cards at once. I did not need it on that project, and I used it on both later model builds.",
      "closes": false,
      "closes_from": null,
      "closes_to": null
    },
    {
      "id": "fan-out",
      "name": "splitting one job across many agents at once",
      "kind": "technique",
      "from": "investing-notebook",
      "to": [
        "papersynthesis",
        "aiengconf",
        "fifaworldcup2026"
      ],
      "to_is_derived": false,
      "note": "It arrives in May 2026: one set of instructions that splits a job across many agents running at once. The same instructions say how their answers come back together. Everything after this is built that way.",
      "closes": false,
      "closes_from": null,
      "closes_to": null
    },
    {
      "id": "kalshi",
      "name": "betting on Kalshi, a prediction market",
      "kind": "technique",
      "from": "ipl2026forecasts",
      "to": [
        "understandingsoccer",
        "fifaworldcup2026"
      ],
      "to_is_derived": false,
      "note": "I had never bought a contract or placed a bet before March 2026. Everything I know about prediction markets starts here, and the betting rule I give on Regulation Time — my page on the 2026 World Cup betting markets — is where that line ends up.",
      "closes": false,
      "closes_from": null,
      "closes_to": null
    },
    {
      "id": "learning-byproduct",
      "name": "learning a subject by accident",
      "kind": "technique",
      "from": "ipl2026forecasts",
      "to": [],
      "to_is_derived": false,
      "note": "Different from the tutor thread, where teaching was the whole point. Here the agents were built to analyse cricket matches and taught me the betting market anyway. AI can teach you a subject sideways, when you take knowledge you already have and carry it into a field next door.",
      "closes": false,
      "closes_from": null,
      "closes_to": null
    },
    {
      "id": "runpod",
      "name": "renting graphics cards on RunPod",
      "kind": "technique",
      "from": "mol_protein_graphs",
      "to": [
        "cographnet",
        "cricketmodel"
      ],
      "to_is_derived": false,
      "note": "February 2025, on the CoGraphNet replication: AI helped me set up a rented graphics card and start training. It could not drive the machine itself. December 2025, on the cricket model: an agent set the run up, pushed the data across, trained, and watched the dashboard. It killed a run that had stopped learning and told me why. The gap I wrote down in February had closed by December.",
      "closes": true,
      "closes_from": "cographnet",
      "closes_to": "cricketmodel"
    },
    {
      "id": "substrate",
      "name": "the shared toolkit",
      "kind": "technique",
      "from": "claude-repo",
      "to": [
        "ai-structured-thinking-presentation",
        "mariah-3b-forecast",
        "cricketmodel",
        "learning-erlang-otp",
        "medgemmachallenge",
        "ipl2026forecasts",
        "allbirdsanalysis",
        "investing-notebook",
        "learnbiostats",
        "papersynthesis",
        "gpuprogramming",
        "aiengconf",
        "iplprogress",
        "understandingsoccer",
        "chipandadmarketresearch",
        "fifaworldcup2026"
      ],
      "to_is_derived": true,
      "note": "Every project from October 2025 onward is built out of the agents and skills in this one folder. Every single one, not most of them. That is why lines run from the bar up to each later project rather than the bar just sitting underneath them. It is the proof that the change was real and not only something I say.",
      "closes": false,
      "closes_from": null,
      "closes_to": null
    },
    {
      "id": "superforecaster",
      "name": "my forecasting agent",
      "kind": "technique",
      "from": "mariah-3b-forecast",
      "to": [
        "ipl2026forecasts",
        "fifaworldcup2026",
        "investing-notebook"
      ],
      "to_is_derived": false,
      "note": "This agent was born here, out of Phil Tetlock's book on forecasting. It is my clearest case of a way of thinking turning into something I could pick up and use again.",
      "closes": false,
      "closes_from": null,
      "closes_to": null
    }
  ],
  "craft_threads": [
    {
      "id": "cheap-no",
      "label": "Reaching a “no” cheaply",
      "is_page_feature": true,
      "note": "Three times I used AI to find out fast that something was not worth doing. Each one took days instead of months, and saved me the months. None of them is a failure. Most project pages cannot make the claim “it saved me from a wrong path”, because they only show you what shipped.",
      "members": [
        {
          "slug": "gemma-worker-wrapper",
          "position": 1,
          "date": "2025-03",
          "confirmed": true,
          "the_no": "Browser LLMs are too early to be useful yet.",
          "authored_position": 1
        },
        {
          "slug": "learning-erlang-otp",
          "position": 2,
          "date": "2026-01",
          "confirmed": true,
          "the_no": "A multi-agent framework in Erlang would not solve the problems I cared about.",
          "authored_position": 2
        },
        {
          "slug": "gpuprogramming",
          "position": 3,
          "date": "2026-05",
          "confirmed": true,
          "the_no": "GPU programming is not for me.",
          "authored_position": 3
        }
      ],
      "span": {
        "start": "2025-03",
        "end": "2026-05"
      },
      "published_n": 3,
      "confirmed_n": 3,
      "endpoints": {
        "first": "gemma-worker-wrapper",
        "latest": "gpuprogramming"
      }
    },
    {
      "id": "domain-tutor",
      "label": "AI teaching me a new subject",
      "is_page_feature": true,
      "note": "The thing that shows up most often across two years: AI getting me working in a subject I knew nothing about. It is there on the very first project and on nearly the last. Read it alongside the scrolling pages. Those show me getting better at something I already did. This shows me getting into subjects I could not have touched at all.",
      "members": [
        {
          "slug": "mol_protein_graphs",
          "position": 1,
          "date": "2024-06",
          "confirmed": true,
          "domain": "PyTorch Geometric, graph neural networks",
          "authored_position": 1
        },
        {
          "slug": "cographnet",
          "position": 2,
          "date": "2025-02",
          "confirmed": true,
          "domain": "reading a paper into a working architecture",
          "authored_position": 2
        },
        {
          "slug": "foodprediction",
          "position": 3,
          "date": "2025-07",
          "confirmed": true,
          "domain": "mass spectrometry",
          "authored_position": 3
        },
        {
          "slug": "learning-erlang-otp",
          "position": 4,
          "date": "2026-01",
          "confirmed": true,
          "domain": "Erlang and Elixir",
          "authored_position": 4
        },
        {
          "slug": "learnbiostats",
          "position": 5,
          "date": "2026-05",
          "confirmed": true,
          "domain": "ML-driven crop genetics",
          "authored_position": 5
        },
        {
          "slug": "gpuprogramming",
          "position": 6,
          "date": "2026-05",
          "confirmed": false,
          "domain": "Triton GPU programming",
          "authored_position": 6
        }
      ],
      "span": {
        "start": "2024-06",
        "end": "2026-05"
      },
      "published_n": 6,
      "confirmed_n": 5,
      "endpoints": {
        "first": "mol_protein_graphs",
        "latest": "learnbiostats"
      }
    },
    {
      "id": "scrollytelling",
      "label": "Pages that move as you scroll",
      "is_page_feature": true,
      "note": "Every one of these I have published, in the order I made them. If I got better at this, you should be able to see it. So open the first one and the newest one, and judge for yourself. It is the one claim on this page you can settle in two browser tabs instead of taking my word.",
      "members": [
        {
          "slug": "medgraphragpost",
          "position": 1,
          "date": "2025-07",
          "confirmed": true,
          "authored_position": 1
        },
        {
          "slug": "ai-structured-thinking-presentation",
          "position": 2,
          "date": "2025-11",
          "confirmed": true,
          "authored_position": 2
        },
        {
          "slug": "medgemmachallenge",
          "position": 3,
          "date": "2026-02",
          "confirmed": true,
          "authored_position": 3
        },
        {
          "slug": "allbirdsanalysis",
          "position": 4,
          "date": "2026-04",
          "confirmed": true,
          "authored_position": 4
        },
        {
          "slug": "iplprogress",
          "position": 5,
          "date": "2026-07",
          "confirmed": true,
          "authored_position": 5
        },
        {
          "slug": "understandingsoccer",
          "position": 6,
          "date": "2026-07",
          "confirmed": true,
          "authored_position": 6
        },
        {
          "slug": "chipandadmarketresearch",
          "position": 7,
          "date": "2026-07",
          "confirmed": true,
          "authored_position": 8
        },
        {
          "slug": "fifaworldcup2026",
          "position": 8,
          "date": "2026-07",
          "confirmed": true,
          "authored_position": 7
        }
      ],
      "span": {
        "start": "2025-07",
        "end": "2026-07"
      },
      "published_n": 8,
      "confirmed_n": 8,
      "endpoints": {
        "first": "medgraphragpost",
        "latest": "fifaworldcup2026"
      }
    }
  ],
  "exclusions": [
    {
      "slug": "ai_investment_value",
      "plain_name": "An AI investment-value analysis",
      "reason": "I never finished it, so it is not one of the twenty-three. I still name it in the toolkit write-up, because running it is one of the things the toolkit got used for.",
      "rule": "completed_only",
      "public": true
    },
    {
      "slug": "fhir-graph-predict",
      "plain_name": "A health-records prediction project",
      "reason": "I never completed it.",
      "rule": "completed_only",
      "public": true
    },
    {
      "slug": "nflprediction",
      "plain_name": "An NFL match predictor",
      "reason": "It never got anywhere.",
      "rule": "completed_only",
      "public": true
    },
    {
      "slug": "taggingexperiment",
      "plain_name": "A tagging experiment",
      "reason": "I left it out.",
      "rule": "owner_hold",
      "public": true
    }
  ],
  "page_glosses": [
    {
      "term": "fan-out",
      "gloss": "sending one job to many workers at once"
    },
    {
      "term": "Kalshi",
      "gloss": "a US market for betting on real events"
    },
    {
      "term": "TCGA",
      "gloss": "a public archive of cancer patients' tumour data"
    },
    {
      "term": "Triton",
      "gloss": "a language for writing graphics-card code yourself"
    },
    {
      "term": "Vite",
      "gloss": "a tool that packages code for the web"
    },
    {
      "term": "Erlang/OTP",
      "gloss": "a language built for always-on, fault-tolerant systems"
    },
    {
      "term": "DCF",
      "gloss": "estimating worth from expected future cash"
    }
  ],
  "counts": {
    "entries_published": 24,
    "archetypes": 7,
    "entries_by_archetype": {
      "models_outside_arbiter": 4,
      "shipped_explainers": 7,
      "machines": 6,
      "taught_me": 3,
      "reasoned_take": 1,
      "tools": 2,
      "substrate": 1
    },
    "entries_by_kind": {
      "live": 9,
      "repo": 15
    },
    "entries_by_era": {
      "agent": 18,
      "ide": 6
    },
    "entries_by_phase": {
      "p1": 7,
      "p2": 7,
      "p3": 10
    },
    "live_sites": 9,
    "markers_by_type": {
      "collaboration": 1,
      "craft_thread": 17,
      "hinge": 9,
      "still_open": 3
    },
    "threads": 8,
    "craft_threads": 3,
    "craft_thread_members": {
      "cheap-no": 3,
      "domain-tutor": 6,
      "scrollytelling": 8
    },
    "craft_thread_confirmed": {
      "cheap-no": 3,
      "domain-tutor": 5,
      "scrollytelling": 8
    },
    "exclusions": 4,
    "raters": 1,
    "externally_validated": 0,
    "numeric_judgements_published": 0
  }
}
