Sweep os-backlog consumers again and remove the old command names #1624

Closed
opened 2026-11-06 20:06:27 +00:00 by jared · 4 comments
Owner

Problem

Jared asked for a double check of the projects that use os-backlog before the work counts as complete. The first sweep did not search session transcripts or the 13 worktrees under .claude/worktrees.

Approach

Sweep again with the same scope as the first sweep, plus transcripts and worktrees. Read ~/.cc-os/os-backlog-old-names.log. Remove the aliases only when both are empty. If a consumer remains, fix it first.

Required work:

  1. Delete the 18 old Thor commands and map "inspect" from plugins/os-backlog/lib/backlog/cli.rb (lines 19-94), so CLI keeps only the ticket, project, and label subcommands — check: absent desc "issue-create" in plugins/os-backlog/lib/backlog/cli.rb
  2. Remove the aliases and the alias log writer: delete plugins/os-backlog/lib/backlog/cli/old_names.rb and its CLI::OldNames.record call in plugins/os-backlog/lib/backlog/cli_startup.rb — check: absent os-backlog-old-names.log in plugins/os-backlog/lib/backlog/**/*.rb
  3. Move Backlog::CliGroup (plugins/os-backlog/lib/backlog/cli_group.rb) to the mixin module Backlog::CLI::Group in plugins/os-backlog/lib/backlog/cli/group.rb. A superclass cannot be nested under the class it parents, so CLI, TicketGroup, ProjectGroup, and LabelGroup each become < Thor with include Group, and the files that reopen class CLI < CliGroup reopen class CLI < Thor (A2/A15, implementation 259) — check: absent CliGroup in plugins/os-backlog/lib/**/*.rb
  4. Move Backlog::CliOptionSets (plugins/os-backlog/lib/backlog/cli_option_sets.rb) to Backlog::CLI::OptionSets in plugins/os-backlog/lib/backlog/cli/option_sets.rb — check: absent CliOptionSets in plugins/os-backlog/lib/**/*.rb
  5. Move Backlog::CliStartup (plugins/os-backlog/lib/backlog/cli_startup.rb) to Backlog::CLI::Startup in plugins/os-backlog/lib/backlog/cli/startup.rb. Group extends OptionSets and Startup into each class that includes it — check: absent CliStartup in plugins/os-backlog/lib/**/*.rb
  6. Extract the option list that ticket close and ticket review share (resolution_options! plus --approved-by) into CLI::OptionSets. After item 1, the lists of ticket create and ticket claim have one user each and stay in TicketGroup (A12) — check: absent method_option :approved_by in plugins/os-backlog/lib/backlog/cli/ticket_group.rb
  7. Build the OLD_NAME regex in plugins/os-backlog/tests/project_port_note_pins_test.rb from a literal list of the 18 old names, because CLI::OldNames::NAMES is deleted, and remove the alias-log helper in plugins/os-backlog/tests/cli_ticket_project_label_groups_test.rb — check: absent OldNames in plugins/os-backlog/tests/**/*.rb
  8. After items 1 to 7, regenerate plugins/os-backlog/design/generated from the repository root with plugins/os-sdlc/bin/system-model build plugins/os-backlog. The journey files still model classes that slices 4 to 8 deleted, for example Backlog::IssueCreate::Submission. The writer deletes the old .c4 files first, and the journey names come from the new use_case tags — check: absent Submission in plugins/os-backlog/design/generated/**/*
  9. Change os-backlog comment to os-backlog ticket comment in docs/agents/issue-tracker.md:16 — check: absent os-backlog comment in docs/agents/issue-tracker.md
  10. Change os-backlog close and close --needs-review to os-backlog ticket close and ticket review --needs-review in docs/os-backlog-lifecycle.md:49,51 — check: absent os-backlog close in docs/os-backlog-lifecycle.md
  11. Change issue-create and issues to ticket create and ticket list in plugins/os-sdlc/reference/worktree-parallelism.md:27 and plugins/os-sdlc/reference/spec-and-ticket-layer.md:20,49,59,84. Leave plugins/os-sdlc/reference/tracer-walk-findings.md:22, which is a dated findings record — check: absent issue-create in plugins/os-sdlc/reference/{worktree-parallelism,spec-and-ticket-layer}.md

Orchestrator work:

  • Done before the pipeline run, in f84e1a22 on ticket-1624: the os-backlog tests call the CLI by the new names, including the use_case tags and the two-word reading in RunCliWords. The suite stayed at 532 runs with 0 failures, because the old names were still aliases.
  • Done 2026-11-07 (commit 56534258): the second sweep record, docs/system-design-format/proof/2026-11-07-os-backlog-consumer-sweep-2.md. It shows zero live callers, and the alias log is absent (empty).
  • Update the 25 memory files and the 5 vault reference/ notes that name old commands (sweep record, sections 5.2 and 5.3). Report the two handoffs in ruby-gems; they are records and stay unchanged.
  • Run bin/refresh-plugins after the merge.

Acceptance criteria

  1. Given the sweep record, when a reader opens it, then it lists each searched location and shows no live caller of an old name.
  2. Given an old command name, when it runs, then Thor reports an unknown command.
  3. Given the ticket, project, and label commands, when the suite runs, then each passes.
  4. Given the regenerated files under plugins/os-backlog/design/generated, when a reader searches them, then no file names a class that the port deleted, for example Backlog::IssueCreate::Submission.

Owner sketch

class Backlog::CLI < Thor                      # only the three subcommands; the 18 old commands go
  include Group
  subcommand "ticket",  TicketGroup
  subcommand "project", ProjectGroup
  subcommand "label",   LabelGroup
module Backlog::CLI::Group                     # was Backlog::CliGroup
  def self.included(base)                      # base.extend(OptionSets, Startup)
  def initialize(args = [], local_options = {}, config = {})  # state_dir, runner, client, env; super
  def issue_commands                           # no_commands
  def project_commands                         # no_commands
module Backlog::CLI::OptionSets                # was Backlog::CliOptionSets
  def body_options!
  def resolution_options!
  def edit_options!
  def close_options!                           # resolution_options! + method_option :approved_by
module Backlog::CLI::Startup                   # was Backlog::CliStartup; no OldNames.record
  def exit_on_failure?
  def start(given_args = ARGV, config = {})
  def dispatch(meth, given_args, given_opts, config)
class Backlog::CLI::TicketGroup < Thor
  include Group
  def close(number = nil)                      # close_options!; method_option :needs_review
  def review(number = nil)                     # close_options!; method_option :needs_review, required: true
class Backlog::CLI::ProjectGroup < Thor        # include Group
class Backlog::CLI::LabelGroup < Thor          # include Group
# deleted: Backlog::CLI::OldNames, Backlog::CliGroup, Backlog::CliOptionSets, Backlog::CliStartup

Group is a module, not a superclass, because Backlog::CLI cannot inherit from a class nested under itself. Ruby puts an included module between the class and Thor, so Group#initialize reads the config and calls super, and Group.included gives each class the class-level start, dispatch, and option-set methods. This shape was tested with Thor (comment on #1624). With OldNames.record gone, Startup#start has no other change: an old name reaches Thor as an unknown command and exits nonzero. IssueCommands and ProjectCommands keep their method names. The error prefixes in IssueCommands, CliOptions, and the other lib files (sweep record, section 8) are messages, not callers, and stay. The test-writer removes the retired alias tests, and changes each other old-name call to its new name with the same arguments.

Retired tests

plugins/os-backlog/tests/cli_ticket_project_label_groups_test.rb#test_each_new_name_gives_the_same_output_as_the_old_name
plugins/os-backlog/tests/cli_ticket_project_label_groups_test.rb#test_an_old_name_logs_one_line_naming_it
plugins/os-backlog/tests/ticket_label_cli_test.rb#test_label_adds_no_line_to_the_alias_log

Blocking edges

Blocked by #1623

Origin

  • Trigger: port plan, section 5 of docs/system-design-format/proof/2026-11-06-os-backlog-domain-objects.md, slice 11
  • Improvised this session: none
  • Chain: os-backlog code has no domain objects ← commands own their own reads and writes ← DESIGN (ADR-0307, plugins/os-backlog/CONTEXT.md)
  • Root candidate: none found; searched consumer sweep, old-names log, aliases
  • Where: plugins/os-backlog/lib/backlog/cli.rb
  • Session: 9d8c2e15-00c1-4dec-b177-e749fa05ec67
  • Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os/9d8c2e15-00c1-4dec-b177-e749fa05ec67.jsonl

VERDICT: CREATE

## Problem Jared asked for a double check of the projects that use os-backlog before the work counts as complete. The first sweep did not search session transcripts or the 13 worktrees under `.claude/worktrees`. ## Approach Sweep again with the same scope as the first sweep, plus transcripts and worktrees. Read `~/.cc-os/os-backlog-old-names.log`. Remove the aliases only when both are empty. If a consumer remains, fix it first. Required work: 1. Delete the 18 old Thor commands and `map "inspect"` from `plugins/os-backlog/lib/backlog/cli.rb` (lines 19-94), so `CLI` keeps only the `ticket`, `project`, and `label` subcommands — check: absent `desc "issue-create"` in `plugins/os-backlog/lib/backlog/cli.rb` 2. Remove the aliases and the alias log writer: delete `plugins/os-backlog/lib/backlog/cli/old_names.rb` and its `CLI::OldNames.record` call in `plugins/os-backlog/lib/backlog/cli_startup.rb` — check: absent `os-backlog-old-names.log` in `plugins/os-backlog/lib/backlog/**/*.rb` 3. Move `Backlog::CliGroup` (`plugins/os-backlog/lib/backlog/cli_group.rb`) to the mixin module `Backlog::CLI::Group` in `plugins/os-backlog/lib/backlog/cli/group.rb`. A superclass cannot be nested under the class it parents, so `CLI`, `TicketGroup`, `ProjectGroup`, and `LabelGroup` each become `< Thor` with `include Group`, and the files that reopen `class CLI < CliGroup` reopen `class CLI < Thor` (A2/A15, implementation 259) — check: absent `CliGroup` in `plugins/os-backlog/lib/**/*.rb` 4. Move `Backlog::CliOptionSets` (`plugins/os-backlog/lib/backlog/cli_option_sets.rb`) to `Backlog::CLI::OptionSets` in `plugins/os-backlog/lib/backlog/cli/option_sets.rb` — check: absent `CliOptionSets` in `plugins/os-backlog/lib/**/*.rb` 5. Move `Backlog::CliStartup` (`plugins/os-backlog/lib/backlog/cli_startup.rb`) to `Backlog::CLI::Startup` in `plugins/os-backlog/lib/backlog/cli/startup.rb`. `Group` extends `OptionSets` and `Startup` into each class that includes it — check: absent `CliStartup` in `plugins/os-backlog/lib/**/*.rb` 6. Extract the option list that `ticket close` and `ticket review` share (`resolution_options!` plus `--approved-by`) into `CLI::OptionSets`. After item 1, the lists of `ticket create` and `ticket claim` have one user each and stay in `TicketGroup` (A12) — check: absent `method_option :approved_by` in `plugins/os-backlog/lib/backlog/cli/ticket_group.rb` 7. Build the `OLD_NAME` regex in `plugins/os-backlog/tests/project_port_note_pins_test.rb` from a literal list of the 18 old names, because `CLI::OldNames::NAMES` is deleted, and remove the alias-log helper in `plugins/os-backlog/tests/cli_ticket_project_label_groups_test.rb` — check: absent `OldNames` in `plugins/os-backlog/tests/**/*.rb` 8. After items 1 to 7, regenerate `plugins/os-backlog/design/generated` from the repository root with `plugins/os-sdlc/bin/system-model build plugins/os-backlog`. The journey files still model classes that slices 4 to 8 deleted, for example `Backlog::IssueCreate::Submission`. The writer deletes the old `.c4` files first, and the journey names come from the new `use_case` tags — check: absent `Submission` in `plugins/os-backlog/design/generated/**/*` 9. Change `os-backlog comment` to `os-backlog ticket comment` in `docs/agents/issue-tracker.md:16` — check: absent `os-backlog comment` in `docs/agents/issue-tracker.md` 10. Change `os-backlog close` and `close --needs-review` to `os-backlog ticket close` and `ticket review --needs-review` in `docs/os-backlog-lifecycle.md:49,51` — check: absent `os-backlog close` in `docs/os-backlog-lifecycle.md` 11. Change `issue-create` and `issues` to `ticket create` and `ticket list` in `plugins/os-sdlc/reference/worktree-parallelism.md:27` and `plugins/os-sdlc/reference/spec-and-ticket-layer.md:20,49,59,84`. Leave `plugins/os-sdlc/reference/tracer-walk-findings.md:22`, which is a dated findings record — check: absent `issue-create` in `plugins/os-sdlc/reference/{worktree-parallelism,spec-and-ticket-layer}.md` Orchestrator work: - Done before the pipeline run, in f84e1a22 on ticket-1624: the os-backlog tests call the CLI by the new names, including the `use_case` tags and the two-word reading in `RunCliWords`. The suite stayed at 532 runs with 0 failures, because the old names were still aliases. - Done 2026-11-07 (commit 56534258): the second sweep record, `docs/system-design-format/proof/2026-11-07-os-backlog-consumer-sweep-2.md`. It shows zero live callers, and the alias log is absent (empty). - Update the 25 memory files and the 5 vault `reference/` notes that name old commands (sweep record, sections 5.2 and 5.3). Report the two handoffs in `ruby-gems`; they are records and stay unchanged. - Run `bin/refresh-plugins` after the merge. ## Acceptance criteria 1. Given the sweep record, when a reader opens it, then it lists each searched location and shows no live caller of an old name. 2. Given an old command name, when it runs, then Thor reports an unknown command. 3. Given the `ticket`, `project`, and `label` commands, when the suite runs, then each passes. 4. Given the regenerated files under `plugins/os-backlog/design/generated`, when a reader searches them, then no file names a class that the port deleted, for example `Backlog::IssueCreate::Submission`. ## Owner sketch ```ruby class Backlog::CLI < Thor # only the three subcommands; the 18 old commands go include Group subcommand "ticket", TicketGroup subcommand "project", ProjectGroup subcommand "label", LabelGroup module Backlog::CLI::Group # was Backlog::CliGroup def self.included(base) # base.extend(OptionSets, Startup) def initialize(args = [], local_options = {}, config = {}) # state_dir, runner, client, env; super def issue_commands # no_commands def project_commands # no_commands module Backlog::CLI::OptionSets # was Backlog::CliOptionSets def body_options! def resolution_options! def edit_options! def close_options! # resolution_options! + method_option :approved_by module Backlog::CLI::Startup # was Backlog::CliStartup; no OldNames.record def exit_on_failure? def start(given_args = ARGV, config = {}) def dispatch(meth, given_args, given_opts, config) class Backlog::CLI::TicketGroup < Thor include Group def close(number = nil) # close_options!; method_option :needs_review def review(number = nil) # close_options!; method_option :needs_review, required: true class Backlog::CLI::ProjectGroup < Thor # include Group class Backlog::CLI::LabelGroup < Thor # include Group # deleted: Backlog::CLI::OldNames, Backlog::CliGroup, Backlog::CliOptionSets, Backlog::CliStartup ``` `Group` is a module, not a superclass, because `Backlog::CLI` cannot inherit from a class nested under itself. Ruby puts an included module between the class and `Thor`, so `Group#initialize` reads the config and calls `super`, and `Group.included` gives each class the class-level `start`, `dispatch`, and option-set methods. This shape was tested with Thor (comment on #1624). With `OldNames.record` gone, `Startup#start` has no other change: an old name reaches Thor as an unknown command and exits nonzero. `IssueCommands` and `ProjectCommands` keep their method names. The error prefixes in `IssueCommands`, `CliOptions`, and the other lib files (sweep record, section 8) are messages, not callers, and stay. The test-writer removes the retired alias tests, and changes each other old-name call to its new name with the same arguments. ## Retired tests plugins/os-backlog/tests/cli_ticket_project_label_groups_test.rb#test_each_new_name_gives_the_same_output_as_the_old_name plugins/os-backlog/tests/cli_ticket_project_label_groups_test.rb#test_an_old_name_logs_one_line_naming_it plugins/os-backlog/tests/ticket_label_cli_test.rb#test_label_adds_no_line_to_the_alias_log ## Blocking edges Blocked by #1623 ## Origin - Trigger: port plan, section 5 of `docs/system-design-format/proof/2026-11-06-os-backlog-domain-objects.md`, slice 11 - Improvised this session: none - Chain: os-backlog code has no domain objects ← commands own their own reads and writes ← DESIGN (ADR-0307, `plugins/os-backlog/CONTEXT.md`) - Root candidate: none found; searched consumer sweep, old-names log, aliases - Where: plugins/os-backlog/lib/backlog/cli.rb - Session: 9d8c2e15-00c1-4dec-b177-e749fa05ec67 - Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os/9d8c2e15-00c1-4dec-b177-e749fa05ec67.jsonl VERDICT: CREATE
Author
Owner

Before this slice closes, regenerate plugins/os-backlog/design/generated. The journey files last changed on 2026-11-06 and still model the classes that slices 4 to 8 delete, for example Submission.

Before this slice closes, regenerate `plugins/os-backlog/design/generated`. The journey files last changed on 2026-11-06 and still model the classes that slices 4 to 8 delete, for example `Submission`.
Author
Owner

Added from the lens challenge of implementation 259 (#1622): when the aliases go, do two more things. (1) Move Backlog::CliGroup, CliOptionSets, and CliStartup under CLI. They are top-level, but every caller is in the CLI concept (A2/A15 code defect). A superclass cannot be nested under the class it parents, so make CLI::Group a mixin module: class CLI < Thor; include Group, and each group < Thor; include Group. This shape was tested with Thor. (2) The option lists of ticket create, close, and claim copy the old commands in cli.rb (A12). The copy ends when the old commands are deleted. If any list stays shared (ticket review copies close), extract it into the option-set module.

Added from the lens challenge of implementation 259 (#1622): when the aliases go, do two more things. (1) Move `Backlog::CliGroup`, `CliOptionSets`, and `CliStartup` under `CLI`. They are top-level, but every caller is in the CLI concept (A2/A15 code defect). A superclass cannot be nested under the class it parents, so make `CLI::Group` a mixin module: `class CLI < Thor; include Group`, and each group `< Thor; include Group`. This shape was tested with Thor. (2) The option lists of `ticket create`, `close`, and `claim` copy the old commands in `cli.rb` (A12). The copy ends when the old commands are deleted. If any list stays shared (`ticket review` copies `close`), extract it into the option-set module.
Author
Owner

Work started on branch ticket-1624. Plan: commit the item 7 test renames first (green while the aliases exist, as in 2420b148 for #1621), then run the pipeline on the remaining items.

Work started on branch ticket-1624. Plan: commit the item 7 test renames first (green while the aliases exist, as in 2420b148 for #1621), then run the pipeline on the remaining items.
Author
Owner

Resolution

Done: The 18 old command names and the alias log writer are deleted; an old name gets the Thor unknown-command error. CliGroup, CliOptionSets, and CliStartup moved under CLI as the Group mixin, OptionSets, and Startup. ticket close and ticket review share one option list. bin/os-backlog passes env, and CLI::Wiring has no ENV default (A6). The os-backlog tests call the new names. design/generated regenerated. Agent-guidance docs name the new commands. Memory (20 files) and vault (5 notes) text updated. The os-backlog domain-objects port (ADR-0307) is complete.

Evidence: Second sweep: docs/system-design-format/proof/2026-11-07-os-backlog-consumer-sweep-2.md (56534258), no live caller; alias log empty since the #1623 merge. Implementation 261 complete (17 dispatches, 18 min 36 s), commits f84e1a22, bc6d8411, 14fd26ed, d6e18387, 9b39aef5, ba5f46c6. os-backlog 531, os-sdlc 3510, takedown 626, os 241 runs, 0 failures. Lint: lib clean; test files carry the same 30 offenses as main. Live: issue-show, issues, comment, close, checkout, labels, projects exit 1 with Could not find command.

Follow-ups: Two ruby-gems handoffs name os-backlog close (decision-model 2026-10-29-1828 line 46, llm-stack 2026-10-31-1339 line 72); they are dated records and stay. The flaky ResolveCliTest is captured separately.

## Resolution **Done:** The 18 old command names and the alias log writer are deleted; an old name gets the Thor unknown-command error. CliGroup, CliOptionSets, and CliStartup moved under CLI as the Group mixin, OptionSets, and Startup. ticket close and ticket review share one option list. bin/os-backlog passes env, and CLI::Wiring has no ENV default (A6). The os-backlog tests call the new names. design/generated regenerated. Agent-guidance docs name the new commands. Memory (20 files) and vault (5 notes) text updated. The os-backlog domain-objects port (ADR-0307) is complete. **Evidence:** Second sweep: docs/system-design-format/proof/2026-11-07-os-backlog-consumer-sweep-2.md (56534258), no live caller; alias log empty since the #1623 merge. Implementation 261 complete (17 dispatches, 18 min 36 s), commits f84e1a22, bc6d8411, 14fd26ed, d6e18387, 9b39aef5, ba5f46c6. os-backlog 531, os-sdlc 3510, takedown 626, os 241 runs, 0 failures. Lint: lib clean; test files carry the same 30 offenses as main. Live: issue-show, issues, comment, close, checkout, labels, projects exit 1 with Could not find command. **Follow-ups:** Two ruby-gems handoffs name os-backlog close (decision-model 2026-10-29-1828 line 46, llm-stack 2026-10-31-1339 line 72); they are dated records and stay. The flaky ResolveCliTest is captured separately.
jared closed this issue 2026-11-07 18:58:12 +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#1624
No description provided.