The repo profile is committed data, not a skill

Context and Problem Statement

Every lifecycle skill needs the same repo-specific facts — commit identity, build and test commands, the label taxonomy, the CI gates, the conflict hot-spots — and hardcoding them made each skill wrong in a second repository. The obvious home in a Claude Code plugin is another skill, since skills are what the loader already knows how to find. (Context lifted from skills/profile-repo/SKILL.md, “The profile is data, not a skill”; the committed-file half is #157.)

Considered Options

  • A skill that answers the questions on demand, invoked by every lifecycle skill at its Step 1.
  • A plain committed markdown file the lifecycle skills read directly, with a skill that only generates it.
  • Per-skill hardcoded defaults with per-repo overrides.

Decision Outcome

The profile is plain markdown at .claude/skills/repo-profile.md with no SKILL.md beside it, so the loader ignores it and it costs no context until something reads it; it is committed, so it travels with the repo and a linked worktree sees the same file the main checkout does; and the lifecycle skills read it through skills/profile-repo/scripts/repo-profile.sh show, falling back to the profile-repo skill only when the file is genuinely absent — which means the generating skill is usually never loaded at all.

Consequences

The profile can go stale without anything noticing, so profile-repo --refresh exists and the file says at the top when to re-run it. Reading it needs a helper rather than a cat, because a bare cat of a missing profile is indistinguishable from a silent one and the skills then infer the identity and gates from the repository instead — invisible in the successful case, which is what made it worth a named condition (#157).