E: Unable to correct problems, you have held broken packages. is the last line, not the cause. The cause is the Depends: line just above it under The following packages have unmet dependencies:. In the test it said a local package wanted jq (>= 99), a version the configured feeds did not have (apt-cache madison jq listed only 1.7.1 builds); relaxing that dependency to one the feed offers made the install work.

Compare the version in the Depends: line with what apt-cache policy offers, then change whichever side is wrong: the package's requirement, or the feeds you have configured.

The error

$ cd /tmp && apt-get install -y ./fix10-held_1.0_all.deb
Reading package lists...
Building dependency tree...
Reading state information...
Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 fix10-held : Depends: jq (>= 99) but it is not going to be installed
E: Unable to correct problems, you have held broken packages.
exit code: 100

Why it happens

The package's control file asked for Depends: jq (>= 99). The feeds had one candidate for jq:

$ apt-cache policy jq | head -3
jq:
  Installed: (none)
  Candidate: 1.7.1-3ubuntu0.24.04.2
exit code: 0

1.7.1 does not satisfy >= 99, so apt found no set of packages that works and gave up with exit code 100 before downloading anything. Despite the wording, nothing was on hold in this container: apt-mark showhold printed nothing. The useful text is the Depends: line, which names the package that asks (fix10-held), the dependency (jq (>= 99)) and what apt could not do with it.

The same final line appeared in another test when an older curl was pinned by version: there the Depends: line read curl : Depends: libcurl4t64 (= 8.5.0-2ubuntu10) but 8.5.0-2ubuntu10.16 is to be installed, which says curl wanted libcurl4t64 at exactly 8.5.0-2ubuntu10 while apt was going to install 8.5.0-2ubuntu10.16. That case is in the post on E: Version was not found.

The fix

$ cat /tmp/pkg/fix10-held-1.1/DEBIAN/control
Package: fix10-held
Version: 1.1
Architecture: all
Maintainer: David Chen <david@example.test>
Depends: jq (>= 1.7)
Description: test package for a fixes post
exit code: 0
$ cd /tmp && apt-get install -y ./fix10-held_1.1_all.deb > /tmp/q1.log 2>&1; echo "install exit: $?"; grep -E "^(The following|  |Setting up (jq|fix10))" /tmp/q1.log
install exit: 0
The following additional packages will be installed:
  jq libjq1 libonig5
The following NEW packages will be installed:
  fix10-held jq libjq1 libonig5
Setting up jq (1.7.1-3ubuntu0.24.04.2) ...
Setting up fix10-held (1.1) ...
exit code: 0

Version 1.1 of the package asks for jq (>= 1.7), which the candidate satisfies, so apt pulled in jq and its two libraries and set everything up. Here the package was mine to rebuild; for a package from someone else, the test shows where the mismatch is, and the change has to come from a build or a feed that agrees with your Ubuntu release.

How it was reproduced

The capture was made in an ubuntu:24.04 container (Ubuntu 24.04.5 LTS, apt 2.8.3, dpkg 1.22.6) on Docker Engine 29.9.3, standing in for Ubuntu in WSL. As root, two versions of a tiny package were built with dpkg-deb --build, one depending on jq (>= 99) and one on jq (>= 1.7), and each was installed with apt-get install -y ./file.deb.

Frequently asked

How do I fix 'Unable to correct problems, you have held broken packages'?
Read the Depends: line above it. In the test it said fix10-held needed jq (>= 99) while the feed offered 1.7.1; a package version that asked for jq (>= 1.7) installed.
Does 'held broken packages' mean I have packages on hold?
Not in this test. apt-mark showhold printed nothing; the message came from a dependency version that no feed offered.
How do I see which version of a dependency apt can install?
Run apt-cache policy with the package name. In the test it showed Candidate: 1.7.1-3ubuntu0.24.04.2 for jq.

More decoded errors in the Fixes category. If the package is already half installed and apt asks for --fix-broken, see Unmet dependencies, try apt --fix-broken install.