Tags

Tags give the ability to mark specific points in history as being important
  • v2.3.0

    Release: reference v2.3.0
    reference v2.3.0
    
    ### Added
    
    - **The Phosphor duotone icon font is vendored into `design/icons/phosphor/`.** Three files from the `@phosphor-icons/web@2.1.1` npm tarball, 397 KB together, with the upstream MIT license verbatim beside the stylesheet and a refresh procedure in `design/icons/README.md`. The `@font-face` names the one `woff2`; every class rule is byte-identical to upstream.
    
    - **The design bundle is published under each release tag, at `design/<tag>/`, alongside the unversioned latest.** `just sync-design-assets` emits one snapshot per released tag at or after v1.3.0, the release that self-hosted the fonts. Publication and pruning policy sits beside the airgap recipe in `standards/design/SKILL.md`: at eight tags, pruning leaves the current major and the one before it.
    
    - **`--status-attention` and `--status-alert` join the docs chrome tokens, light and dark.** Attention is a check that could not tell, alert is a check that told us something is wrong, and anything rendering either used to hardcode its own amber and red. The dark variants hold the hue and lift the lightness into the band the three existing status tokens occupy.
    
    - **`upkeep` requires the heartbeat be published and the citations pinned.** Clause 3 now asks for both the `when: always` emission and a `pipeline/freshness-heartbeat` include in a stage before the deploy, and states the week-long lag a fresh heartbeat carries. A sixth clause names `.gitlab/freshness.lock.json`, written by `check-freshness pin` at the archive of the stamped release, so a released stamp drifts only when a release lands and the finding names the cited pages that changed in it.
    
    - **`design` asserts that a page does not fetch from unpkg, jsdelivr or Google Fonts.** Only the presence of the first-party link was ever asserted, so a page linking both passed. The assertion needed a tree-wide negative, so `check_grep_absent` joins the closed primitive set beside `check_grep`, forced by `standards/design`.
    
    ### Changed
    
    - **Design principle 7 is scoped to any published page, markup included, not to "any CSS rule".** A `<link>` in a Layout's `<head>` is not a CSS rule, which is how every chrome family in the estate came to load its icon font from a host the principle names as its own forbidden example. The first-party carve-out for the reference's Pages origin is unchanged.
    
    - **Both project templates link every design asset by tag, and `just sync` keeps them current.** `sync-versions.sh` repins the versioned URLs from `VERSION` and `validate-versions.sh` reports a template left behind, so a newly-stamped project never starts a release out of date. The unversioned path stays supported and stays the documented default.
    
    ### Fixed
    
    - **Nothing in the repository fetches Phosphor from unpkg any more, the reference's own production site included.** Both templates and `site/src/layouts/Layout.astro` carried the unpkg stylesheet, so a reader behind an egress filter got a page with no icons. `sync-design-assets` also publishes `design/icons`, without which the vendored font would not reach Pages at all.
    
  • v2.2.0

    Release: reference v2.2.0
    reference v2.2.0
    
    ### Changed
    
    - **Catalog component pins are the major, `@6`, so a patch to a component reaches its consumers without an edit in each one.** Minors and patches resolve to the newest matching catalog release at pipeline time; a major bump is the deliberate edit, read against the catalog CHANGELOG's breaking section before the pin moves. Sixteen includes across eight files, plus the paper template's `@~latest`, which was the last floating catalog ref in the tree and the only one that floated across majors. `reference_version` is untouched and stays full semver: the reference is not a catalog resource, so nothing resolves a partial there.
    
    - **The `pipeline` standard asks for the major rather than tolerating it.** The rule text is "pin the catalog major (`@6`)" with the reason beside it, and `check.sh` asserts the resolver's own grammar: a bare partial (`@6`, `@6.2`) or a full tag with or without the `v` (`@6.2.2`, `@v6.2.2`). A full pin still passes, for migration rather than as a second recommended form. The assertion also now fails `@v6` and `@v6.2`, which look like pins and resolve to nothing, so a consumer that writes one learns it from the check instead of from a pipeline that cannot start.
    
    - **`CATALOG-VERSION` holds the major (`6`), and `just sync` and `just validate` read and write `@6`.** Both scripts match either pin shape, which is what keeps them live: a sync that saw only full pins would collapse them once and then never find a pin again, so the next major bump would propagate to nothing. The validator reads a leftover `@v6.3.0` as drift against the expected `@6`. `SKILL.md`'s catalog link moves from a frozen `/-/tree/<tag>` URL to the project, because a `@6` consumer runs whichever `6.*.*` is newest and a pinned tree link names a version nobody is on.
    
    ### Fixed
    
    - **The `workspaces-airgap` design example links to the project's new home in `field-notes`.** After the move, all 32 links on `design/examples/workspaces-airgap.html` reached it only through GitLab's redirect; they now name `field-notes/workspaces-airgap` directly.
    
  • v2.1.0

    Release: reference v2.1.0
    reference v2.1.0
    
    ### Added
    
    - **`upkeep`, a Conditional advisory standard for exhibits that render dated claims about GitLab.** A conforming project declares how its claims go stale in `.gitlab/freshness.yaml`, includes the `pipeline/freshness` tripwire on a weekly schedule, publishes a `freshness.json` heartbeat `when: always`, and links a re-derivation procedure from a README `Maintenance` section. The check asserts the manifest keys, the include, the heading and the link; `unasserted:` names what the closed primitive set cannot reach.
    
    - **The catalog pin moves from `v5.0.0` to `v6.3.0`, the release that ships `pipeline/freshness`.** `just sync` propagates it to every include in the repository. Nothing in the `v5.0.0` to `v6.2.2` range changes an input contract on a component the reference includes.
    
    - **The tripwire cannot withhold a deploy, which is a different property from never going red.** Exit 1 (a newer release at the declared cadence, a read date past `stale_after_days`, or a citation that returns 404 or 410 or redirects off its host) is red by design, and exit 2 (the check could not see) is the allowed one. Placement keeps it off the critical path: a stage after the deploy, and rules that fire only on scheduled and manually started pipelines.
    
  • v2.0.0

    Release: reference v2.0.0
    reference v2.0.0
    
    ### Changed
    
    - **Every enforcement claim now describes what the code does.** `standards/registry.yaml` is the single source for the Mandatory and Conditional split; `renovate`, `pipeline` and `agents-md` move to the group their own `check.sh` puts them in. Nothing here runs `just check` against a consumer's merge request.
    
    - **Chrome is chosen by what a page is for, not by page count or build tooling.** Documentation renders with `chrome/docs/`, and an evidence record (a lab notebook, an ADR, a proving-ground result) renders with `chrome/lab/`.
    
    ### Removed
    
    - **The start surface is one page with one first move, and `/start/adopt/` is gone.** Its body now opens `/start/`, where the bundle URL is the page's first content, followed by the agent-flow figure, the harness list, and one-line pointers to the pipeline standard and the templates. The consumption-tier table and the home page's capability card grid leave with it, so a reader meets the lede, the architecture diagram, and the one instruction.
    
    - **`README.md` states the same first move the site states.** `## How to use it` opens with the bundle URL and names `AGENTS.md` in the checkout sentence below it; `## Adoption` is deleted, having pointed at a `/fleet/` page the site does not publish. `## Start a new project` is unchanged.
    
    - **An exemption is now `standard` + `reason` and means one thing: the standard does not apply to this project.** `until`, `owner` and `resolution` leave the schema and `scripts/audit-expiry.sh` is deleted, so a gap the project means to close is an issue rather than a dated entry, which `standards/conformance-config/SKILL.md` states. The next release is v2.0.0, because removing declared schema keys is a MAJOR change.
    
    - **`applicable_standards` and `adoption_phase` are removed from the schema, so `.reference.yaml` is one required scalar plus the exemptions list.** Severity comes from the standard's tier: a blocking-tier FAIL exits non-zero, an advisory-tier finding does not. No field declares it and no project chooses it.
    
    - **The reference's second exemption register is deleted, along with the only script that read it.** `compliance/exemptions.yaml` and `scripts/check-with-exemptions.sh` are gone, and the reference's own `.reference.yaml` is the one register, read by `just check` the way every consumer's is. `just check-self` and the `self-conformance` CI job run `just check` against this repository.
    
    - **A template nothing referenced and nothing rendered leaves `standards/design/`.** `single-file-site.html` pointed at design paths that had lost their `/design/` segment, loaded mermaid from a third-party CDN the design principles forbid, and named classes no chrome ships. `astro-imports.ts` stays.
    
    - **`check_toml_key` leaves the closed primitive set, which is now ten primitives.** No `check.sh` called it, and `_lib.sh` holds that a primitive whose coverage never grew past one call site is vocabulary without leverage. `just guard` reports the set's size.
    
    ### Added
    
    - **`/doctrine/groundskeeper/`, and a `Doctrine` section to hold it.** The version-independent reasoning for sustaining a standing demonstration estate: what decays and on which clock, the no-backdating constraint and the two verbs it leaves, the one-engine-many-estates architecture, plan before apply with its exit taxonomy, the guardrails, and the order an estate adopts it in. Four inline-SVG diagrams carry the two verbs on a timeline, the decay-mode-to-surface map, the catalog-to-estate boundary and one upkeep cycle; the page states its own dividing test, so engine field names and keeper vocabulary stay in the component's documentation, which it links without pinning a version.
    
    ### Fixed
    
    - **Three nav pages were absent from the agent surface's discovery array and are now registered.** `principles/timelessness`, `design/diagrams` and `design/authoring` render on the site and appear in the sidebar, but the hand-maintained `STATIC_PAGES` array in `site/integrations/llms-txt.ts` did not list them, so `/llms-full.txt` omitted their prose and no `/<route>/index.md` was emitted for them. The matching `/llms.txt` link-index entries land with them, so the two surfaces agree.
    
    - **`just validate` now fails when the sidebar nav and the agent surface disagree about which pages exist.** `just validate-agent-surface` compares every page route in `site/src/lib/sections.ts` against the `STATIC_PAGES` array in `site/integrations/llms-txt.ts` in both directions, exempting only the standards pages the integration emits from `SKILL.md`. It parses the two modules with a bracket-balanced scanner that refuses shapes it does not model rather than skipping them, `--selftest` holds that refusal to seventeen fixture cases on every run, and the script's header records why both directions exit non-zero.
    
    - **`just check REPO=.` exits 0 on a conformant repository.** `check` and `check-one` resolve `REPO` to an absolute path before the per-standard `cd`, so a relative path no longer resolves against the standard's own directory. A path that is not a directory is refused by name.
    
    - **`renovate` reads the config its own gate found.** `applies_when_file` publishes the matched path as `$SUBJECT` and the assertions read it, taking the shallowest match so the choice does not depend on traversal order. Describe mode publishes the declared glob, so `## Verify` is machine-independent.
    
    - **`check_json_key` FAILs an absent subject file instead of SKIPping it.** A missing subject file is not inapplicability: the standard applies and has failed, which is the rule `require_file` already states. Scoping a standard stays `applies_when_file`'s job, at the top of `check.sh`.
    
    - **Three `presentation` assertions reported the estate's own conventions as defects.** The H1 rule bans the punctuation a tagline or a path arrives as, not capitals and spaces; the hero embed accepts any alt text. The tagline is a short-form and expanded-form pair, not one phrase.
    
    - **Two `presentation` surfaces cited standards that no longer exist.** `templates/README-footer.md` credits this standard for the footer assertion, and the badge-row section drops its link to `../naming`, a path that stopped resolving when `naming` converged here.
    
    - **The lab starter uses the classes its chrome ships.** `templates/lab/site/index.html` carried three names absent from `chrome/lab/`: `skip-link` for `.skip`, `diagram-frame` from `chrome/docs/`, and `evidence-body` for `details.evidence > .body`. A class a starter names must exist in the chrome that starter loads.
    
    - **The lab starter's TL;DR block uses the shape its chrome documents.** `templates/lab/site/index.html` carried a `.tldr-eyebrow` paragraph and a bare list, neither of which `chrome/lab/tldr.css` styles. Cells now flow inside `.tldr-grid`, each one an `h3` over a single `p`.
    
    - **The patterns layer no longer plans a figure frame that already ships.** `design/patterns/README.md` and `design/DESIGN-LANGUAGE.md` listed `diagram-frame.css` among the patterns v0.2 authors, but `.diagram-frame` lives in `chrome/docs/chrome.css`. A pattern never re-authors a chrome component.
    
    - **The design language no longer says the sidenote pattern is implemented.** `design/DESIGN-LANGUAGE.md` pointed at `patterns/sidenote.css`, a file `design/patterns/` does not hold. The bullet now says what the v0.2 plan list above it already says: the pattern is planned, not shipped.
    
  • v1.4.0

    Release: reference v1.4.0
    reference v1.4.0
    
    ### Added
    
    - **`details.idx-group` in `design/patterns/disclosure-index.css`, the scanning layer above the rows.** A named group of index rows behind its own disclosure, its summary carrying a count, the group's name as a real heading, and one line on why to open it: the rows are not cut, they move one level down, which is THE MODEL the pattern already states applied one level up. The group carries `idx-group` alone and never `evidence` beside it, and the file's header records why before a maintainer reaches for the shorter selector; frame and metrics match the lab chrome's evidence-step disclosure, so the first consumer, the offline-readiness notebook, drops its page-local `details.evidence.mech-group` rule and renders unchanged.
    
    - **A fourth ruling on `/design/authoring/`: items read as written today, and the changelog carries the history.** A record that corrects itself in place accumulates archaeology, the "an earlier version said X, that was wrong" passages that serve the author's conscience and cost every later reader. Every correction earns a dated changelog line so a withdrawal stays findable, compressed on the way in rather than relocated, and the page states the trap beside the rule: a correction note usually has a live finding inside it, so it is sorted sentence by sentence, world-facts rewritten positively in the item's own voice and editing-facts moved out.
    
    - **A fifth ruling on `/design/authoring/`: past roughly forty index rows, introduce a grouping layer and make the group the scanning unit.** The sharper form of root-orients-while-disclosures-carry, and it only arrives on a long page: the rows are not cut, they move one level down, and the `details.idx-group` primitive added above is the built shape. The corollary ships beside the rule because it is the tempting mistake, that a gist is how a reader decides what to open, so shrinking the gists to hit a number trades comprehension for a smaller measurement.
    
    ### Fixed
    
    - **The index row's name no longer renders smaller than its own gist.** `.idx > details.item > summary` in `design/patterns/disclosure-index.css` set `font-size: var(--text-sm)` where the frame it restates uses 0.9rem, and `.i-name` takes its size from the summary, so an item's name rendered a step smaller than the gist beside it and inverted the row's reading order. The file's header records why 0.9rem is the row's type size.
    
    - **The release page carries the version's CHANGELOG section, rather than the words `Release vX.Y.Z`.** The catalog release component passes the annotated tag body straight to the release page with no template of its own, so a tag built with `-m "Release $ref"` published a surface that said nothing while the notes for that version sat finished two files away. `scripts/release-notes.sh` now builds the body from that section and refuses the tag rather than ship a stub, `just validate-release-notes` catches an unextractable section on the merge request that wrote it, and both scripts carry the reasoning in their headers.
    
  • v1.3.0

    946dd24d · Release v1.3.0 ·
    Release: reference v1.3.0
    The design system absorbs its first heavily iterated consumer page, and conformance settles on tier follows control backing.
    
    - **Added.** The `license` standard (blocking); the `/design/authoring/` page carrying three page-composition rulings; `design/patterns/disclosure-index.css`, the first authored pattern, with its class contract; a generated `## Verify` block in every standard, derived from its own `check.sh`; an advisory severity tier.
    - **Changed.** The lab TOC primitive is a vertical ordered list; the chrome self-hosts its fonts and makes only same-origin requests; catalog pins move to v5.0.0; `renovate`, `security-md`, and `presentation` assert properties rather than wording; `design`, `llms-txt`, and `posture-claims` move to the advisory tier, because tier follows control backing.
    - **Removed.** The `ai-assisted` standard, folded into `contributing`; the `reference-check` story everywhere it was told.
    - **Fixed.** Four token-layer contrast failures, corrected for every consumer at once; the `codeowners` template's automerge deadlock; the `pipeline` standard's host anchoring; `presentation`'s unparseable frontmatter.
    
    The version-scheduled enforcement flips in the v1.0.0 notes, including the mode flip announced for this version, belonged to the retired `reference-check` architecture. This release performs no flip: per-repo enforcement stays with the catalog's narrow components.
    
    - **Artifact.** The Pages design CDN and agent surface: https://gitlab-com.gitlab.io/public-sector/reference/design/
    - **Documentation.** https://gitlab-com.gitlab.io/public-sector/reference/
    - **CHANGELOG.** https://gitlab.com/gitlab-com/public-sector/reference/-/blob/v1.3.0/CHANGELOG.md#130--2026-08-24
    
  • v1.2.0

    Release v1.2.0
  • v1.1.0

    v1.1.0 -- paper template, build-time previews, agent surface expansion.
    
    Second release of the Public Sector reference. Substantive additions
    across templates, build system, agent surface, and the reference site
    itself. No breaking schema changes; consumer .reference.yaml files
    keep working.
    
    Templates:
    - templates/paper/ -- third project template alongside lab/ and docs/.
      Two-column academic LaTeX with design/typeset/gitlab.sty (slate/steel
      palette, preprint watermark, amsmath/amssymb/cleveref/tikz preloaded).
      `make new-project TEMPLATE=paper` stamps a working paper repo wired
      to the paper@~latest catalog component.
    
    Build system:
    - Ephemeral build-time template-preview capture
      (site/scripts/capture-template-previews.mjs). Stamps each template,
      screenshots lab + docs via Playwright Chromium, renders paper via
      tectonic + pdftoppm. Decoupled from `make build` so contributors
      without TeX + Playwright + python3 can still build the site locally.
    - New CI job capture-template-previews using the catalog's ci-latex
      image (pinned to the SHA that baked Node + Chromium runtime libs
      via gitlab-com/public-sector/pipeline!53). Pages job picks up the
      three PNG artifacts via stage-cascade.
    - design/chrome/docs/ as single source of truth for docs-template
      tokens + chrome CSS. The reference's own site @imports from this
      directory; `make new-project TEMPLATE=docs` vendors a copy into
      the consumer's site/public/design/.
    - sync-versions.sh and validate-versions.sh now sweep every
      .reference.yaml in the tree, not just the root one. Architectural
      fix: prior behavior silently downgraded every newly-stamped project
      to the predecessor reference version.
    
    Agent surface:
    - Root-level .ai/*.md and template-level authoring guides
      (templates/docs/.ai/docs-authoring.md, templates/lab/.ai/
      lab-authoring.md) publish as /agents/<topic>/ via the llms-txt
      integration. Tools that consume llms.txt get a complete dispatch
      table out of the box. llms-full.txt expanded to ~330 KB.
    - site/src/lib/url.ts withBase() helper propagated into the docs
      template; every internal link goes through it so projects
      deploying under a path prefix resolve correctly.
    
    Site:
    - Start section restructured: /start/ is a landing page; /start/adopt/
      and /start/contribute/ are first-class pages.
    - Nine-capability home page replaces the prior five-card layout.
    - README \"Paths\" section replacing the prior \"Pick a door\"
      phrasing for a professional tone consistent with the rest of the
      voice.
    
    Standards:
    - standards/repository/SKILL.md codifies the brand-artifact
      discipline: heroes and avatars do not track versions, never depict
      a layout tree, prefer SVG over mermaid, prefer principles over
      instance-specific labels.
    
    Catalog pin:
    - Pipeline catalog bumped v3.0.0 -> v3.3.0 across includes
      (vale, pages) and template starters
      (standards/pipeline/templates/.gitlab-ci.yml,
      standards/provenance/templates/release-pipeline-include.yml).
    
    Deferred to a follow-up release:
    - pipeline/reference-check catalog component. Until it lands,
      consumers run `make check REPO=\$CI_PROJECT_DIR` in a project-side
      CI job. The .reference.yaml schema this release stabilizes is
      forward-compatible.
    - Sector-specific control subsets (NIST 800-171 for DoD, HIPAA
      Security Rule for Health, etc.). The unified matrix already lists
      every framework; the subset bundles for one-line
      applicable_frameworks: dod selection ship in a later minor.
    - Standard-status flips on the v1.0.0 schedule (security-md,
      agents-md to enforcing at +30 days). Statuses remain at their
      v1.0.0 values in this release.
  • v1.0.0

    v1.0.0 -- Initial release of the Public Sector reference.
    
    A conformance contract published as Markdown: 17 standards under
    standards/, each with prose (SKILL.md), executable assertions
    (check.sh) restricted to a closed 9-primitive set, and
    lift-and-replace templates. The Astro site serves both human pages
    and an agent surface (llms.txt + per-standard Markdown).
    
    Schema:
    - One exemptions: list in .reference.yaml keyed by until: date
      (replaces the earlier deferred: + deviations: split).
    - Standards declare project-shape preconditions via applies_when_file
      (the 9th primitive added at v1.0.0): a standard that does not
      apply to a project's shape SKIPs rather than FAILs.
    
    The reference's own pipeline dogfoods the catalog (pages@v3.0.0,
    vale@v3.0.0). Pre-push CI lint via glab; in-pipeline parallelism
    via needs: []; xlarge SaaS runners for tight wallclock.
    
    Out of scope at v1.0.0:
    - reference-check catalog component (planned for catalog v3.1.0).
    - Live release verification (signature, SBOM, SLSA freshness) --
      owned by GitLab's Compliance product downstream.