release: ship vinci/worker in the tarball; packaged-artifact check verifies launcher dispatch targets - #48
release: ship vinci/worker in the tarball; packaged-artifact check verifies launcher dispatch targets#48thegeorgepu wants to merge 25 commits into
Conversation
…fact check see launcher dispatch targets
vinci/bin/vinci hands `vinci worker` to `node "${VINCI}/worker/worker.mjs"`, but package.sh
assembles the tarball from an explicit path list that never named vinci/worker. Every 0.0.x
tarball up to 0.0.51 therefore shipped `vinci worker` as a dead subcommand: the launcher execs
a file that is not there and node dies with ERR_MODULE_NOT_FOUND. Nothing caught it because
packaged-artifact-check.mjs followed imports only under vinci/extensions, and the production
workers run from a git checkout, where the path resolves.
Two changes:
- package.sh adds vinci/worker (README excluded, like every other doc).
- packaged-artifact-check.mjs reads the shipped launcher for `exec node "${VINCI}/<path>"`
dispatch targets, requires each to exist, follows their relative imports with the same
resolver the extension layer gets, and then DRIVES `vinci worker` from the unpacked tree,
requiring its own usage refusal (exit 1, "vinci worker: Usage:") so the whole module graph
is proven to load from the artifact rather than the repo. Zero matched dispatch targets is a
refusal, not a pass: a check that finds nothing has gone blind.
Discrimination, run against tarballs built locally at 0f7404d and at this head:
new check vs tarball built with OLD package.sh -> FAIL: vinci/worker/worker.mjs not in tarball
new check vs tarball built with NEW package.sh -> PASS (2 targets, 33 imports, worker loads)
old check vs NEW tarball -> PASS (positive control, extension layer unchanged)
new check vs NEW tarball minus worker/contracts -> FAIL: 6 unresolvable imports named
vinci-tests.yml and vinci-release.yml already run this check against the packaged artifact, so
the guard is on the release path without a workflow change.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DhcA4xJByHpjkPGHbhmzkq
|
Follow-up repair pushed at
All hosted checks are green. PR remains unmerged for fresh review. |
|
Repair follow-up for Exact head: Evidence:
The PR is open, clean, and unmerged. Please perform a fresh independent review against exact head |
|
Repair follow-up for Exact head: Evidence:
The PR is open, clean, and unmerged. Please perform a fresh independent review against exact head |
|
Review repair evidence for Exact candidate head: This is the direct child of the blocked head The exact blocked-head reproduction removed all 12 files from the payload's declared The repair makes certification bidirectional: every artifact entry must match the trusted executable authority, and every file/symlink selected by the reviewed package layout must exist in the artifact. The closure uses the same release roots and exclusions as Verification on the exact candidate:
Please perform a fresh independent review of this exact head, bound to |
|
Correction to the comment above. The head it cites, |
|
Repair evidence for What changed:
Historical-head discrimination (
Exact-head local evidence (
Hosted evidence on the exact SHA:
PR state after hosted completion: OPEN, CLEAN, head exactly |
Independent review — reviewed head
|
…h, closed harness_stop token, caller-supplied session_id, receipt-only cost carried, no_session/none on pre-session terminals, per-response dedup, estimated cost_basis Review (Claude, fresh agent) NO-GO findings 1-9 addressed: - postFinal: BLOCKED/FAILED/harness-stop/UNVERIFIED branches now carry economics_sha256= - harness_stop is instrument_stop:<count>, never the blocked tool call's text (R3) - session_id is attempt.sessionId, not the session file name - digest-path registry refusal emits a summary - receipt-only or message-fallback cost becomes one estimated usage row plus usage_persistence_failed, never omitted as zero spend - a terminal before any session ran reports no_session / cost_reconstruction none instead of a fallback that never ran or a kill that never happened - main path also writes economics-summary.json into the attempt dir - cost_basis/cost_confidence default to estimated; dedup is per response across rows; an over-long model name is malformed_entries Tests updated to the new semantics with negative controls; 33+6 pass, 1 skip (#48). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VVK5S9ssoXtZYBhwcoWWT6
|
Independent exact-head review (Claude, fresh agent) at MEDIUM — What was verified by running, not reading: Also noted: Branch is 0 behind main, 23 ahead, CI 6/6 green at this head. |
Round-4 review BLOCK msg_6322c5f8 (closed class, PR #48 @5145860e): commit 71ccb43 gated every packageEntryFiles.add in validatePackageManifest on isRuntimeWorkspace, so only the five runtime workspaces were traversed with checkGraph({bindBare:true}). Every other shipped package's main/bin/imports/ exports targets were existence-checked but never bare-import-bound, and the checker certified an artifact whose shipped debug/src/node.js and ws/lib/{buffer-util,validation}.js load supports-color, bufferutil and utf-8-validate from a hostile parent node_modules while printing that parent resolution was closed. The same commit retargeted the test that would have caught it from a node_modules fixture to packages/coding-agent. Repair (checker): - Drop the workspace gate. Every shipped package's entry surface (main, bin, imports, exports; plain, conditional, wildcard) is traversed and bound. - Principled optional edges instead of deleting the gate outright. A bare edge that resolves ABOVE the artifact root is refused no matter how the package describes it: that is the hostile-parent case. A bare edge that resolves NOWHERE is tolerated only when the importing package declares it optional, by manifest (optionalDependencies, peerDependenciesMeta.optional) or by guarding the load with try/catch (the napi-rs platform loaders name 17 platform packages they never declare). Undeclared, unguarded and absent is a missing edge and refuses. Tolerated edges are counted in the success line ("N declared-optional edge(s) absent everywhere"). - Absent RELATIVE edges in the non-strict package entry graph are tolerated only when try-guarded (platform .node binaries, WASI fallbacks); a relative path cannot walk into a parent (assertInsideRoot refuses escapes). Strict graphs (dispatch, extensions) are unchanged. - Export targets under conditions a plain node process never evaluates ("source", "@zod/source", "types", "browser", ...) stay existence-checked but are not traversed; Node-default conditions (node, import, require, default, module-sync, node-addons) are. The launcher passes no --conditions. - Files reached through a bare edge are traversed too, so deep subpaths of legacy packages without an exports map are bound (previously bare edges were resolved but never walked). - resolveImport models a relative directory import through the directory's package.json main (which/bin/node-which -> ../). - Entry targets that exist but are not regular files (legacy folder mappings "./lib/", empty main) are neither traversed nor refused: Node 17+ cannot load them through exports/imports and a legacy main directory is already resolved to its concrete entry. - Bare resolutions are cached per (loader, directory, specifier); binding every package made the per-import resolver spawn the dominant cost. Tests: - "every declared package export binds bare imports to the artifact" is restored to its NON-workspace fixture (node_modules/runtime, conditional export) and names the one-line mutation that makes it fail again. - The three hostile-parent runtime regressions from the review (supports-color via debug main; bufferutil and utf-8-validate via ws conditional export) are checker-must-refuse cases, with the runtime hostile load proven by marker first and the clean state certifying with 3 declared-optional edges absent. - Undeclared/unguarded absent bare import refuses; manifest-declared and try-guarded variants certify; a load in a catch clause is not guarded. - Non-workspace wildcard exports, require, dynamic import(), bare-edge traversal, non-Node conditions, and directory imports are covered. G7 alternate paths: require, dynamic import() and exports subpath patterns (./*) in non-workspace packages are covered above. Out of scope, with reason: (1) an optional edge that resolves nowhere at verification time but is supplied by a parent node_modules at install time cannot be observed by a static checker run before installation; closing it needs sealing stubs generated at package time, which is the package-authority binding work order the ruling keeps separate from the worker fix. (2) The dispatch and extension graphs still run with bindBare:false; their bare imports are declared workspace dependencies whose presence the trusted layout closure requires.
vinci/package.sh line 30 states that "tests, docs, infrastructure state, and release tooling must never enter the public archive", but the only test-shaped exclusion in the packaging path was a hardcoded node_modules/ssh2/test, and package-entries.mjs tars first-party release roots (vinci/worker, vinci/extensions, vinci/updater, vinci/themes, vinci/assets, packages/*/dist) wholesale. Any first-party test directory added under them shipped. Reported by projects-9f, routed via the coordinator from projects-5a. Latent, not live: no first-party test path ships today. `tar -tzf` of the artifact built at this head matches no test-shaped first-party path, and no such file exists on disk under any release root. PR #49 adds vinci/worker/test/**, which would have been the first. Fixed as a class rather than per path. A per-directory exclusion would leave every future first-party test directory shipping while still reading as closed — the same "enumeration wearing a policy's comment" shape as the workspace gate repaired in the previous commit. vinci/scripts/ first-party-test-paths.mjs keys off the shape of the path instead: any test/tests/__tests__/__mocks__/spec/specs segment, or a *.test.* / *.spec.* basename. Scope is first-party only; paths inside node_modules stay governed by the production dependency closure plus the ssh2 carve-out, because pruning a dependency by name would change which bytes of a third-party package the artifact carries. The rule is applied on BOTH sides from that one predicate, which is not optional: the checker requires every authority entry under vinci/worker, so a producer-only exclusion would make every artifact fail as "required by the trusted package layout is missing" (the pairwise failure this shared module exists to prevent). - package-entries.mjs excluded(): the entry list tar is given. - packaged-artifact-check.mjs excludedFromReleaseAuthority(): the trusted release surface, so producer and verifier agree. - packaged-artifact-check.mjs compareAuthorityDirectory(): a test path that did reach the archive is refused in its own words rather than as a generic authority mismatch, since that means the packaging rule regressed. Controls (verbatim outputs in the PR body): with vinci/worker/test/ ws-c2-probe.test.mjs and vinci/updater/__tests__/ws-c2-probe.test.mjs planted, `bash vinci/package.sh` before this change listed all four entries in the tarball and after it lists none, while vinci/worker keeps its 21 shipped entries and the artifact still certifies. Both new tests fail under the per-path mutation named in their docstring; they are pinned separately because the producer and the artifact-direction refusal are different guards and one mutation does not fail both.
…arty-tests Merged on George's instruction (2026-09-03). Independent exact-head review by lane projects-7f at 20957de: verdict GO, envelope msg_44fe26fe. Closes the first-party-test-path class on package-excludes.mjs, the producer that governs main. Must precede #50: a build using a byte-identical copy of #50's tar block WITHOUT this fix ships vinci/worker/test plus both economics test files; with it, those three are absent and all 21 worker runtime paths remain. Evidence: 8 reviewer-chosen mutants, 5 wiring-class, 8/8 caught with zero survivors — including --exclude-from deleted from the tar invocation, producer output diverted so tar reads an empty exclude file, the emit loop removed, the walk de-recursed, and a parent-directory over-match caught by the positive control on vinci/bin/vinci. Positive control: on main's unplanted tar list the fix is an exact no-op, 18647 members before and after with an empty diff. Over-matching: none found; matching is exact whole-segment Set membership and a doubly-anchored filename pattern, so latest/, testing-utils/ and contest/ all still ship. Recorded for maintainers: the per-path mutation passes ALL FIVE #50-simulation checks and is caught only by the planted probes and the closure check; a node_modules-guard mutant passed all 17 probe and simulation checks and died only on the closure check. Probes and closure check are each load-bearing for mutations the other misses. Do not keep the simulation and drop the probes. Follow-ups: the predicate file's header comment is false on this branch (it names a verifier that does not import it, and describes this branch's own producer-only shape as the failure it prevents) — kept byte-identical with #48's copy deliberately, divergence to be noted at the import site, correction committed for 2026-09-10. Class gaps fixtures/ and __snapshots__/ have zero live instances under any tarred root and should follow immediately. CI covers GNU tar only; bsdtar verified locally. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Mb5WmCTpEn6NVdXKUPVvKE
|
Converting to draft. This PR is not waiting on review — it is waiting on a scope decision by its owner, and leaving it review-ready spends reviewer cycles on a head that has to change anyway. Measured today (2026-09-03), not inferred:
Why draft rather than another review round. Two independent reviews exist and neither is at the current head. The first, at The decision that is actually open, and it is not a reviewer's to make: does this land as a rebase-and-fix of these 25 commits, or as the new minimal PR the first review recommended? Those are different pieces of work and only the owner can price them. Nothing on this branch is lost by holding: the two reviews and their findings stay on this thread, and the Conditions that lift this hold — any one of them, checkable by someone other than me:
Undrafting is one click and needs no permission from me. I am marking it because a conflicting branch that reads as awaiting review is the failure mode where a PR quietly rots into a larger conflict while everyone assumes someone else is looking at it. |
|
Closing: the merge vehicle is bad, not the work. The urgent worker-packaging fix already shipped via #50. What remains here is a large package-authority checker carrying four review rounds that were conducted against a scope which no longer exists — after the split, this is a producer swap on a producer that already works. It is also draft and CONFLICTING at 19 files. Reissue the package-authority checker against current Branch retained. Closed as part of the 2026-09-03 open-PR backlog triage. |
What
vinci workeris dispatched by the shipped launcher, butvinci/package.shdid not includevinci/worker. Every tarball through 0.0.51 therefore shipped a dead worker command even though checkout-based production workers remained healthy.This PR now:
vinci/workerwhile excluding its README;vinci/dispatch-manifest.jsonbinding every launcher dispatch;e""xec, directnode "$VINCI/...", alternate/absolute Node spellings, and partial conversions cannot escape discovery;require, and recursive.cjsdependencies;The existing CI and release workflows already build and unpack the real tarball before invoking this check. The bounded packaged
--versionprobe remains a separate positive product control.Exact head
5145860e1f974b7151a0edd18bbfe24fb3d0c5baon base0f7404d77fde08a2d8fa2511f9bfd2a213f1af60(refreshed 2026-09-02 by lane ws-c-worker under ruling msg_72d4330e section C / assignment msg_09be7393; the previous body named0a6d9c9b1651fa9bcf078dc8695e8c5bb1e613fe, which is fifteen heads behind).Head history (base
0f7404d7; each head and the bus envelope that answered it)9baa4fa4— initial PR head (lane claude-vcc-rc-review): shipvinci/worker, checker sees launcher dispatch targets. No envelope; superseded.efc9ebde— builder repair (status msg_e9d3c8ba). No envelope; superseded.d97beb3b— builder repair (status msg_9ae3efa5). No envelope; superseded.0a6d9c9b— the head this body previously named. No envelope; superseded.ea3858fd— BLOCK msg_0ce248c0 (hidden dispatches still certified).bb9d344c— BLOCK msg_ea333bfc (six reachable hidden dispatches; supersedes msg_0ce248c0).45412cec— BLOCK msg_dc7a8210 (round 1 under the proof budget: eight reachable hidden execution paths — indirect shell executables/PATH, Reflect/vm/worker_threads/child_process).a2d7d9bc— BLOCK msg_544ebcd7 (round 2: missing bare dependency escapes to parent node_modules).9c55ff22— BLOCK msg_b53d2f94 (round 3: tsx ships while its required esbuild is excluded; malicious parent esbuild loads after certification) and BLOCK(decision-gated) msg_a1d3d766.cd4d97b6— coordinator hold msg_d5b6821f (excluded-but-present authority-identical packages certify; declared conditional-export bare imports not traversed; authority not bound to repo/commit/tree).ff027c6b→2ad897fc→71ccb43e→bf2b2ccf→f2061f7b→1a4bde23→153245f6→b6f9995d→362fbbd4→d86755d4→d6089f0f→e821d824→5145860e(current) — unreviewed descendants repairing the msg_d5b6821f findings. Round 4 (the ONE remaining round under ruling msg_72d4330e) requested by ws-c-worker (msg_da11676f) → BLOCK msg_6322c5f8 (ws-e-review, 2026-09-02T22:05Z), classified CLOSED-CLASS by the reviewer — not a split trigger; a defect in the repair, to be fixed on a normal descendant of5145860ewith one confirming exact-head review (within budget). A fifth round on the SAME head is out of budget.Per the ruling: a BLOCK on a NEW mechanism class at this head triggers the SPLIT (worker-inclusion fix + existing checker as a small PR; the package-authority binding becomes its own work order). A BLOCK on an already-closed class is a defect in the repair, fixed on a normal descendant.
Round 4 finding (msg_6322c5f8) — descendant-fix spec
vinci/test/packaged-artifact-check.mjs:1161-1163isRuntimeWorkspace = /^packages\/(agent|ai|coding-agent|orchestrator|tui)\/package\.json$/gates everypackageEntryFiles.add(imports 1197-1201, wildcard 1222-1228, main/bin/exports 1257-1263);packageEntryFilesis the only set passed tocheckGraph({bindBare:true})(1268). Every non-workspace shipped package therefore has its main/bin/imports/exports existence-checked but never bare-import-bound.runtime-package-closure.mjsdoes not save it: it ships declared deps/optional/peer only and skips unresolvable optionals;peerDependenciesMetais never iterated.node_modules/{supports-color,bufferutil,utf-8-validate}are loaded by shippeddebug/src/node.js:32(via http(s)-proxy-agent, declared bypackages/ai) and shippedws(via@google/genai,@mistralai/mistralai); the checker still exits 0 printing "13720 required entries close parent-directory dependency resolution". 59 shipped package names have bare imports that do not resolve inside the payload; live-runtime ones:supports-color,bufferutil,utf-8-validate,@modelcontextprotocol/sdk.trueflips the clean artifact from exit 0 to exit 1 with "8119 unverifiable dependency edge(s)" naming the three instances — the binding machinery works; the gate suppresses it. The gate arrived in71ccb43e("scope entry traversal to shipped workspaces"), which ALSO retargeted the test "every declared package export binds bare imports to the artifact" from a non-workspace fixture to a workspace one (79/79 green over the gap).peerDependenciesMeta.optional,optionalDependencies, try/catch-guarded requires) rather than deleting the gate outright; add the three hostile-parent runtime regressions (supports-color via debug, bufferutil + utf-8-validate via ws) as checker-must-refuse cases; restore the retargeted test to a NON-workspace fixture; keep the positive control (clean artifact certifies,vinci --version,vinci workerusage path).cf196e63, CI 6/6) is a coordinator/Governor decision recorded on the bus.Installed-artifact evidence at
5145860e(lane ws-c-worker, 2026-09-02)bash vinci/package.shat this head →vinci-code-0.0.51.tgzsha256ef11dcb1bb6b1280d5d610ef6cb8509e09dfe95769493bd1d59de5225034c328;tar -tzflists 21 entries undervinci/worker/(worker.mjs, run.mjs, bus.mjs, outbox.mjs, contracts/…).packaged-artifact-check.mjsandpackaged-runtime-probe.mjson the unpacked artifact: both pass ("certified package, CLI help, direct CLI, worker, metadata, symlinks, and parent refusal passed").vinci/install.sh+ updater into an isolatedVINCI_HOME(probe keypair; the only payload byte changed isvinci/updater/public-key.pem, exactly as update-integration.mjs does):vinci --version→0.0.51;vinci worker --help→ rc=1vinci worker: Usage: vinci worker start --id <id> --server <url> …(the worker's own usage path).vinci-v0.0.51(c2078cd), same probe: tarball sha2568193e44f…has 0vinci/workerentries; installed copy has novinci/worker;vinci worker --help→ rc=1node:internal/modules/cjs/loader … throw err(module not found). The repair discriminates.loop_edge
loop_edge: package | live_producer: release workflow (vinci-release.yml; NOTE: its repository guard names getsimpledirect/vinci-code, so it is SKIPPED in this repository — see the canary plan) | live_consumer: updater channel beta | side_effect_adapter: none | authority_class: ordinary (package-authority binding portion: supply-chain boundary, may go deep) | observation_receipt: required (install probe) | human_required: true (release)Intended-mechanism discrimination
vinci/workerfails at the worker target assertion..cjsfails at the named CommonJS edge.$VINCI, absolute Node,env node, quote-splite""xec, direct Node withoutexec, alternate shell runners, nested command substitutions/backticks, variable runtime, and extra unmarked execs all fail at the dispatch-manifest mechanism.import{missing}from"./absent.mjs", computedrequire, aliasedrequire,module["require"],eval, malformed syntax, and missing recursively imported.cjsare covered.Verification
node --test vinci/test/packaged-artifact-check.test.mjs— 20/20 passed.npm run checkafter a fresh network-free build — all checks passed.VINCI_SKIP_SMOKE=1 bash vinci/test/run.sh— every offline/unit/UI/visual group passed; no provider call../test.sh— agent and AI suites passed; coding-agent had one unrelated reftable debounce timeout, thentest/footer-data-provider.test.tspassed 8/8 on focused rerun; TUI completed. This is recorded as a flaky full-workspace run, not claimed green.Hosted exact-head checks are running and are not claimed here until terminal.
Scope
No worker deployment, box/fleet mutation, release publication, provider/model call, or GPU work.
Round 4 repair — descendant of
5145860e(lane ws-c2-pr48-fix, 2026-09-02)New exact head
acaaae667a847d8e9c2fb2767ea522eec78b8dccon base0f7404d77fde08a2d8fa2511f9bfd2a213f1af60(merge-base with the base is exactly0f7404d7). Two normal descendant commits, no force-push:aaa3f97f— the round-4 repair: bind bare imports for every shipped package entry surface.acaaae66— separate, unrelated finding routed by the coordinator (projects-9f via projects-5a): first-party test paths are not excluded from the release archive.Files changed:
vinci/test/packaged-artifact-check.mjs,vinci/test/packaged-artifact-check.test.mjs,vinci/scripts/package-entries.mjs,vinci/scripts/first-party-test-paths.mjs(new).Item 1 — the closed-class round-4 finding (msg_6322c5f8)
The
isRuntimeWorkspacegate atpackaged-artifact-check.mjs:1161is removed, so every shipped package'smain/bin/imports/exports(plain, conditional, wildcard) is traversed withcheckGraph({bindBare:true}). The gate is not merely deleted — the reviewer's G8 note that "delete the gate is NOT a safe repair" is honoured by a principled optional-edge policy:optionalDependencies,peerDependenciesMeta.optional) or by guarding the load intry/catch(the napi-rs platform loaders name 17 platform packages they never declare). Undeclared, unguarded and absent is a missing edge and refuses.nodeprocess never evaluates (source,@zod/source,types,browser) stay existence-checked but are not traversed; Node-default conditions are. The launcher passes no--conditions.Triage of the 8119 edges the reviewer's mutation surfaced, on the real tarball: 8067 relative (7859 of them
@mistralai/mistralaiTypeScript source reachable only under the non-Nodesourcecondition, 180zod, 27@mariozechner/clipboardplatform binaries) and 52 bare — 16optionalDependencies, 3peerDependenciesMeta.optional, 33 undeclared napi-rs platform packages loaded insidetry/catch. Only the three live-runtime ones are undeclared and unguarded.Runtime hazard first (the artifact is real):
bash vinci/package.shat5145860e→vinci-code-0.0.51.tgzsha2561284d875e7fae56c61513af430abfb3d70684549e7c603b7c40b664f0e972d80, 21vinci/worker/entries. Unpacked under a hostile parent holdingnode_modules/{supports-color,bufferutil,utf-8-validate}that write a marker on load:(2) Old-behaviour control — the checker at the pre-fix head
5145860e, on that same hijacked payload, certifies:(1) Negative control — the same probe through the same entry point at
acaaae66refuses, in the checker's own message, naming each file and specifier:This is the package-entry-graph mechanism itself, not an earlier guard: no authority, layout or provenance failure appears, and the
assert.doesNotMatch(hijacked.stderr, /closed executable authority|required by the trusted package layout/)control in the new test pins that.(3) Positive control — the unmodified artifact from
bash vinci/package.shatacaaae66still certifies:376 → 4744 package entry files and 1476 → 16562 bound imports is the gate's suppression, measured.
packaged-runtime-probe.mjson that artifact:packaged-runtime-probe: certified package, CLI help, direct CLI, worker, metadata, symlinks, and parent refusal passed. Installed throughvinci/install.sh+ updater into an isolatedVINCI_HOME(probe keypair; onlyvinci/updater/public-key.pemdiffers, exactly asupdate-integration.mjsdoes):(4) The retargeted test is restored.
every declared package export binds bare imports to the artifactgoes back to a NON-workspace fixture (node_modules/runtime, through a conditional export), which is what71ccb43echanged away from while keeping the name. Its docstring names the mutation:Added alongside it: the three hostile-parent regressions as checker-must-refuse cases (with the runtime load proven by marker first, and the clean state certifying with 3 declared-optional edges absent); undeclared/unguarded absent refuses while manifest-declared and try-guarded certify; a load in a
catchclause is not guarded by thattry; non-workspace wildcard exports,require, dynamicimport(), bare-edge traversal, non-Node conditions, and directory imports.(5) G7 alternate paths.
require, dynamicimport()andexportssubpath patterns (./*) in non-workspace packages are covered, each with its own test. Explicitly out of scope, with reasons, in the commit message: (a) an optional edge that resolves nowhere at verification time but is supplied by a parentnode_modulesat install time cannot be observed by a static check that runs before installation — closing it needs sealing stubs generated at package time, which is the package-authority binding work order the ruling keeps separate; (b) the dispatch and extension graphs still runbindBare:false, their bare imports being declared workspace dependencies whose presence the trusted layout closure already requires.Item 2 — first-party test paths in the release archive (separate commit
acaaae66)vinci/package.sh:30promises "tests, docs, infrastructure state, and release tooling must never enter the public archive", but the only test-shaped exclusion was a hardcodednode_modules/ssh2/test, andpackage-entries.mjstars first-party release roots wholesale.Latent, not live. No first-party test path ships today:
tar -tzfof the artifact at this head matches no test-shaped first-party path, and no such file exists on disk under any release root (vinci/{bin,extensions,themes,assets,updater,worker},packages/*/dist). PR #49'svinci/worker/test/**would have been the first.Negative control, with
vinci/worker/test/ws-c2-probe.test.mjsandvinci/updater/__tests__/ws-c2-probe.test.mjsplanted andbash vinci/package.shrun — before:after (same probe files, same command):
Fixed as a class, not per path:
vinci/scripts/first-party-test-paths.mjskeys off path shape (test/tests/__tests__/__mocks__/spec/specssegments,*.test.*/*.spec.*basenames), first-party only —node_modulesstays governed by the production dependency closure, since pruning a dependency by name would change which bytes of a third-party package the artifact carries. The rule is applied on both sides from that one predicate, which is not optional: the checker requires every authority entry undervinci/worker, so a producer-only exclusion would make every artifact fail as "required by the trusted package layout is missing". A test path that does reach the archive is refused in the checker's own words.Mutation lines, one per guard (they are different code paths and one mutation does not fail both):
Both verified: each test passes at this head and fails under its own mutation. Mutating only
excludedFromReleaseAuthoritydoes not fail the second test, which is why both guards are pinned separately rather than assumed to share one.(6) Tests, verbatim
node --test vinci/test/packaged-artifact-check.test.mjsatacaaae66(87 tests, up from 79 — 8 added):bash vinci/package.shat this head:package exit=0. Pre-commitnpm run check(biome, pinned-deps, secrets, ts-imports, shrinkwrap, install-lock,tsgo --noEmit, extensions, browser-smoke) passed on both commits. Hosted checks at this head are not claimed here until terminal.Scope and honest limits
No merge, release, deploy, tag or branch-protection change; PR #50 untouched. Not re-verified by me and taken as recorded: ws-c-worker's
ef11dcb1…tarball digest and thevinci-v0.0.51zero-worker control. macOS only; no Linux or Windows run. The tarball is not byte-reproducible across builds (three builds gave three digests), so each control above names the digest it ran against. The review's fourth unresolved name,@modelcontextprotocol/sdk, is apeerDependenciesMeta.optionalof@google/genaiand is therefore tolerated-while-absent by the policy above, not bound — it is refused the moment it resolves in a parent.