You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Proposed fix for issue #4273, applying the remediation from the bug assessment.
Verdict: valid · Severity: medium
Summary
Generated skill files are now written and recorded atomically through IntegrationManifest.record_file, eliminating the write-then-rehash gap. Skills setup also verifies that every generated SKILL.md has a corresponding manifest entry, with regression coverage for fresh setup and re-init over an existing installation.
Changes
File
Change
Notes
src/specify_cli/integrations/base.py
modified
Use record_file for normalized skill writes and fail loudly if generated skills are missing from the manifest.
Verify all generated skills are tracked and re-init records the newly added converge skill.
tests/integrations/test_integration_claude.py
modified
Verify the Claude manifest includes every generated skill, including converge.
Tests Added or Updated
SkillsIntegrationTests.test_all_skill_files_are_tracked_in_manifest — pins the generated-to-manifest inverse relationship.
SkillsIntegrationTests.test_reinit_tracks_new_skill_over_existing_install — covers a pre-existing nine-skill installation and the newly generated converge skill.
TestClaudeIntegration.test_setup_tracks_every_skill_in_manifest — verifies the Claude-specific manifest includes converge.
The reason will be displayed to describe this comment to others. Learn more.
Added a negative test where the writer creates and returns SKILL.md without recording it; setup now raises and identifies missing paths. Commit: 9555b02.
The reason will be displayed to describe this comment to others. Learn more.
Added Hermes-specific overrides using an isolated home directory. They verify that Hermes global skills remain untracked in the project manifest, including on re-init. Commit: 9555b02.
Test Claude setup rejects project-local skills symlink
src/specify_cli/integrations/base.py:1843
Keeping this destination lexical lets manifest validation reject project-local symlinked skill directories, as required by design/integration.md:306–309. The new helper tests do not protect this setup-level behavior: restoring .resolve() here would hide a linked .claude/skills directory while those tests still passed. Kimi's setup test rejects links in its own pre-check.
Add a Claude setup test linking .claude/skills to an empty directory inside the project. Assert that setup raises ValueError matching symlinked, the target remains empty, and the manifest records no files. This covers the prevented behavior required by CONTRIBUTING.md:229–235.
AI-generated review for the requester by GitHub Copilot (model: unknown; automated mode).
Test fallback with lexical and resolved aliased destinations
tests/integrations/test_base.py:236
This test builds dest from the alias, so it never exercises the new fallback at base.py:689–690. Markdown, TOML, YAML, Forge, and Generic setup resolve their destinations before calling the shared writer; with an aliased project root, they need that fallback to succeed. Parameterize this test with both lexical and resolved destinations to protect both supported paths, as required by CONTRIBUTING.md's “Testing deterministic behavior” section.
AI-generated review for the requester by GitHub Copilot (model: unknown; automated mode).
Added Claude setup-level coverage proving a project-local .claude/skills symlink is rejected without writing through the link or recording manifest ownership.
Parameterized the aliased-project-root writer test to cover both lexical and resolved destination paths.
Confirmed the earlier ownership-metadata fixture remapping, Hermes global-skill overrides, and unrecorded-skill rejection coverage remain present.
Posted on behalf of @mnriem. Generated with GitHub Copilot using GPT-5.6 Sol in autonomous mode; implementation, test execution, and review-round summary were AI-generated.
This branch has not been deployed
No deployments
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
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.
Bug fix — converge-missing-manifest
Proposed fix for issue #4273, applying the remediation from the bug assessment.
Verdict: valid · Severity: medium
Summary
Generated skill files are now written and recorded atomically through
IntegrationManifest.record_file, eliminating the write-then-rehash gap. Skills setup also verifies that every generatedSKILL.mdhas a corresponding manifest entry, with regression coverage for fresh setup and re-init over an existing installation.Changes
src/specify_cli/integrations/base.pyrecord_filefor normalized skill writes and fail loudly if generated skills are missing from the manifest.tests/integrations/test_integration_base_skills.pytests/integrations/test_integration_claude.pyTests Added or Updated
SkillsIntegrationTests.test_all_skill_files_are_tracked_in_manifest— pins the generated-to-manifest inverse relationship.SkillsIntegrationTests.test_reinit_tracks_new_skill_over_existing_install— covers a pre-existing nine-skill installation and the newly generated converge skill.TestClaudeIntegration.test_setup_tracks_every_skill_in_manifest— verifies the Claude-specific manifest includes converge.Local Verification
python3 -m compileall -q src/specify_cli/integrations/base.py tests/integrations/test_integration_base_skills.py tests/integrations/test_integration_claude.py→ passed.git diff --check→ passed.pytestis not installed in the available Python environment; no dependencies were installed.Deviations from Assessment
None.
Risks & Review Notes
Refs #4273 · cc
@jabelkAssisted-by: GitHub Copilot (model: gpt-5.2-codex, autonomous)