Add category/structure and an os-backlog categorize gate #1105

Closed
opened 2026-10-18 16:23:22 +00:00 by jared · 3 comments
Owner

Problem

The category label vocabulary is written in five places: Backlog::IssueCreate::CategoryLabels::NAMES, OsSdlc::Tracker::Ticket::CATEGORY_PREFIX, the capture skill, the route skill, and ADR-0287.
No os-backlog command can correct a category after create, so a wrong category stays wrong.
Our ticket generators label structure-only work category/code-change because no structure category exists.

Reproduce

n/a: design ticket; the gap is the missing category and the missing command.

Approach

Add a tenth category, structure: "rename, move, or split with no behavior change; the existing suite is the proof".
The names stay in Backlog::IssueCreate::CategoryLabels in os-backlog; the shared-gem move is ticket #1108.
Add os-backlog categorize NUMBER CATEGORY. It swaps the single category/* label on the issue and refuses an unknown name, through the same check that issue-create uses (ADR-0234).
Delete the change-type section from docs/agents/triage-labels.md. It is doc only and no ADR backs it.

Required work:

  1. Delete the change-type section — check: absent change-type label in docs/agents/triage-labels.md
  2. List category/structure in the capture skill — check: present category/structure in plugins/os-backlog/skills/capture/SKILL.md
  3. List category/structure in the route skill — check: present category/structure in plugins/os-backlog/skills/route/SKILL.md
  4. Update the nine-name pins to the ten-name set — check: present structure in plugins/os-backlog/tests/issue_create/category_labels_test.rb

Orchestrator work: amend ADR-0287 with the tenth category through /os-adr:create. structure is parsed vocabulary, so it is a one-way door. Its consequence "only code-change enters the pipeline" changes.

Acceptance criteria

  1. Given os-backlog categorize 12 structure on an issue labeled category/code-change, when it runs, then the issue carries category/structure and no other category/* label.
  2. Given os-backlog categorize 12 bogus, when it runs, then it exits nonzero, names the valid categories, and changes no label.
  3. Given os-backlog issue-create with --label category/structure, when it runs, then it accepts the label.
  4. The nine-name pins in plugins/os-backlog/tests/issue_create/category_labels_test.rb and plugins/os-backlog/tests/issue_create_category_gate_cli_test.rb are updated to the ten-name set.

Owner sketch

module Backlog
  class IssueCreate
    class CategoryLabels
      NAMES = %w[code-change owner-ruling umbrella investigation prose-artifact
                 no-test-target eval-run cross-repo recurring-chore structure].freeze
    end
  end
end

Origin

  • Trigger: scope memo on why CRC and collaborator-pass structure tickets misroute (structure-ticket-route-scope.md, 2026-10-18)
  • Improvised this session: none
  • Chain: structure tickets labeled code-change ← no structure category exists ← DESIGN (ADR-0287 lists nine categories)
  • Root candidate: none
  • Where: plugins/os-backlog/lib/backlog/issue_create/category_labels.rb
  • Session: 26783407-6911-48d5-a818-55fbfbc70108
  • Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os/26783407-6911-48d5-a818-55fbfbc70108.jsonl

VERDICT: CREATE

## Problem The category label vocabulary is written in five places: `Backlog::IssueCreate::CategoryLabels::NAMES`, `OsSdlc::Tracker::Ticket::CATEGORY_PREFIX`, the capture skill, the route skill, and ADR-0287. No `os-backlog` command can correct a category after create, so a wrong category stays wrong. Our ticket generators label structure-only work `category/code-change` because no `structure` category exists. ## Reproduce n/a: design ticket; the gap is the missing category and the missing command. ## Approach Add a tenth category, `structure`: "rename, move, or split with no behavior change; the existing suite is the proof". The names stay in `Backlog::IssueCreate::CategoryLabels` in os-backlog; the shared-gem move is ticket #1108. Add `os-backlog categorize NUMBER CATEGORY`. It swaps the single `category/*` label on the issue and refuses an unknown name, through the same check that `issue-create` uses (ADR-0234). Delete the change-type section from `docs/agents/triage-labels.md`. It is doc only and no ADR backs it. Required work: 1. Delete the change-type section — check: absent `change-type label` in `docs/agents/triage-labels.md` 2. List `category/structure` in the capture skill — check: present `category/structure` in `plugins/os-backlog/skills/capture/SKILL.md` 3. List `category/structure` in the route skill — check: present `category/structure` in `plugins/os-backlog/skills/route/SKILL.md` 4. Update the nine-name pins to the ten-name set — check: present `structure` in `plugins/os-backlog/tests/issue_create/category_labels_test.rb` Orchestrator work: amend ADR-0287 with the tenth category through `/os-adr:create`. `structure` is parsed vocabulary, so it is a one-way door. Its consequence "only code-change enters the pipeline" changes. ## Acceptance criteria 1. Given `os-backlog categorize 12 structure` on an issue labeled `category/code-change`, when it runs, then the issue carries `category/structure` and no other `category/*` label. 2. Given `os-backlog categorize 12 bogus`, when it runs, then it exits nonzero, names the valid categories, and changes no label. 3. Given `os-backlog issue-create` with `--label category/structure`, when it runs, then it accepts the label. 4. The nine-name pins in plugins/os-backlog/tests/issue_create/category_labels_test.rb and plugins/os-backlog/tests/issue_create_category_gate_cli_test.rb are updated to the ten-name set. ## Owner sketch ```ruby module Backlog class IssueCreate class CategoryLabels NAMES = %w[code-change owner-ruling umbrella investigation prose-artifact no-test-target eval-run cross-repo recurring-chore structure].freeze end end end ``` ## Origin - Trigger: scope memo on why CRC and collaborator-pass structure tickets misroute (structure-ticket-route-scope.md, 2026-10-18) - Improvised this session: none - Chain: structure tickets labeled code-change ← no structure category exists ← DESIGN (ADR-0287 lists nine categories) - Root candidate: none - Where: plugins/os-backlog/lib/backlog/issue_create/category_labels.rb - Session: 26783407-6911-48d5-a818-55fbfbc70108 - Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os/26783407-6911-48d5-a818-55fbfbc70108.jsonl VERDICT: CREATE
Author
Owner

Work started on branch ticket-1105 via /os-sdlc:implement.

Work started on branch ticket-1105 via /os-sdlc:implement.
Author
Owner

Implementation 65 escalated at the test-reviewer bound because AC4 is os-sdlc work outside the os-backlog target. AC4 and the shared-gem move are split to #1108. The body was edited and the run will be rerouted.

Implementation 65 escalated at the test-reviewer bound because AC4 is os-sdlc work outside the os-backlog target. AC4 and the shared-gem move are split to #1108. The body was edited and the run will be rerouted.
Author
Owner

Resolution

Done: os-backlog categorize NUMBER CATEGORY swaps the single category/* label and refuses unknown names via CategoryLabels.known?; category/structure added as the tenth name with its meaning; ADR-0287 amended in place via os-adr:create; capture and route skill lists updated; change-type section removed from docs/agents/triage-labels.md; nine-name test pins updated.

Evidence: main b78ac8de (and tidy d1feee9d); os-backlog suite 314 runs 0 failures; rubocop clean on changed files; design audit: no must-fix, five should-fix applied. Implementation 65 escalated twice (reviewer bound on a two-target ticket, then unexpected_pass from a verifier brief lacking test_changes) and was hand-finished per the escalation procedure.

Follow-ups: #1108 shared-gem move and os-sdlc read of NAMES (split from AC4); #1109 two-target ticket check; #1110 writer classification not recorded; #1111 verifier brief omits test_changes. ADR-0287 text about a crc-refactor category list was already wrong before this change; left as is.

## Resolution **Done:** os-backlog categorize NUMBER CATEGORY swaps the single category/* label and refuses unknown names via CategoryLabels.known?; category/structure added as the tenth name with its meaning; ADR-0287 amended in place via os-adr:create; capture and route skill lists updated; change-type section removed from docs/agents/triage-labels.md; nine-name test pins updated. **Evidence:** main b78ac8de (and tidy d1feee9d); os-backlog suite 314 runs 0 failures; rubocop clean on changed files; design audit: no must-fix, five should-fix applied. Implementation 65 escalated twice (reviewer bound on a two-target ticket, then unexpected_pass from a verifier brief lacking test_changes) and was hand-finished per the escalation procedure. **Follow-ups:** #1108 shared-gem move and os-sdlc read of NAMES (split from AC4); #1109 two-target ticket check; #1110 writer classification not recorded; #1111 verifier brief omits test_changes. ADR-0287 text about a crc-refactor category list was already wrong before this change; left as is.
jared closed this issue 2026-10-18 16:52:59 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
jared/cc-os#1105
No description provided.