Skip to content

ci: add a verify-pack job that loads every exports target from the tarball - #427

Draft
ianwremmel-ai-agent wants to merge 7 commits into
mainfrom
clc-1135-verify-pack-ci-job
Draft

ci: add a verify-pack job that loads every exports target from the tarball#427
ianwremmel-ai-agent wants to merge 7 commits into
mainfrom
clc-1135-verify-pack-ci-job

Conversation

@ianwremmel-ai-agent

Copy link
Copy Markdown
Collaborator

publint and attw read the exports map statically, so a condition that resolves to a file which is present but does not execute passes both of them. Nothing in this repo loads a packed tarball, so a package can ship an entry point that resolves and still throws for the first consumer who imports it.

This adds scripts/verify-pack.mjs and a verify-pack CI job that runs it. For each of the 32 packages under packages/@code-like-a-carpenter/* it packs the package, extracts the tarball, and out of the extracted directory require()s the require target and import()s the import target of every exports entry. types and bin targets get an existence check.

Loading from the tarball rather than the workspace is the point: a workspace symlink resolves files npm pack may not have included.

Ticket: https://linear.app/code-like-a-carpenter/issue/CLC-1135/add-a-verify-pack-ci-job-that-loads-every-exports-target-from-the

It is red on main today

Two packages already fail, which is the job doing its job:

@code-like-a-carpenter/cli-core
  bin (bin) -> ./cli.mjs: missing from the tarball
@code-like-a-carpenter/cli-plugin-example
  bin (bin) -> ./cli.mjs: missing from the tarball

Neither package has a cli.mjs at all. That is what CLC-1131 fixes, so this cannot go green until CLC-1131 lands.

Scope note

CLC-1135 cites tool-tool's CJS build as the motivating example. This job does not catch it. CLC-1133 records that the module still loads under require() and only a guarded branch is broken, so no load-time check reaches it. This job catches the class of bug one level out: a condition whose file is missing from the tarball, or present and non-loading.

@linear-code

linear-code Bot commented Sep 7, 2026

Copy link
Copy Markdown

CLC-1135

@ianwremmel-ai-agent

ianwremmel-ai-agent commented Sep 7, 2026

Copy link
Copy Markdown
Collaborator Author
  • Survey the 32 packages' exports shapes and the existing CI wiring
  • Write scripts/verify-pack.mjs: stage each package with a synthetic version, npm pack, extract, load every exports target from the extracted directory
  • Wire per-package node_modules so a sibling resolves to its own extracted tarball rather than the workspace source
  • Add the verify-pack job to push.yml and to the release job's needs
  • Verify locally against a built workspace: 30 pass, cli-core and cli-plugin-example fail on a bin that is missing from the tarball
  • Verify the negative case: plant a top-level throw in assert's CJS build and confirm the job fails, and that the failure propagates to every package that depends on it
  • Adversarial review round 1, and act on it: one child process per target with an evaluated-marker, load unconditional and default targets, fail dependents of a package that could not pack, timeouts, concurrency
  • verify-pack confirmed working on CI — same 30 pass / 2 fail as locally
  • Adversarial review round 2 on Codex, triaged; four real findings fixed in 96ccda8
  • Fix the lint failure 96ccda8 introduced — two complexity violations, not Prettier; decomposed in 29b3e9e, behavior held constant by a 968-case differential test
  • Spec-blind Codex pass, plus a re-run of the spec-aware one; triaged in the comment below, four real findings fixed in 8e2d038
  • Triage the CI annotations — 18 of 21 dismissed as unrelated to this diff, rationale recorded against each
  • fix: stop setting bin on packages that have no cli.mjs #435 merges, then rebase this branch onto main to re-run verify-pack
  • Green CI — blocked on fix: stop setting bin on packages that have no cli.mjs #435, see below
  • Copilot review, then operator review

Keep PROGRAM_ENTRY_POINTS as an allowlist for @code-like-a-carpenter/cli — dropped. The evaluated-marker distinguishes "loaded, then exited" from "threw while loading", so the CLI's entry point is really loaded and no allowlist is needed.

Merge order: this needs #435 first. The two verify-pack failures are real defects in cli-core and cli-plugin-example, which set "bin": "./cli.mjs" when no cli.mjs exists. #435 (CLC-1131) removes those fields. Until it lands, this job is correctly red and release will not run. #435 is out of draft, mergeable, and waiting on operator review.

Merging #435 will not re-run this PR's checks on its own — #435 touches only package.json files and cannot conflict with this diff, so the step after it lands is a rebase onto main and a push, which re-runs verify-pack against the fixed manifests.

Annotation triage. Of 21 distinct annotations, 18 are dismissed as unrelated to this diff:

  • Ten ESLint no-explicit-any warnings in logger/src/console-logger.ts, foundation-runtime/src/actions/unmarshall.ts, types/dredd-transactions.d.ts and types/gavel.d.ts. This diff touches only .github/workflows/push.yml and scripts/verify-pack.mjs; both the lint and ESLint checks pass.
  • Four "Node.js 20 is deprecated" runner warnings about actions/setup-node@v4, nrwl/nx-set-shas@v4, check-run-reporter/action@v2.13.1, aws-actions/configure-aws-credentials@v4 and codecov/codecov-action@v3. They fire on every job in every workflow, main included.
  • Four from the repo-wide test failure described below — the five shards' exit code 1, and check-run-reporter's "Could not find any report files matching glob reports/junit/**/*.xml" that follows it.

The three that remain actionable are the verify-pack failure itself: cli-core's and cli-plugin-example's bin -> ./cli.mjs: missing from the tarball, and the job's exit code 1. Those are the defects #435 removes, so they stay open rather than dismissed.

Correction to my earlier note. I had called the test-integration failure a crr-sam bug. It is not. codegen:project-refs writes a truncated root tsconfig.json, so ts-node compiles jest.config.ts without esModuleInterop and jest never starts — TS1259 on node:assert and node:path, TS2732 on ./package.json. Because jest never runs, nothing writes reports/junit/**/*.xml, and check-run-reporter's upload step then errors out, which is the same failure reported a second time rather than a separate one. That is #436 (CLC-1137). All five shards fail this way on main at 3bff384, where this branch's code does not exist, so none of it comes from this change.

Anything a package imports but does not declare falls through to the workspace's own node_modules rather than failing. Making it fail is a one-line change and it does find real bugs — glob is undeclared in tooling-common, tool-foundation, tool-json-schema, tool-stack and tool-tool, and tool-deps gets minimatch@3 from the root hoist instead of the ^9 it asks for. That is tool-deps' remit rather than this job's, so it is out of scope here and worth a ticket.

@nx-cloud

nx-cloud Bot commented Sep 7, 2026

Copy link
Copy Markdown

View your CI Pipeline Execution ↗ for commit 8e2d038

Command Status Duration Result
nx run-many --target build ✅ Succeeded 18s View ↗

💡 Verify your cache is correct by running tasks in a sandbox. Read docs ↗


☁️ Nx Cloud last updated this comment at 2026-09-08 00:08:34 UTC

@codecov

codecov Bot commented Sep 7, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 80.41%. Comparing base (5584eeb) to head (8e2d038).

Additional details and impacted files
@@           Coverage Diff           @@
##             main     #427   +/-   ##
=======================================
  Coverage   80.41%   80.41%           
=======================================
  Files          23       23           
  Lines         730      730           
  Branches      182      182           
=======================================
  Hits          587      587           
  Misses        140      140           
  Partials        3        3           

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@ianwremmel-ai-agent

Copy link
Copy Markdown
Collaborator Author

Review triage, both passes. Acted on in 50cbe7b:

  • A target calling process.exit() while evaluating ended the child and every target behind it was skipped, with the zero exit code read as success. One child per loadable target now, and success is a marker the child writes once the module evaluated, not the exit code. This also removed the need for the PROGRAM_ENTRY_POINTS allowlist, so @code-like-a-carpenter/cli's entry point is now genuinely loaded rather than existence-checked.
  • checkFor degraded any condition that was not literally require/import to an existence check, so a flat {types, default} map or a bare string target got no execution coverage at all. It now picks a loader from the extension and the package's type.
  • A sibling that failed to pack still got a symlink; node walks past a dangling link to the workspace node_modules, where the scope is symlinked back to the unpacked source, and the dependent reported ok having been verified against the source tree. Dependents of a failed package now fail, and a link is only created when its target exists.
  • No timeouts and no kill. A module leaving the event loop alive hung the run — the first CI run already logged Terminate orphan process: pid (2572) (node). Loading now stops the child once the module evaluates, and every spawn has a 60s kill.
  • Subpath patterns reported as unsupported instead of as a missing file; enumerate packages/*/* rather than one scope; skip directories with no manifest; stop dependency resolution at the workspace root; optionalDependencies no longer mandatory; catch link errors; guard the npm pack JSON parse; decode child output per stream; fix a no-op .sort() that left package order filesystem-dependent; move setup inside the try that cleans up; annotate each failing target rather than only the summary.
  • Concurrency: 58s to 9s.

Verified on a synthetic workspace that each of the first three now fails where it previously reported ok, and that a package resolving its sibling from the workspace instead of the tarball is detectable and does fail.

Dismissed, with reasons:

  • Load by specifier rather than by resolved path. Correct in principle — path.resolve accepts targets node's resolver rejects, such as a target missing its ./ prefix. That specific class is what publint --strict checks, and CLC-1134 adds it. Worth revisiting if that ticket changes shape.
  • require() of an ESM file succeeds on Node 22.12+, so the require condition does not prove a CJS build exists. Real, and not something this job can settle without pinning a Node version to assert against. Belongs with CLC-1130.
  • Undeclared dependencies still fall through to the workspace. Deliberate; tool-deps owns dependency declarations. Turning it off finds real bugs — glob is undeclared in five packages and tool-deps gets minimatch@3 from the root hoist rather than the ^9 it asks for — which is worth its own ticket.
  • --ignore-scripts means the tarball under test is not byte-identical to what npm publish would produce. Inert today; no package has a lifecycle script.
  • Drop fetch-depth: 0. It is needed: the shared ./.github/actions/setup runs nrwl/nx-set-shas, which needs history.
  • Fix cli-core and cli-plugin-example here. That is CLC-1131, already in flight; fixing it in this PR would conflict. This PR stays red until it lands, which is the correct merge order.

@ianwremmel-ai-agent

Copy link
Copy Markdown
Collaborator Author

CI status on 50cbe7b. Everything passes except two jobs, and neither is fixable inside this PR.

verify-pack — working as designed. Same result on CI as locally: 30 of 32 pass, and the two failures are the ones the job exists to find.

2 of 32 packages do not load from their tarball: @code-like-a-carpenter/cli-core, @code-like-a-carpenter/cli-plugin-example
  bin (bin) -> ./cli.mjs: missing from the tarball

Neither package has a cli.mjs. CLC-1131 removes those bin fields, so this goes green when that lands. This PR should merge after CLC-1131.

test-integration — pre-existing, unrelated. All five shards fail before any test runs:

./scripts/crr-sam: line 35: testfile: unbound variable

crr-sam builds its command in for testfile in "$@" and then reads $testfile again in the deploy loop below it. With an empty argument list the first loop never runs, testfile is never bound, and set -u kills the script. The argument list is empty because the check-run-reporter split step returned no tests for this branch.

This diff adds one workflow job and one needs entry; it cannot affect which tests that split returns. The last successful test-integration run on any branch I can find is from 2025-11, so this looks like the split data having aged out rather than anything recent.

Two things I deliberately did not do, both needing a call from you:

  1. Guard crr-sam against an empty argument list. It is a one-line fix, but on its own it turns a hard failure into "deploy nothing, test nothing" — the integration suite would silently stop running. The empty split is the real problem.
  2. Work out why the split is empty. That is a check-run-reporter account/data question I cannot see from here.

Happy to take either on as a separate ticket if you want it.

…rball

publint and attw read the exports map statically, so a condition that
resolves to a file which is present but does not execute passes both.
scripts/verify-pack.mjs packs each of the 32 packages under
packages/@code-like-a-carpenter, extracts the tarball, and require()s the
require target and import()s the import target of every exports entry out
of the extracted directory. types and bin targets get an existence check.

Loading from the tarball rather than the workspace is the point: a
workspace symlink resolves files npm pack may not have included, which is
how cli-core and cli-plugin-example came to declare a bin pointing at a
cli.mjs that does not exist.

npm pack needs a version, which these packages do not carry until
multi-semantic-release supplies one at publish time, so each package is
staged outside the workspace with a synthetic version before packing.

Each extracted package gets a node_modules holding its declared
dependencies, so a sibling resolves to its own extracted tarball rather
than to the workspace source. Anything undeclared falls through to the
workspace's node_modules; policing dependency declarations is tool-deps'
job.
…lent passes

Two adversarial review passes found four ways the check reported ok for a
package it had not actually verified.

A target that calls process.exit() during evaluation ended the child, so
every target queued behind it in the same process was skipped and the zero
exit code read as success. A CLI whose "." export runs itself is exactly
that shape, which is why the previous version needed an allowlist to skip
@code-like-a-carpenter/cli. Each loadable target now gets its own child,
and success is a marker the child writes once the module has evaluated
rather than the exit code. A module that exits while evaluating still
executed, so the marker is written from an exit handler; only a module that
throws suppresses it. The allowlist is gone and cli's entry point is now
really loaded.

checkFor fell through to an existence check for any condition that was not
literally require or import, so a flat {types, default} map -- or a bare
string target -- got the publint-grade check this script exists to improve
on. It now picks a loader from the extension and the package's type field.
Subpath patterns are reported as unsupported instead of failing as a
missing file.

A sibling that failed to pack still got a symlink, and node walks past a
dangling link to the workspace's node_modules, where the scope is symlinked
back to the unpacked source. The dependent package then reported ok having
been verified against the source tree. Dependents of a failed package now
fail, and a link is only created when its target exists.

Nothing bounded the children. A module that left the event loop alive hung
the run to the job timeout -- CI already logged an orphaned node process.
Loading now stops the child as soon as the module evaluates, and every
spawn has a 60s kill.

Also: enumerate packages/*/* rather than one scope, skip directories with
no manifest, stop dependency resolution at the workspace root, do not treat
optionalDependencies as mandatory, catch errors from linking, guard the npm
pack JSON parse, decode child output per stream, fix a no-op sort that left
package order filesystem-dependent, move setup inside the try that cleans
up the temp tree, and annotate each failing target rather than only the
summary line.

Packing and loading now run concurrently, which takes the full check from
58s to 9s.
@ianwremmel-ai-agent
ianwremmel-ai-agent force-pushed the clc-1135-verify-pack-ci-job branch from 50cbe7b to 9e6f4ba Compare September 7, 2026 22:15
A cross-model review pass found three paths that reported a broken
package as `ok`.

The loader wrote its evaluated-marker from an `exit` handler whenever
loading had started without throwing, and the parent treated that marker
alone as a pass. A module calling `process.exit(1)` while evaluating, or
leaving a top-level `await` unsettled (node exits 13), produced the
marker and passed. The marker now also requires a zero exit code. A
module that evaluates and exits cleanly, including a CLI that runs
itself on import, still passes.

Fallback arrays in an `exports` map collected no targets at all, so
`{".": ["./missing.mjs"]}` passed vacuously. They are reported as
unsupported, which fails, rather than skipped.

A `package.json` that exists but does not parse hit the same `catch` as
a missing one and was dropped from the run, letting the job report that
every package it did look at was fine. A malformed manifest now aborts.

Staging flattened the scope into the directory name, mapping `@a/b_c`
and `@a_b/c` onto one directory. It keeps the scope as a directory now,
as the extract root already did.
Adversarial review of the checker found four gaps, each a case where a
package that is actually broken is reported as loading cleanly.

- A target that resolves outside the extracted directory is now a
  failure. `path.resolve(pkg.dir, target)` happily accepts an absolute
  path or one that climbs out with `..`, which lands back in the
  workspace source — the one place this job exists not to read.

- JSON under an explicit `require` condition is now required rather
  than existence-checked. A file that is present but does not parse is
  the exact shape the job is for. JSON under any other condition stays
  an existence check: `import()` of JSON needs a type attribute, so
  loading every package's `"./package.json"` target would fail for the
  missing attribute alone.

- Two directories claiming one package name is now an error. The map
  is keyed by name, so the second silently replaced the first and the
  run reported every package it did look at as passing.

- The comments claimed the marker proves the module "has evaluated".
  It proves evaluation was entered and did not throw; a module that
  exits partway through still writes it. That is the deliberate price
  of writing it from an `exit` handler, so the comments now say so.
@ianwremmel-ai-agent

Copy link
Copy Markdown
Collaborator Author

Codex review round, triaged. Eleven findings; four were real and are fixed in 96ccda8.

Fixed

  • A target that resolves outside the extracted directory now fails. path.resolve(pkg.dir, target) accepts an absolute path or one that climbs out with .., and the file it lands on can be the workspace source — the one place this job exists not to read. It would have loaded it and passed.
  • JSON under an explicit require condition is now required, not existence-checked. A .json file that is present but does not parse is exactly the shape this job is for. JSON under any other condition stays an existence check, because import() of JSON needs a type attribute — loading every package's "./package.json" target would fail for the missing attribute alone.
  • Two directories claiming one package name is now an error. The map is keyed by name, so the second silently replaced the first: the package was never packed or checked, and the run still reported every package it did look at as passing.
  • The marker comments overstated what they prove. They claimed the marker means the module "has evaluated". It means evaluation was entered and did not throw; a module that exits partway through still writes it. That is the deliberate price of writing it from an exit handler, and the comments now say so.

Each is covered by a synthetic workspace I ran the script against: a package whose target escapes the extract dir, one whose require condition points at malformed JSON, and two directories sharing a name. All three fail now and passed before. A control package with a normal exports map plus "./package.json" still passes, so the JSON change did not regress the 32 real manifests.

Dismissed

  • A hostile module can forge both signals (print the marker, register an exit handler setting exitCode = 0, then throw). Out of threat model — these are our own 32 packages, and a module that wants to lie can always lie.
  • A module calling process.exit(0) mid-evaluation passes without finishing. Deliberate, and the reason the marker is written from an exit handler at all. Now documented rather than changed.
  • setImmediate(() => { throw }) during init is missed. Same tradeoff: not exiting means hanging on whatever handles the module opened.
  • A shared default target is loaded with one loader, not both. Nothing here uses a bare default without import/require, and which extra loaders a shared target owes is not derivable from the manifest.
  • Fallback arrays and * subpath patterns always fail. Intentional — they are reported rather than skipped so that introducing one is loud instead of silently unchecked. No manifest uses either.
  • Mixing subpath and condition keys is accepted though node rejects it. Static exports-map validity is publint's job (CLC-1134); this job covers loadability.
  • Percent-encoded targets are read as literal paths. No manifest has one, and decoding would misread a literal % in a filename.
  • A module calling removeAllListeners('exit') is failed spuriously. A false positive, not a false negative, and nothing here does it.
  • Peer dependencies are not linked into the extract. No package in this repo declares any.

One caveat on process. Two adversarial passes are supposed to run on a non-Claude model. The spec-aware pass ran on Codex and produced everything above. The spec-blind pass hit a Codex usage limit mid-run and produced nothing. I pushed anyway because the change is four small, individually tested edits to a script that is not on main yet, so it can only affect this PR's own CI — but the spec-blind pass still owes you a run, and I will do it before this leaves draft.

…exity rule

ESLint's `complexity` rule caps a function at 10; `checkFor` reached 12 and
`checkPackage` 13 in 96ccda8, which is what failed the lint job.

Both are decomposed rather than exempted. `checkFor` hands its extension and
`type` fallback to a new `loaderFor`; `checkPackage` hands one target to
`checkTarget` and the outcome of one child load to `loadProblem`, leaving it
to collect what those return.

No behavior change. A differential test over the 968 reachable combinations
of conditions, target extension, `unsupported`, package `type`, exit code,
stdout shape and timeout flag produces identical results before and after.
Two more adversarial review rounds on Codex, one spec-aware and one
spec-blind. Four findings were real, each a way a broken target or a broken
checkout is reported as clean.

- A module that fails on a later turn now fails. The child exited the instant
  the loader returned, so a top-level `Promise.reject()` or a `setImmediate`
  that throws never reached the event loop and the target passed. The child
  now installs `unhandledRejection` and `uncaughtException` handlers and
  defers its exit by one `setImmediate` — one turn, enough to see what is
  already queued, and still bounded, so a module holding a socket open cannot
  hang the job.

- Finding no packages is now an error. An empty discovery printed "All 0
  packages load from their tarball" and exited 0, so a moved packages
  directory or a broken checkout would have turned the job green.

- Only ENOENT means "not a package" when reading a manifest. Every other
  error — a permission problem, an I/O error — was swallowed as a stray
  directory, dropping a real package from the run while the job still passed.

- A non-string `bin` entry is reported rather than dropped, matching what
  `collectTargets` already does with the export shapes it cannot check.

Verified against a synthetic workspace: packages whose entry point calls
`Promise.reject()` or `setImmediate(() => { throw })` passed before and fail
now; one that calls `process.exit(0)` mid-evaluation still passes, which is
the documented tradeoff of writing the marker from an `exit` handler. The
empty workspace exited 0 before and exits 1 now. Against the real 32
packages the result is unchanged — the same 30 pass and the same two fail on
the `bin` that #435 removes — so nothing here is a false positive.

Dismissed, with the evidence that settles each: no package declares
`peerDependencies`, `bundledDependencies`, or a `prepack`/`prepare` script;
every `bin` and `types` value is a string; the only JSON target is the
unconditional `"./package.json"`, never under an `import` condition; and the
only conditions in use are `types`, `default`, `require` and `import`, so
custom-condition resolution does not arise. Static `exports`-map validity —
a target that does not start with `./`, subpath and condition keys mixed —
stays publint's job under CLC-1134. A module that calls `process.exit(0)`
while evaluating still passes by design.
@ianwremmel-ai-agent

Copy link
Copy Markdown
Collaborator Author

The spec-blind pass I owed has now run, and I re-ran the spec-aware one against the current diff. Both on Codex. Fourteen findings between them; four were real and are fixed in 8e2d038. The lint failure from 96ccda8 is fixed in 29b3e9e.

Lint

Not Prettier — two complexity violations. checkFor was at 12 and checkPackage at 13 against a max of 10. Both are decomposed rather than exempted: checkFor hands its extension/type fallback to loaderFor, checkPackage hands one target to checkTarget and one child's outcome to loadProblem. A differential test over the 968 reachable combinations of conditions, extension, unsupported, package type, exit code, stdout shape and timeout flag gives identical results before and after.

Fixed

  • A module that fails on a later turn now fails. The child exited the instant the loader returned, so a top-level Promise.reject() or a setImmediate that throws never reached the event loop and the target passed clean. The child now installs unhandledRejection and uncaughtException handlers and defers its exit by one setImmediate — one turn, enough to catch what is already queued, still bounded, so a module holding a socket open cannot hang the job. Both reviews raised this independently as High.
  • Finding no packages is now an error. An empty discovery printed All 0 packages load from their tarball and exited 0. A moved packages directory or a broken checkout would have turned this job green.
  • Only ENOENT means "not a package." Every other error reading a manifest — permissions, I/O — was swallowed as a stray directory, dropping a real package from the run while the job still passed.
  • A non-string bin entry is reported, not dropped, matching what collectTargets already does with export shapes it cannot check.

Verified on a synthetic workspace: entry points calling Promise.reject() and setImmediate(() => { throw }) passed before and fail now; process.exit(0) mid-evaluation still passes, which is the documented price of writing the marker from an exit handler. The empty workspace exited 0 before and exits 1 now. Against the real 32 packages the result is unchanged — same 30 pass, same 2 fail on the bin that #435 removes — so none of this is a false positive.

Dismissed, with the evidence that settles each

No package declares peerDependencies, bundledDependencies, or a prepack/prepare/prepublish script, so staging cannot diverge from publish and sibling peers cannot bypass the extract. Every bin and types value is a string. The only JSON target is the unconditional "./package.json", never under an import condition, so JSON-under-import does not arise. The only conditions in use are types, default, require and import, so custom-condition resolution does not arise either, and every target starts with ./ and carries an extension.

Static exports-map validity — a target not starting with ./, subpath and condition keys mixed — stays publint's job under CLC-1134. A shared default target still gets one loader rather than both; which extra loaders it owes is not derivable from the manifest, and nothing here uses a bare default. Undeclared dependencies still fall through to the workspace node_modules; that is tool-deps' remit and is worth its own ticket, per the note in the plan above. A grandchild process inheriting the pipes could outlive the 60s child timeout; nothing here spawns at import time, and the job's own timeout-minutes: 15 is the backstop.

Still blocked on #435. The two verify-pack failures are the real bin -> ./cli.mjs: missing from the tarball defects in cli-core and cli-plugin-example. test-integration stays red on all five shards for the repo-wide crr-sam bug, which is unrelated to this change.

@ianwremmel-ai-agent

Copy link
Copy Markdown
Collaborator Author

Resumed pass, nothing to change. The two blockers are both still open and neither is in this diff.

#435 has not landed. It is out of draft and mergeable, waiting on review. I confirmed its diff removes exactly the two fields verify-pack flags — "bin": "./cli.mjs" from cli-core/package.json and from cli-plugin-example/package.json, and nothing else that touches a manifest under test. The verify-pack run on 8e2d038 lists those two targets as its only failures, so the job goes green once #435 merges and this branch rebases.

test-integration is red on main as well. Run 34182043796 on 3bff384 fails all five shards, plus diff and test-unit. This branch is 8 commits behind that commit and passes diff and test-unit, so rebasing now would import failures rather than clear any. #436 and #437 own that breakage.

What unblocks this PR: review of #435, and whichever of #436/#437 lands the test-integration fix. When #435 merges I will rebase this branch onto main and push — merging it does not re-run these checks on its own.

Parking this as blocked on you rather than re-checking a state only you can change.

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