~ $ cd projects/architecture && cat README.md

How this site is built

The code of this site is written by an AI — Claude, in Claude Code — from what I ask of it. I say what the site is and how it should be made; it writes the program, and the tests.

The picture is that program. Every ball is a file, every box a folder of the frame or a feature, and every arrow a box that needs another. It is read from the source by the TypeScript compiler, at every commit that changed it. Play it and watch it grow; tangle it to see the same files with nobody saying where anything goes, and untangle it again. Put the tests in, and every file with something in it to run that no test imports directly is drawn as a ring.

The picture can be looked through lenses. A ball can be as big as the files that need it — the hotspots, the files a change reaches first — or as the files it needs; as all the files a change to it could reach, near or far; as much as it stands between the others; as the commits that have changed it so far, which grows as the history plays and stops where a file settles; or as its lines. It can be coloured by how lately it changed, by how often files standing where it stands changed, or by how stable its box is, with the arrows that go against stability in red. Threads can be drawn between the files that changed together, dashed where no arrow joins them; tangled, they pull the files together too. Every file a commit changes rings as it comes.

Point at a file, and what it is asked to show comes out, said on the line over the picture so that no word covers an arrow: its own arrows, what it needs and what needs it, each in the colour the line keys it to, one arrow out or as far as they go — all a change to it could reach, and all whose change could reach it; the group the arrows gather it into; or the files that changed with it. Click a file or a box, and the panel by the picture tells of it at the commit shown: where a file stands in the network, what its history has been and what it changed with; a box's couplings, with the sum worked out. Every file and box it names leads to its own details, and a link leads to the code on GitHub as it stood then. With nothing chosen, the panel tells of the network as a whole.

srcfeaturesplatformfeatures/adventure → platform/browser: 1features/adventure → platform/markdown: 2features/adventure → platform/plugin: 2features/air-quality → platform/blueprint: 13features/air-quality → platform/browser: 4features/air-quality → platform/charts: 1features/air-quality → platform/content: 1features/air-quality → platform/data: 21features/air-quality → platform/plugin: 3features/air-quality → platform/program: 1features/allFeatures.ts → features/adventure: 1features/allFeatures.ts → features/air-quality: 1features/allFeatures.ts → features/architecture: 1features/allFeatures.ts → features/barcelona-series: 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/lcars: 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/recipes: 1features/allFeatures.ts → features/rocket: 1features/allFeatures.ts → features/sea: 1features/allFeatures.ts → features/search: 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: 2features/allFeatures.ts → features/writings: 1features/allFeatures.ts → platform/plugin: 1features/architecture → platform/blueprint: 26features/architecture → platform/browser: 5features/architecture → platform/charts: 12features/architecture → platform/markdown: 16features/architecture → platform/plugin: 7features/barcelona-series → platform/blueprint: 8features/barcelona-series → platform/data: 4features/barcelona-series → platform/plugin: 1features/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/lcars → platform/blueprint: 37features/lcars → platform/browser: 3features/lcars → platform/plugin: 2features/lcars → platform/workbench: 8features/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/recipes → platform/blueprint: 11features/recipes → platform/plugin: 1features/rocket → platform/browser: 4features/rocket → platform/plugin: 2features/rocket → platform/program: 4features/sea → platform/blueprint: 15features/sea → platform/data: 6features/sea → platform/plugin: 1features/search → platform/browser: 1features/search → platform/command: 1features/search → platform/content: 5features/search → platform/markdown: 4features/search → platform/plugin: 1features/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/command: 2features/theme → platform/plugin: 1features/thesis-results → platform/plugin: 1features/weather → platform/blueprint: 10features/weather → platform/browser: 4features/weather → platform/charts: 2features/weather → platform/content: 1features/weather → platform/data: 21features/weather → platform/plugin: 3features/weather → platform/program: 1features/world → platform/browser: 3features/world → platform/plugin: 2features/world → platform/random: 1features/writings → platform/content: 1features/writings → platform/markdown: 2features/writings → platform/plugin: 2main.ts → features/allFeatures.ts: 1main.ts → platform/agent: 1main.ts → platform/analytics: 1main.ts → platform/browser: 7main.ts → platform/flags: 4main.ts → platform/page: 1main.ts → platform/plugin: 4main.ts → platform/shell: 2main.ts → platform/workbench: 1platform/agent → platform/content: 3platform/agent → platform/markdown: 1platform/agent → platform/plugin: 5platform/blueprint → platform/markdown: 2platform/browser → platform/command: 2platform/browser → platform/content: 1platform/browser → platform/data: 3platform/browser → platform/markdown: 3platform/browser → platform/plugin: 6platform/browser → platform/program: 8platform/command → platform/content: 1platform/data → platform/markdown: 1platform/flags → platform/command: 2platform/flags → platform/markdown: 1platform/page → platform/content: 9platform/page → platform/markdown: 5platform/page → platform/shell: 3platform/plugin → platform/blueprint: 17platform/plugin → platform/command: 2platform/plugin → platform/content: 5platform/plugin → platform/data: 1platform/plugin → platform/flags: 1platform/plugin → platform/program: 11platform/program → platform/command: 1platform/shell → platform/browser: 2platform/shell → platform/command: 14platform/shell → platform/content: 5platform/shell → platform/markdown: 7platform/workbench → platform/blueprint: 73platform/workbench → platform/browser: 11platform/workbench → platform/plugin: 3mainallFeaturesadventureair-qualityarchitecturebarcelona-seriesbowling-katadeveloper-meetingsfibergochifirst-networkfish-marketgherkin-genieguess-the-ruleheadlinelagoonlcarsmazenext-wordpackagesportfoliopost-testsrecipesrocketseasearchskysmall-stepsstep-namestechnical-debttests-as-examplesthemethesis-resultsweatherworldwritingspageshellworkbenchagentbrowserpluginflagsprogramblueprintdatacommandmarkdownchartstestinganalyticscontentrandommain.tsfeatures/allFeatures.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/askedNo2.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/no2Tool.tsfeatures/air-quality/nodes/airNodes.tsfeatures/air-quality/nodes/no2DaysChoice.tsfeatures/air-quality/nodes/no2HoursNode.tsfeatures/air-quality/nodes/no2MonthsNode.tsfeatures/air-quality/nodes/no2StationChoice.tsfeatures/air-quality/nodes/no2StationsNode.tsfeatures/air-quality/nodes/no2StationsRead.tsfeatures/air-quality/nodes/no2YearsNode.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/assortativityOf.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/detailsPanel.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/clusteringOf.tsfeatures/architecture/communitiesOf.tsfeatures/architecture/componentsOf.tsfeatures/architecture/COMPOSITION.tsfeatures/architecture/coresOf.tsfeatures/architecture/couplingOf.tsfeatures/architecture/couplingsOf.tsfeatures/architecture/Coverage.tsfeatures/architecture/coverageOf.tsfeatures/architecture/dayOf.tsfeatures/architecture/decodeHistory.tsfeatures/architecture/describeMatrixCell.tsfeatures/architecture/detailsOf.tsfeatures/architecture/editNoteOf.tsfeatures/architecture/encodeHistory.tsfeatures/architecture/fileHistoryOf.tsfeatures/architecture/graphOf.tsfeatures/architecture/groundOf.tsfeatures/architecture/heatOf.tsfeatures/architecture/heightsOf.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/mutantsOf.tsfeatures/architecture/networkOf.tsfeatures/architecture/nodes/architectureNodes.tsfeatures/architecture/nodes/aroundNode.tsfeatures/architecture/nodes/arrowsNode.tsfeatures/architecture/nodes/boxesNode.tsfeatures/architecture/nodes/CodeGraph.tsfeatures/architecture/nodes/commitsNode.tsfeatures/architecture/nodes/degreesOf.tsfeatures/architecture/nodes/filesNode.tsfeatures/architecture/nodes/graphTableOf.tsfeatures/architecture/nodes/graphType.tsfeatures/architecture/nodes/historyIn.tsfeatures/architecture/nodes/keepFilesNode.tsfeatures/architecture/nodes/knotNode.tsfeatures/architecture/nodes/measureNode.tsfeatures/architecture/nodes/networkNode.tsfeatures/architecture/nodes/onlyFilesNode.tsfeatures/architecture/nodes/pictureNode.tsfeatures/architecture/nodes/renderTangleSvg.tsfeatures/architecture/nodes/sourceNode.tsfeatures/architecture/nodes/subgraphOf.tsfeatures/architecture/nodes/tangleLayoutOf.tsfeatures/architecture/onlyTypes.tsfeatures/architecture/pageRankOf.tsfeatures/architecture/pathsOf.tsfeatures/architecture/percent.tsfeatures/architecture/plural.tsfeatures/architecture/pointedArrowsOf.tsfeatures/architecture/pointedAt.tsfeatures/architecture/pointedSaid.tsfeatures/architecture/positionOf.tsfeatures/architecture/propagationCostOf.tsfeatures/architecture/radiiBy.tsfeatures/architecture/rampColour.tsfeatures/architecture/ratchetHeldOf.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/renderLifeStrip.tsfeatures/architecture/renderMetricsSparks.tsfeatures/architecture/renderNetworkFigure.tsfeatures/architecture/renderRatchetFigure.tsfeatures/architecture/renderReachFigure.tsfeatures/architecture/renderRipplesFigure.tsfeatures/architecture/renderSettlingFigure.tsfeatures/architecture/renderShapeReport.tsfeatures/architecture/renderShownCommit.tsfeatures/architecture/renderStabilityFigure.tsfeatures/architecture/renderTestedChangesFigure.tsfeatures/architecture/renderUnrunReport.tsfeatures/architecture/ripplesOf.tsfeatures/architecture/settlingOf.tsfeatures/architecture/shapeOf.tsfeatures/architecture/shapesOf.tsfeatures/architecture/Snapshot.tsfeatures/architecture/snapshotOf.tsfeatures/architecture/SourceGraph.tsfeatures/architecture/sourceUrlOf.tsfeatures/architecture/springTowards.tsfeatures/architecture/stabilityOf.tsfeatures/architecture/standingsOf.tsfeatures/architecture/stronglyConnectedOf.tsfeatures/architecture/SWEEP.tsfeatures/architecture/sweepsOf.tsfeatures/architecture/tangleStep.tsfeatures/architecture/testedChangesOf.tsfeatures/architecture/threadsOf.tsfeatures/architecture/undirectedOf.tsfeatures/architecture/unheldCouplingsOf.tsfeatures/architecture/unrunOf.tsfeatures/architecture/valueExportsOf.tsfeatures/barcelona-series/barcelonaAnswer.tsfeatures/barcelona-series/barcelonaLinkOf.tsfeatures/barcelona-series/barcelonaRainSource.tsfeatures/barcelona-series/BarcelonaSeries.tsfeatures/barcelona-series/barcelonaSeriesFeature.tsfeatures/barcelona-series/barcelonaSeriesSource.tsfeatures/barcelona-series/barcelonaSource.tsfeatures/barcelona-series/monthlyValuesOf.tsfeatures/barcelona-series/nodes/barcelonaMonthsNode.tsfeatures/barcelona-series/nodes/barcelonaNodes.tsfeatures/barcelona-series/nodes/barcelonaRainNode.tsfeatures/barcelona-series/nodes/barcelonaRead.tsfeatures/barcelona-series/nodes/barcelonaYearsNode.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/lcars/browser/LcarsConsole.tsfeatures/lcars/browser/openChoice.tsfeatures/lcars/browser/QueryView.tsfeatures/lcars/codeOf.tsfeatures/lcars/conduitPath.tsfeatures/lcars/faceOf.tsfeatures/lcars/flowOf.tsfeatures/lcars/joinsOf.tsfeatures/lcars/lcarsFeature.tsfeatures/lcars/questionOf.tsfeatures/lcars/rowAt.tsfeatures/lcars/SCHEMATIC.tsfeatures/lcars/schematicMarkup.tsfeatures/lcars/schematicOf.tsfeatures/lcars/withRow.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/recipes/nodes/crossNode.tsfeatures/recipes/nodes/dayPartsNode.tsfeatures/recipes/recipesFeature.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/sea/gridAnswerOf.tsfeatures/sea/nodes/seaDaysNode.tsfeatures/sea/nodes/seaMonthsNode.tsfeatures/sea/nodes/seaNodes.tsfeatures/sea/nodes/seaPointChoice.tsfeatures/sea/nodes/seaPointsNode.tsfeatures/sea/nodes/seaPointsRead.tsfeatures/sea/nodes/seaYearsNode.tsfeatures/sea/seaAnswer.tsfeatures/sea/seaFeature.tsfeatures/sea/SeaPoint.tsfeatures/sea/seaPoints.tsfeatures/sea/seaSource.tsfeatures/search/browser/chooser.tsfeatures/search/browser/isTyping.tsfeatures/search/browser/mountSearch.tsfeatures/search/browser/SEARCH_PAGE.tsfeatures/search/browser/searchKeys.tsfeatures/search/browser/searchSite.tsfeatures/search/foldedOf.tsfeatures/search/markedOf.tsfeatures/search/pagesFound.tsfeatures/search/renderFound.tsfeatures/search/searchCommand.tsfeatures/search/searchFeature.tsfeatures/search/steppedTo.tsfeatures/search/wordStarts.tsfeatures/sky/browser/followTurning.tsfeatures/sky/browser/Starfield.tsfeatures/sky/skyFeature.tsfeatures/sky/Turns.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/askedQuestion.tsfeatures/weather/aWeatherStation.tsfeatures/weather/browser/mountWeather.tsfeatures/weather/cadtepAnswer.tsfeatures/weather/cadtepDaysOf.tsfeatures/weather/climateSeries.tsfeatures/weather/climateSeriesSource.tsfeatures/weather/countDays.tsfeatures/weather/daysPerYear.tsfeatures/weather/firstQuestion.tsfeatures/weather/histogramOf.tsfeatures/weather/hotNightsTool.tsfeatures/weather/nodes/weatherDaysNode.tsfeatures/weather/nodes/weatherMonthsNode.tsfeatures/weather/nodes/weatherNodes.tsfeatures/weather/nodes/weatherStationChoice.tsfeatures/weather/nodes/weatherStationsNode.tsfeatures/weather/nodes/weatherStationsRead.tsfeatures/weather/questionInWords.tsfeatures/weather/recordOf.tsfeatures/weather/renderDaysCalendar.tsfeatures/weather/renderWeatherFigure.tsfeatures/weather/stationsNamed.tsfeatures/weather/steadyYear.tsfeatures/weather/twoHalves.tsfeatures/weather/variableYearOf.tsfeatures/weather/weatherFeature.tsfeatures/weather/weatherGroups.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/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.tsfeatures/writings/essaysOn.tsfeatures/writings/talksOn.tsfeatures/writings/writingsFeature.tsfeatures/writings/writingsTool.tsplatform/page/APPEARANCE.tsplatform/page/bookSchema.tsplatform/page/browser/mountNavigation.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/shell/browser/mountTerminal.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/parseCommandLine.tsplatform/shell/promptPath.tsplatform/shell/renderListing.tsplatform/shell/resolvePath.tsplatform/shell/Shell.tsplatform/shell/suggest.tsplatform/shell/typedLines.tsplatform/workbench/boundsOf.tsplatform/workbench/browser/BoardView.tsplatform/workbench/browser/controlFor.tsplatform/workbench/browser/FilesInBrowser.tsplatform/workbench/browser/KeptBlueprints.tsplatform/workbench/browser/morphInto.tsplatform/workbench/browser/mountWorkbench.tsplatform/workbench/browser/NodeView.tsplatform/workbench/browser/openExamples.tsplatform/workbench/browser/openHelp.tsplatform/workbench/browser/openKindMenu.tsplatform/workbench/browser/openPeek.tsplatform/workbench/browser/openTextPanel.tsplatform/workbench/browser/Workbench.tsplatform/workbench/Camera.tsplatform/workbench/cardsOf.tsplatform/workbench/EditHistory.tsplatform/workbench/hashOf.tsplatform/workbench/kindsFor.tsplatform/workbench/linkCodeOf.tsplatform/workbench/OpenBlueprint.tsplatform/workbench/pinAt.tsplatform/workbench/textOfLinkCode.tsplatform/agent/llmsTxtOf.tsplatform/agent/readTool.tsplatform/agent/routeAsked.tsplatform/agent/searchTool.tsplatform/agent/siteTools.tsplatform/browser/appsOf.tsplatform/browser/askProgram.tsplatform/browser/carriedLine.tsplatform/browser/countEvent.tsplatform/browser/el.tsplatform/browser/ModelContext.tsplatform/browser/modelContextHere.tsplatform/browser/mountApps.tsplatform/browser/mountPlayer.tsplatform/browser/mountProgram.tsplatform/browser/mountSlides.tsplatform/browser/offerTools.tsplatform/browser/PROGRAM_ASKED.tsplatform/browser/PROGRAM_RAN.tsplatform/browser/runningAt.tsplatform/browser/siteInBrowser.tsplatform/browser/sourceLineOf.tsplatform/browser/watchOnScreen.tsplatform/plugin/AgentTool.tsplatform/plugin/answerOf.tsplatform/plugin/Bench.tsplatform/plugin/benchOf.tsplatform/plugin/blueprintKitOf.tsplatform/plugin/blueprintTool.tsplatform/plugin/commandsOf.tsplatform/plugin/describeTool.tsplatform/plugin/Feature.tsplatform/plugin/programNode.tsplatform/plugin/programStill.tsplatform/plugin/programTool.tsplatform/plugin/Signal.tsplatform/plugin/stillsOf.tsplatform/plugin/toolsOf.tsplatform/flags/browser/BrowserFlags.tsplatform/flags/enterTrials.tsplatform/flags/Flag.tsplatform/flags/flagsCommand.tsplatform/flags/flagsInAddress.tsplatform/flags/FlagStore.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/blueprint/aKit.tsplatform/blueprint/Blueprint.tsplatform/blueprint/blueprintStill.tsplatform/blueprint/cellOrder.tsplatform/blueprint/columnsOf.tsplatform/blueprint/coreNodes.tsplatform/blueprint/coreTypes.tsplatform/blueprint/dialsOf.tsplatform/blueprint/duplicated.tsplatform/blueprint/evaluateBlueprint.tsplatform/blueprint/Evaluation.tsplatform/blueprint/examplesOf.tsplatform/blueprint/fitOf.tsplatform/blueprint/fits.tsplatform/blueprint/footOf.tsplatform/blueprint/formulaOf.tsplatform/blueprint/freshId.tsplatform/blueprint/kitOf.tsplatform/blueprint/movedBy.tsplatform/blueprint/NODE.tsplatform/blueprint/NodeKind.tsplatform/blueprint/nodes/barsNode.tsplatform/blueprint/nodes/cellLabel.tsplatform/blueprint/nodes/correlationNode.tsplatform/blueprint/nodes/creditLines.tsplatform/blueprint/nodes/dialNode.tsplatform/blueprint/nodes/formulaNode.tsplatform/blueprint/nodes/groupNode.tsplatform/blueprint/nodes/heatmapNode.tsplatform/blueprint/nodes/histogramNode.tsplatform/blueprint/nodes/inOrderOf.tsplatform/blueprint/nodes/joinNode.tsplatform/blueprint/nodes/keepNode.tsplatform/blueprint/nodes/linesNode.tsplatform/blueprint/nodes/mergedCredits.tsplatform/blueprint/nodes/noteNode.tsplatform/blueprint/nodes/numericPairs.tsplatform/blueprint/nodes/readoutNode.tsplatform/blueprint/nodes/scatterNode.tsplatform/blueprint/nodes/seasonNode.tsplatform/blueprint/nodes/showTableNode.tsplatform/blueprint/nodes/sortNode.tsplatform/blueprint/nodes/stackNode.tsplatform/blueprint/nodes/summaryNode.tsplatform/blueprint/nodes/topNode.tsplatform/blueprint/nodes/trendNode.tsplatform/blueprint/nodes/yourDataNode.tsplatform/blueprint/nodeShapeOf.tsplatform/blueprint/numberSaid.tsplatform/blueprint/optionalRead.tsplatform/blueprint/paint/barPlot.tsplatform/blueprint/paint/heatPlot.tsplatform/blueprint/paint/legendOf.tsplatform/blueprint/paint/linePlot.tsplatform/blueprint/paint/PLOT.tsplatform/blueprint/paint/plotFrame.tsplatform/blueprint/paint/plotSvg.tsplatform/blueprint/paint/readoutMarkup.tsplatform/blueprint/paint/scaleOf.tsplatform/blueprint/paint/scatterPlot.tsplatform/blueprint/paint/tableMarkup.tsplatform/blueprint/parseBlueprint.tsplatform/blueprint/peekOf.tsplatform/blueprint/Pending.tsplatform/blueprint/pickColumn.tsplatform/blueprint/PinType.tsplatform/blueprint/printBlueprint.tsplatform/blueprint/ranked.tsplatform/blueprint/renderBlueprintSvg.tsplatform/blueprint/renderBoard.tsplatform/blueprint/resolvedEditor.tsplatform/blueprint/ROW_TESTS.tsplatform/blueprint/saidBy.tsplatform/blueprint/suggestionsFor.tsplatform/blueprint/summaryOf.tsplatform/blueprint/Table.tsplatform/blueprint/tag.tsplatform/blueprint/tidyBlueprint.tsplatform/blueprint/wirePath.tsplatform/blueprint/wireRefused.tsplatform/blueprint/withDial.tsplatform/blueprint/withNext.tsplatform/blueprint/withNode.tsplatform/blueprint/withoutNodes.tsplatform/blueprint/withoutWires.tsplatform/blueprint/withTitle.tsplatform/blueprint/withValue.tsplatform/blueprint/withWire.tsplatform/data/answersOf.tsplatform/data/dayAndMonthOf.tsplatform/data/layeredJson.tsplatform/data/missingYears.tsplatform/data/readRunning.tsplatform/data/RefreshPorts.tsplatform/data/refreshRunning.tsplatform/data/refreshSource.tsplatform/data/renderSourceLine.tsplatform/data/RunningYear.tsplatform/data/runningYearOf.tsplatform/data/SEASON_ORDER.tsplatform/data/seasonOf.tsplatform/data/socrataUrl.tsplatform/data/withSoFar.tsplatform/data/YearlySource.tsplatform/command/Command.tsplatform/command/Outcome.tsplatform/command/plainTextOf.tsplatform/markdown/escapeHtml.tsplatform/markdown/flow/layoutFlow.tsplatform/markdown/flow/parseFlow.tsplatform/markdown/flow/renderFlow.tsplatform/markdown/highlight.tsplatform/markdown/plainLineOf.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/markdown/unescapeHtml.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/content/nameOf.tsplatform/content/Page.tsplatform/content/pageShowing.tsplatform/content/parentOf.tsplatform/content/parseFrontMatter.tsplatform/content/routeOf.tsplatform/content/Site.tsplatform/random/randomOf.ts
079ed30 13 October 2026 — A module of the LCARS display is moved by hand, the last of what David said it lacked: carried up or down its column onto another row, where what stood there changes places with it, the rest making room as it goes and a mark showing where it would land. Its column it keeps, since that says what comes before what, and the flow says it. Moving one module among others that stood where the layout wished would move nothing — each stands level with what feeds it, so they would all follow — so from the first move every module stays where it stood, and the display only finds a place for what is new, around them; Tidy hands the layout back. A move is a step Undo takes back, though the blueprint is the same before and after: where modules were put is kept beside each state of it while the page is open, and not with the reader's version nor in a link, since the text of a blueprint says nothing of it. Alt and an arrow move the module chosen; a finger on a module still moves the page. The schematic says of itself where its rows are and which each module stands on, so a hand on it is read against what is drawn. And what the display asks when a conduit could be run more ways than one is worded in a function of its own, tested without a page
781 files in 52 boxes, 428 tests · 654 arrows between boxes, 853 of all 2234 onto a type · a test reaches 567 of the 710 files with something to test · no boxes in a circle
filesarrows between boxes

How often each file changes, how far a change travels, and which files change together with no arrow between them is the other half of this picture: how this site changes.

What the tangle shows

Tangled, with no boxes, the files arrange themselves by the arrows alone, and structures appear: knots of files that need one another, and files that everything seems to pass through. Both can be counted, and the figures here follow the picture's history as it plays.

The network. Read as network science reads any network, the source is files joined by arrows, and the first questions are the ones asked of every other: how the links are spread among the files, and how far apart the files are.

125102050100%10%1%needing 1 or more: 592 files, 76%needing 2 or more: 449 files, 57%needing 3 or more: 329 files, 42%needing 4 or more: 224 files, 29%needing 5 or more: 156 files, 20%needing 6 or more: 111 files, 14%needing 7 or more: 77 files, 9.9%needing 8 or more: 57 files, 7.3%needing 9 or more: 41 files, 5.2%needing 10 or more: 29 files, 3.7%needing 11 or more: 22 files, 2.8%needing 12 or more: 15 files, 1.9%needing 13 or more: 13 files, 1.7%needing 15 or more: 12 files, 1.5%needing 18 or more: 10 files, 1.3%needing 19 or more: 9 files, 1.2%needing 20 or more: 7 files, 0.9%needing 21 or more: 6 files, 0.8%needing 22 or more: 5 files, 0.6%needing 33 or more: 3 files, 0.4%needing 35 or more: 2 files, 0.3%needing 36 or more: 1 file, 0.1%needed by 1 or more: 750 files, 96%needed by 2 or more: 374 files, 48%needed by 3 or more: 201 files, 26%needed by 4 or more: 130 files, 17%needed by 5 or more: 80 files, 10%needed by 6 or more: 63 files, 8.1%needed by 7 or more: 50 files, 6.4%needed by 8 or more: 46 files, 5.9%needed by 9 or more: 39 files, 5%needed by 10 or more: 35 files, 4.5%needed by 11 or more: 30 files, 3.8%needed by 12 or more: 29 files, 3.7%needed by 13 or more: 27 files, 3.5%needed by 14 or more: 24 files, 3.1%needed by 15 or more: 20 files, 2.6%needed by 16 or more: 18 files, 2.3%needed by 17 or more: 15 files, 1.9%needed by 18 or more: 13 files, 1.7%needed by 19 or more: 12 files, 1.5%needed by 20 or more: 11 files, 1.4%needed by 23 or more: 9 files, 1.2%needed by 33 or more: 8 files, 1%needed by 36 or more: 7 files, 0.9%needed by 41 or more: 6 files, 0.8%needed by 48 or more: 5 files, 0.6%needed by 51 or more: 4 files, 0.5%needed by 61 or more: 3 files, 0.4%needed by 68 or more: 2 files, 0.3%needed by 86 or more: 1 file, 0.1%NodeKind.ts, needed by 86Workbench.ts, needing 36how many others: needed by, or needing (a log scale)the share of files (a log scale)against a random network as bigclustering0.30 here0.0073 at randommean way between two files, in arrows4.29 here3.82 at randomsmall-world-ness36.7

needed by so many or moreneeding so many or more

Of the 781 files that ship, 74% are needed by two others or fewer, and NodeKind.ts is needed by 86, the most; Workbench.ts needs 36, the most. The network is 41 times as clustered as a random network of as many files and links, and the ways between its files are 1.1 times as long: a small-world-ness of 36.7.

When this was written, on 29 September 2026, most files were needed by one or two others and a few by very many, the tail that the log scales keep in sight. And the files were far more clustered than in a random network of as many files and links, where two files joined to a third are seldom joined to each other, while the ways between them were nearly as short. Watts and Strogatz called a network like that a small world (1998): clustered like a lattice, near like a random network. Humphries and Gurney made the two one number, small-world-ness (2008): the clustering over a random network's, over the length of the ways over a random network's, a small world above one. Until then it had grown with the source, which says less than it seems: a random network's clustering falls as it grows with as many links a file, and this one's had hardly fallen. Christopher Myers found the graphs of what works with what inside several open-source programs to be small worlds too, and scale-free, a few of their parts linked to very many (2003); no such fit is made here.

With nothing chosen, the panel by the picture tells more of the network at the commit shown: whether files with many links join files with few, as Newman found technological networks mostly do (2002); how deep its knot is, its deepest core, what is left when every file with fewer links than some number is taken away, again and again (Seidman, 1983); and how tall its stack of what needs what. Choose a file, and it tells the file's own: its place by PageRank (Brin and Page, 1998), which is to be needed by files that are themselves needed; how near it is to the rest, and how much it stands between them (Freeman, 1978).

The groups the arrows make. The Louvain method (Blondel and others, 2008) finds the groups a graph makes without being told any. How much a grouping keeps its arrows inside its groups, beyond what arrows drawn at random would, is its modularity (Newman and Girvan, 2004); the method moves each file into the neighbouring group that raises it most, then treats each group as one file and starts again, until nothing moves. The modularity of the boxes can be worked out the same way.

features/architecture: 122platform/charts: 1platform/markdown: 1platform/page: 1125 files: architecture 122, charts 1, markdown 1 and 1 moreplatform/shell: 19features/search: 11platform/markdown: 9platform/page: 9features/theme: 8platform/browser: 8platform/content: 6platform/flags: 6platform/agent: 5platform/plugin: 5features/writings: 3platform/command: 3main.ts: 1platform/analytics: 194 files: shell 19, search 11, markdown 9 and 11 morefeatures/weather: 33features/packages: 8features/guess-the-rule: 6features/architecture: 5platform/data: 5features/sky: 4features/step-names: 4features/thesis-results: 4features/air-quality: 3features/bowling-kata: 3platform/browser: 2platform/plugin: 2features/allFeatures.ts: 1features/developer-meetings: 1features/first-network: 1features/gherkin-genie: 1features/lagoon: 1features/lcars: 1features/portfolio: 1features/rocket: 1features/search: 1features/technical-debt: 1features/world: 1features/writings: 1platform/content: 192 files: weather 33, packages 8, guess-the-rule 6 and 22 moreplatform/blueprint: 52features/architecture: 17features/sea: 12features/barcelona-series: 5features/recipes: 3features/weather: 190 files: blueprint 52, architecture 17, sea 12 and 3 moreplatform/blueprint: 35platform/workbench: 23features/lcars: 14platform/plugin: 2platform/browser: 175 files: blueprint 35, workbench 23, lcars 14 and 2 morefeatures/bowling-kata: 14features/gherkin-genie: 10features/tests-as-examples: 8features/post-tests: 6features/step-names: 3platform/testing: 3platform/markdown: 246 files: bowling-kata 14, gherkin-genie 10, tests-as-examples 8 and 4 morefeatures/world: 32features/fibergochi: 9platform/browser: 142 files: world 32, fibergochi 9, browser 1features/rocket: 15platform/program: 15platform/plugin: 6platform/browser: 440 files: rocket 15, program 15, plugin 6 and 1 morefeatures/air-quality: 25platform/data: 3platform/blueprint: 129 files: air-quality 25, data 3, blueprint 1features/first-network: 10features/small-steps: 7platform/markdown: 3platform/browser: 2platform/random: 123 files: first-network 10, small-steps 7, markdown 3 and 2 morefeatures/fish-market: 2121 files: fish-market 21platform/charts: 10features/developer-meetings: 6features/technical-debt: 218 files: charts 10, developer-meetings 6, technical-debt 2platform/data: 8features/barcelona-series: 715 files: data 8, barcelona-series 7features/adventure: 1414 files: adventure 14features/lagoon: 1414 files: lagoon 14features/maze: 1212 files: maze 12features/next-word: 1111 files: next-word 11features/headline: 77 files: headline 7features/architecture: 44 files: architecture 4

a box of the framea featurethe top of the source

The arrows alone, with no box said, gather the 781 files that ship into 27 groups, 8 groups of fewer than 3 files among them, not drawn. 5 of the 33 features are a group to themselves: all of their files, and nothing else. Drawn as the boxes say, the source has a modularity of 0.62; drawn as the arrows would, 0.73.

Some features make a group of their own, whole: islands, as the rules want. Where the arrows gather several boxes into one group, their files are more tied to one another than to the rest — often a feature and the part of the frame it leans on most, sometimes features that lean on the same things. Set pointing to show its group, and the picture draws any file's.

The bridges. Some files stand between the others: most of the shortest ways from one file to another pass through them, the arrows read either way. Set the size to bridges, and the picture shows how much each does.

fileof the ways between two othersneedsneeded by
platform/plugin/Feature.ts35%1068
platform/browser/el.ts20%041
platform/blueprint/NodeKind.ts18%086
platform/markdown/escapeHtml.ts16%051
features/architecture/browser/mountArchitecture.ts8.6%192
features/world/browser/mountWorlds.ts5.9%91
features/architecture/Snapshot.ts4.5%048
platform/blueprint/Table.ts4.4%061
platform/plugin/Feature.ts stands on 35% of the shortest ways between two other files that ship, the arrows read either way; where several ways are as short, each counts for its share.

When this was written, on 28 September 2026, the first three were the contract every feature fulfils, the one way to make an element on the page, and the one way to make text safe to print: files where much of the source meets. Read either way, the arrows say where the parts of the source meet, not which way a change would go; a file that needs nothing carries no change through it.

How far a change could reach. Every arrow is a road a change could take back to what needs it. The share of the source a change to one file could reach, on average, following them all the way, is a design's propagation cost (MacCormack, Rusnak and Baldwin, 2006); set the size to reach, and the picture shows each file's.

0%2%4%6%8%10%12%14%16%18%the first committhe last
In theory a change to one file could reach 1.6% of the source, on average; at the first commit, 17%. The farthest reaching: platform/blueprint/NodeKind.ts, whose change could reach 187 files; platform/markdown/escapeHtml.ts, whose change could reach 182 files; and platform/content/Page.ts, whose change could reach 114 files.

A source that grows by features, which little else needs, sees it fall: a change inside a new feature can reach little beyond it. How far changes did go, rather than could, is on how this site changes.

The arrows point one way

A rule written in a document is a rule that can be missed, by a person or by an AI. So the rules of this code are not in a document: they are tests it has to pass. architecture.test.ts reads the same graph this picture draws, and fails when

Some of what the pages here measure can only be held, not forbidden. A ratchet turns one way. A file in the source, architecture.ratchet.json, keeps where four measures of the source stand, and a test fails if any of them gets worse. When one gets better, the test fails too, until the new value is written into the file, in the same commit, so that the gain cannot be lost again. A limit drawn by taste would either fail on the first day or be too loose to catch anything; a ratchet starts where the source is, and only lets it go forward. It asks nobody, person or AI, to remember anything: whatever makes the shape worse is told so, by name.

For each measure, the figure sets what the ratchet holds beside what the source measures. What it holds is read from the file at every commit since it came in, a band that steps wherever the file was changed. What the source measures is taken at every commit of the history, as the ratchet takes it now, the commits before it began as well, a line inside the band. Under them, how the ratchet went: when it began, what it held, and every time it was tightened since, or loosened.

what the ratchet holdsover the historyheldmeasured
arrows against stability
box arrows from a box to one less stable than itself, by Robert C. Martin's measure; the composition's aside, which has to point at every feature
11
deepest core
how deep the knot of files goes: what is left when every file with fewer links than that is taken away, again and again
55
tallest stack
the longest chain of what needs what, in arrows
1212
untested files
files that ship with something in them to run that no test imports
143143

measured at every commitheld by the ratchet

How the ratchet went

  1. 29 September 2026: began, holding 8 box arrows against stability, a core 5 deep, a stack 12 arrows tall and 156 files with something to run that no test imports
  2. 29 September 2026: tightened, the arrows against stability from 8 to 5
  3. 29 September 2026: tightened, the untested files from 156 to 155
  4. 29 September 2026: tightened, the untested files from 155 to 147
  5. 1 October 2026: tightened, the arrows against stability from 5 to 4 and the untested files from 147 to 146
  6. 2 October 2026: tightened, the arrows against stability from 4 to 3
  7. 2 October 2026: tightened, the arrows against stability from 3 to 2
  8. 5 October 2026: tightened, the arrows against stability from 2 to 1 and the untested files from 146 to 144
  9. 8 October 2026: tightened, the untested files from 144 to 143
At this commit, the ratchet holds 1 box arrow against stability, a core 5 deep, a stack 12 arrows tall and 143 files with something to run that no test imports, and the source measures the same. At no commit since it began has the source measured more than the ratchet held.

And what how this site changes finds, files that keep changing together with no arrow between them, is held too: two files of different boxes that changed together twice with nothing joining them need a test that imports both, so that what they agree on, which no import states, is written down where breaking it fails. Two files of one box changing together is what makes the box one, and the files that put the features together change with everything they put together: both are left out. So the page the build writes and the scripts that take it over agree in a test; so do the theme the head paints before anything shows and the one the theme's script settles, and the list at the end of a directory's page and what ls prints there.

Two more things watch the AI as it works, and they are in the repository too. After every edit to a file of the source, it is told what the history knows of that file: how often it has changed, what it changes with, and whether a test holds what they agree on — the panel beside the picture, said at the moment it matters. It cannot commit, nor end its turn, while the type check or the tests are red, and the checks that read the history read it as the deploy will write it, with what is being committed in it. Then, after every push, the deploy breaks the lines that push changed on purpose, one small change at a time, === into !==, && into ||, and lists the ones no test noticed. Code coverage says a line was run; this says whether running it was checked, which is the difference a program that tests nothing makes plain. And it lists what no test runs, not as a number to raise but as a question each file asks. If nothing in the site uses it, it has no purpose, and goes. If only a browser runs it, it is hard to test where it is, and what it decides can move out of the browser. And if the site uses it and no test runs it, it has a behaviour no test states yet, and the test is what is missing: the first such test said, of every page, that every figure it names stands in its HTML, which the build had never been made to prove.

The dashed arrows need only a type: a box that depends on an interface, not on what implements it. That is dependency inversion, and it is what lets a feature be removed by removing its folder.

8 September 2026

On its first day the source was sorted by kind of file: a core and a ui. On the second it was sorted by what the site is — a frame, and the features standing in it — in one commit: The folders say what the site is, not what kind of file each one holds. Drag the slider back to it and watch the files cross.

~/projects/architecture $

~/projects/architecture $