Repository navigation
docs(skills): skills/objectui/guides/app-composition.md still says every nav item needs a label "required by NavigationItemSchema" — false since @objectstack/spec 17.5.0 and objectui#9868 (label absent ⇒ inherited) #11198
Description
Activity
objectstack-fleet commented
on Sep 30, 2026 ContributorAuthorMore actionsTriage: first grade —
documentation·priority:p3·domain:skills·area:devpath·pm:queue. Governed; may ride objectui#11183Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-30T10:57Z. ⛔ Not a claim, ⛔ not a dispatch.Triage:
skills/objectui/guides/app-composition.mdis a governed surface ⇒domain:skills, Tier H: it stays draft until an authorized approval.Order met. PR objectui#11186 merged as
a8198de228, so the guide no longer runs ahead of the validator.Why p3. Following the sentence writes a label the entry doesn't need. That is not refused, but it forfeits the inheritance ruling A exists for: a renamed target no longer renames its nav entry.
Direction. One sentence: the id is required; the label is optional, and when it is absent the entry shows its target's current label. It may name when an author label is right (a deliberate nav-only name).
- It rides objectui#11183 (the governed
action:*taught-docs migration, same lane, same tier) if that seat agrees in writing on objectui#11183. Otherwise it is a separate governed PR. - ⛔ Not before objectui#11201's question is ruled, if the ruling changes what a present label means. The sentence here states only absent ⇒ inherit, which holds under every option on objectui#11201.
findingcomes off at grading.- It rides objectui#11183 (the governed
- addedarea:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iteratedocumentationImprovements or additions to documentationImprovements or additions to documentationand removed
on Sep 30, 2026 objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actionsClaim: PM loop round 1 (wave 3)
Session:session_01FNKm1SmPpuJASnbjxWGtsJ
Account:os-elon-musk(the seat's linked user asGET /useranswers it; always the card's assignee)
Branch:claude/issue-11198-app-composition-nav-label-optional
Worktree:objectui-issue-11198
Domain:domain:skills
Seat:domain:skills#1
File surface:skills/objectui/guides/app-composition.md, the one bullet 「Every nav item needs a snake_caseidand alabel(both required byNavigationItemSchema).」 only; plus an empty-frontmatter changeset. ⛔ Not the rest of the file, ⛔ notcontent/docs/**(PR objectui#11186 already corrected the docs guide). Stop on breach; explain in the report.
Container & model:S,mode:subagent,model: CONTRACT_REVIEW_TIER(objectstackscripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectui --tier skills/objectui/guides/app-composition.mdatc7396f1a: MANDATORY — 'skills/**', clause ①, the published catalog; no one-line exemption under this root; Tier H ⇒ draft until an authorized APPROVED review, then the seat lands). Clause ② not reached: prose correction of a published instruction; no accept/reject behaviour or public surface changes.
Clause-②: no
Thread-read: 5909803018
Serial constraints cleared: no open objectui PR touchesskills/objectui/guides/app-composition.md(every open objectui PR's file list read at 2026-10-02T01:37Z; PRs objectui#11418 / objectui#11419, this seat's, edit otherskills/**files); last touch98b1a7ca(2026-09-25T13:13Z) — no same-day churn; the ordering constraint in the card's Direction holds — PR objectui#11186 (objectui#9868, the validator relaxation) merged asa8198de2(2026-09-30T10:16Z) and@objectstack/spec@17.5.0is what objectui's lockfile pins; the ride option objectui#11183 is closed ⇒ separate PR; no openpm:on-holdcard in objectui names this file in aRestart-touch:line.objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 11198, "status": "done", "branch": "claude/issue-11198-app-composition-nav-label-optional", "pr": "https://github.com/objectstack-ai/objectui/pull/11427", "session": "session_01FNKm1SmPpuJASnbjxWGtsJ", "premise_still_valid": true, "summary": "Replaced the one 'Contract Reminders' bullet of skills/objectui/guides/app-composition.md: the id is required; the label is optional and, when absent, the entry shows its target's current label at render time (objectui#9868), so a label is written only for a deliberate nav-only name or a target with no label of its own (page, report, URL, group); plus an empty-frontmatter changeset. Premise re-verified on origin/main e0a9c676 (dispatch read cf38a6ce; skills/ has no diff between the two): NavigationItemObject in packages/types/src/zod/app.zod.ts declares id optional only for the separator and re-imposes it by superRefine, label is optional for every type with only the empty string refused; useNavTargetLabel.ts and NavigationRenderer.tsx implement absent-inherits; pnpm-lock pins @objectstack/spec@17.5.0 and a direct NavigationItemSchema probe from @objectstack/spec/ui parses a label-less object item and refuses an id-less one. objectui#11201 (ruled B) is untouched by the sentence. Draft PR objectui#11427 (Tier H, stays draft; one commit afc7603f), assignee os-elon-musk set and read back; worktree removed.", "tests": "All at commit afc7603f, the branch's only commit, in the worktree; exit codes captured to files before any pipe. check-skills-paths exit 0 ('OK (89/90 stated path(s) resolve across 20 guide file(s); 1 baselined)'); check-skill-eval-tokens --self-test exit 0 (29 cases) and gate exit 0 ('Every must_contain token is taught by its own skill bundle'); check-skill-examples under os-verify-lock.sh (slot issue-11198, waited 0s, held 242s): --build-filter (12 packages) then 'pnpm exec turbo run build FILTER --concurrency=2' 29 tasks successful in 3m00s, --self-test 60 cases pass, gate 'Every marked skill example holds up against the built types' — VERDICT command-exit 0; check-new-cross-file-line-citations with CITATION_GATE_BASE=origin/main exit 0 ('0 new citation(s), enforcement report-only'); check-control-bytes exit 0 (9944 files) plus grep -naP for control bytes over the two changed files: none; check-changeset-presence exit 0 (0 published source changed, 1 changeset added); check-changeset-claims --json exit 0 ('No pending changeset names a file this change touches'); check-changeset-no-major exit 0; check-changeset-overwrite exit 0; check-governed-queue-guard --self-test exit 0 (188 cases) and --test on the two paths exit 3 GOVERNED (expected: skills/**). NOT RUN locally: lint.yml roster (its decide step excludes **/*.md and .changeset/**, so the job reports with steps skipped) and ci.yml plus the always-on doc gates whose scan roots are content/docs, package READMEs and source, not skills/**, with no fence touched — CI owns them. No pin test and no ablation: prose-only change, no code or fence moved. PR body read back via a single REST read: 8200 bytes stored identical to the bytes sent (the relay's read-back agrees), session-URL footer preserved, zero less-than characters.", "gates": [ { "gate": "Skills Paths (check-skills-paths.mjs)", "exit": 0, "verdict": "OK 89/90 stated paths resolve; 1 baselined" }, { "gate": "Skill Example Check (check-skill-examples.mjs --build-filter / build / --self-test / gate)", "exit": 0, "verdict": "29 build tasks ok (3m00s); self-test 60 cases; every marked example holds against built types; lock VERDICT command-exit 0" }, { "gate": "Skill Eval Token Check (check-skill-eval-tokens.mjs --self-test / gate)", "exit": 0, "verdict": "29 self-test cases; every must_contain token taught" }, { "gate": "Line Citation Gate (check-new-cross-file-line-citations.mjs)", "exit": 0, "verdict": "0 new citations, report-only" }, { "gate": "Control Byte Scan (check-control-bytes.mjs + grep -naP on changed files)", "exit": 0, "verdict": "9944 files clean; changed files carry no control byte" }, { "gate": "Changeset Declaration (check-changeset-presence.mjs)", "exit": 0, "verdict": "no published source changed; 1 changeset added" }, { "gate": "Changeset Claim Re-read (check-changeset-claims.mjs --json)", "exit": 0, "verdict": "no pending changeset names a touched file" }, { "gate": "Changeset Bump Policy (check-changeset-no-major.mjs)", "exit": 0, "verdict": "no major bump" }, { "gate": "Changeset Overwrite Report (check-changeset-overwrite.mjs)", "exit": 0, "verdict": "no pre-existing changeset modified or deleted" }, { "gate": "Governed Surface Queue Guard (check-governed-queue-guard.mjs --self-test / --test)", "exit": 3, "verdict": "self-test 188 cases exit 0; --test exit 3 GOVERNED as expected for skills/** — draft until an authorized APPROVED review" }, { "gate": "lint.yml roster", "exit": null, "verdict": "NOT MEASURED locally: diff is **/*.md and .changeset/** only, every path in the decide step's exclude list; CI reports with steps skipped" }, { "gate": "ci.yml and always-on doc gates (docs-links, doc-fence-languages, doc-component-types, doc-example-ids, doc-snippet-types, docs-route-eager-closure, readme-exports)", "exit": null, "verdict": "NOT MEASURED locally: scan roots exclude skills/** and no fence was touched; CI owns them" } ], "line_budget": { "file": { "path": "skills/objectui/guides/app-composition.md", "before": 62, "after": 63, "delta": 1, "budget": 1, "within": true }, "package": { "definition": "every skills/objectui/**/*.md plus every skills/*/SKILL.md", "before": 4808, "after": 4809, "delta": 1, "budget": 1, "within": true }, "note": "the bullet grew from 2 lines to 3; no neighbouring line re-wrapped; objectui has no token ratchet" }, "deviations": [ "pnpm install --config.engine-strict=false in the worktree: container node v22.22.0 is below jsdom@30's ^22.22.2 engines floor under objectui's engine-strict (as the dispatch instructed); install exit 0.", "label-write (PR assignee) first attempt refused by write-pace with exit 10: 40 of 40 writes in the trailing hour on the shared token (f07d7417ce88), reopen printed as 02:02Z (+46s); waited once to that instant and resent once at 02:03:03Z — exit 0, assignee read back MATCHES. No detour, no other channel.", "Worktree base is origin/main e0a9c676, not the cf38a6ce the dispatch read: main moved before the fetch; skills/ carries no diff between the two commits, so the readings (62 / 4808) match the dispatch's." ], "files_changed": [ "skills/objectui/guides/app-composition.md", ".changeset/11198-app-composition-nav-label-optional.md" ], "mcp_calls": "0 — no MCP GitHub calls (reads: two zero-quota issue-page payload fetches for objectui#11198 and objectui#11201; two single-card REST reads of PR objectui#11427 via gh api; the tools' own read-backs)", "api_writes": "3 REST writes, all through the fleet-write relay as objectstack-fleet[bot]: POST /repos/objectstack-ai/objectui/pulls (pr_create, draft; relay run 36953649848); POST /repos/objectstack-ai/objectui/issues/11427/assignees (label-write --assign os-elon-musk; relay run 36953813107, after one refused-then-resent attempt that wrote nothing); POST /repos/objectstack-ai/objectui/issues/11198/comments (this report, via post-stamped). Zero label writes. Plus 2 git pushes to the branch (not REST): the empty-branch probe and commit afc7603f.", "open_questions": [], "out_of_scope_findings": [ "observation, not a filing class · skills/objectui/evals/app-composition.json eval id 3: its expected_output prose still lists 'a snake_case id, and a label' for the rewritten item; its must_contain tokens are objectName, type, id (no label) and the prompt's item already carries label Projects, so keeping it is the present-renders-as-authored half of the ruling · reach: none (grader prose, no runtime or gate reads it) · dedupe words: app-composition eval expected_output label Projects · carrier: none · noted in the PR's Acceptance notes, not filed" ] }
Generated by Claude Code
objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actions✅ ACCEPT: PR #11427 at
afc7603f— Tier H, awaiting an authorized APPROVED reviewSkills seat 1 (
domain:skills#1),session_01FNKm1SmPpuJASnbjxWGtsJ(os-elon-musk), 2026-10-02T02:17Z. Checked against the PR's patch, objectuimain(app.zod.ts,useNavTargetLabel.ts, the docs guide) and the head's check-runs, not against the report's narrative. Claim 5944024007 · report 5944250186 · contract review PASS on this head, rendered in-seat atCONTRACT_REVIEW_TIERon the PR.item reading PR shape draft, base main,Fixes #11198first line,Clause-②: noat line start, 2 files (+7 / −2), assigneeos-elon-musk, zero labels, 速读(草稿) five sections, session-URL footer, no model identifierscope the one 「Contract Reminders」 bullet; empty-frontmatter changeset; nothing else in the guide moved the text idrequired;labeloptional — absent ⇒ the target's current label at render time (objectui#9868); a label is written only for a deliberate nav-only name or a target with no label of its own (page, report, URL, group)premise re-verified on e0a9c676:NavigationItemObjectre-imposesidby refinement for every type but the separator;labeloptional for all (empty string refused);useNavTargetLabel.ts/NavigationRenderer.tsximplement absent-inherits; lockfile pins@objectstack/spec@17.5.0; PR objectui#11186 merged first (a8198de2)budget +1 of +1: 62 → 63; bundle 4808 → 4809; no re-wrap gates skills-paths 89/90 (1 baselined), skill-examples (build 29 tasks + 60 self-test cases + gate) under the verify lock, eval-tokens, line-citation (0 new), control bytes, changeset presence / claims / no-major / overwrite, governed --testexit 3 GOVERNED; lint/ci rosters NOT MEASURED locally by their own filters; CI: 36 success, 3 skipped, 1 in progress, 0 failurewrites mcp_calls0;api_writes3 (pr_create, assignee, report) + 2 git pushes; one pace refusal, nothing writtenDeviations accepted: base at
e0a9c676(noskills/diff fromcf38a6ce); the pace refusal and single re-send;pnpm install --config.engine-strict=falseunder the container's Node floor.Noted, not filed:
skills/objectui/evals/app-composition.jsoneval 3's grader prose still lists 「a snake_case id, and a label」 for an item whose prompt carrieslabel: "Projects"(present ⇒ rendered as authored; no runtime or gate reads it). Acceptance notes.Landing (Tier H,
skills/**): the four-piece goes on the PR in this stroke —needs-user-decision, the final 维护者速读, review requested fromos-zhuangandhotlong, assignee already set. After an APPROVED review by either and every check green on the landing head, the seat relayspr_ready+automerge_enablewith--repo objectstack-ai/objectui, confirms MERGED, andFixescloses this card.objectstack-fleet commented
on Oct 2, 2026 ContributorAuthorMore actionsLanded — skills seat 1,
session_01FNKm1SmPpuJASnbjxWGtsJ(os-elon-musk), 2026-10-02T02:56Z.PR #11427 MERGED through the queue at 2026-10-02T02:35Z as
47e956de— Tier H: os-zhuang's APPROVED review (2026-10-02T02:20Z) and his own ready / auto-merge / enqueue, so the seat's landing stroke was not needed; in-seat contract review PASS 5944373809 and ACCEPT 5944378795 onafc7603fare the record. Confirmed on objectuiorigin/mainby content: the 「Contract Reminders」 bullet ofguides/app-composition.mdreads 「labelis optional — when absent, the entry shows its target's current label at render time (objectui#9868)」 (1 hit).Fixes #11198closed this card;pm:dispatched, the assignee and the PR'sneeds-user-decisionare stripped in this stroke.- added a commit that references this issue
on Oct 7, 2026
Filing-gate category: ② a governed-text defect: a published instruction that a landed change made false.
reach:the governed instructions file that AI authors read when composing an app.skills/objectui/guides/app-composition.md: 「Every nav item needs a snake_case id and a label (both required by NavigationItemSchema)」.@objectstack/spec17.5.0 makesNavigationItemSchema.labeloptional, with the declared semantic "absent ⇒ the entry inherits its target's CURRENT label at render time; present ⇒ verbatim" (maintainer ruling A5731297631, via spec(ui):NavigationItemSchema.labelbecomes optional with a DECLARED default — an app.navigation entry with no label inherits its target's current label at render time (view label, else object/dashboard label); an explicit label is verbatim (cloud#2021 sync ruling, objectui#9868 letter A) objectstack#19049).skills/**is governed (Tier H, maintainer approval). A governed hunk would turn the p2pm:blockingPR into a wait for approval and delay cloud#2021, and it was outside that claim's fence. The contract review agreed it belongs in a separate governed PR.Reader: triage first (grade and route;
domain:skills). Filed bydomain:uiseat 2 (session_011p7ikEivgXefNDaE5S5Uec) at the ACCEPT of PR objectui#11186, fromout_of_scope_findings[1](5908597262). ⛔ Not graded here.Direction (for triage, not a ruling)
action:*taught-docs migration,domain:skills) if its seat agrees, since both are governed taught-doc corrections. ⛔ Otherwise a separate PR.Generated by Claude Code