Skip to content

refactor(work-items): resolve the view medium through the shared resolver #12711

Closed

Description

@kyle-sexton

Parent

Source: PLAN Phase 9, topic planning-chain-consolidation. Epic: #12646.

Depends on

Outcome

work-items:triage resolve their medium through the shared resolver CLI and print the report line, naming no medium values themselves; their evals match.

Demo: Run work-items:triage on a sample: it prints the report line; the skill text lists no medium values.

The Brief (Problem, Goal, Constraints) is in the epic body.

Decisions

  • Q14: medium moves onto ADR 0075 scopes; ~/.claude/rendered-views.md is no longer read.
  • Q17: One fallback chain; every view lane names the medium used and the fact that decided it.
  • Q52: AC15 covers every view lane, planning chain first.

Key interfaces

Contracts

resolveMedium(request) -> Resolution
request:    lane, argument?, userConfig?, projectRoot?, teamRef?
Resolution: preferred?, medium, decidedBy, notices[]
Rules: the argument decides alone. Each scope's own value is read separately (cascade file reader
and schema check, not resolve()'s merged output; team file optionally from teamRef). terminal/file
from any scope keeps the view local. Else the first publishing value from a trusted scope wins:
personal override (untracked and gitignored only), then userConfig. With no scope deciding, the
plugin default applies (trusted: the installed plugin); "any scope" never includes the plugin default. A team file never publishes; an invalid value is ignored without dropping another
scope's value; auto equals unset. Retired files (~/.claude/rendered-views.md,
.claude/rendered-views*.md) produce notices, never values.
CLI: view-settings resolve --lane <id> --option <user_config.medium> [--argument <m>] [--team-ref <ref>]

MediumEntry   { id, publishes, reachable(context) -> {ok, reason}, deliver(view, context) -> {location}, reportName }
SurfaceEntry  { id (terminal | page | shared-session; a shared-session variant is a new entry),
                available(context) -> {ok, reason}, start(session) -> handle, reportName }
ViewKindEntry { id, parse(record) -> data, template, tier }
Lane registration: { laneId, kinds[], hostedCapable }
Fallback chain (medium registry): artifact, file, terminal; hosted read as artifact unless hostedCapable.
Skills call resolveMedium, render(laneId, kind, record), resolveSurface; they never name a medium,
surface or kind value in their own prose.

Report line: view: <medium> (<decidedBy>), plus one line per notice.

PageInput { kind: lock | unlock | comment, recordId, choiceId?, optionId?, text?, at }
- untrusted data; the session reads only these fields; a lock is written to the record, never approval
- delivery: file via the session bridge; terminal via the conversation; Artifact via a
  "Copy choices as prompt" control (existing runtime copy binding) the owner pastes; the page says
  live lock needs the local page
- unhandled input is collected at the start of the owner's next message

Redraw binding: a choice names the example blocks it selects; client-only, no network, no storage.

Done when

  • AC4 / AC7 / AC15: a git grep for an enumerated medium list in the work-items plugin's skills and evals finds none; the work-items evals validate with no FAIL; no model evals are run.

Out of scope

  • Other plugins
  • Vocabulary fixes (vocabulary slice)

Activity

  1. added
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    on Nov 3, 2026
  2. added theissue type on Nov 3, 2026
  3. github-actions commented on Nov 3, 2026

    @github-actions
    Contributor
    No description provided.
  4. github-actions commented on Nov 3, 2026

    @github-actions
    Contributor
    No description provided.
  5. added
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    and removed
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    on Nov 3, 2026
  6. melodic-automation-lanes commented on Nov 3, 2026

    @melodic-automation-lanes
    Contributor

    The work-resolve-issue lane stopped partway through this issue and needs a person.

    Reason: design

    Why, in the run's own words:

    design-change: the shared medium resolver this issue calls (view-settings resolve --lane &lt;id&gt; --option &lt;user_config.medium&gt;) does not exist on the default branch. Its dependency #12667 ('ship the medium resolver and one rendered-view reference to every view lane') is still open, and its issue page shows no linked branch or pull request. Building the resolver here would mean authoring the shared resolver/registry/cascade contract that the other view lanes depend on. That is #12667's primary-design work, not a detail this run can decide. Run this issue again once #12667 merges.

    What the run says it did not do:

    • The whole change (route triage through the shared resolver CLI, print the report line, remove enumerated medium lists from the work-items skills and evals) was not started, because its dependency #12667 has not landed
    • tidy, review, verify and the class audits were skipped: no change was made

    Run: https://github.com/melodic-software/claude-code-plugins/actions/runs/41580973865

    To retry, remove needs-human and add agent-ready again.

  7. self-assigned this
    on Nov 3, 2026
  8. removed
    needs-humanHuman-in-the-loop required; autonomous sessions must not resolve items carrying this.
    on Nov 3, 2026
  9. added
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Nov 3, 2026
  10. github-actions commented on Nov 3, 2026

    @github-actions
    Contributor

    Proposed work class: work-class: scoped
    Basis: automated intake triage; the lanes App applied this class.

    Size: Small
    Complexity: Low
    Uncertainty: Known
    Flags: none
    Blocked by: #12667

    I understood this as a bounded refactor. work-items:triage should resolve its view medium through the shared resolver CLI and print the view: report line. The work-items skills and evals should name no enumerated medium values, and the work-items evals should validate with no FAIL.

    An earlier lane run stopped because the resolver this depends on is not on the default branch yet. #12667 is still open, so this issue is blocked by it. The scope and done-when are exact, so nothing is missing from the issue itself. I found no duplicate among the open issues.

    Automated triage, applied by the lanes App.

  11. added
    priority: mediumReal value, no hard deadline; normal backlog flow.
    and removed
    needs-triageNot yet classified. Floor until a type and one priority tier are set.
    on Nov 3, 2026
  12. 6 remaining items

  13. added
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    on Nov 3, 2026
  14. github-actions commented on Nov 3, 2026

    @github-actions
    Contributor
    No description provided.
  15. melodic-automation-lanes commented on Nov 3, 2026

    @melodic-automation-lanes
    Contributor

    The work-resolve-issue run that agent-ready started waited in its slot past a change to its lane workflow files on main, so it stopped before any model turn. The run's report-outcome removed and added agent-ready back to start a fresh run on main's workflow files. If this run ends the same way, it re-fires the issue again, waiting longer each time.

  16. added
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    and removed
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    on Nov 3, 2026
  17. github-actions commented on Nov 3, 2026

    @github-actions
    Contributor
    No description provided.
  18. github-actions commented on Nov 3, 2026

    @github-actions
    Contributor
    No description provided.
  19. melodic-automation-lanes commented on Nov 4, 2026

    @melodic-automation-lanes
    Contributor

    The lanes App's pull request #12970 for this issue was closed without merging. work-unblock removed status: ready and agent-ready, so the hourly triage sweep sends it back to intake triage, which decides what work is left and admits it again.

  20. removed
    status: readyTriaged, unblocked, and fully specified; eligible to pick up.
    agent-readyFully specified and briefed; eligible for autonomous pickup from the frontier.
    on Nov 4, 2026
  21. kyle-sexton commented on Nov 4, 2026

    @kyle-sexton
    MemberAuthor

    Done on main after #13019 (triage board) and #13025 (morning-brief) merged. AC4 / AC7 / AC15: a git grep over plugins/work-items/skills for an enumerated medium list finds none; the remaining mentions name one medium as eval fixture setup or a report line (triage/evals/evals.json:523-537, morning-brief/evals/evals.json:120-121). check-evals-quality on both evals.json files: PASS, no FAIL. No model evals were run.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    priority: mediumReal value, no hard deadline; normal backlog flow.work-class: scopedA briefed fix or small feature; blast radius bounded by the brief, tests exist.

    Type

    Fields

    Work status

    needs-triage

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions