GitLab UI, read at v114.1.0

GitLab UI is GitLab's Vue component library, developed in a public repository with its tokens, tests and contribution guides. We read its release tag v114.1.0 with Loom's audit, as a public source, and list what the audit found and the plan Loom would propose. Nothing was applied to GitLab UI.

45out of 100 before any changeLoose threads

133 components and 1301 tokens read.

Source
gitlab.com/gitlab-org/gitlab-ui, src (with the package root's docs, tests, stories and token files)
Pinned at
v114.1.0 (commit f8c6c61), @gitlab/ui 114.1.0
Licence
MIT: LICENSE (MIT, Copyright GitLab Inc.)
Why this source
The GitLab UI repository at its release tag v114.1.0: the Vue components, the DTCG token files, the contribution docs and the tests are all in one public repository, so a clone is the fullest read.
How it was read
Git clone of a public repository through Loom's engagement checkout (the same path as the acceptance suite's GitLab check, scripts/acceptance/f1-connect.ts).
Engine
Loom conversion engine 0.1.0, commit 1e10804; Loom 2026 standard (public rubric 2026.1); no AI model
Run
1 November 2026 with npm run open-audit -- gitlab-ui --date 2026-11-01

GitLab UI has a strong token foundation and pipeline

GitLab UI's tokens come in three tiers, most semantic and component tokens point at a lower tier, and the tokens are built into code from DTCG source files. Ownership is machine-readable (CODEOWNERS), most components have their own test or story, and CI runs checks. These are the areas where the evidence in the repository is strongest.

The eight areas, with what each score can show

AreaScoreWhat the score can and cannot show
Foundations and tokens54Scored from what this source holds.
Components52Scored from what this source holds.
Patterns and pagesNot scoredNo pattern or template records in the inputs: this area is left out of the overall score, not scored zero.
UsageNot scoredOnly the library's own source was read: its components defining themselves are not adoption, and usage can only be measured in product code that consumes the library, so this area is left out of the overall score.
Governance42Decision records and a lifecycle per component were not found in this repository. GitLab keeps much of its design guidance in Pajamas, its design system site, which lives in another repository and was not read.
Brand, illustration, microcopy and localisation35Scored from what this source holds.
Tools and sync69GitLab UI publishes its documentation through Storybook. The rubric's documentation-site check looks for a site built from the system's records, so the Storybook documentation scores as a workshop (stories), not as a documentation site.
AI readiness17Scored from what this source holds.

Three findings, with their evidence

Each finding links to the file at the pinned commit, or says that nothing was found in the source we read.

  1. High · Foundations and tokens

    105 role tokens duplicate another token's literal colour

    Role tokens that copy a primitive's value instead of pointing at it drift apart when the palette changes.

    Evidence

    Loom's proposed change

    Replace each duplicate with an alias ({palette.x}); two literals with the same value drift apart on the first edit.

  2. High · Foundations and tokens

    Required modes missing: high contrast

    Light and dark are declared as token modes; high contrast is not, and nothing records a decision either way.

    Evidence

    • light: token mode "default"
    • dark: token mode "dark"
    • high contrast: silent

    Loom's proposed change

    Declare light, dark and high-contrast as token modes that remap semantic aliases, and contrast-check every pair in every mode. A recorded 'not supported' decision is honest but does not meet the 2026 baseline.

  3. High · AI readiness

    No machine-readable component contracts

    AI readiness is the lowest area: agents have to infer each component's rules from source and prose.

    Evidence

    • Not found anywhere in the source we read.

    Loom's proposed change

    Publish contracts as JSON (generated stubs in artefacts/contracts) so agents read rules instead of inferring them from source.

Every gap, and what Loom would propose

AreaGap, and what the source showedWhat Loom would propose
Foundations and tokensDTCG token file validates265/1043 valid in gitlab-ui/src/tokens (39 DTCG files); 265 alias referencesAdopt the typed token set (typed, described, DTCG-valid) and build it with the token pipeline.
No role token repeats another token's literal105 duplicates among 128 non-primitive literal colours (×5 penalty)Adopt the typed token set (typed, described, DTCG-valid) and build it with the token pipeline.
Colour pairs meet WCAG in every declared mode448/1344 pairs pass; checked in 1 of 2 declared mode(s); 0 name-based pairs listed separately; 65 undeterminableAdopt the typed token set (typed, described, DTCG-valid) and build it with the token pipeline.
OKLCH or declared colour spacecolour values with no declared spaceAdopt the typed token set (typed, described, DTCG-valid) and build it with the token pipeline.
Consistent naming (shared prefix, kebab-case)11% share the dominant prefix; 260/1301 kebab-caseAdopt the typed token set (typed, described, DTCG-valid) and build it with the token pipeline.
ComponentsAverage contract completeness (10 template fields)23% across 133 componentsFill the open contract fields (the questions are in each contract).
Components at ≥80% completeness0/133Fill the open contract fields (the questions are in each contract).
Matching keyboard/focus test source in supplied inputs15/49 components identified as interactive by name or export; source matches only, execution not assessed; roots: gitlab-uiFill each contract's behaviour and accessibility fields, and test the states in stories with the interaction and a11y add-ons.
Cross-platform parity (React Native counterpart or explicit exclusion)0/133 with a counterpart or platform declarationFill the open contract fields (the questions are in each contract).
GovernanceChangelogdocumented: A product changelog exists but it does not track UI components or tokens.Answer the setup questions (npm run setup, or Setup in the control area): they write loom/governance.json, rituals and monitoring; the plan's governance model is the proposal they start from.
Deprecation policy with timelinesmentioned: Deprecation is mentioned without a policy (replacement, removal condition, timeline).Answer the setup questions (npm run setup, or Setup in the control area): they write loom/governance.json, rituals and monitoring; the plan's governance model is the proposal they start from.
Decision recordsabsent: No decision records found.Answer the setup questions (npm run setup, or Setup in the control area): they write loom/governance.json, rituals and monitoring; the plan's governance model is the proposal they start from.
Layer model (system of systems)absent: No layer model: a single layer, with nothing that says what a brand, region or product may override.Answer the setup questions (npm run setup, or Setup in the control area): they write loom/governance.json, rituals and monitoring; the plan's governance model is the proposal they start from.
Lifecycle statusabsent: 133 components have no lifecycle status.Answer the setup questions (npm run setup, or Setup in the control area): they write loom/governance.json, rituals and monitoring; the plan's governance model is the proposal they start from.
Brand, illustration, microcopy and localisationBrand rulesmentioned: Mentioned in passing (2 places); no rule an agent or reviewer could check work against.Fill the guideline's decisions and turn them into rules Loom checks.
Message catalogue (IDs + variables)absent: No message catalogue: UI strings are literals in code (or English defaults in props), with no IDs, variables or plural rules a writer, translator or copy check can work from.Fill the guideline's decisions and turn them into rules Loom checks.
Localization policydocumented: Prose guidance only; nothing machine-readable, so it cannot be enforced or handed to an agent as rules.Fill the guideline's decisions and turn them into rules Loom checks.
Localisation readinessabsent: Signals found: none; missing: externalised strings, pseudo-localisation, text-expansion rule, direction (RTL) rule.Fill the guideline's decisions and turn them into rules Loom checks.
Tools and syncDocumentation site built from the system0 documentation pages; gitlab-ui/README.mdUse Storybook autodocs as the documentation site built from the system.
Design tool linked to codenone foundMap each component to its Figma component (Code Connect).
AI readinessComponents with a machine-readable contract0/133Adopt the machine-readable contracts and their exact imports.
Components with followable rules (do/don't/when-not)42/133Ship the agent rules and instructions (and connect Loom's MCP server for live lookups).
MCP/knowledge interfaceno MCP; no static indexShip the agent rules and instructions (and connect Loom's MCP server for live lookups).
Retrieval tests shipped with the systemnone foundShip the retrieval tests and run them in CI.
Builder knowledge index returns the right component + import0/0 top-1 hits with importShip the retrieval tests and run them in CI.
Agent instructions shipped with the systemnone foundShip the agent rules and instructions (and connect Loom's MCP server for live lookups).
Tokens with allowed/forbidden use1/1301Ship the agent rules and instructions (and connect Loom's MCP server for live lookups).

The proposed after: draft pull requests, never opened

A dry run: 6 draft pull requests were planned and none was opened. Nothing was applied to GitLab UI.

  1. Token set: typed, aliased and valid DTCG, built from one sourceDraft pull request, 3 files; closes 5 gaps: foundations/dtcg, foundations/literal-duplicates, foundations/contrast, foundations/colour-space, foundations/namingloom/plan/gitlab-ui-tokens-89bdef6534
  2. A contract per component: purpose, when to use and not, states, accessibility, contentDraft pull request, 135 files; closes 7 gaps: components/average, components/strong, components/keyboard, components/parity, ai/machine-contracts, ai/retrieval-tests, ai/retrievalloom/plan/gitlab-ui-contracts-b593236c7a
  3. Governance records: changelog, deprecation policy, decisions, layers, lifecycleDraft pull request, 3 files; closes 5 gaps: governance/changelog, governance/deprecation, governance/decisions, governance/layers, governance/lifecycleloom/plan/gitlab-ui-governance-3319f13f89
  4. Guidelines as rules: brand, voice, message catalogue, localisationDraft pull request, 6 files; closes 4 gaps: brand/brand, brand/message-catalogue, brand/localization, brand/l10n-readinessloom/plan/gitlab-ui-guidelines-8f4372ad61
  5. Agent interface: instructions, rules and retrieval testsDraft pull request, 4 files; closes 6 gaps: ai/rules, ai/interface, ai/retrieval-tests, ai/retrieval, ai/instructions, ai/token-rulesloom/plan/gitlab-ui-agent-458bb40a61
  6. Tools: stories, keyboard tests and a documentation siteDraft pull request, 17 files; closes 3 gaps: components/keyboard, tools/docs-site, tools/design-linkloom/plan/gitlab-ui-tools-448b523574

What this read cannot show

  • Static analysis only: no code was run, no build was made and no test was executed. A matching test file is evidence that the test exists, not that it passes.
  • Usage is not scored. Only the library's own source was read; usage can be measured only in the product code that consumes the library, which is not part of this source.
  • A low area can mean the evidence is not in the public source we read (it may live on a documentation site, in another repository or in a team process), not that the system is weak there.
  • Patterns and pages are not scored: the source holds no pattern or page-template records Loom can read, so the area is left out of the overall score.
  • Nothing was applied to the project. The plan is listed as draft pull requests that were not opened (a dry run), and no after score is claimed.
  • Read from the repository at tag v114.1.0 only. Pajamas, GitLab's design system site and guidelines, lives in another repository and was not read.
  • Contrast is checked on the values one mode resolves to, using name-based pairs where no pairing is declared; name-based pairs are possible combinations, not confirmed ones.

All open audits The rubric

Start with a conversation about your system.

We read your system, show you what we found, and agree with your team what to fix first.