Lens proposal: promote the deferred A2 clause for a second caller that an open ticket names #1712

Open
opened 2026-11-12 16:19:03 +00:00 by jared · 1 comment
Owner

Problem

LENS: A2 broken at lib/decision/model/error_kind.rb:5 - BREAKS: top-level ErrorKind has library callers in one concept only (Batch::Pass). JUSTIFIED: yes, the ticket fixes Model::ErrorKind as the public seam in error_kind_test.rb and the owner sketch; nesting it would change a ticket test (principle 7), so it is not a production-only move. PROPOSAL: NONE, the commit message records the reason; revisit when a second caller appears or the ticket seam is reopened.
Source: contract audit dispatch 80 of os-sdlc implementation 7, decision-model ticket #25.

Approach

Challenge verdict from an opus agent that used references/lens-challenge-checklist.md: edit proposed. The warrant in the audit ("public seam") is not the correct one.
The correct warrant: open ticket decision-model #26 names Comparison as the second caller of ErrorKind, by constant, and Comparison is in a different concept (lib/decision/model/comparison.rb:25-28 classifies the same errors itself today). To nest ErrorKind now would cause two moves and two test-contract changes.
This is a second case, from a different project, of the deferred A2 clause from 2026-11-02 (os-sdlc, Structural::EdgeScope/EffectReach): "NOT a top-level object whose second caller, in another concept, an open ticket names by constant and path; check again when that ticket closes or is dropped." The checklist says to promote a deferred clause in this condition.
Open point (checklist Q11): A2 counts callers "as A15 does"; if the clause goes only into A2, A15 still says to nest. The editor decides: put the clause in the counting sentence of A15 too, or accept that A2 and A15 conflict here.
Signal line for checklist step 7 (not appended; the challenge was read-only): {"date":"2026-11-12","verdict":"edited","project":"decision-model","object":"ErrorKind","clause":"NOT a top-level object whose second caller, in another concept, an open ticket names by constant and path; check again when that ticket closes or is dropped.","evidence":"lib/decision/model/error_kind.rb:5; lib/decision/model/batch/pass.rb:56; lib/decision/model/comparison.rb:25-28; ticket decision-model #26"}
Required work: none beyond the acceptance criteria.

Origin

  • Root candidate: none found; searched A2, A15, ErrorKind, "second caller", "open ticket names", EdgeScope, EffectReach, deferred, "Lens proposal" (VERDICT: CREATE)
    Session: 6098efae-bfd3-433e-9752-524dfeb59c5c
    Transcript: /home/jared/.claude/projects/-home-jared-dev-ruby-gems-decision-model/6098efae-bfd3-433e-9752-524dfeb59c5c.jsonl
    Where: os-sdlc lens heuristic A2; decision-model lib/decision/model/error_kind.rb:5

Discoverer: decision-model, session 6098efae-bfd3-433e-9752-524dfeb59c5c, 2026-11-12. os-sdlc implementation 7 (ticket #25).

## Problem LENS: A2 broken at lib/decision/model/error_kind.rb:5 - BREAKS: top-level ErrorKind has library callers in one concept only (Batch::Pass). JUSTIFIED: yes, the ticket fixes Model::ErrorKind as the public seam in error_kind_test.rb and the owner sketch; nesting it would change a ticket test (principle 7), so it is not a production-only move. PROPOSAL: NONE, the commit message records the reason; revisit when a second caller appears or the ticket seam is reopened. Source: contract audit dispatch 80 of os-sdlc implementation 7, decision-model ticket #25. ## Approach Challenge verdict from an opus agent that used `references/lens-challenge-checklist.md`: edit proposed. The warrant in the audit ("public seam") is not the correct one. The correct warrant: open ticket decision-model #26 names `Comparison` as the second caller of `ErrorKind`, by constant, and `Comparison` is in a different concept (`lib/decision/model/comparison.rb:25-28` classifies the same errors itself today). To nest `ErrorKind` now would cause two moves and two test-contract changes. This is a second case, from a different project, of the deferred A2 clause from 2026-11-02 (os-sdlc, `Structural::EdgeScope`/`EffectReach`): "NOT a top-level object whose second caller, in another concept, an open ticket names by constant and path; check again when that ticket closes or is dropped." The checklist says to promote a deferred clause in this condition. Open point (checklist Q11): A2 counts callers "as A15 does"; if the clause goes only into A2, A15 still says to nest. The editor decides: put the clause in the counting sentence of A15 too, or accept that A2 and A15 conflict here. Signal line for checklist step 7 (not appended; the challenge was read-only): {"date":"2026-11-12","verdict":"edited","project":"decision-model","object":"ErrorKind","clause":"NOT a top-level object whose second caller, in another concept, an open ticket names by constant and path; check again when that ticket closes or is dropped.","evidence":"lib/decision/model/error_kind.rb:5; lib/decision/model/batch/pass.rb:56; lib/decision/model/comparison.rb:25-28; ticket decision-model #26"} Required work: none beyond the acceptance criteria. ## Origin - Root candidate: none found; searched A2, A15, ErrorKind, "second caller", "open ticket names", EdgeScope, EffectReach, deferred, "Lens proposal" (VERDICT: CREATE) Session: 6098efae-bfd3-433e-9752-524dfeb59c5c Transcript: /home/jared/.claude/projects/-home-jared-dev-ruby-gems-decision-model/6098efae-bfd3-433e-9752-524dfeb59c5c.jsonl Where: os-sdlc lens heuristic A2; decision-model `lib/decision/model/error_kind.rb:5` -------- **Discoverer:** decision-model, session 6098efae-bfd3-433e-9752-524dfeb59c5c, 2026-11-12. os-sdlc implementation 7 (ticket #25).
Author
Owner

Occurrence: Lens proposal: A15 NOT-clause for a top-level object whose second-concept caller an open ticket or ruling names
Seen: plugins/os-sdlc/lib/os_sdlc/code_shape/lexical_scope.rb:5 (CodeShape::LexicalScope, one Lint caller; #1734 and ruling 145 name the cops concept as the second caller)
Run: implementation 286 (#1729), session 784c0808-1e40-4296-8f93-77c40ca419c2
Adds: the same deferred clause now fires under A15, from a second concept (Lint; the A2 case was cops). Opus challenge verdict: edit proposed. Proposed A15 NOT: "NOT a top-level object whose caller in a second concept an open ticket or ruling names by constant; check again when that ticket closes or is dropped." Signal line committed: lens-signals/A15.jsonl (abef796). LENS line: A15 broken at code_shape/lexical_scope.rb:5 -- JUSTIFIED: yes, ruling 145 names CodeShape the shared owner for seven callers across concepts (#1718).

Occurrence: Lens proposal: A15 NOT-clause for a top-level object whose second-concept caller an open ticket or ruling names Seen: plugins/os-sdlc/lib/os_sdlc/code_shape/lexical_scope.rb:5 (CodeShape::LexicalScope, one Lint caller; #1734 and ruling 145 name the cops concept as the second caller) Run: implementation 286 (#1729), session 784c0808-1e40-4296-8f93-77c40ca419c2 Adds: the same deferred clause now fires under A15, from a second concept (Lint; the A2 case was cops). Opus challenge verdict: edit proposed. Proposed A15 NOT: "NOT a top-level object whose caller in a second concept an open ticket or ruling names by constant; check again when that ticket closes or is dropped." Signal line committed: lens-signals/A15.jsonl (abef796). LENS line: A15 broken at code_shape/lexical_scope.rb:5 -- JUSTIFIED: yes, ruling 145 names CodeShape the shared owner for seven callers across concepts (#1718).
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#1712
No description provided.