ARFC-1009: Issue-Type Taxonomy for the Use-Case Backlog Hierarchy
Status
| Implemented | Date: 2026-07-24 | Last Call Date: 2026-08-05 | Publication Date: 2026-08-05 | Version: 0.6 |
Scope note: This ARFC documents a 100% internal engineering-process design — it governs how issues in
codermerlin.academy-use-casesand its downstream implementation repositories (codermerlin.academy-backend,-frontend,-ui-ux) are typed and parented. It has no effect on the ĀYŌDÈ platform, the Codermerlin Academy API, or any developer/end-user -visible behavior. It is filed here, rather than as a plaindocs/silicon-based-how/note or a GitHub issue body (the normally-prescribed vehicles for internal tooling per this repository’s ARFC scope gate), per explicit operator direction on 2026-07-23 — following the same precedent as ARFC-1008 — so that this design carries the same Draft → Last Call → Published review lifecycle as a platform-facing proposal.
Abstract
This RFC formalizes a five-tier issue hierarchy for the ĀYŌDÈ use-case
backlog — Theme, Epic, Requirement, per-discipline breakdown, and
Task — and assigns each tier exactly one GitHub Issue Type, so that an
issue’s type alone identifies its level without needing to walk its parent
chain or inspect which repository it lives in. Two new organization-level
Issue Types, Theme and Epic, are introduced; four existing types
(Use-Case, Feature, Design, Task) are reassigned to specific tiers
where their current usage is ambiguous or split across levels. Bug and
Incident are explicitly excluded from the level scheme as reactive,
unplanned work that can attach at any tier. The hierarchy itself is carried
entirely by GitHub’s native, cross-repository Sub-issues relationships —
no labels, checklists, or external tracker are introduced.
Table of Contents
- Introduction
- Motivation
- 2.1 Current State
- 2.2 Use Cases
- 2.3 Design Goals
- Specification
- Security Considerations
- Backward Compatibility
- References
- Author
1. Introduction
codermerlin.academy-use-cases holds the product’s use-case backlog (156
issues as of 2026-07-23). Inspecting the backlog via GitHub’s GraphQL
parent/subIssues connections shows a real, already-in-use hierarchy: a
top issue per product area (identified today only by a title prefix such
as “Instructor Studio:” or “Course Helm:”), root issues beneath it
representing cohesive capabilities, child issues beneath those breaking a
capability into individual requirements, and — for requirements that have
been analyzed — further child issues in codermerlin.academy-backend,
-frontend, and -ui-ux carrying the actual per-discipline implementation
work. This hierarchy exists structurally today (via Sub-issues), but
nothing about an issue’s type currently identifies which tier it
occupies: the same type is used across multiple tiers, several tiers are
predominantly untyped, and no type exists at all for the top two levels.
2. Motivation
2.1 Current State
- The use-cases backlog contains 156 issues. Of these, 22 have no parent
and no children — orphaned backlog ideas unconnected to any theme or
epic — and were retired (closed, board status
Closed, annotated “Retired.”) on 2026-07-23 as out of scope for this hierarchy. - The remaining 134 issues resolve into 22 root issues (parentless, with children) functioning as de facto epics, and 112 issues that are direct children of those epics, functioning as individual requirements.
- Epic tier (22 issues) current types:
Use-Case(18),Feature(2), untyped (2). No dedicatedEpictype exists. - Requirement tier (112 issues) current types:
Task(51), untyped (48, including 10Design Brief:-titled issues),Feature(13). None are typedUse-Case, despite that type’s own description (“a documented user workflow, requirement, or scenario”) describing this tier more precisely than the epic tier it is currently applied to. - Labeling (
fset-*) was evaluated as an alternative theme mechanism and rejected: only 11 of 156 issues (7%) carry anyfset-*label, all on a single theme (fset-MerlinMessenger); the largest theme (Instructor Studio, 70 issues) has zero use of its matchingfset-InstructorStudiolabel, and the second-largest theme (Course Helm, 53 issues) has no matching label at all. - Requirement-tier issues that have been analyzed fan out via
cross-repository Sub-issues into
codermerlin.academy-backend,-frontend, and-ui-ux(the pattern theuse-case-backend-analyzeskill already formalizes for the backend side). Of the 112 requirement issues, 59 have this fan-out; 53 do not yet. The fanned-out issues are themselves mostly untyped, with one observedTask-typed exception. - No fifth tier exists anywhere sampled: every backend/frontend/ui-ux issue checked has zero further Sub-issues of its own.
2.2 Use Cases
- Answer “list every Epic” or “list every Theme” by an Issue Type filter alone, without walking the parent chain or cross-referencing which repo an issue lives in.
- Distinguish a requirement’s informal UX exploration (the untyped
Design Brief:issues) from its formal sibling requirements, while keeping both at the same tier rather than inventing a sixth level for them. - Report progress and coverage (e.g. “how many requirements still lack a backend/frontend/UI-UX breakdown”) using type + Sub-issues counts alone.
- Keep reactive, unplanned work (
Bug,Incident) visibly separate from the planned top-down decomposition, so a defect report is never mistaken for a scoped deliverable when read by type.
2.3 Design Goals
- Every level maps to exactly one Issue Type — a type answers “what
level is this,” not merely “what kind of ticket is this” — with
BugandIncidentas the sole, deliberate exceptions (§3.3). - Minimize new type creation: reuse an existing organization Issue Type
wherever its description already fits a tier; only introduce a new type
where none of the six existing types fit. This is why only
ThemeandEpicare new — the other four tiers reuseUse-Case,Feature,Design, andTask. - Keep GitHub’s native Sub-issues relationship as the sole hierarchy
mechanism — no labels, checklists, or external tracker — consistent
with how
use-case-backend-analyzealready links use-cases to backend tracking issues. - No change to platform-facing behavior: this taxonomy governs backlog bookkeeping only.
- Constrain all work under this proposal — type migration, hierarchy
formalization, and label alignment alike — to exactly four
repositories:
codermerlin.academy-use-cases,codermerlin.academy-ui-ux,codermerlin.academy-frontend, andcodermerlin.academy-backend. No other organization repository is in scope.
3. Specification
3.1 Level / Type / Repository Table
| Level | Tier | Repository | Issue Type |
|---|---|---|---|
| 0 | Theme | codermerlin.academy-use-cases |
Theme |
| 1 | Epic | codermerlin.academy-use-cases |
Epic |
| 2 | Requirement (incl. former Design Brief: issues) |
codermerlin.academy-use-cases |
Use-Case |
| 3 | Discipline breakdown — backend/frontend | codermerlin.academy-backend, codermerlin.academy-frontend |
Feature |
| 3 | Discipline breakdown — UI/UX | codermerlin.academy-ui-ux |
Design |
| 4 | Implementation task | codermerlin.academy-backend, -frontend, -ui-ux |
Task |
| — | Defect (not level-bound) | wherever filed | Bug |
| — | Production incident (not level-bound) | wherever filed | Incident |
Level 4 is a reserved tier: no issue sampled during this design currently
has a fifth-level child. It exists in the scheme for when a Feature or
Design breakdown item needs to be split into multiple discrete
implementation tasks, not because such splits exist today.
3.2 Hierarchy Diagram
graph TD
Theme["Theme<br/>Type: Theme<br/>use-cases repo"]
Epic["Epic<br/>Type: Epic<br/>use-cases repo"]
Requirement["Requirement<br/>Type: Use-Case<br/>use-cases repo"]
FeatureBE["Backend breakdown<br/>Type: Feature<br/>backend repo"]
FeatureFE["Frontend breakdown<br/>Type: Feature<br/>frontend repo"]
DesignUX["UI/UX breakdown<br/>Type: Design<br/>ui-ux repo"]
TaskBE["Implementation task<br/>Type: Task<br/>backend repo"]
TaskFE["Implementation task<br/>Type: Task<br/>frontend repo"]
TaskUX["Implementation task<br/>Type: Task<br/>ui-ux repo"]
Bug["Bug<br/>Type: Bug<br/>any repo, any level"]
Incident["Incident<br/>Type: Incident<br/>any repo, any level"]
Theme --> Epic
Epic --> Requirement
Requirement --> FeatureBE
Requirement --> FeatureFE
Requirement --> DesignUX
FeatureBE --> TaskBE
FeatureFE --> TaskFE
DesignUX --> TaskUX
Bug -.->|reactive, not part of planned decomposition| Requirement
Incident -.->|reactive, not part of planned decomposition| Epic
Solid arrows are the planned, top-down decomposition (one Issue Type per
level, per §3.1). Dashed arrows show Bug/Incident as attachable at any
tier — the diagram shows one representative attachment point for each, not
an exhaustive set; either type may occur at any level in practice.
3.3 Bug and Incident as Level-Agnostic Exceptions
Bug and Incident are intentionally excluded from the one-type-per-level
rule in §2.3. Both represent reactive work discovered against something
that already exists, not a piece of a top-down plan — a defect can be
found in an Epic’s overall behavior, in a single Requirement, or in a
shipped implementation Task, and forcing it into the level of whatever it
was found against would misrepresent unplanned work as planned
deliverables. These two types therefore carry no level semantics and may
parent to, or be parented by, an issue at any tier.
3.4 Migration Inventory
Based on the current-state counts in §2.1, adopting this taxonomy requires retyping existing issues — it is not solely additive:
| Tier | Issue count | Current types | Target type |
|---|---|---|---|
| Epic | 22 | Use-Case (18), Feature (2), untyped (2) |
Epic |
| Requirement | 112 | Task (51), untyped (48, incl. 10 Design Brief:), Feature (13) |
Use-Case |
| Discipline breakdown (BE/FE) | 59 fanned-out requirements’ worth, count TBD by repo | predominantly untyped, one observed Task |
Feature |
| Discipline breakdown (UI/UX) | subset of the above | untyped | Design |
| Implementation task (Level 4) | 0 observed | — | Task (reserved, no backfill needed) |
The 22 already-retired orphan issues (§2.1) are out of scope for this migration — they carry no type going forward and are not expected to re-enter the hierarchy.
3.5 Worked Example
Epic #19 (“Instructor Studio: Resource Upload & Library Management”,
codermerlin.academy-use-cases) parents Requirement #31 (“Sub-Issue:
Select Library / Realm for Source Upload”, same repository), which in turn
parents implementation issues in separate repositories: #1698 (“Frontend
requirements for use-case #31…”, codermerlin.academy-frontend) and
#1560 (“Analyze backend requirements for use-case #31…”,
codermerlin.academy-backend). Under this taxonomy: #19 → Epic, #31
→ Use-Case, #1698/#1560 → Feature (with a further Task child if
either is later split into discrete implementation steps).
3.6 Complete Issue Type Reference
All eight organization Issue Types, with their live description field
(the two new types’ descriptions were set by the operator directly in
GitHub on 2026-07-23, matching this proposal):
| Issue Type | Description | Level (§3.1) |
|---|---|---|
Theme |
A product area grouping related epics | 0 |
Epic |
A cohesive capability grouping related use-cases | 1 |
Use-Case |
A documented user workflow, requirement, or scenario | 2 |
Feature |
A request, idea, or new functionality | 3 (backend/frontend) |
Design |
A documented UI/UX artifact | 3 (ui-ux) |
Task |
A discrete unit of work associated with a bug or feature | 4 |
Bug |
A defect causing incorrect behavior | not level-bound |
Incident |
A production event causing user or operational impact | not level-bound |
3.7 Fourth Theme: FlightPath and Legacy Label Resolution
On 2026-07-23, after the initial three-theme migration (§3.4), the
fset-* label alignment work was extended to resolve five pre-existing
fset-* labels that had no corresponding Theme (flagged as an open
question in an earlier revision of §5):
fset-CurriculaLibrary,fset-InstructorHelm,fset-StudentHelm— confirmed zero usage in every in-scope repository — deleted.fset-StudentLab— 17 backend issues used it — deleted anyway, per explicit operator decision, accepting the loss of that tagging.fset-FlightPath— 67 issues (47 frontend, 20 backend) actively used it for real feature-impact tracking, consistent with Flight Path being a shipped platform feature (ARFC-1003). Rather than delete or leave it inconsistent with the invariant in §3.8, it was promoted to a fourth Theme, renamedtheme-FlightPath.
Of the 67 fset-FlightPath issues, 54 were already closed (historical
record) and were left as direct, unparented theme-FlightPath label
holders — not forced into the Epic/Use-Case chain, since retroactively
modeling a mostly-dead legacy initiative into cohesive requirements was
judged to add fabricated structure without planning value. The 13 open
issues were split:
#1220(Bug) — exempt per §3.3, labeled directly, no reparenting.- The remaining 12 (
Feature/Task/untyped) were organized into a full chain: ThemeFlightPath(#162) → two Epics,Flight Path: Lesson Authoring & Rendering(#163) andFlight Path: Competition & Team Experience(#164) → one Use-Case each (#165,#166) → the 12 issues asFeaturechildren.
This produced the first real Level 4 (Task) instances anywhere in
the hierarchy, discovered rather than fabricated: #1560 (“Flight Path
Instructor Studio Upload”) already natively parented #1563 and #1564
via GitHub Sub-issues before this design existed, and #884 (“Flight
path: entry hub (dashboard)”) already parented backend #860 the same
way. All three were retyped to Task in place — the existing parent
links were preserved rather than flattened, since they were already
structurally correct. This confirms Level 4 is a real, populated tier,
not merely reserved (contrast with §3.4’s “0 observed” at initial
migration time).
3.8 Automation Invariants
Four invariants have been proposed (as of 2026-07-24) for the org-level GitHub issue-lifecycle automation App (ARFC-1008), to keep this taxonomy self-maintaining rather than relying on manual hygiene. Invariants 1–3 concern the Theme/Epic/Use-Case/Feature/Design/Task hierarchy this ARFC defines; Invariant 4 does not — it is documented here purely because ARFC-1008 is marked Implemented (a closed record of what is actually deployed) and this ARFC is this App’s established location for new, not-yet-implemented proposals, not because Milestone synchronization has any topical relationship to the issue-type taxonomy above.
| # | Invariant | Issue | Auto-correct? |
|---|---|---|---|
| 1 | Any issue that is Theme-typed, or has an ancestor (via the Sub-issues chain, walked to the root) typed Theme, must carry exactly one theme-* label matching the one currently on its root Theme issue. Bug/Incident issues with no such ancestor are exempt from the derived-value check but still bounded to at most one theme-* label. |
#2822 | Yes |
| 2 | Any issue reachable from a root Theme via the Sub-issues chain must carry the Issue Type required by its depth (§3.1’s table: 0=Theme, 1=Epic, 2=Use-Case, 3=Feature/Design depending on repo, 4+=Task, uncapped). Bug/Incident are fully exempt regardless of depth. |
#2823 | Yes (initial implementation — see #2823 for a deferred flag-only mode considered and postponed) |
| 3 | On Use-Case creation (issues.opened), generate the Use-Case’s full level-3 discipline breakdown per §3.1: one Analyze: <title> child in EACH of the three implementation repos — Feature in codermerlin.academy-backend, Feature in codermerlin.academy-frontend, Design in codermerlin.academy-ui-ux — each linked as a (cross-repo) sub-issue of the Use-Case, so every Use-Case acquires all three discipline stubs without manual hygiene. On a subsequent Use-Case title change (issues.edited), propagate the new title to EACH discipline child whose title begins with Analyze: <old-title> — matched against the payload’s changes.title.from, never a fuzzy guess. Per-discipline idempotent (a webhook redelivery mints no duplicate; only missing discipline children are created; propagation is a no-op when a child is absent or already renamed) and loop-safe (the generated children are Feature/Design, not Use-Case, so their own issues.opened cannot re-trigger generation). |
#2830 | Yes (generative + title-propagating) |
| 4 | On a milestone webhook event (created/closed/opened/edited/deleted) sourced from codermerlin.academy-use-cases only (events from the three follower repos are never a trigger — this is what keeps propagation one-directional and loop-safe), re-read the source milestone’s current title/description/due_on/state and push it to codermerlin.academy-backend/-frontend/-ui-ux, matched by title (milestones carry no cross-repo ID). Missing → create; present-but-diverged → update; title renamed (changes.title.from) → rename the follower’s matching milestone first, never a fuzzy guess. deleted removes the matching-titled milestone in each follower. Per-repository idempotent (re-reading live state makes a redelivery a no-op wherever already synced). |
#2920 | Yes (propagating; deliberately one-directional — a direct edit made straight to a follower’s own milestone is never observed or reverted, since the App does not subscribe to milestone events on the follower repos at all) |
Invariants 1 and 2 are designed to be fully self-updating: neither requires a code change, redeploy, or configuration update when a theme is added or retired. Invariant 1’s expected value is read live off the root Theme issue’s own label at enforcement time (never a hardcoded theme list); invariant 2’s expected value depends only on structural depth and repository — a static mapping fixed by this ARFC, not by which theme a branch belongs to — so it requires no per-theme awareness at all. Both reuse the same “walk the Sub-issues ancestor chain” primitive ARFC-1008 §3.7 already established for parent/sub-issue status roll-up.
Invariant 3 differs in kind: it is generative and title-propagating
rather than corrective. It mints the three per-discipline Analyze: stubs
(the §3.1 level-3 breakdown — backend Feature, frontend Feature, UI/UX
Design) on Use-Case creation and keeps each derived child’s title in sync
with its parent, reacting to issues.opened / issues.edited (and reusing
ARFC-1008 §3.7’s sub-issue linkage, here cross-repo) rather than the
ancestor-walk. It only creates the stubs and maintains their titles; the
actual analysis of each discipline’s child into implementation tasks remains
the discipline workflow’s responsibility (for backend,
use-case-backend-analyze), so this invariant adds automation without
pre-empting that human/agent judgment.
Invariant 4 is unrelated to the Theme/Epic/Use-Case hierarchy: it keeps
release Milestones synchronized from codermerlin.academy-use-cases
(established 2026-07-24 as the canonical source, after a one-time manual
sync brought codermerlin.academy-backend/-frontend/-ui-ux into full
parity — 27 milestones each, matching title/description/due_on/state)
out to the three implementation repos, matched by title rather than any
cross-repo ID (Milestones have none). Like Invariant 3, it reuses the
“match a rename against changes.title.from, never a fuzzy guess”
discipline. Its one-directional design is deliberate, not an oversight:
the App never subscribes to milestone events on the follower repos, so
a direct edit made straight to a follower’s own milestone is simply
invisible to it — divergence protection (as opposed to source→follower
propagation) would be a separate invariant, out of scope here. Empirical
implementation note: the Milestones API silently stores the wrong
calendar day (one earlier) when given a midnight-UTC due_on
(T00:00:00Z) — confirmed via raw REST input, not a gh CLI artifact.
Any due_on this invariant writes must be normalized to a non-midnight
time (e.g. noon UTC) to avoid every propagated date landing one day early.
4. Security Considerations
This proposal changes only Issue Type metadata and Sub-issues linkage on existing GitHub issues. It grants no new permissions, alters no API/schema/privilege surface, and has no runtime component. The only operational risk is a bulk mistyping during migration (§3.4); this is mitigated by verifying the migration script’s output on a small batch per repository before applying it across the full inventory.
5. Backward Compatibility
This proposal has no effect on the ĀYŌDÈ platform or Codermerlin Academy API surface (see the Scope note in Status).
Within its own scope:
fset-*labels remain available for their original cross-repository feature-set-impact tagging purpose, independent of this type taxonomy — this proposal does not deprecate them. On 2026-07-23, coverage for the three confirmed themes was backfilled to be consistent across all four in-scope repositories:fset-CourseHelmwas created in all four (it did not exist anywhere before),fset-InstructorStudiowas created inui-ux(already present in the other three), andfset-MerlinMessengerwas created inui-ux/frontend/backend(already present inuse-cases);use-cases’ pre-existingfset-MerlinMessengeralso had its blank description filled in to match the “Affects the X feature set.” style used by every otherfset-*label.- Resolved (2026-07-23): the five pre-existing
fset-*labels with no corresponding theme were disposed of — see §3.7 for the full account.fset-CurriculaLibrary/InstructorHelm/StudentHelm(zero usage) andfset-StudentLab(17 backend issues, deleted anyway per operator decision) were deleted;fset-FlightPath(67 issues, active usage) was renamed totheme-FlightPathand promoted to a fourth Theme rather than deleted or left inconsistent with §3.8’s invariants. - Any existing tooling or saved query that filters use-case issues by
type: Use-Casetoday is implicitly querying the epic tier (18 of 22 current epics carry that type); after migration,Use-Casemeans the requirement tier instead, and such tooling must be updated to filter ontype: Epicfor the same result. - The migration is a metadata change (Issue Type + parent linkage) with no data loss; no issue content, comment, or existing Sub-issues relationship is altered beyond the type reassignment itself.
6. References
- GitHub issue-hierarchy design session, 2026-07-23 (this ARFC’s origin) —
github-project-queryskill queries againstayode-institute/codermerlin.academy-use-casesproject board (org project 8) and cross-repositorysubIssues/parentGraphQL connections. - ARFC-1008 — precedent for filing a 100% internal engineering-process design as an ARFC by explicit operator direction.
use-case-backend-analyzeskill — the existing cross-repository sub-issue linking pattern this taxonomy formalizes and extends to frontend and UI/UX.- ARFC-1003 — “Flight Path Endpoints”, the shipped platform feature
behind the
fset-FlightPath/theme-FlightPathlabel (§3.7). - #2822 —
theme-*label consistency invariant (§3.8). - #2823 — Issue Type-per-level consistency invariant (§3.8).
- #2830 — Use-Case discipline-stub generation and title-propagation invariant (§3.8).
- #2920 — Milestone synchronization invariant, use-cases → backend/frontend/ui-ux (§3.8).
7. Author
ĀYŌDÈ Development Team Codermerlin Academy Architecture