Skip to content

spec(ai): the STRICT blueprint nav item's label describe still reads 'Nav entry label, or null' — it never tells the design model that null inherits its target's current label, which #20841 wrote on the lenient schema only (cloud#2021 branch B) #21248

Description

@objectstack-fleet

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:aiAI-native — agent / tool / skill metadata, and the MCP surface an agent drivesdocumentationImprovements or additions to documentationdomain:specpriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions