{"id":"18-harness","number":18,"slug":"harness-engineering","title":"Harness engineering: build the factory","short":"Harness engineering","module":"Scaling up","summary":"Harness engineering means: every time an agent makes a mistake, engineer it out of the system for good. OpenAI used it to ship a million lines with zero hand-written code. Learn the difference between soft and hard constraints, how to make your environment legible to agents, and why lights-off factories still fail.","voice":"Eric","scenes":[{"template":"title","chapter":"Intro","narration":"Mitchell Hashimoto describes his whole approach in one sentence. Anytime you find an agent makes a mistake, you take the time to engineer a solution, such that the agent never makes that mistake again. That's harness engineering.","params":{"kicker":"Lesson 18","module":"Module 4 · Scaling up","title":"Harness engineering: *build the factory*","subtitle":"Engineer mistakes out of the system, for good.","bubble":"Never again.","mood":"work"},"start":0.5,"dur":15.149,"words":[{"text":"Mitchell","s":0.8,"e":1.12},{"text":"Hashimoto","s":1.24,"e":1.76},{"text":"describes","s":1.88,"e":2.24},{"text":"his","s":2.32,"e":2.48},{"text":"whole","s":2.56,"e":2.72},{"text":"approach","s":2.88,"e":3.28},{"text":"in","s":3.4,"e":3.52},{"text":"one","s":3.6,"e":3.76},{"text":"sentence.","s":3.84,"e":4.64},{"text":"Anytime","s":4.96,"e":5.36},{"text":"you","s":5.44,"e":5.52},{"text":"find","s":5.6,"e":5.76},{"text":"an","s":5.84,"e":5.92},{"text":"agent","s":6,"e":6.24},{"text":"makes","s":6.32,"e":6.48},{"text":"a","s":6.52,"e":6.56},{"text":"mistake,","s":6.72,"e":7.44},{"text":"you","s":7.52,"e":7.6},{"text":"take","s":7.72,"e":7.84},{"text":"the","s":7.92,"e":8},{"text":"time","s":8.12,"e":8.24},{"text":"to","s":8.32,"e":8.4},{"text":"engineer","s":8.48,"e":8.88},{"text":"a","s":8.92,"e":8.96},{"text":"solution,","s":9.04,"e":9.92},{"text":"such","s":10,"e":10.24},{"text":"that","s":10.32,"e":10.4},{"text":"the","s":10.44,"e":10.48},{"text":"agent","s":10.56,"e":10.88},{"text":"never","s":11.12,"e":11.36},{"text":"makes","s":11.48,"e":11.6},{"text":"that","s":11.68,"e":11.76},{"text":"mistake","s":11.88,"e":12.16},{"text":"again.","s":12.36,"e":12.88},{"text":"That's","s":13.2,"e":13.52},{"text":"harness","s":13.6,"e":13.92},{"text":"engineering.","s":14,"e":14.8}]},{"template":"stack","chapter":"Inner and outer harness","narration":"Dex Horthy, following Martin Fowler's site, splits it into two parts. The inner harness is what your agent ships with: its loop, its tools, its system prompt. The outer harness is what you build around it: memory files, skills, commands, hooks, checks, and the way your codebase and dev environment are organized. You can't change the first much. The second is yours.","params":{"title":"Two harnesses","sub":"You own the outer one.","layers":[{"label":"Model","sub":"rented","tone":"ink","icon":"brain","at":"two parts"},{"label":"Inner harness","sub":"the agent's loop, tools, system prompt","tone":"soft","icon":"layers","at":"inner harness"},{"label":"Outer harness","sub":"memory, skills, hooks, checks, repo, dev env","tone":"agent","icon":"tool","at":"outer harness"},{"label":"You","sub":"steering","tone":"human","icon":"user","at":"yours"}]},"start":15.649,"dur":24.747,"words":[{"text":"Dex","s":15.949,"e":16.269},{"text":"Horthy,","s":16.309,"e":16.989},{"text":"following","s":17.069,"e":17.389},{"text":"Martin","s":17.469,"e":17.709},{"text":"Fowler's","s":17.789,"e":18.189},{"text":"site,","s":18.269,"e":18.669},{"text":"splits","s":18.749,"e":19.069},{"text":"it","s":19.109,"e":19.149},{"text":"into","s":19.229,"e":19.469},{"text":"two","s":19.549,"e":19.629},{"text":"parts.","s":19.709,"e":20.389},{"text":"The","s":20.669,"e":20.829},{"text":"inner","s":20.909,"e":21.069},{"text":"harness","s":21.149,"e":21.549},{"text":"is","s":21.629,"e":21.709},{"text":"what","s":21.789,"e":21.869},{"text":"your","s":21.949,"e":22.029},{"text":"agent","s":22.109,"e":22.429},{"text":"ships","s":22.509,"e":22.749},{"text":"with:","s":22.909,"e":23.389},{"text":"its","s":23.509,"e":23.629},{"text":"loop,","s":23.789,"e":24.109},{"text":"its","s":24.189,"e":24.269},{"text":"tools,","s":24.349,"e":24.909},{"text":"its","s":24.989,"e":25.069},{"text":"system","s":25.229,"e":25.389},{"text":"prompt.","s":25.469,"e":26.349},{"text":"The","s":26.469,"e":26.589},{"text":"outer","s":26.709,"e":26.829},{"text":"harness","s":26.909,"e":27.309},{"text":"is","s":27.389,"e":27.469},{"text":"what","s":27.549,"e":27.629},{"text":"you","s":27.709,"e":27.789},{"text":"build","s":27.869,"e":27.949},{"text":"around","s":28.029,"e":28.349},{"text":"it:","s":28.429,"e":28.909},{"text":"memory","s":29.069,"e":29.229},{"text":"files,","s":29.309,"e":29.949},{"text":"skills,","s":30.229,"e":30.669},{"text":"commands,","s":30.989,"e":31.469},{"text":"hooks,","s":31.669,"e":32.109},{"text":"checks,","s":32.309,"e":32.749},{"text":"and","s":32.829,"e":32.909},{"text":"the","s":32.949,"e":32.989},{"text":"way","s":33.069,"e":33.149},{"text":"your","s":33.229,"e":33.389},{"text":"codebase","s":33.549,"e":33.949},{"text":"and","s":34.029,"e":34.109},{"text":"dev","s":34.229,"e":34.349},{"text":"environment","s":34.589,"e":34.829},{"text":"are","s":34.909,"e":34.989},{"text":"organized.","s":35.069,"e":36.109},{"text":"You","s":36.189,"e":36.269},{"text":"can't","s":36.349,"e":36.509},{"text":"change","s":36.669,"e":36.829},{"text":"the","s":36.909,"e":36.989},{"text":"first","s":37.149,"e":37.309},{"text":"much.","s":37.389,"e":38.109},{"text":"The","s":38.189,"e":38.269},{"text":"second","s":38.549,"e":38.829},{"text":"is","s":38.909,"e":38.989},{"text":"yours.","s":39.069,"e":39.789}]},{"template":"stat","chapter":"The OpenAI experiment","narration":"How far can this go? OpenAI's Ryan Lopopolo describes a team that shipped a real internal product in five months: about a million lines of code, fifteen hundred pull requests, seven engineers, and zero lines written by hand. Humans steer. Agents execute.","params":{"items":[{"value":"~1M","label":"lines of code in 5 months","tone":"agent","at":"million lines"},{"value":"~1,500","label":"pull requests, 7 engineers","tone":"ink","at":"fifteen hundred"},{"value":0,"label":"lines written by hand","tone":"good","at":"zero"}],"src":"Ryan Lopopolo, “Harness engineering: leveraging Codex in an agent-first world” (OpenAI, Feb 2026)"},"start":40.396,"dur":19.392,"words":[{"text":"How","s":40.696,"e":40.936},{"text":"far","s":41.016,"e":41.176},{"text":"can","s":41.256,"e":41.416},{"text":"this","s":41.496,"e":41.576},{"text":"go?","s":41.656,"e":42.056},{"text":"OpenAI's","s":42.616,"e":43.336},{"text":"Ryan","s":43.416,"e":43.656},{"text":"Lopopolo","s":43.709,"e":44.296},{"text":"describes","s":44.376,"e":44.776},{"text":"a","s":44.856,"e":44.936},{"text":"team","s":45.056,"e":45.176},{"text":"that","s":45.256,"e":45.336},{"text":"shipped","s":45.416,"e":45.656},{"text":"a","s":45.696,"e":45.736},{"text":"real","s":45.896,"e":46.136},{"text":"internal","s":46.216,"e":46.616},{"text":"product","s":46.696,"e":47.096},{"text":"in","s":47.176,"e":47.416},{"text":"five","s":47.496,"e":47.736},{"text":"months:","s":47.816,"e":48.696},{"text":"about","s":48.816,"e":48.936},{"text":"a","s":49.016,"e":49.096},{"text":"million","s":49.256,"e":49.416},{"text":"lines","s":49.536,"e":49.656},{"text":"of","s":49.696,"e":49.736},{"text":"code,","s":49.816,"e":50.376},{"text":"fifteen","s":50.536,"e":50.936},{"text":"hundred","s":51.096,"e":51.416},{"text":"pull","s":51.576,"e":51.736},{"text":"requests,","s":52.016,"e":52.616},{"text":"seven","s":52.696,"e":52.936},{"text":"engineers,","s":53.016,"e":53.816},{"text":"and","s":53.896,"e":53.976},{"text":"zero","s":54.216,"e":54.456},{"text":"lines","s":54.616,"e":54.936},{"text":"written","s":55.056,"e":55.176},{"text":"by","s":55.256,"e":55.336},{"text":"hand.","s":55.416,"e":56.056},{"text":"Humans","s":56.376,"e":56.776},{"text":"steer.","s":56.856,"e":57.336},{"text":"Agents","s":57.736,"e":58.216},{"text":"execute.","s":58.376,"e":59.176}]},{"template":"quote","chapter":"The OpenAI experiment","narration":"His key observation: building software still demands discipline, but the discipline shows up more in the scaffolding than in the code. The tooling, abstractions and feedback loops that keep the codebase coherent become the real work.","params":{"text":"Building software still demands discipline, but the discipline shows up more in the *scaffolding* rather than the code.","who":"Ryan Lopopolo","role":"OpenAI","src":"Harness engineering: leveraging Codex in an agent-first world"},"start":59.788,"dur":15.161,"words":[{"text":"His","s":60.088,"e":60.328},{"text":"key","s":60.408,"e":60.488},{"text":"observation:","s":60.568,"e":61.848},{"text":"building","s":62.048,"e":62.248},{"text":"software","s":62.528,"e":62.808},{"text":"still","s":62.888,"e":63.128},{"text":"demands","s":63.208,"e":63.608},{"text":"discipline,","s":63.688,"e":64.648},{"text":"but","s":64.728,"e":64.808},{"text":"the","s":64.888,"e":64.968},{"text":"discipline","s":65.088,"e":65.528},{"text":"shows","s":65.648,"e":65.768},{"text":"up","s":65.848,"e":65.928},{"text":"more","s":66.008,"e":66.168},{"text":"in","s":66.208,"e":66.248},{"text":"the","s":66.328,"e":66.408},{"text":"scaffolding","s":66.488,"e":67.128},{"text":"than","s":67.208,"e":67.288},{"text":"in","s":67.368,"e":67.448},{"text":"the","s":67.488,"e":67.528},{"text":"code.","s":67.608,"e":68.488},{"text":"The","s":68.568,"e":68.648},{"text":"tooling,","s":68.728,"e":69.368},{"text":"abstractions","s":69.448,"e":70.168},{"text":"and","s":70.248,"e":70.408},{"text":"feedback","s":70.648,"e":70.888},{"text":"loops","s":71.048,"e":71.208},{"text":"that","s":71.288,"e":71.368},{"text":"keep","s":71.448,"e":71.528},{"text":"the","s":71.608,"e":71.688},{"text":"codebase","s":71.808,"e":72.168},{"text":"coherent","s":72.288,"e":72.968},{"text":"become","s":73.048,"e":73.288},{"text":"the","s":73.408,"e":73.528},{"text":"real","s":73.648,"e":73.768},{"text":"work.","s":73.848,"e":74.328}]},{"template":"code","chapter":"Fix it forever","narration":"Here's what fixing a mistake forever looks like. Agents kept calling fetch without a timeout. Instead of correcting it in every review, Lopopolo's team wrote a custom lint rule. And the error message doesn't just say no. It explains the rule and how to fix it, so the agent repairs its own code.","params":{"file":"lint output","lang":"text","lines":["src/billing/sync.ts:42  error  no-bare-fetch","  fetch() must be wrapped in withRetry() and a timeout.","  Why: upstream APIs hang under load and stall the queue.","  Fix: import { withRetry } from \"@/net\";","       await withRetry(() => fetch(url), { timeoutMs: 5000 })"],"hl":[{"from":1,"to":1,"at":"lint rule","label":"a hard check","tone":"bad"},{"from":2,"to":5,"at":"explains","label":"the error teaches","tone":"good"}],"caption":"A failing check that tells the agent exactly how to fix it."},"start":74.949,"dur":19.549,"words":[{"text":"Here's","s":75.249,"e":75.569},{"text":"what","s":75.649,"e":75.729},{"text":"fixing","s":75.809,"e":76.129},{"text":"a","s":76.169,"e":76.209},{"text":"mistake","s":76.329,"e":76.609},{"text":"forever","s":76.689,"e":77.249},{"text":"looks","s":77.329,"e":77.569},{"text":"like.","s":77.729,"e":78.169},{"text":"Agents","s":78.449,"e":78.849},{"text":"kept","s":78.969,"e":79.089},{"text":"calling","s":79.169,"e":79.409},{"text":"fetch","s":79.569,"e":79.889},{"text":"without","s":80.009,"e":80.129},{"text":"a","s":80.209,"e":80.249},{"text":"timeout.","s":80.289,"e":80.849},{"text":"Instead","s":81.329,"e":81.649},{"text":"of","s":81.689,"e":81.729},{"text":"correcting","s":81.809,"e":82.209},{"text":"it","s":82.289,"e":82.369},{"text":"in","s":82.449,"e":82.529},{"text":"every","s":82.689,"e":82.929},{"text":"review,","s":83.009,"e":83.809},{"text":"Lopopolo's","s":83.849,"e":84.449},{"text":"team","s":84.529,"e":84.769},{"text":"wrote","s":84.809,"e":85.009},{"text":"a","s":85.089,"e":85.169},{"text":"custom","s":85.249,"e":85.569},{"text":"lint","s":85.649,"e":85.889},{"text":"rule.","s":85.969,"e":86.409},{"text":"And","s":86.609,"e":86.689},{"text":"the","s":86.769,"e":86.849},{"text":"error","s":86.929,"e":87.089},{"text":"message","s":87.169,"e":87.569},{"text":"doesn't","s":87.649,"e":87.889},{"text":"just","s":87.969,"e":88.129},{"text":"say","s":88.249,"e":88.369},{"text":"no.","s":88.529,"e":89.049},{"text":"It","s":89.249,"e":89.329},{"text":"explains","s":89.409,"e":89.889},{"text":"the","s":89.929,"e":89.969},{"text":"rule","s":90.049,"e":90.369},{"text":"and","s":90.489,"e":90.609},{"text":"how","s":90.689,"e":90.769},{"text":"to","s":90.849,"e":90.929},{"text":"fix","s":91.009,"e":91.169},{"text":"it,","s":91.249,"e":91.569},{"text":"so","s":91.649,"e":91.729},{"text":"the","s":91.769,"e":91.809},{"text":"agent","s":91.889,"e":92.129},{"text":"repairs","s":92.209,"e":92.689},{"text":"its","s":92.809,"e":92.929},{"text":"own","s":93.009,"e":93.169},{"text":"code.","s":93.249,"e":93.889}]},{"template":"compare","chapter":"Hard beats soft","narration":"Lauren Tan draws a sharp line between soft and hard constraints. Memory files, skills, style guides and review bots are soft. They can be forgotten. Types, lints, CI checks and enforced architecture are hard. If you only have soft constraints, she warns, it's only a matter of time before your codebase looks like complete trash.","params":{"left":{"title":"Soft constraints","tone":"neutral","items":["Memory files and style guides","Skills and review bots","Can be forgotten"],"at":"soft"},"right":{"title":"Hard constraints","tone":"good","items":["Types and custom lints","CI checks that go red","Enforced architecture boundaries"],"at":"hard"}},"start":94.498,"dur":23.467,"words":[{"text":"Lauren","s":94.798,"e":95.198},{"text":"Tan","s":95.278,"e":95.518},{"text":"draws","s":95.598,"e":95.838},{"text":"a","s":95.918,"e":95.998},{"text":"sharp","s":96.078,"e":96.318},{"text":"line","s":96.398,"e":96.718},{"text":"between","s":96.878,"e":97.038},{"text":"soft","s":97.198,"e":97.598},{"text":"and","s":97.678,"e":97.758},{"text":"hard","s":97.838,"e":98.078},{"text":"constraints.","s":98.398,"e":98.998},{"text":"Memory","s":99.278,"e":99.598},{"text":"files,","s":99.678,"e":100.318},{"text":"skills,","s":100.598,"e":101.118},{"text":"style","s":101.278,"e":101.438},{"text":"guides","s":101.518,"e":101.918},{"text":"and","s":101.998,"e":102.078},{"text":"review","s":102.238,"e":102.398},{"text":"bots","s":102.478,"e":102.798},{"text":"are","s":102.878,"e":103.038},{"text":"soft.","s":103.118,"e":103.918},{"text":"They","s":103.998,"e":104.078},{"text":"can","s":104.118,"e":104.158},{"text":"be","s":104.238,"e":104.278},{"text":"forgotten.","s":104.318,"e":105.158},{"text":"Types,","s":105.438,"e":106.078},{"text":"lints,","s":106.158,"e":106.798},{"text":"CI","s":106.878,"e":107.118},{"text":"checks","s":107.198,"e":107.598},{"text":"and","s":107.638,"e":107.678},{"text":"enforced","s":107.758,"e":108.238},{"text":"architecture","s":108.318,"e":108.958},{"text":"are","s":109.038,"e":109.278},{"text":"hard.","s":109.478,"e":110.238},{"text":"If","s":110.318,"e":110.398},{"text":"you","s":110.478,"e":110.558},{"text":"only","s":110.638,"e":110.878},{"text":"have","s":110.958,"e":111.038},{"text":"soft","s":111.198,"e":111.438},{"text":"constraints,","s":111.518,"e":112.238},{"text":"she","s":112.318,"e":112.398},{"text":"warns,","s":112.478,"e":113.198},{"text":"it's","s":113.238,"e":113.438},{"text":"only","s":113.518,"e":113.678},{"text":"a","s":113.758,"e":113.798},{"text":"matter","s":113.838,"e":113.998},{"text":"of","s":114.078,"e":114.158},{"text":"time","s":114.238,"e":114.478},{"text":"before","s":114.558,"e":114.798},{"text":"your","s":114.878,"e":114.958},{"text":"codebase","s":115.038,"e":115.518},{"text":"looks","s":115.638,"e":115.758},{"text":"like","s":115.838,"e":115.918},{"text":"complete","s":116.198,"e":116.478},{"text":"trash.","s":116.758,"e":117.358}]},{"template":"statement","chapter":"Hard beats soft","narration":"Her team goes further. Everything you can imagine the agents are bad at, she says, we ban. A React hook agents misuse, banned. Rambling code comments, banned. Imports that cross an architecture boundary, blocked by a check.","params":{"text":"“Everything you can imagine the agents are bad at, *we ban*.”","sub":"Lauren Tan: banned patterns, enforced in CI.","art":"x","tone":"bad","sync":false},"start":117.965,"dur":16.519,"words":[{"text":"Her","s":118.265,"e":118.465},{"text":"team","s":118.505,"e":118.715},{"text":"goes","s":118.745,"e":118.945},{"text":"further.","s":118.985,"e":119.825},{"text":"Everything","s":120.105,"e":120.585},{"text":"you","s":120.625,"e":120.665},{"text":"can","s":120.745,"e":120.825},{"text":"imagine","s":120.905,"e":121.225},{"text":"the","s":121.305,"e":121.385},{"text":"agents","s":121.465,"e":121.785},{"text":"are","s":121.825,"e":121.865},{"text":"bad","s":122.025,"e":122.265},{"text":"at,","s":122.385,"e":122.665},{"text":"she","s":122.745,"e":122.825},{"text":"says,","s":122.905,"e":123.545},{"text":"we","s":123.625,"e":123.785},{"text":"ban.","s":123.865,"e":124.505},{"text":"A","s":124.745,"e":124.825},{"text":"React","s":125.025,"e":125.225},{"text":"hook","s":125.345,"e":125.465},{"text":"agents","s":125.545,"e":125.865},{"text":"misuse,","s":126.025,"e":126.505},{"text":"banned.","s":126.825,"e":127.625},{"text":"Rambling","s":127.705,"e":128.105},{"text":"code","s":128.185,"e":128.345},{"text":"comments,","s":128.425,"e":129.225},{"text":"banned.","s":129.305,"e":130.185},{"text":"Imports","s":130.425,"e":130.665},{"text":"that","s":130.745,"e":130.825},{"text":"cross","s":130.985,"e":131.145},{"text":"an","s":131.185,"e":131.225},{"text":"architecture","s":131.305,"e":131.865},{"text":"boundary,","s":131.945,"e":132.665},{"text":"blocked","s":132.745,"e":132.985},{"text":"by","s":133.065,"e":133.145},{"text":"a","s":133.185,"e":133.225},{"text":"check.","s":133.305,"e":133.785}]},{"template":"list","chapter":"Legible environments","narration":"The other half of the harness is the environment. The Claude Code team makes sure the agent can do everything a human does to build and test the product end to end. OpenAI teaches its agent to launch the app, start the observability stack and drive a browser. And Karpathy's pet peeve: docs that say go click this URL, instead of giving you text to paste to your agent.","params":{"title":"A legible environment","items":[{"text":"The agent can run the whole dev loop","sub":"build, test, run, end to end","at":"everything a human"},{"text":"It can see what happens","sub":"logs, metrics, a browser","at":"observability"},{"text":"Docs written for agents","sub":"commands to run, not buttons to click","at":"pet peeve"}]},"start":134.484,"dur":23.389,"words":[{"text":"The","s":134.784,"e":134.944},{"text":"other","s":135.024,"e":135.184},{"text":"half","s":135.264,"e":135.504},{"text":"of","s":135.544,"e":135.584},{"text":"the","s":135.624,"e":135.664},{"text":"harness","s":135.744,"e":136.144},{"text":"is","s":136.224,"e":136.384},{"text":"the","s":136.424,"e":136.464},{"text":"environment.","s":136.784,"e":137.184},{"text":"The","s":137.664,"e":137.744},{"text":"Claude","s":137.824,"e":138.064},{"text":"Code","s":138.144,"e":138.304},{"text":"team","s":138.384,"e":138.624},{"text":"makes","s":138.704,"e":138.864},{"text":"sure","s":138.944,"e":139.104},{"text":"the","s":139.184,"e":139.264},{"text":"agent","s":139.344,"e":139.584},{"text":"can","s":139.664,"e":139.744},{"text":"do","s":139.824,"e":140.064},{"text":"everything","s":140.304,"e":140.544},{"text":"a","s":140.584,"e":140.624},{"text":"human","s":140.704,"e":141.024},{"text":"does","s":141.104,"e":141.344},{"text":"to","s":141.424,"e":141.584},{"text":"build","s":141.744,"e":141.904},{"text":"and","s":141.984,"e":142.064},{"text":"test","s":142.144,"e":142.384},{"text":"the","s":142.424,"e":142.464},{"text":"product","s":142.544,"e":142.944},{"text":"end","s":143.024,"e":143.184},{"text":"to","s":143.264,"e":143.344},{"text":"end.","s":143.424,"e":143.744},{"text":"OpenAI","s":144.304,"e":144.864},{"text":"teaches","s":144.944,"e":145.264},{"text":"its","s":145.344,"e":145.504},{"text":"agent","s":145.664,"e":145.824},{"text":"to","s":145.864,"e":145.904},{"text":"launch","s":145.984,"e":146.224},{"text":"the","s":146.304,"e":146.384},{"text":"app,","s":146.464,"e":146.944},{"text":"start","s":147.104,"e":147.264},{"text":"the","s":147.304,"e":147.344},{"text":"observability","s":147.504,"e":148.064},{"text":"stack","s":148.144,"e":148.464},{"text":"and","s":148.704,"e":148.944},{"text":"drive","s":149.064,"e":149.184},{"text":"a","s":149.264,"e":149.304},{"text":"browser.","s":149.344,"e":149.824},{"text":"And","s":150.304,"e":150.384},{"text":"Karpathy's","s":150.464,"e":151.024},{"text":"pet","s":151.144,"e":151.264},{"text":"peeve:","s":151.384,"e":151.744},{"text":"docs","s":152.144,"e":152.384},{"text":"that","s":152.464,"e":152.624},{"text":"say","s":152.744,"e":152.864},{"text":"go","s":153.104,"e":153.264},{"text":"click","s":153.344,"e":153.584},{"text":"this","s":153.704,"e":153.824},{"text":"URL,","s":153.904,"e":154.624},{"text":"instead","s":154.784,"e":154.944},{"text":"of","s":154.984,"e":155.024},{"text":"giving","s":155.104,"e":155.344},{"text":"you","s":155.424,"e":155.504},{"text":"text","s":155.584,"e":155.904},{"text":"to","s":155.944,"e":155.984},{"text":"paste","s":156.064,"e":156.304},{"text":"to","s":156.344,"e":156.384},{"text":"your","s":156.464,"e":156.544},{"text":"agent.","s":156.624,"e":157.264}]},{"template":"quote","chapter":"Factories fail","narration":"But don't remove the humans. Dex Horthy's team built a lights-off software factory in July 2025, where nobody read the code. By November, they had shut it down. After three to six months without human steering, the codebase was easier to restart than to fix.","params":{"text":"We built a lights off software factory in July of 2025 and by *November we had shut it down*.","who":"Dex Horthy","role":"founder, HumanLayer","src":"Context engineering with Dex Horthy · The Pragmatic Engineer","t":2509},"start":157.873,"dur":18.426,"words":[{"text":"But","s":158.173,"e":158.333},{"text":"don't","s":158.493,"e":158.733},{"text":"remove","s":158.813,"e":159.133},{"text":"the","s":159.173,"e":159.213},{"text":"humans.","s":159.293,"e":160.133},{"text":"Dex","s":160.413,"e":160.653},{"text":"Horthy's","s":160.693,"e":161.053},{"text":"team","s":161.133,"e":161.453},{"text":"built","s":161.573,"e":161.693},{"text":"a","s":161.733,"e":161.773},{"text":"lights-off","s":161.853,"e":162.333},{"text":"software","s":162.413,"e":162.813},{"text":"factory","s":162.893,"e":163.293},{"text":"in","s":163.333,"e":163.373},{"text":"July","s":163.453,"e":163.773},{"text":"2025,","s":163.853,"e":165.133},{"text":"where","s":165.253,"e":165.373},{"text":"nobody","s":165.453,"e":165.853},{"text":"read","s":165.933,"e":166.093},{"text":"the","s":166.133,"e":166.173},{"text":"code.","s":166.253,"e":166.813},{"text":"By","s":167.053,"e":167.213},{"text":"November,","s":167.453,"e":168.013},{"text":"they","s":168.053,"e":168.093},{"text":"had","s":168.173,"e":168.253},{"text":"shut","s":168.293,"e":168.413},{"text":"it","s":168.493,"e":168.573},{"text":"down.","s":168.733,"e":169.213},{"text":"After","s":169.533,"e":169.853},{"text":"three","s":169.973,"e":170.093},{"text":"to","s":170.173,"e":170.253},{"text":"six","s":170.373,"e":170.493},{"text":"months","s":170.573,"e":170.813},{"text":"without","s":171.013,"e":171.213},{"text":"human","s":171.293,"e":171.533},{"text":"steering,","s":171.613,"e":172.413},{"text":"the","s":172.453,"e":172.493},{"text":"codebase","s":172.573,"e":173.053},{"text":"was","s":173.173,"e":173.293},{"text":"easier","s":173.333,"e":173.693},{"text":"to","s":173.773,"e":173.853},{"text":"restart","s":173.933,"e":174.493},{"text":"than","s":174.573,"e":174.733},{"text":"to","s":174.773,"e":174.813},{"text":"fix.","s":174.973,"e":175.693}]},{"template":"statement","chapter":"Keep it light","narration":"And hold your harness loosely. Boris Cherny notes that as models get better, the harness matters less. The Claude Code team builds scaffolding knowing it will be deleted, like the to-do list tool they needed for older models. Build what today's models need, and prune as they improve.","params":{"text":"Build scaffolding you're happy to *delete*.","sub":"As models improve, the harness matters less. — Boris Cherny","art":"pen","tone":"agent","sync":false},"start":176.299,"dur":18.034,"words":[{"text":"And","s":176.599,"e":176.759},{"text":"hold","s":176.839,"e":177.079},{"text":"your","s":177.119,"e":177.159},{"text":"harness","s":177.319,"e":177.639},{"text":"loosely.","s":177.719,"e":178.479},{"text":"Boris","s":178.759,"e":179.079},{"text":"Cherny","s":179.159,"e":179.559},{"text":"notes","s":179.719,"e":179.879},{"text":"that","s":179.959,"e":180.039},{"text":"as","s":180.199,"e":180.359},{"text":"models","s":180.439,"e":180.759},{"text":"get","s":180.839,"e":180.919},{"text":"better,","s":180.999,"e":181.559},{"text":"the","s":181.599,"e":181.639},{"text":"harness","s":181.719,"e":182.119},{"text":"matters","s":182.159,"e":182.439},{"text":"less.","s":182.519,"e":183.199},{"text":"The","s":183.479,"e":183.559},{"text":"Claude","s":183.639,"e":183.799},{"text":"Code","s":183.879,"e":184.119},{"text":"team","s":184.199,"e":184.439},{"text":"builds","s":184.559,"e":184.759},{"text":"scaffolding","s":184.799,"e":185.479},{"text":"knowing","s":185.639,"e":185.959},{"text":"it","s":185.999,"e":186.039},{"text":"will","s":186.119,"e":186.199},{"text":"be","s":186.279,"e":186.319},{"text":"deleted,","s":186.359,"e":187.159},{"text":"like","s":187.239,"e":187.399},{"text":"the","s":187.479,"e":187.559},{"text":"to-do","s":187.599,"e":187.799},{"text":"list","s":187.879,"e":188.039},{"text":"tool","s":188.119,"e":188.279},{"text":"they","s":188.359,"e":188.439},{"text":"needed","s":188.519,"e":188.759},{"text":"for","s":188.839,"e":188.919},{"text":"older","s":188.999,"e":189.159},{"text":"models.","s":189.239,"e":189.919},{"text":"Build","s":190.199,"e":190.439},{"text":"what","s":190.519,"e":190.599},{"text":"today's","s":190.679,"e":190.999},{"text":"models","s":191.079,"e":191.399},{"text":"need,","s":191.479,"e":191.959},{"text":"and","s":192.039,"e":192.119},{"text":"prune","s":192.199,"e":192.599},{"text":"as","s":192.679,"e":192.759},{"text":"they","s":192.839,"e":192.919},{"text":"improve.","s":192.999,"e":193.719}]},{"template":"quiz","chapter":"Quick check","narration":"Quick check. Agents keep calling fetch without a timeout, and reviewers keep catching it. What's the most durable fix? Tap your answer.","params":{"q":"Agents keep calling fetch without a timeout. Most durable fix?","options":["Add “always use timeouts” to the memory file","A custom lint that fails CI and explains how to fix it","Remind the agent in every prompt","Review more carefully"],"answer":1,"explain":"A hard check runs every time, and a teaching error message lets the agent fix itself."},"start":194.333,"dur":14.251,"words":[{"text":"Quick","s":194.633,"e":194.873},{"text":"check.","s":194.953,"e":195.273},{"text":"Agents","s":195.673,"e":196.073},{"text":"keep","s":196.153,"e":196.313},{"text":"calling","s":196.393,"e":196.633},{"text":"fetch","s":196.793,"e":197.113},{"text":"without","s":197.233,"e":197.353},{"text":"a","s":197.433,"e":197.473},{"text":"timeout,","s":197.513,"e":198.313},{"text":"and","s":198.393,"e":198.473},{"text":"reviewers","s":198.553,"e":199.033},{"text":"keep","s":199.113,"e":199.273},{"text":"catching","s":199.353,"e":199.673},{"text":"it.","s":199.753,"e":199.913},{"text":"What's","s":200.393,"e":200.633},{"text":"the","s":200.673,"e":200.713},{"text":"most","s":200.833,"e":200.953},{"text":"durable","s":201.033,"e":201.353},{"text":"fix?","s":201.513,"e":202.153},{"text":"Tap","s":202.393,"e":202.633},{"text":"your","s":202.713,"e":202.793},{"text":"answer.","s":202.993,"e":203.433}]},{"template":"exercise","chapter":"Try it","narration":"Start your harness engineering habit. This prompt finds recurring mistakes in your history and turns the worst one into a durable check.","params":{"title":"Try it with your agent","intro":"Mine your history for repeat mistakes:","prompt":"Look at our last 20 commits and any review comments. Find mistakes\nthat recur. For each, propose the most durable fix: a lint rule, a\ntest, a type, or a hook, with a memory-file line only as a last\nresort. Implement the top one, with an error message that teaches."},"start":208.584,"dur":9.152,"words":[{"text":"Start","s":208.884,"e":209.284},{"text":"your","s":209.364,"e":209.444},{"text":"harness","s":209.524,"e":209.844},{"text":"engineering","s":209.924,"e":210.404},{"text":"habit.","s":210.484,"e":210.884},{"text":"This","s":211.444,"e":211.604},{"text":"prompt","s":211.684,"e":212.004},{"text":"finds","s":212.084,"e":212.364},{"text":"recurring","s":212.404,"e":212.804},{"text":"mistakes","s":212.884,"e":213.284},{"text":"in","s":213.364,"e":213.404},{"text":"your","s":213.444,"e":213.524},{"text":"history","s":213.604,"e":214.084},{"text":"and","s":214.244,"e":214.404},{"text":"turns","s":214.524,"e":214.724},{"text":"the","s":214.764,"e":214.804},{"text":"worst","s":214.964,"e":215.204},{"text":"one","s":215.284,"e":215.524},{"text":"into","s":215.604,"e":215.844},{"text":"a","s":215.884,"e":215.924},{"text":"durable","s":216.084,"e":216.404},{"text":"check.","s":216.484,"e":217.124}]},{"template":"recap","chapter":"Recap","narration":"Recap. Every mistake is a chance to fix the system, not just the code. Prefer hard constraints, with errors that teach. Make your environment legible to agents. Keep humans steering, and keep the harness light. That's module four. Next: codebases agents can work in.","params":{"items":["Mistake → engineer it out *forever*","Hard constraints beat soft ones","Errors that teach; legible environments","Humans steer; harness stays light"],"next":"Codebases agents can work in","next_at":"Next"},"start":217.736,"dur":21.936,"words":[{"text":"Recap.","s":218.036,"e":218.876},{"text":"Every","s":219.156,"e":219.396},{"text":"mistake","s":219.476,"e":219.956},{"text":"is","s":220.036,"e":220.116},{"text":"a","s":220.196,"e":220.236},{"text":"chance","s":220.276,"e":220.516},{"text":"to","s":220.596,"e":220.676},{"text":"fix","s":220.836,"e":220.996},{"text":"the","s":221.076,"e":221.156},{"text":"system,","s":221.316,"e":222.036},{"text":"not","s":222.116,"e":222.276},{"text":"just","s":222.356,"e":222.516},{"text":"the","s":222.556,"e":222.596},{"text":"code.","s":222.676,"e":223.076},{"text":"Prefer","s":223.556,"e":223.956},{"text":"hard","s":224.116,"e":224.356},{"text":"constraints,","s":224.436,"e":225.236},{"text":"with","s":225.316,"e":225.396},{"text":"errors","s":225.556,"e":225.876},{"text":"that","s":225.956,"e":226.116},{"text":"teach.","s":226.196,"e":226.876},{"text":"Make","s":227.156,"e":227.316},{"text":"your","s":227.396,"e":227.476},{"text":"environment","s":227.756,"e":228.036},{"text":"legible","s":228.196,"e":228.596},{"text":"to","s":228.676,"e":228.756},{"text":"agents.","s":228.836,"e":229.396},{"text":"Keep","s":229.876,"e":230.116},{"text":"humans","s":230.196,"e":230.596},{"text":"steering,","s":230.676,"e":231.396},{"text":"and","s":231.556,"e":231.716},{"text":"keep","s":232.036,"e":232.196},{"text":"the","s":232.236,"e":232.276},{"text":"harness","s":232.356,"e":232.676},{"text":"light.","s":232.796,"e":232.996},{"text":"That's","s":233.556,"e":233.756},{"text":"module","s":233.796,"e":234.116},{"text":"four.","s":234.276,"e":234.596},{"text":"Next:","s":235.156,"e":235.636},{"text":"codebases","s":236.036,"e":236.676},{"text":"agents","s":236.836,"e":237.156},{"text":"can","s":237.236,"e":237.316},{"text":"work","s":237.396,"e":237.636},{"text":"in.","s":237.716,"e":238.116}]}],"total":240.072,"audio":"/audio/18-harness.mp3"}