lint: no drift check ties the GitLab status vocabulary across fixture, probe and GL_JQ_PIPEMAP #415

Open
opened 2026-08-26 16:19:22 +00:00 by jbr870 · 0 comments
Owner

Deferred from #47 QA round 1, finding CR-7 (qa-report:v1 domain=code phase=validate, comment 2201). Disposition defer-to-issue, decided by the operator on 2026-08-26.

The gap

The GitLab pipeline status vocabulary is maintained in three independent places, with nothing tying them together:

  1. .devwork/feature-release-pipeline-status-attributable-answer/external-contracts/gitlab-pipelines.sample.json — the captured contract (status_vocabulary_accepted_as_filter).
  2. plugin/skills/_shared/procedures/test/pipeline-identity.sh — the AC6_CASES here-string, hand-transcribed from the fixture.
  3. plugin/skills/glab-cli/bin/_lib.shGL_JQ_PIPEMAP, the map actually under test.

Grepping the probe for external-contracts hits only comments. The fixture is read by a human when authoring the test; it is never read by the test.

Why it matters

A future re-capture of the GitLab contract (a new GitLab version adds or removes a status) updates the JSON, and nothing forces AC6_CASES or GL_JQ_PIPEMAP to follow. The probe stays green while testing a vocabulary the fixture itself says is stale — a green that has stopped meaning what it did.

This is the same class the feature's own AC-14 check closes for a different pair (_GATED_PRIMS in the shared tier vs the contract's Kind column), so the shape of the fix is already established in this repo.

Proposed fix

A mechanical drift check in scripts/lint-conventions.sh, in the same shape as the AC-14 _GATED_PRIMS check that #47 added: parse the vocabulary from the fixture, parse the keys from GL_JQ_PIPEMAP, parse AC6_CASES, and fail the gate on any divergence between the three.

Note the fence-awareness rule in CLAUDE.md if the check has to read markdown; here all three sources are .json/.sh, so it should not need it.

Why it was not fixed in #47

New lint capability against a surface #47 does not otherwise change. #47's own drift check (AC-14) covers the required-vs-gated classification only.


Filed by /dev:develop → QA round 1 on issue #47. Component: component:shared (the probe and the lint gate) with a component:adapters edge (glab-cli/bin/_lib.sh).

Deferred from **#47 QA round 1**, finding `CR-7` (`qa-report:v1` domain=code phase=validate, comment 2201). Disposition `defer-to-issue`, decided by the operator on 2026-08-26. ## The gap The GitLab pipeline **status vocabulary** is maintained in three independent places, with nothing tying them together: 1. `.devwork/feature-release-pipeline-status-attributable-answer/external-contracts/gitlab-pipelines.sample.json` — the captured contract (`status_vocabulary_accepted_as_filter`). 2. `plugin/skills/_shared/procedures/test/pipeline-identity.sh` — the `AC6_CASES` here-string, hand-transcribed from the fixture. 3. `plugin/skills/glab-cli/bin/_lib.sh` — `GL_JQ_PIPEMAP`, the map actually under test. Grepping the probe for `external-contracts` hits **only comments**. The fixture is read by a human when authoring the test; it is never read *by* the test. ## Why it matters A future re-capture of the GitLab contract (a new GitLab version adds or removes a status) updates the JSON, and nothing forces `AC6_CASES` or `GL_JQ_PIPEMAP` to follow. The probe stays green while testing a vocabulary the fixture itself says is stale — a green that has stopped meaning what it did. This is the same class the feature's own AC-14 check closes for a *different* pair (`_GATED_PRIMS` in the shared tier vs the contract's Kind column), so the shape of the fix is already established in this repo. ## Proposed fix A mechanical drift check in `scripts/lint-conventions.sh`, in the same shape as the AC-14 `_GATED_PRIMS` check that #47 added: parse the vocabulary from the fixture, parse the keys from `GL_JQ_PIPEMAP`, parse `AC6_CASES`, and fail the gate on any divergence between the three. Note the fence-awareness rule in CLAUDE.md if the check has to read markdown; here all three sources are `.json`/`.sh`, so it should not need it. ## Why it was not fixed in #47 New lint capability against a surface #47 does not otherwise change. #47's own drift check (AC-14) covers the required-vs-gated classification only. --- *Filed by `/dev:develop` → QA round 1 on issue #47. Component: `component:shared` (the probe and the lint gate) with a `component:adapters` edge (`glab-cli/bin/_lib.sh`).*
Sign in to join this conversation.
No description provided.