Sharpen each meaning of a name collision in the rename recipe #1119
Labels
No labels
P0
P1
P2
P3
bug
category/code-change
category/cross-repo
category/eval-run
category/investigation
category/no-test-target
category/owner-ruling
category/prose-artifact
category/recurring-chore
category/structure
category/umbrella
crc-refactor
create
delete
enhancement
filed-by/agent
filed-by/user
frozen
lint-rule
needs-info
needs-triage
next
plugin/cc-architect
plugin/os
plugin/os-adr
plugin/os-aidd-lint
plugin/os-backlog
plugin/os-context
plugin/os-doc-hygiene
plugin/os-sdlc
plugin/os-vault
project/cc-os
ready-for-agent
ready-for-human
recurring
review
rule-proposal
update
waiting
wayfinder:grilling
wayfinder:map
wayfinder:map
wayfinder:research
wayfinder:task
wayfinder:task
wontfix
worklist/deviations
worklist/lint-rule
worklist/new-implement-build
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
jared/cc-os#1119
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
A rename recipe also has no step that names each meaning. The prescriber picks a new name, but nothing records which meaning keeps the old name, which meaning is domain vocabulary, or which glossary term the team must use. Ticket A supplies the type signals.
Approach
Make the rename recipe sharpen each meaning.
3. Meanings in the brief (
Meanings, new).RunDirectory#type_signalsreads thetypesignals of a saved run.Meanings.new(run, finding)gives one entry per type in the finding, in this form:PrescriptionBrief#to_haddsmeaningsfor aname_collisionfinding only.ConceptBriefaddsmeaningsto the detail of eachname_collisionfinding. Other findings keep their keys.4. Recipe schema.
PrescriptionBrief::SCHEMAandRecipegain two keys, for aname_collisionrecipe:5. RecipeCheck (
RecipeCheck::SharpenRules, new). For a recipe whose finding shape isname_collision, with the meanings of the run:sharpenentry with itstype. A missing, a duplicate, or an unknown type is a problem.domainentry has a non-emptymeaning, a non-emptyterm, and a non-emptyavoid.glossaryhas exactly one entry perdomainentry, matched byterm.termequals the renamefrom. A target constant that is a site of the canonical meaning is a problem.6. Ticket body. For a recipe with
glossaryentries,TicketDraft::Approachlists them under theOrchestrator work:line. It says: write these entries to the rootGLOSSARY.md, create the file when it is absent, and makedocs/agents/domain.mdpoint to it. One line per entry:- **<term>**: <definition> Avoid: <avoid, comma-joined>.Shared contract with ticket A. Ticket B reads type signal rows of this exact form:
Signal(source: "params", kind: "type", path: <birth path>, line: <birth line>, constant: <site>, names: [name], group: <type>, weight: 1). Its tests use fixture rows of this form, andRunDirectory#type_signalsis ticket B's, so ticket A and ticket B can be implemented in parallel; neither changes the other's files.Required work:
def type_signalsinplugins/os-sdlc/lib/os_sdlc/collaborator_pass/run_directory.rbOsSdlc::CollaboratorPass::Meaningsand use it in the finding brief — check: presentMeanings.newinplugins/os-sdlc/lib/os_sdlc/collaborator_pass/prescription_brief.rbMeaningsin the concept brief — check: presentMeanings.newinplugins/os-sdlc/lib/os_sdlc/collaborator_pass/concept_brief.rbsharpenandglossaryto the schema text — check: presentsharpen:inplugins/os-sdlc/lib/os_sdlc/collaborator_pass/prescription_brief.rbsharpenandglossarymembers toRecipe— check: present:glossaryinplugins/os-sdlc/lib/os_sdlc/collaborator_pass/recipe.rbRecipeCheck::SharpenRuleswith the four rules — check: presentSharpenRules.newinplugins/os-sdlc/lib/os_sdlc/collaborator_pass/recipe_check.rbmeanings,sharpen,glossary,kind: domain|programming, and the canonical meaning in the prescriber prompt, and add the four rules to its rule list — check: presentcanonical meaninginplugins/os-sdlc/skills/collaborator-pass/references/prompts/prescribe.mdrenameentrywhen— check: absent(path and node)inplugins/os-sdlc/references/collaborator-recipes.ymlOrchestrator work:in the ticket body — check: presentGLOSSARY.mdinplugins/os-sdlc/lib/os_sdlc/collaborator_pass/ticket_draft/approach.rbOrchestrator work: create the root
GLOSSARY.mdand makedocs/agents/domain.mdpoint to it; both are outside the os-sdlc target. After this ticket ships, re-measure withbin/collaborator-pass measure --runs docs/crc/os-sdlc/collaborator-runsand let the loop prescribe therunrename.Acceptance criteria
name_collisionfinding and its type signals, whenprescribe-brief --subjectruns for it, then the brief has ameaningslist with one entry per type, and each entry hastype,born_at, andsites.renamerecipe for aname_collisionfinding with two meanings and onesharpenentry, when the recipe is validated, then the problems name the meaning that has nosharpenentry.renamerecipe with adomainsharpen entry whoseavoidis empty, when the recipe is validated, then there is a problem for that entry.renamerecipe with adomainsharpen entry and noglossaryentry with its term, when the recipe is validated, then there is a problem for the missing glossary entry.renamerecipe whosefromis thetermof one meaning and whose target is a site of that meaning, when the recipe is validated, then there is a problem for that target.renamerecipe with completesharpenandglossaryentries whose targets are only sites of the other meaning, when the recipe is validated, then there are no problems.renamerecipe with two glossary entries, whenticket-bodyruns, then theOrchestrator work:line namesGLOSSARY.mdanddocs/agents/domain.mdand the body lists both entries.Owner sketch
Non-goals
runtoargumentsin theCrcsites. The loop prescribes it after this ticket ships.RunPathbuilt in the initializer).Origin
nodereported andrunnot reported (docs/crc/os-sdlc/collaborator-runs/20261018T172139Z/findings.yml,name_collisionnode, evidencepath takers 2; node takers 3) ←NameCollisionscompares thepathandnodesides only (SIDESinplugins/os-sdlc/lib/os_sdlc/collaborator_pass/name_collisions.rb) ←UseGroupclassifies a use by call shape, not by the class of the value (plugins/os-sdlc/lib/os_sdlc/collaborator_pass/parameter_uses/use_group.rb) ← DESIGN (plugins/os-sdlc/lib/os_sdlc/collaborator_pass/name_collisions.rb). Therunmeanings were seen by the prescriber indocs/crc/os-sdlc/collaborator-runs/20261018T172139Z/recipes/collaborator_pass.yml(rationale), and Jared ruled the detector and sharpening design on 2026-10-18 in this session.name_collision,name collision,rename recipe,sharpenin open issuesplugins/os-sdlc/lib/os_sdlc/collaborator_pass/name_collisions.rb,plugins/os-sdlc/lib/os_sdlc/collaborator_pass/parameter_uses/use_group.rbSibling: #1118 (ticket A gathers type signals; ticket B sharpens). Both ship before the collaborator-pass loop returns to the run name collision. They may be implemented in parallel.
Work started in session 2 (acb1c3d0). Branch: ticket-1119. Pipeline: /os-sdlc:implement.
Resolution
Done: Implementation 69 (poodr-ticket-implementation) reached merge-ready: RunDirectory#type_signals, Meanings, meanings in PrescriptionBrief and ConceptBrief, sharpen/glossary in schema and Recipe, RecipeCheck::SharpenRules (4 rules), prescriber prompt, recipe catalog when-text, glossary lines under Orchestrator work in TicketDraft::Approach. Two reroutes: a hand-fixed expected-order test defect, and a suite rerun after a load-caused wall-time overrun.
Evidence: Commit
0bb74dceon branch ticket-1119 (not merged). Suite: 2123 runs, 0 failures (gate 631, 46.7s). Gates passed: behavior-verifier 625, contract-auditor 634; required-work R1-R9 present.Follow-ups: none: GLOSSARY.md and docs/agents/domain.md are orchestrator work for when the first rename recipe with glossary entries is accepted (handoff step 2).
Needs review: Review session reads the ticket-1119 worktree diff (commit
0bb74dce) before /os:worktree finish, per handoff 2026-10-18-1910. Check: Meanings has no #canonical from the owner sketch; SharpenRules uses sites_of(type) instead.Review item resolved (orchestrator, Jared AFK): accept Meanings without #canonical(term). The term-to-type lookup needs the recipe's sharpen entries, so it belongs in SharpenRules#canonical_sites, which holds the recipe. Meanings#sites_of(type) keeps Meanings dependent only on the run and the finding. AC 5 covers the rule and passes. No correction ticket.