Skip to content

Fix explicit skill availability in empty mode - #110

Merged
sbroenne merged 2 commits into
mainfrom
sbroenne-explicit-skill-loading
Oct 1, 2026
Merged

sbroenne merged 2 commits into
mainfrom
sbroenne-explicit-skill-loading

Conversation

@sbroenne

@sbroenne sbroenne commented Oct 1, 2026 •

Copy link
Copy Markdown
Owner

Description

Explicit skill_directories now set public SDK enable_skills=True, including in empty mode, without enabling ambient configuration discovery. The runner validates individual directories or parents and verifies requested skill path/name and enabled state through public session.rpc.skills.ensure_loaded(), reload(), and list() before its single send. Missing, invalid, unreadable, duplicate-name, or undiscovered skills fail clearly without a model send or replacement attempt. No skill read is forced.

Nonempty directories combined with enable_skills=False are rejected. Empty directories with explicit disabling and named disabled_skills remain supported. Passthrough directories cannot silently overwrite explicit inputs.

Public DiscoveredSkill, SkillDiscovery, and CopilotResult.skill_discovery preserve actual availability and diagnostics separately from configuration and observed reads. Current native schema-4.0 evidence requires the discovery field (null means unchecked); older evidence missing it must be regenerated. Docs and release notes explain these contracts.

Regressions were added and reproduced before implementation. Real public SDK checks now expose exactly the individual/parent requested skills and no ambient skills. SDK instruction-source enumeration lists inactive candidate files; a blocked outgoing request confirms ambient instruction contents stay out of actual model context.

The user subsequently authorized merging and publishing this fix. Release preparation now sets project.version=1.0.1, refreshes both local-package locks, dates the fix notes, and aligns release invariant checks and docs workflow examples. Publication will follow the repository's guarded Release workflow after required checks pass and this PR merges.

Type of Change

  • Bug fix (non-breaking change that fixes an issue)
  • New feature (non-breaking change that adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation update

Contradictory skill intent is rejected and current native evidence requires the discovery field. The schema version remains 4.0; the package version advances to 1.0.1.

Checklist

  • I ran the deterministic checks required for this change
  • I ran the relevant real-Copilot integration file when behavior changed
  • I added contract or integration coverage that proves the outcome
  • I updated user and contributor documentation where needed
  • I did not include credentials or unsanitized private prompts

Testing

uv run python -m pytest "tests\contracts\test_skill_availability.py" -q -o addopts=
Before implementation: 3 failed, reproducing absent enabling and disable conflict.

uv run python -m pytest "tests\contracts" "tests\unit" -q -o addopts= --tb=short
Passed: 525 passed, 8 skipped (optional cached-runtime tests); existing warnings only.

uv run python -m pytest "tests\contracts\test_skill_availability.py" "tests\contracts\test_native_evidence.py" -q -o addopts=
Final expanded fix coverage passed: 36 passed.

uv run python -m pytest "tests\integration\copilot\test_skill_discovery.py" -v -o addopts= --tb=short
Passed: 5 passed. Four discovery cases forbid sends. The fifth blocks HTTP/WebSocket forwarding with a loopback-only provider; no model execution or spending.

uv lock
Passed: local package version updated to 1.0.1, no dependency version upgrades.

uv lock --project examples\skill-dogfood
Passed: local package version updated to 1.0.1, no dependency version upgrades.

uv sync --frozen --all-extras
Passed.

uv run python -m pytest "tests\contracts" "tests\unit\test_release_invariants.py" "examples\skill-dogfood\tests\offline" -q -o addopts=
Release preparation passed: 176 passed.

uv run ruff check src tests examples
Passed.

uv run ruff format --check src tests examples
Passed: 143 files formatted.

uv run pyright
Passed: 0 errors, 0 warnings.

uv run python -X utf8 -m mkdocs build --strict
Passed.

uv build --out-dir "C:\Users\stefa\.copilot\session-state\777d77f2-d244-4af8-a079-b3786f6739d2\files\release-1.0.1"
Passed: 1.0.1 wheel and sdist built; source/wheel/sdist version metadata verified equal.

uv venv "C:\Users\stefa\.copilot\session-state\777d77f2-d244-4af8-a079-b3786f6739d2\files\release-wheel-check"
Passed. Installed built wheel using uv pip; isolated interpreter verified metadata/module version 1.0.1, imports, and explicit-skills default.

git --no-pager diff --cached --check
Passed. Applicable pre-commit lint/format/type hooks passed for release preparation; all applicable hooks including docs passed for the fix.

No paid behavior/effectiveness tests or quickstart model execution were run: model spending remains forbidden. These checks establish discovery, isolation, setup failures, evidence persistence, and single-attempt behavior, not skill effectiveness. ExcelMcp remains untouched.

Related Issues

Fixes #109

Enable explicitly supplied skill directories without restoring ambient discovery. Reject global-disable conflicts, validate inputs and real SDK availability before sending, and persist separate discovery evidence with focused offline and unbilled runtime coverage.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@github-actions

github-actions Bot commented Oct 1, 2026

Copy link
Copy Markdown

Dependency Review

✅ No vulnerabilities or license issues or OpenSSF Scorecard issues found.

Scanned Files

None

Record the authorized patch release version and dated fix notes, refresh local-package locks, and align release metadata checks and docs workflow examples.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
@sbroenne
sbroenne merged commit 1dda660 into main Oct 1, 2026
10 checks passed
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.

Empty mode silently ignores explicitly supplied skills unless enable_skills is set

1 participant