[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-fil-the-optimiser-that-was-quietly-ignoring-me":3,"blog-related-fil-the-optimiser-that-was-quietly-ignoring-me":447},{"id":4,"slug":4,"title":5,"description":6,"date":7,"lastUpdated":7,"lastUpdatedKey":8,"lastUpdatedValue":9,"author":10,"tags":11,"coverImage":18,"coverImageAlt":19,"ogImage":18,"series":17,"seriesOrder":9,"readMinutes":20,"path":21,"href":22,"__fallback":23,"body":24,"tocLinks":433},"the-optimiser-that-was-quietly-ignoring-me","The Optimiser That Was Quietly Ignoring Me","I sat down to take one screenshot for the Play Store. Three hours later I'd fixed three bugs in the optimiser - and was very late for a family day out.","2026-06-06","knowledgeBase.relativeTime.weeksAgo",2,"Kyle",[12,13,14,15,16,17],"fretscape","guitar","progression-optimiser","product-building","user-intent","how-fretscape-thinks","/images/blog/the-optimiser-that-was-quietly-ignoring-me-hero.jpg","A kraft tag held shut by a small brass padlock among looser tags on warm wood, a faint chalk arrow curving past it rather than stopping at it",6,"/the-optimiser-that-was-quietly-ignoring-me","/blog/the-optimiser-that-was-quietly-ignoring-me",true,{"type":25,"value":26,"toc":431},"minimark",[27,31,34,56,65,68,71,81,86,89,101,106,110,121,126,129,136,144,148,151,158,161,164,170,177,181,184,187,190,197,200,207,210,214,217,223,226,233,236,239,246,249,253,256,263,266,269,301,304,307,314,317,321,328,331,334,337,344,348,355,358,361,371,399,401,405,410,413,417,420,424],[28,29,30],"p",{},"I sat down to take one screenshot.",[28,32,33],{},"Three hours later I'd fixed three bugs in the heart of my product and was very late for a family day out.",[28,35,36,37,44,45,50,51,55],{},"The screenshot was for the Play Store listing. It was supposed to show off the bit of ",[38,39,43],"a",{"href":40,"rel":41},"https://fretscape.com/about",[42],"nofollow","Fretscape"," I'm most proud of - the ",[38,46,49],{"href":47,"rel":48},"https://fretscape.com/features/progressions",[42],"progression optimiser",". The whole product is built around it. So I wanted something clean. Something obvious. Something that tells a guitarist ",[52,53,54],"em",{},"this tool is helping you, and here's exactly how",".",[28,57,58,59,64],{},"I set up the founding example. G to D. The transition that ",[38,60,63],{"href":61,"rel":62},"https://fretscape.com/about/origin",[42],"started the whole project",". In beginner mode, Fretscape did what it was meant to - swapped the default G for a voicing that shares an anchor with D. Perfect. Click, screenshot, done.",[28,66,67],{},"Then I tried advanced mode.",[28,69,70],{},"The whole thing fell apart.",[72,73,74],"blockquote",{},[28,75,76,80],{},[77,78,79],"strong",{},"TL;DR","\nA Saturday morning screenshot for the Play Store turned into three hours of debugging. Bug one: the optimiser wasn't checking the user's difficulty or barre settings before optimising. Bug two: its idea of a chord \"variation\" had grown transitively until totally unrelated shapes were being offered as swaps. Bug three: it would override the user's chosen voicing for a tiny transition improvement, ignoring their intent to save a rounding error. All three fixes came down to the same principle - respect the user's constraints, or you're not optimising, you're deciding on their behalf.",[82,83,85],"h2",{"id":84},"the-founding-example","The founding example",[28,87,88],{},"Quick recap, because the whole post depends on it.",[28,90,91,92,96,97,100],{},"Traditional open G (",[93,94,95],"code",{},"320003",") and open D (",[93,98,99],{},"xx0232",") are the two easiest chords a beginner learns. Both open, both comfortable. But they don't share an anchor finger. Your hand has to lift off one shape and rebuild the next from scratch.",[102,103],"chord-diagram",{"fingering":104,"name":105,"voicing":95},"2-1-0-0-0-3","Open G",[102,107],{"fingering":108,"name":109,"voicing":99},"x-x-0-1-3-2","Open D",[28,111,112,113,116,117,120],{},"There's another open G though. Full G, with both B and high E fretted at the third - ",[93,114,115],{},"320033",". Four fingers on the fretboard instead of two. It looks harder. But the move from ",[52,118,119],{},"that"," G to D is smoother, because two fingers can stay planted across the transition.",[102,122],{"fingering":123,"name":124,"voicing":115,"label":125},"2-1-0-0-3-4","Full G","The smoother-moving G",[28,127,128],{},"That one insight - same chord, different shape, smoother progression - started the whole project.",[72,130,131],{},[28,132,133],{},[52,134,135],{},"Three easy chords can still make an awkward progression if every change forces your hand to reset.",[28,137,138,139,143],{},"If you've read the ",[38,140,142],{"href":61,"rel":141},[42],"origin story",", this will sound familiar. The rest of this post is what happened the first time I tried to put that idea on the Play Store listing.",[82,145,147],{"id":146},"the-screenshot-that-wouldnt-cooperate","The screenshot that wouldn't cooperate",[28,149,150],{},"Beginner mode, G to D, full-G anchor voicing. Exactly what I wanted. Clean, correct, tells the story.",[28,152,153],{},[154,155],"img",{"alt":156,"src":157},"Beginner mode G to D - the clean anchor transition the screenshot was meant to capture","/images/blog/optimiser-bugs-screenshot-1-beginner.png",[28,159,160],{},"Intermediate mode? Completely different voicing. Third fret, no clear relationship to the transition. Not bad, exactly - just not the story the screenshot was meant to tell.",[28,162,163],{},"Advanced mode? Stranger still. Voicings that seemed to have nothing to do with the G-to-D smoothness idea at all.",[28,165,166],{},[154,167],{"alt":168,"src":169},"Advanced mode G to D before the fix - a third-fret voicing with no relationship to the intended anchor transition","/images/blog/optimiser-bugs-screenshot-2-advanced-before.png",[28,171,172,173,176],{},"My first instinct was ",[52,174,175],{},"\"the difficulty setting is broken.\""," I was right. But it was more broken than I thought.",[82,178,180],{"id":179},"bug-one-the-optimiser-wasnt-listening","Bug one: the optimiser wasn't listening",[28,182,183],{},"Here's what was happening.",[28,185,186],{},"The progression optimiser was doing its job. It was looking at all the possible ways to play G, all the possible ways to play D, and working out which combination flowed best. The maths was fine. The ranking was fine.",[28,188,189],{},"What wasn't fine was that it wasn't checking the user's settings before it did any of that.",[28,191,192,193,196],{},"Difficulty level? Ignored. Allow-barres toggle? Ignored. Preferred fret range? Ignored. It was optimising across ",[52,194,195],{},"every"," voicing the system knew about, then handing back results that might violate the user's own choices.",[28,198,199],{},"Beginner mode had been hiding this for months. The beginner filter drops most of the harder voicings before the optimiser ever sees them - so even a blind optimiser ends up picking something beginner-friendly, because there's nothing else to pick. Advanced mode left everything on the table. That's when the problem became visible.",[72,201,202],{},[28,203,204],{},[52,205,206],{},"An optimiser that doesn't respect the user's constraints isn't optimising. It's deciding on their behalf.",[28,208,209],{},"The fix was unglamorous. Run the user's filters first. Optimise within what's left. Not across the whole universe.",[82,211,213],{"id":212},"bug-two-what-even-counts-as-a-variation","Bug two: what even counts as a \"variation\"?",[28,215,216],{},"This one's actually fun.",[28,218,219,220],{},"Fretscape treats multiple voicings of the same chord as \"variations\" the optimiser can swap between. Open G and full G, for example, are both variations of G. That's how the tool can suggest ",[52,221,222],{},"\"try this shape instead - it moves better into the next chord.\"",[28,224,225],{},"I'd let the variation set spread too far. One similar shape led to another, then another, then another, until \"close substitute\" had drifted into \"completely different chord form.\"",[28,227,228,229,232],{},"For open G in advanced mode, that produced ",[77,230,231],{},"sixty-four"," \"variations.\" Most of them looked nothing like the original shape. Third-fret power chord shapes. Mid-neck closed voicings. Stuff no guitarist would reach for when you asked them to \"play a G.\"",[28,234,235],{},"Neighbours of neighbours of neighbours aren't neighbours. They're strangers.",[28,237,238],{},"Beginner mode had been hiding this one too, the same way as bug one. Most of those sixty-four strangers got filtered out before they became visible. Advanced mode let the whole chain through.",[72,240,241],{},[28,242,243],{},[52,244,245],{},"\"Similar enough to substitute\" is a bounded relationship. I was treating it as unbounded and paying for it.",[28,247,248],{},"The fix was simple: only treat directly similar shapes as variations. Not friends-of-friends.",[82,250,252],{"id":251},"bug-three-the-car-salesman","Bug three: the car salesman",[28,254,255],{},"Even with the first two bugs fixed, something was still off.",[28,257,258,259,262],{},"The optimiser would sometimes swap the user's chosen voicing for a fractionally better transition. Technically an improvement. By the maths, it ",[52,260,261],{},"was"," the better choice.",[28,264,265],{},"But by the user's experience? It was ignoring what they'd asked for in exchange for a rounding error.",[28,267,268],{},"I couldn't articulate what was wrong with that. The maths said the optimiser was right. My gut said it wasn't. I sat with a cup of tea for a while, and eventually the analogy arrived.",[72,270,271,276,281,286,291,296],{},[28,272,273],{},[52,274,275],{},"Imagine you're buying a £25,000 car and you've got your heart set on it in red.",[28,277,278],{},[52,279,280],{},"You turn up to collect it and the salesman presents you with the black one.",[28,282,283],{},[52,284,285],{},"You're upset - you loved the red.",[28,287,288],{},[52,289,290],{},"The salesman says: \"It's okay, I got you a bargain. It's £50 cheaper.\"",[28,292,293],{},[52,294,295],{},"You'd be furious.",[28,297,298],{},[52,299,300],{},"But if he said it was £8,000 cheaper, you'd be ecstatic.",[28,302,303],{},"That was it.",[28,305,306],{},"The optimiser wasn't doing anything wrong mathematically. It was doing something wrong by the feel of it. It was overriding the user's choice for an improvement so small the user would resent being overridden for.",[28,308,309,310,313],{},"Fix: the benefit of swapping the user's chosen voicing has to ",[52,311,312],{},"genuinely"," exceed the cost of going against their intent. Small savings don't clear that bar. Big ones do.",[28,315,316],{},"Disappointment is a cost the maths has to account for.",[82,318,320],{"id":319},"what-i-took-from-it","What I took from it",[28,322,323,324,327],{},"A good optimiser isn't the one that finds the technically best answer. It's the one that finds the best answer ",[52,325,326],{},"within the user's expectations",". Those are different things, and treating them as the same is where a lot of clever software goes wrong.",[28,329,330],{},"Respecting user intent isn't a limit on the optimiser. It's part of the optimiser.",[28,332,333],{},"The most dangerous bugs hide behind default settings. All three of these had been sitting there for months. Beginner mode was covering for the first two. A hair-trigger swap threshold was covering for the third. I only saw them because I changed modes to take a different screenshot.",[28,335,336],{},"Marketing screenshots are an accidental but brutal QA tool. You see your product the way a user sees it - not the way a developer sees it when the dev tools are open and they already know what the output should look like.",[72,338,339],{},[28,340,341],{},[52,342,343],{},"A good optimiser isn't the smartest thing in the room. It's the most considerate thing in the room.",[82,345,347],{"id":346},"why-this-is-the-whole-product-in-miniature","Why this is the whole product in miniature",[28,349,350,351,354],{},"Fretscape is built on the idea that chord tools should help guitarists ",[52,352,353],{},"play",", not just look up shapes.",[28,356,357],{},"Helping them play means respecting what they've already said they want. Clever maths doesn't trump what the user asked for.",[359,360],"hr",{},[72,362,363],{},[28,364,365,368],{},[52,366,367],{},"I sat down to take a screenshot of the progression optimiser.",[52,369,370],{},"I ended up teaching it some manners.",[28,372,373,374,378,379,383,384,388,389,393,394,398],{},"This is one of five ",[38,375,377],{"href":376},"/blog/how-fretscape-thinks","How Fretscape Thinks"," posts. A sibling: ",[38,380,382],{"href":381},"/blog/i-built-a-chord-optimiser-that-proved-me-wrong","the Am → F transition where the optimiser disagreed with my instincts and was right",". Three more: ",[38,385,387],{"href":386},"/blog/technically-correct-vs-expected","a ranking system that was correct but read wrong",", ",[38,390,392],{"href":391},"/blog/the-wrong-name-ranked-first","why the right chord name has to be ranked first",", and ",[38,395,397],{"href":396},"/blog/what-key-is-this-progression-actually-in","a key detector that knows when it doesn't know",". Different bugs, same underlying idea: the tool has to understand more than the notes.",[359,400],{},[82,402,404],{"id":403},"a-few-questions-this-raises","A few questions this raises",[406,407,409],"h3",{"id":408},"why-didnt-you-spot-these-bugs-earlier","Why didn't you spot these bugs earlier?",[28,411,412],{},"Because I build mostly in beginner mode. The filter was masking two of the three, and the third only surfaces when the optimiser has a lot of voicings to choose between. I won't be forgetting that one. The bugs you haven't seen are the ones your default is hiding.",[406,414,416],{"id":415},"is-bug-three-really-a-bug-if-the-optimiser-was-picking-a-better-answer","Is bug three really a bug, if the optimiser was picking a better answer?",[28,418,419],{},"Technically no. By the maths, it was right. By the user's experience, it wasn't. That's the whole point - a tool that optimises against the user's intent isn't helping them, it's overruling them. Respect is part of the problem the optimiser has to solve, not a polite add-on.",[406,421,423],{"id":422},"how-do-you-avoid-overriding-user-intent-while-still-surfacing-better-options","How do you avoid overriding user intent while still surfacing better options?",[28,425,426,427,430],{},"Two things. First, set a bar - only override when the improvement is big enough to justify going against the user's choice. Second, when you do suggest a swap, make the reasoning visible. The user should be able to see ",[52,428,429],{},"why"," and decide for themselves. Hidden cleverness is the enemy.",{"title":432,"searchDepth":9,"depth":9,"links":433},"",[434,435,436,437,438,439,440,441],{"id":84,"depth":9,"text":85},{"id":146,"depth":9,"text":147},{"id":179,"depth":9,"text":180},{"id":212,"depth":9,"text":213},{"id":251,"depth":9,"text":252},{"id":319,"depth":9,"text":320},{"id":346,"depth":9,"text":347},{"id":403,"depth":9,"text":404,"children":442},[443,445,446],{"id":408,"depth":444,"text":409},3,{"id":415,"depth":444,"text":416},{"id":422,"depth":444,"text":423},[448,463,476],{"id":449,"slug":449,"title":450,"description":451,"date":452,"lastUpdated":452,"lastUpdatedKey":453,"lastUpdatedValue":454,"author":10,"tags":455,"coverImage":458,"coverImageAlt":459,"ogImage":458,"series":17,"seriesOrder":460,"readMinutes":461,"path":462,"href":396,"__fallback":23},"what-key-is-this-progression-actually-in","What Key Is This Progression Actually In?","Most key finders match scales and give you a confident-looking answer. Fretscape asks what the progression actually suggests - and tells you how sure it is.","2026-06-09","knowledgeBase.relativeTime.daysAgo",11,[12,13,456,457,15,17],"key-detection","music-theory","/images/blog/what-key-is-this-progression-actually-in-hero.jpg","A vintage brass compass resting on aged sheet music, its needle settling toward a marked point, with a faint pencilled question mark nearby",5,4,"/what-key-is-this-progression-actually-in",{"id":464,"slug":464,"title":465,"description":466,"date":467,"lastUpdated":468,"lastUpdatedKey":453,"lastUpdatedValue":469,"author":10,"tags":470,"coverImage":473,"coverImageAlt":474,"ogImage":473,"series":17,"seriesOrder":461,"readMinutes":20,"path":475,"href":391,"__fallback":23},"the-wrong-name-ranked-first","The Wrong Name, Ranked First","Hand a reverse chord lookup three notes and it leads with C6(no3) over the obvious Am7 - then warns about its own answer. Lookup isn't the problem. Ranking is.","2026-06-08","2026-06-10",10,[12,13,471,15,472,17],"reverse-chord-lookup","chord-naming","/images/blog/the-wrong-name-ranked-first-hero.jpg","A row of blank kraft-paper tags hanging from twine on wooden pegs against dark rustic wood, one tag embossed with a small acoustic guitar, warm light","/the-wrong-name-ranked-first",{"id":477,"slug":477,"title":478,"description":479,"date":480,"lastUpdated":480,"lastUpdatedKey":453,"lastUpdatedValue":481,"author":10,"tags":482,"coverImage":486,"coverImageAlt":487,"ogImage":486,"series":17,"seriesOrder":444,"readMinutes":488,"path":489,"href":386,"__fallback":23},"technically-correct-vs-expected","Technically Correct Isn't The Same As Expected","I was taking a screenshot of Am7 when I realised my ranking had been getting it wrong for months. The voicings were correct. The order wasn't.","2026-06-07",13,[12,13,483,484,15,485,17],"chord-voicings","ranking","user-expectation","/images/blog/technically-correct-vs-expected-hero.jpg","A small wooden three-tier winners podium on a warm desk, a blue first-place rosette ribbon resting on the second-place step while the tallest top step sits empty, golden light",7,"/technically-correct-vs-expected"]