Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
0fd08fb
Resolve issue #12672
melodic-automation-lanes[bot] Nov 3, 2026
adec27b
Fix failing CI checks on work-resolve-issue/issue-12672-41723143585-1
melodic-automation-lanes[bot] Nov 4, 2026
c371e77
Merge main into work-resolve-issue/issue-12672-41723143585-1
melodic-automation-lanes[bot] Nov 4, 2026
0893087
Merge remote-tracking branch 'origin/work-resolve-issue/issue-12672-4…
kyle-sexton Nov 4, 2026
504eff8
refactor(architecture): major bump and retired-file wording for the m…
kyle-sexton Nov 4, 2026
ee680d2
Merge origin/main
kyle-sexton Nov 4, 2026
35e29cd
fix(architecture): say what to do when the resolver rejects a named m…
kyle-sexton Nov 4, 2026
abf354f
Merge remote-tracking branch 'origin/main' into fix/12991-replacement
kyle-sexton Nov 4, 2026
33e8dd6
Merge origin/main
kyle-sexton Nov 4, 2026
9dd9406
Merge main into fix/12991-replacement
melodic-automation-lanes[bot] Nov 4, 2026
612522f
Merge main into fix/12991-replacement
melodic-automation-lanes[bot] Nov 4, 2026
e83afa1
chore: start the lane checks again on main's workflow files
melodic-automation-lanes[bot] Nov 4, 2026
a132c08
Merge main into fix/12991-replacement
melodic-automation-lanes[bot] Nov 4, 2026
9f7d1ee
Merge origin/main into fix/12991-replacement
kyle-sexton Nov 4, 2026
6c4c2c6
Merge main into fix/12991-replacement
melodic-automation-lanes[bot] Nov 4, 2026
c0f17f1
Merge remote-tracking branch 'origin/main' into HEAD
kyle-sexton Nov 4, 2026
5eef443
fix(architecture): drop the architecture row from the view-medium exe…
kyle-sexton Nov 4, 2026
17f4260
Merge origin/main
kyle-sexton Nov 4, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
---
bump: major
---

### Added

- A `medium` plugin option that sets where the architecture views go. It declares `options`, so the plugin now needs Claude Code v2.1.271 or later ([Limit a field to fixed options](https://code.claude.com/docs/en/plugins/manifest-reference#limit-a-field-to-fixed-options)).

### Changed

- The `map-*` views and the `improve` deepening report now resolve their medium through the shared resolver (`lib/view-settings.mjs resolve --lane architecture`) and print its report line.

### Removed

- `~/.claude/rendered-views.md` and the `.claude/rendered-views*.md` files no longer choose a publishing medium: an `artifact` or `hosted` value there is ignored. A `terminal` or `file` value there still keeps the view local when no scope sets a value. Each file gives one notice per project naming where to set the medium instead: this plugin's `medium` option, `docs/conventions/rendered-views.yaml`, or `docs/conventions/rendered-views.local.yaml`.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
bump: patch
---

### Changed

- The shared `reference/rendered-view.md` now lists `architecture` as a medium-resolver lane beside `planning`; the post-mortem view still reads the rendered-views cascade itself.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
bump: patch
---

### Changed

- The shared `reference/rendered-view.md` now lists `architecture` as a medium-resolver lane beside `planning`; the blindspot view still reads the rendered-views cascade itself.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
bump: patch
---

### Changed

- The shared `reference/rendered-view.md` now lists `architecture` as a medium-resolver lane beside `planning`, and adds the architecture deepening report's medium rules.
6 changes: 4 additions & 2 deletions docs/contracts/rendered-views/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -584,13 +584,15 @@ Emitters that resolve `medium` through the shared resolver (see The `rendered-vi
keeping their shipped default only when no scope sets it: `adhd:clarify`. Its output prints the
resolver's report line and notices.

`architecture:improve` resolves `medium` through the shared resolver (lane `architecture`, see
"The `rendered-views` settings") and publishes nothing: `terminal` skips the HTML report and leaves
the candidate artifact; every other value writes the local report.

Emitters that resolve `medium` from the argument, then the cascade, and publish nothing themselves.
None has a `medium` option, so no
plugin dial sits between the argument and the cascade. Each names the source of `medium`, or
"shipped default", and keeps its shipped behavior when no layer sets one:

- `architecture:improve`: `terminal` skips the HTML report and leaves the candidate artifact;
every other value writes the local report.
- `education:teach` (topic mode): `terminal` writes `lesson.md`; `file` keeps the host-aware
format choice and drops the artifact-share offer; `artifact` and `hosted` keep the offer.
- `prototype:explore-directions`: the mockup stays a local file at every value; `terminal` and
Expand Down
54 changes: 36 additions & 18 deletions lib/rendered-view.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# Rendered views of a skill's record

How a view lane offers an interactive view of the record its skill wrote. The lanes that carry this file:
planning (`/planning:plan`, `/planning:brainstorm`, `/planning:design`), architecture (the `map-*` skills), discovery
planning (`/planning:plan`, `/planning:brainstorm`, `/planning:design`), architecture (the `map-*` skills
and the `/architecture:improve` deepening report), discovery
(`/discovery:blindspot`) and debugging (`/debugging:debug`). Each lane's section below names its record,
build command and data shape. `<plugin-root>` is the plugin's root directory, the one that holds
`.claude-plugin/`: the path the calling skill gave for this file, cut before its first `skills/` or
Expand All @@ -22,23 +23,26 @@ script written in the session.
2. **Offer the view in one sentence.** Build only when the reader accepts and the environment can serve a
file. A CI or other non-interactive run emits no view: the record stands.
3. **Resolve `medium`.** The path depends on whether the lane's skill has migrated to the shared medium
resolver, not on whether the resolver registers the lane. `planning` and `debugging` have migrated;
architecture and discovery are registered but read the cascade themselves until their own change
migrates them.
- **Resolver lanes** (`planning`). The lane's build command runs the resolver, the publish gate and
delivery in one call: follow its section in place of steps 3 and 5, and step 4's rule for a missing
`node` or a non-zero exit still applies. Do not read the rendered-views convention files yourself.
- **Resolver lanes** (`debugging`). Run the resolver. `--option` takes this plugin's `medium` option as the
calling skill states it; add `--argument` only when the reader named a medium in the request:

```bash
node "<plugin-root>/lib/view-settings.mjs" resolve --lane <lane> --option "<medium option>" [--argument terminal|file|artifact]
```

It prints one JSON line, then the report line naming the medium and what decided it, then any notice;
print those lines as they stand. The JSON's `medium` is the one to use: `terminal`, `file` or `artifact`.
Do not read the rendered-views convention files yourself. When `node` is missing, the builder cannot run
either: deliver the record.
resolver, not on whether the resolver registers the lane. `planning`, `architecture` and `debugging`
have migrated; discovery is registered but reads the cascade itself until its own change migrates it.
- **Resolver lanes** (`planning`, `architecture`, `debugging`). Do not read the rendered-views convention
files yourself.
- `planning`: the lane's build command runs the resolver, the publish gate and delivery in one call:
follow its section in place of steps 3 and 5, and step 4's rule for a missing `node` or a non-zero
exit still applies.
- `architecture`, `debugging`: run the resolver with the `--lane` its section names. `--option` takes
this plugin's `medium` option as the calling skill states it; add `--argument` only when the reader
named a medium in the request:

```bash
node "<plugin-root>/lib/view-settings.mjs" resolve --lane <lane> --option "<medium option>" [--argument terminal|file|artifact]
```

It prints one JSON line, then the report line naming the medium and what decided it, then any notice;
print those lines as they stand. The JSON's `medium` is the one to use: `terminal`, `file` or
`artifact`. When `node` is missing, the builder cannot run either: deliver the record. When the
resolver exits 2 with its usage line, the argument names no medium: report it as unknown and resolve
again without `--argument`.
- **Other lanes.** Read the `rendered-views` cascade surface: `~/.claude/rendered-views.md`, then
`<repo root>/.claude/rendered-views.md`, then `<repo root>/.claude/rendered-views.local.md`, whichever
exist. The last layer that states `medium:` wins (`auto`, `terminal`, `file`, `artifact`). A team layer
Expand Down Expand Up @@ -202,6 +206,7 @@ with no `## Design` section exits 1.

The `map-*` skills record a markdown file and a JSON record; both stay authoritative. A record holds
manifest paths, connection hosts, type names and file citations. Write the record and its markdown first.
Resolver lane: `--lane architecture`.

Build: pass the record file to the builder. The first argument is the skill's kind, and the record is the
file in the table below:
Expand Down Expand Up @@ -237,6 +242,19 @@ other row takes the first of `id`, `name`, `message`, `title`, `path`, `entry`,
field it holds, evidence citations included. The filter matches a row's whole text, so typing a node id lists the
node and every edge, finding and cycle that names it. The page draws no diagram: the markdown holds that.

### The deepening report

`/architecture:improve deepening` writes its HTML report itself, not through the builder, and only ever as a
local file. Before writing it, resolve `medium` as step 3 does, passing the skill's `--medium` value as
`--argument`, and print the resolver's lines. When the resolver exits 2 with its usage line, the
`--medium` value names no medium: report it as unknown and resolve again without `--argument`. Then, by
the JSON's `medium`:

- `terminal`: write no report. The durable candidate artifact and the reply are the deliverable.
- `file`: write the local report.
- `artifact`: write the local report. This lane publishes nothing, so say that a publishing value was read
as `file`.

## Discovery: blindspot

`/discovery:blindspot` records the blindspot cards and the improved prompt as written in the conversation,
Expand Down
9 changes: 9 additions & 0 deletions plugins/architecture/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,15 @@
"email": "info@melodicsoftware.com"
},
"version": "1.4.9",
"userConfig": {
"medium": {
"type": "string",
"title": "Preferred delivery medium",
"description": "Where the map-* views and the improve report go. auto (default): a local file; terminal: no page; file: a local file; artifact: a private Artifact (the improve report stays a local file); hosted is read as artifact. A team rendered-views file never publishes.",
"default": "auto",
"options": ["auto", "terminal", "file", "artifact", "hosted"]
}
},
Comment thread
kyle-sexton marked this conversation as resolved.
Resolved
Comment thread
kyle-sexton marked this conversation as resolved.
Resolved
Comment thread
kyle-sexton marked this conversation as resolved.
Resolved
"license": "MIT",
"keywords": [
"architecture",
Expand Down
84 changes: 82 additions & 2 deletions plugins/architecture/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -151,8 +151,10 @@ places no container is refused. `--live` is refused.
Each `map-*` skill offers an interactive view of its JSON record after the report: a filter that
traces an id through every row naming it, and rows that open to their fields and citations. The markdown
and the record stay authoritative. The page is a checked-in template plus the record as escaped data, so
repository text never becomes markup or script. Where it is delivered comes from the `medium` key of the
`rendered-views` cascade (`file` when unset). The procedure is in `reference/rendered-view.md`.
repository text never becomes markup or script. Where it is delivered, and where the `improve` deepening
report goes, comes from the shared medium resolver, which reads the plugin's `medium` option and the
`rendered-views` files in `docs/conventions` (a local file when none sets it). The procedure is in
`reference/rendered-view.md`.

## Record a decision

Expand Down Expand Up @@ -240,6 +242,84 @@ above.
/plugin install architecture@melodic-software
```

<!-- BEGIN GENERATED: plugin options. Edit plugin.json, then run scripts/sync-plugin-options-docs.py -->

### Options reference

Generated from this plugin's `.claude-plugin/plugin.json`. Every option Claude Code
will prompt for when the plugin is enabled, with the environment variable each hook
reads it from.

| Option | Type | Default | Environment variable | Description |
| --- | --- | --- | --- | --- |
| `medium` | string | `"auto"` | `CLAUDE_PLUGIN_OPTION_MEDIUM` | Where the map-* views and the improve report go. auto (default): a local file; terminal: no page; file: a local file; artifact: a private Artifact (the improve report stays a local file); hosted is read as artifact. A team rendered-views file never publishes. |

### How to set these

Three supported routes:

1. **Interactively.** Open this plugin's options dialog ([`/plugin` in a session](https://code.claude.com/docs/en/plugins/cli-reference#plugin-in-a-session)):
`/plugin configure architecture@<marketplace>`.
2. **Headless.** Save the values with [`claude plugin configure`](https://code.claude.com/docs/en/plugins/cli-reference#plugin-configure),
run from the project the plugin is installed in. Replace
`<marketplace>` with the marketplace you installed this plugin from:

```shell
claude plugin configure architecture@<marketplace> --values-stdin < values.json
```

`values.json` holds a JSON object of strings, booleans included:

```json
{"medium": "<value>"}
```

This is the preferred headless route in the [plugin-reconfiguration convention](https://github.com/melodic-software/claude-code-plugins/blob/main/docs/contracts/plugin-reconfiguration/README.md), which records its
limits: the Claude Code version it needs, which install it finds, how it rejects a bad
value, and why a session started before the change keeps the old value until a fresh
session starts. Do **not** `claude plugin uninstall` to reconfigure: see
[What an uninstall deletes and keeps](https://code.claude.com/docs/en/plugins/cli-reference#what-an-uninstall-deletes-and-keeps).

The fallback the convention names, for a Claude Code release without
`plugin configure`, reruns the install with the new value, passing the scope
`claude plugin list` reports for this plugin:

```shell
claude plugin install architecture@<marketplace> -s <scope> --config medium=<value>
```

3. **By hand, in settings.** Add the value under `pluginConfigs` in your **user**
settings (`~/.claude/settings.json`):

```json
{
"pluginConfigs": {
"architecture@<marketplace>": {
"options": {
"medium": <value>
}
}
}
}
```

The [`pluginConfigs`](https://code.claude.com/docs/en/settings-reference#pluginconfigs)
entry names the settings scopes Claude Code reads this key from.

Do not set the `CLAUDE_PLUGIN_OPTION_*` variables yourself; set the value through one
of the routes above.

### Upstream documentation

- [User configuration](https://code.claude.com/docs/en/plugins/manifest-reference#user-configuration): the `userConfig` schema and the `CLAUDE_PLUGIN_OPTION_<KEY>` export
- [Plugin configure](https://code.claude.com/docs/en/plugins/cli-reference#plugin-configure): the `--values-stdin` flag's reference entry
- [Plugin install options](https://code.claude.com/docs/en/plugins/cli-reference#plugin-install): the `--config` flag's reference entry
- [Plugins and skills settings](https://code.claude.com/docs/en/settings-reference#plugins-and-skills): `enabledPlugins`, `extraKnownMarketplaces`, `pluginConfigs`
- [Settings files and who they affect](https://code.claude.com/docs/en/settings#settings-files-and-who-they-affect): user vs project vs local precedence
- [Manage installed plugins](https://code.claude.com/docs/en/plugins/install#manage-installed-plugins): enabling, disabling, `/plugin list`

<!-- END GENERATED: plugin options -->

## License

MIT (SPDX-License-Identifier: MIT).
54 changes: 36 additions & 18 deletions plugins/architecture/reference/rendered-view.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ edit the canonical source, then rerun the script. -->
# Rendered views of a skill's record

How a view lane offers an interactive view of the record its skill wrote. The lanes that carry this file:
planning (`/planning:plan`, `/planning:brainstorm`, `/planning:design`), architecture (the `map-*` skills), discovery
planning (`/planning:plan`, `/planning:brainstorm`, `/planning:design`), architecture (the `map-*` skills
and the `/architecture:improve` deepening report), discovery
(`/discovery:blindspot`) and debugging (`/debugging:debug`). Each lane's section below names its record,
build command and data shape. `<plugin-root>` is the plugin's root directory, the one that holds
`.claude-plugin/`: the path the calling skill gave for this file, cut before its first `skills/` or
Expand All @@ -25,23 +26,26 @@ script written in the session.
2. **Offer the view in one sentence.** Build only when the reader accepts and the environment can serve a
file. A CI or other non-interactive run emits no view: the record stands.
3. **Resolve `medium`.** The path depends on whether the lane's skill has migrated to the shared medium
resolver, not on whether the resolver registers the lane. `planning` and `debugging` have migrated;
architecture and discovery are registered but read the cascade themselves until their own change
migrates them.
- **Resolver lanes** (`planning`). The lane's build command runs the resolver, the publish gate and
delivery in one call: follow its section in place of steps 3 and 5, and step 4's rule for a missing
`node` or a non-zero exit still applies. Do not read the rendered-views convention files yourself.
- **Resolver lanes** (`debugging`). Run the resolver. `--option` takes this plugin's `medium` option as the
calling skill states it; add `--argument` only when the reader named a medium in the request:

```bash
node "<plugin-root>/lib/view-settings.mjs" resolve --lane <lane> --option "<medium option>" [--argument terminal|file|artifact]
```

It prints one JSON line, then the report line naming the medium and what decided it, then any notice;
print those lines as they stand. The JSON's `medium` is the one to use: `terminal`, `file` or `artifact`.
Do not read the rendered-views convention files yourself. When `node` is missing, the builder cannot run
either: deliver the record.
resolver, not on whether the resolver registers the lane. `planning`, `architecture` and `debugging`
have migrated; discovery is registered but reads the cascade itself until its own change migrates it.
- **Resolver lanes** (`planning`, `architecture`, `debugging`). Do not read the rendered-views convention
files yourself.
- `planning`: the lane's build command runs the resolver, the publish gate and delivery in one call:
follow its section in place of steps 3 and 5, and step 4's rule for a missing `node` or a non-zero
exit still applies.
- `architecture`, `debugging`: run the resolver with the `--lane` its section names. `--option` takes
this plugin's `medium` option as the calling skill states it; add `--argument` only when the reader
named a medium in the request:

```bash
node "<plugin-root>/lib/view-settings.mjs" resolve --lane <lane> --option "<medium option>" [--argument terminal|file|artifact]
```

It prints one JSON line, then the report line naming the medium and what decided it, then any notice;
print those lines as they stand. The JSON's `medium` is the one to use: `terminal`, `file` or
`artifact`. When `node` is missing, the builder cannot run either: deliver the record. When the
resolver exits 2 with its usage line, the argument names no medium: report it as unknown and resolve
again without `--argument`.
- **Other lanes.** Read the `rendered-views` cascade surface: `~/.claude/rendered-views.md`, then
`<repo root>/.claude/rendered-views.md`, then `<repo root>/.claude/rendered-views.local.md`, whichever
exist. The last layer that states `medium:` wins (`auto`, `terminal`, `file`, `artifact`). A team layer
Expand Down Expand Up @@ -205,6 +209,7 @@ with no `## Design` section exits 1.

The `map-*` skills record a markdown file and a JSON record; both stay authoritative. A record holds
manifest paths, connection hosts, type names and file citations. Write the record and its markdown first.
Resolver lane: `--lane architecture`.

Build: pass the record file to the builder. The first argument is the skill's kind, and the record is the
file in the table below:
Expand Down Expand Up @@ -240,6 +245,19 @@ other row takes the first of `id`, `name`, `message`, `title`, `path`, `entry`,
field it holds, evidence citations included. The filter matches a row's whole text, so typing a node id lists the
node and every edge, finding and cycle that names it. The page draws no diagram: the markdown holds that.

### The deepening report

`/architecture:improve deepening` writes its HTML report itself, not through the builder, and only ever as a
local file. Before writing it, resolve `medium` as step 3 does, passing the skill's `--medium` value as
`--argument`, and print the resolver's lines. When the resolver exits 2 with its usage line, the
`--medium` value names no medium: report it as unknown and resolve again without `--argument`. Then, by
the JSON's `medium`:

- `terminal`: write no report. The durable candidate artifact and the reply are the deliverable.
- `file`: write the local report.
- `artifact`: write the local report. This lane publishes nothing, so say that a publishing value was read
as `file`.

## Discovery: blindspot

`/discovery:blindspot` records the blindspot cards and the improved prompt as written in the conversation,
Expand Down
Loading
Loading