os-sdlc / os-aidd-lint should own per-plugin lint setup for plugins that contain sdlc or aidd files #227

Open
opened 2026-08-01 20:06:08 +00:00 by jared · 2 comments
Owner

Problem

Plugins that live outside cc-os (example: the api-wrapper plugin in cc-plugins) generate code that needs project-specific, deterministic lint rules to catch AI deviation from skill instructions. The global rules that os-sdlc and os-aidd-lint already ship won't cover requirements that are specific to one plugin's generated output. Today nobody owns setting that up.

This isn't theoretical: the api-wrapper skill generated a gem that drifted from its own instructions in two ways nothing caught:

  • Skipped VCR entirely (no vcr dev dependency, no VCR.configure in test_helper), even though the skill's own templates wire VCR deliberately.
  • Generated contract tests for only 9 of 48 resource files, despite the workflow explicitly saying "Generate contract tests for each resource."

Both are cases where the instruction was correct and the AI just didn't follow it — exactly the kind of thing a deterministic lint check should catch.

Ask

os-sdlc and os-aidd-lint should be responsible for:

  1. Making sure every plugin that contains sdlc or aidd files gets project-specific linting configured.
  2. Writing their own skills for how to do that.

cc-os owns the "how" (mechanism, tooling, config format). This ticket only defines the "what" — it does not prescribe implementation.

Hint: os-status:fix should trigger the configuration setup for a plugin that qualifies but doesn't have it yet.

Baseline use cases

Two cc-plugins issues have been reframed as the first concrete rules to build and test the pipeline against:

  • cc-plugins#18 — deterministic check that a generated api-wrapper gem declares vcr as a dev dependency and has VCR.configure in test/test_helper.rb (or an explicit recorded waiver).
  • cc-plugins#22 — deterministic 1:1 check that every lib/**/resources/*.rb in a generated gem has a matching test/**/resources/*_test.rb.

Context

cc-plugins#15 proposed os-sdlc lint-init as the mechanism and is being closed in favor of this ticket. A lint-init-style mechanism may or may not already exist in cc-os — the implementer decides the actual mechanism.


Discoverer: cc-plugins, session id unavailable, 2026-08-01. Filed while triaging cc-plugins issues #15, #18, #22 during api-wrapper gem lint-drift investigation.

## Problem Plugins that live outside cc-os (example: the api-wrapper plugin in cc-plugins) generate code that needs project-specific, deterministic lint rules to catch AI deviation from skill instructions. The global rules that os-sdlc and os-aidd-lint already ship won't cover requirements that are specific to one plugin's generated output. Today nobody owns setting that up. This isn't theoretical: the api-wrapper skill generated a gem that drifted from its own instructions in two ways nothing caught: - Skipped VCR entirely (no `vcr` dev dependency, no `VCR.configure` in test_helper), even though the skill's own templates wire VCR deliberately. - Generated contract tests for only 9 of 48 resource files, despite the workflow explicitly saying "Generate contract tests for each resource." Both are cases where the instruction was correct and the AI just didn't follow it — exactly the kind of thing a deterministic lint check should catch. ## Ask os-sdlc and os-aidd-lint should be responsible for: 1. Making sure every plugin that contains sdlc or aidd files gets project-specific linting configured. 2. Writing their own skills for how to do that. cc-os owns the "how" (mechanism, tooling, config format). This ticket only defines the "what" — it does not prescribe implementation. Hint: `os-status:fix` should trigger the configuration setup for a plugin that qualifies but doesn't have it yet. ## Baseline use cases Two cc-plugins issues have been reframed as the first concrete rules to build and test the pipeline against: - cc-plugins#18 — deterministic check that a generated api-wrapper gem declares `vcr` as a dev dependency and has `VCR.configure` in `test/test_helper.rb` (or an explicit recorded waiver). - cc-plugins#22 — deterministic 1:1 check that every `lib/**/resources/*.rb` in a generated gem has a matching `test/**/resources/*_test.rb`. ## Context cc-plugins#15 proposed `os-sdlc lint-init` as the mechanism and is being closed in favor of this ticket. A `lint-init`-style mechanism may or may not already exist in cc-os — the implementer decides the actual mechanism. -------- **Discoverer:** cc-plugins, session id unavailable, 2026-08-01. Filed while triaging cc-plugins issues #15, #18, #22 during api-wrapper gem lint-drift investigation.
Author
Owner

Adding a third baseline use case, following the same reframing as cc-plugins#18 and #22.

The api-wrapper skill's template overhaul (cc-plugins#16/#27) was decided as Option B: Tier 1 infrastructure files (Scope, RequestDispatch, pagination strategies, KeyTransform, FakeAdapter, test_helper, .rubocop.yml, gemspec/Gemfile) become real, runnable Ruby templates with a single module-name substitution token, rather than a full render engine. That decision includes a companion deterministic lint rule for this pipeline:

  • Baseline use case 3 — deterministic check that Tier 1 files in a generated api-wrapper gem diff-match their source templates modulo the module name. Catches infrastructure drift (e.g. the VCR skip already described above) with zero judgment, the same way #18 and #22 do for their respective checks.
Adding a third baseline use case, following the same reframing as cc-plugins#18 and #22. The api-wrapper skill's template overhaul (cc-plugins#16/#27) was decided as Option B: Tier 1 infrastructure files (Scope, RequestDispatch, pagination strategies, KeyTransform, FakeAdapter, test_helper, .rubocop.yml, gemspec/Gemfile) become real, runnable Ruby templates with a single module-name substitution token, rather than a full render engine. That decision includes a companion deterministic lint rule for this pipeline: - Baseline use case 3 — deterministic check that Tier 1 files in a generated api-wrapper gem diff-match their source templates modulo the module name. Catches infrastructure drift (e.g. the VCR skip already described above) with zero judgment, the same way #18 and #22 do for their respective checks.
Author
Owner

Frozen in the 2026-08-16 backlog reset — see #419 for the expiry procedure. Do not work unless a live run rediscovers this issue.

Frozen in the 2026-08-16 backlog reset — see #419 for the expiry procedure. Do not work unless a live run rediscovers this issue.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jared/cc-os#227
No description provided.