on
CC-BY-NC-SA-4.0 Apache-2.0
3 mins
π€ This post includes some LLM-derived content π€
Finding missing releaseTimestamps in Renovate

As part of the work we're doing towards the upcoming Renovate 42 to improve minimumReleaseAge support, I thought it would be useful to straightforwardly identify cases where dependencies (or updates to existing dependencies) do not have release timestamps information.
For instance, when we have the Renovate debug logs, I'd like to be able to take the packageFiles with updates debug log line and output:
- do any dependencies not have a release timestamp set (
currentVersionTimestamp)? - do any dependencies have any updates, which do not have a release timestamp (
releaseTimestamp)?
I started writing a jq query, but then decided to outsource it to gpt-oss:20b, and after a few tries, we got this somewhat complex query (which I'm glad I didn't hand-write!):
# co-authored-by: gpt-oss:20b
jq '
{
# -------- missing currentVersionTimestamp ----------
missingCurrentVersionTimestamps: [
.config
| to_entries[] as $ent
| $ent.value[] as $group
| $group.deps[] as $dep
| select($dep.currentVersionTimestamp == null)
| {
manager: $ent.key,
datasource: $dep.datasource,
depName: $dep.depName,
packageFile: $group.packageFile,
registryUrls: (
($dep.registryUrl? | if . != null then [.] else [] end)
+ ($dep.registryUrls // [])
)
}
],
# -------- missing releaseTimestamp in updates ----------
missingReleaseTimestamps: [
.config
| to_entries[] as $ent
| $ent.value[] as $group
| $group.deps[] as $dep
| select(any($dep.updates[]?; .releaseTimestamp == null))
| {
manager: $ent.key,
datasource: $dep.datasource,
depName: $dep.depName,
packageFile: $group.packageFile,
registryUrls: (
($dep.registryUrl? | if . != null then [.] else [] end)
+ ($dep.registryUrls // [])
),
missingUpdates: [
$dep.updates[]?
| select(.releaseTimestamp == null)
| . + {
dependencyCurrentVersionTimestamp: $dep.currentVersionTimestamp,
dependencyDatasource: $dep.datasource
}
]
}
]
}
' debug-log.txt
This query, when run against a single-line file that contains the packageFiles with updates debug log will output i.e.
{
"missingCurrentVersionTimestamps": [
{
"manager": "dockerfile",
"datasource": "docker",
"depName": "ghcr.io/containerbase/devcontainer",
"packageFile": ".devcontainer/Dockerfile",
"registryUrls": [
"https://ghcr.io"
]
},
{
"manager": "renovate-config-presets",
"datasource": null,
"depName": "renovatebot/.github",
"packageFile": "renovate.json",
"registryUrls": []
},
{
"manager": "regex",
"datasource": "docker",
"depName": "ghcr.io/containerbase/sidecar",
"packageFile": "lib/config/options/index.ts",
"registryUrls": [
"https://ghcr.io"
]
}
],
"missingReleaseTimestamps": [
{
"manager": "dockerfile",
"datasource": "docker",
"depName": "ghcr.io/renovatebot/base-image",
"packageFile": "tools/docker/Dockerfile",
"registryUrls": [
"https://ghcr.io"
],
"missingUpdates": [
{
"bucket": "major",
"newVersion": "11.40.5",
"newValue": "11.40.5",
"newMajor": 11,
"newMinor": 40,
"newPatch": 5,
"updateType": "major",
"isBreaking": true,
"newDigest": "sha256:81bbc8c8c561f6c4c2d059a5bcdfc95ef837682a41ac45bfbc1380d8d07dc941",
"branchName": "renovate/main-ghcr.io-renovatebot-base-image-11.x",
"dependencyCurrentVersionTimestamp": null,
"dependencyDatasource": "docker"
}
]
},
{
"manager": "dockerfile",
"datasource": "docker",
"depName": "ghcr.io/renovatebot/base-image",
"packageFile": "tools/docker/Dockerfile",
"registryUrls": [
"https://ghcr.io"
],
"missingUpdates": [
{
"bucket": "major",
"newVersion": "11.40.5",
"newValue": "11.40.5-full",
"newMajor": 11,
"newMinor": 40,
"newPatch": 5,
"updateType": "major",
"isBreaking": true,
"newDigest": "sha256:824737973a79d8c280f8ab1928017780fb936396dc83075a4f7770610eda37bd",
"branchName": "renovate/main-ghcr.io-renovatebot-base-image-11.x",
"dependencyCurrentVersionTimestamp": null,
"dependencyDatasource": "docker"
}
]
},
{
"manager": "dockerfile",
"datasource": "docker",
"depName": "ghcr.io/renovatebot/base-image",
"packageFile": "tools/docker/Dockerfile",
"registryUrls": [
"https://ghcr.io"
],
"missingUpdates": [
{
"bucket": "major",
"newVersion": "11.40.5",
"newValue": "11.40.5",
"newMajor": 11,
"newMinor": 40,
"newPatch": 5,
"updateType": "major",
"isBreaking": true,
"newDigest": "sha256:81bbc8c8c561f6c4c2d059a5bcdfc95ef837682a41ac45bfbc1380d8d07dc941",
"branchName": "renovate/main-ghcr.io-renovatebot-base-image-11.x",
"dependencyCurrentVersionTimestamp": null,
"dependencyDatasource": "docker"
}
]
}
]
}
From here, you can now identify if there are any dependencies, or updates, which should have release timestamps, but do not.
Note that if you're using renovate-graph, you will need to replace .config with .packageData.