Skip to content

QEP-2 adoption: standard label set rollout #358

Description

@mmcky

Goal: every in-scope QuantEcon repository carries the QEP-2 label set and nothing else, with issue and pull-request history intact and a filed migration report per repository.

Where we stand (verified 2026-08-27)

Next: #370 — decide the estate scope and populate config.yml for both profiles. It is the one item that can proceed today: it is an offline decision, it waits on nothing upstream, and every later phase reads its output.

QEP-2 — Standard GitHub Label Set and Labelling Policy — was Accepted on 2026-08-08 (QuantEcon/qeps#2, recorded in QuantEcon/qeps#10), and nothing has been migrated since. The reason is upstream: the qe engine converges repositories toward a bundled schema that is stale against the accepted standard, so a sync today would produce a non-conformant repository and --prune against it would delete standard labels. That work is QuantEcon/cli#20, a separate project — see Related work — and the pilot carries native blocked by edges on it rather than restating its state here.

This tracker was reshaped on 2026-08-27. It had been carrying its work as body checkboxes above a prose roster of the CLI's issues. The roster had drifted in both directions within three weeks of being written — it named four issues that are no longer part of that project and missed six that are, including both live data-loss paths — and the checkboxes were never measured. The work is now native sub-issues. The CLI engine project is related by dependency rather than held as a child: the projects collector reads one level of sub-issues and never grandchildren, so parenting it published 0 of 1 while hiding thirteen items, and double-counted a project that is separately registered.

What the standard fixes: 19 core labels, a lecture extension (new-lecture, editor), and a one-label software extension (refactor) — names, colours and descriptions defined normatively in qep-0002-labels.yml. Adoption is a migration, not an addition: variants are renamed in place so issue and pull-request history survives, and every sync emits a migration report.

Plan

Work items and their order: the sub-issue list (top = next; completed items keep their place). Constraints between items are native dependency edges. This repository's phases have no milestones, so the table below is the phase authority.

Phase Intent Exit criterion
Ground state Fix what a new repository starts from, and which existing repositories are in scope config.yml names every in-scope repository with no undecided candidates; the org default label set is the core 19
Pilot Prove the migration on one lecture repository before touching any other lecture-python-programming carries the 21 labels and nothing else, and its migration report has been read and accepted
Widen Every in-scope repository migrated, one at a time, each with its own report One filed report per repository; no label carrying tags deleted unattended; unmapped labels collected across the batch so recurrence is visible
Conform & close The estate stays conformant without supervision, and the historical record is closed Org default in place; all three emitters conformant under qe gh bots check; superseded trackers closed

Gates:

  • Nothing in Pilot or later runs against a production repository before QuantEcon/cli#20 closes. A sync against the stale bundled schema silently produces a non-conformant repository, and --prune against it deletes standard labels. Ground state is unaffected — it is a decision and a settings change, both made offline, and its output is what the pilot reads.
  • The pilot also waits on the tool being installable. QuantEcon/cli#25 and QuantEcon/cli#35: the v0.2.0 tag exists on origin but no release is published, and the README pins a tag that has never existed.
  • Bot conformance waits on the software widening batch. An emitter cannot be made to emit build-failure before the repositories it opens issues in carry that label; it would create the label ad hoc and reintroduce the drift.
  • The superseded trackers close after the estate is migrated, not before. Until the migration has worked they are the fallback record.

Sequencing rationale: ground state first, because every later phase reads the scope decision and because it is the only phase that can proceed while the engine is still being fixed — and a default set now stops new repositories being born drifted while the migration runs. Pilot before widening because QEP-2 requires it, and because the first real report is the only evidence that tag survival works outside a test fixture. Conformance last because both halves of it, the org default aside, depend on the estate already carrying the standard set.

Related work

Feeding amendments back

A label recorded as unmapped across several repositories is a gap in the set, and closing it is a normal in-place amendment under QEP-1 that bumps QEP-2's version. The bar is recurrence: one repository's oddity is a local exception; the same label unmapped in four repositories is a missing label. Migration reports produce the evidence; proposing the amendment stays a human judgement.

QEP-4 (QuantEcon/qeps#8, draft) will re-apply its parked registry hooks to QEP-2 in its own acceptance pull request, which moves QEP-2 to version: 1.

Out of scope / what does not change

  • QEP-2's text and qep-0002-labels.yml. Evidence flows to QuantEcon/qeps as amendment proposals; nothing here edits the standard.
  • The qe engine. Every tool fix — the schema pin, the case-insensitive matching, the prune guard, the retired-label decision path — belongs to QuantEcon/cli#20.
  • Test infrastructure. QuantEcon/cli#24.
  • Dependabot. Settled 2026-08-08: its labels belong to the automation, not to QEP-2's contract. QEP-2 defines the label dependencies — name, colour, description — and what a bot applies to its own output is automation behaviour, which is QEP-4's subject. labels: [dependencies] in .github/dependabot.yml is correct as it stands and needs no change.
  • Translation forks and *.notebooks build repositories. Excluded by QEP-2 §Scope.
  • The programme layer. This project sits under the governance programme in the QuantEcon/status-projects registry, which is where programme grouping lives. It is not itself a programme and carries no programme tracker; whether the programme layer ever becomes structural on GitHub is QuantEcon/status-projects#10.

This issue carries the native Project issue type and no Type label — per QEP-6 the type marks the unit, and per QEP-2 a tracker is structure, not work.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions