Apache Software Foundation

September 20, 2026 · View on GitHub

The ASF organization: the default governance vocabulary, backend selections, and infrastructure values shared by every Apache project that adopts Magpie. A project under the ASF sets organization: ASF in <project-config>/project.md and inherits everything below; it overrides a key only where it genuinely differs (and supplies its own per-project values — security list address, scope labels, product name, roster — which are not org-level and stay in project.md).

Resolution: project.md → this file → framework default. See organizations/README.md and AGENTS.md.

The adapter contracts these blocks bind to live under tools/cve-tool/, tools/mail-archive/, tools/forwarder-relay/, and tools/mail-source/; the shipping ASF backends are tools/cve-tool-vulnogram/, tools/ponymail/, tools/apache-projects/, and the ASF-security forwarder shape in tools/gmail/asf-relay.md.

Organization identity

Brand / display metadata, surfaced by the website (and any skill that shows which organization a project belongs to). logo is the asset the site renders for projects under this organization.

organization_identity:
  id: ASF                              # matches the organizations/<id>/ dir name
  name: "Apache Software Foundation"   # full name, longer than the id; shown on the website
  url: https://www.apache.org/
  logo: https://www.apache.org/foundation/press/kit/asf_logo.svg

Governance vocabulary

How the ASF names the roles and rules the skills speak about abstractly. These resolve the <governance-body> / <project-stage> placeholders and the contributor-intake mechanism flag.

governance_vocabulary:
  governance_body: "PMC"              # <governance-body> — Project Management Committee
  governance_body_full: "Project Management Committee"
  member_role: "PMC member"
  committer_role: "committer"
  contributor_intake: icla            # ICLA on file before first commit (vs dco / none)
  project_stage_vocab: [incubating, top-level]   # <project-stage> — podling vs TLP
  private_governance_list: "private@<project>.apache.org"

CVE authority

cve_authority:
  tool: vulnogram                     # adapter under tools/cve-tool/ → tools/cve-tool-vulnogram/
  allocate_url: https://cveprocess.apache.org/allocatecve
  record_url_template: https://cveprocess.apache.org/cve5/<CVE-ID>
  source_tab_url_template: https://cveprocess.apache.org/cve5/<CVE-ID>?tab=source
  email_preview_url_template: https://cveprocess.apache.org/cve5/<CVE-ID>?tab=email
  states: [allocated, review-ready, publish-ready, public]   # Vulnogram DRAFT/REVIEW/READY/PUBLIC
  publication_propagation: poll        # Vulnogram has no webhook
  emits_allocation_email: true         # Vulnogram auto-emails the assigner list
  reviewer_channel: mailing-list       # PMC reviews on the private list
  # Resolves the <cve-tool-url> placeholder used in agnostic skills:
  cve_tool_url: https://cveprocess.apache.org

Governance gate

governance:
  cve_allocation_gate: pmc-member      # ASF PMC membership via OAuth into Vulnogram
  gate_label: "PMC"
  release_vote_gating: true            # ASF release process gates on outstanding security work
  roster_url: https://projects.apache.org/committee.html?<project>

Security inbox

security_inbox:
  kind: mailing-list
  foundation_security_address: security@apache.org   # ASF security team forwards reports here
  has_forwarder_relay: true
  list_filter_query: "list:<security-list-domain>"
  reporter_response_timeout_days: 14   # ASF policy: a silent reporter must not block the team

Forwarders

forwarders:
  enabled: [asf-security]              # ASF security team relays reports onto project lists
  asf-security:
    contact_handle: security@apache.org
    preamble_match: "^Dear PMC,\\s+The security vulnerability report"
    credit_extraction_rule: "first-line-matching:^Reported by:\\s+(.+)$"

Mail provider

mail_provider:
  primary: gmail-mcp                   # triager Gmail account via tools/gmail/
  fallback: ponymail                   # read-only ASF archive backstop

Archive system

archive_system:
  kind: ponymail                       # lists.apache.org
  list_domain: <project>.apache.org
  search_url_template: "https://lists.apache.org/list?{list}:{year}-{month}:{query}"
  api_query_url_template: "https://lists.apache.org/api/thread.lua?list={list}&domain={list_domain}&id={thread_id}"
  advisory_publication_signal_url: "https://lists.apache.org/list.html?<users-list>"
  # Resolves the <mail-archive-url> placeholder used in agnostic skills:
  mail_archive_url: https://lists.apache.org

Inference endpoint

The Foundation-wide sanctioned-inference gateway, LLMAO (llm.apache.org), live since September 2026. A committer authenticates with a personal access token; spend is attributed per key. Projects inherit this as the ASF-hosted option for the vendor-neutrality requirement in RFC-AI-0004 § Principle 3; it does not displace whatever agent harness a maintainer already runs.

inference:
  gateway: https://llm.apache.org
  auth: pat                            # committer personal access token
  status: pilot                        # not GA — see privacy_class and limitations
  # Privacy classification for the approved-LLM gate. LLMAO is NOT
  # default-approved for foundation private data: it serves from rented
  # third-party GPU hardware and pilot traffic is visible to llmao admins.
  # See tools/privacy-llm/models.md — "Carve-outs from the *.apache.org rule".
  privacy_class: project-internal      # public + project-internal only
  recommended_model: gemma4-26b        # reasoning off by default — see note below
  models:
    - id: gemma4-26b
      context_tokens: 131072
      modalities: [text, vision]
      tools: true
      reasoning_on_by_default: false
    - id: qwen3.8-27b
      context_tokens: 131072
      modalities: [text, vision]
      tools: true
      reasoning_on_by_default: true
    - id: qwen3-8b
      context_tokens: 40960
      modalities: [text]
      tools: true
      reasoning_on_by_default: true
  known_limitations:
    # Tool use over the Anthropic-compatible path is broken upstream:
    # LiteLLM routes it to vLLM's /v1/responses with a tool_choice shape
    # vLLM rejects. Plain conversation is unaffected. Magpie skills are
    # tool-driven, so they cannot run against this gateway until it lands.
    - anthropic_tool_use_broken
    # spend_usd reports 0.00 for self-hosted models — no cost map yet, so
    # budget-based routing decisions cannot be made from gateway data.
    - budgets_do_not_meter_self_hosted
    # No automatic restart: a host restart leaves the box up, model down.
    - no_automatic_model_restart

Pick a model whose reasoning is off by default. A reasoning model emits nothing while it thinks; agent clients abandon the stream and retry, so the box runs the same generation twice for a response nobody reads. gemma4-26b is the default for that reason.

Connecting an agent. Claude Code talks to the gateway with environment variables alone — LiteLLM exposes /v1/messages, so no shim is needed:

export ANTHROPIC_BASE_URL=https://llm.apache.org
export ANTHROPIC_AUTH_TOKEN=<your PAT>
export ANTHROPIC_MODEL=gemma4-26b

Throughput is single-stream and memory-bandwidth bound, so the models sit closer together than their parameter counts suggest (~128 tok/s for gemma4-26b, ~46–54 tok/s for the others). The difference shows up under concurrency, where qwen3.8-27b reaches 20+ simultaneous requests and gemma4-26b reaches 4. All published figures come from synthetic load; recorded real usage is still only a few hundred requests.

Source: Andrew Musselman, "llmao progress Sep 14", discuss@rai.apache.org, 2026-09-14.

Project metadata

project_metadata:
  kind: apache-projects-mcp            # comdev MCP wrapping projects.apache.org/json
  mandatory: true                      # for ASF projects the MCP is a pre-flight prerequisite
  install_source: "apache/comdev @ main (mcp/apache-projects-mcp)"

Release process

release_process:
  release_manager_lookup_cascade:
    - kind: roster_file
      path: "release-trains.md"
    - kind: wiki_url
      url: "https://cwiki.apache.org/confluence/display/<PROJECT>/Release+Managers"
    - kind: mailing_list_vote_thread
      list: "<dev-list>"
  artifact_registries: [pypi, artifacthub]
  # Resolves agnostic-skill placeholders:
  release_dist: https://dist.apache.org/repos/dist          # <release-dist>
  project_wiki: https://cwiki.apache.org/confluence/display/<PROJECT>   # <project-wiki>
  announce_list: announce@apache.org                         # <announce-list>
  # Automated (CI) release signing — ASF-specific option, offered by
  # `release-prepare automated-signing` only under this organization.
  # Policy: https://infra.apache.org/release-signing.html#automated-release-signing
  automated_signing:
    policy_url: https://infra.apache.org/release-signing.html#automated-release-signing
    key_request_channel: infra-jira            # https://issues.apache.org/jira/projects/INFRA
    key_request_background: INFRA-23996
    approval_body: security@apache.org        # Security Team approves the workflow before use
    key_spec: "4096-bit RSA, signing-only, private half held by infra-root only"
    trusted_publishing_action: apache/tooling-actions/upload-to-atr   # pin by commit SHA
    validation: "every signed artefact rebuilt bit-by-bit identical on trusted hardware before publication"

Roster

roster:
  source: roster-file:release-trains.md   # canonical security-team / RM source for ASF projects

Tracker conventions

tracker:
  visibility: private                  # ASF security tracker existence is itself confidential
  board: github-projects-v2