Skip to content

fix(toolchain): wire the ecosystem-commands gates schema array into an actual execution step #926

Description

@kyle-sexton

Summary

docs/conventions/ecosystem-commands/ecosystem.schema.json defines a structured gates array (name/cmd/trigger-globs/remediation) that any ecosystem config — bundled or consumer-tracked — can declare. Demonstrated in docs/conventions/ecosystem-commands/examples/dotnet.yaml's nuget-lockfile-drift entry (pre-existing) and, as of PR #910, plugins/toolchain/reference/ecosystems/go.yaml's go-mod-tidy-drift entry.

Neither plugins/toolchain/skills/check/SKILL.md nor skills/lint/SKILL.md actually execute this resolved array. The only gate-execution mechanism either skill documents is "Project-declared CI-parity gates" (check/SKILL.md line ~121), which is explicitly prose-based and consumer-CLAUDE.md-only — "These live in the consumer's own conventions (its CLAUDE.md / rules / commands reference) — this plugin ships none of its own." That sentence is itself now stale once a bundled ecosystem YAML does ship a gates entry.

Net effect: a gates entry in any ecosystem config (bundled default or a consumer's own tracked .claude/ecosystems/<eco>.yaml) is currently inert — resolved as part of the four-rung ladder's command surface, never invoked by any documented workflow step.

Where this was caught

Surfaced by an automated Codex review pass on PR #910 (plugins/toolchain/reference/ecosystems/go.yaml line 42 / plugins/toolchain/skills/check/SKILL.md line 121) while adding the Go ecosystem's go-mod-tidy-drift gate. Confirmed by re-reading check/SKILL.md in full — no loop/step consumes the resolved gates field anywhere.

Scope

Cross-cutting toolchain plugin change (affects every ecosystem that declares or could declare gates, not Go-specific) — deliberately not folded into #832's PR, which is scoped to adding the Go ecosystem itself. The go-mod-tidy-drift entry in go.yaml is left in place (schema-correct, matches the existing example-fixture precedent, documents intent) — it will start actually running once this is wired up, with no further Go-specific change needed.

Suggested fix shape

Add a step to check/SKILL.md (and lint/SKILL.md if applicable) that, after resolving each affected ecosystem's command surface, iterates its resolved gates array and runs each gate.cmd when the changed-files set matches gate.trigger-globs, reporting pass/fail + gate.remediation on failure — same reporting shape already described for "project-declared" gates, just sourced from the structured array instead of requiring consumer CLAUDE.md prose. Update the stale "this plugin ships none of its own" sentence once real bundled gates exist.

Work-class: C3 (bug-fix-shaped) — attended triage 2026-07-23, operator-ratified. 🤖

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.priority: mediumReal value, no hard deadline; normal backlog flow.status: readyTriaged, unblocked, and fully specified; eligible to pick up.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions