fix(catalog): stop double-prefixing praxis-* skills; teach the namespace rule - #67
Draft
anshulsao wants to merge 2 commits into
Draft
fix(catalog): stop double-prefixing praxis-* skills; teach the namespace rule#67anshulsao wants to merge 2 commits into
anshulsao wants to merge 2 commits into
Conversation
|
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Comment |
PrefixedName() unconditionally concatenated "praxis-" onto the catalog
name. Two agent-factory seed skills are authored as "praxis-dag" and
"praxis-dag-runner", so they landed on disk as praxis-praxis-dag and
praxis-praxis-dag-runner.
That is user-visible, not just cosmetic: the Praxis UI generates pickup
prompts that say "Use the praxis-dag skill" (ui/src/components/dag/
pickupPrompt.ts), so the name it hands the user never matched the folder
the CLI installed.
Collapse when the catalog name already carries the prefix. This is safe:
- the reserved-namespace invariant the cleanup globs rely on is only
that an installed folder LIVES IN the praxis- namespace, which holds
either way (asserted by a new test);
- nothing reverse-maps a folder name back to its catalog name by
stripping exactly one prefix (verified: no TrimPrefix on the prefix
constants anywhere in the tree);
- praxis-praxis-dag is receipt-tracked and is not a meta-skill, so the
wipe-and-reinstall in runPostAuthSetup removes the stale dir before
the corrected name is installed. Both `praxis login` and
`praxis refresh-skills` go through that path, so either heals an
existing install — no manual cleanup needed.
Only an exact prefix match collapses — "my-praxis-dag" and "praxisdag"
are still prefixed. Applied to agentcatalog too, which had the identical
concatenation.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LpVxm5k6cuVWnz5pKsFUdT
anshulsao
force-pushed
the
fix/skill-double-prefix
branch
from
August 4, 2026 04:51
a4fd72c to
5094579
Compare
Catalog skills are installed as praxis-<name>, but their bodies cross-reference each other by the BARE name. 17 such references exist across 5 installed skills, and none of them resolve: praxis-build-facets-module → /design-facets-module ×5, /modules-repo-workflow ×3 praxis-design-facets-module → /build-facets-module ×3, /modules-repo-workflow ×1 praxis-facets-module-testing → /modules-repo-workflow ×1 praxis-modules-repo-workflow → /build-facets-module ×1, /facets-module-testing ×1 praxis-memory → /memory ×2 These are load-bearing, not incidental. praxis-build-facets-module opens with "STOP — Have you completed the /design-facets-module skill?" and praxis-design-facets-module ends with "Proceed to /build-facets-module", so the design → build → test → publish handoff chain dead-ends at every hop. praxis-memory shows the same bug reaches binary-embedded content, so fixing only the server-side seeds would not have covered it. Rather than rewriting every reference at render time — which would have to re-run on content the CLI does not own and would silently rot as new skills add new cross-refs — state the resolution rule once in the meta-skill the host loads first: the prefix is provenance, skills name each other bare, resolve /X to praxis-X. Guarded by TestPraxisMetaSkill_TeachesPrefixResolutionRule. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LpVxm5k6cuVWnz5pKsFUdT
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.
Two related defects in how catalog skills get named on disk.
1. Double prefix
PrefixedName()unconditionally concatenatedpraxis-onto the catalog name. Two agent-factory seed skills are authored aspraxis-dag/praxis-dag-runner, so they installed as:User-visible, not cosmetic: the Praxis UI generates pickup prompts saying "Use the
praxis-dagskill" (ui/src/components/dag/pickupPrompt.ts,DagRunsPage.tsx) — a name that never existed on disk. Of the nine seeds inanthropic_agents/seeds/skills/, these two are the only prefixed ones.Fix: collapse when the name already carries the prefix, in both
skillcatalogandagentcatalog(identical concatenation in each). Only an exact prefix match collapses —my-praxis-dagandpraxisdagare untouched.Why safe: the existing test asserted the double-prefix deliberately, reasoning it "keeps the rule 'if it starts with praxis-, the CLI installed it' mechanical." Collapsing preserves that invariant — the folder still lives in the namespace. Also verified: no
TrimPrefixanywhere reverse-maps a folder name back to a catalog name, andpraxis-praxis-dagis receipt-tracked and not a meta-skill, sowipePrevProfileSkillsremoves it before the corrected name installs. NewTestPrefixedName_AlwaysInReservedNamespacepins the invariant so it can't silently regress.Upgrade path: no manual cleanup. Both
praxis loginandpraxis refresh-skillsrunrunPostAuthSetup, which wipespraxis-*and reinstalls — either heals an existing install.2. Cross-references between skills never resolve
Catalog skills are installed as
praxis-<name>but their bodies reference each other by the bare name. 17 such references across 5 installed skills, none of which resolve:/design-facets-module×5,/modules-repo-workflow×3/build-facets-module×3,/modules-repo-workflow×1/modules-repo-workflow×1/build-facets-module×1,/facets-module-testing×1/memory×2Load-bearing, not incidental —
praxis-build-facets-moduleopens with "STOP — Have you completed the/design-facets-moduleskill?" andpraxis-design-facets-moduleends with "Proceed to/build-facets-module". The design → build → test → publish handoff chain dead-ends at every hop.praxis-memoryhits it too, so this reaches binary-embedded content — fixing only the server-side seeds wouldn't have covered it.Fix: rather than rewriting every reference at render time (which would have to run over content the CLI doesn't own, and would rot as new skills add new cross-refs), state the resolution rule once in the meta-skill the host loads first: the prefix is provenance, skills name each other bare, resolve
/X→praxis-X.Testing
go build ./...,go vet ./...,gofmt -l .cleango test ./...greenpraxis-praxis-dag,praxis-praxis-, and the missing namespace guidance) and pass afterNot exercised against a live control plane — no end-to-end
praxis loginround-trip was run.🤖 Generated with Claude Code
https://claude.ai/code/session_01LpVxm5k6cuVWnz5pKsFUdT