script-tests jq tripwire: runner fleet now ships jq 1.7; re-pin --expect and update the jq contract #935
Closed
opened 2026-10-29 21:15:27 +01:00 by timothy
·
3 comments
No Branch/Tag Specified
main
renovate/meziantou.analyzer-3.x
renovate/nuget-sixlabors.imagesharp-vulnerability
913-scripted-playout-401
929-vuln-pkcs-imagesharp-v4
renovate/dotnet-monorepo
release/v26.15.0-notes
renovate/lucene.net
renovate/cliwrap-3.x
issue-806-guard-populations
scratch/767b-poisoned
scratch/767b-control
release/v26.14.0-notes
release/v26.14.0
renovate/sqlitepclraw.bundle_e_sqlite3-3.x
docs/510-skill-logo-bug-policy
fix/510-watermark-resolution-policy
fix/629-verdict-classifier-falseopens
fix/609-decisions-edit-token-scope
issue-135-clear-to-none
release/v26.12.0-notes
fix/409b-lastscan-api-parity
fix/401-updatechannel-mirror-422
fix/327-playlist-rename-validation
fix/410-scancancel-log-level
fix/409-447-librariesscreen-neverscanned
fix/338-zap-exit-code
fix/367-plex-budget-message
fix/310-debom-legacy-cs
ci/604-lane-rebalance
feat/388-design-mirror
feat/247-test-ownership
feat/247-primary-action
feat/357-player-owned-playback
feat/357-jellyfin-plugin-poc
fix/289-mcp-hardening
issue58-mcp
feat/244-channels-extract
ci/auto-bump-prod-compose
feat/multi-rerun-collections-api
feat/collections-api
feat/quick-wins
feat/185-docs-part2
feat/140-collections-screen
feat/146-channel-edit
feat/147-classic-ui-link
issue22-renovate-dashboard
feat/91-cutover
feat/63-composite-create
feat/65-library-browse
feat/85-epg
feat/86-schedule-editor
feat/109-dashboard-data
feat/99-session-tracking
fix/dockerfile-node-tag
feat/59-spa-foundation
docs/59-ui-redesign-brief
feat/102-json-guide
feat/111-schedule-durations
feat/104-artwork-upload
feat/103-media-sources-api
feat/playouts-read-api
feat/108-health-api
feat/105-picker-list-endpoints
issue-97-channel-state-api
issue42-jellyfin-musicvideos
issue46-rest-api-error-contract
dependabot/nuget/ErsatzTV.FFmpeg.Tests/multi-d307a2e06f
qsv-improvements
hdr-vulkan-cuda-test
v26.16.0
v26.15.0
v26.14.0
v26.13.0
v26.12.0
v26.11.0
v26.10.0
v26.9.0
v26.8.0
v26.7.0
blazor-final
v26.6.0
v26.5.0
v26.4.0
v26.3.1
v26.3.0
v26.2.0
v26.1.1
v26.1.0
v25.9.0
v25.8.0
v25.7.1
v25.7.0
v25.6.0
v25.5.0
v25.4.0
v25.3.1
v25.3.0
v25.2.0
v25.1.0
v0.8.8-beta
v0.8.7-beta
v0.8.6-beta
v0.8.5-beta
v0.8.4-beta
v0.8.3-beta
v0.8.2-beta
v0.8.1-beta
v0.8.0-beta
v0.7.9-beta
v0.7.8-beta
v0.7.7-beta
v0.7.6-beta
v0.7.5-beta
v0.7.4-beta
v0.7.3-beta
v0.7.2-beta
v0.7.1-beta
v0.7.0-beta
v0.6.9-beta
v0.6.8-beta
v0.6.7-beta
v0.6.6-beta
v0.6.5-beta
v0.6.4-beta
v0.6.3-beta
v0.6.2-beta
v0.6.1-beta
v0.6.0-beta
v0.5.8-beta
v0.5.7-beta
v0.5.6-beta
v0.5.5-beta
v0.5.4-beta
v0.5.3-beta
v0.5.2-beta
v0.5.1-beta
v0.5.0-beta
v0.4.5-alpha
v0.4.4-alpha
v0.4.3-alpha
v0.4.2-alpha
v0.4.1-alpha
v0.4.0-alpha
v0.3.8-alpha
v0.3.7-alpha
develop
v0.3.6-alpha
v0.3.5-alpha
v0.3.4-alpha
v0.3.3-alpha
v0.3.2-alpha
v0.3.1-alpha
v0.3.0-alpha
v0.2.5-alpha
v0.2.4-alpha
v0.2.3-alpha
v0.2.2-alpha
v0.2.1-alpha
v0.2.0-alpha
v0.1.5-alpha
v0.1.4-alpha
v0.1.3-alpha
v0.1.2-alpha
v0.1.1-alpha
v0.1.0-alpha
v0.0.62-alpha
v0.0.61-alpha
v0.0.60-alpha
v0.0.59-alpha
v0.0.58-alpha
v0.0.57-alpha
v0.0.56-alpha
v0.0.55-alpha
v0.0.54-alpha
v0.0.53-alpha
v0.0.52-alpha
v0.0.51-alpha
v0.0.50-alpha
v0.0.49-prealpha
v0.0.48-prealpha
v0.0.47-prealpha
v0.0.46-prealpha
v0.0.45-prealpha
v0.0.44-prealpha
v0.0.43-prealpha
v0.0.42-prealpha
v0.0.41-prealpha
v0.0.40-prealpha
v0.0.39-prealpha
v0.0.38-prealpha
v0.0.37-prealpha
v0.0.36-prealpha
v0.0.35-prealpha
v0.0.34-prealpha
v0.0.33-prealpha
v0.0.32-prealpha
v0.0.31-prealpha
v0.0.30-prealpha
v0.0.29-prealpha
v0.0.28-prealpha
v0.0.27-prealpha
v0.0.26-prealpha
v0.0.25-prealpha
v0.0.24-prealpha
v0.0.23-prealpha
v0.0.22-prealpha
v0.0.21-prealpha
v0.0.20-prealpha
v0.0.19-prealpha
v0.0.18-prealpha
v0.0.17-prealpha
v0.0.16-prealpha
v0.0.15-prealpha
v0.0.14-prealpha
v0.0.13-prealpha
v0.0.12-prealpha
v0.0.11-prealpha
v0.0.10-prealpha
v0.0.9-prealpha
v0.0.8-prealpha
v0.0.7-prealpha
v0.0.6-prealpha
v0.0.5-prealpha
v0.0.4-prealpha
v0.0.3-prealpha
v0.0.2-prealpha
v0.0.1-prealpha
Labels
Clear labels
ad-hoc
api
bug
ci-cd
content
dependencies
enhancement
frontend
in-progress
jellyfin
parked
priority: high
priority: low
priority: medium
review
security
One-off / ad-hoc work not tracked by a dedicated issue
REST API / HTTP endpoints
Something isn't working
Build, test, deploy pipeline
Channel content / schedules / playlists
Dependency updates (Renovate)
New feature or improvement
ChicoryTV React SPA frontend
Claimed by an active session — do not pick up
Jellyfin tuner / IPTV integration
Excluded from automatic queue pickup; work only when explicitly selected
Adversarial review finding
Security / vulnerability fix
No labels
priority: high
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: timothy/ersatztv#935
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
script-tests(.gitea/workflows/pr-checks.yml) runsscripts/jq-preflight.sh --expect 1.6. Since 2026-10-28 it fails on every runner that has picked up the job:jq-1.7.jq-1.7 (parsed 1.7; floor 1.6).Every other job on those PRs is green. The cause is a newer
docker.gitea.com/runner-images:ubuntu-latestimage cached on the runners. bumblebee was rebooted on 2026-10-28 and its host jq was already 1.7.1. Runner images are not something this repo controls (server-management).The tripwire did what it was built for: the 1.6 coverage the suite assumed is gone, and a person has to decide what replaces it. Because the merge hook reads COMBINED status, this advisory red blocks the auto-grant on every PR, so every PR is now stuck.
Decision (owner, 2026-10-28): re-pin to what the fleet ships. Since the fleet is mixed (server-management#1080), accept {1.6, 1.7} until #1080 settles one version; see the comment below.
Scope
--expectinpr-checks.ymlto the measured fleet version.ci.jq-version-contract. Wherever they say "the CI runner ships jq 1.6", state the invariant with a date instead. Decide, with evidence, whether the 1.6 FLOOR stays (a gate still authored to the 1.6 subset is harmless) or rises. Say what 1.6 coverage is lost now that no runner ships it.scripts/jq-preflight.shheader comments name 1.6 as the runner version; correct them.docs/decisions/records/ci/and archive its predecessor (lifecycle). Regenerate the catalog.Done-when
script-tests' jq preflight accepts exactly {1.6, 1.7} until server-management#1080 pins the fleet: green on whichever runner takes the job (cite the job log), with a witnessed red for a version outside the setClaiming #935: branch 935-jq-repin-17, worktree /Users/timothy/orca/workspaces/ersatztv/wt-935 (no open PR, no remote branch, no prior claim found).
Scope change (2026-10-29, from server-management, refs server-management#1080): the runner fleet's jq version is not settled yet. Both
smallrunners map to the floatingrunner-images:ubuntu-latestimage with no digest pin, so each host keeps whatever image it last pulled. A digest pin across the fleet is proposed in #1080 but not decided.So do not pin to 1.7 alone. Until #1080 lands, the tripwire must accept exactly the set {1.6, 1.7}. Any other version must still fail loudly, and that needs a witnessed red. The docs and the record must name #1080 as the event that narrows the set back to one version. The first Done-when box therefore reads: "passes on whichever runner takes the job, while still failing on a version outside {1.6, 1.7}".
Closing record
Outcome: PR http://192.168.1.95:3000/timothy/ersatztv/pulls/938 (head
403bf011c): the script-tests jq preflight accepts exactly {1.6, 1.7} until server-management#1080 pins the runner fleet. Issue left open pending merge.Root cause: the preflight pinned a single version (1.6) while the runner hosts shipped jq 1.7 (both hosts measured 1.7 on 2026-10-28); the tripwire fired on a healthy fleet and its advisory red blocked the merge-hook auto-grant on every PR.
Decisions/conventions changed: added
ci.jq-accepted-version-set; archivedci.jq-version-contract; catalog regenerated.Reusable knowledge: runner image jq version is not controlled by this repo; the contract is stated as a dated invariant naming server-management#1080. review-verdict.yml stays floor-only.
Verification: full scripts/tests 1615 passed, 3 skipped (orchestrator,
403bf011c); jq/pr-changed-files tests 353 passed; ruff, bash -n, check-doc-narrative (0 warnings), catalog regen (no diff) clean. Own-PR CI pending. Review round 1 clean (9 nits); codex could not run, cold same-family agent substituted.Deferred: none (nits carry no issue).
Docs updated: docs/ci-cd.md, docs/decisions/ (new record, archived predecessor, catalog), docs/defect-shapes-773.md, record cross-refs.
Done-when evidence
PYTHONPATH=. python3 -m pytest scripts/tests/test_jq_preflight.py(out-of-set red cases); thescript-testsjob in this PR's own CI run on PR #938.git diff origin/main...HEAD -- docs scripts/jq-preflight.sh; docs/decisions/records/ci/jq-accepted-version-set.md;python3 scripts/check-doc-narrative.py --diff origin/main.scripts/post-review-verdict.sh 938to be posted by the orchestrator.