~ $ 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.

srcfeaturesplatformfeatures/adventure → platform/browser: 1features/adventure → platform/markdown: 2features/adventure → platform/plugin: 2features/air-quality → platform/browser: 2features/air-quality → platform/charts: 1features/air-quality → platform/data: 3features/air-quality → platform/plugin: 2features/allFeatures.ts → features/adventure: 1features/allFeatures.ts → features/air-quality: 1features/allFeatures.ts → features/architecture: 1features/allFeatures.ts → features/bowling-kata: 1features/allFeatures.ts → features/developer-meetings: 1features/allFeatures.ts → features/fibergochi: 1features/allFeatures.ts → features/first-network: 1features/allFeatures.ts → features/fish-market: 1features/allFeatures.ts → features/gherkin-genie: 1features/allFeatures.ts → features/guess-the-rule: 1features/allFeatures.ts → features/headline: 1features/allFeatures.ts → features/lagoon: 1features/allFeatures.ts → features/maze: 1features/allFeatures.ts → features/next-word: 1features/allFeatures.ts → features/packages: 1features/allFeatures.ts → features/portfolio: 1features/allFeatures.ts → features/post-tests: 1features/allFeatures.ts → features/rocket: 1features/allFeatures.ts → features/sky: 1features/allFeatures.ts → features/small-steps: 1features/allFeatures.ts → features/step-names: 1features/allFeatures.ts → features/technical-debt: 1features/allFeatures.ts → features/tests-as-examples: 1features/allFeatures.ts → features/theme: 1features/allFeatures.ts → features/thesis-results: 1features/allFeatures.ts → features/weather: 1features/allFeatures.ts → features/world: 1features/allFeatures.ts → platform/plugin: 1features/architecture → platform/browser: 4features/architecture → platform/charts: 10features/architecture → platform/markdown: 12features/architecture → platform/plugin: 7features/bowling-kata → platform/browser: 1features/bowling-kata → platform/markdown: 4features/bowling-kata → platform/plugin: 3features/bowling-kata → platform/testing: 4features/developer-meetings → platform/browser: 2features/developer-meetings → platform/charts: 1features/developer-meetings → platform/plugin: 1features/fibergochi → platform/browser: 2features/fibergochi → platform/markdown: 1features/fibergochi → platform/plugin: 2features/first-network → platform/browser: 1features/first-network → platform/markdown: 1features/first-network → platform/plugin: 2features/first-network → platform/random: 2features/fish-market → platform/browser: 1features/fish-market → platform/markdown: 1features/fish-market → platform/plugin: 2features/fish-market → platform/random: 1features/gherkin-genie → platform/markdown: 5features/gherkin-genie → platform/plugin: 2features/gherkin-genie → platform/testing: 3features/guess-the-rule → platform/browser: 1features/guess-the-rule → platform/plugin: 2features/headline → platform/plugin: 1features/lagoon → platform/browser: 1features/lagoon → platform/markdown: 1features/lagoon → platform/plugin: 2features/maze → platform/browser: 1features/maze → platform/plugin: 2features/next-word → platform/browser: 1features/next-word → platform/markdown: 1features/next-word → platform/plugin: 3features/packages → platform/browser: 1features/packages → platform/data: 2features/packages → platform/plugin: 2features/portfolio → platform/plugin: 1features/post-tests → platform/browser: 1features/post-tests → platform/markdown: 2features/post-tests → platform/plugin: 2features/rocket → platform/browser: 4features/rocket → platform/plugin: 2features/rocket → platform/program: 4features/sky → features/world: 2features/sky → platform/plugin: 1features/small-steps → platform/browser: 2features/small-steps → platform/plugin: 2features/small-steps → platform/random: 1features/step-names → platform/browser: 1features/step-names → platform/markdown: 2features/step-names → platform/plugin: 2features/technical-debt → platform/charts: 2features/technical-debt → platform/plugin: 1features/technical-debt → platform/program: 2features/tests-as-examples → platform/browser: 1features/tests-as-examples → platform/markdown: 2features/tests-as-examples → platform/plugin: 2features/tests-as-examples → platform/testing: 3features/theme → platform/analytics: 2features/theme → platform/browser: 2features/theme → platform/plugin: 1features/theme → platform/shell: 2features/thesis-results → platform/plugin: 1features/weather → platform/browser: 2features/weather → platform/charts: 2features/weather → platform/data: 3features/weather → platform/plugin: 2features/world → platform/browser: 3features/world → platform/plugin: 2features/world → platform/random: 1main.ts → features/allFeatures.ts: 1main.ts → platform/analytics: 1main.ts → platform/browser: 10main.ts → platform/flags: 3main.ts → platform/plugin: 1main.ts → platform/shell: 1platform/browser → platform/content: 6platform/browser → platform/data: 1platform/browser → platform/flags: 1platform/browser → platform/markdown: 3platform/browser → platform/page: 4platform/browser → platform/plugin: 3platform/browser → platform/program: 12platform/browser → platform/shell: 10platform/data → platform/markdown: 1platform/flags → platform/markdown: 1platform/flags → platform/shell: 2platform/page → platform/content: 7platform/page → platform/markdown: 4platform/page → platform/shell: 3platform/plugin → platform/content: 2platform/plugin → platform/data: 1platform/plugin → platform/flags: 1platform/plugin → platform/program: 4platform/plugin → platform/shell: 2platform/program → platform/shell: 1platform/shell → platform/content: 5platform/shell → platform/markdown: 6mainallFeaturesskyadventureair-qualityarchitecturebowling-katadeveloper-meetingsfibergochifirst-networkfish-marketgherkin-genieguess-the-ruleheadlinelagoonmazenext-wordpackagesportfoliopost-testsrocketsmall-stepsstep-namestechnical-debttests-as-examplesthemethesis-resultsweatherworldbrowserpluginflagspageprogramdatashellmarkdowncontentchartstestinganalyticsrandommain.tsfeatures/allFeatures.tsfeatures/sky/browser/followTurning.tsfeatures/sky/browser/Starfield.tsfeatures/sky/skyFeature.tsfeatures/adventure/ADVENTURE_ICONS.tsfeatures/adventure/Adventure.tsfeatures/adventure/adventureFeature.tsfeatures/adventure/adventureStill.tsfeatures/adventure/browser/mountAdventure.tsfeatures/adventure/Charted.tsfeatures/adventure/englishWorld.tsfeatures/adventure/LIFE.tsfeatures/adventure/originalWorld.tsfeatures/adventure/pixelIcon.tsfeatures/adventure/renderAdventure.tsfeatures/adventure/renderMap.tsfeatures/adventure/renderSeen.tsfeatures/adventure/World.tsfeatures/air-quality/airQualityFeature.tsfeatures/air-quality/aStation.tsfeatures/air-quality/browser/mountNo2.tsfeatures/air-quality/flatSums.tsfeatures/air-quality/no2AnnualMeans.tsfeatures/air-quality/no2Colour.tsfeatures/air-quality/no2Grid.tsfeatures/air-quality/no2ScaleTop.tsfeatures/air-quality/No2Selection.tsfeatures/air-quality/no2Source.tsfeatures/air-quality/No2Station.tsfeatures/air-quality/no2Stations.tsfeatures/air-quality/no2Still.tsfeatures/air-quality/renderNo2Figure.tsfeatures/air-quality/renderNo2Heatmap.tsfeatures/air-quality/renderNo2Years.tsfeatures/air-quality/tallies.tsfeatures/air-quality/wholeRecord.tsfeatures/architecture/againstStabilityOf.tsfeatures/architecture/architectureFeature.tsfeatures/architecture/architectureStill.tsfeatures/architecture/bandOf.tsfeatures/architecture/betweennessOf.tsfeatures/architecture/Body.tsfeatures/architecture/boxCycles.tsfeatures/architecture/boxLinksOf.tsfeatures/architecture/boxOf.tsfeatures/architecture/breakablePath.tsfeatures/architecture/browser/ArchitectureScene.tsfeatures/architecture/browser/changeApps.tsfeatures/architecture/browser/changesInBrowser.tsfeatures/architecture/browser/mountArchitecture.tsfeatures/architecture/browser/mountChangeFigure.tsfeatures/architecture/browser/mountChangePlayer.tsfeatures/architecture/browser/mountCouplingFigure.tsfeatures/architecture/browser/pointAtChangeMatrix.tsfeatures/architecture/browser/shownCommit.tsfeatures/architecture/Cascade.tsfeatures/architecture/cascadeFrom.tsfeatures/architecture/cascadeOf.tsfeatures/architecture/changeFigures.tsfeatures/architecture/changeMatrixOf.tsfeatures/architecture/changeStills.tsfeatures/architecture/changesUpTo.tsfeatures/architecture/communitiesOf.tsfeatures/architecture/couplingOf.tsfeatures/architecture/couplingsOf.tsfeatures/architecture/Coverage.tsfeatures/architecture/coverageOf.tsfeatures/architecture/dayOf.tsfeatures/architecture/decodeHistory.tsfeatures/architecture/describeMatrixCell.tsfeatures/architecture/encodeHistory.tsfeatures/architecture/graphOf.tsfeatures/architecture/groundOf.tsfeatures/architecture/heatOf.tsfeatures/architecture/History.tsfeatures/architecture/historyUpTo.tsfeatures/architecture/importsOf.tsfeatures/architecture/joinedBy.tsfeatures/architecture/Layout.tsfeatures/architecture/layoutArchitecture.tsfeatures/architecture/lensesOf.tsfeatures/architecture/Life.tsfeatures/architecture/livesOf.tsfeatures/architecture/matrixCellsOf.tsfeatures/architecture/matrixRowOf.tsfeatures/architecture/measuresOf.tsfeatures/architecture/Metrics.tsfeatures/architecture/metricsOf.tsfeatures/architecture/modularityOf.tsfeatures/architecture/onlyTypes.tsfeatures/architecture/percent.tsfeatures/architecture/plural.tsfeatures/architecture/pointedAt.tsfeatures/architecture/propagationCostOf.tsfeatures/architecture/radiiBy.tsfeatures/architecture/rampColour.tsfeatures/architecture/reachedByOf.tsfeatures/architecture/reachedByTests.tsfeatures/architecture/reachOf.tsfeatures/architecture/readGraph.tsfeatures/architecture/readHistory.tsfeatures/architecture/readSources.tsfeatures/architecture/renderArchitectureCaption.tsfeatures/architecture/renderArchitectureFigure.tsfeatures/architecture/renderArchitectureSvg.tsfeatures/architecture/renderBridgesFigure.tsfeatures/architecture/renderCascadeFigure.tsfeatures/architecture/renderChangeMatrix.tsfeatures/architecture/renderChangeMatrixFigure.tsfeatures/architecture/renderCouplingFigure.tsfeatures/architecture/renderCouplingsFigure.tsfeatures/architecture/renderGroundFigure.tsfeatures/architecture/renderGroupsFigure.tsfeatures/architecture/renderHotspotsFigure.tsfeatures/architecture/renderMetricsSparks.tsfeatures/architecture/renderReachFigure.tsfeatures/architecture/renderRipplesFigure.tsfeatures/architecture/renderSettlingFigure.tsfeatures/architecture/renderShownCommit.tsfeatures/architecture/renderStabilityFigure.tsfeatures/architecture/renderTestedChangesFigure.tsfeatures/architecture/ripplesOf.tsfeatures/architecture/settlingOf.tsfeatures/architecture/Snapshot.tsfeatures/architecture/SourceGraph.tsfeatures/architecture/sourceUrlOf.tsfeatures/architecture/springTowards.tsfeatures/architecture/stabilityOf.tsfeatures/architecture/standingsOf.tsfeatures/architecture/SWEEP.tsfeatures/architecture/sweepsOf.tsfeatures/architecture/tangleStep.tsfeatures/architecture/testedChangesOf.tsfeatures/architecture/threadsOf.tsfeatures/architecture/undirectedOf.tsfeatures/architecture/valueExportsOf.tsfeatures/bowling-kata/bowlingKataFeature.tsfeatures/bowling-kata/bowlingKataStill.tsfeatures/bowling-kata/browser/mountBowlingKata.tsfeatures/bowling-kata/browser/mountKataFiveSteps.tsfeatures/bowling-kata/KATA_LESSONS.tsfeatures/bowling-kata/KATA_STEPS.tsfeatures/bowling-kata/kataFiveStepsSlides.tsfeatures/bowling-kata/kataFiveStepsStill.tsfeatures/bowling-kata/KataLesson.tsfeatures/bowling-kata/kataLessonAt.tsfeatures/bowling-kata/KataStep.tsfeatures/bowling-kata/kataStepTitle.tsfeatures/bowling-kata/lineDiff.tsfeatures/bowling-kata/renderKataFiveSteps.tsfeatures/bowling-kata/renderKataStep.tsfeatures/bowling-kata/renderKataStrip.tsfeatures/bowling-kata/runKata.tsfeatures/developer-meetings/browser/heatGrid.tsfeatures/developer-meetings/browser/mountDeveloperMeetings.tsfeatures/developer-meetings/developerMeetingsFeature.tsfeatures/developer-meetings/featureSizeScale.tsfeatures/developer-meetings/simulateMeetings.tsfeatures/developer-meetings/summariseMeetings.tsfeatures/developer-meetings/WORK_WEEK.tsfeatures/fibergochi/browser/mountFibergochi.tsfeatures/fibergochi/Fibergochi.tsfeatures/fibergochi/fibergochiFeature.tsfeatures/fibergochi/FibergochiState.tsfeatures/fibergochi/fibergochiStill.tsfeatures/fibergochi/ODDS.tsfeatures/fibergochi/readKept.tsfeatures/fibergochi/renderFibergochi.tsfeatures/fibergochi/Sprite.tsfeatures/first-network/browser/mountLetters.tsfeatures/first-network/firstNetworkFeature.tsfeatures/first-network/firstReader.tsfeatures/first-network/glyphs.tsfeatures/first-network/LetterReader.tsfeatures/first-network/lettersStill.tsfeatures/first-network/Network.tsfeatures/first-network/readOwnShapes.tsfeatures/first-network/renderLetters.tsfeatures/first-network/Shape.tsfeatures/first-network/shapeProblem.tsfeatures/fish-market/Bidder.tsfeatures/fish-market/browser/mountFishMarket.tsfeatures/fish-market/DutchAuction.tsfeatures/fish-market/fishMarketFeature.tsfeatures/fish-market/fishMarketStill.tsfeatures/fish-market/fixedMargin.tsfeatures/fish-market/Lot.tsfeatures/fish-market/Market.tsfeatures/fish-market/marketMargin.tsfeatures/fish-market/openAuction.tsfeatures/fish-market/ownBidder.tsfeatures/fish-market/ownBidderSource.tsfeatures/fish-market/planner.tsfeatures/fish-market/randomLots.tsfeatures/fish-market/renderFishMarket.tsfeatures/fish-market/Sale.tsfeatures/fish-market/Standing.tsfeatures/fish-market/theTable.tsfeatures/fish-market/Turn.tsfeatures/fish-market/vicente.tsfeatures/fish-market/wanda.tsfeatures/gherkin-genie/browser/mountGherkinGenie.tsfeatures/gherkin-genie/EXAMPLE_FEATURE.tsfeatures/gherkin-genie/EXAMPLE_STEPS.tsfeatures/gherkin-genie/genieStepOf.tsfeatures/gherkin-genie/gherkinGenieFeature.tsfeatures/gherkin-genie/gherkinGenieStill.tsfeatures/gherkin-genie/readFeature.tsfeatures/gherkin-genie/renderGenie.tsfeatures/gherkin-genie/renderGenieRun.tsfeatures/gherkin-genie/runGenie.tsfeatures/gherkin-genie/wishedSteps.tsfeatures/guess-the-rule/browser/mountGuessTheRule.tsfeatures/guess-the-rule/GuessRound.tsfeatures/guess-the-rule/guessTheRuleFeature.tsfeatures/guess-the-rule/guessTheRuleStill.tsfeatures/guess-the-rule/renderGuessTable.tsfeatures/guess-the-rule/RULES.tsfeatures/headline/browser/mountHeadline.tsfeatures/headline/Headline.tsfeatures/headline/headlineFeature.tsfeatures/headline/headlineRounds.tsfeatures/headline/headlines.tsfeatures/headline/shuffled.tsfeatures/headline/typewriterFrames.tsfeatures/lagoon/alone.tsfeatures/lagoon/browser/mountLagoon.tsfeatures/lagoon/Fisher.tsfeatures/lagoon/lagoonFeature.tsfeatures/lagoon/lagoonStill.tsfeatures/lagoon/ownFisher.tsfeatures/lagoon/ownFisherSource.tsfeatures/lagoon/playRound.tsfeatures/lagoon/renderLagoon.tsfeatures/lagoon/Round.tsfeatures/lagoon/starters.tsfeatures/lagoon/theLagoon.tsfeatures/lagoon/titForTat.tsfeatures/lagoon/Tournament.tsfeatures/lagoon/Week.tsfeatures/maze/browser/mountMaze.tsfeatures/maze/Cell.tsfeatures/maze/describeWay.tsfeatures/maze/FIRST.tsfeatures/maze/growMaze.tsfeatures/maze/JavaRandom.tsfeatures/maze/Maze.tsfeatures/maze/mazeFeature.tsfeatures/maze/mazeStill.tsfeatures/maze/OPEN.tsfeatures/maze/renderMaze.tsfeatures/maze/wayOut.tsfeatures/next-word/browser/mountNextWord.tsfeatures/next-word/closestWord.tsfeatures/next-word/nextWordFeature.tsfeatures/next-word/NextWordModel.tsfeatures/next-word/nextWordStill.tsfeatures/next-word/pickWord.tsfeatures/next-word/renderNextWord.tsfeatures/next-word/sentenceOf.tsfeatures/next-word/smallCorpus.tsfeatures/next-word/withTemperature.tsfeatures/next-word/wordsOf.tsfeatures/packages/browser/mountPackages.tsfeatures/packages/NpmDownloads.tsfeatures/packages/npmPackages.tsfeatures/packages/npmSource.tsfeatures/packages/packageNotes.tsfeatures/packages/packagesFeature.tsfeatures/packages/packagesStill.tsfeatures/packages/renderPackages.tsfeatures/portfolio/portfolioFeature.tsfeatures/post-tests/browser/mountPostTests.tsfeatures/post-tests/compilePost.tsfeatures/post-tests/examplePosts.tsfeatures/post-tests/postTestsFeature.tsfeatures/post-tests/postTestsStill.tsfeatures/post-tests/renderCompiledPost.tsfeatures/rocket/browser/mountRocket.tsfeatures/rocket/browser/mountStarMap.tsfeatures/rocket/destinations.tsfeatures/rocket/firstShip.tsfeatures/rocket/nearStars.tsfeatures/rocket/projectStars.tsfeatures/rocket/renderVoyages.tsfeatures/rocket/rocketFeature.tsfeatures/rocket/rocketProgram.tsfeatures/rocket/saidSpeed.tsfeatures/rocket/saidTime.tsfeatures/rocket/saidTonnes.tsfeatures/rocket/Ship.tsfeatures/rocket/shipOf.tsfeatures/rocket/voyage.tsfeatures/rocket/whereAt.tsfeatures/small-steps/browser/mountSmallSteps.tsfeatures/small-steps/randomSteps.tsfeatures/small-steps/renderSmallSteps.tsfeatures/small-steps/SMALL_STEPS_LENGTH.tsfeatures/small-steps/smallStepsFeature.tsfeatures/small-steps/smallStepsFrames.tsfeatures/small-steps/smallStepsStill.tsfeatures/step-names/browser/mountStepNames.tsfeatures/step-names/EXAMPLE_POST.tsfeatures/step-names/renderStepCode.tsfeatures/step-names/StepMethod.tsfeatures/step-names/stepMethodOf.tsfeatures/step-names/stepNamesFeature.tsfeatures/step-names/stepNamesStill.tsfeatures/technical-debt/simulateTechnicalDebt.tsfeatures/technical-debt/technicalDebtFeature.tsfeatures/technical-debt/technicalDebtProgram.tsfeatures/tests-as-examples/browser/mountTestsAsExamples.tsfeatures/tests-as-examples/DISPATCHER_TESTS.tsfeatures/tests-as-examples/Dispatcher.tsfeatures/tests-as-examples/DISPATCHERS.tsfeatures/tests-as-examples/renderDispatcherRun.tsfeatures/tests-as-examples/runDispatcherTests.tsfeatures/tests-as-examples/testsAsExamplesFeature.tsfeatures/tests-as-examples/testsAsExamplesStill.tsfeatures/theme/browser/BrowserTheme.tsfeatures/theme/browser/countThemeAtStart.tsfeatures/theme/browser/mountThemeToggle.tsfeatures/theme/browser/settleTheme.tsfeatures/theme/Theme.tsfeatures/theme/ThemeChoice.tsfeatures/theme/themeCommand.tsfeatures/theme/themeFeature.tsfeatures/thesis-results/graphMatchingRuns.tsfeatures/thesis-results/machines.tsfeatures/thesis-results/renderRuns.tsfeatures/thesis-results/thesisResultsFeature.tsfeatures/weather/aWeatherStation.tsfeatures/weather/browser/mountWeather.tsfeatures/weather/countDays.tsfeatures/weather/daysPerYear.tsfeatures/weather/firstQuestion.tsfeatures/weather/histogramOf.tsfeatures/weather/questionInWords.tsfeatures/weather/renderDaysCalendar.tsfeatures/weather/renderWeatherFigure.tsfeatures/weather/steadyYear.tsfeatures/weather/twoHalves.tsfeatures/weather/weatherFeature.tsfeatures/weather/weatherPresets.tsfeatures/weather/WeatherQuestion.tsfeatures/weather/weatherSource.tsfeatures/weather/WeatherStation.tsfeatures/weather/weatherStations.tsfeatures/weather/weatherStill.tsfeatures/weather/weatherVariables.tsfeatures/world/acrossFace.tsfeatures/world/browser/favicon.tsfeatures/world/browser/headerWorld.tsfeatures/world/browser/mountHeaderWorld.tsfeatures/world/browser/mountWorlds.tsfeatures/world/browser/spinPlanet.tsfeatures/world/emptyWorld.tsfeatures/world/filters/colourise.tsfeatures/world/filters/fractalise.tsfeatures/world/filters/sea.tsfeatures/world/filters/temperatures.tsfeatures/world/generateWorld.tsfeatures/world/growWorld.tsfeatures/world/icosahedron.tsfeatures/world/latitudeOfVertex.tsfeatures/world/Mesh.tsfeatures/world/meshOf.tsfeatures/world/nearestVga.tsfeatures/world/PIPELINE.tsfeatures/world/positionOf.tsfeatures/world/quantizeToVga.tsfeatures/world/radiusOfFace.tsfeatures/world/renderSphere.tsfeatures/world/SphereOptions.tsfeatures/world/SphereRaster.tsfeatures/world/subdivide.tsfeatures/world/TextCell.tsfeatures/world/textCells.tsfeatures/world/textWorldHtml.tsfeatures/world/turning.tsfeatures/world/vgaPalette.tsfeatures/world/withMesh.tsfeatures/world/World.tsfeatures/world/worldFeature.tsfeatures/world/WorldRecipe.tsplatform/browser/appsOf.tsplatform/browser/askProgram.tsplatform/browser/BrowserFlags.tsplatform/browser/carriedLine.tsplatform/browser/countEvent.tsplatform/browser/el.tsplatform/browser/ModelContext.tsplatform/browser/modelContextHere.tsplatform/browser/mountApps.tsplatform/browser/mountNavigation.tsplatform/browser/mountPlayer.tsplatform/browser/mountProgram.tsplatform/browser/mountSlides.tsplatform/browser/mountTerminal.tsplatform/browser/offerTools.tsplatform/browser/PROGRAM_ASKED.tsplatform/browser/PROGRAM_RAN.tsplatform/browser/siteInBrowser.tsplatform/browser/sourceLineOf.tsplatform/browser/watchOnScreen.tsplatform/plugin/commandsOf.tsplatform/plugin/Feature.tsplatform/plugin/programStill.tsplatform/plugin/Signal.tsplatform/plugin/stillsOf.tsplatform/flags/enterTrials.tsplatform/flags/Flag.tsplatform/flags/flagsCommand.tsplatform/flags/flagsInAddress.tsplatform/flags/FlagStore.tsplatform/page/APPEARANCE.tsplatform/page/bookSchema.tsplatform/page/declaredAppearance.tsplatform/page/fillStills.tsplatform/page/formerAddresses.tsplatform/page/isHere.tsplatform/page/placeholderDisc.tsplatform/page/renderDocument.tsplatform/page/renderMain.tsplatform/page/renderRedirect.tsplatform/program/aProgram.tsplatform/program/ChoiceParameter.tsplatform/program/commandLineOf.tsplatform/program/initialValues.tsplatform/program/inputSchemaOf.tsplatform/program/NumberParameter.tsplatform/program/Parameter.tsplatform/program/Program.tsplatform/program/programCommand.tsplatform/program/ProgramRun.tsplatform/program/readOptions.tsplatform/program/settleValues.tsplatform/program/sliderOf.tsplatform/program/Values.tsplatform/program/wordOf.tsplatform/data/layeredJson.tsplatform/data/missingYears.tsplatform/data/refreshSource.tsplatform/data/renderSourceLine.tsplatform/data/socrataUrl.tsplatform/data/YearlySource.tsplatform/shell/Command.tsplatform/shell/CommandHistory.tsplatform/shell/commands/cat.tsplatform/shell/commands/cd.tsplatform/shell/commands/clear.tsplatform/shell/commands/find.tsplatform/shell/commands/grep.tsplatform/shell/commands/help.tsplatform/shell/commands/ls.tsplatform/shell/commands/pwd.tsplatform/shell/commands/siteCommands.tsplatform/shell/editLine.tsplatform/shell/Outcome.tsplatform/shell/parseCommandLine.tsplatform/shell/plainTextOf.tsplatform/shell/promptPath.tsplatform/shell/renderListing.tsplatform/shell/resolvePath.tsplatform/shell/Shell.tsplatform/shell/suggest.tsplatform/shell/typedLines.tsplatform/markdown/escapeHtml.tsplatform/markdown/flow/layoutFlow.tsplatform/markdown/flow/parseFlow.tsplatform/markdown/flow/renderFlow.tsplatform/markdown/highlight.tsplatform/markdown/renderBars.tsplatform/markdown/renderInline.tsplatform/markdown/renderMarkdown.tsplatform/markdown/renderMath.tsplatform/markdown/slides/readSlides.tsplatform/markdown/slides/renderSlides.tsplatform/markdown/slides/slidesPlayback.tsplatform/markdown/slides/typingSteps.tsplatform/markdown/slugOf.tsplatform/content/nameOf.tsplatform/content/Page.tsplatform/content/pageShowing.tsplatform/content/parentOf.tsplatform/content/parseFrontMatter.tsplatform/content/routeOf.tsplatform/content/Site.tsplatform/charts/barChart.tsplatform/charts/CHART.tsplatform/charts/chartFrame.tsplatform/charts/ChartLabels.tsplatform/charts/fixed.tsplatform/charts/lineChart.tsplatform/charts/niceTicks.tsplatform/charts/Series.tsplatform/charts/yearBars.tsplatform/charts/yearFrame.tsplatform/charts/yearLine.tsplatform/testing/reported.tsplatform/testing/runTestFile.tsplatform/testing/TestRun.tsplatform/analytics/eventName.tsplatform/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 files
505 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
filesarrows between boxes

Where the changes went

8 Sep, a sweep: The folders say what the site is, not what kind of file each one holds27 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 eachsrcmain.tsmain.ts: 11 changes, 1 file writtenfeaturesworldfeatures/world: 46 changes, 35 files writtendeveloper-meetingsfeatures/developer-meetings: 9 changes, 7 files writtentechnical-debtfeatures/technical-debt: 4 changes, 3 files writtenthemefeatures/theme: 12 changes, 8 files writtenallFeatures.tsfeatures/allFeatures.ts: 21 changes, 1 file writtenskyfeatures/sky: 0 changes, 3 files writtenheadlinefeatures/headline: 8 changes, 7 files writtenair-qualityfeatures/air-quality: 12 changes, 18 files writtenweatherfeatures/weather: 2 changes, 19 files writtennext-wordfeatures/next-word: 0 changes, 11 files writtenrocketfeatures/rocket: 7 changes, 16 files writtenpackagesfeatures/packages: 0 changes, 8 files writtenthesis-resultsfeatures/thesis-results: 4 changes, 4 files writtenadventurefeatures/adventure: 12 changes, 14 files writtenpost-testsfeatures/post-tests: 0 changes, 6 files writtenfish-marketfeatures/fish-market: 2 changes, 21 files writtenlagoonfeatures/lagoon: 0 changes, 15 files writtenmazefeatures/maze: 0 changes, 12 files writtenfirst-networkfeatures/first-network: 5 changes, 11 files writtenfibergochifeatures/fibergochi: 13 changes, 9 files writtenportfoliofeatures/portfolio: 2 changes, 1 file writtenarchitecturefeatures/architecture: 73 changes, 100 files writtenstep-namesfeatures/step-names: 1 change, 7 files writtenbowling-katafeatures/bowling-kata: 6 changes, 17 files writtentests-as-examplesfeatures/tests-as-examples: 0 changes, 8 files writtengherkin-geniefeatures/gherkin-genie: 3 changes, 11 files writtensmall-stepsfeatures/small-steps: 1 change, 7 files writtenguess-the-rulefeatures/guess-the-rule: 0 changes, 6 files writtenplatformcontentplatform/content: 8 changes, 7 files writtenmarkdownplatform/markdown: 28 changes, 14 files writtenpageplatform/page: 24 changes, 10 files writtenshellplatform/shell: 33 changes, 21 files writtenbrowserplatform/browser: 33 changes, 20 files writtenchartsplatform/charts: 13 changes, 11 files writtenpluginplatform/plugin: 10 changes, 5 files writtendataplatform/data: 0 changes, 6 files writtenrandomplatform/random: 0 changes, 1 file writtenprogramplatform/program: 10 changes, 15 files writtenflagsplatform/flags: 3 changes, 5 files writtenanalyticsplatform/analytics: 0 changes, 1 file writtentestingplatform/testing: 0 changes, 3 files writtengonethe files that are gone: 21 changes, 25 files written7 Sep8 Sep12 Sep20 Sep21 Sep22 Sep23 Sep25 Sep28 Sep

one file changedtwofoureight or morea file writtena 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 5225.9%138 of 5107.5%247 of 9794.8%3–451 of 18742.7%5–838 of 35501.1%9–1681 of 64411.3%17–3277 of 91960.8%33–6473 of 73191%65–1281 of 5630.2%129–144its 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.

filechangeslinestests runits life, commit by commit
features/allFeatures.ts21650%
platform/page/renderDocument.ts16152100%
platform/browser/mountTerminal.ts142570%
features/world/browser/mountWorlds.ts122070%
main.ts11950%
platform/markdown/renderMarkdown.ts10171100%
platform/markdown/renderInline.ts8111100%
features/architecture/browser/ArchitectureScene.ts75710%
features/architecture/browser/mountArchitecture.ts73190%
platform/shell/commands/ls.ts694100%
platform/browser/mountNavigation.ts6760%
platform/plugin/Feature.ts665100%
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 changed25% · 132 of 535two arrows down6.3% · 17 of 270three2.8% · 4 of 143four or more3.6% · 2 of 56nothing it needs changed0.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 expectplatform/content/Page.ts: 1 changes, 0.9 from its groundplatform/content/Site.ts: 1 changes, 1.2 from its groundplatform/content/parseFrontMatter.ts: 0 changes, 0.9 from its groundplatform/content/routeOf.ts: 0 changes, 0.9 from its groundplatform/markdown/escapeHtml.ts: 0 changes, 0.9 from its groundplatform/markdown/renderInline.ts: 7 changes, 0.9 from its groundplatform/markdown/renderMarkdown.ts: 8 changes, 3.6 from its groundfeatures/world/World.ts: 2 changes, 1.7 from its groundfeatures/world/generateWorld.ts: 3 changes, 2.6 from its groundfeatures/world/renderSphere.ts: 3 changes, 1.7 from its groundplatform/page/renderDocument.ts: 15 changes, 2.5 from its groundmain.ts: 10 changes, 13.8 from its groundfeatures/world/browser/spinPlanet.ts: 4 changes, 2.5 from its groundfeatures/world/WorldRecipe.ts: 0 changes, 0.9 from its groundfeatures/world/growWorld.ts: 1 changes, 1.9 from its groundplatform/shell/Command.ts: 0 changes, 1.6 from its groundplatform/shell/CommandHistory.ts: 1 changes, 0.9 from its groundplatform/shell/Outcome.ts: 2 changes, 0.9 from its groundplatform/shell/Shell.ts: 1 changes, 2.6 from its groundplatform/shell/commands/cat.ts: 2 changes, 3.3 from its groundplatform/shell/commands/cd.ts: 2 changes, 1.1 from its groundplatform/shell/commands/clear.ts: 0 changes, 1.1 from its groundplatform/shell/commands/help.ts: 3 changes, 1.1 from its groundplatform/shell/commands/ls.ts: 5 changes, 1.6 from its groundplatform/shell/commands/pwd.ts: 0 changes, 1.1 from its groundplatform/shell/parseCommandLine.ts: 0 changes, 0.9 from its groundplatform/shell/promptPath.ts: 0 changes, 0.9 from its groundplatform/shell/resolvePath.ts: 0 changes, 0.9 from its groundfeatures/developer-meetings/simulateMeetings.ts: 0 changes, 1.1 from its groundfeatures/technical-debt/simulateTechnicalDebt.ts: 0 changes, 0.9 from its groundfeatures/developer-meetings/summariseMeetings.ts: 0 changes, 1.1 from its groundplatform/page/bookSchema.ts: 0 changes, 1.1 from its groundplatform/page/renderMain.ts: 3 changes, 3.4 from its groundfeatures/developer-meetings/browser/mountDeveloperMeetings.ts: 2 changes, 1.6 from its groundfeatures/world/browser/mountWorlds.ts: 10 changes, 2.1 from its groundplatform/charts/barChart.ts: 2 changes, 1.4 from its groundplatform/charts/lineChart.ts: 2 changes, 0.9 from its groundplatform/browser/el.ts: 0 changes, 0.9 from its groundfeatures/world/browser/favicon.ts: 3 changes, 1.3 from its groundfeatures/world/browser/headerWorld.ts: 0 changes, 0.9 from its groundplatform/browser/mountNavigation.ts: 4 changes, 2.5 from its groundplatform/browser/siteInBrowser.ts: 0 changes, 1.1 from its groundplatform/browser/mountTerminal.ts: 13 changes, 2.7 from its groundfeatures/theme/browser/settleTheme.ts: 2 changes, 0.9 from its groundfeatures/world/SphereOptions.ts: 0 changes, 0.8 from its groundfeatures/world/SphereRaster.ts: 0 changes, 0.9 from its groundplatform/browser/watchOnScreen.ts: 0 changes, 0.8 from its groundfeatures/allFeatures.ts: 20 changes, 7.6 from its groundfeatures/developer-meetings/developerMeetingsFeature.ts: 0 changes, 2.7 from its groundfeatures/technical-debt/technicalDebtFeature.ts: 1 changes, 2.7 from its groundfeatures/theme/Theme.ts: 1 changes, 1 from its groundfeatures/theme/ThemeChoice.ts: 1 changes, 0.8 from its groundfeatures/theme/browser/BrowserTheme.ts: 2 changes, 1 from its groundfeatures/theme/browser/mountThemeToggle.ts: 0 changes, 0.8 from its groundfeatures/theme/themeCommand.ts: 4 changes, 1.3 from its groundfeatures/theme/themeFeature.ts: 1 changes, 3.6 from its groundfeatures/world/browser/mountHeaderWorld.ts: 1 changes, 1.1 from its groundfeatures/world/worldFeature.ts: 2 changes, 2.9 from its groundplatform/browser/mountApps.ts: 1 changes, 2.4 from its groundplatform/page/declaredAppearance.ts: 0 changes, 1 from its groundplatform/plugin/Feature.ts: 6 changes, 1.6 from its groundplatform/shell/commands/siteCommands.ts: 1 changes, 3.3 from its groundfeatures/sky/browser/Starfield.ts: 0 changes, 0.8 from its groundfeatures/sky/browser/followTurning.ts: 0 changes, 0.8 from its groundfeatures/sky/skyFeature.ts: 0 changes, 2.4 from its groundfeatures/world/turning.ts: 0 changes, 0.8 from its groundplatform/plugin/Signal.ts: 0 changes, 0.8 from its groundplatform/shell/editLine.ts: 0 changes, 0.8 from its groundplatform/markdown/highlight.ts: 4 changes, 0.7 from its groundplatform/markdown/flow/layoutFlow.ts: 2 changes, 0.7 from its groundplatform/markdown/flow/parseFlow.ts: 0 changes, 0.7 from its groundplatform/markdown/flow/renderFlow.ts: 0 changes, 1.2 from its groundplatform/page/isHere.ts: 0 changes, 0.7 from its groundplatform/shell/suggest.ts: 0 changes, 0.7 from its groundfeatures/world/TextCell.ts: 0 changes, 0.7 from its groundfeatures/world/nearestVga.ts: 0 changes, 0.7 from its groundfeatures/world/quantizeToVga.ts: 0 changes, 0.7 from its groundfeatures/world/textCells.ts: 0 changes, 0.7 from its groundfeatures/world/textWorldHtml.ts: 0 changes, 0.7 from its groundfeatures/world/vgaPalette.ts: 0 changes, 0.7 from its groundplatform/page/placeholderDisc.ts: 0 changes, 0.7 from its groundfeatures/headline/browser/mountHeadline.ts: 2 changes, 0.6 from its groundfeatures/headline/headlineFeature.ts: 1 changes, 3.6 from its groundfeatures/headline/headlines.ts: 5 changes, 0.6 from its groundfeatures/headline/typewriterFrames.ts: 0 changes, 0.6 from its groundfeatures/headline/Headline.ts: 0 changes, 0.6 from its groundfeatures/headline/headlineRounds.ts: 0 changes, 0.6 from its groundfeatures/headline/shuffled.ts: 0 changes, 0.6 from its groundfeatures/air-quality/No2Station.ts: 0 changes, 0.6 from its groundfeatures/air-quality/airQualityFeature.ts: 1 changes, 2.6 from its groundfeatures/air-quality/no2Source.ts: 1 changes, 1.1 from its groundfeatures/air-quality/no2Stations.ts: 2 changes, 0.6 from its groundplatform/data/YearlySource.ts: 0 changes, 0.6 from its groundplatform/data/layeredJson.ts: 0 changes, 0.6 from its groundplatform/data/missingYears.ts: 0 changes, 0.6 from its groundplatform/data/refreshSource.ts: 0 changes, 0.6 from its groundplatform/data/socrataUrl.ts: 0 changes, 0.6 from its groundfeatures/air-quality/No2Selection.ts: 0 changes, 0.6 from its groundfeatures/air-quality/aStation.ts: 0 changes, 0.6 from its groundfeatures/air-quality/browser/mountNo2.ts: 2 changes, 1.2 from its groundfeatures/air-quality/no2AnnualMeans.ts: 0 changes, 0.6 from its groundfeatures/air-quality/no2Grid.ts: 0 changes, 0.6 from its groundfeatures/air-quality/no2ScaleTop.ts: 0 changes, 0.6 from its groundfeatures/air-quality/no2Still.ts: 1 changes, 2.3 from its groundfeatures/air-quality/renderNo2Figure.ts: 1 changes, 1.2 from its groundfeatures/air-quality/renderNo2Heatmap.ts: 1 changes, 0.6 from its groundfeatures/air-quality/renderNo2Years.ts: 2 changes, 1.1 from its groundfeatures/air-quality/tallies.ts: 0 changes, 0.6 from its groundfeatures/air-quality/wholeRecord.ts: 0 changes, 0.6 from its groundplatform/page/fillStills.ts: 1 changes, 0.6 from its groundfeatures/weather/WeatherStation.ts: 0 changes, 0.6 from its groundfeatures/weather/histogramOf.ts: 0 changes, 0.6 from its groundfeatures/weather/weatherFeature.ts: 1 changes, 1.7 from its groundfeatures/weather/weatherSource.ts: 0 changes, 0.6 from its groundfeatures/weather/weatherStations.ts: 0 changes, 0.6 from its groundfeatures/weather/weatherVariables.ts: 0 changes, 0.6 from its groundfeatures/weather/WeatherQuestion.ts: 0 changes, 0.6 from its groundfeatures/weather/aWeatherStation.ts: 0 changes, 0.6 from its groundfeatures/weather/countDays.ts: 0 changes, 0.6 from its groundfeatures/weather/daysPerYear.ts: 0 changes, 0.6 from its groundfeatures/weather/twoHalves.ts: 0 changes, 0.6 from its groundplatform/charts/niceTicks.ts: 0 changes, 0.6 from its groundplatform/charts/yearBars.ts: 2 changes, 0.6 from its groundplatform/charts/yearFrame.ts: 0 changes, 0.6 from its groundplatform/charts/yearLine.ts: 0 changes, 0.8 from its groundfeatures/weather/browser/mountWeather.ts: 0 changes, 0.6 from its groundfeatures/weather/firstQuestion.ts: 0 changes, 0.6 from its groundfeatures/weather/questionInWords.ts: 0 changes, 0.6 from its groundfeatures/weather/renderDaysCalendar.ts: 0 changes, 0.6 from its groundfeatures/weather/renderWeatherFigure.ts: 0 changes, 0.8 from its groundfeatures/weather/weatherPresets.ts: 0 changes, 0.6 from its groundfeatures/weather/weatherStill.ts: 0 changes, 1.7 from its groundplatform/browser/sourceLineOf.ts: 0 changes, 0.6 from its groundplatform/data/renderSourceLine.ts: 0 changes, 0.6 from its groundfeatures/air-quality/no2Colour.ts: 0 changes, 0.6 from its groundfeatures/next-word/NextWordModel.ts: 0 changes, 0.6 from its groundfeatures/next-word/browser/mountNextWord.ts: 0 changes, 1.4 from its groundfeatures/next-word/closestWord.ts: 0 changes, 0.6 from its groundfeatures/next-word/nextWordFeature.ts: 0 changes, 1.4 from its groundfeatures/next-word/nextWordStill.ts: 0 changes, 1.4 from its groundfeatures/next-word/pickWord.ts: 0 changes, 0.6 from its groundfeatures/next-word/renderNextWord.ts: 0 changes, 0.6 from its groundfeatures/next-word/sentenceOf.ts: 0 changes, 0.6 from its groundfeatures/next-word/smallCorpus.ts: 0 changes, 0.6 from its groundfeatures/next-word/withTemperature.ts: 0 changes, 0.6 from its groundfeatures/next-word/wordsOf.ts: 0 changes, 0.6 from its groundfeatures/rocket/Ship.ts: 0 changes, 0.6 from its groundfeatures/rocket/browser/mountRocket.ts: 2 changes, 1.5 from its groundfeatures/rocket/destinations.ts: 2 changes, 0.6 from its groundfeatures/rocket/firstShip.ts: 0 changes, 0.6 from its groundfeatures/rocket/renderVoyages.ts: 1 changes, 1.3 from its groundfeatures/rocket/rocketFeature.ts: 1 changes, 1.9 from its groundfeatures/rocket/saidTime.ts: 0 changes, 0.6 from its groundfeatures/rocket/voyage.ts: 1 changes, 0.6 from its groundfeatures/packages/NpmDownloads.ts: 0 changes, 0.6 from its groundfeatures/packages/browser/mountPackages.ts: 0 changes, 0.6 from its groundfeatures/packages/npmPackages.ts: 0 changes, 0.6 from its groundfeatures/packages/npmSource.ts: 0 changes, 0.6 from its groundfeatures/packages/packageNotes.ts: 0 changes, 0.6 from its groundfeatures/packages/packagesFeature.ts: 0 changes, 1.4 from its groundfeatures/packages/packagesStill.ts: 0 changes, 1.4 from its groundfeatures/packages/renderPackages.ts: 0 changes, 0.6 from its groundplatform/page/formerAddresses.ts: 1 changes, 0.8 from its groundplatform/page/renderRedirect.ts: 0 changes, 0.5 from its groundfeatures/thesis-results/graphMatchingRuns.ts: 1 changes, 0.5 from its groundfeatures/thesis-results/renderRuns.ts: 1 changes, 0.8 from its groundfeatures/thesis-results/thesisResultsFeature.ts: 0 changes, 1.6 from its groundfeatures/rocket/browser/mountStarMap.ts: 0 changes, 1 from its groundfeatures/rocket/nearStars.ts: 0 changes, 0.5 from its groundfeatures/rocket/projectStars.ts: 0 changes, 0.5 from its groundfeatures/rocket/whereAt.ts: 0 changes, 0.8 from its groundplatform/markdown/renderBars.ts: 0 changes, 1.2 from its groundplatform/shell/commands/find.ts: 3 changes, 0.7 from its groundplatform/shell/commands/grep.ts: 0 changes, 0.5 from its groundfeatures/adventure/Adventure.ts: 2 changes, 0.5 from its groundfeatures/adventure/World.ts: 0 changes, 0.5 from its groundfeatures/adventure/adventureFeature.ts: 0 changes, 1.6 from its groundfeatures/adventure/adventureStill.ts: 0 changes, 1.8 from its groundfeatures/adventure/browser/mountAdventure.ts: 1 changes, 0.9 from its groundfeatures/adventure/originalWorld.ts: 0 changes, 0.5 from its groundfeatures/adventure/renderAdventure.ts: 2 changes, 0.9 from its groundfeatures/post-tests/browser/mountPostTests.ts: 0 changes, 0.6 from its groundfeatures/post-tests/compilePost.ts: 0 changes, 0.5 from its groundfeatures/post-tests/examplePosts.ts: 0 changes, 0.5 from its groundfeatures/post-tests/postTestsFeature.ts: 0 changes, 1.4 from its groundfeatures/post-tests/postTestsStill.ts: 0 changes, 1.4 from its groundfeatures/post-tests/renderCompiledPost.ts: 0 changes, 0.9 from its groundfeatures/adventure/englishWorld.ts: 0 changes, 0.4 from its groundfeatures/fish-market/Bidder.ts: 0 changes, 0.4 from its groundfeatures/fish-market/DutchAuction.ts: 1 changes, 0.4 from its groundfeatures/fish-market/Lot.ts: 0 changes, 0.4 from its groundfeatures/fish-market/Market.ts: 0 changes, 0.4 from its groundfeatures/fish-market/Sale.ts: 0 changes, 0.4 from its groundfeatures/fish-market/Standing.ts: 0 changes, 0.4 from its groundfeatures/fish-market/browser/mountFishMarket.ts: 0 changes, 0.7 from its groundfeatures/fish-market/fishMarketFeature.ts: 0 changes, 1.3 from its groundfeatures/fish-market/fishMarketStill.ts: 0 changes, 1.5 from its groundfeatures/fish-market/fixedMargin.ts: 0 changes, 0.4 from its groundfeatures/fish-market/marketMargin.ts: 0 changes, 0.4 from its groundfeatures/fish-market/openAuction.ts: 0 changes, 0.7 from its groundfeatures/fish-market/ownBidder.ts: 0 changes, 0.4 from its groundfeatures/fish-market/ownBidderSource.ts: 0 changes, 0.4 from its groundfeatures/fish-market/planner.ts: 0 changes, 0.4 from its groundfeatures/fish-market/randomLots.ts: 0 changes, 0.4 from its groundfeatures/fish-market/renderFishMarket.ts: 1 changes, 0.7 from its groundfeatures/fish-market/theTable.ts: 0 changes, 0.4 from its groundfeatures/fish-market/vicente.ts: 0 changes, 0.4 from its groundfeatures/fish-market/wanda.ts: 0 changes, 0.4 from its groundplatform/random/randomOf.ts: 0 changes, 0.4 from its groundfeatures/lagoon/Fisher.ts: 0 changes, 0.4 from its groundfeatures/lagoon/Round.ts: 0 changes, 0.4 from its groundfeatures/lagoon/Tournament.ts: 0 changes, 0.4 from its groundfeatures/lagoon/Week.ts: 0 changes, 0.4 from its groundfeatures/lagoon/alone.ts: 0 changes, 0.4 from its groundfeatures/lagoon/browser/mountLagoon.ts: 0 changes, 0.4 from its groundfeatures/lagoon/lagoonFeature.ts: 0 changes, 1.3 from its groundfeatures/lagoon/lagoonStill.ts: 0 changes, 1.3 from its groundfeatures/lagoon/ownFisher.ts: 0 changes, 0.4 from its groundfeatures/lagoon/ownFisherSource.ts: 0 changes, 0.4 from its groundfeatures/lagoon/playRound.ts: 0 changes, 0.4 from its groundfeatures/lagoon/renderLagoon.ts: 0 changes, 0.4 from its groundfeatures/lagoon/starters.ts: 0 changes, 0.4 from its groundfeatures/lagoon/theLagoon.ts: 0 changes, 0.4 from its groundfeatures/lagoon/titForTat.ts: 0 changes, 0.4 from its groundfeatures/fish-market/Turn.ts: 0 changes, 0.4 from its groundplatform/markdown/renderMath.ts: 0 changes, 0.4 from its groundfeatures/maze/Cell.ts: 0 changes, 0.4 from its groundfeatures/maze/FIRST.ts: 0 changes, 0.4 from its groundfeatures/maze/JavaRandom.ts: 0 changes, 0.4 from its groundfeatures/maze/Maze.ts: 0 changes, 0.4 from its groundfeatures/maze/OPEN.ts: 0 changes, 0.4 from its groundfeatures/maze/browser/mountMaze.ts: 0 changes, 0.4 from its groundfeatures/maze/describeWay.ts: 0 changes, 0.4 from its groundfeatures/maze/growMaze.ts: 0 changes, 0.4 from its groundfeatures/maze/mazeFeature.ts: 0 changes, 1.3 from its groundfeatures/maze/mazeStill.ts: 0 changes, 1.3 from its groundfeatures/maze/renderMaze.ts: 0 changes, 0.4 from its groundfeatures/maze/wayOut.ts: 0 changes, 0.4 from its groundfeatures/first-network/LetterReader.ts: 1 changes, 0.4 from its groundfeatures/first-network/Network.ts: 0 changes, 0.4 from its groundfeatures/first-network/browser/mountLetters.ts: 1 changes, 0.6 from its groundfeatures/first-network/firstNetworkFeature.ts: 2 changes, 1.5 from its groundfeatures/first-network/firstReader.ts: 1 changes, 0.6 from its groundfeatures/first-network/glyphs.ts: 0 changes, 0.4 from its groundfeatures/first-network/lettersStill.ts: 0 changes, 1.5 from its groundfeatures/first-network/renderLetters.ts: 0 changes, 0.6 from its groundfeatures/first-network/Shape.ts: 0 changes, 0.4 from its groundfeatures/first-network/readOwnShapes.ts: 0 changes, 0.4 from its groundfeatures/first-network/shapeProblem.ts: 0 changes, 0.4 from its groundfeatures/fibergochi/Fibergochi.ts: 2 changes, 0.8 from its groundfeatures/fibergochi/FibergochiState.ts: 1 changes, 0.4 from its groundfeatures/fibergochi/ODDS.ts: 0 changes, 0.4 from its groundfeatures/fibergochi/Sprite.ts: 2 changes, 0.4 from its groundfeatures/fibergochi/browser/mountFibergochi.ts: 4 changes, 0.9 from its groundfeatures/fibergochi/fibergochiFeature.ts: 0 changes, 2.1 from its groundfeatures/fibergochi/fibergochiStill.ts: 1 changes, 1.7 from its groundfeatures/fibergochi/readKept.ts: 1 changes, 0.6 from its groundfeatures/fibergochi/renderFibergochi.ts: 2 changes, 0.9 from its groundfeatures/technical-debt/technicalDebtProgram.ts: 2 changes, 0.6 from its groundplatform/browser/PROGRAM_ASKED.ts: 0 changes, 0.3 from its groundplatform/browser/appsOf.ts: 1 changes, 1.1 from its groundplatform/browser/askProgram.ts: 0 changes, 0.6 from its groundplatform/browser/mountProgram.ts: 2 changes, 1.1 from its groundplatform/plugin/commandsOf.ts: 0 changes, 1.1 from its groundplatform/plugin/stillsOf.ts: 1 changes, 0.9 from its groundplatform/program/Parameter.ts: 1 changes, 0.3 from its groundplatform/program/Program.ts: 1 changes, 0.6 from its groundplatform/program/ProgramRun.ts: 0 changes, 0.3 from its groundplatform/program/Values.ts: 1 changes, 0.3 from its groundplatform/program/aProgram.ts: 2 changes, 0.6 from its groundplatform/program/commandLineOf.ts: 1 changes, 0.8 from its groundplatform/program/initialValues.ts: 0 changes, 0.8 from its groundplatform/program/inputSchemaOf.ts: 1 changes, 0.6 from its groundplatform/program/programCommand.ts: 1 changes, 0.8 from its groundplatform/plugin/programStill.ts: 1 changes, 0.9 from its groundplatform/program/readOptions.ts: 0 changes, 0.3 from its groundplatform/program/settleValues.ts: 1 changes, 0.8 from its groundplatform/program/sliderOf.ts: 1 changes, 0.6 from its groundfeatures/rocket/rocketProgram.ts: 0 changes, 0.5 from its groundfeatures/rocket/saidSpeed.ts: 0 changes, 0.3 from its groundfeatures/rocket/saidTonnes.ts: 0 changes, 0.3 from its groundfeatures/rocket/shipOf.ts: 0 changes, 0.3 from its groundplatform/browser/PROGRAM_RAN.ts: 0 changes, 0.3 from its groundplatform/program/ChoiceParameter.ts: 0 changes, 0.3 from its groundplatform/program/NumberParameter.ts: 0 changes, 0.3 from its groundplatform/program/wordOf.ts: 0 changes, 0.3 from its groundplatform/browser/ModelContext.ts: 2 changes, 0.3 from its groundplatform/browser/modelContextHere.ts: 0 changes, 0.8 from its groundplatform/browser/offerTools.ts: 2 changes, 1 from its groundplatform/content/pageShowing.ts: 0 changes, 0.3 from its groundplatform/shell/plainTextOf.ts: 0 changes, 0.3 from its groundfeatures/portfolio/portfolioFeature.ts: 2 changes, 0.6 from its groundplatform/browser/BrowserFlags.ts: 1 changes, 0.5 from its groundplatform/flags/Flag.ts: 1 changes, 0.3 from its groundplatform/flags/FlagStore.ts: 1 changes, 0.3 from its groundplatform/flags/flagsCommand.ts: 1 changes, 0.5 from its groundplatform/flags/flagsInAddress.ts: 0 changes, 0.5 from its groundfeatures/adventure/renderMap.ts: 1 changes, 0.3 from its groundfeatures/adventure/renderSeen.ts: 1 changes, 0.5 from its groundfeatures/air-quality/flatSums.ts: 0 changes, 0.3 from its groundfeatures/architecture/SourceGraph.ts: 1 changes, 0.3 from its groundfeatures/architecture/architectureFeature.ts: 4 changes, 2.6 from its groundfeatures/architecture/boxCycles.ts: 0 changes, 0.5 from its groundfeatures/architecture/boxOf.ts: 0 changes, 0.3 from its groundfeatures/architecture/importsOf.ts: 0 changes, 0.3 from its groundfeatures/architecture/readGraph.ts: 1 changes, 0.5 from its groundfeatures/architecture/readSources.ts: 0 changes, 0.5 from its groundfeatures/architecture/valueExportsOf.ts: 0 changes, 0.3 from its groundfeatures/developer-meetings/WORK_WEEK.ts: 1 changes, 0.3 from its groundfeatures/thesis-results/machines.ts: 0 changes, 0.3 from its groundfeatures/weather/steadyYear.ts: 0 changes, 0.3 from its groundfeatures/world/Mesh.ts: 0 changes, 0.3 from its groundfeatures/world/PIPELINE.ts: 0 changes, 0.3 from its groundfeatures/world/acrossFace.ts: 0 changes, 0.3 from its groundfeatures/world/emptyWorld.ts: 0 changes, 0.3 from its groundfeatures/world/filters/colourise.ts: 0 changes, 0.3 from its groundfeatures/world/filters/fractalise.ts: 0 changes, 0.3 from its groundfeatures/world/filters/sea.ts: 0 changes, 0.3 from its groundfeatures/world/filters/temperatures.ts: 0 changes, 0.3 from its groundfeatures/world/icosahedron.ts: 0 changes, 0.3 from its groundfeatures/world/latitudeOfVertex.ts: 0 changes, 0.3 from its groundfeatures/world/meshOf.ts: 0 changes, 0.3 from its groundfeatures/world/positionOf.ts: 0 changes, 0.3 from its groundfeatures/world/radiusOfFace.ts: 0 changes, 0.3 from its groundfeatures/world/subdivide.ts: 0 changes, 0.3 from its groundfeatures/world/withMesh.ts: 0 changes, 0.3 from its groundplatform/charts/CHART.ts: 0 changes, 0.3 from its groundplatform/charts/ChartLabels.ts: 0 changes, 0.3 from its groundplatform/charts/Series.ts: 0 changes, 0.3 from its groundplatform/charts/chartFrame.ts: 0 changes, 0.3 from its groundplatform/charts/fixed.ts: 0 changes, 0.3 from its groundplatform/content/nameOf.ts: 0 changes, 0.3 from its groundplatform/content/parentOf.ts: 0 changes, 0.3 from its groundplatform/markdown/slugOf.ts: 0 changes, 0.3 from its groundplatform/page/APPEARANCE.ts: 0 changes, 0.3 from its groundfeatures/developer-meetings/browser/heatGrid.ts: 0 changes, 0.3 from its groundfeatures/developer-meetings/featureSizeScale.ts: 0 changes, 0.3 from its groundplatform/browser/carriedLine.ts: 0 changes, 0.3 from its groundplatform/shell/typedLines.ts: 0 changes, 0.3 from its groundfeatures/architecture/Body.ts: 0 changes, 0.2 from its groundfeatures/architecture/History.ts: 3 changes, 0.2 from its groundfeatures/architecture/Layout.ts: 1 changes, 0.2 from its groundfeatures/architecture/Metrics.ts: 1 changes, 0.2 from its groundfeatures/architecture/Snapshot.ts: 1 changes, 0.2 from its groundfeatures/architecture/architectureStill.ts: 0 changes, 1.2 from its groundfeatures/architecture/browser/ArchitectureScene.ts: 7 changes, 1 from its groundfeatures/architecture/browser/mountArchitecture.ts: 7 changes, 3.1 from its groundfeatures/architecture/decodeHistory.ts: 2 changes, 1 from its groundfeatures/architecture/encodeHistory.ts: 3 changes, 1 from its groundfeatures/architecture/graphOf.ts: 1 changes, 0.5 from its groundfeatures/architecture/layoutArchitecture.ts: 3 changes, 0.5 from its groundfeatures/architecture/metricsOf.ts: 1 changes, 0.5 from its groundfeatures/architecture/reachedByTests.ts: 0 changes, 0.5 from its groundfeatures/architecture/renderArchitectureCaption.ts: 3 changes, 1 from its groundfeatures/architecture/renderArchitectureFigure.ts: 0 changes, 1.7 from its groundfeatures/architecture/renderArchitectureSvg.ts: 0 changes, 0.5 from its groundfeatures/architecture/renderMetricsSparks.ts: 0 changes, 0.5 from its groundfeatures/architecture/springTowards.ts: 0 changes, 0.2 from its groundfeatures/architecture/tangleStep.ts: 1 changes, 0.2 from its groundfeatures/architecture/onlyTypes.ts: 0 changes, 0.2 from its groundfeatures/architecture/Coverage.ts: 0 changes, 0.2 from its groundfeatures/architecture/coverageOf.ts: 0 changes, 0.2 from its groundfeatures/adventure/ADVENTURE_ICONS.ts: 0 changes, 0.2 from its groundfeatures/adventure/Charted.ts: 0 changes, 0.2 from its groundfeatures/adventure/LIFE.ts: 0 changes, 0.2 from its groundfeatures/adventure/pixelIcon.ts: 0 changes, 0.2 from its groundfeatures/theme/browser/countThemeAtStart.ts: 0 changes, 0.2 from its groundplatform/analytics/eventName.ts: 0 changes, 0.2 from its groundplatform/browser/countEvent.ts: 0 changes, 0.2 from its groundplatform/flags/enterTrials.ts: 0 changes, 0.2 from its groundfeatures/step-names/EXAMPLE_POST.ts: 0 changes, 0.2 from its groundfeatures/step-names/StepMethod.ts: 0 changes, 0.2 from its groundfeatures/step-names/browser/mountStepNames.ts: 0 changes, 0.2 from its groundfeatures/step-names/renderStepCode.ts: 0 changes, 0.4 from its groundfeatures/step-names/stepMethodOf.ts: 0 changes, 0.2 from its groundfeatures/step-names/stepNamesFeature.ts: 1 changes, 0.2 from its groundfeatures/step-names/stepNamesStill.ts: 0 changes, 0.2 from its groundfeatures/bowling-kata/KATA_STEPS.ts: 1 changes, 0.2 from its groundfeatures/bowling-kata/KataStep.ts: 0 changes, 0.2 from its groundfeatures/bowling-kata/bowlingKataFeature.ts: 1 changes, 0.6 from its groundfeatures/bowling-kata/bowlingKataStill.ts: 0 changes, 0.9 from its groundfeatures/bowling-kata/browser/mountBowlingKata.ts: 1 changes, 0.9 from its groundfeatures/bowling-kata/renderKataStep.ts: 2 changes, 0.4 from its groundfeatures/bowling-kata/renderKataStrip.ts: 1 changes, 0.2 from its groundfeatures/bowling-kata/runKata.ts: 0 changes, 0.2 from its groundfeatures/tests-as-examples/DISPATCHERS.ts: 0 changes, 0.2 from its groundfeatures/tests-as-examples/DISPATCHER_TESTS.ts: 0 changes, 0.2 from its groundfeatures/tests-as-examples/Dispatcher.ts: 0 changes, 0.2 from its groundfeatures/tests-as-examples/browser/mountTestsAsExamples.ts: 0 changes, 0.2 from its groundfeatures/tests-as-examples/renderDispatcherRun.ts: 0 changes, 0.4 from its groundfeatures/tests-as-examples/runDispatcherTests.ts: 0 changes, 0.2 from its groundfeatures/tests-as-examples/testsAsExamplesFeature.ts: 0 changes, 0.2 from its groundfeatures/tests-as-examples/testsAsExamplesStill.ts: 0 changes, 0.2 from its groundplatform/testing/TestRun.ts: 0 changes, 0.2 from its groundplatform/testing/reported.ts: 0 changes, 0.2 from its groundplatform/testing/runTestFile.ts: 0 changes, 0.2 from its groundfeatures/bowling-kata/kataStepTitle.ts: 0 changes, 0.2 from its groundfeatures/gherkin-genie/EXAMPLE_FEATURE.ts: 0 changes, 0.2 from its groundfeatures/gherkin-genie/EXAMPLE_STEPS.ts: 0 changes, 0.2 from its groundfeatures/gherkin-genie/browser/mountGherkinGenie.ts: 1 changes, 0.4 from its groundfeatures/gherkin-genie/genieStepOf.ts: 0 changes, 0.2 from its groundfeatures/gherkin-genie/gherkinGenieFeature.ts: 0 changes, 0.4 from its groundfeatures/gherkin-genie/gherkinGenieStill.ts: 0 changes, 0.4 from its groundfeatures/gherkin-genie/readFeature.ts: 0 changes, 0.2 from its groundfeatures/gherkin-genie/renderGenie.ts: 1 changes, 0.4 from its groundfeatures/gherkin-genie/renderGenieRun.ts: 1 changes, 0.2 from its groundfeatures/gherkin-genie/runGenie.ts: 0 changes, 0.2 from its groundfeatures/gherkin-genie/wishedSteps.ts: 0 changes, 0.2 from its groundfeatures/small-steps/SMALL_STEPS_LENGTH.ts: 0 changes, 0.2 from its groundfeatures/small-steps/browser/mountSmallSteps.ts: 0 changes, 0.6 from its groundfeatures/small-steps/randomSteps.ts: 0 changes, 0.2 from its groundfeatures/small-steps/renderSmallSteps.ts: 0 changes, 0.4 from its groundfeatures/small-steps/smallStepsFeature.ts: 0 changes, 0.3 from its groundfeatures/small-steps/smallStepsFrames.ts: 1 changes, 0.2 from its groundfeatures/small-steps/smallStepsStill.ts: 0 changes, 0.2 from its groundplatform/browser/mountPlayer.ts: 1 changes, 0.2 from its groundplatform/markdown/slides/readSlides.ts: 0 changes, 0.2 from its groundplatform/markdown/slides/typingSteps.ts: 1 changes, 0.2 from its groundplatform/browser/mountSlides.ts: 0 changes, 0.9 from its groundplatform/markdown/slides/renderSlides.ts: 0 changes, 0.4 from its groundplatform/markdown/slides/slidesPlayback.ts: 2 changes, 0.4 from its groundfeatures/bowling-kata/KATA_LESSONS.ts: 0 changes, 0.1 from its groundfeatures/bowling-kata/KataLesson.ts: 0 changes, 0.1 from its groundfeatures/bowling-kata/browser/mountKataFiveSteps.ts: 0 changes, 0.2 from its groundfeatures/bowling-kata/kataFiveStepsSlides.ts: 0 changes, 0.4 from its groundfeatures/bowling-kata/kataFiveStepsStill.ts: 0 changes, 0.2 from its groundfeatures/bowling-kata/kataLessonAt.ts: 0 changes, 0.1 from its groundfeatures/bowling-kata/renderKataFiveSteps.ts: 0 changes, 0.2 from its groundfeatures/bowling-kata/lineDiff.ts: 0 changes, 0.1 from its groundplatform/shell/renderListing.ts: 0 changes, 0.1 from its groundfeatures/architecture/radiiBy.ts: 2 changes, 0.1 from its groundfeatures/architecture/reachOf.ts: 0 changes, 0.1 from its groundfeatures/architecture/sourceUrlOf.ts: 0 changes, 0.1 from its groundfeatures/guess-the-rule/GuessRound.ts: 0 changes, 0.1 from its groundfeatures/guess-the-rule/RULES.ts: 0 changes, 0.1 from its groundfeatures/guess-the-rule/browser/mountGuessTheRule.ts: 0 changes, 0.1 from its groundfeatures/guess-the-rule/guessTheRuleFeature.ts: 0 changes, 0.1 from its groundfeatures/guess-the-rule/guessTheRuleStill.ts: 0 changes, 0.1 from its groundfeatures/guess-the-rule/renderGuessTable.ts: 0 changes, 0.1 from its groundfeatures/architecture/Life.ts: 0 changes, 0.1 from its groundfeatures/architecture/SWEEP.ts: 0 changes, 0.1 from its groundfeatures/architecture/bandOf.ts: 0 changes, 0.1 from its groundfeatures/architecture/breakablePath.ts: 0 changes, 0.1 from its groundfeatures/architecture/cascadeOf.ts: 3 changes, 0.5 from its groundfeatures/architecture/changeMatrixOf.ts: 1 changes, 0.1 from its groundfeatures/architecture/changeStills.ts: 2 changes, 1.1 from its groundfeatures/architecture/couplingsOf.ts: 0 changes, 0.3 from its groundfeatures/architecture/livesOf.ts: 1 changes, 0.3 from its groundfeatures/architecture/percent.ts: 0 changes, 0.1 from its groundfeatures/architecture/plural.ts: 0 changes, 0.1 from its groundfeatures/architecture/propagationCostOf.ts: 1 changes, 0.1 from its groundfeatures/architecture/readHistory.ts: 0 changes, 0.3 from its groundfeatures/architecture/renderCascadeFigure.ts: 2 changes, 0.8 from its groundfeatures/architecture/renderChangeMatrix.ts: 1 changes, 0.5 from its groundfeatures/architecture/renderChangeMatrixFigure.ts: 2 changes, 0.8 from its groundfeatures/architecture/renderCouplingsFigure.ts: 1 changes, 0.1 from its groundfeatures/architecture/renderHotspotsFigure.ts: 1 changes, 0.1 from its groundfeatures/architecture/renderRipplesFigure.ts: 1 changes, 0.5 from its groundfeatures/architecture/renderSettlingFigure.ts: 0 changes, 0.1 from its groundfeatures/architecture/renderStabilityFigure.ts: 1 changes, 0.3 from its groundfeatures/architecture/renderTestedChangesFigure.ts: 0 changes, 0.1 from its groundfeatures/architecture/ripplesOf.ts: 2 changes, 0.3 from its groundfeatures/architecture/settlingOf.ts: 0 changes, 0.1 from its groundfeatures/architecture/stabilityOf.ts: 1 changes, 0.1 from its groundfeatures/architecture/testedChangesOf.ts: 0 changes, 0.3 from its groundfeatures/architecture/changesUpTo.ts: 1 changes, 0 from its groundfeatures/architecture/browser/changeApps.ts: 1 changes, 0.8 from its groundfeatures/architecture/browser/changesInBrowser.ts: 0 changes, 0.1 from its groundfeatures/architecture/browser/mountChangeFigure.ts: 0 changes, 0.6 from its groundfeatures/architecture/browser/mountChangePlayer.ts: 0 changes, 0.1 from its groundfeatures/architecture/browser/pointAtChangeMatrix.ts: 0 changes, 0.1 from its groundfeatures/architecture/browser/shownCommit.ts: 0 changes, 0 from its groundfeatures/architecture/changeFigures.ts: 2 changes, 1 from its groundfeatures/architecture/dayOf.ts: 0 changes, 0.3 from its groundfeatures/architecture/describeMatrixCell.ts: 0 changes, 0.3 from its groundfeatures/architecture/historyUpTo.ts: 0 changes, 0.3 from its groundfeatures/architecture/matrixCellsOf.ts: 0 changes, 0 from its groundfeatures/architecture/matrixRowOf.ts: 0 changes, 0 from its groundfeatures/architecture/renderShownCommit.ts: 0 changes, 0.3 from its groundfeatures/architecture/sweepsOf.ts: 0 changes, 0 from its groundfeatures/architecture/againstStabilityOf.ts: 0 changes, 0 from its groundfeatures/architecture/betweennessOf.ts: 0 changes, 0 from its groundfeatures/architecture/boxLinksOf.ts: 0 changes, 0 from its groundfeatures/architecture/cascadeFrom.ts: 1 changes, 0.3 from its groundfeatures/architecture/communitiesOf.ts: 0 changes, 0 from its groundfeatures/architecture/couplingOf.ts: 0 changes, 0 from its groundfeatures/architecture/groundOf.ts: 1 changes, 0.3 from its groundfeatures/architecture/heatOf.ts: 1 changes, 0 from its groundfeatures/architecture/joinedBy.ts: 0 changes, 0 from its groundfeatures/architecture/lensesOf.ts: 1 changes, 0.3 from its groundfeatures/architecture/measuresOf.ts: 0 changes, 0 from its groundfeatures/architecture/modularityOf.ts: 0 changes, 0 from its groundfeatures/architecture/pointedAt.ts: 0 changes, 0.3 from its groundfeatures/architecture/rampColour.ts: 0 changes, 0 from its groundfeatures/architecture/reachedByOf.ts: 0 changes, 0 from its groundfeatures/architecture/standingsOf.ts: 0 changes, 0 from its groundfeatures/architecture/threadsOf.ts: 0 changes, 0 from its groundfeatures/architecture/undirectedOf.ts: 0 changes, 0 from its groundfeatures/architecture/browser/mountCouplingFigure.ts: 0 changes, 0 from its groundfeatures/architecture/renderBridgesFigure.ts: 1 changes, 0 from its groundfeatures/architecture/renderCouplingFigure.ts: 0 changes, 0 from its groundfeatures/architecture/renderGroundFigure.ts: 1 changes, 0.2 from its groundfeatures/architecture/renderGroupsFigure.ts: 1 changes, 0 from its groundfeatures/architecture/renderReachFigure.ts: 0 changes, 0 from its groundrenderDocument.tsallFeatures.tsdeveloperMeetingsFeature.tsheadlineFeature.ts0011225510102020what its ground would lead one to expect, in changesthe changes it had

changed far more than its ground would lead one to expectfar lessabout 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:

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 itCe = 8: its files that need elsewhereshellplatform/browser · 2 filesplatform/page · 2 filesplatform/plugin · 2 filesfeatures/theme · 1 filemain.ts · 1 fileplatform/flags · 1 fileplatform/program · 1 fileplatform/markdown · 6 filesplatform/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 painzone of uselessnessthe main sequencefeatures/lagoon: needed by 1 file elsewhere, needs 4; 0 changes to its 15 filesfeatures/maze: needed by 1 file elsewhere, needs 3; 0 changes to its 12 filesfeatures/next-word: needed by 1 file elsewhere, needs 4; 0 changes to its 11 filesfeatures/packages: needed by 1 file elsewhere, needs 4; 0 changes to its 8 filesfeatures/tests-as-examples: needed by 1 file elsewhere, needs 5; 0 changes to its 8 filesfeatures/guess-the-rule: needed by 1 file elsewhere, needs 3; 0 changes to its 6 filesfeatures/post-tests: needed by 1 file elsewhere, needs 4; 0 changes to its 6 filesplatform/data: needed by 8 files elsewhere, needs 1; 0 changes to its 6 filesfeatures/sky: needed by 1 file elsewhere, needs 3; 0 changes to its 3 filesplatform/testing: needed by 4 files elsewhere, needs 0; 0 changes to its 3 filesplatform/analytics: needed by 3 files elsewhere, needs 0; 0 changes to its 1 fileplatform/random: needed by 5 files elsewhere, needs 0; 0 changes to its 1 filefeatures/weather: needed by 1 file elsewhere, needs 5; 1 change to its 19 filesfeatures/fish-market: needed by 1 file elsewhere, needs 5; 2 changes to its 21 filesfeatures/small-steps: needed by 1 file elsewhere, needs 3; 1 change to its 7 filesfeatures/step-names: needed by 1 file elsewhere, needs 4; 1 change to its 7 filesfeatures/gherkin-genie: needed by 1 file elsewhere, needs 6; 3 changes to its 11 filesplatform/content: needed by 15 files elsewhere, needs 0; 2 changes to its 7 filesfeatures/bowling-kata: needed by 1 file elsewhere, needs 9; 6 changes to its 17 filesfeatures/developer-meetings: needed by 1 file elsewhere, needs 3; 3 changes to its 7 filesfeatures/rocket: needed by 1 file elsewhere, needs 4; 7 changes to its 16 filesfeatures/first-network: needed by 1 file elsewhere, needs 6; 5 changes to its 11 filesfeatures/adventure: needed by 1 file elsewhere, needs 5; 7 changes to its 14 filesfeatures/thesis-results: needed by 1 file elsewhere, needs 1; 2 changes to its 4 filesplatform/charts: needed by 13 files elsewhere, needs 0; 6 changes to its 11 filesplatform/flags: needed by 3 files elsewhere, needs 1; 3 changes to its 5 filesfeatures/air-quality: needed by 1 file elsewhere, needs 5; 11 changes to its 18 filesplatform/program: needed by 10 files elsewhere, needs 1; 10 changes to its 15 filesfeatures/architecture: needed by 1 file elsewhere, needs 24; 73 changes to its 100 filesfeatures/world: needed by 3 files elsewhere, needs 5; 29 changes to its 35 filesplatform/shell: needed by 10 files elsewhere, needs 8; 20 changes to its 21 filesfeatures/technical-debt: needed by 1 file elsewhere, needs 2; 3 changes to its 3 filesfeatures/headline: needed by 1 file elsewhere, needs 1; 8 changes to its 7 filesplatform/browser: needed by 27 files elsewhere, needs 11; 27 changes to its 20 filesfeatures/theme: needed by 1 file elsewhere, needs 4; 11 changes to its 8 filesfeatures/fibergochi: needed by 1 file elsewhere, needs 4; 13 changes to its 9 filesplatform/plugin: needed by 59 files elsewhere, needs 3; 8 changes to its 5 filesplatform/markdown: needed by 40 files elsewhere, needs 0; 24 changes to its 14 filesplatform/page: needed by 1 file elsewhere, needs 6; 20 changes to its 10 filesfeatures/portfolio: needed by 1 file elsewhere, needs 1; 2 changes to its 1 filemain.ts: needed by 0 files elsewhere, needs 1; 10 changes to its 1 filefeatures/allFeatures.ts: needed by 1 file elsewhere, needs 1; 20 changes to its 1 fileplatform/programplatform/pluginplatform/browserplatform/markdown00.50.511instability: how little needs it, so how free it is to changeabstractness: 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
boxfilesneeded byneedsIADchanges a file
features/adventure14150.830.140.020.5
features/air-quality18150.830.110.060.6
features/allFeatures.ts1110.500.000.5020
features/architecture1001240.960.090.050.7
features/bowling-kata17190.900.120.020.4
features/developer-meetings7130.750.000.250.4
features/fibergochi9140.800.110.091.4
features/first-network11160.860.090.050.5
features/fish-market21150.830.290.120.1
features/gherkin-genie11160.860.000.140.3
features/guess-the-rule6130.750.000.250
features/headline7110.500.140.361.1
features/lagoon15140.800.200.000
features/maze12130.750.170.080
features/next-word11140.800.000.200
features/packages8140.800.130.070
features/portfolio1110.500.000.502
features/post-tests6140.800.000.200
features/rocket16140.800.060.140.4
features/sky3130.750.000.250
features/small-steps7130.750.000.250.1
features/step-names7140.800.140.060.1
features/technical-debt3120.670.000.331
features/tests-as-examples8150.830.130.040
features/theme8140.800.250.051.4
features/thesis-results4110.500.000.500.5
features/weather19150.830.110.060.1
features/world35350.630.110.260.8
main.ts1011.000.000.0010
platform/analytics1300.000.001.000
platform/browser2027110.290.050.661.4
platform/charts111300.000.180.820.5
platform/content71500.000.140.860.3
platform/data6810.110.170.720
platform/flags5310.250.400.350.6
platform/markdown144000.000.001.001.7
platform/page10160.860.000.142
platform/plugin55930.050.200.751.6
platform/program151010.090.400.510.7
platform/random1500.000.001.000
platform/shell211080.440.100.461
platform/testing3400.000.330.670

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 valueonto only a type
inside a box35% · 91 of 25848% · 54 of 113
across two boxes22% · 27 of 12112% · 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.

commitsone fileand the otherbetween them
6features/architecture/browser/ArchitectureScene.tsfeatures/architecture/browser/mountArchitecture.tsan arrow
5main.tsplatform/browser/mountTerminal.tsan arrow
3main.tsplatform/plugin/Feature.tsarrows through others
3features/world/browser/spinPlanet.tsfeatures/world/browser/mountWorlds.tsan arrow
3features/architecture/History.tsfeatures/architecture/encodeHistory.tsan arrow
2platform/markdown/renderInline.tsplatform/markdown/renderMarkdown.tsan arrow
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.

~/projects/changes $

~/projects/changes $