Project-agnosticism (de-ASF coupling)
September 8, 2026 · View on GitHub
title: Project-agnosticism (de-ASF coupling) status: experimental kind: feature mode: infra source: > MISSION.md § Abstract and § Affordability and vendor neutrality ("'project' means both an ASF PMC and any non-ASF community, neither is a second-class citizen"). README.md § Skill families. The placeholder + adapter contract in adapters.md and adoption-and-setup.md, and the backend-flag model proven in docs/release-management/ (distribution / approval / announcement backends). acceptance:
- No shipped skill hardcodes an ASF-only assumption a non-ASF adopter cannot satisfy; every ASF-specific surface is a placeholder, an adapter backend, or a capability-flag branch with a documented non-ASF path and a sensible default.
- Behavioural branches that differ by ecosystem (list vote vs
PR-approval, svn dist vs github-releases, ICLA vs DCO, mailing-list
intake vs GitHub discussion) are selected by a declared
<project-config>flag, not by editing the skill. - The catalogue stays runnable by an ASF adopter unchanged: ASF is the default profile, not a removed one.
Project-agnosticism (de-ASF coupling)
What it does
Keeps the skill catalogue usable by any open-source community, not just ASF projects, by ensuring every ASF-specific assumption lives behind one of three generalisation mechanisms rather than being baked into a skill. MISSION makes non-ASF adopters first-class; this area is the standing audit and the mechanism that holds that promise as the catalogue grows.
The three mechanisms, in order of preference:
- Placeholders for project-specific values (
<tracker>,<upstream>,<security-list>,<default-branch>, …), resolved from<project-config>/. This is the default and already widely used. - Adapters for swapping the backing system a step talks to
(
tools/gmail,tools/ponymail,tools/jira,tools/github,tools/mail-source). See adapters.md. - Capability / backend flags for the harder case: a step whose
workflow itself differs by ecosystem. The adopter declares the
profile in
<project-config>and the skill branches on it, keeping the step sequence identical while only the emitted commands / wording change. This is the "conditional flags" mechanism, already modelled indocs/release-management/(release_dist_backend,release_approval_mechanism,release_announce_backend).
Where it lives
- The placeholder + config-resolution contract:
adapters.md,adoption-and-setup.md, and the adopter scaffoldprojects/_template/. - The backend-flag precedent:
docs/release-management/README.md(§ adopter backends) andprojects/_template/release-management-config.md. - The per-family
organization:scope (formerly the binaryasf: true/asf: falseflag), declared in each family's scope banner at the top ofdocs/<family>/README.mdand surfaced in the Scope column of the family tables inREADME.mdanddocs/index.md. An organization-scoped family declaresorganization: <org>(naming a directory underorganizations/); an organization-agnostic family declares no scope key at all. Only release-management and contributor-growth carryorganization: ASF: their core purpose is an ASF Foundation process (the release lifecycle, the contributor-to-committer path). This is a narrower lens than the residual-coupling audit list below — a family can be agnostic (noorganization:, runs anywhere) and still carry ASF-flavoured defaults that the coupling audit tracks (security is the clearest case; those defaults now live inorganizations/ASF/). Skills, tools, and tool adapters declare the same membership — seeorganizations/README.md§ Membership. - The skills carrying residual ASF coupling to audit, by family:
- security (agnostic): generic at its core, but ships an
ASF-flavoured default profile —
security@-style intake and the ASF security-team relay (security-issue-import-via-forwarder), CVE allocation assuming an ASF CNA (security-cve-allocate), Vulnogram as the CVE tool — all swappable for GHSA / MITRE-CNA via the config layer. - contributor / committer growth (
organization: ASF):committer-onboarding(ICLA gate, PMC vote semantics,dev@announce),contributor-nomination(committer-vs-PMC roster framing). - release-management (
organization: ASF): the whole ASF release ritual, already designed with backend flags; the audit confirms the non-ASF paths stay first-class as the skills land. - any skill whose prose names
apache.orglists,svndist trees,incubator, or ASF-only governance steps without a flag.
- security (agnostic): generic at its core, but ships an
ASF-flavoured default profile —
Behaviour & contract
- ASF is the default profile, never the only one. Generalising a skill must not regress the ASF path; the ASF behaviour becomes the default value of the new flag / adapter, so an ASF adopter sees no change.
- Prefer the lightest mechanism. A value goes in a placeholder; a system swap goes in an adapter; only a genuine workflow fork gets a capability flag. Do not add a flag where a placeholder suffices.
- Every flag has a documented non-ASF path. A capability flag that
only enumerates ASF options (e.g. an approval mechanism with just
dev-list-vote) is incomplete; it must name at least one non-ASF option (pr-approval,maintainer-roster,github-discussion, …) and describe the adopter-facing default. <PROJECT>and<project>are two placeholders, not one casing choice.<PROJECT>is the display name (Apache Foo);<project>is the infrastructure slug used inside hostnames, addresses, and URL paths (foo). Substituting one for the other yields a value that is wrong rather than mis-cased. Because they differ only by case, a fixed-string lint written for one does not catch the other, sotools/dev/check-placeholders.shcarries both spellings and also matches spaced variants (name: "<project>"as well asname:"<project>"), since YAML, JSON, and GraphQL all accept either form and pinning one lets the other through.- Advisory, not paternalistic. The audit surfaces candidate coupling for a maintainer to judge; some ASF strings are legitimate (examples, the ASF default profile, ASF-specific docs). It does not auto-rewrite.
- Template and example profiles stay comparable.
projects/_template/is the adopter contract;projects/non-asf-example/is the proof that a non-ASF adopter can satisfy that contract. Required files and config keys should be structurally comparable, with omissions explained rather than silently drifting.
Out of scope
- Removing or de-prioritising ASF support: ASF is the reference adopter and the default profile.
- The privacy gate and sandbox (privacy-llm-gate.md, agent-isolation-sandbox.md), which are already project-agnostic.
- The runtime adapter implementations themselves (that is adapters.md); this area governs the coupling audit and the flag contract, not the adapter code.
Acceptance criteria
- Every shipped skill is auditable for ASF coupling, and each residual coupling is a placeholder, an adapter backend, or a capability-flag branch with a non-ASF default.
- Ecosystem-divergent workflow steps branch on a declared
<project-config>flag, not on skill edits. - The ASF profile runs the catalogue unchanged (default-valued flags), and a non-ASF profile can be declared without editing any skill body.
- The template profile and non-ASF example expose the same required config surfaces, except where the example documents an intentional omission or an organization-inherited default.
Validation
# Advisory sweep: surface ASF-coupled tokens in skill bodies that should
# be a placeholder, an adapter backend, or a capability-flag branch.
# Expected to flag legitimate ASF-default examples too; a human judges.
grep -rInE 'apache\.org|[[:alpha:]]+@apache|\bdev@|\bannounce@|\bICLA\b|\bsvn (mv|co|commit)|\bincubator\b|Vulnogram' skills/ \
| grep -vE '<[a-z-]+>' | head -40
uv run --project tools/skill-and-tool-validator --group dev skill-and-tool-validate
Known gaps
- ASF-coupling lint is advisory only. Check #10 in
tools/skill-and-tool-validator(SOFT categoryasf_coupling) surfaces coupled tokens automatically on every validator run. As of thelow-confidence-asf-coupling-passwork (mechanical cleanup + suppression of low-confidence hits fororganization:-scoped families), the live catalogue produces 3 asf-coupling warnings —release-audit-reportandrelease-promote(svninvocations, remedy:adapter, pending the #602 Subversion backend) anddependency-license-audit(a barePMCreference). Other barePMC/ICLA/announce@apache.orgreferences are inside org-scoped skills where ASF-specific text is appropriate. No remaining tooling gap — the lint exists and a human judges any new hits. In the same pass:skills/pr-management-triage/comment-templates.mdwas generalised —security@apache.orgreplaced with the<security-list>placeholder and the "ASF vulnerability-handling process" wording replaced with a project-agnostic phrase; the design rationale inskills/pr-management-triage/rationale.mdwas anonymised to remove the project-specific mailing list reference that appeared in a historical note. - Non-ASF adopter profile fixture shipped —
projects/non-asf-example/contains a worked non-ASF profile (Velox Stream: GitHub-hosted, DCO, GHSA intake, MITRE CNA, GitHub Releases). Thetools/skill-evals/evals/non-asf-profile-smoke/eval suite (15 cases across 6 steps) drivesissue-stale-sweep, security intake, release-backend selection, contributor governance, and reviewer routing through it, and asserts each proceeds without any Apache-specific fields, turning acceptance #3 into a measurable gate. - The capability-flag vocabulary for security intake and CVE allocation
is now documented in
projects/_template/security-intake-config.md(intake channel, forwarder relay, CNA tool, allocation gate, and newdisclosure_governanceflags). Skills read these flags in follow-on updates as each flag is wired in. - Contributor intake and governance capability flags are now declared
in
projects/_template/committer-onboarding-config.md(icla/dco/no-clafor intake;asf-pmc/github-codeowners/maintainer-rosterfor governance), added by thecapability-flags-committer-intakework item. Thecommitter-onboardingskill currently defaults to ASF-PMC / ICLA; a follow-on update will wire it to read these flags at run time. Remaining coupling in the live catalogue (barePMC,ICLA,announce@apache.org) is surfaced by the advisory lint (check #10 inskill-and-tool-validator) for human judgement. - Template/profile drift is now mechanically checked. Check #15 in
tools/skill-and-tool-validator(template-driftcategory, SOFT) comparesprojects/_template/andprojects/non-asf-example/: files linked in the example README must exist on disk, every config file in the example must be documented in its README, and shared config files (all exceptproject.mdandREADME.md, which differ by design) must have the same h2 section headings. The live tree produces notemplate-driftviolations.