Problem
packages/extension/test/packaging.test.ts is describe.skipIf(!existsSync(VSIX)), and ci.yml never builds a .vsix (the package script is the only thing that produces amicode.vsix, and no CI job runs it). So the packaging-manifest suite skips on every push and PR — it is the source of the perennial "2 skip" in the green run.
That means the REQUIRED-ships manifest list guards nothing automatically. After #44 the list includes extension/media/inspector.{html,css}, but those entries — like every other entry — only assert anything if a human remembers to run pnpm --filter amicode-v2 package locally and then vitest by hand.
This is a deliberate deferral, not a regression
- The inert-without-vsix pattern is intentional, present since
a4713d5 ("packaging-manifest assertion … verified, 39MB, 16 files"), whose comment states the intent: "Inert without a built .vsix so CI stays green."
- The last CI change in this area (
26d9018, "extension unit suite in fast job … .vscodeignore ships vendor/") added vendor-shipping + boot-smoke but consciously left out a package step.
- The phased build plan lists "mechanical CI gates" under "explicitly NOT in β", landing in Phase 1.4 ("Reference-prompt smoke corpus + traceability/CI gates"). So this is parked by convention — it just had no tracking issue. This issue is that ticket.
Residual exposure
The repo-level presence of media/ is now caught in the fast tier — inspector_view_contract.test.ts readFileSyncs the source media/inspector.{html,css}, so a deleted file reds CI. The unguarded layer is strictly VSIX inclusion: a .vscodeignore mistake (or a vsce default-include change) that ships the repo file but drops it from the package. Today nothing in .vscodeignore names media/, so it ships only by default-inclusion with no backstop. If that breaks, the published extension renders a blank/unstyled Run Inspector while CI stays fully green.
Proposed approach
Two tiers (decide one or both):
- Fast tier (cheap, no opencode vendoring): add a step that runs
vsce ls (lists the files that would ship — no 39MB build, no fetch:opencode) and asserts the REQUIRED entries minus the vendored-opencode line. This makes the asset-manifest check a real per-PR gate at near-zero cost.
- Slow/boot-smoke lane (full fidelity): run
pnpm --filter amicode-v2 package (the boot-smoke job already does fetch:opencode, so it's the natural home) and run packaging.test.ts against the real amicode.vsix — this is the only path that can keep asserting the vendored-opencode entry.
Acceptance criteria
Out of scope
Marketplace publishing / signing (Phase 4, #2). This issue is only about making the existing manifest assertion a real CI gate.
Links
Dependencies
Blocked-by: #58
Problem
packages/extension/test/packaging.test.tsisdescribe.skipIf(!existsSync(VSIX)), andci.ymlnever builds a.vsix(thepackagescript is the only thing that producesamicode.vsix, and no CI job runs it). So the packaging-manifest suite skips on every push and PR — it is the source of the perennial "2 skip" in the green run.That means the
REQUIRED-ships manifest list guards nothing automatically. After #44 the list includesextension/media/inspector.{html,css}, but those entries — like every other entry — only assert anything if a human remembers to runpnpm --filter amicode-v2 packagelocally and thenvitestby hand.This is a deliberate deferral, not a regression
a4713d5("packaging-manifest assertion … verified, 39MB, 16 files"), whose comment states the intent: "Inert without a built .vsix so CI stays green."26d9018, "extension unit suite in fast job ….vscodeignoreships vendor/") added vendor-shipping + boot-smoke but consciously left out apackagestep.Residual exposure
The repo-level presence of
media/is now caught in the fast tier —inspector_view_contract.test.tsreadFileSyncs the sourcemedia/inspector.{html,css}, so a deleted file reds CI. The unguarded layer is strictly VSIX inclusion: a.vscodeignoremistake (or avscedefault-include change) that ships the repo file but drops it from the package. Today nothing in.vscodeignorenamesmedia/, so it ships only by default-inclusion with no backstop. If that breaks, the published extension renders a blank/unstyled Run Inspector while CI stays fully green.Proposed approach
Two tiers (decide one or both):
vsce ls(lists the files that would ship — no 39MB build, nofetch:opencode) and asserts theREQUIREDentries minus the vendored-opencode line. This makes the asset-manifest check a real per-PR gate at near-zero cost.pnpm --filter amicode-v2 package(theboot-smokejob already doesfetch:opencode, so it's the natural home) and runpackaging.test.tsagainst the realamicode.vsix— this is the only path that can keep asserting the vendored-opencode entry.Acceptance criteria
REQUIREDasset is excluded from the package.media/**(or**/*.html) to.vscodeignorefails CI.Out of scope
Marketplace publishing / signing (Phase 4, #2). This issue is only about making the existing manifest assertion a real CI gate.
Links
media/entries and leaned on the guard in its description).a4713d5introduced the inert assertion;26d9018last touched CI packaging.Dependencies
Blocked-by: #58