Skip to content

fix(ci): the install-register classifier and its enumeration cover npm publish - #522

Merged
KnockOutEZ merged 2 commits into
studio-handoff-corefrom
sd-195-fix-ci-the-npm-publish-step-s-pr
Aug 29, 2026
Merged

fix(ci): the install-register classifier and its enumeration cover npm publish#522
KnockOutEZ merged 2 commits into
studio-handoff-corefrom
sd-195-fix-ci-the-npm-publish-step-s-pr

Conversation

@KnockOutEZ

Copy link
Copy Markdown
Owner

Closes KnockOutEZ/wigolo-studio-run#195 (PX0 exit-9, SEC MED).

npm publish packs, and packing fires the root prepare hook — so release.yml's
publish step is a root prepare-firing step, and its WIGOLO_SKIP_PREPARE: '1' is what
makes the shipped tarball contain the dist/ every gate validated instead of a rebuild
produced at publish time (#171). The install register's classifier in
tests/unit/prepare-build.test.ts enumerated install verbs (ci|pack|install|i), so
that step never entered affected() and never appeared in the expected-affected list.

The issue's stated failure mode does not reproduce on tip d19c4271. Deleting the
env line already reds one arm: the pack/publish register added by 44b17e6f
(2026-08-28) classifies npm publish and names the step. Measured below rather than
argued. What was real is narrower and still worth closing: the install sweep's
expected-affected list is the enumeration a reader takes as every root step that fires
the hook
, and it said the publish path was exempt — so a tidy-up deleting the
pack/publish block as "a duplicate of the sweep above" would have left the publish path
with no arm at all.

Mutation table — env block × guard verdict, before and after

Subject: release.yml / release / Publish wigolo (npm), WIGOLO_SKIP_PREPARE: '1'
deleted then restored by reverse-edit (never git checkout). Command:
npx vitest run tests/unit/prepare-build.test.ts, exit code read directly, never
through a pipe.

Condition Install register — fires on exactly these steps Install register — every one of them suppresses the hook Publish register — the shipped dist/ is the validated one New arm — synthetic un-suppressed publish Suite
BEFORE · env present green, publish step absent from the set green — step invisible, never examined green RED — classifier returns [] 1 failed | 28 passed (29)
BEFORE · env deleted green — still invisible green — the blind arm RED, names the step RED 1 failed | 27 passed (28)¹
AFTER · env present green, publish step in the set green green green 29 passed (29)
AFTER · env deleted green RED, names the step RED, names the step green 2 failed | 27 passed (29)

¹ measured on tip before the new arm existed, hence 28 tests.

Both post-fix failures print the same name:

+   "release.yml / release / Publish wigolo (npm)",

Red-first

a9111be5 (arm) is the direct parent of 7f87cc3e (fix). Against the tip classifier the
new arm reds with AssertionError: expected [] to deeply equal [ …(2) ] — an
un-suppressed root npm publish planted in a scratch workflow is classified as not
prepare-firing, so the sweep reports nothing at all.

The arm is an outside signal by construction: every other arm in that block can only
agree with the workflows that happen to exist, and a shape the classifier cannot see is a
shape no real workflow can red it with. So it plants the shape — an unguarded root
publish, a guarded root publish, and a sub-package publish with its own
working-directory — in a workflow directory under $TMPDIR, and runs the real
parser and the real classifier over it. steps() gained a directory parameter for
exactly this and nothing else; its default is unchanged.

Also

  • Both registers now classify npm publish, by design, and neither block alone is
    load-bearing. The pack/publish block keeps the two arms that exist only there — a
    sub-package publish is a different root, and the explicit root build the opt-out
    depends on still precedes the publish. Recorded as A-195-1 with its reversal
    condition (the registers' verdicts diverging for one step).
  • The pack/publish block's comment claimed npm publish is "the one shape the install
    register's alternation cannot see". True when written, false after this commit, so it
    is corrected in the same commit.

Non-goals held

No change to the publish flow or to any workflow — .github/workflows/release.yml is
byte-identical to tip (read-only reference; the mutations were applied and reversed). No
new gates. The install|i end-of-line anchoring blindness stays in its two existing
known-issues.md rows.

Verification

  • npm run build — exit 0
  • npm test12091 passed | 20 skipped | 7 todo (12118), 955 files passed / 5 skipped, zero
    ×, exit 0. The suite is 12090 → 12091, exactly the one new arm.
  • npx tsc --noEmit — exit 0
  • npm run gate:studio — exit 0 (tests/ type-check debt holds at baseline 363)

CI deferred — quota (CEO 2026-08-28); merged on local green.

…ressed root npm publish

Red against the tip classifier: its alternation enumerates install verbs, so a
planted un-suppressed `npm publish` at the repo root is classified as not
prepare-firing and the sweep reports an empty set. The arm plants the shape in a
scratch workflow directory under $TMPDIR and runs the real parser over it,
because every other arm in this block can only agree with the workflows that
already exist.
…m publish

`npm publish` packs, and packing fires the root `prepare` hook, so the release
publish step is a root prepare-firing step — but the sweep's alternation listed
only install verbs, so the step never entered the affected set and the list a
reader takes as "every root step that fires the hook" omitted it.

Adds `publish` to the alternation and the release publish step to the expected
set. Deleting its `WIGOLO_SKIP_PREPARE` now reds two arms naming the step
instead of one, and the enumeration no longer implies the publish path is
exempt. Corrects the pack/publish block's claim that the install sweep cannot
see the shape. No change to the workflow.
@coderabbitai

coderabbitai Bot commented Aug 29, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 21365650-b807-41b8-840c-efe464b82a9a

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@KnockOutEZ
KnockOutEZ merged commit 019f160 into studio-handoff-core Aug 29, 2026
20 checks passed
@KnockOutEZ
KnockOutEZ deleted the sd-195-fix-ci-the-npm-publish-step-s-pr branch August 29, 2026 06:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant