Filing gate: ① (a declared contract the AI author reads, out of step with its own twin; finding, class a, reach: a named real producer).
Reader: triage routes it on first touch (packages/spec, domain:spec). Filed by the repo:cloud seat (repo:cloud#1, session session_01Wxo1xhh2bU66T73q23jzE4, R44). ⛔ Not a claim.
Dedupe: semantic issue search strict blueprint nav item label describe null inherits target label returned #20841 (closed: the LENIENT describe), #19049 (closed: NavigationItemSchema.label optional) and #20849 (closed). None covers the strict mirror.
What is wrong (read at main and at cloud's pin b42e0346, identical)
packages/spec/src/ai/solution-blueprint.zod.ts:
The strict mirror is the one the design model actually fills. cloud's propose_blueprint design call uses SolutionBlueprintStrictSchema as its output contract (cloud packages/service-ai-studio/src/tools/blueprint-tools.ts:1681 / :1692). Strict mode makes the key required, so the model decides on every entry, and nothing it reads says that null is the inheriting choice. The lenient describe is read by no model on that path.
Why it matters (the cloud#2021 ruling)
The maintainer's ruling on cloud#2021 (5729748574) is sync by render-time inheritance. An entry with no label shows its target's CURRENT label (objectui#9868), and an explicit label is verbatim and never overwritten.
- cloud's applier now stages no label the author did not give (cloud PR objectstack-ai/cloud#2563).
- But the card's captured screen is a label the model wrote: nav 「首页仪表盘」 against the dashboard's 「客户管理仪表盘」. That label stays verbatim by the ruling, and a later rename of the dashboard does not move it.
- Measured by the cloud#2021 dev (report 5941123027): every input the model reads steers it toward writing a label. That includes this describe, the designer prompt's language rule naming "every NAVIGATION label", and labelled examples. So the inheriting entry the ruling enables is reached only when the model happens to write null.
reach: cloud's AI build (propose_blueprint → apply_blueprint), every first build.
The fix (one line, lockstep with its twin)
Give StrictNavItem.label the lenient schema's rule, in the strict form: null ⇒ the entry shows its target's CURRENT label and follows renames; write a label only when the entry must read differently from what it opens. The file already holds the two shapes in lockstep on viewName (:374); label joins them.
- ⛔ No applier-side text matching (dropping a model label equal to its target's): the ruling never overwrites an explicit label.
- ⛔ No new gate.
Acceptance
- The strict describe states the null ⇒ inherit rule. A pin, beside the existing lockstep pin, holds the two
label describes to one rule.
- Downstream (cloud's half, not this card): after cloud's pin carries it, a golden-journey build's nav entries are measured for how many the model leaves null.
Source
cloud#2021 (ruling 5729748574; dev report 5941123027; seat ACCEPT 5941187888, which rules this branch in-seat as the spec's strict describe, with cloud's designer prompt as fallback). Prior: #20841 (the lenient describe), #19049.
Generated by Claude Code
Filing gate: ① (a declared contract the AI author reads, out of step with its own twin;
finding, class a,reach:a named real producer).Reader: triage routes it on first touch (
packages/spec,domain:spec). Filed by therepo:cloudseat (repo:cloud#1, sessionsession_01Wxo1xhh2bU66T73q23jzE4, R44). ⛔ Not a claim.Dedupe: semantic issue search
strict blueprint nav item label describe null inherits target labelreturned #20841 (closed: the LENIENT describe), #19049 (closed:NavigationItemSchema.labeloptional) and #20849 (closed). None covers the strict mirror.What is wrong (read at
mainand at cloud's pinb42e0346, identical)packages/spec/src/ai/solution-blueprint.zod.ts::189, the LENIENTBlueprintNavItemSchema.label, after spec(ai): BlueprintNavItemSchema.label says "defaults to the target label/name", but since 17.5.0 an absent nav label is inherited at render time; an expander that materializes the default freezes the name and loses rename inheritance #20841: "Optional: absent ⇒ the entry inherits the CURRENT label of what it opens at render time (a renamed target shows its new name); present ⇒ rendered verbatim, so never copy the target's label in as a default.":372, the STRICT mirrorStrictNavItem.label:z.string().nullable().describe('Nav entry label, or null').The strict mirror is the one the design model actually fills. cloud's
propose_blueprintdesign call usesSolutionBlueprintStrictSchemaas its output contract (cloudpackages/service-ai-studio/src/tools/blueprint-tools.ts:1681/:1692). Strict mode makes the key required, so the model decides on every entry, and nothing it reads says thatnullis the inheriting choice. The lenient describe is read by no model on that path.Why it matters (the cloud#2021 ruling)
The maintainer's ruling on cloud#2021 (5729748574) is sync by render-time inheritance. An entry with no label shows its target's CURRENT label (objectui#9868), and an explicit label is verbatim and never overwritten.
reach:cloud's AI build (propose_blueprint→apply_blueprint), every first build.The fix (one line, lockstep with its twin)
Give
StrictNavItem.labelthe lenient schema's rule, in the strict form:null⇒ the entry shows its target's CURRENT label and follows renames; write a label only when the entry must read differently from what it opens. The file already holds the two shapes in lockstep onviewName(:374);labeljoins them.Acceptance
labeldescribes to one rule.Source
cloud#2021 (ruling 5729748574; dev report 5941123027; seat ACCEPT 5941187888, which rules this branch in-seat as the spec's strict describe, with cloud's designer prompt as fallback). Prior: #20841 (the lenient describe), #19049.
Generated by Claude Code