M130 — CC release-notes auto-adoption pipeline

Closes #1486 + #1487 + #1488. Trace what happens when a new CC version drops upstream.

Cron 0 14 * * * UTC Soft-LLM dependency N + 3 minors policy

1. Inputs

2. Pipeline stages

3. Resulting state

4. Gap-score table (when LLM extraction fires)

FeatureCategoryScoreAffected skillsAction
Threshold: gap_score >= 10 opens a labeled cc-adoption issue. Lower scores stay in cc-adoption-gaps.json for a future re-score.

5. The three SoTs that keep this honest

shared/cc-support.json (Part C — #1488)

{
  "latest": "2.1.126",
  "supported_floor": "2.1.122",
  "drop_after": "2.1.121",
  "policy": "latest + 3 previous minors"
}

Single source of truth for the floor. Stamped into CLAUDE.md, cc-version-matrix.ts, doctor/references/version-compatibility.md by scripts/stamp-cc-support.mjs.

cc-version-matrix.ts (drives the support-window auto-bump)

export const MIN_CC_VERSION = '2.1.122';
// Adding a new entry > 2.1.122 + 3 patches triggers cc-support-window-bump.yml,
// which auto-recomputes the floor + opens a PR.

shared/cc-adoption-gaps.json (rolling output of cron — #1486)

[
  {
    "version": "2.1.127",
    "parse_failed": false,
    "features": [
      {
        "feature_slug": "claude_project_list",
        "category": "new_command",
        "gap_score": 15,
        "affected_skills": ["doctor", "dream"],
        "reference_changelog_line": "Added `claude project list` ..."
      }
    ]
  }
]

6. The drift-warn hook (Part B — #1487)

Fires once per session on SessionStart. Three branches based on running CC vs floor + matrix-latest:

// CLAUDE_CODE_VERSION = 2.1.50 (below floor 2.1.122)
 systemMessage: "⚠ Claude Code 2.1.50 is below OrchestKit's supported floor (2.1.122)..."

// CLAUDE_CODE_VERSION = 2.1.130 (above matrix latest 2.1.126)
 additionalContext: "[cc-version-check] Running CC 2.1.130 — matrix knows up to 2.1.126.
                       Check shared/cc-adoption-gaps.json or open issues with label cc-adoption."

// CLAUDE_CODE_VERSION = 2.1.124 (in range)
 outputSilentSuccess()  // no nudge

// ORK_NO_CC_VERSION_CHECK=1 → silent regardless