← all organisations

alphagov / Docs vs reality

GOV.UK publishes its engineering standards. This is what happens when you test the estate against them.

GOV.UK publishes its engineering standards at docs.publishing.service.gov.uk - 986 pages and 1.5m words of it. That makes an unusual experiment possible: take the written conventions, turn them into file-system tests, and run them against the repositories they govern. This page is the result.

The documentation

986
pages of developer documentation
1.5m words
135
repositories documented in detail
of 1,527 in the org
18
owning teams named
each mapped to a Slack channel
44%
of manual pages self-flag as stale
“has not been updated for a while”
200
content document types
the GOV.UK content model, fully specified
83
content schemas published
269
pages in the developer manual
148.8k words of stated convention
10
RFCs cited by the manual
decisions traced to a written record

What stands out

Documented repositories comply; undocumented ones drift.

Among the 118 repositories the developer documentation covers, 77% carry the prescribed ci.yml and 80% configure Dependabot. Among the 309 live repositories it does not cover, those figures fall to 5% and 23%. Documentation and compliance travel together - the question is which causes which.

CODEOWNERS is the one measure that runs the other way.

Only 6% of documented repositories carry a CODEOWNERS file, against 9% of undocumented ones. That is not a gap in the core so much as a different solution to the same problem: GOV.UK publishes ownership centrally, mapped to a team and an alerting channel, rather than declaring it per repository in a file GitHub reads.

The manual is candid about its own decay.

118 of 269 manual pages carry an automated warning that they have not been updated recently. That is unusually honest for internal documentation, and far better than silent staleness, but it means roughly two in five pages of the standard cannot be relied on without checking the code.

Ownership is named for 135 repositories.

Each maps to a Slack channel, and a separate alerting channel. This is the single most valuable thing in the developer documentation: for the core platform, 'who owns this?' has a published answer - something most organisations of this size cannot produce.

Compliance where the docs apply

The 118 documented repositories

Each row is a convention stated in the manual, tested against the file tree at HEAD.

CI workflow named ci.ymlmanual: test-and-build-a-project-with-github-actionsCI workflow named ci.yml: 91 of 118 (77.1%)77%91/118Uses GitHub Actions at allRFC-123Uses GitHub Actions at all: 110 of 118 (93.2%)93%110/118.github/dependabot.yml presentmanual: manage-dependencies.github/dependabot.yml present: 94 of 118 (79.7%)80%94/118.govuk_dependabot_merger.ymlRFC-167 / RFC-178 auto-merge.govuk_dependabot_merger.yml: 84 of 118 (71.2%)71%84/118rubocop config presentmanual: lintingrubocop config present: 72 of 118 (61.0%)61%72/118RSpec spec/ directorymanual: conventions-for-rails-applicationsRSpec spec/ directory: 69 of 118 (58.5%)58%69/118README presentbaselineREADME present: 118 of 118 (100.0%)100%118/118Licence file presentMIT by conventionLicence file present: 94 of 118 (79.7%)80%94/118Dockerfile presentGOV.UK DockerDockerfile present: 61 of 118 (51.7%)52%61/118CODEOWNERS presentreview routingCODEOWNERS present: 7 of 118 (5.9%)6%7/118

Compliance where they do not

The 309 live but undocumented repositories

The same tests, run against live repositories the developer documentation does not cover. The gap between this chart and the one above is the real finding.

CI workflow named ci.ymlmanual: test-and-build-a-project-with-github-actionsCI workflow named ci.yml: 16 of 309 (5.2%)5%16/309Uses GitHub Actions at allRFC-123Uses GitHub Actions at all: 136 of 309 (44.0%)44%136/309.github/dependabot.yml presentmanual: manage-dependencies.github/dependabot.yml present: 72 of 309 (23.3%)23%72/309.govuk_dependabot_merger.ymlRFC-167 / RFC-178 auto-merge.govuk_dependabot_merger.yml: 0 of 309 (0.0%)0%0/309rubocop config presentmanual: lintingrubocop config present: 10 of 309 (3.2%)3%10/309RSpec spec/ directorymanual: conventions-for-rails-applicationsRSpec spec/ directory: 18 of 309 (5.8%)6%18/309README presentbaselineREADME present: 290 of 309 (93.9%)94%290/309Licence file presentMIT by conventionLicence file present: 206 of 309 (66.7%)67%206/309Dockerfile presentGOV.UK DockerDockerfile present: 87 of 309 (28.2%)28%87/309CODEOWNERS presentreview routingCODEOWNERS present: 27 of 309 (8.7%)9%27/309

The shared-gem strategy

GOV.UK gem adoption among documented repositories

The manual asks teams to build on a set of published gems rather than reinventing common needs. Counted by direct reference in each Gemfile.

rubocop-govukrubocop-govuk: 5050govuk_app_configgovuk_app_config: 4444plekplek: 3636gds-api-adaptersgds-api-adapters: 3535govuk_testgovuk_test: 3333gds-ssogds-sso: 2929govuk_publishing_componentsgovuk_publishing_components: 2929govuk_sidekiqgovuk_sidekiq: 2727govuk_schemasgovuk_schemas: 2626govspeakgovspeak: 1414govuk_admin_templategovuk_admin_template: 66govuk_message_queue_consumergovuk_message_queue_consumer: 55govuk_personalisationgovuk_personalisation: 44govuk_document_typesgovuk_document_types: 44govuk_ab_testinggovuk_ab_testing: 33

The architectural centre

Repositories most referenced across the documentation

How often each repository is linked from the documentation, excluding the docs repo itself. This is a fair proxy for architectural centrality: publishing-api and content-store are the spine of GOV.UK, and the documentation cannot describe much without pointing at them.

publishing-apipublishing-api: 121121content-storecontent-store: 9191govuk-dockergovuk-docker: 5353govuk-helm-chartsgovuk-helm-charts: 4949govuk-infrastructuregovuk-infrastructure: 4343govuk_publishing_componentsgovuk_publishing_components: 3030frontendfrontend: 2222whitehallwhitehall: 2121govuk-rfcsgovuk-rfcs: 1616gds-api-adaptersgds-api-adapters: 1414email-alert-apiemail-alert-api: 1313search-api-v2search-api-v2: 1313govuk-awsgovuk-aws: 1212finder-frontendfinder-frontend: 1212

Ownership and taxonomy

Repositories per owning team

As published in the developer documentation.

govuk-platform-engineering-teamgovuk-platform-engineering-team: 3535govuk-content-apisgovuk-content-apis: 2121govuk-insights-and-analytics-teamgovuk-insights-and-analytics-team: 1212govuk-whitehall-experience-techgovuk-whitehall-experience-tech: 1010govuk-patterns-and-pages-techgovuk-patterns-and-pages-tech: 99govuk-navigation-techgovuk-navigation-tech: 88govuk-publishing-content-reuse-devgovuk-publishing-content-reuse-dev: 88ai-govukai-govuk: 66govuk-publishing-mainstream-experience-tgovuk-publishing-mainstream-experience-t: 55govuk-searchgovuk-search: 55publishing-classification-systems-metadapublishing-classification-systems-metada: 55govuk-publishing-tagging-workflowgovuk-publishing-tagging-workflow: 44govuk-developersgovuk-developers: 22gds-apto-collaborationgds-apto-collaboration: 11govuk-ask-platform-engineeringgovuk-ask-platform-engineering: 11govuk-content-operationsgovuk-content-operations: 11govuk-publishing-design-guidegovuk-publishing-design-guide: 11govuk-ruby-frontendersgovuk-ruby-frontenders: 11

Repositories per official type

GOV.UK's own classification of its estate.

UtilitiesUtilities: 4646GemsGems: 2424APIsAPIs: 1313Publishing appsPublishing apps: 1212Data engineeringData engineering: 99Supporting appsSupporting apps: 99AI appsAI apps: 88Frontend appsFrontend apps: 66Data EngineeringData Engineering: 22Transition appsTransition apps: 22Content GuidanceContent Guidance: 11Design SystemDesign System: 11Licensing appsLicensing apps: 11ServicesServices: 11