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.
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.ymlfor 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
qeengine converges repositories toward a bundled schema that is stale against the accepted standard, so a sync today would produce a non-conformant repository and--pruneagainst it would delete standard labels. That work is QuantEcon/cli#20, a separate project — see Related work — and the pilot carries nativeblocked byedges 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 inqep-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.
config.ymlnames every in-scope repository with no undecided candidates; the org default label set is the core 19lecture-python-programmingcarries the 21 labels and nothing else, and its migration report has been read and acceptedqe gh bots check; superseded trackers closedGates:
--pruneagainst 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.v0.2.0tag exists on origin but no release is published, and the README pins a tag that has never existed.build-failurebefore the repositories it opens issues in carry that label; it would create the label ad hoc and reintroduce the drift.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
blocked byedge on Pilot: migrate lecture-python-programming and review its migration report #372. Not a child: it is a separately registered project, and the collector reads one level of children only.--prunepreserves tags against a real repository rather than only against offline fixtures. It gates cli#20's own Safe migration phase, which is where that gate is stated.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-0002-labels.yml. Evidence flows to QuantEcon/qeps as amendment proposals; nothing here edits the standard.qeengine. Every tool fix — the schema pin, the case-insensitive matching, the prune guard, the retired-label decision path — belongs to QuantEcon/cli#20.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.ymlis correct as it stands and needs no change.*.notebooksbuild repositories. Excluded by QEP-2 §Scope.governanceprogramme 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
Projectissue type and no Type label — per QEP-6 the type marks the unit, and per QEP-2 a tracker is structure, not work.