Feature Description
Add a framework test that scans every registry-layout skill under skills/ and asserts:
manifest.yaml name matches the path-derived registry ID (category/skill_name from skills/<category>/<skill_name>/).
manifest.name values are globally unique across all bundled registry skills (no two manifests share the same name string).
Today we rely on folder layout and warn-only SkillwareIdentityWarning at load time (SkillLoader._validate_manifest_identity). CI does not fail if a contributor merges a mismatched or duplicate manifest.name unless that specific skill is loaded in a test with warnings promoted to errors.
Follow-up remnant from closing #12 (short-ID loader API superseded; registry integrity test still useful).
Rationale
- CONTRIBUTING requires
manifest.name = full registry ID (category/skill_name); the loader warns but does not enforce in CI.
- Agent loops and tool adapters use
manifest["name"]; drift from folder path causes subtle dispatch bugs.
- Uniqueness prevents ambiguous registry IDs if two folders ever claim the same
name (layout alone does not catch duplicate manifest strings in different paths).
- Cheap guard (~20 skills today); runs in existing
pytest tests/ CI job — no new workflow needed.
Affected paths (optional)
tests/test_loader.py (or new tests/test_registry_identity.py), skillware/core/loader.py (optional: expose _expected_registry_id helper for reuse, test-only import OK if kept private)
Implementation Idea
Add tests/test_registry_identity.py (or extend tests/test_loader.py):
- Discover skills the same way as
tests/test_skill_issuer.py (skills/**/manifest.yaml).
- For each registry-layout dir (
skills/<category>/<skill_name>/), compute expected ID and compare to manifest["name"] (strip, require non-empty).
- Collect all manifest names; assert len(names) == len(set(names)); report duplicates with both paths.
- Do not change loader behavior in v1 (keep warn-only on load); test fails on bundled registry violations.
- Optional: one parametrized test loading each bundled skill with
warnings.simplefilter("error", SkillwareIdentityWarning) — heavier; static YAML scan is enough for CI.
Acceptance criteria
Out of scope
Related: #12 (closed), tests/test_loader.py identity tests, tests/test_discovery.py shadow conflicts
Feature Description
Add a framework test that scans every registry-layout skill under
skills/and asserts:manifest.yamlnamematches the path-derived registry ID (category/skill_namefromskills/<category>/<skill_name>/).manifest.namevalues are globally unique across all bundled registry skills (no two manifests share the samenamestring).Today we rely on folder layout and warn-only
SkillwareIdentityWarningat load time (SkillLoader._validate_manifest_identity). CI does not fail if a contributor merges a mismatched or duplicatemanifest.nameunless that specific skill is loaded in a test with warnings promoted to errors.Follow-up remnant from closing #12 (short-ID loader API superseded; registry integrity test still useful).
Rationale
manifest.name= full registry ID (category/skill_name); the loader warns but does not enforce in CI.manifest["name"]; drift from folder path causes subtle dispatch bugs.name(layout alone does not catch duplicate manifest strings in different paths).pytest tests/CI job — no new workflow needed.Affected paths (optional)
tests/test_loader.py (or new tests/test_registry_identity.py), skillware/core/loader.py (optional: expose _expected_registry_id helper for reuse, test-only import OK if kept private)
Implementation Idea
Add
tests/test_registry_identity.py(or extendtests/test_loader.py):tests/test_skill_issuer.py(skills/**/manifest.yaml).skills/<category>/<skill_name>/), compute expected ID and compare tomanifest["name"](strip, require non-empty).warnings.simplefilter("error", SkillwareIdentityWarning)— heavier; static YAML scan is enough for CI.Acceptance criteria
mainpytest tests/green in CICONTRIBUTING.mdordocs/TESTING.mdpointing to the guard (optional)Out of scope
load_skill_by_id()/ short-name aliases ([Feat]: Implement Skill Library Mapping and Simplified Import Mechanism #12)index.jsonregistry mapSkillwareIdentityWarningto hard error in loader (separate issue if desired)Related: #12 (closed),
tests/test_loader.pyidentity tests,tests/test_discovery.pyshadow conflicts