Move agent-handoff batch to concept roots and add a Tracker root per roles-agent-handoff.md #785

Closed
opened 2026-09-27 23:05:43 +00:00 by jared · 2 comments
Owner

Problem

Agent-handoff files sit in role directories with no concept root or with single-caller top-level objects.
The role table in roles-agent-handoff.md names the moves to consolidate agent-handoff concepts and introduce a Tracker root.

Reproduce

n/a: structure-only refactor from a role-morph table.

Approach

Apply the move map in roles-agent-handoff.md with git mv; rename constants; update every caller in lib/, bin/, hooks/, agents/, skills/; move tests to mirror the new paths; update lib/os_sdlc.rb inflections and lint/inward_dependencies.rb tables as needed. Rulings adopted: create a Tracker root (adapter/tracker.rb) with NullTracker and TeaTracker nested as Tracker::Null and Tracker::Tea and TrackerUnavailable as Tracker::Unavailable; cross-concept error classes stay rescued in dispatch_commands.rb as a boundary contract; LessonLibrary and LessonRelay nest under Gate; AgentTranscriptPath and TranscriptUsage under Agent; AgentVerdict, TranscriptStamper, RoleCheck under CompletionIntake; HookPayload under StartSubagent; ObjectionsDigest under Brief as a query; MirrorTickle::CommitHook moves to adapter/. Decide by the lens heuristics (skills/lens-architecture, lens-tactics, lens-principles); where an Accepted ADR conflicts with a lens rule, follow the lens and record the deviation in docs/crc/os-sdlc/deviations.md.

Required work:

  1. Every row of the move map in roles-agent-handoff.md applied, or a one-line reason in deviations.md for each row skipped — check: git diff --stat main -- plugins/os-sdlc/lib
  2. Suite green — check: cd plugins/os-sdlc && ruby tests/all.rb
  3. Inward-dependency lint not above baseline — check: plugins/os-sdlc/bin/lint-inward-dependencies
  4. bin/ script stdout byte-identical on the commands the batch touches — check: diff against recorded output

Acceptance criteria

  1. Given the move map in roles-agent-handoff.md, when the branch is diffed against main, then each listed file is at its proposed path with its proposed constant, or deviations.md names it.
  2. Given the suite, when run, then it passes with zero failures and no new tests.
  3. Given the bin scripts the batch touches, when run against fixtures, then stdout is byte-identical to before.

Owner sketch

class OsSdlc::Tracker; end
class OsSdlc::Agent; end

Non-goals

No behavior change. No new tests. Dead-code deletion is ticket A.

Origin

  • Trigger: CRC session 13 role-morph pass, docs/crc/os-sdlc/roles-agent-handoff.md
  • Improvised this session: none
  • Chain: scattered concepts ← per-file role rename (#737, ADR-0222) ← DESIGN (ADR-0222; corrected by ROLE-MORPH-BRIEF.md "decide the role per concept")
  • Root candidate: this ticket
  • Where: plugins/os-sdlc/lib/os_sdlc/ (files listed in roles-agent-handoff.md)
  • Session: e64808e4-7c0b-4664-9d13-177acbbc143c
  • Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os--claude-worktrees-crc-pass-os-sdlc/e64808e4-7c0b-4664-9d13-177acbbc143c.jsonl
## Problem Agent-handoff files sit in role directories with no concept root or with single-caller top-level objects. The role table in roles-agent-handoff.md names the moves to consolidate agent-handoff concepts and introduce a Tracker root. ## Reproduce n/a: structure-only refactor from a role-morph table. ## Approach Apply the move map in roles-agent-handoff.md with git mv; rename constants; update every caller in lib/, bin/, hooks/, agents/, skills/; move tests to mirror the new paths; update lib/os_sdlc.rb inflections and lint/inward_dependencies.rb tables as needed. Rulings adopted: create a Tracker root (adapter/tracker.rb) with NullTracker and TeaTracker nested as Tracker::Null and Tracker::Tea and TrackerUnavailable as Tracker::Unavailable; cross-concept error classes stay rescued in dispatch_commands.rb as a boundary contract; LessonLibrary and LessonRelay nest under Gate; AgentTranscriptPath and TranscriptUsage under Agent; AgentVerdict, TranscriptStamper, RoleCheck under CompletionIntake; HookPayload under StartSubagent; ObjectionsDigest under Brief as a query; MirrorTickle::CommitHook moves to adapter/. Decide by the lens heuristics (skills/lens-architecture, lens-tactics, lens-principles); where an Accepted ADR conflicts with a lens rule, follow the lens and record the deviation in docs/crc/os-sdlc/deviations.md. Required work: 1. Every row of the move map in roles-agent-handoff.md applied, or a one-line reason in deviations.md for each row skipped — check: git diff --stat main -- plugins/os-sdlc/lib 2. Suite green — check: cd plugins/os-sdlc && ruby tests/all.rb 3. Inward-dependency lint not above baseline — check: plugins/os-sdlc/bin/lint-inward-dependencies 4. bin/ script stdout byte-identical on the commands the batch touches — check: diff against recorded output ## Acceptance criteria 1. Given the move map in roles-agent-handoff.md, when the branch is diffed against main, then each listed file is at its proposed path with its proposed constant, or deviations.md names it. 2. Given the suite, when run, then it passes with zero failures and no new tests. 3. Given the bin scripts the batch touches, when run against fixtures, then stdout is byte-identical to before. ## Owner sketch ```ruby class OsSdlc::Tracker; end class OsSdlc::Agent; end ``` ## Non-goals No behavior change. No new tests. Dead-code deletion is ticket A. ## Origin - Trigger: CRC session 13 role-morph pass, docs/crc/os-sdlc/roles-agent-handoff.md - Improvised this session: none - Chain: scattered concepts ← per-file role rename (#737, ADR-0222) ← DESIGN (ADR-0222; corrected by ROLE-MORPH-BRIEF.md "decide the role per concept") - Root candidate: this ticket - Where: plugins/os-sdlc/lib/os_sdlc/ (files listed in roles-agent-handoff.md) - Session: e64808e4-7c0b-4664-9d13-177acbbc143c - Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os--claude-worktrees-crc-pass-os-sdlc/e64808e4-7c0b-4664-9d13-177acbbc143c.jsonl
Author
Owner

Commits: a0d56e77 (Gate::LessonLibrary/Gate::LessonRelay), a9797cdf (MirrorTickle::CommitHook to adapter/), 371bf805 (CompletionIntake::TranscriptStamper), e1b79e3f (CompletionIntake::RoleCheck own file), 69ffe21a (Agent::TranscriptPath), d5ee64d3 (Agent::TranscriptUsage), ffda2f80 (CompletionIntake::AgentVerdict), 025c890b (StartSubagent::HookPayload), 93d48295 (Brief::ObjectionsDigest, kind Query), e5207c15 (Tracker root + Tracker::Null/Tracker::Tea/Tracker::Unavailable).
Rows applied: 10 of 11 in the move map (all proposed moves); 1 not applicable (PushNotifier/NullNotifier row proposes no move -- dead code, out of scope per Non-goals).
Rows deviated: 0 -- no lens-vs-ADR conflicts encountered; no docs/crc/os-sdlc/deviations.md entry added.

Commits: a0d56e77 (Gate::LessonLibrary/Gate::LessonRelay), a9797cdf (MirrorTickle::CommitHook to adapter/), 371bf805 (CompletionIntake::TranscriptStamper), e1b79e3f (CompletionIntake::RoleCheck own file), 69ffe21a (Agent::TranscriptPath), d5ee64d3 (Agent::TranscriptUsage), ffda2f80 (CompletionIntake::AgentVerdict), 025c890b (StartSubagent::HookPayload), 93d48295 (Brief::ObjectionsDigest, kind Query), e5207c15 (Tracker root + Tracker::Null/Tracker::Tea/Tracker::Unavailable). Rows applied: 10 of 11 in the move map (all proposed moves); 1 not applicable (PushNotifier/NullNotifier row proposes no move -- dead code, out of scope per Non-goals). Rows deviated: 0 -- no lens-vs-ADR conflicts encountered; no docs/crc/os-sdlc/deviations.md entry added.
Author
Owner

Resolution

Done: agent-handoff batch: Tracker root with Tracker::Null/Tea/Unavailable, Gate::LessonLibrary/LessonRelay, Agent::TranscriptPath/TranscriptUsage, CompletionIntake::TranscriptStamper/RoleCheck/AgentVerdict, StartSubagent::HookPayload, Brief::ObjectionsDigest, MirrorTickle::CommitHook to adapter/; 10 of 11 rows (the 11th was the dead notifiers, deleted in #782).

Evidence: Commits a0d56e77..d18cffd7 on crc-pass-os-sdlc; suite 1300 runs 0 failures; inward lint 63 lines exit 0.

Follow-ups: none

## Resolution **Done:** agent-handoff batch: Tracker root with Tracker::Null/Tea/Unavailable, Gate::LessonLibrary/LessonRelay, Agent::TranscriptPath/TranscriptUsage, CompletionIntake::TranscriptStamper/RoleCheck/AgentVerdict, StartSubagent::HookPayload, Brief::ObjectionsDigest, MirrorTickle::CommitHook to adapter/; 10 of 11 rows (the 11th was the dead notifiers, deleted in #782). **Evidence:** Commits a0d56e77..d18cffd7 on crc-pass-os-sdlc; suite 1300 runs 0 failures; inward lint 63 lines exit 0. **Follow-ups:** none
jared closed this issue 2026-09-28 01:18:30 +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#785
No description provided.