fix(items): align the catalog with spec #80 — renames, resourceType, and the external LLM node - #28
Merged
Merged
Conversation
musher-dev/spec #80 merged on 2026-09-12 and landed three breaking changes. This suite fetches the spec bundles from main unpinned, so every item went red that day. ADR 0007 renames the fields, ADR 0009 turns semanticType into a namespaced resourceType, and ADR 0019 adds the external component node. The items and the harness interlock, so they land together: neither half goes green without the other. Items, mechanical and with no behaviour change, so no revision is bumped: - metadata.version becomes metadata.revision in all 39 documents - workload.kind becomes workload.type, isRequired/isSensitive become required/sensitive, sizeGib becomes sizeGiB - the blueprint node's component becomes componentRef - the `value: null` on postgres's and redis's DERIVED outputs is dropped - their semanticType POSTGRES/REDIS become dev.musher.postgresql.address and dev.musher.redis.address. Both values are host:port, not connection strings, and #27's "no item uses the field" was wrong about these two. Harness (tests/lib/semantic.ts): - reads componentRef and metadata.revision; ERR_VERSION_MISMATCH keeps its code - ERR_INCOMPATIBLE_SEMANTIC_TYPE becomes ERR_INCOMPATIBLE_RESOURCE_TYPE - BP-CONN-001: ERR_INPUT_NOT_CONNECTABLE when a wire fills a non-CONNECTION input - BP-NODE-002: ERR_CONFLICTING_NODE_COMPUTE, where size is null iff the component is external - COMP-OUT-002/003: ERR_UNKNOWN_INPUT_REFERENCE and ERR_INPUT_NOT_REFERENCEABLE - blueprint §5.3: ERR_INCOMPATIBLE_PARAMETER_RESOURCE_TYPE, and a parameter carrying a platformDefault now guarantees a value rules.test.ts moves to the new spelling and gains a case for each new rule. Each clean case also validates structurally against the fetched bundles. Checked against the spec's own conformance trees (blueprint semantic 010/013/015/022/024-029, component semantic 016-018): every emitted code set matches diagnostics.json. Refs #27. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DkZpdcmz7gfNrqKaA36Noa
The first item on spec ADR 0019's external node. It is one component declaring spec.external with resourceType dev.musher.llm.chat-completions. Its USER inputs are baseUrl, apiKey and an optional model, and it republishes each as a valueFrom: INPUT output, so a consumer wiring two of them from one fromRole takes them from one source by construction. The item carries no vendor name anywhere, and its listing says plainly that nothing validates the address or connects to it, which component §11 makes a rule rather than an omission. There is no icon: ICONS.md covers upstream marks only, and this item has no upstream. It holds no blueprint.yaml. Listing §3.1 permits that for a COMPONENT item, and a one-node blueprint around a node that runs nothing would deploy nothing. The catalog's layout rule therefore narrows to "a BLUEPRINT item must hold one". The structural blueprint check skips such an item, and the README records the rule beside the postgres/redis wrapping it keeps. Refs #24. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DkZpdcmz7gfNrqKaA36Noa
…ling that is not there
open-webui's ollamaBaseUrl defaulted to http://ollama:11434, a sibling service
this deployment never contained, and its own description said so. Spec ADR
0019 makes the real shape expressible, so the blueprint now has two
participants:
- models: a copy of llm-endpoint's external component, size: null
- web: Open WebUI, whose new CONNECTION inputs openaiApiBaseUrl, openaiApiKey
and the optional defaultModels are wired from models, each carrying the
node's resourceType
parameters stays {}, so the install form is derived: the endpoint's URL, key and
model name asked for once, together, then the generated signing key (ui.order
moves from 3 to 4 so it sorts after them).
enableOllamaApi and ollamaBaseUrl are gone. ENABLE_OLLAMA_API is pinned false
and ENABLE_OPENAI_API pinned true, and an Ollama server is reached through the
node via its OpenAI-compatible /v1.
Checked against the v0.10.2 source: OPENAI_API_BASE_URL and OPENAI_API_KEY feed
DEFAULT_CONFIG, and Config.get prefers a stored row over that default. The
endpoint therefore holds until an admin saves Connections in the UI and is
ignored after that, including on redeploy. The listing says so, rather than
implying a redeploy re-points the UI.
The copy is structural rather than chosen: a repo-local reference cannot leave
its item. A new corpus test holds every external component sharing a
resourceType to one contract, so the copies cannot drift.
Revisions: component 3 to 4, blueprint and listing 1 to 2.
Refs #25.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DkZpdcmz7gfNrqKaA36Noa
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Why
musher-dev/specifications#80 merged on 2026-09-12. This suite fetches the spec bundles from
mainunpinned, so every item has failed validation since. That PR landed three ADRs:metadata.revision,workload.type,componentRef,required/sensitive,sizeGiB, …), nonullwhere omission means the same, and identifier grammars.semanticTypebecomes a namespacedresourceType.spec.external, a node the platform does not run, withvalueFrom: INPUT,size: null, and new semantic rules.This PR is the catalog half. The platform follows in musher-dev/platform#2650–#2653.
Commits
fix(items): re-spell the corpus and enforce the new rules (Re-spell every item for the ADR 0007 renames and the new identifier grammars #27)semanticType: POSTGRES/REDISbecomedev.musher.postgresql.addressanddev.musher.redis.address. Both values arehost:port, and Re-spell every item for the ADR 0007 renames and the new identifier grammars #27's note that no item used the field was wrong about these two.ERR_INPUT_NOT_CONNECTABLE), BP-NODE-002 (ERR_CONFLICTING_NODE_COMPUTE), COMP-OUT-002/003 (ERR_UNKNOWN_INPUT_REFERENCE,ERR_INPUT_NOT_REFERENCEABLE) and §5.3'sERR_INCOMPATIBLE_PARAMETER_RESOURCE_TYPE.ERR_INCOMPATIBLE_SEMANTIC_TYPEbecomesERR_INCOMPATIBLE_RESOURCE_TYPE, and a parameter carrying aplatformDefaultnow guarantees a value.rules.test.tshas a case for each rule.feat(items):llm-endpoint(A standalone llm-endpoint item: one external component, published as a building block #24)COMPONENTitem with no blueprint.BLUEPRINTitem must hold one". A one-node blueprint around a node that runs nothing would deploy nothing.feat(items): open-webui wired to that node (Wire an LLM endpoint node into the four items that need one — open-webui first #25)models(size: null) andweb. Its URL, key and model name are wired from onefromRole.http://ollama:11434default that named a sibling service the deployment never contained.resourceTypeon one contract.Worth a reviewer's attention
Config.get(models/config.py) prefers a stored row over the env-seeded default. The endpoint therefore holds until an admin saves Admin Settings → Connections, and is ignored after that, including on redeploy. The listing says so.diagnostics.jsoncodes (script not committed).Not in this PR
Closes #27. Closes #24. Refs #25.
Test plan
npm run typechecknpm testagainst live specmain: 442 tests, 441 pass, 1 intentional skip (the blueprint check onllm-endpoint)task test:item -- llm-endpoint, open-webui, and the harness run over the spec conformance trees🤖 Generated with Claude Code
https://claude.ai/code/session_01DkZpdcmz7gfNrqKaA36Noa