T-HHR4-retire-skill-forwarders
Status: closed/done · Impact: medium · Complexity: medium
Four skill-side wrapper files survived the sweep through a scope seam:
their SKILL.md callers invoke them via ${CLAUDE_PLUGIN_ROOT}skills/…
paths — a third invocation class neither T-QL5F-skill-prose-codemod
(scoped to scripts|validators) nor T-YBKU-shim-deletion-guard
(scoped to directory deletion, gated on zero references) covered. Two
also carry real parity gaps. Finish the migration: flip the callers to
the verbs, close the parity gaps, delete the wrappers — restoring the
S-0001 end-state (skills carry only glue) and the milestone criterion
that plugin/lib imports nothing from plugin/skills/.
| Location | Role today |
|---|---|
plugin/skills/pr-check/classify_pr.ts | forwarder over the pr classify op; SKILL.md still invokes it via the skills/ path |
plugin/skills/info/info_report.ts | houses the report-building core; plugin/lib/services/plugin/ops/info.ts imports FROM it (lib→skills inversion) |
plugin/skills/setup/setup_planning.ts | retains real --obsidian/--force behavior the project setup op deliberately excluded |
plugin/skills/entities-migrate/migrate_entities.ts | wrapper over @lib/model/ops/migrate; SKILL.md invokes it via the skills/ path |
plugin/skills/pr-check/SKILL.md | skills/-path invocation (third class — outside T-QL5F’s scripts/validators grep) |
plugin/skills/info/SKILL.md | same |
plugin/skills/setup/SKILL.md | same |
plugin/skills/entities-migrate/SKILL.md | same |
Proposed
Section titled “Proposed”The four wrappers are deleted. Their SKILL.md callers invoke the verbs
(sdlc pr classify, sdlc plugin info, sdlc project setup,
sdlc entities migrate). project setup gains --obsidian/--force
parity (golden-locked against setup_planning.ts before the port). The
info-report core moves to plugin/lib/services/plugin/ and the op
imports a sibling — zero lib→skills imports. Tests that imported the
wrappers re-point to the lib homes; the legacy-path guard gains the
skills/<skill>/<helper>.ts invocation class so this third category
cannot regrow.
Approach
Section titled “Approach”- Goldens:
setup_planning.ts --obsidian/--forcebehavior on a tmp root;info_reportoutput (already op-covered, verify). - Port
--obsidian/--forceintoservices/project/ops/setup.ts; parity vs goldens. - Move the info-report core into
services/plugin/(op imports sibling); skills/info forwarder dies with its caller flip. - Flip the four SKILL.md call sites to the verbs (one commit per skill, prose gate green each).
- Re-point wrapper-importing tests (pr-check in-process classifier tests, setup eval) to lib homes; delete the four wrappers.
- Extend
check_no_legacy_script_paths.tsto also flag${CLAUDE_PLUGIN_ROOT}skills/<skill>/*.tsinvocations in SKILL.md (allowlist: none).
Files to touch
Section titled “Files to touch”| Location | Kind | Change |
|---|---|---|
plugin/lib/services/project/ops/setup.ts | modify | —obsidian/—force parity |
plugin/lib/services/plugin/ops/info.ts | modify | import sibling core, not skills/ |
plugin/skills/pr-check/SKILL.md | modify | invoke sdlc pr classify |
plugin/skills/info/SKILL.md | modify | invoke sdlc plugin info |
plugin/skills/setup/SKILL.md | modify | invoke sdlc project setup |
plugin/skills/entities-migrate/SKILL.md | modify | invoke sdlc entities migrate |
plugin/skills/pr-check/classify_pr.ts | delete | retired |
plugin/skills/info/info_report.ts | delete | core moves to lib |
plugin/skills/setup/setup_planning.ts | delete | parity ported |
plugin/skills/entities-migrate/migrate_entities.ts | delete | retired |
.claude/skills/project-check/check_no_legacy_script_paths.ts | modify | guard the skills/-helper class |
Acceptance criteria
Section titled “Acceptance criteria”- AC-1:
grep -rn "skills/" plugin/lib/→ zero import references; the four wrapper files do not exist. - AC-2:
sdlc project setup --obsidianand--forcebyte-match the pre-port goldens; setup eval green. - AC-3: the four SKILL.md files invoke only sdlc verbs; prose gate + each skill’s evals green; guard red on a planted skills/-helper invocation fixture.
- AC-4: full
bun testno new failures; tsc green; fresh-project smoke green.
Out of scope
Section titled “Out of scope”- Genuine skill glue (check_ancestry, dedup_search, ensure_ready_mutate, etc.) — stays co-located per S-0001.
- Task-lifecycle scripts (T-902K-task-transition-op-owns-commit-side-effect).
Dependencies
Section titled “Dependencies”- T-YBKU-shim-deletion-guard — the guard this extends must be merged.
Discovery context
Section titled “Discovery context”- T-YBKU’s documented deviation (PR #322): four forwarders retained because their callers use a third invocation-path class outside T-QL5F’s contract. Late member task added to M-0003 so the milestone’s “lib imports nothing from skills” criterion closes honestly.