Skip to content

fix(toolchain): frame dotnet.md dotnet-msbuild build-diagnostics refs as .NET forward references (#412)#583

Merged
kyle-sexton merged 3 commits into
mainfrom
fix/412-toolchain-stale-dotnet-refs
Jul 20, 2026
Merged

fix(toolchain): frame dotnet.md dotnet-msbuild build-diagnostics refs as .NET forward references (#412)#583
kyle-sexton merged 3 commits into
mainfrom
fix/412-toolchain-stale-dotnet-refs

Conversation

@kyle-sexton

@kyle-sexton kyle-sexton commented Jul 20, 2026

Copy link
Copy Markdown
Contributor

Summary

plugins/toolchain/skills/check/context/dotnet.md lists dotnet-msbuild:* build-diagnostics plugin skills (build-perf-diagnostics, binlog-failure-analysis, msbuild-antipatterns, and others) under a ## Marketplace plugin skills for build diagnostics (invoke only when installed) presence gate. No dotnet-* plugin ships in this marketplace today — but per the ratified #412 disposition (maintainer answer 2026-07-19, control-tower relay 2026-07-20) these are optional FORWARD references to the maintainer's planned dotnet-* plugin family (.NET is the primary application stack), not stale references to remove.

Fix

Add a lead-in to the presence-gated list that frames it as .NET-ecosystem skills — applicable when the stack is .NET — and as forward references to the planned dotnet-* family: invoke each only when its plugin is installed, otherwise fall back to the section's own prose remediation and binlog gotcha (the generic path stays first-class).

Framing only — the ratified disposition is keep tool names + stack framing, presence-gate forward references, no reference removal:

  • Every dotnet-msbuild:* skill name is kept verbatim.
  • Nothing is removed, renamed, or genericized.
  • No command string is altered (dotnet build /bl:{} unchanged).

This matches the presence-gated forward-reference convention the merged siblings #491 (testing) and #526 (verification, issue #422) adopted — each added a ".NET-ecosystem plugin skills — applicable when your stack is .NET" framing line over the same dotnet-*/dotnet-diag:* lists.

Bumps toolchain 0.4.2 → 0.4.3 (patch) with a matching ### Changed CHANGELOG entry.

Rework note

An earlier revision of this branch took the OPPOSITE approach — it genericized the dotnet-msbuild:* names into ecosystem-neutral capability descriptions, reading #412's original "replace with capability descriptions" fix-direction literally. The control-tower ruling relayed on this PR (2026-07-20) identified that as the inverse of the ratified disposition and required rework to the #491/#526 keep-tool-names pattern. This revision implements that rework. Sibling PR #580 (issue #405, implementation) is governed by the same ruling.

Verification

Cumulative branch diff vs main is exactly: the framing lead-in sentence, the version bump, and the CHANGELOG entry — no other change to dotnet.md.

Validators run on the merged tree (branch rebased current via a main merge), all clean, nothing suppressed:

markdownlint-cli2 (dotnet.md, CHANGELOG.md)        0 error(s)
typos (3 touched files)                            exit 0
editorconfig-checker (3 touched files)             exit 0
check-skill-portability.sh origin/main             No unexcused coupling tokens in 1 skill file(s)
validate-plugins.sh                                All plugin manifests and the catalog validated
validate-plugin-contracts.mjs                      33 setup skills and 1758 plugin files checked

Closes #412

Related

🤖 Generated with Claude Code

…net.md with capability descriptions (#412)

The `.NET` check context (`plugins/toolchain/skills/check/context/dotnet.md`)
listed `dotnet-msbuild:*` plugin skills under an "invoke only when installed"
gate. No `dotnet-*` plugin ships in this marketplace and none is registered in
`.claude-plugin/marketplace.json`, so the presence gate could never open for any
consumer — the refs pointed at skills nobody can install.

Replace the tool-specific `plugin:skill` names with ecosystem-neutral capability
descriptions (build-performance diagnosis, binlog failure analysis, MSBuild
anti-pattern scanning, bin/obj output-path clash detection) that resolve against
whatever diagnostics plugin a consumer actually has installed, and reword the
gate so it no longer presumes a named plugin. The .NET-flavored capability
signal and the fallback-to-prose convention are kept intact.

Bumps `toolchain` 0.4.2 -> 0.4.3 (patch) and adds the CHANGELOG entry.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@kyle-sexton kyle-sexton added the automated Opened by automation. label Jul 20, 2026
@claude

claude Bot commented Jul 20, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 21s —— View job


PR Review #583 — fix(toolchain): replace stale dotnet-msbuild plugin-skill refs

Tasks

  • Gather context and understand the request
  • Read changed files and diff
  • Review for correctness, security, and CLAUDE.md alignment
  • Post findings

Summary

The fix is correct and the premise is verified. No dotnet-* plugin exists in this marketplace — grep confirms the dotnet-msbuild:* strings appear only in prose context files across the repo, never in an installable plugin manifest. The three-file change achieves its stated goal cleanly.


plugins/toolchain/skills/check/context/dotnet.md

Heading reword (line 72) — "invoke only when installed" → "invoke when an installed plugin provides them" is clearer about the condition (the skill must exist in what's installed, not just that something is installed).

Intro paragraph (line 74) — "fall back to the prose remediation and the binlog gotcha above" cross-references the ## Gotchas bullet at line 50. The phrase works top-to-bottom but "the binlog gotcha above" is informal and could be ambiguous to a reader skimming to this section. Minor, not blocking.

Binlog command (line 77) — Old text used dotnet build /bl:{} (the {} placeholder was awkward prose); the new dotnet build -bl matches the Gotchas section at line 50 exactly. This is a quiet correctness improvement.

Actionability trade-off — Genericizing to capability descriptions removes the plugin:skill hook a consumer could call directly. This is the right call here (the named plugin doesn't exist), but it means a consumer who does have a compatible plugin has to guess the skill name. That's unavoidable given the absence of a published dotnet-msbuild plugin; the gate text mitigates it by describing what to look for.


plugins/toolchain/.claude-plugin/plugin.json

Version bump 0.4.2 → 0.4.3 is appropriate: patch level for a content-only fix in a context markdown file. No structural change to the manifest.


plugins/toolchain/CHANGELOG.md

Entry follows Keep a Changelog format correctly (### Fixed, present-tense description, issue reference). The explanation is thorough and accurately describes both what was removed and what replaced it. One cosmetic note: the entry is unusually long for a changelog bullet (about 10 lines of wrapped prose). That's a style choice, not an error — the existing 0.4.2 entries follow the same verbose pattern.


Convention inconsistency (flagged by author, no action needed here)

The PR description correctly notes that siblings #491 (testing) and #526 (verification, issue #422) merged with the opposite approach — keeping dotnet-msbuild:* / dotnet-diag:* skill names with a stack-framing line. My grep confirms those files still carry named references:

The author is right to flag this for maintainer reconciliation. The two conventions are genuinely incompatible: either named skills are valid references (keep them, add framing) or they're broken references (genericize). This PR correctly applies the genericize path to the one file that's its scope.


Verdict

No blocking issues. The fix is correct, the version bump is appropriate, and all three files are internally consistent. The convention inconsistency across the broader plugin set is real and documented — it's a maintainer-level reconciliation item (#412's linked siblings), not a defect in this PR.

@kyle-sexton

Copy link
Copy Markdown
Contributor Author

Control-tower ruling relay (2026-07-20) — REWORK REQUIRED before ready-flip. This draft implements the genericized style, which is the OPPOSITE of the ratified #412 disposition (maintainer + relay, 7/19): KEEP tool names + stack framing, presence-gate forward references per the #491/#526 conforming pattern, no reference removal. Rework the diff to that pattern, then proceed with the normal post-green flow. Same ruling governs sibling PR #580 (#405).

kyle-sexton added a commit that referenced this pull request Jul 20, 2026
…efs, keep tool names (#405)

Rework per the control-tower ruling relay (2026-07-20) on this PR: the ratified
#412 disposition governing #405 requires KEEPING the dotnet-* tool names and the
presence gate, presence-gating the forward references, and adding stack-qualified
framing — not genericizing the references away.

The prior commit on this branch genericized the three mode-context marketplace
sections into ecosystem-neutral capability descriptions, which is the OPPOSITE of
the disposition. Restore each context file's `## Marketplace plugin skills (invoke
only when installed)` heading and its exact dotnet-* bullets, and add a lead-in
that frames those skills as .NET-ecosystem forward references — invoked only when
your stack is .NET and the plugin is installed — with an explicit fallback to the
project's own tooling so the generic path stays first-class. This matches the
conforming testing (#491) and verification (#526) pattern. No reference removal;
every reference stays optional and installed-gated.

CHANGELOG 0.7.3 entry rewritten to describe the stack-qualification rework; version
bump 0.7.2 -> 0.7.3 (from current origin/main) unchanged.

Sibling PR #583 (toolchain, issue #412) is reworked in parallel under the same ruling.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
kyle-sexton and others added 2 commits July 20, 2026 02:24
…ard references (#412)

Reverses this branch's earlier genericized approach, which implemented the
OPPOSITE of the ratified #412 disposition. Per the maintainer ruling (relayed
2026-07-20): the `dotnet-msbuild:*` build-diagnostics skills in
`plugins/toolchain/skills/check/context/dotnet.md` are optional FORWARD
references to the maintainer's planned `dotnet-*` plugin family — keep the tool
names, presence-gate them, add stack framing, and never remove a reference.

Restore every `dotnet-msbuild:*` skill name and the `## Marketplace plugin
skills for build diagnostics (invoke only when installed)` heading, and add a
lead-in that frames the list as .NET-ecosystem skills applicable when the stack
is .NET and as forward references to the planned family — invoked only when the
plugin is installed, otherwise falling back to the section's own prose
remediation and binlog gotcha (the generic path stays first-class). This matches
the presence-gated forward-reference convention the merged `testing` (#491) and
`verification` (#526) siblings adopted.

Framing only: no skill reference is removed, renamed, or genericized, and no
command string is altered. The CHANGELOG entry is rewritten to a `### Changed`
note describing the reframing; version stays at the 0.4.3 bump.

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@claude

claude Bot commented Jul 20, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 3m 4s —— View job


PR #583 — Rework complete: conforming pattern applied

Tasks


The rework was completed in commit 67571b3 and the branch is in the correct state. No further changes are needed.

What was done

plugins/toolchain/skills/check/context/dotnet.md — The genericized approach was reversed. Section now reads:

## Marketplace plugin skills for build diagnostics (invoke only when installed)

These are .NET-ecosystem plugin skills — applicable when your stack is .NET — and forward references
to the planned `dotnet-*` plugin family: invoke each only when its plugin is installed, otherwise fall
back to the prose remediation and the binlog gotcha above.

- **Slow builds** — `dotnet-msbuild:build-perf-diagnostics` for bottleneck analysis via binary logs,
  `dotnet-msbuild:build-perf-baseline` for before/after measurement
- **Build failures** — `dotnet-msbuild:binlog-failure-analysis` to diagnose opaque MSBuild errors,
  `dotnet-msbuild:binlog-generation` for binary log capture (`dotnet build /bl:{}`)
- **Build config issues** — `dotnet-msbuild:msbuild-antipatterns` for AP-01 through AP-21,
  `dotnet-msbuild:check-bin-obj-clash` for OutputPath conflicts

All dotnet-msbuild:* skill names are kept. Framing only — no reference removed, renamed, or genericized. This matches the testing (#491) and verification (#526) conforming siblings exactly.

plugins/toolchain/CHANGELOG.md — Entry changed from ### Fixed + "stale cross-plugin coupling removed" to ### Changed + "Presence-gated dotnet-msbuild:* build-diagnostics references reframed as .NET-ecosystem forward references." Framing-only change, no removal.

plugins/toolchain/.claude-plugin/plugin.json — Version remains 0.4.3 (patch bump is appropriate for the content-only context file change).

Pattern conformance check

Convention #491 sibling #526 sibling This PR
invoke only when installed header
.NET-ecosystem stack framing
dotnet-msbuild:* names kept
Fallback-to-prose instruction
No reference removed

The PR is aligned with the ratified #412 disposition and ready for the normal post-green flow.

@kyle-sexton kyle-sexton changed the title fix(toolchain): replace stale dotnet-msbuild plugin-skill refs in dotnet.md with capability descriptions (#412) fix(toolchain): frame dotnet.md dotnet-msbuild build-diagnostics refs as .NET forward references (#412) Jul 20, 2026
@kyle-sexton

Copy link
Copy Markdown
Contributor Author

Rework complete — now conforms to the ratified #412 disposition. (Kept DRAFT for the owning lane's post-green ready-flip.)

What changed vs the flagged revision. The prior diff genericized the dotnet-msbuild:* names into ecosystem-neutral capability descriptions — the OPPOSITE of the ruling. This revision reverses that and applies the #491/#526 pattern instead.

Compliance with the ruling (keep tool names + stack framing, presence-gate forward references, no reference removal):

Diff shape. Cumulative vs main = framing lead-in sentence + 0.4.2 → 0.4.3 bump + ### Changed CHANGELOG entry. Nothing else in dotnet.md moved.

Base + CI. Branch merged up to current origin/main (append-only, clean — the main-ahead commits don't touch toolchain), so the base is current. Local validators all green: markdownlint, typos, editorconfig, check-skill-portability.sh, validate-plugins.sh, validate-plugin-contracts.mjs. CI running.

Commits. 67571b3 (rework) + ffe16d7 (merge main), on top of the branch's original b7b8a9f. Squash-merge repo, so history collapses to the PR title on merge. No review threads were open to resolve.

Sibling PR #580 (#405, implementation) is governed by the same ruling.

@kyle-sexton
kyle-sexton marked this pull request as ready for review July 20, 2026 06:30
@claude

claude Bot commented Jul 20, 2026

Copy link
Copy Markdown

Claude finished @kyle-sexton's task in 1m 31s —— View job


PR Review #583 — fix(toolchain): frame dotnet.md dotnet-msbuild build-diagnostics refs as .NET forward references

Tasks

  • Gather context and understand the request
  • Read changed files and diff
  • Review for correctness, pattern conformance, and CLAUDE.md alignment
  • Post findings

Summary

The fix is correct and properly implements the ratified #412 disposition (keep tool names + stack framing + forward reference language, no removal). Three-file change: 2 lines added to dotnet.md, version bump, and CHANGELOG entry.


plugins/toolchain/skills/check/context/dotnet.md

Heading (line 72) — ## Marketplace plugin skills for build diagnostics (invoke only when installed) is appropriate: the "for build diagnostics" qualifier is specific to this section's scope, and the (invoke only when installed) presence gate is preserved verbatim. This diverges slightly from the sibling heading style (## Marketplace plugin skills (invoke only when installed)) but the narrower qualifier is accurate here.

Lead-in sentence (line 74) — The wording is longer than sibling framing lines but carries additional information the siblings don't need: the "forward references to the planned dotnet-* plugin family" qualifier is specific to this file's situation (no dotnet-msbuild:* plugin ships in this marketplace today) and correctly contextualizes the skill names as forward references, not stale coupling. The "otherwise fall back to the prose remediation and the binlog gotcha above" fallback is a useful consumer instruction and cross-references the Gotchas section at line 50.

All 6 dotnet-msbuild:* names preservedbuild-perf-diagnostics, build-perf-baseline, binlog-failure-analysis, binlog-generation, msbuild-antipatterns, check-bin-obj-clash (lines 76–78). Nothing removed, renamed, or genericized. ✓

dotnet build /bl:{} (line 77) — unchanged from original, consistent with the PR's "no command string altered" guarantee. Note: the Gotchas section at line 50 uses the shorter -bl flag while this bullet uses /bl:{} (a path-argument form with a placeholder). These are distinct but both valid MSBuild invocations — the /bl:{} form conveys that binlog-generation can target a specific output path. Pre-existing inconsistency, not introduced by this PR.


Pattern conformance vs. sibling files

Grepping the merged siblings confirms the framing convention is present:

File Heading Lead-in
testing/…/investigate.md (invoke only when installed) "These are .NET-ecosystem plugin skills — applicable when your stack is .NET:"
verification/…/performance.md (invoke only when installed) "These enrichment skills are stack-specific — the dotnet-* skills apply when your stack is .NET…"
verification/…/metrics.md (invoke only when installed) "These are .NET-ecosystem plugin skills — invoke each only when your stack is .NET and its plugin is installed…"
This PR toolchain/…/dotnet.md for build diagnostics (invoke only when installed) "These are .NET-ecosystem plugin skills — applicable when your stack is .NET — and forward references…"

The lead-in here is the longest and adds the "forward references to the planned dotnet-* plugin family" phrase. Given that this file's skill names have no backing plugin yet (confirmed: no dotnet-msbuild or dotnet-* manifest exists in the repo), the explicit forward-reference framing is the right call and distinguishes this from the siblings where the skills may be installable.


plugins/toolchain/.claude-plugin/plugin.json

Version 0.4.2 → 0.4.3 is correct: patch bump for a content-only context file change. No structural manifest change. ✓


plugins/toolchain/CHANGELOG.md

Entry at [0.4.3] ### Changed (lines 6–19) follows Keep a Changelog format. ### Changed is the correct category (framing addition, not a defect fix). The description accurately conveys "framing only — no skill reference removed, renamed, or genericized." The entry is verbose but matches the existing style of prior entries in this file.


CLAUDE.md alignment

Criterion Status
Repo-agnostic — no hardcoded paths or repo names
Plugin-form-safe — no ../ reach-outs or state outside ${CLAUDE_PLUGIN_ROOT}
Versioned — explicit semver bump present
PR title follows Conventional Commits
Squash-merge safe — history collapses cleanly

Verdict

No blocking issues. The diff is minimal and correct: 2 lines added to dotnet.md, a version bump, and a CHANGELOG entry. The forward-reference framing accurately describes the situation and conforms to the ratified disposition. Ready for the normal post-green flow.

@kyle-sexton
kyle-sexton merged commit b482da3 into main Jul 20, 2026
20 checks passed
@kyle-sexton
kyle-sexton deleted the fix/412-toolchain-stale-dotnet-refs branch July 20, 2026 06:34
kyle-sexton added a commit that referenced this pull request Jul 20, 2026
…or refs ecosystem-neutral (#580)

## Summary

Reworked per the ratified #412 disposition (which governs #405): the
implementation plugin's mode-context files KEEP their `dotnet-*`
marketplace-skill names and the `## Marketplace plugin skills (invoke
only when installed)` presence gate, and gain a stack-qualified lead-in
with a generic-path fallback — the #491/#526 conforming pattern. An
earlier revision of this branch genericized/renamed those references;
that approach was rejected by the maintainer ruling and has been fully
reverted (commit 08f8e2c).

## Fix

- feature.md / bugfix.md / refactor.md: all six `dotnet-*` skill
references retained verbatim under the intact presence-gated heading; a
.NET-ecosystem forward-reference lead-in added ("stack-qualified, invoke
only when installed, otherwise the generic path applies"). No reference
removal, no renames, no command-string changes.
- CHANGELOG [0.7.3]: describes the stack-qualification accurately
("retain their dotnet-* names… No reference removal").
- plugin.json 0.7.2 → 0.7.3 (patch, from current main).

## Verification

- CI green (all checks incl. portability-lint); the review bot
independently re-reviewed the reworked diff and confirmed conformance to
the #491/#526 pattern and the #412 disposition.
- Zero review threads; `git diff origin/main` on the three context files
shows only heading-preserved + lead-in-added.

Closes #405

## Related

- #412 (the governing maintainer disposition; sibling PR #583 applies
the same ruling to toolchain/dotnet.md)
- #491 / #526 (merged precedent pattern for presence-gated
stack-qualified references)

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

automated Opened by automation.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

toolchain: dotnet.md references dotnet-msbuild:* plugin skills that do not exist in this marketplace

1 participant