Conversation
Registry of QuantEcon automations and the label-coordination policy designed in the QEP-2 field-report thread: registering an automation grants a durable origin label and optionally a /-separated task namespace whose interior is the owner's contract, free to evolve without QEP amendment. Defines the mailbox semantics (apply=enqueue, owner-removes=complete, human-removes=cancel), the anti-loop rule, token mechanics, the grey-band colour allocation, and the prune/sync skip rules. Founding registrations: action-translation (translate/) and reports-activity's status-report. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Adds QEP-4 as a new Draft standard proposal defining a registry model for automation-owned coordination labels (origin labels + optional task namespaces), and registers it in the README index so it becomes part of the QEP registry.
Changes:
- Add QEP-4 document (
Draft,standard) describing registry fields, label tiers, and coordination semantics (“mailbox model”). - Add QEP-4 entry to the README index table.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
| README.md | Adds QEP-4 to the registry index with Draft status and unversioned –. |
| qeps/qep-0004-automation-registry-and-label-coordination.md | Introduces the QEP-4 draft content, including founding registrations and tooling implications. |
Comments suppressed due to low confidence (1)
qeps/qep-0004-automation-registry-and-label-coordination.md:105
- This reference to QEP-2 uses the same non-existent
qep-0002-standard-github-labels.mdrelative link, which will be broken when rendered. Update it to a valid target (e.g., the QEP-2 PR) to avoid dead links in the table.
| Family marker | `automated` | "was this made by a machine?" (org-wide union query) | Durable — every bot artifact ([QEP-2](qep-0002-standard-github-labels.md)) |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
…er mirror) The parity check that keeps the related frontmatter and the Related header-table row in lockstep lands with the qep-0002 branch's check.mjs; this branch carries the data it will validate once both merge. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Per the cross-QEP convention adopted in #9, QEP-2 holds no forward references to this in-review QEP; the registry hooks it drafted (Related pairing, origin/task-label policy, prune skip-rule, grey-band registration) are preserved here verbatim and re-applied to QEP-2 by this QEP's acceptance PR, in whatever form review settles. Rollout gains the matching amend-QEP-2 step. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
## QEP-2: Standard GitHub Label Set and Labelling Policy **Status: Draft** · **Type: standard** · **Discussion: [QuantEcon/meta#324](QuantEcon/meta#324 This is the **DRAFT** of QEP-2, re-recording the label-set decision from [QuantEcon/meta#324](QuantEcon/meta#324) as a worked `Standard`-type QEP — step 2 of QEP-1's rollout. It's opened as a draft so we can keep iterating on the wording before it goes up for a decision; the substantive calls in #324 are all settled, and the draft has since been revised from field testing (see below). ### What it defines - **The standard label set** — 19 core labels (universal) + 2 lecture-extension labels (`new-lecture`, `editor`) = 21, with standard names, colours, and descriptions. The core 19 also becomes the org-level default for new repos. - **The labelling policy** — one Type label per issue at triage, plus optional cross-cutting modifiers (priority, `security`); unlabelled = needs-triage/normal-priority (and the clarification that "no labels" ≠ "no priority label"); priority is a heat-scale that marks only outliers; `question` vs `discuss` and a `discuss` closing convention; automation labels are bot-applied. - **The one behavioural change** — retire the status labels (`in-work` / `ready` / `review` / `blocked`) in favour of native GitHub (Draft PRs, "Ready for review", review requests, issue dependencies). Only `do-not-merge` survives. - **The machine-readable appendix** — the normative schema ships as a co-located [`qeps/qep-0002-labels.yml`](https://github.com/QuantEcon/qeps/blob/qep-0002/qeps/qep-0002-labels.yml), the single source of truth that tooling consumes, versioned with the QEP. - **Cross-QEP process** — QEP-2 is fully self-contained: it carries **no forward references** to the in-review automation-registry QEP. Under the convention adopted in #9, [QEP-4 (#8)](#8) preserves the registry hooks drafted here (Related pairing, origin/task-label policy, prune skip-rule, grey-band registration) and re-applies them by **amending QEP-2 in its own acceptance PR** — cross-references land on `main` atomically, never as dangling links. The CI plumbing still ships here: `check.mjs` keeps `related:` frontmatter and the **Related** header row in lockstep (used when #8 lands), and `check-labels.mjs` enforces table↔yml parity for any `qep-NNNN-*.yml` companion plus the post-acceptance version bump. ### Decisions from #324, folded into this draft | Item | Resolution (from #324) | |---|---| | **Q1 — `infrastructure`** | **Approved** as a distinct Type label, split from `maintenance` | | **Add `discuss`** (@jstac) | In — core label, reuses meta's pink `#f904a0`, split cleanly from `question` | | **Recolour `documentation`** (@xuanguang-li) | Done — moved to tan `#b08968`, off the blue "new content" family | | **`good first issue` / `help wanted` spacing** (@longye-tian) | Keep the spaces — GitHub's Contribute-page algorithm needs the exact names | | **Add `blocked`?** | No — native issue dependencies + Draft/"Blocked by #N" cover it | | **Q2 — rollout** | **Pilot `lecture-python-programming` first**, then roll out more widely | | **Q3 — retire status labels** | Settled — unanimous in the thread | | **Guide clarifications** (@shlff) | Folded into the policy section (unlabelled vs no-priority; `discuss` exit) | | **Tooling** (@mmcky) | `qe gh labels sync` additive; a **separate** `qe gh labels prune` reviews non-standard labels one-by-one | ### Revisions from field testing (`QuantEcon/actions`) We applied the draft set to a full maintenance audit of [`QuantEcon/actions`](https://github.com/QuantEcon/actions) ([#103–#110](QuantEcon/actions#110)); the field report is in the comments below. The `infrastructure`/`maintenance` split and the "grouping labels → Milestones" rule both held up well; the following revisions came out of the report, the follow-up review, and reviewer feedback on the draft: | Change | Outcome | |---|---| | **`security`** | Added as a **cross-cutting modifier**, like priority: exactly one Type label, plus optionally `security` (e.g. `bug` + `security` + `high-priority`). Makes `org:QuantEcon label:security` a standing query and signals a different review bar. Type-level and repo-local alternatives are recorded in the QEP | | **`infrastructure` colour** | Settled at `#1d3c78` — the placeholder `#006b75` clashed with the `help wanted` teal | | **`infrastructure` vs `maintenance`** | The boundary test is now repo-agnostic: *would it appear in a release note?* | | **`testing`** | Added to the deliberately-not-labelled list — test work reads as `infrastructure` or `maintenance` | | **Source of truth** | The QEP carries the schema itself as `qep-0002-labels.yml`; a change to it is a substantive amendment (bumps `version`) per QEP-1. CI (`check-labels.mjs`) fails any PR where the tables and the yml disagree, and requires the version bump once the QEP is Accepted. `QuantEcon/cli` reads the yml from this repo and carries no copy | | **Rename map** | `high priority` → `high-priority` added as a sync example. Alias/variant/prune knowledge deliberately stays in the CLI — the yml records only the standard itself | | **Automation policy** | Diagnostics are **at most one** (routine output diagnoses nothing). Coordination labels (origin labels, `/`-namespaced task labels) are spun out to [QEP-4 (#8)](#8), which amends QEP-2 with the registry hooks when accepted — see *Cross-QEP process* above. Grey = low-salience state, with a `#ededed`–`#bdbdbd` band allocation rule | | **Tier-neutral descriptions** | `description` is machine-synced to every adopting repo (incl. tooling repos and the org default), so `bug` / `enhancement` / `documentation` drop their lecture wording — the lecture guidance moves to the human-only *When to use* column. `build-failure` is scoped while we're at it: scheduled checks label the issues they open; a failing check on a PR carries no label (the red ✗ is the signal) | ### Notes - With the appendix as source of truth, `QuantEcon/cli`'s `labels.yml` is retired rather than updated — the sync tool reads `qep-0002-labels.yml` from this repository. - @shlff's optional `qep-candidate` (meta-only) label is **deliberately out of scope** here — he flagged it for #325, not this rollout. ### Decision No formal deadline window — #324 already reached consensus by its 17 June deadline, so this is largely a formalisation. The author will circulate the draft to the team by email for a final look before it moves out of Draft. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
QEP-2 merged in #2 while its status still read **Draft**, so `main` currently holds an in-effect standard that its own record describes as a draft. This PR completes step 5 of QEP-1's decision process, which was skipped at merge time. The flip is applied in the three places [AGENTS.md](https://github.com/QuantEcon/qeps/blob/main/AGENTS.md) keeps in sync: the YAML frontmatter, the in-document header table, and the README index row. CI parity passed before this PR only because all three agreed on the wrong value. **No version bump.** A newly accepted QEP carries no `version` — implicitly v0 until first substantively amended — so the README `Version` column stays at the em dash. QEP-4 will be the thing that moves QEP-2 to v1, when its acceptance PR re-applies the registry hooks it parked per the convention in #9. The decision itself is not reopened here: @jstac approved the label set and the labelling policy on #2, and @mmcky confirmed the merge. Only the bookkeeping is outstanding. ## Changes | Location | Was | Now | |---|---|---| | `qeps/qep-0002-standard-github-labels.md` frontmatter | `status: Draft` | `status: Accepted` | | `qeps/qep-0002-standard-github-labels.md` header table | Draft | Accepted | | `README.md` index row | Draft | Accepted | Nothing else changes — no normative content is touched, so this is an editorial commit under AGENTS.md's substantive/editorial split. ## Downstream Merging this changes the README row QEP-3 (#7) and QEP-4 (#8) must carry. Both branches are already stale against `main` (they predate QEP-1 v2 and QEP-2's merge, and neither has the QEP-2 row at all), so each will be brought up to date in its own revision round. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
One boundary question for this QEP's review, surfaced while auditing the CLI issues against the now-accepted QEP-2 (QuantEcon/meta#358). QEP-2's automation contract opens "Every bot-opened issue or PR carries That is a working decision, not something QEP-2 says. Since this QEP owns bot behaviour and the registrar model, it is the right place to make the boundary explicit — who registers, and what the contract asks of automations nobody here can configure beyond a |
QEP-4: Automation Registry and Label Coordination
Status: Draft · Type: standard · Discussion: grew out of the QEP-2 field reports
QEP-2 standardises the human label vocabulary and a closed set of bot diagnostics, but field use surfaced a second kind of bot label it can't describe: labels automations use to coordinate —
action-translationrouting the Translation-Sync rollup,status-reportletting the weekly-reports workflow find its own issues. These contracts evolve with the tooling, so they shouldn't be baked into a QEP label-by-label. This QEP resolves that with a registrar model: the QEP allocates the boundary, the automation owns the interior.What it defines
action-translation, on every artifact it creates), an optional task prefix (short, capability-named,/-separated, e.g.translate/), a family grey from the#ededed–#bdbdbdband, a service area, and a contract link. Registration requires a documented consumer you can point at; adding/removing an entry is a substantive amendment, while everything inside a namespace never touches a QEP.automated(org-wide union query) and the origin label are durable; task labels are transient. Origin marks authorship, not participation.GITHUB_TOKENevents don't cascade, so bot→bot enqueueing requires a deliberately provisioned App/PAT: the human decision sits exactly where coordination power is granted. Humans trigger via the UI freely, floored by triage permission.syncnever touches a registered zone;pruneskips registered zones mechanically instead of relying on a human recognising a routing key.Founding registrations
action-translationaction-translationtranslate/#e5e5e5reports-activity(weekly reports)status-report#d5d5d5Relationship to QEP-2
QEP-2 keeps
automated+ the three diagnostics as core vocabulary and is now fully self-contained: under the cross-QEP convention adopted in #9, an in-review QEP is never forward-referenced by the standards it extends — instead this QEP carries the amendments to QEP-2. The draft's new Amendments to QEP-2 section preserves, verbatim, the registry hooks originally drafted inside QEP-2 during co-development (therelated:/Related pairing, the origin/task-label policy sentences, the prune skip-rule, the grey-band registration clause); the acceptance PR re-applies them in their review-settled form, bumping QEP-2'sversionif it is Accepted by then (Rollout step 2). The machine-readable registry (qep-0004-automations.yml, following QEP-2's companion-file pattern) ships at acceptance per the Rollout — the appendix CI check needs a small extension for the registry schema first.Decision deadline
To be set by the author once the draft has had a round of review.
🤖 Generated with Claude Code