Skip to content

De-brand, fix the manifest defects that dropped the subagent, and close the trigger collisions - #1

Merged
katekruger merged 6 commits into
mainfrom
chore/debrand-and-fix-manifest
Aug 26, 2026
Merged

katekruger merged 6 commits into
mainfrom
chore/debrand-and-fix-manifest

Conversation

@katekruger

@katekruger katekruger commented Aug 26, 2026 •

Copy link
Copy Markdown
Owner

De-brands the plugin, fixes two manifest defects that left v0.3.0 partly non-functional, eliminates the trigger collisions, and adds the missing governance, test, and CI layer.

CI is green on this branch: run 33023608790 — every step succeeded, including the CLI manifest validation and a full-history gitleaks scan.

1. What changed, by commit

refactor: remove Merget-specific branding
The pipeline was always brand-agnostic — it reads whatever is in the cached profile — but the manifest description, the brand-profile schema, and two skills named Merget directly, which made a general-purpose plugin read as one company's internal tool. Generalized the schema placeholders, the Figma design-system step, and the orchestrator's plan example and trigger phrasing.

fix: manifest defects that broke validation and dropped the subagent

  • repository was an npm-style object where the spec requires a string — validate --strict failed outright.

  • descript-editor had not loaded since v0.3.0. agents replaces its default, and every accepted form loaded zero agents:

    agents value validate loaded
    ["./agents"] (v0.3.0) fail —
    ["./agents/"], "./agents/" fail —
    ["./agents/descript-editor.md"] pass Agents (0)
    key removed pass Agents (1) ✓

    The third row is the trap: green validation, silently no agent. Both agents and commands overrides removed; all 21 components load from default paths.

  • Corrected four doc claims that outran the code.

chore: normalize author and add marketplace.json
Author was "Kate Merget" while the other three repos and the GitHub account use "Kate Kruger". Normalized, and dropped kate@merget.ai per the GitHub-only contact policy. Added marketplace.json; claude plugin marketplace add resolves it.

fix: eliminate trigger collisions — the highest-value behavioral change. Detail in §2.

chore: governance, tests, CI, and the remaining docs
SECURITY.md, CODE_OF_CONDUCT.md (Covenant 2.1, GitHub-only contact), trademark notice in LICENSE, CLAUDE.md, .version-bump.json, scripts/, tests/ (30 checks), .github/ (CI, dependabot, 3 issue templates, PR template), docs/configuration.md, docs/development.md, README restructure.

ci: validate both manifests with one expected warning allowlisted — see §3.

2. Breaking changes

Nothing was renamed. All 21 component names are unchanged, so every existing invocation still works.

Every skill and command description was rewritten, which changes when things fire. claude plugin details proved commands and skills share one 21-item selection namespace, so each command was competing with the skill it wraps.

Component Change Direction
descript-studio Dropped the "mentions Descript" catch-all plus edit/publish, which overlapped every child it routes to narrowed
descript-edit Dropped bare stems change/make it/fix/adjust/tweak, which reached cleanup, brandkit, and polish narrowed
descript-clips / descript-export Both claimed 9:16 vertical. Clips owns excerpts cut out of a longer video; export owns reframing the whole composition. Each now names the other disambiguated
All 12 skills Lead with the trigger instead of a capability summary; /video-* strings removed so each string has one owner narrowed
All 9 commands Became short action labels instead of restating their skill's trigger vocabulary narrowed

Behavioral change in the intended direction: descript-editor now loads, so approved plans hand off to the subagent as designed instead of the orchestrator running passes inline.

3. Files moved or deleted

  • docs/ARCHITECTURE.md → docs/architecture.md and docs/SKILLS.md → docs/skills.md, via two-step git mv to preserve history across a case-only rename on a case-insensitive filesystem. This was a latent bug: CLAUDE.md links docs/architecture.md, which resolved on macOS only because the FS is case-insensitive and would have broken on Linux CI.
  • Nothing deleted. dist/descript-studio.plugin rebuilt in place.

4. Verification

$ scripts/validate-manifests.sh
── marketplace manifest (strict)   ✔ Validation passed
── plugin manifest                 ✔ Validation passed with warnings
OK   both manifests validate (1 expected CLAUDE.md warning)

$ python3 tests/run_tests.py       ✔ all 30 checks passed
$ scripts/bump-version.sh --check  all 3 locations agree: 0.4.0
$ scripts/build-plugin.sh --check  OK  dist/ matches source (48 entries)
$ JSON parse                       4 files parse
$ bash -n scripts/*.sh             ok

$ claude plugin details descript-studio
  Skills (21)  descript-brand-setup … video-status
  Agents (1)   descript-editor
  MCP servers (1)  descript

Trigger-collision check: 67 distinct quoted trigger phrases, zero claimed by two components. Enforced going forward by tests/test_descriptions.py::test_no_trigger_phrase_is_claimed_twice.

Token cost: always-on ~1,603 (v0.3.0) → ~1,636. The subagent now loads (it previously contributed nothing because it wasn't loading), and the tightened descriptions offset almost all of that.

One expected warning, deliberately allowlisted

The repo root is the plugin root, so CLAUDE.md sits at the plugin root and the CLI warns it will not load as plugin context. That is correct — CLAUDE.md documents repo development, and build-plugin.sh excludes it from the bundle. Rather than dropping --strict or deleting a file the standard requires, scripts/validate-manifests.sh validates the marketplace strictly, validates the plugin manifest non-strict, and fails on any error or any other warning.

Not verified

  • No end-to-end run against a live Descript project. Nothing here was exercised against the real API. These are manifest, description, and documentation changes; I am not claiming the pipeline was re-tested.
  • Marketplace install tested locally, not end-to-end from GitHub. claude plugin marketplace add <local path> resolves the manifest; /plugin marketplace add katekruger/descriptmcp will only work once this is on main.
  • Component loading was verified by installing as a skills-directory plugin under an isolated CLAUDE_CONFIG_DIR, not through a marketplace install.

5. History findings

None. Full-history scans — mine and gitleaks in CI — found no tokens, API keys, bearer credentials, private keys, Descript project or composition IDs, or committed brand profiles. .mcp.json is Descript's documented public OAuth endpoint with no secret material. tests/test_docs.py now enforces this on every commit.

6. Follow-ups deliberately not done

  • No v0.4.0 tag. Tag after merge.
  • dist/descript-studio.plugin.zip — the double-wrapped original download. Kept for provenance and documented in dist/README.md, but only the .plugin is freshness-checked. Worth dropping eventually.
  • descript-studio's body is 525 words, over the 500 guidance. Its skill map and pipeline table could move to references/. Left alone to keep this PR's skill-body changes to zero.
  • ${CLAUDE_PLUGIN_DATA} vs ~/.descript-studio/ — the spec's data directory is arguably more correct for the brand profile, but switching orphans any existing profile. Left as-is pending your call.
  • Semantic trigger overlap is not fully automatable. The test catches identical quoted phrases; two differently-worded descriptions meaning the same thing still need human review. CLAUDE.md makes that a required step when adding a skill.

🤖 Generated with Claude Code

katekruger and others added 6 commits August 26, 2026 19:15
The pipeline was always brand-agnostic — it reads whatever is in the
user's cached profile — but the manifest description, the brand-profile
schema, and two skills named Merget directly, which made a general-
purpose plugin read as one company's internal tool.

Generalizes the brand-profile template placeholders, the Figma
design-system step, the orchestrator's plan example and trigger
phrasing, and the manifest description. Replaces the README's
Merget-flavored-defaults caveat with what actually happens on a first
run: documented fallbacks, surfaced to the user, until a profile exists.

Author and copyright are attribution, not branding, and are unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
repository was an npm-style object where the spec requires a string,
so 'claude plugin validate --strict' failed outright.

The agents override was worse. 'agents' REPLACES its default rather
than adding to it, and every accepted form loaded zero agents --
including ['./agents/descript-editor.md'], which passes --strict while
silently loading nothing. Removing the key restores default discovery.
Verified via 'claude plugin details': Agents (1) descript-editor,
where v0.3.0 reported Agents (0). The executor subagent is the centre
of the plugin's design and had not been loading since v0.3.0.

Dropped the commands override for the same reason -- it pointed at the
default path, so it was a no-op carrying replace-semantics risk. All 9
commands still load.

Also corrects four documentation claims that outran the code, adds
displayName, bumps to 0.4.0, and rebuilds dist/ to match.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The manifest, LICENSE, and README carried 'Kate Merget' while the other
three plugin repos and the GitHub account use 'Kate Kruger'. Normalizes
to Kate Kruger and drops the kate@merget.ai address, matching gtmplugin's
author block and the GitHub-only contact policy.

Adds .claude-plugin/marketplace.json so the plugin is installable with
'/plugin marketplace add katekruger/descriptmcp'. Verified the source
resolves: 'claude plugin marketplace add' succeeds against the branch.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
'claude plugin details' shows commands and skills sharing one 21-item
selection namespace, so every command competed with the skill it wraps.
Descriptions rewritten; nothing renamed, so invocation is unchanged.

Skills now lead with the trigger rather than a capability summary, and
name the boundary they do NOT own:

  descript-studio  dropped the 'mentions Descript' catch-all plus 'edit'
                   and 'publish', which overlapped every child it routes
                   to. Now scoped to a whole video with no build underway.
  descript-edit    dropped the bare stems 'change/make it/fix/adjust/
                   tweak', which reached cleanup, brandkit and polish.
                   Now scoped to one change to a video that exists.
  clips vs export  both claimed 9:16 vertical. Clips owns excerpts cut
                   out of a longer video; export owns reframing the whole
                   composition. Each states the other.

Commands became short action labels instead of restating their skill's
trigger vocabulary, so explicit invocation and natural language no longer
compete. The /video-* strings are gone from skill descriptions, so each
string has exactly one owner.

Verified: 67 distinct quoted trigger phrases, zero claimed twice; all 21
components and the subagent still load.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Closes the follow-ups listed in the previous PR body.

Governance: SECURITY.md (GitHub private vulnerability reporting, plus
what this plugin actually touches -- one HTTPS endpoint, ~/.descript-studio/,
nothing else), CODE_OF_CONDUCT.md (Contributor Covenant 2.1, GitHub-only
contact, no email anywhere), and a trademark notice appended to LICENSE
disclaiming affiliation with Descript, Inc.

Tests: 30 stdlib-only checks, no pytest. The load-bearing ones guard the
defects this repo has actually shipped -- no component-path overrides in
the manifest, no trigger phrase claimed by two components, no doc claim
that outruns the code, no secrets or real project IDs, references/ not
forked per-skill.

CI: validates BOTH manifests (once marketplace.json exists, 'validate .'
checks the marketplace and never looks at plugin.json), runs the suite,
parses every JSON file, checks version agreement and dist/ freshness, and
scans history with gitleaks. Plus dependabot and the issue/PR templates.

Version sync: .version-bump.json declares the three locations carrying the
version; scripts/bump-version.sh updates them and fails loudly on a missing
path. scripts/build-plugin.sh compares bundle CONTENTS rather than archive
bytes, since zip embeds mtimes that differ per checkout.

Docs: configuration.md and development.md added. ARCHITECTURE.md and
SKILLS.md renamed to lowercase via two-step git mv -- CLAUDE.md linked
docs/architecture.md, which resolved on macOS only because the filesystem
is case-insensitive and would have broken on Linux CI. skills.md trigger
text refreshed to match the rewritten descriptions. README gains the
subagent, configuration, refusals, development, and contributing sections,
and leads install with the marketplace path.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The repo root IS the plugin root (marketplace source './'), so CLAUDE.md
sits at the plugin root and 'claude plugin validate --strict' fails on a
warning saying it will not load as plugin context. That warning is correct
-- CLAUDE.md documents repo development and build-plugin.sh already
excludes it from the shipped bundle -- but it is not a defect to fix.

Rather than dropping --strict wholesale or deleting a file the standard
requires, scripts/validate-manifests.sh validates the marketplace strictly,
validates the plugin manifest non-strict, and fails on any error or on any
warning other than that one. A new warning still breaks the build.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@katekruger katekruger changed the title De-brand the plugin and fix the manifest defects that dropped the subagent De-brand, fix the manifest defects that dropped the subagent, and close the trigger collisions Aug 26, 2026
@katekruger
katekruger merged commit f9726dd into main Aug 26, 2026
3 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.

1 participant