{
"$type": "site.standard.document",
"content": "---\ntitle: 'The road to COMP4020: climbing the \"good\" gradient'\ndescription: \"Producing code is easy; knowing whether it's good is still hard. Three nested\n feedback loops for ascending the quality gradient in agentic coding.\"\ntags: [comp4020, teaching]\n---\n\n:::tip\n\nThis post is part of a series I'm writing as I develop\n[COMP4020: Agentic Coding Studio](/blog/2025/12/19/comp4020-rapid-prototyping-for-the-web/).\nSee [all posts in the series](/blog/tag/comp4020/).\n\n:::\n\nDesigning any class involves a tension between teaching abstract (and hopefully\ntimeless) principles and concrete skills. As an educator (especially in a\ntertiary setting) it's easy to jump to saying the abstract principles are key;\nbut even here\n[experts can disagree](https://bsky.app/profile/shriram.bsky.social/post/3mf7i5vur5s2r).\n\nI feel this tension especially in the design of COMP4020. Not just for\nphilosophical/pedagogical reasons, but also because with this stuff things are\nchanging _so fast_ (the og terminal-based agentic coding tool wasn't even\nreleased a year ago). In planning for a class that doesn't start for five months\nit seems foolish to index too heavily on the specifics of which\ntools/models/workflows are working best right now.\n\nI don't think this is because I think the abstract/timeless is better or more\npure than the concrete. But for now it's where my focus is.\n\nOne thought that I keep returning to as an increasingly heavy user of agentic\ncoding tools (I'm at\n[level 6](https://justin.abrah.ms/blog/2026-01-08-yegge-s-developer-agent-evolution-model.html)\nwith a bullet) is that producing stuff is easy, knowing whether said stuff is\n**good**[^good] is still hard. The best stuff I've read and seen on effective\nuse of coding agents all tackles the slippery question of how to define what\n**good** is, and how to ascend the **good** gradient from the current state of\nthe code.\n\n[^good]:\n I don't want to go down the full Platonic rabbit hole, but the discerning\n reader will pick up what I'm putting down here.\n\nChristopher Alexander spent decades on the\n[objective structure of 'goodness'](https://nemoslibrary.com/2009/03/02/the-nature-of-order-the-phenomenon-of-life/)\nin architecture---even listing\n['gradients'](http://www.truthtable.com/Fifteen_Princples.html) among his\nfifteen properties of living structure---and Herbert Simon\n[framed all of design](https://juliekallio.com/2018/01/23/book-notes-thoughts-the-sciences-of-the-artificial-by-herbert-simon/)\nas heuristic search through vast solution spaces.\n\nWith that in mind, and also referencing my \"weekly crit sessions\"\n[core mechanic post](/blog/2026/02/20/comp4020-the-core-mechanic/), I think the\ncore principles I want to teach are around designing feedback loops (at multiple\nscales) to help guide us towards the good. If **good** is a scalar field over\nthe space of possible codebases, then ∇**good**, the direction of steepest\nascent, is **the better**. And the feedback loops are how we compute it.\n\nIn particular, there are three important feedback loops in agentic coding:\n\n1. the loop between the code and the harness (e.g. Claude Code); this is tight,\n and only occasionally requires human intervention\n\n2. the loop between the human developer and the software artefact; how quick and\n easy is it to see the WIP in a web browser, to compare different alternative\n designs or approaches etc. and then to make (considered) changes to the code\n and see their effects\n\n3. the loop between the human developer and their software and the \"community of\n use\" in which it will be deployed, shared and enjoyed\n\n<svg class=\"feedback-loops\" width=\"100%\" viewBox=\"0 0 500 480\" xmlns=\"http://www.w3.org/2000/svg\">\n <!-- Outer ring: human ↔ community -->\n <path d=\"M 452 256 C 458 138, 372 54, 248 58 C 124 62, 44 142, 48 262 C 52 382, 132 466, 252 468 C 372 470, 446 376, 452 256 Z\"\n class=\"ring ring-outer\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n transform=\"rotate(1.5, 250, 260)\"/>\n <!-- Middle ring: human ↔ artefact -->\n <path d=\"M 384 254 C 388 176, 330 124, 252 120 C 174 116, 114 180, 118 260 C 122 340, 178 398, 254 402 C 330 406, 380 334, 384 254 Z\"\n class=\"ring ring-middle\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n transform=\"rotate(-1, 250, 260)\"/>\n <!-- Inner ring: agent ↔ code -->\n <path d=\"M 314 256 C 316 224, 288 196, 252 194 C 216 192, 186 226, 188 260 C 190 294, 218 324, 252 326 C 286 328, 312 288, 314 256 Z\"\n class=\"ring ring-inner\" fill=\"none\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\n transform=\"rotate(2, 250, 260)\"/>\n <!-- Labels in top bands between rings -->\n <text x=\"250\" y=\"96\" text-anchor=\"middle\" font-size=\"15\" class=\"loop-label label-outer\"\n transform=\"rotate(-0.8, 250, 96)\">human ↔ community</text>\n <text x=\"250\" y=\"168\" text-anchor=\"middle\" font-size=\"15\" class=\"loop-label label-middle\"\n transform=\"rotate(1.2, 250, 168)\">human ↔ artefact</text>\n <text x=\"250\" y=\"264\" text-anchor=\"middle\" font-size=\"15\" class=\"loop-label label-inner\"\n transform=\"rotate(-0.5, 250, 264)\">agent ↔ code</text>\n</svg>\n\nNone of these ideas are new, either in software development (Tanimoto's\n[levels of liveness](https://liveprogramming.github.io/2013/papers/liveness.pdf),\nVictor's [immediate feedback principle](https://worrydream.com/), Schön's\n[reflective conversation with the situation](https://www.punyamishra.com/wp-content/uploads/2017/09/schon-reflective-conversation.pdf),\nand Gabriel's\n[software habitability](https://archive.org/details/PatternsOfSoftware)---and\n_many others_ have made similar points). Heck, I work at a School of\nCybernetics, so good'ol Norbert and Margaret (and\n[Ranulph Glanville](https://asc-cybernetics.org/publications/systems_papers/C%20and%20D%20paper%200670360902.pdf),\nwho argued that cybernetics and design are two sides of the same coin) would be\nnodding sagely along with my musings about feedback-driven behaviour.\n\nBut it'll be a helpful\nway<sup>[[citation needed](https://en.wikipedia.org/wiki/Wikipedia:Citation_needed)]</sup>\nof structuring the actual nuts-and-bolts of teaching students how to use these\ntools effectively, whatever the SoTA is in July-Nov 2026. For example:\n\n- level 1 is where type systems, linters, automated testing, etc lives;\n scaffolding in or around your codebase to give the agent direct and instant\n feedback about whether their changes are good\n\n- level 2 is where browser and hot-reloading and stuff like REPLs (because\n lispers have always been right about that) comes in; when the coding agent\n comes back to you and says \"Done! What do you think?\" you need to be able to\n poke around and see whether it's good and what direction to prompt it in next\n to get there\n\n- level 3 is where the weekly crit sessions shine; software doesn't exist in\n isolation, and whether your web app is good requires an understanding of (and\n feedback from) a community of taste and practice whose opinions and feedback\n you care about (and also an instructor who will assess it; but I hope that\n students make good things because good and beautiful things should exist, not\n just so they'll get a good grade)\n\nI'm even thinking about structuring the syllabus around these levels; not that\nwe'd do all level 1, then all level 2, then all level 3, but that at least the\nlectures and other readings would make clear where the different things we were\nstudying fit into this broader framework.\n\n<!-- styles for the feedback loops SVG (light/dark mode) -->\n<style scoped>\n.feedback-loops {\n .ring { stroke-width: 2.5; }\n .ring-outer { stroke: #6366f1; }\n .ring-middle { stroke: #2a9d8f; }\n .ring-inner { stroke: #e07050; }\n .loop-label { font-weight: 600; }\n .label-outer { fill: #4f46e5; }\n .label-middle { fill: #1f7a6f; }\n .label-inner { fill: #c85a3a; }\n\n .dark & {\n .ring-outer { stroke: #a5b4fc; }\n .ring-middle { stroke: #80cbc4; }\n .ring-inner { stroke: #ffab91; }\n .label-outer { fill: #a5b4fc; }\n .label-middle { fill: #80cbc4; }\n .label-inner { fill: #ffab91; }\n }\n}\n</style>\n",
"createdAt": "2026-05-13T23:14:39.921Z",
"description": "Producing code is easy; knowing whether it's good is still hard. Three nested feedback loops for ascending the quality gradient in agentic coding.",
"path": "/blog/2026/02/24/climbing-the-good-gradient",
"publishedAt": "2026-02-24T00:00:00.000Z",
"site": "at://did:plc:tevykrhi4kibtsipzci76d76/site.standard.publication/self",
"tags": [
"comp4020",
"teaching"
],
"textContent": "Producing code is easy; knowing whether it's good is still hard. Three nested feedback loops for ascending the quality gradient in agentic coding.",
"title": "The road to COMP4020: climbing the \"good\" gradient"
}