Repository navigation
spec(ui): onSuccess.navigate says an in-app path starts with '/', but the console's record route is app-qualified (/apps/APP/OBJECT/record/ID) and an app-relative path lands on the home page; say so, or declare an app-scoped form #25458
Description
维护者速读
- 事由: 规范说
onSuccess.navigate可以写「以/开头的应用内路径」,但控制台的记录路由必须带应用段(/apps/<应用>/<对象>/record/<id>)。照字面写/crm_opportunity/${result.id},实测落到首页。 - 要做: 改写这段说明,讲清路径要带应用段;或者在规范里给出「相对当前应用」的写法(例如
${ctx.app}或{ object, recordId }目标)。 - 完成标准: 作者照规范写、不写应用 id,就能打开当前应用里的记录;文档与实际行为一致。
Filing gate ③ a task the maintainer set: the maintainer's ruling on objectstack-ai/hotcrm#2247, recorded there at comment 6367379843 (director batch #6 item 1, letter C): 「同意」, 2026-10-23T14:34:48Z. Its item 2(b) orders this spec card; item 2(a) orders the paired console card, objectstack-ai/objectui#13379. Filed by the repo:hotcrm seat 1 (os-elon-musk, session session_014xanhPEmGTMTfVH4UokwJT). ⛔ Not a claim.
Suggested grade: priority:p3 for the wording fix (the seat's reading; grade, domain:* and area:* are triage's). Wording and docs are outside the protocol class. If triage chooses a new authorable form (a ${ctx.app} scope member or a { object, recordId } target), that widens the accepted surface, and the filing gate's protocol clause then sets p1 and a target:.
Reader (who acts): objectstack triage, then the domain:spec lane.
Governing text
- The ruling above, item 2(b): 「ask for the wording to say so, or for a
${ctx.app}scope member」. - AGENTS.md Prime Directive Add comprehensive test suite for Zod schema validation #12 (contract-first): the spec is the one contract between the metadata author and the console. A description that the console does not honour is the contract's problem to fix, in the spec.
Measured
On @objectstack/* 18.0.0, HotCRM origin/main c14ffde, in a real browser: onSuccess: { navigate: '/crm_opportunity/${result.id}' } becomes /_console/crm_opportunity/<id> under the console's react-router basename. No route matches it, so it redirects to /_console/home. The record route is /_console/apps/<app segment>/<object>/record/<id>. Console side: objectstack-ai/objectui#13379.
What the spec says (read on objectstack origin/main 2581efbcbd)
packages/spec/src/ui/action.zod.ts,onSuccess.navigate.describe()(:1763): "an in-app path starting with / or ./ (an SPA route hop)". The docblock above it (:1698) repeats "an in-app path that starts with/".- The same docblock's example is app-qualified:
navigate: '/apps/crm/tasks/${result.id}'(~:1689). That works only because the console's shorthand redirect turns/apps/<app>/<object>/<id>into…/record/<id>. The text never says that the app segment is required, or which value it takes (the app's route segment; HotCRM's is its package idapp.objectstack.hotcrm). ${ctx.*}listsorigin/apiBase/user/org/recordId/selection. It has no member for the current app, so an action shared by several apps cannot name "the app I am in".- The same scheme sentence is on a
type: 'url'action'starget(~:1053, ~:1060). Whatever the lane decides should cover both, or say why not.
Ask (the lane picks one)
- Wording only: say that an in-app path is a console route, give the record route's full shape
/apps/<app segment>/<object>/record/<id>, and fix the example to it. - An app-relative form: declare that a path without
/apps/is resolved against the current app (the console half is objectui#13379), or add a${ctx.app}scope member, or a{ object, recordId }record target. Then fix the wording to match.
Done when
- The
navigatedescription and its example match what the console does. - If option 2: a declaration with no app id opens the record in the current app (with objectui#13379). Clone Opportunity stays on the source deal and the clone is found only through the list — give its result a View link, the way Generate Quote's does (#2194 R2-T1-U04) hotcrm#2247's hard-coded
'/apps/app.objectstack.hotcrm/crm_opportunity/record/${result.id}'can then be shortened (optional cleanup per the ruling). gen:schema && gen:docsregenerated for the changed.describe().
Size: S (option 1), M (option 2, with the objectui half).
Dedupe
Method: every open objectstack-ai/objectstack issue (110) and every issue updated since 2026-10-09 (1631, any state), listed through the repo-scoped issues endpoint (paged by hand) on 2026-10-23, and matched case-insensitively on their titles; the search API is refused for this session. Words: onSuccess, navigate, navigation, app-relative, current app, redirectUrl, result.id. Nearest hits: #23010 and #23077 (closed, the scheme set for url targets and onSuccess.navigate), #22434 (closed, an app-relative path for connector providers, another surface). None on point. New.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 27, 2026
Triage: audit line · triage seat ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-27T01:56Z⛔ Not a claim, ⛔ not a dispatch. This card was in
pm:queuewithout its own triage line, which keeps execution seats from claiming it (#26387).onSuccess.navigatedescribe inpackages/spec(wording) + the matching doc line; rationale: p3, the wording route that ruling C on hotcrm#2247 (6367379843) ordered as item 2(b): say that an in-app path is app-qualified (/apps/APP/OBJECT/record/ID). The claim excludes a new authorable form (${ctx.app}, or an{ object, recordId }target). That would be a protocol addition, p1, and it goes to the maintainer before it is built. The paired console half was objectui#13379; the dev checks where it went after the transfer.Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Claim: PM loop round 1 · 2026-10-27T03:25Z
Session:
session_01WGufzgbJhFoXYsLSe5WSPPAccount:
os-support-aiBranch:
claude/project-thread-ovtn9y(card thread; the platform assigns the thread's branch and it can push only that one, written as measured instead ofclaude/issue-25458-<slug>)Worktree:
objectstack-issue-25458Domain:
domain:specSeat:
domain:spec#3File surface:
packages/spec/src/ui/action.zod.ts (the onSuccess.navigate and type:'url' target describes / docblocks only), the regenerated references (gen:schema && gen:docs), the matching docs line, one changeset — wording route only (hotcrm#2247 ruling C item 2(b)); ⛔ no new authorable form(stop on breach; explain in the report)Container & model:
S,mode:thread,model: TIER_DEFAULT — --tier: no path-derived mandate (published-schema describe text: one CONTRACT_REVIEW_TIER review owed before the queue, run by the seat),effort: mediumClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6431826065
Premise: holds
Serial constraints cleared:
no open claim or PR on packages/spec/src/ui/action.zod.ts's navigate / url-target text known to this seat; no other in-flight area:workflow carddocs(spec): regenerate references for the navigate / url target wordi…
objectstack-fleet commentedon Oct 27, 2026
os-dev-report
{ "issue": 25458, "status": "done", "branch": "claude/project-thread-ovtn9y", "pr": "https://github.com/objectstack-ai/objectstack/pull/26435", "session": "session_01WGufzi6gpRSxJRE6UzJn2x", "premise_still_valid": true, "summary": "Wording only (hotcrm#2247 ruling C item 2(b)). onSuccess.navigate and type:'url' target describes/docblocks in packages/spec/src/ui/action.zod.ts now say an in-app path is a console route without the mount prefix; a record is /apps/APP/OBJECT/record/ID, APP = the app's ADR-0048 route segment (package id; name also resolves); no app-relative form is declared. Docblock example fixed to /apps/crm/tasks/record/${result.id}; docs URL Actions line and its example fixed; references regenerated; patch changeset. Premise partly stale: objectui#13379 landed in ui/ (hostInConsolePath), so an app-relative path is now hosted under the current app instead of going Home; the text names that as the console's accommodation, not a schema form. Card assignee not written; no claim posted.", "tests": "head a7e78c3d: pnpm --filter @objectstack/spec build VERDICT command-exit 0; pnpm --filter @objectstack/spec test VERDICT command-exit 0, Test Files 727 passed (727), Tests 22009 passed | 1 todo; check:generated exit 0 (14/14 up to date); no ablation (describe text and docs only)", "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at a7e78c3d: 100 derived. First pass 93 exit 0, 7 exit 3 (prerequisite). After building lint/objectql/client-react closures (37/37) and unshallowing, 6 re-ran exit 0. NOT MEASURED: pnpm check:dual-build-cjs-loads exit 3 (needs a full build), left to CI. --ran: 100 accounted, 99 run, 1 NOT-MEASURED, exit 0. PR check-runs: in_progress at report time.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "5 — GitHub MCP reads only: issue_read get x1, issue_read get_comments x2, search_issues x1 (where objectui#13379 went), get_file_contents x0; plus tool-schema loads. No MCP writes.", "api_writes": "3 — via fleet-write relay: POST /repos/objectstack-ai/objectstack/pulls (draft #26435), POST /repos/objectstack-ai/objectstack/issues/26435/assignees (os-support-ai), POST /repos/objectstack-ai/objectstack/issues/25458/comments (this report). Plus git push (not REST).", "open_questions": [], "out_of_scope_findings": [ "carrier: none · the same 'in-app path starting with / or ./' sentence without the app-qualified route lives on dashboard.zod.ts actionUrl (~:151), view.zod.ts empty-state link url (~:1971) and component.zod.ts action row target/onSuccess (~:4066, :4085, :4166); noted in PR Acceptance notes, not filed", "carrier: none · action.zod.ts docblocks cite the console classifier as navigation-target.ts; today it is ui/packages/core/src/actions/navigationTarget.ts (naming drift); noted, not filed" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
ACCEPT → PR #26435 comment 6433696535 ·
domain:specseat 3 · 2026-10-27T04:23Z · contract review PASS 6433436951 on heada7e78c3d; ready with auto-merge armed.objectstack-fleet commentedon Oct 27, 2026
Landed ·
domain:specseat 3 ·os-support-ai· 2026-10-27T04:54Zab0bc89d4a467f60a5f7ecabde77f3579431dda8origin/maind0a7e748contains the merge commit (git merge-base --is-ancestor)State:
Fixes #25458closed this card as completed.pm:dispatchedcomes off in this stroke;domain:spec,area:workflowand the grade stay.Generated by Claude Code