What
Two skill docs hardcode Apache Airflow values in operative (non-example) positions:
| where |
literal |
should come from |
skills/pr-management-stats/fetch.md:213 |
repository(owner:"apache",name:"airflow") in the GraphQL batch-fetch recipe |
the configured <upstream> slug (upstream_repo in <project-config>/project.md), split into owner/name |
skills/release-announce-draft/SKILL.md:363 |
closer.lua?path=airflow/<version>/... in the site-bump constraint |
the project_dist_name key in <project-config>/release-management-config.md — the skill already reads that file (cf. its product_name derivation at line 237) |
tools/dev/check-placeholders.sh passes on both: its FORBIDDEN_PATTERNS list is four fixed strings (apache/airflow, airflow-s/airflow-s, Apache Airflow, apache.org/airflow) and neither lowercase form matches.
Why it matters
AGENTS.md calls this out directly: "Writing a literal project value directly into a skill is a refactor bug — skills must stay project-agnostic so swapping projects is a config change, not a code change." An agent following the fetch.md recipe against any other adopter queries the wrong repository; an adopter's announce draft points its download links at Airflow's dist tree. And because the linter's pattern list doesn't cover the lowercase forms, this class of residue can keep slipping in — #1132 just cleaned the same class out of projects/_template/, but these two sit in skill docs, outside both its scope and the linter's allowlist.
No new placeholder is needed for either fix — both values are already derivable from existing configuration, which is the point of the placeholder table's "thread a needed value in via the project manifest" rule.
Suggested fix
fetch.md:213 — derive owner / name from <upstream>, the way the surrounding steps already treat it.
release-announce-draft/SKILL.md:363 — render the closer.lua path from project_dist_name.
check-placeholders.sh — add name:"airflow" and path=airflow to FORBIDDEN_PATTERNS so the lowercase class is caught at commit time.
For scope: a grep -rn 'airflow' skills/ sweep shows the remaining hits are marked examples (candidate-rules.md's "the shape for an Airflow-like project", the issue-triage JIRA-key example, the slop-detection fixtures) — this issue is only the two operative literals plus the linter patterns.
Related
What
Two skill docs hardcode Apache Airflow values in operative (non-example) positions:
skills/pr-management-stats/fetch.md:213repository(owner:"apache",name:"airflow")in the GraphQL batch-fetch recipe<upstream>slug (upstream_repoin<project-config>/project.md), split into owner/nameskills/release-announce-draft/SKILL.md:363closer.lua?path=airflow/<version>/...in the site-bump constraintproject_dist_namekey in<project-config>/release-management-config.md— the skill already reads that file (cf. itsproduct_namederivation at line 237)tools/dev/check-placeholders.shpasses on both: itsFORBIDDEN_PATTERNSlist is four fixed strings (apache/airflow,airflow-s/airflow-s,Apache Airflow,apache.org/airflow) and neither lowercase form matches.Why it matters
AGENTS.mdcalls this out directly: "Writing a literal project value directly into a skill is a refactor bug — skills must stay project-agnostic so swapping projects is a config change, not a code change." An agent following thefetch.mdrecipe against any other adopter queries the wrong repository; an adopter's announce draft points its download links at Airflow's dist tree. And because the linter's pattern list doesn't cover the lowercase forms, this class of residue can keep slipping in — #1132 just cleaned the same class out ofprojects/_template/, but these two sit in skill docs, outside both its scope and the linter's allowlist.No new placeholder is needed for either fix — both values are already derivable from existing configuration, which is the point of the placeholder table's "thread a needed value in via the project manifest" rule.
Suggested fix
fetch.md:213— deriveowner/namefrom<upstream>, the way the surrounding steps already treat it.release-announce-draft/SKILL.md:363— render thecloser.luapath fromproject_dist_name.check-placeholders.sh— addname:"airflow"andpath=airflowtoFORBIDDEN_PATTERNSso the lowercase class is caught at commit time.For scope: a
grep -rn 'airflow' skills/sweep shows the remaining hits are marked examples (candidate-rules.md's "the shape for an Airflow-like project", theissue-triageJIRA-key example, the slop-detection fixtures) — this issue is only the two operative literals plus the linter patterns.Related
AGENTS.md§ Placeholder convention — the rule both literals violate.