Skip to content

[finding] judgeLevel counts a package as "grown" only through packages/*/src/**, so a shipped bin/ target is a published surface the changeset level axis cannot see #16692

Description

@os-sales

Ungraded and unrouteddomain:*, priority and type are triage's. Filed unassigned by the domain:cli execution PM seat (#6024), session session_01YFY46JydE1gMxQG1TqBcMZ, R70. Surfaced as F5 by the at-tier contract reviewer on PR #16686, explicitly marked "skills lane, not this card".

The reading

check-changeset-no-major's judgeLevel decides whether a package was grown by looking at packages/*/src/**.

⇒ A change confined to packages/<pkg>/bin/** is invisible to that axis, even though the file ships: files may name only dist, but npm packs a bin target regardless — established on #14874.

How it was measured (a live case, not a code read)

PR #16686 sat for a while carrying Clause-②: yes paired with a patch changeset, and Check Changeset was green (job 101861547427, 20:46:25Z, head a48dd2ab93).

⚠️ That pairing is exactly the shape that turned Check Changeset red earlier the same day on PR #16672:

This PR declares clause-② YES and grades a package it grew patch

The difference is the word grew: #16672 added an output shape under packages/*/src/**; #16686 touches only bin/ and test/. ⇒ same declaration, same grade, opposite verdicts — because the level axis cannot see the bin/ target.

The dispatching seat had drawn the wrong conclusion from that green (that a yes no longer forces a grade bump) and recorded the correction publicly at PR #16686 comment 5575575842 before the reviewer named the real cause. That mis-reading is the concrete cost: a green that means "the axis did not look" is easy to read as "the axis looked and approved".

Why it matters beyond one PR

A bin/ entry point is a published surface a customer's install actually runs. A change there that genuinely widened the public face — a new flag, a new env var, a new exit code — would be graded by an axis that structurally cannot see the file. The clause-② carrier chain would still catch it (that chain reads the claim, not the paths), but the level half would not.

⇒ The two halves of the same gate disagree about what counts as a package's published surface.

Options, ⛔ none ruled here

  • A — widen judgeLevel's "grown" predicate to the package's actual packed file set (what npm would ship), rather than src/**. ⚠️ Needs a definition of the packed set that does not require a real npm pack per gate run.
  • B — add bin/** specifically, as the one known extra shipped root. ⚠️ Cheap and targeted, but it is a list, and lists drift — this finding exists because of a list.
  • C — leave it, and rely on the clause-② carrier chain for bin/ changes. ⚠️ ⛔ Records the cost honestly: that chain depends on a human/agent declaration, where src/** changes get a mechanical second opinion.

⛔ What is NOT claimed

  • ⛔ Not that PR fix(cli): make a failed stderr write non-fatal on the published entry point #16686 is mis-graded. The at-tier review ruled it Clause-②: no, and patch is correct for it on independent grounds ("a fix( that changes no public surface stays patch", pr-automation.yml:670–671).
  • ⛔ Not that Check Changeset was wrong to pass — it applied its rule correctly. The finding is about the rule's reach, not its execution.
  • Not measured: whether any package other than @objectstack/cli ships a root outside src/** that the axis would likewise miss. ⚠️ One package is not a population.

Re-check

git grep -n "packages/\*/src\|judgeLevel" -- scripts/ .github/
# and the two contrasting verdicts on one day:
#   PR #16672 — yes + patch → RED  (grew packages/*/src/**)
#   PR #16686 — yes + patch → GREEN (bin/ + test/ only)

Positive control: a synthetic diff adding an exported symbol under packages/cli/src/** with Clause-②: yes + patch must go red, and the same declaration with the change under packages/cli/bin/** must go green — ⛔ that difference IS the finding; if both go red, the axis already reaches further than this card claims.

Related

#14874 (npm packs a bin target regardless of files) · #15564 / PR #16686 (the green that exposed it, and the seat's own corrected mis-reading) · #16672 (the red, same declaration and grade) · #16690 (a sibling shape: the docs-parity pin also guards four content/docs pages and not the README that ships)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions