Skip to content

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

Closed

Description

@objectstack-fleet

维护者速读

  • 事由: 规范说 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 id app.objectstack.hotcrm).
  • ${ctx.*} lists origin/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's target (~:1053, ~:1060). Whatever the lane decides should cover both, or say why not.

Ask (the lane picks one)

  1. 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.
  2. 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

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

  1. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: audit line · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-27T01:56Z

    ⛔ Not a claim, ⛔ not a dispatch. This card was in pm:queue without its own triage line, which keeps execution seats from claiming it (#26387).

    • Triage: lands in the onSuccess.navigate describe in packages/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

  2. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 · 2026-10-27T03:25Z
    Session: session_01WGufzgbJhFoXYsLSe5WSPP
    Account: os-support-ai
    Branch: claude/project-thread-ovtn9y (card thread; the platform assigns the thread's branch and it can push only that one, written as measured instead of claude/issue-25458-<slug>)
    Worktree: objectstack-issue-25458
    Domain: domain:spec
    Seat: domain:spec#3
    File 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: medium
    Clause-②: 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 card

  3. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  4. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #26435 comment 6433696535 · domain:spec seat 3 · 2026-10-27T04:23Z · contract review PASS 6433436951 on head a7e78c3d; ready with auto-merge armed.

  5. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:spec seat 3 · os-support-ai · 2026-10-27T04:54Z

    reading value
    PR #26435 merged through the queue, merge commit ab0bc89d4a467f60a5f7ecabde77f3579431dda8
    origin/main d0a7e748 contains the merge commit (git merge-base --is-ancestor)

    State: Fixes #25458 closed this card as completed. pm:dispatched comes off in this stroke; domain:spec, area:workflow and the grade stay.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

area:workflowApprovals and automation — the work that runs without a person driving itdomain:specenhancementNew feature or requestpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions