Repository navigation
fix(skills): a library skill marked user-invocable: false is reported that way (#3134) - #3422
Merged
Merged
Conversation
The platform contract parser read only `user_invocable`, while Claude Code, the skill libraries and the agent server use `user-invocable`. A library skill marked `user-invocable: false` was therefore reported invocable by GET /api/skills/library and MCP list_skills. Read both spellings per source through the existing `_first_present` helper (hyphen first), so a `trinity:` block still wins whichever spelling either level uses and a null value masks nothing. Non-bool values still read as invocable. Wire name stays `user_invocable`. Mutation check (scratch copy): the issue's literal merged-scope form turns [trinity-underscore-beats-flat-hyphen] and [null-hyphen-does-not-mask] red; the underscore-only original turns [hyphen], [trinity-hyphen-beats-flat-underscore], [flat-hyphen-beats-underscore] and [hyphen-wins-in-trinity] red. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
trinity-ability
approved these changes
Oct 9, 2026
trinity-ability
left a comment
Contributor
There was a problem hiding this comment.
merge-train: batch validated on train/20261009-0735 (#3424)
4 of 5 tasks
webmixgamer
added a commit
that referenced
this pull request
Oct 9, 2026
Brings the branch up to ed59049 (12 commits, incl. #3406 public-link sessions, #3422 `user-invocable:` in the library, #3418 safe_yaml). One conflict, in docs/user-docs/automation/skills-and-playbooks.md: this PR's prose kept, with the `user-invocable:` key spelling (the hyphen is the only spelling the agent server reads). The Skills flow's Run table now names the listing field and the frontmatter key apart. PublicChat.vue merged cleanly with #3406 (this PR's "/ for skills" placeholder kept). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.
Fixes #3134 — independent fix, one of ten small bug fixes in the trinity-pm
chain-easy-1008run. Base isdev. Draft until the operator merges.What
src/backend/services/skill_packaging.py::extract_contract:user_invocableis read with the existing_first_present(sources, ("user-invocable", "user_invocable")). A library skill markeduser-invocable: false(the Claude Code frontmatter spelling, the only one the agent server reads) is now reporteduser_invocable: falseonGET /api/skills/libraryand MCPlist_skills. The wire name staysuser_invocable; the underscore spelling keeps working.trinity:block wins over both flat spellings, whichever spelling it uses; within one level the hyphen wins; a present-but-null key does not hide the other spelling; a non-bool still reads asTrue.docs/memory/feature-flows/skill-injection.md,docs/memory/requirements/skills.md, anddocs/user-docs/automation/skills-and-playbooks.md(the user doc taught the underscore spelling, which the agent server never reads).tests/unit/test_ent183_skill_packages.py.Rulings carried (orchestrator, on the operator's behalf — plan file)
_first_presentover the sources, not the issue's suggested one-liner — as recommended. The one-liner reads the merged dict, so a flat hyphen key would beat atrinity:block that uses the underscore, breaking the acceptance criterion "atrinity:block still wins". The sweep confirmed it: with the one-liner in place, two of the eight cases fail.allowed-toolsstays out — as recommended; see Handoffs.Review + security
/reviewreading pass (claude-fable-5-1, report-only): MERGEABLE, zero critical. Every reader of the platform-side flag is display or catalog only (Library → Skills chip, the agent Skills tab chip, MCPlist_skills). Everything that gates execution, connector exposure or portal hints reads the agent server's own parser, which this branch does not touch; assignment never consults the flag./cso --diff: no findings.Correction to the issue (review I1): on the library's current tip only
project-intakecarriesuser-invocable: false.adjust-playbookis explicitlytrueandskill-builderhas no key. One chip flips, not three.Fixed after review:
d44b207a— I2, the user-doc line.Evidence sweep after the fix (claude-opus-5-5): all 10 unit files that import
skill_packagingran shuffled (seed 12345), one file per process — 387 passed, 1 failed. The failure istest_ent236_skills_lifecycle.py::TestNonRepoDirectoryRecovers::test_real_repo_still_pulls('cloned' == 'pulled'). It fails the same way ondevf6bedcd on the engineer, without shuffling, and it testsskill_source_clone, which this branch does not change; it looks environment-dependent (real git against the test's empty fake.git). The builder marked the sweep RED on principle; nothing this branch touches is red. Withdev's parser, four of the eight spelling cases fail.git merge-treeagainstdevis clean.Tests
Counts above. Not run here: the full unit island (CI).
Before merge
feature/754-skills-tab-merge) indocs/user-docs/automation/skills-and-playbooks.md— a one-line edit here against that PR's rewrite of the same section. Whichever lands second keeps the hyphen spellinguser-invocable:on that line. feat(skills): one Skills tab — own and shared skills, Run, Requires approval (abilityai/trinity-enterprise#754) #3412's edits to the twodocs/memoryfiles merge cleanly, as does fix(url-validation): a token in a protocol-relative skills-library URL is refused, not stored (#3323) #3420's edit to the shared test file.test_real_repo_still_pulls: if it is green there, the failure above is the engineer's environment only.Handoffs (not in this diff)
allowed-tools(skill_packaging.py, around line 208) has the same cross-spelling flaw.abilityai/trinity-skillstools/validate.pyruns a copy of this parser pinned by SHA. It asserts only onfrontmatter_invalid*warnings, so nothing it expects changes; the library picks the new behaviour up when that pin moves.🤖 Generated with Claude Code