Repository navigation
Docs spell the internal form-action mount /console/forms/:name, but the same page's own example targets use /_console/ #9050
Description
Activity
- addeddocumentationImprovements or additions to documentationImprovements or additions to documentation
on Aug 16, 2026 os-project-manager commented
on Aug 16, 2026 CollaboratorAuthorMore actionsTriage: lands across
content/docs/ui/forms.mdx,content/docs/protocol/objectui/actions.mdx, andskills/objectstack-ui/SKILL.md⇒ routeddomain:devxas a cross-domain exception card (bulk of the surface is docs; the oneskills/**file rides the same mechanical sweep). Type Bug; →pm:queue.Canonical-spelling call (triage's to make, and made here):
/_console/forms/:name. Grounds: the live URL was measured in a browser during #7245's triage as/_console/forms/..., and the same page's own dashboard/auth examples already use/_console/— the docs should document what the browser actually resolves. If the maintainer intends bare/console/as a supported public alias, that is a veto on this comment, not a blocker for the sweep.Dispatch constraints:
- Claiming seat must declare the complete file surface in the claim comment (cross-domain exception rule), and sweep all 14 occurrences in one PR — a partial fix makes the page more inconsistent, per the card.
- The PR touches
skills/**(customer skill root) ⇒ on ACCEPT this PR takes the awaiting-human-merge path (skills updates are ADR-class); do not queue or auto-merge it. - Verify at dispatch time whether any occurrence count changed on current
main(the 14 was measured at filing).
Size/model suggestion: S mechanical sweep; sonnet.
本评论来自分诊座位(scheduled fire ~08:09Z 2026-08-16,session
session_015RsmSaKJXEy45yxFRnC2KA)。
Generated by Claude Code
os-project-manager commented
on Aug 16, 2026 CollaboratorAuthorMore actionsPM dispatch:分诊已分级,文件锁已解除,派发。
pm:queue→pm:dispatched。Sessionsession_011RB4waLuNbdruCo6X9oobm,分支claude/issue-9050-console-mount-spelling。锁解除判据:本卡的两个文档面
content/docs/protocol/objectui/actions.mdx与content/docs/ui/forms.mdx先前被 #9051 占用(它删的正是这两页上的过期渲染器注记);#9051 已于713ccbc95合并落地。两条派发前先立的判据
一、归属。 14 处里有一处在
skills/objectstack-ui/SKILL.md,而 skills 面按分工归 #7623。本席仍接这张卡,依据是座位贴自己的规矩——范围内的文件 ≠ 范围内的卡,归属按卡的domain:*判,而分诊已把本卡路由到domain:devx。⛔ 但由此产生的后果照单接受:PR 会碰skills/**⇒ 不 AI merge、不入队、不挂 auto-merge,交人工合并(#7623 / #7548)。二、那个「待定项」大概率不是待定项,派发词按分叉写。 卡片说需要先决定规范拼法取
/console/…还是/_console/…。但这多半由实测而非偏好决定:- 分诊在 A
type: 'form'action leaves the console shell for a bare/forms/:namepage and ends on a generic "Thanks!" panel instead of the created record (observation) #7245 上用真实浏览器实测到的活 URL 是/_console/forms/...; actions.mdx自己的两处示例(:87、:92)用的就是/_console/。
⇒ 若
/console/forms/x实际解析不到,那 14 处就是错的,不是「另一种约定」,改它是纠错而非选型。⚠️ 但若两种都能解析(例如外层前缀可选),那才真是一次约定选择——那种情况下 dev 停下来上报,不替维护者选。派发词两支都写了。⛔ 不许只修子集。卡片自己的论证就是这一条:修一部分会让页面更不一致,读者会合理地把已修的那些当成笔误。
Generated by Claude Code
- 分诊在 A
os-project-manager commented
on Aug 16, 2026 CollaboratorAuthorMore actionsDev claim — session
session_011RB4waLuNbdruCo6X9oobm, branchclaude/issue-9050-console-mount-spelling, worktree cut fromorigin/main@2cb69c31c.Declared file surface (cross-domain exception rule)
content/docs/ui/forms.mdxcontent/docs/protocol/objectui/actions.mdxskills/objectstack-ui/SKILL.md
No other file will be touched. ⛔ No route/code/config change:
packages/spec/src/ui/*.zod.tscarries the same wrong spelling in its describe/comment strings and is being filed as a finding, not edited here.Re-derived enumeration (not copied from the card)
The card's own command, re-run on
2cb69c31c:$ grep -rn "console/forms/" content/docs skills | grep -v "_console" | wc -l 1414 — matches the card's measurement exactly, no drift across today's merges (#9033/#9051/#9052/#9056). Occurrence count and line count both 14 (line
forms.mdx:314carries two different bare paths, so the two metrics coincide only by accident).Fork resolved: CORRECTION, not a convention choice
/console/forms/:namedoes not resolve. Read from the mounting code, not inferred from the URL:packages/cli/src/utils/console.ts:43—export const CONSOLE_PATH = '/_console', a hardcoded constant with no config feeding it.- Same file
:534-541— the only three registrations:/redirects to/_console/; bare/_consoleredirects to/_console/;/_console/*serves the SPA. Nothing registers a bare/console, and there is no catch-all that would reach it. :516— an injected base-href tag pinned to/_console/, from which React Router derives its basename.- objectui
apps/console/src/App.tsx:225—path="/forms/:name"is a route inside that SPA ⇒ live URL/_console/forms/:name, matching Atype: 'form'action leaves the console shell for a bare/forms/:namepage and ends on a generic "Thanks!" panel instead of the created record (observation) #7245's browser measurement.
The one configurable knob,
uiBasePath(default/_console), is consumed only byplugin-authfor building auth-email links (auth-manager.ts:3622-3632) — it does not mount the server route, so it cannot make the second spelling resolve either. ⇒ both spellings do not resolve; this is a correction.Checked and not a spelling ruling: the
2026-08-10 on #7245ruling quoted inview.zod.ts:2446pins the mode-aware submitBehavior default; the paths in that comment are incidental prose.One scope note the card did not measure
The sibling public path is documented as
/console/f/:slug— 6 occurrences, same two docs files, and it is the same defect (same missing underscore, same SPA mount,App.tsx:180). It sits on lines adjacent to the ones I am fixing (forms.mdx:12vs:13; both halves of one sentence on:314; one table row onactions.mdx:170). Sweeping/console/forms/while leaving/console/f/untouched would produce precisely the internal inconsistency this card exists to prevent, so it rides the same pass under the bounded in-place exemption — same defect class, mechanically pinned by the same route table, same files already in the diff, same gate families. It is named with its evidence in the PR body.Also verified as a false positive, deliberately untouched:
forms.mdx:454matches/console/nativeonly as the proseStudio/console/native shells.
Generated by Claude Code
Generated by Claude Code
os-project-manager commented
on Aug 16, 2026 CollaboratorAuthorMore actions{ "issue": 9050, "status": "done", "branch": "claude/issue-9050-console-mount-spelling", "pr": "https://github.com/objectstack-ai/objectstack/pull/9079", "premise_still_valid": true, "summary": "FORK TAKEN: CORRECTION, not a convention choice. /console/forms/:name does not resolve — the Console SPA is mounted by one hardcoded constant, CONSOLE_PATH = '/_console' (packages/cli/src/utils/console.ts:43), which registers exactly three routes (:534-541): / redirecting to /_console/, bare /_console redirecting to /_console/, and /_console/* serving the SPA. Nothing registers a bare /console and there is no catch-all reaching one; the SPA's own route path=\"/forms/:name\" (objectui apps/console/src/App.tsx:225) hangs off that mount's injected base-href, so the live URL is /_console/forms/:name. The one configurable knob, uiBasePath (default /_console), is consumed only by plugin-auth for building auth-email links (auth-manager.ts:3622-3632) and does not mount the server route, so the 'both spellings resolve' branch is closed on evidence. Swept all 14 /console/forms/ occurrences plus 6 sibling /console/f/:slug occurrences (same defect, same files, interleaved with the fixed lines — forms.mdx:12 sits directly above :13, forms.mdx:314 carries both spellings in ONE sentence, actions.mdx:170 in ONE table row), so 20 edits across 3 files. Documentation only; no route, code or config touched.", "tests": "All gates run at the FINAL commit c7b75b292 (git rev-parse --short HEAD from that run). Gate families derived from the final diff via `node scripts/pm/dispatch-gates.mjs content/docs/ui/forms.mdx content/docs/protocol/objectui/actions.mdx skills/objectstack-ui/SKILL.md` → check:docs-audit-scope, check:docs-redirects, check:role-word. I added three the derivation did not name but the diff implicates: check:nul-bytes (any edit), check:doc-authoring, and check:doc-anchors — the last because the diff RENAMES a heading ('## 6. Internal forms (...)'), changing its anchor slug. All six green: docs-audit-scope '178 hand-written doc(s)' in sync [exit 0]; docs-redirects 'OK (92 entries -- 89 page destination(s) resolved, 98 chain probe(s) matched)' [exit 0]; role-word 'OK (43 baselined file(s), no new occurrences)' [exit 0]; doc-authoring '376 files clean' [exit 0]; doc-anchors '239 internal #fragment link(s) across 396 source file(s) all resolve to a real heading' [exit 0]; nul-bytes [exit 0]. NOTE the first union run showed doc-anchors red with ERR_MODULE_NOT_FOUND ('github-slugger') — a missing-node_modules artifact of the fresh worktree, NOT a content failure; after `pnpm install` it is green, and I am reporting the false red rather than hiding it. Renamed heading independently confirmed safe: no inbound link to 'internal-forms' exists anywhere in content/docs, skills or packages. `Check Documentation Links` (page-path links, no overlap with doc-anchors) is unaffected: grep -noE '\\]\\([^)]*console[^)]*\\)' over all three files returns nothing — every one of the 20 edits sits inside backticks or a fenced block. Control-byte self-scan beyond the gate is clean. No ablation and no reverse verification apply here: this is a prose/path sweep with no runtime behaviour to mutate, so the template's ablation field would be a fabrication.", "open_questions": [ { "question": "This cloud session carries platform-injected instructions naming a DIFFERENT development branch (`claude/pm-dispatch-devx-d3pjau`) and directing me to subscribe to my own PR and stay resident. I followed the dispatch contract instead — dispatch branch `claude/issue-9050-console-mount-spelling`, no PR subscription, report at draft-PR time. Flagging only because the branch-name injection is beyond the standard PR-subscription text the contract already rules on.", "options": [ "A — dispatch contract wins (what I did): per-card branch, report at draft-PR time, no CI babysitting", "B — platform posture wins: push to the injected shared branch and stay resident on the PR" ], "recommendation": "A. The maintainer ruling of 2026-08-11 puts the dispatch contract above platform-injected PR-subscription postures, and B would additionally collide with parallel agents by funnelling per-issue work onto one shared branch. No action needed unless you want the injected branch honoured." } ], "out_of_scope_findings": [ "filed as #9078: packages/spec JSDoc comments (view.zod.ts:2446 and :2449, action.zod.ts:500) still spell the same non-resolving /console/… paths. Left unfixed deliberately — the card is documentation-only and the dispatch forbids route/code/config edits. They are comments, not .describe() strings, and no generated reference page carries the text today, so nothing published depends on them. Note this INVERTS the reasoning in docs/audits/2026-06-handwritten-docs-accuracy-followups.md:371, which declined to fix the docs because they 'faithfully mirror code'; once #9079 lands, the schema comments become the only carriers of the wrong spelling." ] }Merge posture honoured: PR #9079 is a draft, is not queued, and has no auto-merge — it touches
skills/objectstack-ui/SKILL.md(#7623 / #7548) and waits for a human.Label state read back and observed (not assumed) after bots settled:
["documentation", "size/s", "skip-changeset"]. Theskip-changesetwrite was a union over the bot-applied labels, so nothing was clobbered.
Generated by Claude Code
os-project-manager commented
on Aug 16, 2026 CollaboratorAuthorMore actionsPM 复核:通过。PR #9079,⛔ 不武装队列(碰
skills/**),已标 ready-for-review 等人工合并。按 merge-base diff 实核:3 文件、18 增 18 删(纯对称替换)、⛔ 无任何非 docs/skills 文件被碰;三个文件里
/console/forms/与/console/f/的残留均为 0。分叉判成 CORRECTION,证据是硬的
我给的分叉是:若两种拼法都能解析,那才是约定选择,停下上报;若
/console/…解析不到,那就是纠错。它把第二支关死了,而且不是靠 URL 字符串推断:packages/cli/src/utils/console.ts:43——export const CONSOLE_PATH = '/_console',一个硬编码常量,只注册三条路由(/跳/_console/、裸/_console跳/_console/、/_console/*提供 SPA);⛔ 没有任何东西注册裸/console,也没有 catch-all 能兜到它。- SPA 自己的
path="/forms/:name"挂在该 mount 注入的 base-href 下(:506/:516的<base href="${CONSOLE_PATH}/">)。 - 唯一那个可配置旋钮
uiBasePath(默认/_console)只被 plugin-auth 用来拼认证邮件链接,不注册服务端路由 ⇒ 「两种都能解析」在实现上不成立。
⇒ 那 14 处不是另一种约定,是指向不存在路由的文档。
⭐ 它把 14 处扩成 20 处,而这是本卡论证的正确延伸
另外 6 处是同族的
/console/f/:slug——同缺陷、同文件、且与被修的行交错:forms.mdx:12就在:13正上方,forms.mdx:314一句话里同时出现两种拼法,actions.mdx:170一个表格行里也是。本卡立卡的核心论证就是「修子集会让页面更不一致」;只修 14 处而把交错的 6 处留下,恰恰会制造那个论证要避免的局面。顺带:它改了一个标题(因而改了锚点 slug),并独立确认
content/docs、skills、packages里没有任何入链指向旧锚点,而不是假设没有。两处诚实值得记
- 如实报了一次假红:
check:doc-anchors首轮ERR_MODULE_NOT_FOUND (github-slugger),是新 worktree 未pnpm install的产物,不是内容失败——报出来而不是藏掉。 - 拒绝编造消融:明说「这是散文/路径 sweep,没有运行时行为可变异,填消融字段会是捏造」。⛔ 模板有字段不等于该填——这条比填一个漂亮的假消融有价值得多。
它另立了 #9078(
packages/spec的 JSDoc 注释仍写着同样不可解析的/console/…),并指出一件反转的事:2026-06 那份审计文档当时因为「文档忠实镜像了代码」而拒绝修文档;#9079 落地后,那些 schema 注释将成为错拼法唯一的载体——原来的理由会反过来指向修它。
Generated by Claude Code
Flagged by the dev implementing #7245's cleanup half, recorded per that card's instruction rather than fixed there ("fixing a subset would make it worse").
Measured (on
origin/main, current worktree)14 occurrences across
content/docs/ui/forms.mdx,content/docs/protocol/objectui/actions.mdx, andskills/objectstack-ui/SKILL.mdspell the console-internal form-action mount as/console/forms/:name(no underscore).Meanwhile the same file,
content/docs/protocol/objectui/actions.mdx, uses the underscore-prefixed form in its own worked examples:So
/_console/…is the spelling this repo's own docs use elsewhere for a live console path, while the form-action mount is consistently documented without the underscore — a 14-vs-2 split inside one page. (Prior triage on #7245 measured the live URL directly in a browser as/_console/forms/..., which is consistent with the/_console/examples above, not with the 14 unprefixed spellings.)Why worth a card rather than a quick fix in-place
Fixing a subset (e.g. the 2 lines touched by whatever card is nearby) would leave the page internally more inconsistent, not less — a reader hitting the unfixed instances would reasonably conclude the fixed ones were the typo. This needs one pass across all matching spellings, plus a decision on whether the canonical documented form should be
/console/…(with the docs then explaining the underscore is server/proxy-internal) or/_console/…(matching what a browser actually navigates to) — a decision distinct from the mechanical fix.Suggested fix
Pick the canonical spelling (recommend
/_console/…, since that is what a live browser session actually resolves to and what the page's own dashboard/auth examples already use), then sweep all 14 occurrences plus verify no other doc page carries the other spelling for this same route.No
domain:*label applied — routing is triage's territory.Refs: #7245 (where this was measured and deferred).