~ $ cd projects/changes && cat README.md
How this site changes
How this site is built draws where each file stands. This is how often each one moves. Git keeps every commit, and every commit says which files it changed; read over the whole history, that says what the arrows cannot: which files settle and which never do, how far a change travels, which files stand where changes happen, and which change together although nothing in the code joins them.
Like the picture of how it is built, every figure here is read off the history at every push, so it is always the commit being published. Play the history, drag it, or press a commit on the picture of changes, and every figure below shows the source as it stood then.
the last of 145 commits: e3c8afa 28 September 2026 — projects/architecture, projects/changes: what a second independent reading found, put right. What a file's ground would lead one to expect now counts every commit at its own share, nothing changed below among them, so a file that changed as the history's rates say stands on the line, and three arrows away and further are one distance, since few changes are seen there; it says where a file stood, not what moved it, and the pages no longer say a file inherits anything. A bridge stands on a share of the shortest ways read either way, which says where the source meets, not what a change would cross; the Louvain method is said as what it does; the groups count the features that are a group to themselves, whole; heat and changes leave the sweeps out; exposure is scaled over the files there are; Martin counts classes, a file standing for one; the dated sentence is dated. And the picture on the page of changes works out a commit only when it is on screen, and the cascade's type stands in a file of its own, with no circle left between two files
The picture, as it changed
The picture of how this site is built, seen through its history: each ball as big as the commits that have changed it so far, and warm as it changed lately, cooling by half every six commits; a warm thread between two files that changed together twice or more, dashed where no arrow joins them. Play the history and the heat moves: a feature being written glows and cools, while the frame under the features warms again each time a new one is written. Tangle it, and what changed together pulls together too. Point at a file for what changed with it, or change the lenses for anything else the picture of how it is built can show.
src features platform features/adventure → platform/browser: 1 features/adventure → platform/markdown: 2 features/adventure → platform/plugin: 2 features/air-quality → platform/browser: 2 features/air-quality → platform/charts: 1 features/air-quality → platform/data: 3 features/air-quality → platform/plugin: 2 features/allFeatures.ts → features/adventure: 1 features/allFeatures.ts → features/air-quality: 1 features/allFeatures.ts → features/architecture: 1 features/allFeatures.ts → features/bowling-kata: 1 features/allFeatures.ts → features/developer-meetings: 1 features/allFeatures.ts → features/fibergochi: 1 features/allFeatures.ts → features/first-network: 1 features/allFeatures.ts → features/fish-market: 1 features/allFeatures.ts → features/gherkin-genie: 1 features/allFeatures.ts → features/guess-the-rule: 1 features/allFeatures.ts → features/headline: 1 features/allFeatures.ts → features/lagoon: 1 features/allFeatures.ts → features/maze: 1 features/allFeatures.ts → features/next-word: 1 features/allFeatures.ts → features/packages: 1 features/allFeatures.ts → features/portfolio: 1 features/allFeatures.ts → features/post-tests: 1 features/allFeatures.ts → features/rocket: 1 features/allFeatures.ts → features/sky: 1 features/allFeatures.ts → features/small-steps: 1 features/allFeatures.ts → features/step-names: 1 features/allFeatures.ts → features/technical-debt: 1 features/allFeatures.ts → features/tests-as-examples: 1 features/allFeatures.ts → features/theme: 1 features/allFeatures.ts → features/thesis-results: 1 features/allFeatures.ts → features/weather: 1 features/allFeatures.ts → features/world: 1 features/allFeatures.ts → platform/plugin: 1 features/architecture → platform/browser: 4 features/architecture → platform/charts: 10 features/architecture → platform/markdown: 12 features/architecture → platform/plugin: 7 features/bowling-kata → platform/browser: 1 features/bowling-kata → platform/markdown: 4 features/bowling-kata → platform/plugin: 3 features/bowling-kata → platform/testing: 4 features/developer-meetings → platform/browser: 2 features/developer-meetings → platform/charts: 1 features/developer-meetings → platform/plugin: 1 features/fibergochi → platform/browser: 2 features/fibergochi → platform/markdown: 1 features/fibergochi → platform/plugin: 2 features/first-network → platform/browser: 1 features/first-network → platform/markdown: 1 features/first-network → platform/plugin: 2 features/first-network → platform/random: 2 features/fish-market → platform/browser: 1 features/fish-market → platform/markdown: 1 features/fish-market → platform/plugin: 2 features/fish-market → platform/random: 1 features/gherkin-genie → platform/markdown: 5 features/gherkin-genie → platform/plugin: 2 features/gherkin-genie → platform/testing: 3 features/guess-the-rule → platform/browser: 1 features/guess-the-rule → platform/plugin: 2 features/headline → platform/plugin: 1 features/lagoon → platform/browser: 1 features/lagoon → platform/markdown: 1 features/lagoon → platform/plugin: 2 features/maze → platform/browser: 1 features/maze → platform/plugin: 2 features/next-word → platform/browser: 1 features/next-word → platform/markdown: 1 features/next-word → platform/plugin: 3 features/packages → platform/browser: 1 features/packages → platform/data: 2 features/packages → platform/plugin: 2 features/portfolio → platform/plugin: 1 features/post-tests → platform/browser: 1 features/post-tests → platform/markdown: 2 features/post-tests → platform/plugin: 2 features/rocket → platform/browser: 4 features/rocket → platform/plugin: 2 features/rocket → platform/program: 4 features/sky → features/world: 2 features/sky → platform/plugin: 1 features/small-steps → platform/browser: 2 features/small-steps → platform/plugin: 2 features/small-steps → platform/random: 1 features/step-names → platform/browser: 1 features/step-names → platform/markdown: 2 features/step-names → platform/plugin: 2 features/technical-debt → platform/charts: 2 features/technical-debt → platform/plugin: 1 features/technical-debt → platform/program: 2 features/tests-as-examples → platform/browser: 1 features/tests-as-examples → platform/markdown: 2 features/tests-as-examples → platform/plugin: 2 features/tests-as-examples → platform/testing: 3 features/theme → platform/analytics: 2 features/theme → platform/browser: 2 features/theme → platform/plugin: 1 features/theme → platform/shell: 2 features/thesis-results → platform/plugin: 1 features/weather → platform/browser: 2 features/weather → platform/charts: 2 features/weather → platform/data: 3 features/weather → platform/plugin: 2 features/world → platform/browser: 3 features/world → platform/plugin: 2 features/world → platform/random: 1 main.ts → features/allFeatures.ts: 1 main.ts → platform/analytics: 1 main.ts → platform/browser: 10 main.ts → platform/flags: 3 main.ts → platform/plugin: 1 main.ts → platform/shell: 1 platform/browser → platform/content: 6 platform/browser → platform/data: 1 platform/browser → platform/flags: 1 platform/browser → platform/markdown: 3 platform/browser → platform/page: 4 platform/browser → platform/plugin: 3 platform/browser → platform/program: 12 platform/browser → platform/shell: 10 platform/data → platform/markdown: 1 platform/flags → platform/markdown: 1 platform/flags → platform/shell: 2 platform/page → platform/content: 7 platform/page → platform/markdown: 4 platform/page → platform/shell: 3 platform/plugin → platform/content: 2 platform/plugin → platform/data: 1 platform/plugin → platform/flags: 1 platform/plugin → platform/program: 4 platform/plugin → platform/shell: 2 platform/program → platform/shell: 1 platform/shell → platform/content: 5 platform/shell → platform/markdown: 6 main allFeatures sky adventure air-quality architecture bowling-kata developer-meetings fibergochi first-network fish-market gherkin-genie guess-the-rule headline lagoon maze next-word packages portfolio post-tests rocket small-steps step-names technical-debt tests-as-examples theme thesis-results weather world browser plugin flags page program data shell markdown content charts testing analytics random main.ts features/allFeatures.ts features/sky/browser/followTurning.ts features/sky/browser/Starfield.ts features/sky/skyFeature.ts features/adventure/ADVENTURE_ICONS.ts features/adventure/Adventure.ts features/adventure/adventureFeature.ts features/adventure/adventureStill.ts features/adventure/browser/mountAdventure.ts features/adventure/Charted.ts features/adventure/englishWorld.ts features/adventure/LIFE.ts features/adventure/originalWorld.ts features/adventure/pixelIcon.ts features/adventure/renderAdventure.ts features/adventure/renderMap.ts features/adventure/renderSeen.ts features/adventure/World.ts features/air-quality/airQualityFeature.ts features/air-quality/aStation.ts features/air-quality/browser/mountNo2.ts features/air-quality/flatSums.ts features/air-quality/no2AnnualMeans.ts features/air-quality/no2Colour.ts features/air-quality/no2Grid.ts features/air-quality/no2ScaleTop.ts features/air-quality/No2Selection.ts features/air-quality/no2Source.ts features/air-quality/No2Station.ts features/air-quality/no2Stations.ts features/air-quality/no2Still.ts features/air-quality/renderNo2Figure.ts features/air-quality/renderNo2Heatmap.ts features/air-quality/renderNo2Years.ts features/air-quality/tallies.ts features/air-quality/wholeRecord.ts features/architecture/againstStabilityOf.ts features/architecture/architectureFeature.ts features/architecture/architectureStill.ts features/architecture/bandOf.ts features/architecture/betweennessOf.ts features/architecture/Body.ts features/architecture/boxCycles.ts features/architecture/boxLinksOf.ts features/architecture/boxOf.ts features/architecture/breakablePath.ts features/architecture/browser/ArchitectureScene.ts features/architecture/browser/changeApps.ts features/architecture/browser/changesInBrowser.ts features/architecture/browser/mountArchitecture.ts features/architecture/browser/mountChangeFigure.ts features/architecture/browser/mountChangePlayer.ts features/architecture/browser/mountCouplingFigure.ts features/architecture/browser/pointAtChangeMatrix.ts features/architecture/browser/shownCommit.ts features/architecture/Cascade.ts features/architecture/cascadeFrom.ts features/architecture/cascadeOf.ts features/architecture/changeFigures.ts features/architecture/changeMatrixOf.ts features/architecture/changeStills.ts features/architecture/changesUpTo.ts features/architecture/communitiesOf.ts features/architecture/couplingOf.ts features/architecture/couplingsOf.ts features/architecture/Coverage.ts features/architecture/coverageOf.ts features/architecture/dayOf.ts features/architecture/decodeHistory.ts features/architecture/describeMatrixCell.ts features/architecture/encodeHistory.ts features/architecture/graphOf.ts features/architecture/groundOf.ts features/architecture/heatOf.ts features/architecture/History.ts features/architecture/historyUpTo.ts features/architecture/importsOf.ts features/architecture/joinedBy.ts features/architecture/Layout.ts features/architecture/layoutArchitecture.ts features/architecture/lensesOf.ts features/architecture/Life.ts features/architecture/livesOf.ts features/architecture/matrixCellsOf.ts features/architecture/matrixRowOf.ts features/architecture/measuresOf.ts features/architecture/Metrics.ts features/architecture/metricsOf.ts features/architecture/modularityOf.ts features/architecture/onlyTypes.ts features/architecture/percent.ts features/architecture/plural.ts features/architecture/pointedAt.ts features/architecture/propagationCostOf.ts features/architecture/radiiBy.ts features/architecture/rampColour.ts features/architecture/reachedByOf.ts features/architecture/reachedByTests.ts features/architecture/reachOf.ts features/architecture/readGraph.ts features/architecture/readHistory.ts features/architecture/readSources.ts features/architecture/renderArchitectureCaption.ts features/architecture/renderArchitectureFigure.ts features/architecture/renderArchitectureSvg.ts features/architecture/renderBridgesFigure.ts features/architecture/renderCascadeFigure.ts features/architecture/renderChangeMatrix.ts features/architecture/renderChangeMatrixFigure.ts features/architecture/renderCouplingFigure.ts features/architecture/renderCouplingsFigure.ts features/architecture/renderGroundFigure.ts features/architecture/renderGroupsFigure.ts features/architecture/renderHotspotsFigure.ts features/architecture/renderMetricsSparks.ts features/architecture/renderReachFigure.ts features/architecture/renderRipplesFigure.ts features/architecture/renderSettlingFigure.ts features/architecture/renderShownCommit.ts features/architecture/renderStabilityFigure.ts features/architecture/renderTestedChangesFigure.ts features/architecture/ripplesOf.ts features/architecture/settlingOf.ts features/architecture/Snapshot.ts features/architecture/SourceGraph.ts features/architecture/sourceUrlOf.ts features/architecture/springTowards.ts features/architecture/stabilityOf.ts features/architecture/standingsOf.ts features/architecture/SWEEP.ts features/architecture/sweepsOf.ts features/architecture/tangleStep.ts features/architecture/testedChangesOf.ts features/architecture/threadsOf.ts features/architecture/undirectedOf.ts features/architecture/valueExportsOf.ts features/bowling-kata/bowlingKataFeature.ts features/bowling-kata/bowlingKataStill.ts features/bowling-kata/browser/mountBowlingKata.ts features/bowling-kata/browser/mountKataFiveSteps.ts features/bowling-kata/KATA_LESSONS.ts features/bowling-kata/KATA_STEPS.ts features/bowling-kata/kataFiveStepsSlides.ts features/bowling-kata/kataFiveStepsStill.ts features/bowling-kata/KataLesson.ts features/bowling-kata/kataLessonAt.ts features/bowling-kata/KataStep.ts features/bowling-kata/kataStepTitle.ts features/bowling-kata/lineDiff.ts features/bowling-kata/renderKataFiveSteps.ts features/bowling-kata/renderKataStep.ts features/bowling-kata/renderKataStrip.ts features/bowling-kata/runKata.ts features/developer-meetings/browser/heatGrid.ts features/developer-meetings/browser/mountDeveloperMeetings.ts features/developer-meetings/developerMeetingsFeature.ts features/developer-meetings/featureSizeScale.ts features/developer-meetings/simulateMeetings.ts features/developer-meetings/summariseMeetings.ts features/developer-meetings/WORK_WEEK.ts features/fibergochi/browser/mountFibergochi.ts features/fibergochi/Fibergochi.ts features/fibergochi/fibergochiFeature.ts features/fibergochi/FibergochiState.ts features/fibergochi/fibergochiStill.ts features/fibergochi/ODDS.ts features/fibergochi/readKept.ts features/fibergochi/renderFibergochi.ts features/fibergochi/Sprite.ts features/first-network/browser/mountLetters.ts features/first-network/firstNetworkFeature.ts features/first-network/firstReader.ts features/first-network/glyphs.ts features/first-network/LetterReader.ts features/first-network/lettersStill.ts features/first-network/Network.ts features/first-network/readOwnShapes.ts features/first-network/renderLetters.ts features/first-network/Shape.ts features/first-network/shapeProblem.ts features/fish-market/Bidder.ts features/fish-market/browser/mountFishMarket.ts features/fish-market/DutchAuction.ts features/fish-market/fishMarketFeature.ts features/fish-market/fishMarketStill.ts features/fish-market/fixedMargin.ts features/fish-market/Lot.ts features/fish-market/Market.ts features/fish-market/marketMargin.ts features/fish-market/openAuction.ts features/fish-market/ownBidder.ts features/fish-market/ownBidderSource.ts features/fish-market/planner.ts features/fish-market/randomLots.ts features/fish-market/renderFishMarket.ts features/fish-market/Sale.ts features/fish-market/Standing.ts features/fish-market/theTable.ts features/fish-market/Turn.ts features/fish-market/vicente.ts features/fish-market/wanda.ts features/gherkin-genie/browser/mountGherkinGenie.ts features/gherkin-genie/EXAMPLE_FEATURE.ts features/gherkin-genie/EXAMPLE_STEPS.ts features/gherkin-genie/genieStepOf.ts features/gherkin-genie/gherkinGenieFeature.ts features/gherkin-genie/gherkinGenieStill.ts features/gherkin-genie/readFeature.ts features/gherkin-genie/renderGenie.ts features/gherkin-genie/renderGenieRun.ts features/gherkin-genie/runGenie.ts features/gherkin-genie/wishedSteps.ts features/guess-the-rule/browser/mountGuessTheRule.ts features/guess-the-rule/GuessRound.ts features/guess-the-rule/guessTheRuleFeature.ts features/guess-the-rule/guessTheRuleStill.ts features/guess-the-rule/renderGuessTable.ts features/guess-the-rule/RULES.ts features/headline/browser/mountHeadline.ts features/headline/Headline.ts features/headline/headlineFeature.ts features/headline/headlineRounds.ts features/headline/headlines.ts features/headline/shuffled.ts features/headline/typewriterFrames.ts features/lagoon/alone.ts features/lagoon/browser/mountLagoon.ts features/lagoon/Fisher.ts features/lagoon/lagoonFeature.ts features/lagoon/lagoonStill.ts features/lagoon/ownFisher.ts features/lagoon/ownFisherSource.ts features/lagoon/playRound.ts features/lagoon/renderLagoon.ts features/lagoon/Round.ts features/lagoon/starters.ts features/lagoon/theLagoon.ts features/lagoon/titForTat.ts features/lagoon/Tournament.ts features/lagoon/Week.ts features/maze/browser/mountMaze.ts features/maze/Cell.ts features/maze/describeWay.ts features/maze/FIRST.ts features/maze/growMaze.ts features/maze/JavaRandom.ts features/maze/Maze.ts features/maze/mazeFeature.ts features/maze/mazeStill.ts features/maze/OPEN.ts features/maze/renderMaze.ts features/maze/wayOut.ts features/next-word/browser/mountNextWord.ts features/next-word/closestWord.ts features/next-word/nextWordFeature.ts features/next-word/NextWordModel.ts features/next-word/nextWordStill.ts features/next-word/pickWord.ts features/next-word/renderNextWord.ts features/next-word/sentenceOf.ts features/next-word/smallCorpus.ts features/next-word/withTemperature.ts features/next-word/wordsOf.ts features/packages/browser/mountPackages.ts features/packages/NpmDownloads.ts features/packages/npmPackages.ts features/packages/npmSource.ts features/packages/packageNotes.ts features/packages/packagesFeature.ts features/packages/packagesStill.ts features/packages/renderPackages.ts features/portfolio/portfolioFeature.ts features/post-tests/browser/mountPostTests.ts features/post-tests/compilePost.ts features/post-tests/examplePosts.ts features/post-tests/postTestsFeature.ts features/post-tests/postTestsStill.ts features/post-tests/renderCompiledPost.ts features/rocket/browser/mountRocket.ts features/rocket/browser/mountStarMap.ts features/rocket/destinations.ts features/rocket/firstShip.ts features/rocket/nearStars.ts features/rocket/projectStars.ts features/rocket/renderVoyages.ts features/rocket/rocketFeature.ts features/rocket/rocketProgram.ts features/rocket/saidSpeed.ts features/rocket/saidTime.ts features/rocket/saidTonnes.ts features/rocket/Ship.ts features/rocket/shipOf.ts features/rocket/voyage.ts features/rocket/whereAt.ts features/small-steps/browser/mountSmallSteps.ts features/small-steps/randomSteps.ts features/small-steps/renderSmallSteps.ts features/small-steps/SMALL_STEPS_LENGTH.ts features/small-steps/smallStepsFeature.ts features/small-steps/smallStepsFrames.ts features/small-steps/smallStepsStill.ts features/step-names/browser/mountStepNames.ts features/step-names/EXAMPLE_POST.ts features/step-names/renderStepCode.ts features/step-names/StepMethod.ts features/step-names/stepMethodOf.ts features/step-names/stepNamesFeature.ts features/step-names/stepNamesStill.ts features/technical-debt/simulateTechnicalDebt.ts features/technical-debt/technicalDebtFeature.ts features/technical-debt/technicalDebtProgram.ts features/tests-as-examples/browser/mountTestsAsExamples.ts features/tests-as-examples/DISPATCHER_TESTS.ts features/tests-as-examples/Dispatcher.ts features/tests-as-examples/DISPATCHERS.ts features/tests-as-examples/renderDispatcherRun.ts features/tests-as-examples/runDispatcherTests.ts features/tests-as-examples/testsAsExamplesFeature.ts features/tests-as-examples/testsAsExamplesStill.ts features/theme/browser/BrowserTheme.ts features/theme/browser/countThemeAtStart.ts features/theme/browser/mountThemeToggle.ts features/theme/browser/settleTheme.ts features/theme/Theme.ts features/theme/ThemeChoice.ts features/theme/themeCommand.ts features/theme/themeFeature.ts features/thesis-results/graphMatchingRuns.ts features/thesis-results/machines.ts features/thesis-results/renderRuns.ts features/thesis-results/thesisResultsFeature.ts features/weather/aWeatherStation.ts features/weather/browser/mountWeather.ts features/weather/countDays.ts features/weather/daysPerYear.ts features/weather/firstQuestion.ts features/weather/histogramOf.ts features/weather/questionInWords.ts features/weather/renderDaysCalendar.ts features/weather/renderWeatherFigure.ts features/weather/steadyYear.ts features/weather/twoHalves.ts features/weather/weatherFeature.ts features/weather/weatherPresets.ts features/weather/WeatherQuestion.ts features/weather/weatherSource.ts features/weather/WeatherStation.ts features/weather/weatherStations.ts features/weather/weatherStill.ts features/weather/weatherVariables.ts features/world/acrossFace.ts features/world/browser/favicon.ts features/world/browser/headerWorld.ts features/world/browser/mountHeaderWorld.ts features/world/browser/mountWorlds.ts features/world/browser/spinPlanet.ts features/world/emptyWorld.ts features/world/filters/colourise.ts features/world/filters/fractalise.ts features/world/filters/sea.ts features/world/filters/temperatures.ts features/world/generateWorld.ts features/world/growWorld.ts features/world/icosahedron.ts features/world/latitudeOfVertex.ts features/world/Mesh.ts features/world/meshOf.ts features/world/nearestVga.ts features/world/PIPELINE.ts features/world/positionOf.ts features/world/quantizeToVga.ts features/world/radiusOfFace.ts features/world/renderSphere.ts features/world/SphereOptions.ts features/world/SphereRaster.ts features/world/subdivide.ts features/world/TextCell.ts features/world/textCells.ts features/world/textWorldHtml.ts features/world/turning.ts features/world/vgaPalette.ts features/world/withMesh.ts features/world/World.ts features/world/worldFeature.ts features/world/WorldRecipe.ts platform/browser/appsOf.ts platform/browser/askProgram.ts platform/browser/BrowserFlags.ts platform/browser/carriedLine.ts platform/browser/countEvent.ts platform/browser/el.ts platform/browser/ModelContext.ts platform/browser/modelContextHere.ts platform/browser/mountApps.ts platform/browser/mountNavigation.ts platform/browser/mountPlayer.ts platform/browser/mountProgram.ts platform/browser/mountSlides.ts platform/browser/mountTerminal.ts platform/browser/offerTools.ts platform/browser/PROGRAM_ASKED.ts platform/browser/PROGRAM_RAN.ts platform/browser/siteInBrowser.ts platform/browser/sourceLineOf.ts platform/browser/watchOnScreen.ts platform/plugin/commandsOf.ts platform/plugin/Feature.ts platform/plugin/programStill.ts platform/plugin/Signal.ts platform/plugin/stillsOf.ts platform/flags/enterTrials.ts platform/flags/Flag.ts platform/flags/flagsCommand.ts platform/flags/flagsInAddress.ts platform/flags/FlagStore.ts platform/page/APPEARANCE.ts platform/page/bookSchema.ts platform/page/declaredAppearance.ts platform/page/fillStills.ts platform/page/formerAddresses.ts platform/page/isHere.ts platform/page/placeholderDisc.ts platform/page/renderDocument.ts platform/page/renderMain.ts platform/page/renderRedirect.ts platform/program/aProgram.ts platform/program/ChoiceParameter.ts platform/program/commandLineOf.ts platform/program/initialValues.ts platform/program/inputSchemaOf.ts platform/program/NumberParameter.ts platform/program/Parameter.ts platform/program/Program.ts platform/program/programCommand.ts platform/program/ProgramRun.ts platform/program/readOptions.ts platform/program/settleValues.ts platform/program/sliderOf.ts platform/program/Values.ts platform/program/wordOf.ts platform/data/layeredJson.ts platform/data/missingYears.ts platform/data/refreshSource.ts platform/data/renderSourceLine.ts platform/data/socrataUrl.ts platform/data/YearlySource.ts platform/shell/Command.ts platform/shell/CommandHistory.ts platform/shell/commands/cat.ts platform/shell/commands/cd.ts platform/shell/commands/clear.ts platform/shell/commands/find.ts platform/shell/commands/grep.ts platform/shell/commands/help.ts platform/shell/commands/ls.ts platform/shell/commands/pwd.ts platform/shell/commands/siteCommands.ts platform/shell/editLine.ts platform/shell/Outcome.ts platform/shell/parseCommandLine.ts platform/shell/plainTextOf.ts platform/shell/promptPath.ts platform/shell/renderListing.ts platform/shell/resolvePath.ts platform/shell/Shell.ts platform/shell/suggest.ts platform/shell/typedLines.ts platform/markdown/escapeHtml.ts platform/markdown/flow/layoutFlow.ts platform/markdown/flow/parseFlow.ts platform/markdown/flow/renderFlow.ts platform/markdown/highlight.ts platform/markdown/renderBars.ts platform/markdown/renderInline.ts platform/markdown/renderMarkdown.ts platform/markdown/renderMath.ts platform/markdown/slides/readSlides.ts platform/markdown/slides/renderSlides.ts platform/markdown/slides/slidesPlayback.ts platform/markdown/slides/typingSteps.ts platform/markdown/slugOf.ts platform/content/nameOf.ts platform/content/Page.ts platform/content/pageShowing.ts platform/content/parentOf.ts platform/content/parseFrontMatter.ts platform/content/routeOf.ts platform/content/Site.ts platform/charts/barChart.ts platform/charts/CHART.ts platform/charts/chartFrame.ts platform/charts/ChartLabels.ts platform/charts/fixed.ts platform/charts/lineChart.ts platform/charts/niceTicks.ts platform/charts/Series.ts platform/charts/yearBars.ts platform/charts/yearFrame.ts platform/charts/yearLine.ts platform/testing/reported.ts platform/testing/runTestFile.ts platform/testing/TestRun.ts platform/analytics/eventName.ts platform/random/randomOf.ts e3c8afa 28 September 2026 — projects/architecture, projects/changes: what a second independent reading found, put right. What a file's ground would lead one to expect now counts every commit at its own share, nothing changed below among them, so a file that changed as the history's rates say stands on the line, and three arrows away and further are one distance, since few changes are seen there; it says where a file stood, not what moved it, and the pages no longer say a file inherits anything. A bridge stands on a share of the shortest ways read either way, which says where the source meets, not what a change would cross; the Louvain method is said as what it does; the groups count the features that are a group to themselves, whole; heat and changes leave the sweeps out; exposure is scaled over the files there are; Martin counts classes, a file standing for one; the dated sentence is dated. And the picture on the page of changes works out a commit only when it is on screen, and the cascade's type stands in a file of its own, with no circle left between two files505 files in 42 boxes, 245 tests · 299 arrows between boxes, 454 of all 1214 onto a type · a test reaches 285 of the 447 files with something to test · no boxes in a circle files arrows between boxes
Where the changes went
8 Sep, a sweep: The folders say what the site is, not what kind of file each one holds 27 Sep, a sweep: The architecture is read by the compiler: a graph of the source, with whether each arrow needs a value or only a type, now the one architecture.test reads, and two new rules on it — no boxes in a circle, one value exported a file. The circle between plugin and program is broken, and eighteen files that exported more than one value are one each src main.tsmain.ts: 11 changes, 1 file written features worldfeatures/world: 46 changes, 35 files written developer-meetingsfeatures/developer-meetings: 9 changes, 7 files written technical-debtfeatures/technical-debt: 4 changes, 3 files written themefeatures/theme: 12 changes, 8 files written allFeatures.tsfeatures/allFeatures.ts: 21 changes, 1 file written skyfeatures/sky: 0 changes, 3 files written headlinefeatures/headline: 8 changes, 7 files written air-qualityfeatures/air-quality: 12 changes, 18 files written weatherfeatures/weather: 2 changes, 19 files written next-wordfeatures/next-word: 0 changes, 11 files written rocketfeatures/rocket: 7 changes, 16 files written packagesfeatures/packages: 0 changes, 8 files written thesis-resultsfeatures/thesis-results: 4 changes, 4 files written adventurefeatures/adventure: 12 changes, 14 files written post-testsfeatures/post-tests: 0 changes, 6 files written fish-marketfeatures/fish-market: 2 changes, 21 files written lagoonfeatures/lagoon: 0 changes, 15 files written mazefeatures/maze: 0 changes, 12 files written first-networkfeatures/first-network: 5 changes, 11 files written fibergochifeatures/fibergochi: 13 changes, 9 files written portfoliofeatures/portfolio: 2 changes, 1 file written architecturefeatures/architecture: 73 changes, 100 files written step-namesfeatures/step-names: 1 change, 7 files written bowling-katafeatures/bowling-kata: 6 changes, 17 files written tests-as-examplesfeatures/tests-as-examples: 0 changes, 8 files written gherkin-geniefeatures/gherkin-genie: 3 changes, 11 files written small-stepsfeatures/small-steps: 1 change, 7 files written guess-the-rulefeatures/guess-the-rule: 0 changes, 6 files written platform contentplatform/content: 8 changes, 7 files written markdownplatform/markdown: 28 changes, 14 files written pageplatform/page: 24 changes, 10 files written shellplatform/shell: 33 changes, 21 files written browserplatform/browser: 33 changes, 20 files written chartsplatform/charts: 13 changes, 11 files written pluginplatform/plugin: 10 changes, 5 files written dataplatform/data: 0 changes, 6 files written randomplatform/random: 0 changes, 1 file written programplatform/program: 10 changes, 15 files written flagsplatform/flags: 3 changes, 5 files written analyticsplatform/analytics: 0 changes, 1 file written testingplatform/testing: 0 changes, 3 files written gonethe files that are gone: 21 changes, 25 files written 7 Sep 8 Sep 12 Sep 20 Sep 21 Sep 22 Sep 23 Sep 25 Sep 28 Sep
one file changed two four eight or more a file written a sweep, over 30 files at once
145 commits, from 7 to 28 September 2026: 437 changes to files that ship, and 530 files written.
Each row is a box as it stands now, a folder of the frame or a feature, holding its files over their whole lives, from before they moved there too; the files that are gone have a row of their own. Each column is a commit. Read across, the features come in one after another, each written in a burst and then mostly left alone, while the frame under them keeps being touched. Read down, a column shaded from top to bottom is a sweep: one commit that changed more than thirty files at once. Point at a cell for what its commit did there.
Written, then left alone
The first thing the history says is how little changes. Most files are written once and not touched again, and a file is likeliest to change in the commits right after the one that wrote it.
31 of 522 5.9% 1 38 of 510 7.5% 2 47 of 979 4.8% 3–4 51 of 1874 2.7% 5–8 38 of 3550 1.1% 9–16 81 of 6441 1.3% 17–32 77 of 9196 0.8% 33–64 73 of 7319 1% 65–128 1 of 563 0.2% 129–144 its age: the commits since the one that wrote it 319 of the 505 files that ship have not changed since the commit that wrote them. A file changed in 6.7% of the first two commits it lived through, and in 1% of those after its eighth.
A file is hottest just after it is written, while what it has to do is still being settled. Then it cools, and stays cool.
The files that never settle
Some files never cool. They are not the young ones.
file changes lines tests run its life, commit by commit features/allFeatures.ts 21 65 0% platform/page/renderDocument.ts 16 152 100% platform/browser/mountTerminal.ts 14 257 0% features/world/browser/mountWorlds.ts 12 207 0% main.ts11 95 0% platform/markdown/renderMarkdown.ts 10 171 100% platform/markdown/renderInline.ts 8 111 100% features/architecture/browser/ArchitectureScene.ts 7 571 0% features/architecture/browser/mountArchitecture.ts 7 319 0% platform/shell/commands/ls.ts 6 94 100% platform/browser/mountNavigation.ts 6 76 0% platform/plugin/Feature.ts 6 65 100%
The 12 files changed most, each one's life on the same line of commits, from the first to the last: a dot where it was written, and a mark for every commit that changed it. 7 of them have no line a test runs.
Adam Tornhill calls a file that changes often and is also large, its lines standing in for how complex it is, a hotspot (Your Code as a Crime Scene , 2015), and starts there: the table gives both. When this page was written, on 28 September 2026, most of the files at its top were ones every feature, or every page, passes through: the list the features are added to, which changes because that is how the site grows; the composition root; the page every page is written into; the terminal that takes it over in the browser. A hotspot that no test runs is where a change most easily breaks something nobody sees.
How far a change travels
When a file changes, what needs it may have to change with it, and what needs that, and so on: the arrows are the roads a change can take. How far they let it go is a property of the design, which MacCormack, Rusnak and Baldwin measured as its propagation cost (2006): the share of the source a change to one file could reach, on average. How far changes did go is another question, which the history can only half answer: two files changed in one commit changed together, and it cannot say which moved the other. What it can say is how often a file changed with something it needs, near or far. At every commit, each file is counted by how far below it, in what it needs or in what that needs, the nearest other change was, and by whether it changed too.
a file it needs changed 25% · 132 of 535 two arrows down 6.3% · 17 of 270 three 2.8% · 4 of 143 four or more 3.6% · 2 of 56 nothing it needs changed 0.7% · 196 of 27149 In theory, a change to one file can reach 2% of the source, on average: itself, what needs it, and what needs that, as far as the arrows go. In the history, of the times something a file needs changed, the file changed too in 25%; when the nearest change was two arrows down, in 6.3%; when nothing it needs changed, in 0.7%.
Files joined by an arrow change together far more often than files that are not, and much less often two arrows apart than one. The blast radius drawn on the picture of how this site is built, with its reach set to all, is how far a change could go, not how far changes went.
Standing on moving ground
A file standing near files that change changes more often than one standing far from them, by as much as the figure above says for each distance. Added up over every commit, for each file, the share of files that changed where it stood is how many changes its ground would lead one to expect: its exposure. It says where a file stood, not what moved it. Set against what it did:
as its ground would lead one to expect platform/content/Page.ts: 1 changes, 0.9 from its ground platform/content/Site.ts: 1 changes, 1.2 from its ground platform/content/parseFrontMatter.ts: 0 changes, 0.9 from its ground platform/content/routeOf.ts: 0 changes, 0.9 from its ground platform/markdown/escapeHtml.ts: 0 changes, 0.9 from its ground platform/markdown/renderInline.ts: 7 changes, 0.9 from its ground platform/markdown/renderMarkdown.ts: 8 changes, 3.6 from its ground features/world/World.ts: 2 changes, 1.7 from its ground features/world/generateWorld.ts: 3 changes, 2.6 from its ground features/world/renderSphere.ts: 3 changes, 1.7 from its ground platform/page/renderDocument.ts: 15 changes, 2.5 from its ground main.ts: 10 changes, 13.8 from its ground features/world/browser/spinPlanet.ts: 4 changes, 2.5 from its ground features/world/WorldRecipe.ts: 0 changes, 0.9 from its ground features/world/growWorld.ts: 1 changes, 1.9 from its ground platform/shell/Command.ts: 0 changes, 1.6 from its ground platform/shell/CommandHistory.ts: 1 changes, 0.9 from its ground platform/shell/Outcome.ts: 2 changes, 0.9 from its ground platform/shell/Shell.ts: 1 changes, 2.6 from its ground platform/shell/commands/cat.ts: 2 changes, 3.3 from its ground platform/shell/commands/cd.ts: 2 changes, 1.1 from its ground platform/shell/commands/clear.ts: 0 changes, 1.1 from its ground platform/shell/commands/help.ts: 3 changes, 1.1 from its ground platform/shell/commands/ls.ts: 5 changes, 1.6 from its ground platform/shell/commands/pwd.ts: 0 changes, 1.1 from its ground platform/shell/parseCommandLine.ts: 0 changes, 0.9 from its ground platform/shell/promptPath.ts: 0 changes, 0.9 from its ground platform/shell/resolvePath.ts: 0 changes, 0.9 from its ground features/developer-meetings/simulateMeetings.ts: 0 changes, 1.1 from its ground features/technical-debt/simulateTechnicalDebt.ts: 0 changes, 0.9 from its ground features/developer-meetings/summariseMeetings.ts: 0 changes, 1.1 from its ground platform/page/bookSchema.ts: 0 changes, 1.1 from its ground platform/page/renderMain.ts: 3 changes, 3.4 from its ground features/developer-meetings/browser/mountDeveloperMeetings.ts: 2 changes, 1.6 from its ground features/world/browser/mountWorlds.ts: 10 changes, 2.1 from its ground platform/charts/barChart.ts: 2 changes, 1.4 from its ground platform/charts/lineChart.ts: 2 changes, 0.9 from its ground platform/browser/el.ts: 0 changes, 0.9 from its ground features/world/browser/favicon.ts: 3 changes, 1.3 from its ground features/world/browser/headerWorld.ts: 0 changes, 0.9 from its ground platform/browser/mountNavigation.ts: 4 changes, 2.5 from its ground platform/browser/siteInBrowser.ts: 0 changes, 1.1 from its ground platform/browser/mountTerminal.ts: 13 changes, 2.7 from its ground features/theme/browser/settleTheme.ts: 2 changes, 0.9 from its ground features/world/SphereOptions.ts: 0 changes, 0.8 from its ground features/world/SphereRaster.ts: 0 changes, 0.9 from its ground platform/browser/watchOnScreen.ts: 0 changes, 0.8 from its ground features/allFeatures.ts: 20 changes, 7.6 from its ground features/developer-meetings/developerMeetingsFeature.ts: 0 changes, 2.7 from its ground features/technical-debt/technicalDebtFeature.ts: 1 changes, 2.7 from its ground features/theme/Theme.ts: 1 changes, 1 from its ground features/theme/ThemeChoice.ts: 1 changes, 0.8 from its ground features/theme/browser/BrowserTheme.ts: 2 changes, 1 from its ground features/theme/browser/mountThemeToggle.ts: 0 changes, 0.8 from its ground features/theme/themeCommand.ts: 4 changes, 1.3 from its ground features/theme/themeFeature.ts: 1 changes, 3.6 from its ground features/world/browser/mountHeaderWorld.ts: 1 changes, 1.1 from its ground features/world/worldFeature.ts: 2 changes, 2.9 from its ground platform/browser/mountApps.ts: 1 changes, 2.4 from its ground platform/page/declaredAppearance.ts: 0 changes, 1 from its ground platform/plugin/Feature.ts: 6 changes, 1.6 from its ground platform/shell/commands/siteCommands.ts: 1 changes, 3.3 from its ground features/sky/browser/Starfield.ts: 0 changes, 0.8 from its ground features/sky/browser/followTurning.ts: 0 changes, 0.8 from its ground features/sky/skyFeature.ts: 0 changes, 2.4 from its ground features/world/turning.ts: 0 changes, 0.8 from its ground platform/plugin/Signal.ts: 0 changes, 0.8 from its ground platform/shell/editLine.ts: 0 changes, 0.8 from its ground platform/markdown/highlight.ts: 4 changes, 0.7 from its ground platform/markdown/flow/layoutFlow.ts: 2 changes, 0.7 from its ground platform/markdown/flow/parseFlow.ts: 0 changes, 0.7 from its ground platform/markdown/flow/renderFlow.ts: 0 changes, 1.2 from its ground platform/page/isHere.ts: 0 changes, 0.7 from its ground platform/shell/suggest.ts: 0 changes, 0.7 from its ground features/world/TextCell.ts: 0 changes, 0.7 from its ground features/world/nearestVga.ts: 0 changes, 0.7 from its ground features/world/quantizeToVga.ts: 0 changes, 0.7 from its ground features/world/textCells.ts: 0 changes, 0.7 from its ground features/world/textWorldHtml.ts: 0 changes, 0.7 from its ground features/world/vgaPalette.ts: 0 changes, 0.7 from its ground platform/page/placeholderDisc.ts: 0 changes, 0.7 from its ground features/headline/browser/mountHeadline.ts: 2 changes, 0.6 from its ground features/headline/headlineFeature.ts: 1 changes, 3.6 from its ground features/headline/headlines.ts: 5 changes, 0.6 from its ground features/headline/typewriterFrames.ts: 0 changes, 0.6 from its ground features/headline/Headline.ts: 0 changes, 0.6 from its ground features/headline/headlineRounds.ts: 0 changes, 0.6 from its ground features/headline/shuffled.ts: 0 changes, 0.6 from its ground features/air-quality/No2Station.ts: 0 changes, 0.6 from its ground features/air-quality/airQualityFeature.ts: 1 changes, 2.6 from its ground features/air-quality/no2Source.ts: 1 changes, 1.1 from its ground features/air-quality/no2Stations.ts: 2 changes, 0.6 from its ground platform/data/YearlySource.ts: 0 changes, 0.6 from its ground platform/data/layeredJson.ts: 0 changes, 0.6 from its ground platform/data/missingYears.ts: 0 changes, 0.6 from its ground platform/data/refreshSource.ts: 0 changes, 0.6 from its ground platform/data/socrataUrl.ts: 0 changes, 0.6 from its ground features/air-quality/No2Selection.ts: 0 changes, 0.6 from its ground features/air-quality/aStation.ts: 0 changes, 0.6 from its ground features/air-quality/browser/mountNo2.ts: 2 changes, 1.2 from its ground features/air-quality/no2AnnualMeans.ts: 0 changes, 0.6 from its ground features/air-quality/no2Grid.ts: 0 changes, 0.6 from its ground features/air-quality/no2ScaleTop.ts: 0 changes, 0.6 from its ground features/air-quality/no2Still.ts: 1 changes, 2.3 from its ground features/air-quality/renderNo2Figure.ts: 1 changes, 1.2 from its ground features/air-quality/renderNo2Heatmap.ts: 1 changes, 0.6 from its ground features/air-quality/renderNo2Years.ts: 2 changes, 1.1 from its ground features/air-quality/tallies.ts: 0 changes, 0.6 from its ground features/air-quality/wholeRecord.ts: 0 changes, 0.6 from its ground platform/page/fillStills.ts: 1 changes, 0.6 from its ground features/weather/WeatherStation.ts: 0 changes, 0.6 from its ground features/weather/histogramOf.ts: 0 changes, 0.6 from its ground features/weather/weatherFeature.ts: 1 changes, 1.7 from its ground features/weather/weatherSource.ts: 0 changes, 0.6 from its ground features/weather/weatherStations.ts: 0 changes, 0.6 from its ground features/weather/weatherVariables.ts: 0 changes, 0.6 from its ground features/weather/WeatherQuestion.ts: 0 changes, 0.6 from its ground features/weather/aWeatherStation.ts: 0 changes, 0.6 from its ground features/weather/countDays.ts: 0 changes, 0.6 from its ground features/weather/daysPerYear.ts: 0 changes, 0.6 from its ground features/weather/twoHalves.ts: 0 changes, 0.6 from its ground platform/charts/niceTicks.ts: 0 changes, 0.6 from its ground platform/charts/yearBars.ts: 2 changes, 0.6 from its ground platform/charts/yearFrame.ts: 0 changes, 0.6 from its ground platform/charts/yearLine.ts: 0 changes, 0.8 from its ground features/weather/browser/mountWeather.ts: 0 changes, 0.6 from its ground features/weather/firstQuestion.ts: 0 changes, 0.6 from its ground features/weather/questionInWords.ts: 0 changes, 0.6 from its ground features/weather/renderDaysCalendar.ts: 0 changes, 0.6 from its ground features/weather/renderWeatherFigure.ts: 0 changes, 0.8 from its ground features/weather/weatherPresets.ts: 0 changes, 0.6 from its ground features/weather/weatherStill.ts: 0 changes, 1.7 from its ground platform/browser/sourceLineOf.ts: 0 changes, 0.6 from its ground platform/data/renderSourceLine.ts: 0 changes, 0.6 from its ground features/air-quality/no2Colour.ts: 0 changes, 0.6 from its ground features/next-word/NextWordModel.ts: 0 changes, 0.6 from its ground features/next-word/browser/mountNextWord.ts: 0 changes, 1.4 from its ground features/next-word/closestWord.ts: 0 changes, 0.6 from its ground features/next-word/nextWordFeature.ts: 0 changes, 1.4 from its ground features/next-word/nextWordStill.ts: 0 changes, 1.4 from its ground features/next-word/pickWord.ts: 0 changes, 0.6 from its ground features/next-word/renderNextWord.ts: 0 changes, 0.6 from its ground features/next-word/sentenceOf.ts: 0 changes, 0.6 from its ground features/next-word/smallCorpus.ts: 0 changes, 0.6 from its ground features/next-word/withTemperature.ts: 0 changes, 0.6 from its ground features/next-word/wordsOf.ts: 0 changes, 0.6 from its ground features/rocket/Ship.ts: 0 changes, 0.6 from its ground features/rocket/browser/mountRocket.ts: 2 changes, 1.5 from its ground features/rocket/destinations.ts: 2 changes, 0.6 from its ground features/rocket/firstShip.ts: 0 changes, 0.6 from its ground features/rocket/renderVoyages.ts: 1 changes, 1.3 from its ground features/rocket/rocketFeature.ts: 1 changes, 1.9 from its ground features/rocket/saidTime.ts: 0 changes, 0.6 from its ground features/rocket/voyage.ts: 1 changes, 0.6 from its ground features/packages/NpmDownloads.ts: 0 changes, 0.6 from its ground features/packages/browser/mountPackages.ts: 0 changes, 0.6 from its ground features/packages/npmPackages.ts: 0 changes, 0.6 from its ground features/packages/npmSource.ts: 0 changes, 0.6 from its ground features/packages/packageNotes.ts: 0 changes, 0.6 from its ground features/packages/packagesFeature.ts: 0 changes, 1.4 from its ground features/packages/packagesStill.ts: 0 changes, 1.4 from its ground features/packages/renderPackages.ts: 0 changes, 0.6 from its ground platform/page/formerAddresses.ts: 1 changes, 0.8 from its ground platform/page/renderRedirect.ts: 0 changes, 0.5 from its ground features/thesis-results/graphMatchingRuns.ts: 1 changes, 0.5 from its ground features/thesis-results/renderRuns.ts: 1 changes, 0.8 from its ground features/thesis-results/thesisResultsFeature.ts: 0 changes, 1.6 from its ground features/rocket/browser/mountStarMap.ts: 0 changes, 1 from its ground features/rocket/nearStars.ts: 0 changes, 0.5 from its ground features/rocket/projectStars.ts: 0 changes, 0.5 from its ground features/rocket/whereAt.ts: 0 changes, 0.8 from its ground platform/markdown/renderBars.ts: 0 changes, 1.2 from its ground platform/shell/commands/find.ts: 3 changes, 0.7 from its ground platform/shell/commands/grep.ts: 0 changes, 0.5 from its ground features/adventure/Adventure.ts: 2 changes, 0.5 from its ground features/adventure/World.ts: 0 changes, 0.5 from its ground features/adventure/adventureFeature.ts: 0 changes, 1.6 from its ground features/adventure/adventureStill.ts: 0 changes, 1.8 from its ground features/adventure/browser/mountAdventure.ts: 1 changes, 0.9 from its ground features/adventure/originalWorld.ts: 0 changes, 0.5 from its ground features/adventure/renderAdventure.ts: 2 changes, 0.9 from its ground features/post-tests/browser/mountPostTests.ts: 0 changes, 0.6 from its ground features/post-tests/compilePost.ts: 0 changes, 0.5 from its ground features/post-tests/examplePosts.ts: 0 changes, 0.5 from its ground features/post-tests/postTestsFeature.ts: 0 changes, 1.4 from its ground features/post-tests/postTestsStill.ts: 0 changes, 1.4 from its ground features/post-tests/renderCompiledPost.ts: 0 changes, 0.9 from its ground features/adventure/englishWorld.ts: 0 changes, 0.4 from its ground features/fish-market/Bidder.ts: 0 changes, 0.4 from its ground features/fish-market/DutchAuction.ts: 1 changes, 0.4 from its ground features/fish-market/Lot.ts: 0 changes, 0.4 from its ground features/fish-market/Market.ts: 0 changes, 0.4 from its ground features/fish-market/Sale.ts: 0 changes, 0.4 from its ground features/fish-market/Standing.ts: 0 changes, 0.4 from its ground features/fish-market/browser/mountFishMarket.ts: 0 changes, 0.7 from its ground features/fish-market/fishMarketFeature.ts: 0 changes, 1.3 from its ground features/fish-market/fishMarketStill.ts: 0 changes, 1.5 from its ground features/fish-market/fixedMargin.ts: 0 changes, 0.4 from its ground features/fish-market/marketMargin.ts: 0 changes, 0.4 from its ground features/fish-market/openAuction.ts: 0 changes, 0.7 from its ground features/fish-market/ownBidder.ts: 0 changes, 0.4 from its ground features/fish-market/ownBidderSource.ts: 0 changes, 0.4 from its ground features/fish-market/planner.ts: 0 changes, 0.4 from its ground features/fish-market/randomLots.ts: 0 changes, 0.4 from its ground features/fish-market/renderFishMarket.ts: 1 changes, 0.7 from its ground features/fish-market/theTable.ts: 0 changes, 0.4 from its ground features/fish-market/vicente.ts: 0 changes, 0.4 from its ground features/fish-market/wanda.ts: 0 changes, 0.4 from its ground platform/random/randomOf.ts: 0 changes, 0.4 from its ground features/lagoon/Fisher.ts: 0 changes, 0.4 from its ground features/lagoon/Round.ts: 0 changes, 0.4 from its ground features/lagoon/Tournament.ts: 0 changes, 0.4 from its ground features/lagoon/Week.ts: 0 changes, 0.4 from its ground features/lagoon/alone.ts: 0 changes, 0.4 from its ground features/lagoon/browser/mountLagoon.ts: 0 changes, 0.4 from its ground features/lagoon/lagoonFeature.ts: 0 changes, 1.3 from its ground features/lagoon/lagoonStill.ts: 0 changes, 1.3 from its ground features/lagoon/ownFisher.ts: 0 changes, 0.4 from its ground features/lagoon/ownFisherSource.ts: 0 changes, 0.4 from its ground features/lagoon/playRound.ts: 0 changes, 0.4 from its ground features/lagoon/renderLagoon.ts: 0 changes, 0.4 from its ground features/lagoon/starters.ts: 0 changes, 0.4 from its ground features/lagoon/theLagoon.ts: 0 changes, 0.4 from its ground features/lagoon/titForTat.ts: 0 changes, 0.4 from its ground features/fish-market/Turn.ts: 0 changes, 0.4 from its ground platform/markdown/renderMath.ts: 0 changes, 0.4 from its ground features/maze/Cell.ts: 0 changes, 0.4 from its ground features/maze/FIRST.ts: 0 changes, 0.4 from its ground features/maze/JavaRandom.ts: 0 changes, 0.4 from its ground features/maze/Maze.ts: 0 changes, 0.4 from its ground features/maze/OPEN.ts: 0 changes, 0.4 from its ground features/maze/browser/mountMaze.ts: 0 changes, 0.4 from its ground features/maze/describeWay.ts: 0 changes, 0.4 from its ground features/maze/growMaze.ts: 0 changes, 0.4 from its ground features/maze/mazeFeature.ts: 0 changes, 1.3 from its ground features/maze/mazeStill.ts: 0 changes, 1.3 from its ground features/maze/renderMaze.ts: 0 changes, 0.4 from its ground features/maze/wayOut.ts: 0 changes, 0.4 from its ground features/first-network/LetterReader.ts: 1 changes, 0.4 from its ground features/first-network/Network.ts: 0 changes, 0.4 from its ground features/first-network/browser/mountLetters.ts: 1 changes, 0.6 from its ground features/first-network/firstNetworkFeature.ts: 2 changes, 1.5 from its ground features/first-network/firstReader.ts: 1 changes, 0.6 from its ground features/first-network/glyphs.ts: 0 changes, 0.4 from its ground features/first-network/lettersStill.ts: 0 changes, 1.5 from its ground features/first-network/renderLetters.ts: 0 changes, 0.6 from its ground features/first-network/Shape.ts: 0 changes, 0.4 from its ground features/first-network/readOwnShapes.ts: 0 changes, 0.4 from its ground features/first-network/shapeProblem.ts: 0 changes, 0.4 from its ground features/fibergochi/Fibergochi.ts: 2 changes, 0.8 from its ground features/fibergochi/FibergochiState.ts: 1 changes, 0.4 from its ground features/fibergochi/ODDS.ts: 0 changes, 0.4 from its ground features/fibergochi/Sprite.ts: 2 changes, 0.4 from its ground features/fibergochi/browser/mountFibergochi.ts: 4 changes, 0.9 from its ground features/fibergochi/fibergochiFeature.ts: 0 changes, 2.1 from its ground features/fibergochi/fibergochiStill.ts: 1 changes, 1.7 from its ground features/fibergochi/readKept.ts: 1 changes, 0.6 from its ground features/fibergochi/renderFibergochi.ts: 2 changes, 0.9 from its ground features/technical-debt/technicalDebtProgram.ts: 2 changes, 0.6 from its ground platform/browser/PROGRAM_ASKED.ts: 0 changes, 0.3 from its ground platform/browser/appsOf.ts: 1 changes, 1.1 from its ground platform/browser/askProgram.ts: 0 changes, 0.6 from its ground platform/browser/mountProgram.ts: 2 changes, 1.1 from its ground platform/plugin/commandsOf.ts: 0 changes, 1.1 from its ground platform/plugin/stillsOf.ts: 1 changes, 0.9 from its ground platform/program/Parameter.ts: 1 changes, 0.3 from its ground platform/program/Program.ts: 1 changes, 0.6 from its ground platform/program/ProgramRun.ts: 0 changes, 0.3 from its ground platform/program/Values.ts: 1 changes, 0.3 from its ground platform/program/aProgram.ts: 2 changes, 0.6 from its ground platform/program/commandLineOf.ts: 1 changes, 0.8 from its ground platform/program/initialValues.ts: 0 changes, 0.8 from its ground platform/program/inputSchemaOf.ts: 1 changes, 0.6 from its ground platform/program/programCommand.ts: 1 changes, 0.8 from its ground platform/plugin/programStill.ts: 1 changes, 0.9 from its ground platform/program/readOptions.ts: 0 changes, 0.3 from its ground platform/program/settleValues.ts: 1 changes, 0.8 from its ground platform/program/sliderOf.ts: 1 changes, 0.6 from its ground features/rocket/rocketProgram.ts: 0 changes, 0.5 from its ground features/rocket/saidSpeed.ts: 0 changes, 0.3 from its ground features/rocket/saidTonnes.ts: 0 changes, 0.3 from its ground features/rocket/shipOf.ts: 0 changes, 0.3 from its ground platform/browser/PROGRAM_RAN.ts: 0 changes, 0.3 from its ground platform/program/ChoiceParameter.ts: 0 changes, 0.3 from its ground platform/program/NumberParameter.ts: 0 changes, 0.3 from its ground platform/program/wordOf.ts: 0 changes, 0.3 from its ground platform/browser/ModelContext.ts: 2 changes, 0.3 from its ground platform/browser/modelContextHere.ts: 0 changes, 0.8 from its ground platform/browser/offerTools.ts: 2 changes, 1 from its ground platform/content/pageShowing.ts: 0 changes, 0.3 from its ground platform/shell/plainTextOf.ts: 0 changes, 0.3 from its ground features/portfolio/portfolioFeature.ts: 2 changes, 0.6 from its ground platform/browser/BrowserFlags.ts: 1 changes, 0.5 from its ground platform/flags/Flag.ts: 1 changes, 0.3 from its ground platform/flags/FlagStore.ts: 1 changes, 0.3 from its ground platform/flags/flagsCommand.ts: 1 changes, 0.5 from its ground platform/flags/flagsInAddress.ts: 0 changes, 0.5 from its ground features/adventure/renderMap.ts: 1 changes, 0.3 from its ground features/adventure/renderSeen.ts: 1 changes, 0.5 from its ground features/air-quality/flatSums.ts: 0 changes, 0.3 from its ground features/architecture/SourceGraph.ts: 1 changes, 0.3 from its ground features/architecture/architectureFeature.ts: 4 changes, 2.6 from its ground features/architecture/boxCycles.ts: 0 changes, 0.5 from its ground features/architecture/boxOf.ts: 0 changes, 0.3 from its ground features/architecture/importsOf.ts: 0 changes, 0.3 from its ground features/architecture/readGraph.ts: 1 changes, 0.5 from its ground features/architecture/readSources.ts: 0 changes, 0.5 from its ground features/architecture/valueExportsOf.ts: 0 changes, 0.3 from its ground features/developer-meetings/WORK_WEEK.ts: 1 changes, 0.3 from its ground features/thesis-results/machines.ts: 0 changes, 0.3 from its ground features/weather/steadyYear.ts: 0 changes, 0.3 from its ground features/world/Mesh.ts: 0 changes, 0.3 from its ground features/world/PIPELINE.ts: 0 changes, 0.3 from its ground features/world/acrossFace.ts: 0 changes, 0.3 from its ground features/world/emptyWorld.ts: 0 changes, 0.3 from its ground features/world/filters/colourise.ts: 0 changes, 0.3 from its ground features/world/filters/fractalise.ts: 0 changes, 0.3 from its ground features/world/filters/sea.ts: 0 changes, 0.3 from its ground features/world/filters/temperatures.ts: 0 changes, 0.3 from its ground features/world/icosahedron.ts: 0 changes, 0.3 from its ground features/world/latitudeOfVertex.ts: 0 changes, 0.3 from its ground features/world/meshOf.ts: 0 changes, 0.3 from its ground features/world/positionOf.ts: 0 changes, 0.3 from its ground features/world/radiusOfFace.ts: 0 changes, 0.3 from its ground features/world/subdivide.ts: 0 changes, 0.3 from its ground features/world/withMesh.ts: 0 changes, 0.3 from its ground platform/charts/CHART.ts: 0 changes, 0.3 from its ground platform/charts/ChartLabels.ts: 0 changes, 0.3 from its ground platform/charts/Series.ts: 0 changes, 0.3 from its ground platform/charts/chartFrame.ts: 0 changes, 0.3 from its ground platform/charts/fixed.ts: 0 changes, 0.3 from its ground platform/content/nameOf.ts: 0 changes, 0.3 from its ground platform/content/parentOf.ts: 0 changes, 0.3 from its ground platform/markdown/slugOf.ts: 0 changes, 0.3 from its ground platform/page/APPEARANCE.ts: 0 changes, 0.3 from its ground features/developer-meetings/browser/heatGrid.ts: 0 changes, 0.3 from its ground features/developer-meetings/featureSizeScale.ts: 0 changes, 0.3 from its ground platform/browser/carriedLine.ts: 0 changes, 0.3 from its ground platform/shell/typedLines.ts: 0 changes, 0.3 from its ground features/architecture/Body.ts: 0 changes, 0.2 from its ground features/architecture/History.ts: 3 changes, 0.2 from its ground features/architecture/Layout.ts: 1 changes, 0.2 from its ground features/architecture/Metrics.ts: 1 changes, 0.2 from its ground features/architecture/Snapshot.ts: 1 changes, 0.2 from its ground features/architecture/architectureStill.ts: 0 changes, 1.2 from its ground features/architecture/browser/ArchitectureScene.ts: 7 changes, 1 from its ground features/architecture/browser/mountArchitecture.ts: 7 changes, 3.1 from its ground features/architecture/decodeHistory.ts: 2 changes, 1 from its ground features/architecture/encodeHistory.ts: 3 changes, 1 from its ground features/architecture/graphOf.ts: 1 changes, 0.5 from its ground features/architecture/layoutArchitecture.ts: 3 changes, 0.5 from its ground features/architecture/metricsOf.ts: 1 changes, 0.5 from its ground features/architecture/reachedByTests.ts: 0 changes, 0.5 from its ground features/architecture/renderArchitectureCaption.ts: 3 changes, 1 from its ground features/architecture/renderArchitectureFigure.ts: 0 changes, 1.7 from its ground features/architecture/renderArchitectureSvg.ts: 0 changes, 0.5 from its ground features/architecture/renderMetricsSparks.ts: 0 changes, 0.5 from its ground features/architecture/springTowards.ts: 0 changes, 0.2 from its ground features/architecture/tangleStep.ts: 1 changes, 0.2 from its ground features/architecture/onlyTypes.ts: 0 changes, 0.2 from its ground features/architecture/Coverage.ts: 0 changes, 0.2 from its ground features/architecture/coverageOf.ts: 0 changes, 0.2 from its ground features/adventure/ADVENTURE_ICONS.ts: 0 changes, 0.2 from its ground features/adventure/Charted.ts: 0 changes, 0.2 from its ground features/adventure/LIFE.ts: 0 changes, 0.2 from its ground features/adventure/pixelIcon.ts: 0 changes, 0.2 from its ground features/theme/browser/countThemeAtStart.ts: 0 changes, 0.2 from its ground platform/analytics/eventName.ts: 0 changes, 0.2 from its ground platform/browser/countEvent.ts: 0 changes, 0.2 from its ground platform/flags/enterTrials.ts: 0 changes, 0.2 from its ground features/step-names/EXAMPLE_POST.ts: 0 changes, 0.2 from its ground features/step-names/StepMethod.ts: 0 changes, 0.2 from its ground features/step-names/browser/mountStepNames.ts: 0 changes, 0.2 from its ground features/step-names/renderStepCode.ts: 0 changes, 0.4 from its ground features/step-names/stepMethodOf.ts: 0 changes, 0.2 from its ground features/step-names/stepNamesFeature.ts: 1 changes, 0.2 from its ground features/step-names/stepNamesStill.ts: 0 changes, 0.2 from its ground features/bowling-kata/KATA_STEPS.ts: 1 changes, 0.2 from its ground features/bowling-kata/KataStep.ts: 0 changes, 0.2 from its ground features/bowling-kata/bowlingKataFeature.ts: 1 changes, 0.6 from its ground features/bowling-kata/bowlingKataStill.ts: 0 changes, 0.9 from its ground features/bowling-kata/browser/mountBowlingKata.ts: 1 changes, 0.9 from its ground features/bowling-kata/renderKataStep.ts: 2 changes, 0.4 from its ground features/bowling-kata/renderKataStrip.ts: 1 changes, 0.2 from its ground features/bowling-kata/runKata.ts: 0 changes, 0.2 from its ground features/tests-as-examples/DISPATCHERS.ts: 0 changes, 0.2 from its ground features/tests-as-examples/DISPATCHER_TESTS.ts: 0 changes, 0.2 from its ground features/tests-as-examples/Dispatcher.ts: 0 changes, 0.2 from its ground features/tests-as-examples/browser/mountTestsAsExamples.ts: 0 changes, 0.2 from its ground features/tests-as-examples/renderDispatcherRun.ts: 0 changes, 0.4 from its ground features/tests-as-examples/runDispatcherTests.ts: 0 changes, 0.2 from its ground features/tests-as-examples/testsAsExamplesFeature.ts: 0 changes, 0.2 from its ground features/tests-as-examples/testsAsExamplesStill.ts: 0 changes, 0.2 from its ground platform/testing/TestRun.ts: 0 changes, 0.2 from its ground platform/testing/reported.ts: 0 changes, 0.2 from its ground platform/testing/runTestFile.ts: 0 changes, 0.2 from its ground features/bowling-kata/kataStepTitle.ts: 0 changes, 0.2 from its ground features/gherkin-genie/EXAMPLE_FEATURE.ts: 0 changes, 0.2 from its ground features/gherkin-genie/EXAMPLE_STEPS.ts: 0 changes, 0.2 from its ground features/gherkin-genie/browser/mountGherkinGenie.ts: 1 changes, 0.4 from its ground features/gherkin-genie/genieStepOf.ts: 0 changes, 0.2 from its ground features/gherkin-genie/gherkinGenieFeature.ts: 0 changes, 0.4 from its ground features/gherkin-genie/gherkinGenieStill.ts: 0 changes, 0.4 from its ground features/gherkin-genie/readFeature.ts: 0 changes, 0.2 from its ground features/gherkin-genie/renderGenie.ts: 1 changes, 0.4 from its ground features/gherkin-genie/renderGenieRun.ts: 1 changes, 0.2 from its ground features/gherkin-genie/runGenie.ts: 0 changes, 0.2 from its ground features/gherkin-genie/wishedSteps.ts: 0 changes, 0.2 from its ground features/small-steps/SMALL_STEPS_LENGTH.ts: 0 changes, 0.2 from its ground features/small-steps/browser/mountSmallSteps.ts: 0 changes, 0.6 from its ground features/small-steps/randomSteps.ts: 0 changes, 0.2 from its ground features/small-steps/renderSmallSteps.ts: 0 changes, 0.4 from its ground features/small-steps/smallStepsFeature.ts: 0 changes, 0.3 from its ground features/small-steps/smallStepsFrames.ts: 1 changes, 0.2 from its ground features/small-steps/smallStepsStill.ts: 0 changes, 0.2 from its ground platform/browser/mountPlayer.ts: 1 changes, 0.2 from its ground platform/markdown/slides/readSlides.ts: 0 changes, 0.2 from its ground platform/markdown/slides/typingSteps.ts: 1 changes, 0.2 from its ground platform/browser/mountSlides.ts: 0 changes, 0.9 from its ground platform/markdown/slides/renderSlides.ts: 0 changes, 0.4 from its ground platform/markdown/slides/slidesPlayback.ts: 2 changes, 0.4 from its ground features/bowling-kata/KATA_LESSONS.ts: 0 changes, 0.1 from its ground features/bowling-kata/KataLesson.ts: 0 changes, 0.1 from its ground features/bowling-kata/browser/mountKataFiveSteps.ts: 0 changes, 0.2 from its ground features/bowling-kata/kataFiveStepsSlides.ts: 0 changes, 0.4 from its ground features/bowling-kata/kataFiveStepsStill.ts: 0 changes, 0.2 from its ground features/bowling-kata/kataLessonAt.ts: 0 changes, 0.1 from its ground features/bowling-kata/renderKataFiveSteps.ts: 0 changes, 0.2 from its ground features/bowling-kata/lineDiff.ts: 0 changes, 0.1 from its ground platform/shell/renderListing.ts: 0 changes, 0.1 from its ground features/architecture/radiiBy.ts: 2 changes, 0.1 from its ground features/architecture/reachOf.ts: 0 changes, 0.1 from its ground features/architecture/sourceUrlOf.ts: 0 changes, 0.1 from its ground features/guess-the-rule/GuessRound.ts: 0 changes, 0.1 from its ground features/guess-the-rule/RULES.ts: 0 changes, 0.1 from its ground features/guess-the-rule/browser/mountGuessTheRule.ts: 0 changes, 0.1 from its ground features/guess-the-rule/guessTheRuleFeature.ts: 0 changes, 0.1 from its ground features/guess-the-rule/guessTheRuleStill.ts: 0 changes, 0.1 from its ground features/guess-the-rule/renderGuessTable.ts: 0 changes, 0.1 from its ground features/architecture/Life.ts: 0 changes, 0.1 from its ground features/architecture/SWEEP.ts: 0 changes, 0.1 from its ground features/architecture/bandOf.ts: 0 changes, 0.1 from its ground features/architecture/breakablePath.ts: 0 changes, 0.1 from its ground features/architecture/cascadeOf.ts: 3 changes, 0.5 from its ground features/architecture/changeMatrixOf.ts: 1 changes, 0.1 from its ground features/architecture/changeStills.ts: 2 changes, 1.1 from its ground features/architecture/couplingsOf.ts: 0 changes, 0.3 from its ground features/architecture/livesOf.ts: 1 changes, 0.3 from its ground features/architecture/percent.ts: 0 changes, 0.1 from its ground features/architecture/plural.ts: 0 changes, 0.1 from its ground features/architecture/propagationCostOf.ts: 1 changes, 0.1 from its ground features/architecture/readHistory.ts: 0 changes, 0.3 from its ground features/architecture/renderCascadeFigure.ts: 2 changes, 0.8 from its ground features/architecture/renderChangeMatrix.ts: 1 changes, 0.5 from its ground features/architecture/renderChangeMatrixFigure.ts: 2 changes, 0.8 from its ground features/architecture/renderCouplingsFigure.ts: 1 changes, 0.1 from its ground features/architecture/renderHotspotsFigure.ts: 1 changes, 0.1 from its ground features/architecture/renderRipplesFigure.ts: 1 changes, 0.5 from its ground features/architecture/renderSettlingFigure.ts: 0 changes, 0.1 from its ground features/architecture/renderStabilityFigure.ts: 1 changes, 0.3 from its ground features/architecture/renderTestedChangesFigure.ts: 0 changes, 0.1 from its ground features/architecture/ripplesOf.ts: 2 changes, 0.3 from its ground features/architecture/settlingOf.ts: 0 changes, 0.1 from its ground features/architecture/stabilityOf.ts: 1 changes, 0.1 from its ground features/architecture/testedChangesOf.ts: 0 changes, 0.3 from its ground features/architecture/changesUpTo.ts: 1 changes, 0 from its ground features/architecture/browser/changeApps.ts: 1 changes, 0.8 from its ground features/architecture/browser/changesInBrowser.ts: 0 changes, 0.1 from its ground features/architecture/browser/mountChangeFigure.ts: 0 changes, 0.6 from its ground features/architecture/browser/mountChangePlayer.ts: 0 changes, 0.1 from its ground features/architecture/browser/pointAtChangeMatrix.ts: 0 changes, 0.1 from its ground features/architecture/browser/shownCommit.ts: 0 changes, 0 from its ground features/architecture/changeFigures.ts: 2 changes, 1 from its ground features/architecture/dayOf.ts: 0 changes, 0.3 from its ground features/architecture/describeMatrixCell.ts: 0 changes, 0.3 from its ground features/architecture/historyUpTo.ts: 0 changes, 0.3 from its ground features/architecture/matrixCellsOf.ts: 0 changes, 0 from its ground features/architecture/matrixRowOf.ts: 0 changes, 0 from its ground features/architecture/renderShownCommit.ts: 0 changes, 0.3 from its ground features/architecture/sweepsOf.ts: 0 changes, 0 from its ground features/architecture/againstStabilityOf.ts: 0 changes, 0 from its ground features/architecture/betweennessOf.ts: 0 changes, 0 from its ground features/architecture/boxLinksOf.ts: 0 changes, 0 from its ground features/architecture/cascadeFrom.ts: 1 changes, 0.3 from its ground features/architecture/communitiesOf.ts: 0 changes, 0 from its ground features/architecture/couplingOf.ts: 0 changes, 0 from its ground features/architecture/groundOf.ts: 1 changes, 0.3 from its ground features/architecture/heatOf.ts: 1 changes, 0 from its ground features/architecture/joinedBy.ts: 0 changes, 0 from its ground features/architecture/lensesOf.ts: 1 changes, 0.3 from its ground features/architecture/measuresOf.ts: 0 changes, 0 from its ground features/architecture/modularityOf.ts: 0 changes, 0 from its ground features/architecture/pointedAt.ts: 0 changes, 0.3 from its ground features/architecture/rampColour.ts: 0 changes, 0 from its ground features/architecture/reachedByOf.ts: 0 changes, 0 from its ground features/architecture/standingsOf.ts: 0 changes, 0 from its ground features/architecture/threadsOf.ts: 0 changes, 0 from its ground features/architecture/undirectedOf.ts: 0 changes, 0 from its ground features/architecture/browser/mountCouplingFigure.ts: 0 changes, 0 from its ground features/architecture/renderBridgesFigure.ts: 1 changes, 0 from its ground features/architecture/renderCouplingFigure.ts: 0 changes, 0 from its ground features/architecture/renderGroundFigure.ts: 1 changes, 0.2 from its ground features/architecture/renderGroupsFigure.ts: 1 changes, 0 from its ground features/architecture/renderReachFigure.ts: 0 changes, 0 from its ground renderDocument.ts allFeatures.ts developerMeetingsFeature.ts headlineFeature.ts 0 0 1 1 2 2 5 5 10 10 20 20 what its ground would lead one to expect, in changes the changes it had changed far more than its ground would lead one to expect far less about as much
The files whose ground would lead one to expect the most changes: main.ts (13.8), features/allFeatures.ts (7.6) and platform/markdown/renderMarkdown.ts (3.6). The ones that changed far more than theirs would: platform/page/renderDocument.ts (15 against 2.5), features/allFeatures.ts (20 against 7.6) and platform/browser/mountTerminal.ts (13 against 2.7). The ones that changed far less: features/developer-meetings/developerMeetingsFeature.ts (0 against 2.7), features/headline/headlineFeature.ts (1 against 3.6) and features/theme/themeFeature.ts (1 against 3.6).
Near the line, a file changed about as often as files standing where it stood. Far above it, a file changed for reasons of its own: it grows with every feature, or it keeps being reworked. Far below, a file stood where files change, and did not — a list of what a feature brings, which changes little whatever changes under it. On the picture above, colour set to exposure shows every file's.
Two kinds of unstable
Robert C. Martin measures how stable a component is by its place among the others, not by its history, and he counts two kinds of coupling to do it:
Ca, its afferent couplings : the files elsewhere that need something in it. Each may have to change when it does, so the more there are, the more it answers for, and the harder it is to change.Ce, its efferent couplings : its own files that need something elsewhere. Each may have to change when what it needs does, so the more there are, the more it depends, and the more often something else makes it change.
He counts classes, not arrows, and here a file stands for a class: a file that needs three things elsewhere is one to Ce. His instability puts the two together, I = Ce / (Ca + Ce): 0 for a box that is only needed, hard to change because whatever needs it may have to change with it; 1 for a box that only needs, which nothing stops from changing. Pick a box, and see its two couplings drawn and the sum worked out:
Ca = 10: files elsewhere that need it Ce = 8: its files that need elsewhere shell platform/browser · 2 files platform/page · 2 files platform/plugin · 2 files features/theme · 1 file main.ts · 1 file platform/flags · 1 file platform/program · 1 file platform/markdown · 6 files platform/content · 5 files platform/shell : Ca = 10, the files elsewhere that need something in it; Ce = 8, its own files that need something elsewhere. I = Ce / (Ca + Ce) = 8 / (10 + 8) = 0.44. Between the two: it is needed, and it needs.
His rule for them is to depend in the direction of stability: an arrow should go from a box to one more stable than itself, so that what is hard to change never needs what is easy to change, and keeps changing. On the picture above, colour set to stability draws every box as deep as it is stable, and the arrows that go against the rule in red. When this was written, on 28 September 2026, most of them left the list of features: one file, needed by one, which by his count stands half way, and which has to point at every feature, because putting them together is what it is for.
He also measures how abstract a box is: here, the share of its files that hold nothing but types, which can be depended on without depending on what anything does. And he draws the two against each other. A box on the line between the two corners, the main sequence, is as abstract as its place asks. A box at the bottom left is needed by much and concrete, hard to change with nothing abstract in it to change instead: the zone of pain. And he says what his picture cannot show, that only what keeps changing hurts there; so each box here is as warm as the history says its files changed, the sweeps left out.
zone of pain zone of uselessness the main sequence features/lagoon: needed by 1 file elsewhere, needs 4; 0 changes to its 15 files features/maze: needed by 1 file elsewhere, needs 3; 0 changes to its 12 files features/next-word: needed by 1 file elsewhere, needs 4; 0 changes to its 11 files features/packages: needed by 1 file elsewhere, needs 4; 0 changes to its 8 files features/tests-as-examples: needed by 1 file elsewhere, needs 5; 0 changes to its 8 files features/guess-the-rule: needed by 1 file elsewhere, needs 3; 0 changes to its 6 files features/post-tests: needed by 1 file elsewhere, needs 4; 0 changes to its 6 files platform/data: needed by 8 files elsewhere, needs 1; 0 changes to its 6 files features/sky: needed by 1 file elsewhere, needs 3; 0 changes to its 3 files platform/testing: needed by 4 files elsewhere, needs 0; 0 changes to its 3 files platform/analytics: needed by 3 files elsewhere, needs 0; 0 changes to its 1 file platform/random: needed by 5 files elsewhere, needs 0; 0 changes to its 1 file features/weather: needed by 1 file elsewhere, needs 5; 1 change to its 19 files features/fish-market: needed by 1 file elsewhere, needs 5; 2 changes to its 21 files features/small-steps: needed by 1 file elsewhere, needs 3; 1 change to its 7 files features/step-names: needed by 1 file elsewhere, needs 4; 1 change to its 7 files features/gherkin-genie: needed by 1 file elsewhere, needs 6; 3 changes to its 11 files platform/content: needed by 15 files elsewhere, needs 0; 2 changes to its 7 files features/bowling-kata: needed by 1 file elsewhere, needs 9; 6 changes to its 17 files features/developer-meetings: needed by 1 file elsewhere, needs 3; 3 changes to its 7 files features/rocket: needed by 1 file elsewhere, needs 4; 7 changes to its 16 files features/first-network: needed by 1 file elsewhere, needs 6; 5 changes to its 11 files features/adventure: needed by 1 file elsewhere, needs 5; 7 changes to its 14 files features/thesis-results: needed by 1 file elsewhere, needs 1; 2 changes to its 4 files platform/charts: needed by 13 files elsewhere, needs 0; 6 changes to its 11 files platform/flags: needed by 3 files elsewhere, needs 1; 3 changes to its 5 files features/air-quality: needed by 1 file elsewhere, needs 5; 11 changes to its 18 files platform/program: needed by 10 files elsewhere, needs 1; 10 changes to its 15 files features/architecture: needed by 1 file elsewhere, needs 24; 73 changes to its 100 files features/world: needed by 3 files elsewhere, needs 5; 29 changes to its 35 files platform/shell: needed by 10 files elsewhere, needs 8; 20 changes to its 21 files features/technical-debt: needed by 1 file elsewhere, needs 2; 3 changes to its 3 files features/headline: needed by 1 file elsewhere, needs 1; 8 changes to its 7 files platform/browser: needed by 27 files elsewhere, needs 11; 27 changes to its 20 files features/theme: needed by 1 file elsewhere, needs 4; 11 changes to its 8 files features/fibergochi: needed by 1 file elsewhere, needs 4; 13 changes to its 9 files platform/plugin: needed by 59 files elsewhere, needs 3; 8 changes to its 5 files platform/markdown: needed by 40 files elsewhere, needs 0; 24 changes to its 14 files platform/page: needed by 1 file elsewhere, needs 6; 20 changes to its 10 files features/portfolio: needed by 1 file elsewhere, needs 1; 2 changes to its 1 file main.ts: needed by 0 files elsewhere, needs 1; 10 changes to its 1 file features/allFeatures.ts: needed by 1 file elsewhere, needs 1; 20 changes to its 1 file platform/program platform/plugin platform/browser platform/markdown 0 0.5 0.5 1 1 instability: how little needs it, so how free it is to change abstractness: its files of nothing but types 10 boxes stand in the zone of pain. The ones there that have changed, the most first: platform/markdown (1.7 changes a file), platform/plugin (1.6), platform/browser (1.4), platform/program (0.7), platform/charts (0.5) and platform/content (0.3). 32 arrows between boxes go from a box to a less stable one, against his rule of stable dependencies; the steepest, from platform/browser to platform/page. 24 of them leave features/allFeatures.ts. every box's figures box files needed by needs I A D changes a file features/adventure 14 1 5 0.83 0.14 0.02 0.5 features/air-quality 18 1 5 0.83 0.11 0.06 0.6 features/allFeatures.ts 1 1 1 0.50 0.00 0.50 20 features/architecture 100 1 24 0.96 0.09 0.05 0.7 features/bowling-kata 17 1 9 0.90 0.12 0.02 0.4 features/developer-meetings 7 1 3 0.75 0.00 0.25 0.4 features/fibergochi 9 1 4 0.80 0.11 0.09 1.4 features/first-network 11 1 6 0.86 0.09 0.05 0.5 features/fish-market 21 1 5 0.83 0.29 0.12 0.1 features/gherkin-genie 11 1 6 0.86 0.00 0.14 0.3 features/guess-the-rule 6 1 3 0.75 0.00 0.25 0 features/headline 7 1 1 0.50 0.14 0.36 1.1 features/lagoon 15 1 4 0.80 0.20 0.00 0 features/maze 12 1 3 0.75 0.17 0.08 0 features/next-word 11 1 4 0.80 0.00 0.20 0 features/packages 8 1 4 0.80 0.13 0.07 0 features/portfolio 1 1 1 0.50 0.00 0.50 2 features/post-tests 6 1 4 0.80 0.00 0.20 0 features/rocket 16 1 4 0.80 0.06 0.14 0.4 features/sky 3 1 3 0.75 0.00 0.25 0 features/small-steps 7 1 3 0.75 0.00 0.25 0.1 features/step-names 7 1 4 0.80 0.14 0.06 0.1 features/technical-debt 3 1 2 0.67 0.00 0.33 1 features/tests-as-examples 8 1 5 0.83 0.13 0.04 0 features/theme 8 1 4 0.80 0.25 0.05 1.4 features/thesis-results 4 1 1 0.50 0.00 0.50 0.5 features/weather 19 1 5 0.83 0.11 0.06 0.1 features/world 35 3 5 0.63 0.11 0.26 0.8 main.ts1 0 1 1.00 0.00 0.00 10 platform/analytics 1 3 0 0.00 0.00 1.00 0 platform/browser 20 27 11 0.29 0.05 0.66 1.4 platform/charts 11 13 0 0.00 0.18 0.82 0.5 platform/content 7 15 0 0.00 0.14 0.86 0.3 platform/data 6 8 1 0.11 0.17 0.72 0 platform/flags 5 3 1 0.25 0.40 0.35 0.6 platform/markdown 14 40 0 0.00 0.00 1.00 1.7 platform/page 10 1 6 0.86 0.00 0.14 2 platform/plugin 5 59 3 0.05 0.20 0.75 1.6 platform/program 15 10 1 0.09 0.40 0.51 0.7 platform/random 1 5 0 0.00 0.00 1.00 0 platform/shell 21 10 8 0.44 0.10 0.46 1 platform/testing 3 4 0 0.00 0.33 0.67 0
The frame stands near that corner, as a frame would: everything is built on it, and most of it is plain code. Where the two kinds of unstable disagree, a box that is hard to change and changes anyway, is where a change costs most, because what needs it may have to move with it.
An arrow onto a type
The dashed arrows on the picture need only a type: a box that depends on an interface, not on what implements it. That is dependency inversion, and its promise is that a change to what implements the interface does not reach those that use it: there is no arrow for it to travel, and the figure of how far a change travels counts how seldom files change with nothing changed below them. What an arrow onto a type can still carry is a change to the type itself. For each kind of arrow, how often a change at its head came with a change at its tail:
onto a value onto only a type inside a box 35% · 91 of 258 48% · 54 of 113 across two boxes 22% · 27 of 121 12% · 20 of 166
Across boxes, an arrow onto a type carried a change less often than one onto a value: 12% against 22%. But 138 of those 166 were changes to one file, platform/plugin/Feature.ts, and carried 5.8%; the rest carried 43%. Inside a box, more often: 48% against 35%.
An interface that grows by what its users may leave alone, a field they need not fill, changes without them; one that breaks them changes with them. And where one file is most of the arrows onto a type, the count is mostly that file's, which the caption says when it is so.
What changes together
Two files that keep changing in the same commits are tied in the history, whatever the arrows say. Harald Gall, Karin Hajek and Mehdi Jazayeri called it logical coupling (1998). A commit that changed more than thirty files is left out: a rename across the whole source changes everything at once, and says nothing about what needs what.
commits one file and the other between them 6 features/architecture/browser/ArchitectureScene.ts features/architecture/browser/mountArchitecture.ts an arrow 5 platform/page/renderDocument.ts platform/browser/mountTerminal.ts no arrow at all 5 main.tsplatform/browser/mountTerminal.ts an arrow 3 platform/page/renderDocument.ts main.tsno arrow at all 3 platform/page/renderDocument.ts platform/browser/mountNavigation.ts no arrow at all 3 main.tsplatform/plugin/Feature.ts arrows through others 3 features/world/browser/spinPlanet.ts features/world/browser/mountWorlds.ts an arrow 3 platform/shell/commands/ls.ts platform/shell/commands/find.ts no arrow at all 3 platform/browser/mountNavigation.ts platform/browser/mountTerminal.ts no arrow at all 3 features/architecture/History.ts features/architecture/encodeHistory.ts an arrow 2 platform/markdown/renderInline.ts platform/markdown/renderMarkdown.ts an arrow 2 platform/markdown/renderInline.ts features/allFeatures.ts no arrow at all
The 12 pairs of files that changed together most, the tests and the sweeps left out, and what joins them in the source now. 6 of them have no arrow between them, near or far.
Where there is an arrow, changing together says it is a strong one: it carries. The pairs worth reading are those with no arrow between them, near or far: they share something the compiler cannot see. Among them are the page the build writes, in node, and the terminal that takes it over in the browser. This site's first rule is that the content is in the HTML, and this is its price: the page and the script that reads it must agree on its markup, a contract no import states, kept by changing both. On the picture above, they are the dashed threads.
With its test
A change that comes with a change to its test, in the same commit, is the mark test-driven work leaves in a history. The history cannot say which was written first, only that they went together.
81% of the changes to a file a test imports came with its test
141 of the 174 changes to a file a test imports came with a change to that test, or a new one, in the same commit. Another 151 changes went to files with something to run that no test imports.
The changes to files no test imports directly are counted apart: some of those files a test runs through another, as the shell's tests run its commands, and some no test runs at all.
What it is not
The history starts on 7 September 2026, so it is short, and some of these numbers are small enough to move with the next commit. A commit is the unit, however much it changed: a one-word fix and a rewrite are one change each. The history is the main line's, and a branch's commits arrive with the merge that brought them. The tests are left out of every count but the last, because a test changes when what it tests does, and would count every change twice. The sweeps are left out of what changes with what, and of how often a box changed. And changing together is not needing each other: it is what has to be explained.
The analyses are small programs in the source of this site, tested like the rest of it, and they read the same history the picture of how it is built plays.