collaborator-pass: owners_that_exist shows entry callers, not only receivers #1104

Closed
opened 2026-10-18 15:19:24 +00:00 by jared · 5 comments
Owner

Problem

ConceptBrief::Owners (plugins/os-sdlc/lib/os_sdlc/collaborator_pass/concept_brief/owners.rb:13) builds three groups. Project attributes come from reflection over Data members. Concept objects are join rows whose top namespace segment equals the concept. Shared parameters come from the params signals of the sites' constructors. All three groups answer one question: what does the concept receive.

An entry object relates to the concept by calling its constructors. Signal (plugins/os-sdlc/lib/os_sdlc/collaborator_pass/signal.rb:5) has the members source, kind, path, line, constant, names, group, weight. ConstructorGraph (constructor_graph.rb) already walks every .new call in lib/ and bin/ and yields ConstructorEdge(from, to, path, line, args). EntryPoints (entry_points.rb) already lists the bins and the Boot::Commands table. ClumpTrace uses both to write trace.yml. The edges are not persisted in the run directory and ConceptBrief::Owners does not read the edges or the traces. EntryPoints#resolve steps over Boot to the first constant the command lambda names, so Boot and Boot::Inputs never appear as an entry constant. The params source records constructor parameter names. The inward source records layer-violating edges only. The flay source records duplication. JoinRow (join_row.rb:5) drops the ledger's job_category. The ledger names callers only as free text in its evidence column. CollaboratorPass::EntryPoint (entry_point.rb) exists. Nothing uses it.

In iterations 2 and 3 (#1088, #1090), the prescriber built CommandLine and CommandController to own what Boot already owned. The brief never showed Boot. #1094 (commit 17d4c688) added owners_that_exist and left this blind spot.

Observed

BUNDLE_GEMFILE=plugins/os-sdlc/Gemfile bundle exec plugins/os-sdlc/bin/collaborator-pass prescribe-brief --run docs/crc/os-sdlc/collaborator-runs/20261017T223555Z --concept crc --target os-sdlc

The command prints owners_that_exist with these parts.

  1. Project attributes: root, target.name, target.path, target.test.path, target.test.command, target.test.framework, target.lint.config, target.tracker. It has no codebase.lib_root.
  2. concept_objects: 70 entries, every OsSdlc::Crc::* join row.
  3. shared_parameters: project and run_path.

The output has no Boot, no Boot::Inputs::CrcArgv, and no ProcessIO.

Reproduce

Measure a fresh run with collaborator-pass measure --runs docs/crc/os-sdlc/collaborator-runs, then use that run directory.

BUNDLE_GEMFILE=plugins/os-sdlc/Gemfile bundle exec plugins/os-sdlc/bin/collaborator-pass prescribe-brief --run docs/crc/os-sdlc/collaborator-runs/<fresh-run> --concept crc --target os-sdlc

Approach

Persist the constructor edges in the run directory (edges.tsv or a calls section of signals.tsv). Build the entry_callers group from the edges whose to is a finding site in the concept, grouped by from, with the join row's role, plus the trace.yml entries for the concept's findings. Record Boot and the Boot::Inputs::* object as the entry hop before the action constant.

Add a fourth group entry_callers in Owners. Each entry gives the calling constant, its join-row role, and the sites it calls.

Trim the Project group to attributes that some site receives, plus codebase.lib_root.

Reduce concept_objects to objects that share a site with a finding.

Required work:

  1. ConstructorGraph edges persisted per run — check: present edges in plugins/os-sdlc/lib/os_sdlc/collaborator_pass/run_directory.rb
  2. Add the entry_callers group — check: present entry_callers in plugins/os-sdlc/lib/os_sdlc/collaborator_pass/concept_brief/**/*.rb
  3. Make the Project group carry codebase.lib_root — check: present lib_root in plugins/os-sdlc/lib/os_sdlc/collaborator_pass/concept_brief/**/*.rb
  4. Record the Boot entry hop — check: present hops in plugins/os-sdlc/lib/os_sdlc/collaborator_pass/entry_points.rb

Acceptance criteria

  1. Given a Boot::Commands entry whose input method Inputs.method(:crc_census) calls Boot::Inputs::CrcArgv and whose action lambda builds Crc::Census::Run, when collaborator-pass measures, then each trace in trace.yml records hops [OsSdlc::Boot, OsSdlc::Boot::Inputs, OsSdlc::Boot::Inputs::CrcArgv] before entry_constant; and when prescribe-brief runs on that run, entry_callers has an entry for OsSdlc::Boot::Inputs::CrcArgv with its join-row role (empty when the row is no_row) and the concept sites the action constant reaches. Test through EntryPoints with a commands-table fixture, not a hand-built EntryTrace.
  2. Given that brief, when the Project group is read, then it lists codebase.lib_root and does not list target.test.command.
  3. Given that brief, when concept_objects is read, then it lists only constants that share a site with a finding.
  4. Given a site with no caller in lib/ or bin/, when prescribe-brief runs, then entry_callers is empty for that site and the command exits 0.

Owner sketch

`OsSdlc::CollaboratorPass::RunDirectory#edges` (reads the persisted ConstructorEdge rows)
`OsSdlc::CollaboratorPass::ConceptBrief::Owners#entry_callers` (joins edges, traces, and join rows)

class OsSdlc::CollaboratorPass::ConceptBrief::Owners
  def entry_callers
end

RunDirectory#edges reads the persisted ConstructorEdge rows; ConceptBrief::Owners#entry_callers joins edges, traces, and join rows. Owners#entry_callers groups the edges by calling constant.

Non-goals

  1. Ranking callers.
  2. Changing the recipe schema.

Origin

  • Trigger: Fresh review of #1094 increment 17d4c688, 2026-10-18.
  • Improvised this session: none
  • Chain: prescriber invents owners that exist ← brief shows receivers only ← no caller signal ← DESIGN (plugins/os-sdlc/lib/os_sdlc/collaborator_pass/signal.rb)
  • Root candidate: this ticket
  • Where: plugins/os-sdlc/lib/os_sdlc/collaborator_pass/concept_brief/owners.rb
  • Session: 402eaf5d-756d-4a94-9806-61c4e9959942
  • Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os/402eaf5d-756d-4a94-9806-61c4e9959942.jsonl
  • Parent: #1094 (closed, AI-created)

VERDICT: CREATE
REASON: Observed, reproducible pain. The brief omits entry callers and produced two wrong owners (#1088, #1090). The chain ends in DESIGN, so this ticket is the root. It blocks collaborator-pass iteration 4.

## Problem `ConceptBrief::Owners` (`plugins/os-sdlc/lib/os_sdlc/collaborator_pass/concept_brief/owners.rb:13`) builds three groups. Project attributes come from reflection over Data members. Concept objects are join rows whose top namespace segment equals the concept. Shared parameters come from the `params` signals of the sites' constructors. All three groups answer one question: what does the concept receive. An entry object relates to the concept by calling its constructors. `Signal` (`plugins/os-sdlc/lib/os_sdlc/collaborator_pass/signal.rb:5`) has the members source, kind, path, line, constant, names, group, weight. `ConstructorGraph` (constructor_graph.rb) already walks every `.new` call in lib/ and bin/ and yields `ConstructorEdge(from, to, path, line, args)`. `EntryPoints` (entry_points.rb) already lists the bins and the `Boot::Commands` table. `ClumpTrace` uses both to write `trace.yml`. The edges are not persisted in the run directory and `ConceptBrief::Owners` does not read the edges or the traces. `EntryPoints#resolve` steps over `Boot` to the first constant the command lambda names, so `Boot` and `Boot::Inputs` never appear as an entry constant. The `params` source records constructor parameter names. The `inward` source records layer-violating edges only. The `flay` source records duplication. `JoinRow` (`join_row.rb:5`) drops the ledger's `job_category`. The ledger names callers only as free text in its `evidence` column. `CollaboratorPass::EntryPoint` (`entry_point.rb`) exists. Nothing uses it. In iterations 2 and 3 (#1088, #1090), the prescriber built `CommandLine` and `CommandController` to own what `Boot` already owned. The brief never showed `Boot`. #1094 (commit 17d4c688) added owners_that_exist and left this blind spot. ## Observed ``` BUNDLE_GEMFILE=plugins/os-sdlc/Gemfile bundle exec plugins/os-sdlc/bin/collaborator-pass prescribe-brief --run docs/crc/os-sdlc/collaborator-runs/20261017T223555Z --concept crc --target os-sdlc ``` The command prints owners_that_exist with these parts. 1. Project attributes: `root, target.name, target.path, target.test.path, target.test.command, target.test.framework, target.lint.config, target.tracker`. It has no `codebase.lib_root`. 2. concept_objects: 70 entries, every `OsSdlc::Crc::*` join row. 3. shared_parameters: `project` and `run_path`. The output has no `Boot`, no `Boot::Inputs::CrcArgv`, and no `ProcessIO`. ## Reproduce Measure a fresh run with `collaborator-pass measure --runs docs/crc/os-sdlc/collaborator-runs`, then use that run directory. ``` BUNDLE_GEMFILE=plugins/os-sdlc/Gemfile bundle exec plugins/os-sdlc/bin/collaborator-pass prescribe-brief --run docs/crc/os-sdlc/collaborator-runs/<fresh-run> --concept crc --target os-sdlc ``` ## Approach Persist the constructor edges in the run directory (edges.tsv or a `calls` section of signals.tsv). Build the `entry_callers` group from the edges whose `to` is a finding site in the concept, grouped by `from`, with the join row's `role`, plus the `trace.yml` entries for the concept's findings. Record `Boot` and the `Boot::Inputs::*` object as the entry hop before the action constant. Add a fourth group `entry_callers` in Owners. Each entry gives the calling constant, its join-row `role`, and the sites it calls. Trim the Project group to attributes that some site receives, plus `codebase.lib_root`. Reduce concept_objects to objects that share a site with a finding. Required work: 1. ConstructorGraph edges persisted per run — check: present `edges` in `plugins/os-sdlc/lib/os_sdlc/collaborator_pass/run_directory.rb` 2. Add the `entry_callers` group — check: present `entry_callers` in `plugins/os-sdlc/lib/os_sdlc/collaborator_pass/concept_brief/**/*.rb` 3. Make the Project group carry `codebase.lib_root` — check: present `lib_root` in `plugins/os-sdlc/lib/os_sdlc/collaborator_pass/concept_brief/**/*.rb` 4. Record the Boot entry hop — check: present `hops` in `plugins/os-sdlc/lib/os_sdlc/collaborator_pass/entry_points.rb` ## Acceptance criteria 1. Given a `Boot::Commands` entry whose input method `Inputs.method(:crc_census)` calls `Boot::Inputs::CrcArgv` and whose action lambda builds `Crc::Census::Run`, when collaborator-pass measures, then each trace in `trace.yml` records `hops` `[OsSdlc::Boot, OsSdlc::Boot::Inputs, OsSdlc::Boot::Inputs::CrcArgv]` before `entry_constant`; and when prescribe-brief runs on that run, `entry_callers` has an entry for `OsSdlc::Boot::Inputs::CrcArgv` with its join-row role (empty when the row is `no_row`) and the concept sites the action constant reaches. Test through `EntryPoints` with a commands-table fixture, not a hand-built `EntryTrace`. 2. Given that brief, when the Project group is read, then it lists `codebase.lib_root` and does not list `target.test.command`. 3. Given that brief, when concept_objects is read, then it lists only constants that share a site with a finding. 4. Given a site with no caller in `lib/` or `bin/`, when prescribe-brief runs, then entry_callers is empty for that site and the command exits 0. ## Owner sketch ```ruby `OsSdlc::CollaboratorPass::RunDirectory#edges` (reads the persisted ConstructorEdge rows) `OsSdlc::CollaboratorPass::ConceptBrief::Owners#entry_callers` (joins edges, traces, and join rows) class OsSdlc::CollaboratorPass::ConceptBrief::Owners def entry_callers end ``` `RunDirectory#edges` reads the persisted ConstructorEdge rows; `ConceptBrief::Owners#entry_callers` joins edges, traces, and join rows. `Owners#entry_callers` groups the edges by calling constant. ## Non-goals 1. Ranking callers. 2. Changing the recipe schema. ## Origin - Trigger: Fresh review of #1094 increment 17d4c688, 2026-10-18. - Improvised this session: none - Chain: prescriber invents owners that exist ← brief shows receivers only ← no caller signal ← DESIGN (`plugins/os-sdlc/lib/os_sdlc/collaborator_pass/signal.rb`) - Root candidate: this ticket - Where: `plugins/os-sdlc/lib/os_sdlc/collaborator_pass/concept_brief/owners.rb` - Session: 402eaf5d-756d-4a94-9806-61c4e9959942 - Transcript: /home/jared/.claude/projects/-home-jared-dev-cc-os/402eaf5d-756d-4a94-9806-61c4e9959942.jsonl - Parent: #1094 (closed, AI-created) VERDICT: CREATE REASON: Observed, reproducible pain. The brief omits entry callers and produced two wrong owners (#1088, #1090). The chain ends in DESIGN, so this ticket is the root. It blocks collaborator-pass iteration 4.
Author
Owner

Work started on branch ticket-1104 via /os-sdlc:implement (map poodr-ticket-implementation, target os-sdlc).

Work started on branch `ticket-1104` via /os-sdlc:implement (map poodr-ticket-implementation, target os-sdlc).
Author
Owner

Escalation 37 (implementation 64): AC1 was bound to frozen run 20261017T223555Z, which has no stored edges, so no code change could satisfy it. Restated AC1 in fixture terms and added a required-work check for the Boot entry hop. Rerouting the same implementation.

Escalation 37 (implementation 64): AC1 was bound to frozen run 20261017T223555Z, which has no stored edges, so no code change could satisfy it. Restated AC1 in fixture terms and added a required-work check for the Boot entry hop. Rerouting the same implementation.
Author
Owner

Skeptic DROP (no ticket): orphan dispatch 590 came from a manual hand-finish design audit outside the pipeline; SubagentStart cannot tell it apart and no recurring pain is recorded.

Skeptic DROP (no ticket): orphan dispatch 590 came from a manual hand-finish design audit outside the pipeline; SubagentStart cannot tell it apart and no recurring pain is recorded.
Author
Owner

Skeptic DROP (no ticket): EntryTrace#calls pairing callers with family was found by code reading only; no failing case, may be intended design. File only if entry_callers over-reports in a real run.

Skeptic DROP (no ticket): EntryTrace#calls pairing callers with family was found by code reading only; no failing case, may be intended design. File only if entry_callers over-reports in a real run.
Author
Owner

Resolution

Done: prescribe-brief owners_that_exist gains entry_callers (Boot::Inputs::* input object or action constant, join-row role, concept sites); measure persists ConstructorGraph edges as calls rows and records Boot hops in trace.yml; Project group trimmed to received attributes plus codebase.lib_root; concept_objects limited to finding sites; prescribe.md explains entry_callers. Hand-finished after behavior-verifier bound escalations 37 and 39 (implementation 64); AC1 restated off the frozen run.

Evidence: main 9f00eeae (merge), 14fde3e3 (prescribe.md); full suite 2106 runs 0 failures 40.3s; rubocop 135 files no offenses; design audit 11 findings, 10 fixed, 1 answered (root->target.path line has effect, pinned by prescribe_brief_concept_test.rb:66); fresh run 20261018T170349Z: entry_callers names OsSdlc::Boot::Inputs::CrcArgv role parser, 11 sites.

Follow-ups: #1112 reroute resets edge spend; #1113 test-reviewer GAP blocks round; #1114 behavior-verifier brief carries test_changes; EntryTrace family over-report dropped by skeptic (no failing case); hook recording hand-finish audit as dispatch 590 dropped by skeptic.

## Resolution **Done:** prescribe-brief owners_that_exist gains entry_callers (Boot::Inputs::* input object or action constant, join-row role, concept sites); measure persists ConstructorGraph edges as calls rows and records Boot hops in trace.yml; Project group trimmed to received attributes plus codebase.lib_root; concept_objects limited to finding sites; prescribe.md explains entry_callers. Hand-finished after behavior-verifier bound escalations 37 and 39 (implementation 64); AC1 restated off the frozen run. **Evidence:** main 9f00eeae (merge), 14fde3e3 (prescribe.md); full suite 2106 runs 0 failures 40.3s; rubocop 135 files no offenses; design audit 11 findings, 10 fixed, 1 answered (root->target.path line has effect, pinned by prescribe_brief_concept_test.rb:66); fresh run 20261018T170349Z: entry_callers names OsSdlc::Boot::Inputs::CrcArgv role parser, 11 sites. **Follow-ups:** #1112 reroute resets edge spend; #1113 test-reviewer GAP blocks round; #1114 behavior-verifier brief carries test_changes; EntryTrace family over-report dropped by skeptic (no failing case); hook recording hand-finish audit as dispatch 590 dropped by skeptic.
jared closed this issue 2026-10-18 17:04: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#1104
No description provided.