[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M77K3NG58HEWVBJHVR2PHT7C":3,"skill-same:01M77K3NG58HEWVBJHVR2PHT7C":72},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":30,"commitSha":31,"skillDirectory":32,"forksCount":33,"repositoryHtmlUrl":34,"repositoryHomepageUrl":6,"ownerHtmlUrl":35,"ownerBlogUrl":36,"ownerDescription":37,"updatedAt":38,"install":39,"resources":51},"01M77K3NG58HEWVBJHVR2PHT7C","map-containers",null,"C4 container diagram of one software system: deployables, the stores and brokers their tracked configuration binds, and the edges those endpoints resolve to. Use when 'what actually runs', 'deployables and databases', 'modular monolith', 'which services bind to which broker'. Skip for which repositories exist (map-landscape), inside one deployable (map-components), or environment topology.","melodic-software\u002Fclaude-code-plugins","melodic-software","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F58273638?v=4","01M77JVQTXNGKCE4MDFY2BC936","Melodic Software","01M77JVQVN9QDWKAH6W03ANP76",30,"MIT","https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Farchitecture\u002Fskills\u002Fmap-containers\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\ndescription: \"C4 container diagram of one software system: deployables, the stores and brokers their tracked configuration binds, and the edges those endpoints resolve to. Use when 'what actually runs', 'deployables and databases', 'modular monolith', 'which services bind to which broker'. Skip for which repositories exist (map-landscape), inside one deployable (map-components), or environment topology.\"\nargument-hint: \"[system] [--dialect likec4|c4-plantuml] [--out \u003Cdir>]\"\nuser-invocable: true\ndisable-model-invocation: false\nshell: bash\nmetadata:\n  workflow-stage: explore\n  summary: Chart deployables, the stores they bind, and contained modules\n---\n\n## Repository context\n\nThe current repository is both the CONSUMER, whose convention home declares where artifacts land,\nand the DEFAULT SUBJECT, the repository whose tracked files name deployables and stores.\n\nCollect with an **individual** Bash call, one command per call: the project root,\n`git rev-parse --show-toplevel`. Treat a failure (not a repository, git unavailable) as an unknown\nvalue and carry on; `${CLAUDE_PROJECT_DIR}` is the resolver's `--root` either way.\n\nAn optional `[system]` argument is only a focal label. It does not select a subdirectory and it\ndoes not walk for nested repositories. Pass it to the collector as `--focal`. When it is absent,\nthe focal name is the github.com origin repository name, otherwise the directory basename.\n\n## Purpose\n\nAnswer \"what actually runs, and which stores does it bind\" from tracked project files, Dockerfiles,\nprocess manifests, and configuration, dirty files flagged. Every deployable cites the fact that made\nit a container. Every store cites a config key. The scripts collect and render. Do not draw a node\nthe script did not emit, and do not turn a directory name into a service.\n\nThis is the C4 container rung. `map-landscape` is the rung above it. What is inside one deployable\nis `\u002Farchitecture:map-components`. A request trace is `\u002Farchitecture:map-flow`.\n\n## Resolve home and dialect\n\nRead `${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fconfig.md` first. This skill writes into `architecture_dir`.\nIt does not read `landscape_dialect` and it does not add a dialect key. The diagram dialect is\n`diagram_dialect.system` from the authoring-formats topic doc.\n\nRun `bash \"${CLAUDE_PLUGIN_ROOT}\u002Flib\u002Fresolve-convention-home.sh\" --root \"${CLAUDE_PROJECT_DIR}\"` and\nfollow the exit code. Never parse the root instruction file yourself. Exit 0 means read\n`\u003Chome>\u002Farchitecture\u002FREADME.md` for `architecture_dir`. Exit 1, 2, and 3 mean there is no declared\nhome to read.\n\nIn order: `--out \u003Cdir>` wins for this run alone, then a declared `architecture_dir`, then one\nquestion. `architecture_dir` has NO default. An undeclared and unconfirmed home, including every\nnon-interactive run, STOPS and points at `\u002Farchitecture:setup`. Do not invent a directory.\n\nResolve `diagram_dialect.system` by restating this ladder, then running the resolver rather than\nparsing the topic doc yourself. The ladder is a resolution order, not a task list:\n\n```markdown\n1. Anchor at the repository root: `${CLAUDE_PROJECT_DIR}` when set, otherwise\n   `git rev-parse --show-toplevel`. Never a CWD-relative read.\n2. Resolve the convention home `\u003Chome>` with the bundled resolver above. Never hand-parse the root\n   file.\n3. The printed home is repo-relative: join it to the root, then pass\n   `\u003Croot>\u002F\u003Chome>\u002Fauthoring-formats\u002FREADME.md` to the resolver.\n4. Layer order is one layer deep: an explicit `--dialect` argument, then the team convention doc.\n   There is no personal override.\n5. `diagram_dialect.system` has NO default. Allowed values are `likec4` and `c4-plantuml`. When it\n   is unset, write `containers.json` and `containers.md` with the tables, and draw no diagram block.\n6. Degrade soft, and say so. No pointer, no doc, no key, or an unrecognized value (mermaid\n   included, which the convention refuses) each resolve to emitting no view. The resolver names\n   the cause on stderr. Do not hard-fail and do not ask the operator to create the surface\n   mid-task.\n7. Report provenance: the key, the value, and the layer (`argument`, `team convention doc \u003Cpath>`,\n   or `unset (no C4 view emitted)`).\n```\n\n```bash\nbash \"${CLAUDE_PLUGIN_ROOT}\u002Flib\u002Fresolve-diagram-dialect.sh\" --kind system \\\n  --formats \"\u003Croot>\u002F\u003Chome>\u002Fauthoring-formats\u002FREADME.md\"\n```\n\nOmit `--formats` when no convention home resolved. Stdout is `likec4`, `c4-plantuml`, or `none`.\nAn explicit `--dialect likec4|c4-plantuml` on the invocation wins and the resolver is not required.\n\nThis skill never writes the consumer's root instruction file or its topic doc. `\u002Farchitecture:setup\napply` owns both.\n\n## Build the record\n\nWhen `\u003Carchitecture_dir>\u002Fdependency-graph.json` already exists and is schema_version 1, pass it as\n`--graph`. Containment then comes from that graph's project edges and is not re-derived. Otherwise\nomit `--graph`. The collector reads `ProjectReference` Include attributes itself and records\n`containment` as `project-references`.\n\n```bash\n\"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fcollect-containers.sh\" \\\n  --repo \"\u003Csubject-repo>\" --out \"\u003Carchitecture_dir>\u002Fcontainers.json\" \\\n  --focal \"\u003Csystem-or-omit>\" --graph \"\u003Cdependency-graph.json-or-omit>\"\n```\n\nKeep the `${CLAUDE_SKILL_DIR}` anchor;\n[`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fconfig.md` § Script paths](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fconfig.md#script-paths)\nsays why.\n\nThe record is schema_version 1 in the one-object-per-line layout the script writes. Container lines\nstart with `{\"id\":`. Module lines start with `{\"container\":`. Edge lines start with `{\"from\":`.\nFinding lines, in an optional `findings` array, start with `{\"kind\":`. A deployable `kind` is\n`web`, `api`, `worker`, `cli`, `function`, or `process`. A store `kind` is `store`. `technology` is\na runtime, framework, or image, or the literal `unknown`. An edge `kind` is `uses` or\n`shared-infrastructure`. A store with three owners is three `shared-infrastructure` edges, one per\npair of owners, and each cites the config keys of both. A `uses` edge runs from a deployable to\nanother deployable and cites the config key that names the endpoint and the fact that resolved it.\n\nThe store kinds read are `sql` (a relational or document database), `storage` (a blob storage\naccount), `broker` (a message broker), `cache`, and `search` (a search index service). A compose\nservice whose image is postgres, mysql, mariadb, mssql, mongo, redis, rabbitmq, nats, kafka,\nelasticsearch, or opensearch is a store of the matching kind. Any other kind of store is not read,\nso none is drawn.\n\nA `search` store's `technology` is `Azure AI Search`, `OpenSearch`, `Elasticsearch`, or `unknown`,\nchosen from the host by `store_technology` in `collect-containers.sh`; a compose service's is its\nimage. A search store is drawn as a database element.\n\nAn `http` or `https` URL is a search store, not an endpoint, when its host is a search-service domain\n`store_technology` names or when the last segment of its config key contains `elasticsearch`,\n`opensearch`, `searchendpoint`, or `searchservice`. Such a URL with a bare host, such as\n`ElasticsearchUrl: http:\u002F\u002Felasticsearch:9200` naming a compose service, draws no store, edge, or\nfinding; the compose service's image charts the store, and nothing links a deployable to it.\n\nAn endpoint is an `http` or `https` URL a deployable's own configuration names. It is an edge only\nwhen it resolves to exactly one other deployable through a cited fact: a compose service whose\nbuild context is that deployable's directory (the URL host is the service name and any declared\nport equals the URL's, or is 80 for an `http` URL and 443 for an `https` URL that names no port),\nor a `launchSettings.json` `applicationUrl` on that deployable (host\n`localhost` or `127.0.0.1`, same port). A name's resemblance to a deployable resolves nothing. An\nendpoint that resolves to no deployable or to several draws no edge and is an `external-endpoint`\nfinding carrying its redacted host. A deployable naming itself draws no edge.\n\nA `sql` store is one host, port, and database. The database comes from `Initial Catalog` or\n`Database` in a connection string, or the first path segment of a `postgres:\u002F\u002F`, `postgresql:\u002F\u002F`,\n`mysql:\u002F\u002F`, or `mongodb:\u002F\u002F` URL. Two databases on one server are two stores and no shared edge. A\nconnection that names no database is the store `database unknown`, and a shared edge between its\nowners says `same server, database unknown`. A `sql` store's `technology` is its URL scheme\n(`mongodb`, `postgres`, `mysql`), `Azure SQL` for a `database.windows.net` host, and otherwise\n`unknown`. A connection string names no scheme, so it is never labeled SQL.\n\nRedaction is `${CLAUDE_PLUGIN_ROOT}\u002Flib\u002Fredact-connection.sh` (the awk beside it). A password,\ntoken, account key, or URL userinfo must not appear in the record, the diagram, or stdout. A\ndatabase name is kept only when it is a plain identifier that carries no credential.\n\nThe collector matches tracked files. It does not execute them. It lists the files at HEAD and reads\neach one from the working tree, so an edit to a tracked file is charted. When `git status` reports\ntracked files that differ from HEAD, the record carries a `dirty-tracked-files` finding with their\ncount, and the collector says so on stderr. Untracked files are never read. A class library is a\ncontained module, not a container, even when its directory name sounds like a service.\n\nA test project is not a deployable. A project that sets `IsTestProject` to true, or references\n`Microsoft.NET.Test.Sdk` or a package whose id starts with `xunit`, `NUnit`, `MSTest`, or\n`Microsoft.Testing.Platform`, is left off the diagram even when it would otherwise be one (an\n`OutputType` Exe, or a web, worker, or functions SDK). The record carries an\n`excluded-test-projects` finding with their count and paths.\n\n## Render\n\n```bash\n\"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Frender-containers.sh\" \\\n  --record \"\u003Carchitecture_dir>\u002Fcontainers.json\" --out \"\u003Carchitecture_dir>\" \\\n  --dialect \"\u003Clikec4|c4-plantuml|none>\"\n```\n\nWrite `containers.json` first, then render from it. `c4-plantuml` writes `containers.md` with one\nfenced `plantuml` block (`C4_Container`: a `System_Boundary` holding `Container`, `ContainerDb`, and\n`ContainerQueue` elements). `likec4` writes `containers.md` with one fenced `likec4` block (the same\nelements nested in the software system, and a container view). `none` writes `containers.md`\nwith the tables and no diagram block. Contained modules are named on their deployable. They are\nnot drawn as containers.\n\nThe script prints one summary line on stdout:\n`containers: focal=\u003Cname> deployables=\u003Cn> stores=\u003Cn> modules=\u003Cn> edges=\u003Cn> shared=\u003Cn> unknown_technology=\u003Cn> thin=\u003Cyes|no> dialect=\u003Clikec4|c4-plantuml|none> excluded_tests=\u003Cn> dirty_tracked_files=\u003Cn>`.\nKeep it for the report. A result is thin when `deployables=0`. `shared=` counts\n`shared-infrastructure` edges, so it counts owner pairs, not stores.\n\nExit 1 means the record is unreadable, not schema_version 1, or not in the one-object-per-line\nlayout. Nothing was written. Report that message. Do not reformat the record by hand and do not\ntreat a layout failure as an empty diagram.\n\n## Close with the report\n\nEnd every run with this block, in this order, filled from the record and the script exits:\n\n- **Artifacts**: each path written, or `none written` when the run stopped before a home existed.\n- **Focal**: the system name, and that it is the repository being charted.\n- **Deployables**: the summary's `deployables=` count, and that kind came from output type, host\n  builder, Dockerfile, or process manifest.\n- **Stores**: the summary's `stores=` count, and that the kinds read are sql, storage, broker,\n  cache, and search. Every store cites a file and a config key.\n- **Edges**: the summary's `edges=` count, which includes `uses` and `shared-infrastructure` edges,\n  and the count of `external-endpoint` findings. Each `uses` edge cites the config key and the\n  resolving fact.\n- **Modules**: the summary's `modules=` count. A modular monolith is one container.\n- **Shared**: the summary's `shared=` count. Each shared-infrastructure edge is one pair of owners\n  and cites the config keys of both.\n- **Excluded**: the summary's `excluded_tests=` count of test projects left off the diagram.\n- **Working tree**: the summary's `dirty_tracked_files=` count. Above zero, say the record charts\n  the working-tree content of those files, not HEAD.\n- **Dialect**: `diagram_dialect.system`, its value, and the layer: `argument`,\n  `team convention doc \u003Cpath>`, or `unset (no C4 view emitted)`.\n- **Technology**: `unknown_technology=` from the summary. `unknown` is literal, not a guess.\n- **Containment source**: `dependency-graph.json` or `project-references`.\n- **Thin result**: `no`, or `yes` because no deployable was found. Name `\u002Farchitecture:map-landscape`\n  when the question was which repositories exist.\n- **Redaction**: the record keeps host, service kind, and a sql database name. It does not keep the\n  raw value.\n\n## Interactive view\n\nAfter the report, offer an interactive view of `containers.json` in one sentence. The markdown and the record\nstay authoritative. Build it only with `${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fbuild-view.mjs containers`, never\nhand-written; the shared medium resolver decides the destination, with this plugin's `medium` option\n`${user_config.medium}`, or `\"\"` when that reads empty or unsubstituted (never put a\n`${user_config.*}` string in a shell command), and its report line is printed. Procedure:\n[`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Frendered-view.md`](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Frendered-view.md).\n\n## What this skill does NOT do\n\n- Draw environment topology, replicas, or scaling. That is `\u002Farchitecture:map-deployment`.\n- Chart the modules inside one deployable as their own diagram. That is `\u002Farchitecture:map-components`.\n- Trace a request. That is `\u002Farchitecture:map-flow`.\n- Add a dialect key, read `landscape_dialect`, or draw mermaid C4.\n- Execute configuration, fetch anything, or edit a project file. The only writes are\n  `containers.json` and `containers.md` under the resolved output directory.\n- Invent a home. No declared, no `--out`, and no confirmed `architecture_dir` is a stop, not a\n  default.\n- Treat two projects in one repository as an edge. An edge needs a cited store binding or a\n  configured endpoint that resolves to a charted deployable. An endpoint that resolves to none is\n  an `external-endpoint` finding, not an edge.\n\n## Next\n\n- Inside one deployable, or one request's path through it: `\u002Farchitecture:map-components` or\n  `\u002Farchitecture:map-flow`.\n- Neighboring repositories need a landscape: `\u002Farchitecture:map-landscape`.\n- The view opens a topology or binding change to decide: `\u002Fplanning:design system`.\n- The view settles a decision worth keeping: `\u002Farchitecture:record-decision`.\n\n## Gotchas\n\n- **A container diagram is one software system.** It draws the containers inside that one system,\n  and no deployment concerns. Pointer: when checking a container view's scope or elements, fetch\n  [C4 container diagram § Scope](https:\u002F\u002Fc4model.com\u002Fdiagrams\u002Fcontainer#scope),\n  [§ Primary elements](https:\u002F\u002Fc4model.com\u002Fdiagrams\u002Fcontainer#primary-elements) and\n  [§ Notes](https:\u002F\u002Fc4model.com\u002Fdiagrams\u002Fcontainer#notes) live.\n- **C4-PlantUML container syntax: read against the README, never run.** The renderer writes the\n  macros. No PlantUML run has parsed this output. Pointer: when checking the macros or the\n  include the renderer writes, fetch\n  [C4-PlantUML README § Container diagram](https:\u002F\u002Fgithub.com\u002Fplantuml-stdlib\u002FC4-PlantUML\u002Fblob\u002Fmaster\u002FREADME.md#container-diagram)\n  and\n  [§ Including the C4-PlantUML library](https:\u002F\u002Fgithub.com\u002Fplantuml-stdlib\u002FC4-PlantUML\u002Fblob\u002Fmaster\u002FREADME.md#including-the-c4-plantuml-library)\n  live.\n- **LikeC4 container syntax: parsed by the CLI.** The record is a probe: `likec4@1.59.4\n  validate` exits 0 on the golden blocks in `${CLAUDE_PLUGIN_ROOT}\u002Flib\u002Flikec4-golden\u002F`\n  (`containers.c4`, `containers-stores.c4`, `containers-broker.c4`, `containers-endpoints.c4`),\n  which `collect-containers.test.sh` diffs against. Pointer: when checking the syntax the\n  collector writes, fetch\n  [LikeC4 specification § Element kind](https:\u002F\u002Flikec4.dev\u002Fdsl\u002Fspecification\u002F#element-kind),\n  [model § Element](https:\u002F\u002Flikec4.dev\u002Fdsl\u002Fmodel\u002F#element),\n  [views § Scoped views](https:\u002F\u002Flikec4.dev\u002Fdsl\u002Fviews\u002F#scoped-views) and\n  [styling § Shape](https:\u002F\u002Flikec4.dev\u002Fdsl\u002Fstyling\u002F#shape) live. As of: 2026-11-10. Recheck\n  trigger: any of those sections changes that syntax, or a newer `likec4` release ships: set\n  `LIKEC4_VALIDATE=1` when running the test to re-run the CLI.\n- **A search store is read from a host or a compose image.** A host ending\n  `.search.windows.net` is labeled `Azure AI Search`. Pointer: when checking the service's\n  endpoint form, fetch\n  [Create a search service § Name your service](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fsearch\u002Fsearch-create-service-portal#name-your-service)\n  live. The other hosts the collector labels are listed in\n  `store_technology`; a search service on any other host is labeled `unknown`.\n- **An endpoint is not an edge until it resolves.** A `localhost` URL with no `applicationUrl` on a\n  charted deployable, a service name with no compose build context, and a URL naming an external\n  service are all `external-endpoint` findings. A `uses` edge is one per ordered pair.\n- **Directory names are not deployables.** `Microsoft.NET.Sdk.Web` in a directory named Worker is a\n  web host. A class library in a directory named Api is a module. Host-builder usage is read only\n  for a project that is already an entry point (web SDK, worker SDK, functions, or `OutputType` Exe).\n- **A modular monolith is one container.** Libraries reached by project references are listed as\n  contained modules. They are not drawn as containers. When `dependency-graph.json` is passed, those\n  edges are the only containment. A `ProjectReference` the graph does not have is not a module.\n- **Shared infrastructure cites both keys.** Two deployables that name the same broker host produce\n  one `shared-infrastructure` edge whose evidence lists both config keys. Three produce three, one\n  per pair. Sitting in the same repository does not. Two deployables on one SQL server with\n  different databases share nothing.\n- **Redaction keeps the shape.** Host, service kind, and a sql database name are the fact. Userinfo,\n  passwords, account keys, and secret-only values produce no field. The raw value is not stored.\n  `package.json` is not scanned. `containers.json` is not scanned again.\n- **A URL that names several hosts is not read.** `mongodb:\u002F\u002Fa:27017,b:27017\u002Fdb` yields no store.\n  Report it as a gap when the repository uses that form.\n- **`unknown` is a technology value.** A Dockerfile with no `FROM`, a `FROM` that names a build\n  variable (`$BASE`), a compose service with no image, or a SQL connection string with no URL scheme\n  is technology `unknown`. Do not invent a runtime from the service name. The image is the last\n  `FROM`, without its digest and without `--platform` and other options. A last `FROM` that names an\n  earlier stage takes that stage's image.\n- **The dialect key is `diagram_dialect.system`, and it has no default.** Every C4 view of the\n  code reads the key the authoring-formats convention assigns to C4 system views, the same key `\u002Fplanning:design` reads for its design container view. It refuses\n  mermaid. Unset, `containers.md` carries the tables and no diagram,\n  and the report says no view was emitted. The key is documented in\n  `${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fconfig.md`.\n  Mermaid stays out, and `render-containers.sh` has no mermaid C4 path. The decision, its pointer\n  and its recheck trigger live in the convention's\n  [record](https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fdocs\u002Fcontracts\u002Fauthoring-formats\u002FREADME.md#why-mermaid-is-not-offered-for-the-system-key).\n- **A reformatted record reads as empty unless the reader refuses it.** `render-containers.sh`\n  exits 1 on any other shape and writes nothing.\n- **Configuration is untrusted text.** The assignment scanner matches it. It does not source it,\n  eval it, or interpolate it into a command.\n- **A quote in repository-controlled text is replaced, not preserved.** A name lands inside a\n  quoted diagram literal. The delimiter is swapped for one that cannot close the literal.\n","## Repository context\n\nThe current repository is both the CONSUMER, whose convention home declares where artifacts land,\nand the DEFAULT SUBJECT, the repository whose tracked files name deployables and stores.\n\nCollect with an **individual** Bash call, one command per call: the project root,\n`git rev-parse --show-toplevel`. Treat a failure (not a repository, git unavailable) as an unknown\nvalue and carry on; `${CLAUDE_PROJECT_DIR}` is the resolver's `--root` either way.\n\nAn optional `[system]` argument is only a focal label. It does not select a subdirectory and it\ndoes not walk for nested repositories. Pass it to the collector as `--focal`. When it is absent,\nthe focal name is the github.com origin repository name, otherwise the directory basename.\n\n## Purpose\n\nAnswer \"what actually runs, and which stores does it bind\" from tracked project files, Dockerfiles,\nprocess manifests, and configuration, dirty files flagged. Every deployable cites the fact that made\nit a container. Every store cites a config key. The scripts collect and render. Do not draw a node\nthe script did not emit, and do not turn a directory name into a service.\n\nThis is the C4 container rung. `map-landscape` is the rung above it. What is inside one deployable\nis `\u002Farchitecture:map-components`. A request trace is `\u002Farchitecture:map-flow`.\n\n## Resolve home and dialect\n\nRead `${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fconfig.md` first. This skill writes into `architecture_dir`.\nIt does not read `landscape_dialect` and it does not add a dialect key. The diagram dialect is\n`diagram_dialect.system` from the authoring-formats topic doc.\n\nRun `bash \"${CLAUDE_PLUGIN_ROOT}\u002Flib\u002Fresolve-convention-home.sh\" --root \"${CLAUDE_PROJECT_DIR}\"` and\nfollow the exit code. Never parse the root instruction file yourself. Exit 0 means read\n`\u003Chome>\u002Farchitecture\u002FREADME.md` for `architecture_dir`. Exit 1, 2, and 3 mean there is no declared\nhome to read.\n\nIn order: `--out \u003Cdir>` wins for this run alone, then a declared `architecture_dir`, then one\nquestion. `architecture_dir` has NO default. An undeclared and unconfirmed home, including every\nnon-interactive run, STOPS and points at `\u002Farchitecture:setup`. Do not invent a directory.\n\nResolve `diagram_dialect.system` by restating this ladder, then running the resolver rather than\nparsing the topic doc yourself. The ladder is a resolution order, not a task list:\n\n```markdown\n1. Anchor at the repository root: `${CLAUDE_PROJECT_DIR}` when set, otherwise\n   `git rev-parse --show-toplevel`. Never a CWD-relative read.\n2. Resolve the convention home `\u003Chome>` with the bundled resolver above. Never hand-parse the root\n   file.\n3. The printed home is repo-relative: join it to the root, then pass\n   `\u003Croot>\u002F\u003Chome>\u002Fauthoring-formats\u002FREADME.md` to the resolver.\n4. Layer order is one layer deep: an explicit `--dialect` argument, then the team convention doc.\n   There is no personal override.\n5. `diagram_dialect.system` has NO default. Allowed values are `likec4` and `c4-plantuml`. When it\n   is unset, write `containers.json` and `containers.md` with the tables, and draw no diagram block.\n6. Degrade soft, and say so. No pointer, no doc, no key, or an unrecognized value (mermaid\n   included, which the convention refuses) each resolve to emitting no view. The resolver names\n   the cause on stderr. Do not hard-fail and do not ask the operator to create the surface\n   mid-task.\n7. Report provenance: the key, the value, and the layer (`argument`, `team convention doc \u003Cpath>`,\n   or `unset (no C4 view emitted)`).\n```\n\n```bash\nbash \"${CLAUDE_PLUGIN_ROOT}\u002Flib\u002Fresolve-diagram-dialect.sh\" --kind system \\\n  --formats \"\u003Croot>\u002F\u003Chome>\u002Fauthoring-formats\u002FREADME.md\"\n```\n\nOmit `--formats` when no convention home resolved. Stdout is `likec4`, `c4-plantuml`, or `none`.\nAn explicit `--dialect likec4|c4-plantuml` on the invocation wins and the resolver is not required.\n\nThis skill never writes the consumer's root instruction file or its topic doc. `\u002Farchitecture:setup\napply` owns both.\n\n## Build the record\n\nWhen `\u003Carchitecture_dir>\u002Fdependency-graph.json` already exists and is schema_version 1, pass it as\n`--graph`. Containment then comes from that graph's project edges and is not re-derived. Otherwise\nomit `--graph`. The collector reads `ProjectReference` Include attributes itself and records\n`containment` as `project-references`.\n\n```bash\n\"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Fcollect-containers.sh\" \\\n  --repo \"\u003Csubject-repo>\" --out \"\u003Carchitecture_dir>\u002Fcontainers.json\" \\\n  --focal \"\u003Csystem-or-omit>\" --graph \"\u003Cdependency-graph.json-or-omit>\"\n```\n\nKeep the `${CLAUDE_SKILL_DIR}` anchor;\n[`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fconfig.md` § Script paths](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fconfig.md#script-paths)\nsays why.\n\nThe record is schema_version 1 in the one-object-per-line layout the script writes. Container lines\nstart with `{\"id\":`. Module lines start with `{\"container\":`. Edge lines start with `{\"from\":`.\nFinding lines, in an optional `findings` array, start with `{\"kind\":`. A deployable `kind` is\n`web`, `api`, `worker`, `cli`, `function`, or `process`. A store `kind` is `store`. `technology` is\na runtime, framework, or image, or the literal `unknown`. An edge `kind` is `uses` or\n`shared-infrastructure`. A store with three owners is three `shared-infrastructure` edges, one per\npair of owners, and each cites the config keys of both. A `uses` edge runs from a deployable to\nanother deployable and cites the config key that names the endpoint and the fact that resolved it.\n\nThe store kinds read are `sql` (a relational or document database), `storage` (a blob storage\naccount), `broker` (a message broker), `cache`, and `search` (a search index service). A compose\nservice whose image is postgres, mysql, mariadb, mssql, mongo, redis, rabbitmq, nats, kafka,\nelasticsearch, or opensearch is a store of the matching kind. Any other kind of store is not read,\nso none is drawn.\n\nA `search` store's `technology` is `Azure AI Search`, `OpenSearch`, `Elasticsearch`, or `unknown`,\nchosen from the host by `store_technology` in `collect-containers.sh`; a compose service's is its\nimage. A search store is drawn as a database element.\n\nAn `http` or `https` URL is a search store, not an endpoint, when its host is a search-service domain\n`store_technology` names or when the last segment of its config key contains `elasticsearch`,\n`opensearch`, `searchendpoint`, or `searchservice`. Such a URL with a bare host, such as\n`ElasticsearchUrl: http:\u002F\u002Felasticsearch:9200` naming a compose service, draws no store, edge, or\nfinding; the compose service's image charts the store, and nothing links a deployable to it.\n\nAn endpoint is an `http` or `https` URL a deployable's own configuration names. It is an edge only\nwhen it resolves to exactly one other deployable through a cited fact: a compose service whose\nbuild context is that deployable's directory (the URL host is the service name and any declared\nport equals the URL's, or is 80 for an `http` URL and 443 for an `https` URL that names no port),\nor a `launchSettings.json` `applicationUrl` on that deployable (host\n`localhost` or `127.0.0.1`, same port). A name's resemblance to a deployable resolves nothing. An\nendpoint that resolves to no deployable or to several draws no edge and is an `external-endpoint`\nfinding carrying its redacted host. A deployable naming itself draws no edge.\n\nA `sql` store is one host, port, and database. The database comes from `Initial Catalog` or\n`Database` in a connection string, or the first path segment of a `postgres:\u002F\u002F`, `postgresql:\u002F\u002F`,\n`mysql:\u002F\u002F`, or `mongodb:\u002F\u002F` URL. Two databases on one server are two stores and no shared edge. A\nconnection that names no database is the store `database unknown`, and a shared edge between its\nowners says `same server, database unknown`. A `sql` store's `technology` is its URL scheme\n(`mongodb`, `postgres`, `mysql`), `Azure SQL` for a `database.windows.net` host, and otherwise\n`unknown`. A connection string names no scheme, so it is never labeled SQL.\n\nRedaction is `${CLAUDE_PLUGIN_ROOT}\u002Flib\u002Fredact-connection.sh` (the awk beside it). A password,\ntoken, account key, or URL userinfo must not appear in the record, the diagram, or stdout. A\ndatabase name is kept only when it is a plain identifier that carries no credential.\n\nThe collector matches tracked files. It does not execute them. It lists the files at HEAD and reads\neach one from the working tree, so an edit to a tracked file is charted. When `git status` reports\ntracked files that differ from HEAD, the record carries a `dirty-tracked-files` finding with their\ncount, and the collector says so on stderr. Untracked files are never read. A class library is a\ncontained module, not a container, even when its directory name sounds like a service.\n\nA test project is not a deployable. A project that sets `IsTestProject` to true, or references\n`Microsoft.NET.Test.Sdk` or a package whose id starts with `xunit`, `NUnit`, `MSTest`, or\n`Microsoft.Testing.Platform`, is left off the diagram even when it would otherwise be one (an\n`OutputType` Exe, or a web, worker, or functions SDK). The record carries an\n`excluded-test-projects` finding with their count and paths.\n\n## Render\n\n```bash\n\"${CLAUDE_SKILL_DIR}\u002Fscripts\u002Frender-containers.sh\" \\\n  --record \"\u003Carchitecture_dir>\u002Fcontainers.json\" --out \"\u003Carchitecture_dir>\" \\\n  --dialect \"\u003Clikec4|c4-plantuml|none>\"\n```\n\nWrite `containers.json` first, then render from it. `c4-plantuml` writes `containers.md` with one\nfenced `plantuml` block (`C4_Container`: a `System_Boundary` holding `Container`, `ContainerDb`, and\n`ContainerQueue` elements). `likec4` writes `containers.md` with one fenced `likec4` block (the same\nelements nested in the software system, and a container view). `none` writes `containers.md`\nwith the tables and no diagram block. Contained modules are named on their deployable. They are\nnot drawn as containers.\n\nThe script prints one summary line on stdout:\n`containers: focal=\u003Cname> deployables=\u003Cn> stores=\u003Cn> modules=\u003Cn> edges=\u003Cn> shared=\u003Cn> unknown_technology=\u003Cn> thin=\u003Cyes|no> dialect=\u003Clikec4|c4-plantuml|none> excluded_tests=\u003Cn> dirty_tracked_files=\u003Cn>`.\nKeep it for the report. A result is thin when `deployables=0`. `shared=` counts\n`shared-infrastructure` edges, so it counts owner pairs, not stores.\n\nExit 1 means the record is unreadable, not schema_version 1, or not in the one-object-per-line\nlayout. Nothing was written. Report that message. Do not reformat the record by hand and do not\ntreat a layout failure as an empty diagram.\n\n## Close with the report\n\nEnd every run with this block, in this order, filled from the record and the script exits:\n\n- **Artifacts**: each path written, or `none written` when the run stopped before a home existed.\n- **Focal**: the system name, and that it is the repository being charted.\n- **Deployables**: the summary's `deployables=` count, and that kind came from output type, host\n  builder, Dockerfile, or process manifest.\n- **Stores**: the summary's `stores=` count, and that the kinds read are sql, storage, broker,\n  cache, and search. Every store cites a file and a config key.\n- **Edges**: the summary's `edges=` count, which includes `uses` and `shared-infrastructure` edges,\n  and the count of `external-endpoint` findings. Each `uses` edge cites the config key and the\n  resolving fact.\n- **Modules**: the summary's `modules=` count. A modular monolith is one container.\n- **Shared**: the summary's `shared=` count. Each shared-infrastructure edge is one pair of owners\n  and cites the config keys of both.\n- **Excluded**: the summary's `excluded_tests=` count of test projects left off the diagram.\n- **Working tree**: the summary's `dirty_tracked_files=` count. Above zero, say the record charts\n  the working-tree content of those files, not HEAD.\n- **Dialect**: `diagram_dialect.system`, its value, and the layer: `argument`,\n  `team convention doc \u003Cpath>`, or `unset (no C4 view emitted)`.\n- **Technology**: `unknown_technology=` from the summary. `unknown` is literal, not a guess.\n- **Containment source**: `dependency-graph.json` or `project-references`.\n- **Thin result**: `no`, or `yes` because no deployable was found. Name `\u002Farchitecture:map-landscape`\n  when the question was which repositories exist.\n- **Redaction**: the record keeps host, service kind, and a sql database name. It does not keep the\n  raw value.\n\n## Interactive view\n\nAfter the report, offer an interactive view of `containers.json` in one sentence. The markdown and the record\nstay authoritative. Build it only with `${CLAUDE_PLUGIN_ROOT}\u002Fscripts\u002Fbuild-view.mjs containers`, never\nhand-written; the shared medium resolver decides the destination, with this plugin's `medium` option\n`${user_config.medium}`, or `\"\"` when that reads empty or unsubstituted (never put a\n`${user_config.*}` string in a shell command), and its report line is printed. Procedure:\n[`${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Frendered-view.md`](${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Frendered-view.md).\n\n## What this skill does NOT do\n\n- Draw environment topology, replicas, or scaling. That is `\u002Farchitecture:map-deployment`.\n- Chart the modules inside one deployable as their own diagram. That is `\u002Farchitecture:map-components`.\n- Trace a request. That is `\u002Farchitecture:map-flow`.\n- Add a dialect key, read `landscape_dialect`, or draw mermaid C4.\n- Execute configuration, fetch anything, or edit a project file. The only writes are\n  `containers.json` and `containers.md` under the resolved output directory.\n- Invent a home. No declared, no `--out`, and no confirmed `architecture_dir` is a stop, not a\n  default.\n- Treat two projects in one repository as an edge. An edge needs a cited store binding or a\n  configured endpoint that resolves to a charted deployable. An endpoint that resolves to none is\n  an `external-endpoint` finding, not an edge.\n\n## Next\n\n- Inside one deployable, or one request's path through it: `\u002Farchitecture:map-components` or\n  `\u002Farchitecture:map-flow`.\n- Neighboring repositories need a landscape: `\u002Farchitecture:map-landscape`.\n- The view opens a topology or binding change to decide: `\u002Fplanning:design system`.\n- The view settles a decision worth keeping: `\u002Farchitecture:record-decision`.\n\n## Gotchas\n\n- **A container diagram is one software system.** It draws the containers inside that one system,\n  and no deployment concerns. Pointer: when checking a container view's scope or elements, fetch\n  [C4 container diagram § Scope](https:\u002F\u002Fc4model.com\u002Fdiagrams\u002Fcontainer#scope),\n  [§ Primary elements](https:\u002F\u002Fc4model.com\u002Fdiagrams\u002Fcontainer#primary-elements) and\n  [§ Notes](https:\u002F\u002Fc4model.com\u002Fdiagrams\u002Fcontainer#notes) live.\n- **C4-PlantUML container syntax: read against the README, never run.** The renderer writes the\n  macros. No PlantUML run has parsed this output. Pointer: when checking the macros or the\n  include the renderer writes, fetch\n  [C4-PlantUML README § Container diagram](https:\u002F\u002Fgithub.com\u002Fplantuml-stdlib\u002FC4-PlantUML\u002Fblob\u002Fmaster\u002FREADME.md#container-diagram)\n  and\n  [§ Including the C4-PlantUML library](https:\u002F\u002Fgithub.com\u002Fplantuml-stdlib\u002FC4-PlantUML\u002Fblob\u002Fmaster\u002FREADME.md#including-the-c4-plantuml-library)\n  live.\n- **LikeC4 container syntax: parsed by the CLI.** The record is a probe: `likec4@1.59.4\n  validate` exits 0 on the golden blocks in `${CLAUDE_PLUGIN_ROOT}\u002Flib\u002Flikec4-golden\u002F`\n  (`containers.c4`, `containers-stores.c4`, `containers-broker.c4`, `containers-endpoints.c4`),\n  which `collect-containers.test.sh` diffs against. Pointer: when checking the syntax the\n  collector writes, fetch\n  [LikeC4 specification § Element kind](https:\u002F\u002Flikec4.dev\u002Fdsl\u002Fspecification\u002F#element-kind),\n  [model § Element](https:\u002F\u002Flikec4.dev\u002Fdsl\u002Fmodel\u002F#element),\n  [views § Scoped views](https:\u002F\u002Flikec4.dev\u002Fdsl\u002Fviews\u002F#scoped-views) and\n  [styling § Shape](https:\u002F\u002Flikec4.dev\u002Fdsl\u002Fstyling\u002F#shape) live. As of: 2026-11-10. Recheck\n  trigger: any of those sections changes that syntax, or a newer `likec4` release ships: set\n  `LIKEC4_VALIDATE=1` when running the test to re-run the CLI.\n- **A search store is read from a host or a compose image.** A host ending\n  `.search.windows.net` is labeled `Azure AI Search`. Pointer: when checking the service's\n  endpoint form, fetch\n  [Create a search service § Name your service](https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fazure\u002Fsearch\u002Fsearch-create-service-portal#name-your-service)\n  live. The other hosts the collector labels are listed in\n  `store_technology`; a search service on any other host is labeled `unknown`.\n- **An endpoint is not an edge until it resolves.** A `localhost` URL with no `applicationUrl` on a\n  charted deployable, a service name with no compose build context, and a URL naming an external\n  service are all `external-endpoint` findings. A `uses` edge is one per ordered pair.\n- **Directory names are not deployables.** `Microsoft.NET.Sdk.Web` in a directory named Worker is a\n  web host. A class library in a directory named Api is a module. Host-builder usage is read only\n  for a project that is already an entry point (web SDK, worker SDK, functions, or `OutputType` Exe).\n- **A modular monolith is one container.** Libraries reached by project references are listed as\n  contained modules. They are not drawn as containers. When `dependency-graph.json` is passed, those\n  edges are the only containment. A `ProjectReference` the graph does not have is not a module.\n- **Shared infrastructure cites both keys.** Two deployables that name the same broker host produce\n  one `shared-infrastructure` edge whose evidence lists both config keys. Three produce three, one\n  per pair. Sitting in the same repository does not. Two deployables on one SQL server with\n  different databases share nothing.\n- **Redaction keeps the shape.** Host, service kind, and a sql database name are the fact. Userinfo,\n  passwords, account keys, and secret-only values produce no field. The raw value is not stored.\n  `package.json` is not scanned. `containers.json` is not scanned again.\n- **A URL that names several hosts is not read.** `mongodb:\u002F\u002Fa:27017,b:27017\u002Fdb` yields no store.\n  Report it as a gap when the repository uses that form.\n- **`unknown` is a technology value.** A Dockerfile with no `FROM`, a `FROM` that names a build\n  variable (`$BASE`), a compose service with no image, or a SQL connection string with no URL scheme\n  is technology `unknown`. Do not invent a runtime from the service name. The image is the last\n  `FROM`, without its digest and without `--platform` and other options. A last `FROM` that names an\n  earlier stage takes that stage's image.\n- **The dialect key is `diagram_dialect.system`, and it has no default.** Every C4 view of the\n  code reads the key the authoring-formats convention assigns to C4 system views, the same key `\u002Fplanning:design` reads for its design container view. It refuses\n  mermaid. Unset, `containers.md` carries the tables and no diagram,\n  and the report says no view was emitted. The key is documented in\n  `${CLAUDE_PLUGIN_ROOT}\u002Freference\u002Fconfig.md`.\n  Mermaid stays out, and `render-containers.sh` has no mermaid C4 path. The decision, its pointer\n  and its recheck trigger live in the convention's\n  [record](https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fdocs\u002Fcontracts\u002Fauthoring-formats\u002FREADME.md#why-mermaid-is-not-offered-for-the-system-key).\n- **A reformatted record reads as empty unless the reader refuses it.** `render-containers.sh`\n  exits 1 on any other shape and writes nothing.\n- **Configuration is untrusted text.** The assignment scanner matches it. It does not source it,\n  eval it, or interpolate it into a command.\n- **A quote in repository-controlled text is replaced, not preserved.** A name lands inside a\n  quoted diagram literal. The delimiter is swapped for one that cannot close the literal.\n",{"shell":24,"metadata":25,"description":7,"argument-hint":28,"user-invocable":29,"disable-model-invocation":20},"bash",{"summary":26,"workflow-stage":27},"Chart deployables, the stores they bind, and contained modules","explore","[system] [--dialect likec4|c4-plantuml] [--out \u003Cdir>]",true,"main","d0e68c3f36b92a1d6381f0ba0060d7a0b8b886c5","plugins\u002Farchitecture\u002Fskills\u002Fmap-containers",7,"https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins","https:\u002F\u002Fgithub.com\u002Fmelodic-software","https:\u002F\u002Fmelodicsoftware.com","Independent software studio building developer tools, automation, and application services, with roots in music.","2026-11-15 05:15:06",{"source":8,"skillName":5,"commands":40,"prompt":50,"zipAvailable":29},[41,44,47],{"tool":42,"command":43},"npx","npx skills add melodic-software\u002Fclaude-code-plugins --skill map-containers",{"tool":45,"command":46},"bunx","bunx skills add melodic-software\u002Fclaude-code-plugins --skill map-containers",{"tool":48,"command":49},"pnpm","pnpm dlx skills add melodic-software\u002Fclaude-code-plugins --skill map-containers","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Farchitecture\u002Fskills\u002Fmap-containers\u002FSKILL.md",[52,58,64,68],{"path":53,"resourceType":54,"resourceTypeDesc":55,"sizeBytes":56,"sourceHtmlUrl":57},"evals\u002Fevals.json","REFERENCE","参考文档",5947,"https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Farchitecture\u002Fskills\u002Fmap-containers\u002Fevals\u002Fevals.json",{"path":59,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":62,"sourceHtmlUrl":63},"scripts\u002Fcollect-containers.sh","SCRIPT","脚本",33956,"https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Farchitecture\u002Fskills\u002Fmap-containers\u002Fscripts\u002Fcollect-containers.sh",{"path":65,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":66,"sourceHtmlUrl":67},"scripts\u002Fcollect-containers.test.sh",49838,"https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Farchitecture\u002Fskills\u002Fmap-containers\u002Fscripts\u002Fcollect-containers.test.sh",{"path":69,"resourceType":60,"resourceTypeDesc":61,"sizeBytes":70,"sourceHtmlUrl":71},"scripts\u002Frender-containers.sh",11611,"https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Farchitecture\u002Fskills\u002Fmap-containers\u002Fscripts\u002Frender-containers.sh",[73,80,87,94,99,106],{"skillNo":74,"name":75,"nameZh":6,"description":76,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":77,"categories":78,"keywords":79,"publishedAt":19},"01M7DYYDG31B9YX7N9MB9QW2GW","track","Backlog reads through the bound tracker: search open and closed items, view one item with its comments and state history. Use when another skill searches or reads tracker items.","https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fsession-flow\u002Fevals\u002Frecall-still-reports-reopened-bug\u002Fwork-items-stub\u002Fskills\u002Ftrack\u002FSKILL.md",[],[],{"skillNo":81,"name":82,"nameZh":6,"description":83,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":84,"categories":85,"keywords":86,"publishedAt":19},"01M7DYXVBAVG3NV30PA7GKW9Q6","reviewer-media","Reviewer media for one pull request: decides whether it needs a narrated walkthrough, builds the storyboard from \u002Freview:explain-change's digest, has \u002Fexplainer-video:produce render it and hands the manifest to \u002Fsource-control:pull-request media. Use when asked for 'reviewer media', 'a walkthrough video for this PR', 'a produced video of this change', or when pull-request ready or monitor hands a PR over.","https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Freview\u002Fskills\u002Freviewer-media\u002FSKILL.md",[],[],{"skillNo":88,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":93,"publishedAt":19},"01M7DYRZ5YD44AMYH26YR25GZ8","route","Model and effort per agent role (orchestrator, worker, verifier, retrieval) for a multi-agent run, resolved through the bundled defaults and the user, team and personal override config layers into fenced JSON with single-agent and fan-out variants and the layer behind each value. Use when asked 'which model for the subagents', 'route the roles' or 'model routing', or before a skill passes a role's model on a spawn.","https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fdiscovery\u002Fevals\u002Fex-model-pin-without-override\u002Fmulti-agent-stub\u002Fskills\u002Froute\u002FSKILL.md",[],[],{"skillNo":95,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":98,"publishedAt":19},"01M7DYRTVT4FWTGDJY0HCCFJMZ","https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fdiscovery\u002Fevals\u002Fex-model-override-from-route\u002Fmulti-agent-stub\u002Fskills\u002Froute\u002FSKILL.md",[],[],{"skillNo":100,"name":101,"nameZh":6,"description":102,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":103,"categories":104,"keywords":105,"publishedAt":19},"01M7DYNZC8PNW3T27V2ADKECKJ","principles","Module-design vocabulary for architecture findings, and the checks built on it. Use when: 'what is a deep module', 'what is a seam', 'deep vs shallow module', 'what is the deletion test', 'leverage and locality', 'module design vocabulary', 'which word do we use for X in architecture findings'. Scanning a codebase for friction is \u002Farchitecture:improve.","https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Farchitecture\u002Fskills\u002Fprinciples\u002FSKILL.md",[],[],{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":112,"publishedAt":19},"01M7DYNMCZNEWBFHV9KTSS6H60","write","Structured five-field bug report (title, steps to reproduce, expected vs actual, justified severity, suggested fix location) from an informal description, read-only. Use when the user names a defect they observed, or asks for one written up ('report a bug', 'file a bug', 'write this up as a bug').","https:\u002F\u002Fgithub.com\u002Fmelodic-software\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Farchitecture\u002Fevals\u002Fdeepening-defect-goes-to-bugs-write\u002Fbugs-stub\u002Fskills\u002Fwrite\u002FSKILL.md",[],[]]