---
title: Contributions — Reference
---

# Contributions — Reference

Contributions track **outbound upstream work** — things the Custodian has
identified that belong in a repo it does not own or control. Each contribution
is a structured artifact filed locally in the repo's `contrib/` directory and
registered in the state hub so it is never lost.

---

## Contribution types

| Type | Full name | Use when |
|------|-----------|----------|
| `br` | Bug Report | You found a defect in an upstream tool or library |
| `fr` | Feature Request | You need functionality that upstream does not yet provide |
| `ep` | Extension Point | You identified a future enhancement opportunity in upstream code |
| `upr` | Upstream PR | You have written (or are writing) a patch for an upstream repo |

---

## Flow workstations

```
draft → submitted → acknowledged → accepted → merged
                 ↘               ↘
               rejected        withdrawn
```

| Workstation | Meaning |
|--------|---------|
| **draft** | Artifact written locally; not yet sent upstream |
| **submitted** | Filed as a GitHub issue, PR, or email — awaiting upstream response |
| **acknowledged** | Upstream has seen it and responded (e.g. triaged, commented) |
| **accepted** | Upstream agreed to take action |
| **merged** | PR accepted and merged; issue resolved |
| **rejected** | Upstream declined; record kept for future reference |
| **withdrawn** | We decided not to pursue it |

Contribution movement is evaluated by the task-flow engine. The API asks
whether the target workstation is reachable from the current information
object; if not, it returns structured blocking assertions instead of a generic
"transition not allowed" message. `submitted_at` is stamped automatically when
the contribution reaches `submitted`; `resolved_at` is stamped when it reaches
`merged`, `rejected`, or `withdrawn`.

---

## Relation to the Todo classification

Contributions map directly to the **Third-party** class in the inter-repo
communication taxonomy:

| Todo class | Mechanism |
|------------|-----------|
| Internal | Workplan file + task in this repo's workstream |
| Ecosystem | State hub task with `[repo:<slug>]` prefix |
| **Third-party** | **Contribution artifact in `contrib/` + state hub registration** |

Contributions in `draft`, `submitted`, or `acknowledged` workstations appear as
open Third-party todos on the [Todo](/todo) page.

---

## File layout

Each artifact lives in the current repo under `contrib/`:

```
contrib/
  bug-reports/        br-YYYY-MM-DD--<org>--<repo>--<slug>.md
  feature-requests/   fr-YYYY-MM-DD--<org>--<repo>--<slug>.md
  extension-points/   EP-<DOMAIN>-NNN--<org>--<repo>--<slug>.md
  upstream-prs/       upr-YYYY-MM-DD--<org>--<repo>--<slug>.md
```

Templates live in `~/the-custodian/canon/standards/contrib-templates/`.
Convention details: `~/the-custodian/canon/standards/contribution-convention_v0.1.md`.

---

## Adding a contribution

**1. Write the artifact file** using the appropriate template.

**2. Register it in the state hub** via MCP:

```
register_contribution(
  type               = "fr",
  title              = "Add sidebar TOC injection API",
  target_org         = "observablehq",
  target_repo        = "framework",
  body_path          = "contrib/feature-requests/fr-2026-02-26--observablehq--framework--toc.md",
  related_workstream_id = "<uuid>"
)
```

**3. Close the loop** when you file it upstream:

```
advance_workstation(entity_type="contribution", entity_id="<uuid>", target_workstation="submitted")
```

**4. Keep updating** as upstream responds — `acknowledged`, `accepted`, `merged`.

---

## Kanban board

The Contributions page groups artifacts by status column. Only columns with at
least one entry are shown. The **⚠ follow-up banner** appears when any
contribution has been in `submitted` or `acknowledged` for an extended period
without further movement — a prompt to check in with upstream.

---

*Contributions are append-only. Rejected or withdrawn artifacts are retained as
institutional memory — they explain why certain approaches were tried and
dropped.*
