Repository navigation
Closed
Feature
Copy link
Description
Parent
Source: PLAN Phase 2, topic planning-chain-consolidation. Epic: #12646.
Depends on
Outcome
Plan, brainstorm and design views render through one view-kind registry and the resolver; planning ships Artifact as its default medium; the contract records planning views as the third named Artifact exception behind the publish gate. A new medium needs no edit to the planning skills.
Demo: Render a design view from a plan record: the builder writes one page from its Design section and the skill prints the report line.
The Brief (Problem, Goal, Constraints) is in the epic body.
Decisions
- Q16: Brainstorm, design and plan views are a third named Artifact exception behind the publish gate.
- Q24: Mediums, surfaces and shared-session variants are added by registration.
- Q32: The shipped Artifact default covers brainstorm, design and plan views only in this epic.
- 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.
Variation verdicts
| Point | Verdict | Seam or module | Reason |
|---|---|---|---|
| Medium, surface, view-kind sets | abstract now | the three registries | required by the Brief (Q24, AC15; Variation intent "second variant = known") |
| claude.ai Artifact service | contain | artifact medium entry |
external; default |
| Hosted page publisher | contain | hosted medium entry |
external; default |
| Cloudflare tunnel | contain | shared-session surface entry | external; default, as today |
| Plugin offer lookups (marketplace catalog, GitHub commits) | contain | offer-source module, cached in plugin data | external; GitHub API budget |
Done when
- AC6: the rendered-views contract records brainstorm, design and plan views as a named Artifact exception.
- AC7: planning lanes print the report line.
- AC15: a test registers a fake medium and renders a plan view through it with no edit to the planning skills.
- The planning evals validate with no FAIL; the shared-copies script passes --check-bump.
Out of scope
- The chrome and redraw binding (next slice)
- CI evidence of the Artifact default (out of scope by owner decision)
Metadata
Metadata
Assignees
Labels
No labels
Type
Fields
No fields configured for Feature.
Activity
github-actions commentedon Nov 3, 2026
github-actions commentedon Nov 3, 2026
melodic-automation-lanes commentedon Nov 3, 2026
The work-resolve-issue lane stopped on this issue (
stopped): the run stopped for a reason it gave no code for, which names no intent, design, security or cost finding, so the lane runs it again only if the issue has had no retry, for any stop, since a listed human last added agent-ready, and otherwise stops.It keeps
agent-ready, and work-unblock starts it again (retry 1 of 1).In the run's words:
What the run says it did not do:
Run: https://github.com/melodic-software/claude-code-plugins/actions/runs/41575263987
melodic-automation-lanes commentedon Nov 3, 2026
This records a re-fire of an earlier refusal, not a new refusal. The lanes kill switch stopped run 41577900261, the work-resolve-issue run that
agent-readystarted, before it did any work; that run ended at 2026-11-03T04:45:14Z. work-unblock has now removed and addedagent-readyback to start a fresh run. A kill-switch refusal is no fault in this issue or the lanes, so it never counts against later re-fires; after limits.limit-stops-per-issue of them since a person last addedagent-readyor a run last reported, work-unblock waits longer before each one, up to 24 hours.github-actions commentedon Nov 3, 2026
melodic-automation-lanes commentedon Nov 3, 2026
This records a re-fire of an earlier refusal, not a new refusal. The lanes kill switch stopped run 41582052472, the work-resolve-issue run that
agent-readystarted, before it did any work; that run ended at 2026-11-03T05:45:31Z. work-unblock has now removed and addedagent-readyback to start a fresh run. A kill-switch refusal is no fault in this issue or the lanes, so it never counts against later re-fires; after limits.limit-stops-per-issue of them since a person last addedagent-readyor a run last reported, work-unblock waits longer before each one, up to 24 hours.1 remaining item
github-actions commentedon Nov 3, 2026
github-actions commentedon Nov 3, 2026
melodic-automation-lanes commentedon Nov 3, 2026
The work-resolve-issue lane stopped on this issue (
blocked-by-pr): the work waits on an open pull request the run names, so the lane runs it again once that pull request merges or closes.It keeps
agent-ready, and work-unblock starts it again once #12714 merges or closes (wait 1 of 2).In the run's words:
What the run says it did not do:
Run: https://github.com/melodic-software/claude-code-plugins/actions/runs/41586979782
melodic-automation-lanes commentedon Nov 3, 2026
The work-resolve-issue run that
agent-readystarted failed or was cancelled before it reported, or it stopped or the token broker refused it because its workflow files differ from main's. work-unblock removed and addedagent-readyback 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.github-actions commentedon Nov 3, 2026
Merge main into feat/12650-planning-view-registry after S8
docs(lib): keep step 4's failure rule for resolver lanes in rendered-…