Skip to content

Release docs manifest can ship unversioned ("version": "DEV") — eql-3.0.4 did #430

Description

@coderdan

eql-3.0.4's eql-docs-eql-3.0.4.zip contains a manifest stamped with the placeholder version:

$ gh release download eql-3.0.4 -p 'eql-docs-*.zip' && unzip -o eql-docs-eql-3.0.4.zip
$ jq -r .version json/eql-manifest.json
DEV

eql-3.0.3 was stamped correctly (3.0.3), so this is a regression in the release path rather than a long-standing default.

Cause

tasks/docs/generate/json.sh treats a missing or empty version argument as DEV:

VERSION=${ARGC_VERSION:-DEV}

_build-docs.yml passes the tag straight through:

env:
  TAG: ${{ inputs.tag }}
run: |
  mise run docs:generate:json -- "${TAG}"

inputs.tag is declared optional ("Full release tag. Empty -> build only, no attach.", default ""). When it arrives empty, -- "" sets ARGC_VERSION to the empty string, :- substitutes, and the manifest is stamped DEV — silently, with a zero exit. The docs zip still gets attached, so nothing downstream notices.

Worth confirming which of the two _build-docs.yml call sites in release.yml (the production path at ~L195 and the prerelease path at ~L251) passed an empty tag for 3.0.4, since 3.0.3 came through fine.

Why it matters

The manifest is a published release asset and its version is what consumers display. In the docs site it feeds the EQL_VERSION constant behind the version banner on every EQL reference page, so an unversioned manifest reads as "EQL DEV" to readers.

The docs site is not affected in practice — it stamps the pinned tag over the manifest's field, and cipherstash/docs#74 extends that to warn on any disagreement rather than only on DEV. But that is a consumer working around a bad asset, and any other consumer reading the field gets DEV with no indication anything is wrong.

Suggested fix

Fail rather than default, at least when a tag was supplied to the release path:

VERSION=${ARGC_VERSION:?refusing to stamp a manifest without a version}

DEV is a reasonable default for a local mise run docs:generate:json with no argument, so the guard probably belongs in _build-docs.yml — assert TAG is non-empty before the generate steps whenever the caller intends to attach — or in docs:package, which could refuse to package a manifest whose version is DEV while being handed a real tag. The latter is a single check that closes the hole regardless of how the version went missing.

Found while pinning the docs site to 3.0.4 (cipherstash/docs#74) to pick up the manifest fixes from #427.

Metadata

Metadata

Assignees

Labels

EQLbugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions