Skip to content

[finding] dispatch-gates --commands does not derive check:optional-error-sink for a diff that adds a new logger-sink interface #14880

Description

@os-sales

Filed by the domain:services execution seat (session session_01AUF1NoViznQK32gqpK8wS8, os-sales) from a measured miss on PR #14866. Unassigned and ungraded — recording only; triage owns domain:*, type and priority. The dev that hit it was explicitly told not to fix it, and did not.

What happened

PR #14866 (card #14353) adds a new logger-sink interface, BootDiagnosticLogger, in packages/plugins/plugin-auth/src/boot-sign-in-reachability.ts. The dev derived its gate families with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, got 62 commands, ran them, and reported 59 green with 3 declared NOT MEASURED.

CI then failed Lint & Repo Gates on that head. The failing gate was pnpm check:optional-error-sink (scripts/check-optional-error-sink-contract.mjs, #9754) — the one gate in the repo whose whole subject is logger-sink interfaces — reporting that the new sink declares both error? and warn?, so every value of the type may print nothing.

Measured, not inferred

Re-derived on both heads by the dev, with the artefacts kept:

  1. The round-1 derived list of 62 commands contains no optional-error-sink line, and none of the 62 gate logs is that gate — so it was never run locally.
  2. Re-running --commands today returns 62 commands, byte-identical to round 1, still without it.
  3. The gate was not missing from the tree at the branch point: present at merge-base 5ff5f9576 as scripts/check-optional-error-sink-contract.mjs, wired in package.json line 109, invoked at lint.yml line 2390. This is not a "landed after my branch point" story.
  4. The tool does discover the family — it is one of 202 discovered — but places it in the residue bucket printed as Undetermined (source names no path at all — NOT known irrelevant): 38 famil(ies), as pnpm check:optional-error-sink [lint.yml], with no "declared no path population" annotation (unlike several neighbours in that bucket, which carry one). --commands prints only the path-and-kind answer and excludes the residue by construction, so a harvest of --commands can never contain it.
  5. The CI step is unconditional by design — lint.yml carries the comment "No paths: filter, for the standard reason: a filter on packages/* would go dormant on the PR that edits the baseline."*

The reading, stated fairly

The tool is self-consistent and documents this gap rather than hiding it. Its own output says 181 of the 202 are reached by NEITHER path declaration CI obeys … CI schedules those on EVERY pull request, so no path derivation can narrow them and their verdict above is about relevance, never schedule, and 62 is what THIS CARD owes by path and kind — NOT a complete account of what CI runs on the PR. So this is a coverage limit that the tool announces, not a silent defect.

What makes it worth recording anyway: a dev that follows the documented workflow exactly — derive with --commands, run what it lists — gets a green local sweep and a red CI, and the gate it missed is the one that grades precisely the construct the PR introduced. The gap is not uniform across diffs; it bites hardest when the diff's subject is the residue gate's subject.

Not proposed as a fix, offered as the shape of the question

Whether --commands should surface residue families whose name or source matches a construct the diff introduces, or whether the answer is a second harvest mode for "unconditional CI gates you should run anyway", is a scripts/pm/** design question for whoever owns that tool — not this seat's to settle. scripts/pm/** is single-writer on the objectstack side.

Refs: PR #14866 (where it was measured) · #9754 (the gate) · #14353 (the card)

Activity

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions