Unverifiable¶
Where these rules come from and what a finding means: Rule Nature.
W rules report what the analysis could not check.
Every other rule says "this recipe does something". A W finding says "this analysis could not verify something", attached to the line it applies to. It is the same statement as a coverage gap, moved from the run to the line.
This is a reference page. For how weight and scope work, see Rule System.
Reading a W finding¶
- It never changes the score, the risk band, or the flagged decision.
- It is always shown, unlike other weight-0 findings, because a statement whose only value is to a reader is worthless if filtered.
- It is not evidence of wrongdoing and must not be reported as such.
Why W rules carry no weight¶
The behaviour they describe is what packaging is. A recipe that unpacks a declared, checksummed archive and runs something from inside it is following the format. The checksum proves the bytes arrived unaltered; it says nothing about what they do.
Pricing that would put a finding on a large share of the ecosystem and make the number mean less, which is what B10 prevents: a gap must not add points. Silence is the other option, and silence is what the boundary documentation had to describe as something TrustSight cannot see.
A W finding tells a reader something specific: this line runs that file, and nobody - not the checksum, not this tool - has read it.
Where the scored counterpart lives¶
Some W surfaces have a subset narrow enough to score. Those are separate rules, because a W is weight-0 by construction:
| W rule | Scored counterpart |
|---|---|
| W001 executes unread code | H094, the same act during package() |
| W004 unread manifest | X020, the recipe writing one |
| W006 unread generated config | X022, the same config handed to a tool |
Rules on this page¶
| Rule | Name | Severity |
|---|---|---|
| W001 | Executes Code This Analysis Did Not Read | - |
| W002 | Build Resolves Dependencies From A Registry | - |
| W003 | Applies A Patch This Analysis Did Not Read | - |
| W004 | Build Engine Runs A Manifest This Analysis Did Not Read | - |
| W005 | Build Runs A Target Whose Recipe Was Not Read | - |
| W006 | Generated File Names A Build-Only Path | - |
| W007 | Dependency Novelty Declined For Insufficient Observations | - |
| W008 | Unresolved Construct In A Recipe | - |
| W009 | Upstream Manifests Not Examined | - |
| W010 | Alert Volume Capped | - |
| W011 | Upstream Content Not Read | - |
| W012 | Federation Not Consulted | - |
W001: Executes Code This Analysis Did Not Read¶
INFO (weight 0) · category unverifiable
Fires when a build function runs a script - through an interpreter, or as
./name - whose path is neither declared in source=() nor committed to the
repository.
| Fires | Quiet |
|---|---|
bash "$srcdir/scripts/postunpack.sh" |
bash setup.sh when setup.sh is declared |
./install.sh |
./configure --prefix=/usr |
python3 "$srcdir/x-1.0/gen.py" |
python3 setup.py build |
chroot "$srcdir/root" /bin/sh /x.sh |
/bin/sh /usr/share/p/helper.sh |
xterm -e "bash $PWD/x.sh" |
make |
H083 claims the case where the executed file is a declared source, and H081 where it is committed. What is left is code that runs and that nobody looked at.
Two shapes qualify and no third: an interpreter naming a file, and a ./
invocation. A bare path-shaped word at a command position is not one - that
reading matched the MIME type in x-scheme-handler/orcaslicer and the
usr/bin/env of a shebang line.
The standard entry points of an unpacked tree are excluded: configure,
setup.py, Makefile.PL, autogen.sh, gradlew.
A sandbox wrapper establishes a new root, so an absolute path after chroot
or systemd-nspawn is tree content rather than a system file.
Fires on 0.08% of the benign corpus.
W002: Build Resolves Dependencies From A Registry¶
INFO (weight 0) · category unverifiable
Fires on a build step that resolves packages from a language registry:
npm install, pip install -r, cargo fetch, go mod download and
siblings.
The recipe names a set of packages and a registry decides which bytes satisfy it, at build time, after review. No checksum in the recipe covers them, and the resolved versions are not in the analysed text.
The run already says this once, as the unpinned_build_deps coverage gap.
What a gap cannot say is where.
Fires on 0.29% of the benign corpus.
W003: Applies A Patch This Analysis Did Not Read¶
INFO (weight 0) · category unverifiable
Fires on patch or git apply naming a .patch/.diff that is not
committed to the repository.
A patch edits the source before it is built, and the edit is whatever the patch says. A committed patch is one H090 reads; a declared remote one sits behind a checksum this tool never downloads.
A tarball is upstream's own code. A patch is a change to it that the packager chose, which makes it more interesting to a reader, not less.
Fires on 2.11% of the benign corpus - the highest rate in the series, and the correct answer rather than a tuning problem.
W004: Build Engine Runs A Manifest This Analysis Did Not Read¶
INFO (weight 0) · category unverifiable
Fires when make, ninja, bazel, scons or a sibling is given an
explicit manifest argument that is neither declared nor committed.
| Fires | Quiet |
|---|---|
ninja -f "$srcdir/gen.ninja" |
ninja -C build |
make -f "$srcdir/build.mk" all |
make -f setup.mk when declared (H083) |
Anchored on an explicit -f/--file. A bare make also runs a manifest
nobody read, and that is most of the ecosystem; reporting it would say
nothing. Naming a particular file is a choice.
Zero occurrences in the benign corpus.
W005: Build Runs A Target Whose Recipe Was Not Read¶
INFO (weight 0) · category unverifiable
Fires when make or ninja is given a non-standard target and no Makefile
is committed.
| Fires | Quiet |
|---|---|
make all dist-hooks |
make install |
make stage1 |
make -j$(nproc) all |
make DESTDIR="$pkgdir" install |
make install is a contract every build system honours. make dist-hooks
names a recipe that exists only in this project's Makefile, and that Makefile
arrived inside a tarball this analysis never opened.
Flags and variable assignments are not targets.
Fires on 0.29% of the benign corpus.
W006: Generated File Names A Build-Only Path¶
INFO (weight 0) · category unverifiable
Fires when a printf/echo/cat/tee writes a file outside $pkgdir
whose content names $srcdir, $startdir, $PWD or $BUILDDIR in a field
that is not merely descriptive.
X022 claims this when the recipe goes on to hand the
file to a tool. Without that second line there is no evidence anything reads
it: the file may be a build input, a generated .pc, a note.
Two exclusions: >&2 is a file descriptor rather than a file, and
cat "$srcdir/a" | tee b copies a file, where the build path names what to
read rather than content the recipe authored.
The descriptive test reads the written text, not the shell line, because
printf "Comment=built in $srcdir" > f starts with printf.
Zero occurrences in the benign corpus.
W007: Dependency Novelty Declined For Insufficient Observations¶
INFO (weight 0) · category unverifiable
Fires when D001/D002 would have judged an added dependency but abstained because the dependency corpus holds no observations. Without the corpus guard every name looks novel and D001 fires on every package a fresh install sees, so the rules stand down - and the stand-down is reported rather than left as silence.
Names the abstaining rules and the observation count. It never changes the score; it is the same honesty contract as a coverage gap, moved to the rules that declined.
W008: Unresolved Construct In A Recipe¶
INFO (weight 0) · category unverifiable
Fires when the tokenizer could not resolve one or more assignments in the
recipe (a computed source=(), a build-time value). An unresolved construct
is an analysis boundary: the reader is told what the analysis could not
resolve. It is the W-series face of the same fact the refusal rules X026
(X026 fires on an unresolved construct referenced from an executable
function, scored) report as a suspicion - X026 and X027 may fire on the
same diff, weight-0 vs scored.
Names the unresolved assignments (capped). It never changes the score.
W009: Upstream Manifests Not Examined¶
INFO (weight 0) · category unverifiable
Fires when a committed dependency manifest could not be parsed (malformed, or over the byte cap), or when the recipe declares a source archive whose listing contains a known manifest filename. The second shape is a standing boundary, not a per-diff gap: the analysis never fetches and never extracts (A2, A8), so the manifests inside an upstream archive are outside what any run can read by design.
It forbids nothing by itself and never changes the score. It exists so a
quiet result never implies "dependency surface reviewed": the layer's edge
is part of the output. Absence of even the archive listing (the cgit
fallback) is reported separately as tree_not_analyzed.
W010: Alert Volume Capped¶
INFO (weight 0) · category unverifiable
Fires when a run produces more findings than [alerts] max_rendered_findings
(default 50) and the terminal therefore groups the remainder. The per-band
counts travel with it, so grouping is reported rather than silent; the JSON
report is never filtered and carries every finding.
It exists so a campaign that raises the noise floor cannot train a reviewer
to skim unnoticed: the boundary names the saturation the way a coverage gap
names a missing read. Unlike a gap, nothing was left unexamined, so it never
forbids a clean verdict (forbids_clean is false) and never changes the
score. Volume is a statement about the run, not about any single package.
W011: Upstream Content Not Read¶
INFO (weight 0) · category unverifiable
Fires when the recipe declares a forge upstream (a git url=) whose content
the analysis did not read. A2 forbids fetching a declared URL, so the
U-series extension reads only what the recipe says about upstream, never the
archive or workflow behind it. This is the standing boundary of that reach:
reported once per report, shown even when nothing else fires.
Unlike a coverage gap, nothing was left unexamined by a failure; the model
itself never reads upstream, so it never forbids a clean verdict
(forbids_clean is false) and never changes the score.
When the recipe declares no forge upstream there is nothing to read and it does not fire. See W012 for the case where the channel that could stand in is cold.
Measured on the locked benign corpus: 1,940/3,739 (51.9%). That rate is the
standing boundary made visible: it fires wherever a benign update's diff
reaches the declared url=, which is common, so the reader meets the limit
on most reports rather than only when an upstream changed. The finding is
weight 0, so the breadth is a statement about the analysis, not about any
package.
W012: Federation Not Consulted¶
INFO (weight 0) · category unverifiable
Fires when a forge upstream is declared and the upstream_repo federation
channel is cold: the IOC baseline is disabled, or the store carries no
upstream_repo entries, or it cannot be reached. U007 and U008 are
federation-fed, so a cold channel is exactly the case where no finding can
be produced; not because the upstream was clean, but because nothing could
be consulted.
A consulted channel that simply holds no entry for the declared repo is a miss, not an unavailable channel, and does not fire this rule.
Weight 0, reported once, never forbids a clean verdict (forbids_clean is
false).
Measured on the locked benign corpus: 1,940/3,739 (51.9%), identical to
W011 because the shipped channel carries no upstream_repo entries, so
every declared upstream is cold. A populated federation channel lowers this
rate: a consulted channel that misses returns to W011 alone.