fix(skills): attribute a scanner failure to the scan step, not extract - #1280
Merged
Merged
Conversation
The skill install scan runs the YARA-X WASM engine, but `step` was still `extract` when it ran, so an engine that fails to instantiate is reported as an unzip failure — which the pure-JS unzip cannot produce. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Generated-By: PostHog Desktop Task-Id: 29067a32-1e8b-4807-aac5-3c13e0497121
🧙 Wizard CIRun the Wizard CI and test your changes against wizard-workbench example apps by replying with a GitHub comment using one of the following commands: Test all apps:
Test all apps in a directory:
Test an individual app:
Show more apps
Test against a Context Mill branch:
Add Results will be posted here when complete. |
edwinyjlim
approved these changes
Sep 22, 2026
gewenyu99
added a commit
that referenced
this pull request
Sep 23, 2026
Brings in the eight main fixes since beccc79 (#1275, #1280, #1284, #1294, #1295, #1301, #1302, #1305). One conflict: agentic detection keeps main's two-attempt retry loop from #1305 and adds A1's progress emitter to the agent it initializes. Generated-By: PostHog Desktop Task-Id: d14e92bb-6ee1-49b5-8502-39cb80079589
gewenyu99
added a commit
that referenced
this pull request
Sep 23, 2026
Brings the final Release A, through the new B1, into the callable program
host. B2's structure stays; A's agent contract holds throughout:
- asks and task notices take { signal }, and cancelAsk, cancelTaskNotice
and cancelQuestion are gone;
- the linear sequence owns a run controller;
- the orchestrator's fatal path reports blocked tasks;
- the agent never sends terminal analytics.
The adapter calls wizardAbort with an explicit status: 'cancelled' only when
the host cancelled, 'error' otherwise. After a non-composed success it sends
'success' behind the flush guard.
main's fixes land where B2 moved the code:
- #1284's warehouse seed cap goes into posthog-integration/run.ts;
- #1280's scan step goes into B2's downloadSkill;
- #1305's two detection attempts share one inference-auth provider;
- the #1305 timer and B2's host-abort check sit side by side in
agent-interface.
B2's skill-cleanup test now expects an agent [ABORT] to end as failed, and
its host-abort test checks that an unmarked user skill survives.
Generated-By: PostHog Desktop
Task-Id: d14e92bb-6ee1-49b5-8502-39cb80079589
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
downloadSkillruns the YARA-X scan as the last thing inside itstry, butleaves
stepset toextractwhile it does. The scan is the only WASM in thatblock —
unzipSyncis fflate, pure JavaScript — so when the engine fails toinstantiate, the failure is filed on
skill install failedas an extractionfailure that extraction cannot produce.
Engine-load failures are currently the largest single class of skill-install
failure, all on macOS, and they take the whole run with them: the seeded
data-source step's own skill cannot install, so the task agent is failed rather
than run blind, retried once, and ends without reporting. Every
no-reportorchestrator task failure in the window is this, and the exception the run
records suggests checking directory permissions.
The
scanvalue the poisoned-skill branch already sends is unaffected, so askill blocked by a rule keeps counting exactly as it did.
Why: the seeded data-source task's telemetry showed a small group of runs
ending in seconds with nothing done. The failing phase was recorded as
extraction, which is why the scanner never came up as the cause.
Changes
stepto includescanand set it beforescanInstalledSkill, so athrow from the scanner is attributed to the scan.
Note #1073 renames this property
to
install_stepto escape a numeric collision; the two are independent andthat PR does not change which value a scanner failure reports. Until it lands,
read the value through
JSONExtractString.Test plan
downloadSkillover the existing mock HTTPserver with the warlock mock rejecting, and asserts the captured step. It
fails on
mainwithextractand passes here.src/lib/__tests__— 529 tests pass.clean,
tsc --noEmiterror count unchanged frommain(37, none in thetouched files).
LLM context
Considered and rejected: making the scanner fail open on an engine error. The
fail-closed behaviour is deliberate and consistent across every scan surface,
and relaxing a security control is not a reporting fix. Also left alone: the
task-level error text that blames permissions, which
#1073 already rewrites per
failure kind.
Created with PostHog Desktop
🤖 Generated with Claude Code