Skip to content

Record path: a stage press requests that status when record:path sets allowStageChange (console half of #28061) #28199

Closed

Description

@objectstack-fleet

domain:spec#1 · os-tesla · session_01L9qibwb6hBqszPTYJobitm

Filing gate: ③ triage-directed. This is the console half that #28061 (filed from #27355 row 1) names. The spec half is PR #28198, which adds RecordPathProps.allowStageChange. Filed by domain:spec seat 1. ⛔ Not a claim. Triage sets the grade and routes it to the ui/ lane.

Reach: every record page with a record:path block whose author sets allowStageChange: true. HotCRM's Sales tester asked for it on 18.2.0 (#27355 row 1; hotcrm#2320 Sales S1). Until this lands, the key is declared but does nothing. The console registry parity test carries the UNPUBLISHED_EXEMPTIONS entry record:path.allowStageChange, and it self-clears when the input is published.

Wanted (from #28061's console half)

  • In plugin-detail record-path.tsx, when allowStageChange is true, each reachable stage is a button gated by the reader's edit verdict on the status field. When absent or false, the readout stays as it is today (The record page's lifecycle path looks like a control and is inert: stageField renders as a segmented button group with no handler, no cursor, and no tab stop #11243).
  • A press asks for confirmation, then writes through the same update path record:details uses, with the record's concurrency token.
  • The server's refusal (an illegal transition per the state_machine rule from ADR-0020, a missing required field, or no edit right) is shown in place. ⛔ No server change.
  • Publish allowStageChange in the block's registry inputs, and remove the UNPUBLISHED_EXEMPTIONS entry in ui/apps/console/src/__tests__/registry-inputs-spec-parity.test.ts.
  • Tests:
    • the press writes the update;
    • a refusal renders in place;
    • a reader without edit rights sees the readout;
    • control: an absent key shows the readout.

This lands after PR #28198 merges.

Links: #28061, PR #28198, #27355 (row 1), #11243.

Blocked-by: #28198

Activity

  1. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: p3 · domain:ui · area:records · pm:blocked on #28198 · 2026-10-30T17:01Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: unblocked · p3 · 2026-10-30T20:59Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Claim: PM loop round 6 · 2026-10-31T02:43Z
    Session: session_01L9qibzC6RxMfB59EsgAoNN (seat; implementation by card thread session session_01L9qibyyvCaZXvGAh38AKjD, mode:thread)
    Account: os-tesla (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-7k5czo (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-28199
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: ui/packages/plugin-detail/src/** (record-path and its registry entry), ui/apps/console/src/__tests__/registry-inputs-spec-parity.test.ts (one exemption), i18n packs, tests, root changeset (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default (dispatch-gates --tier: no path-derived mandate), effort: high
    Clause-②: no (the seat's expectation; the dev measures it on the diff, and the seat amends the claim if a new export or a flipped declared surface moves it)
    Metadata-protocol: none
    Responsibility: a record:path stage press requests that status when allowStageChange is set (console half of #28061)
    Thread-read: 6533351162
    Premise: holds (PR #28198 is on main; the key is in UNPUBLISHED_EXEMPTIONS)
    Serial constraints cleared: yes. The p3 hold is lifted for ui by the maintainer: 「可以开p3」, and 2026-10-31T02:39Z 「ui 车道一堆任务啊,应该并发开满啊」 in the seat thread. domain:ui#2 and #4 are off duty.

    Order: /mnt/project-files/ui-seat-1/r2026-10-30/dispatch-28199.md under FRAME.md.

  4. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibyyvCaZXvGAh38AKjD
    os-dev-report

    {
      "issue": 28199,
      "status": "done",
      "branch": "claude/project-thread-7k5czo",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28303",
      "head": "2837cf76",
      "session": "session_01L9qibyyvCaZXvGAh38AKjD",
      "premise_still_valid": true,
      "summary": "record:path honours allowStageChange: for a reader who may edit statusField on this record (page edit session canEdit, field not readonly/computed/system, recordEdit field grant asked of the stored row via RecordFieldAccessForRecord), each non-current stage is a button; a press confirms, then writes { statusField: value } through InlineEditSaveBar's updateVia with ifMatch = updated_at and re-reads; a server refusal (state_machine, required field, permission, stale token) renders in place under the rails. The input is published in the registry, the UNPUBLISHED_EXEMPTIONS entry record:path.allowStageChange is deleted, the sdui manifest and generated component reference are regenerated, seven detail.pathStageChange* keys land in all ten packs.",
      "tests": "pnpm --dir ui exec vitest run packages/i18n/ packages/app-shell/src/__tests__/defaults-maps-mirror-en-pack.test.tsx apps/console/src/__tests__/registry-inputs-spec-parity.test.ts packages/plugin-detail/ @bc74bc54: Test Files 442 passed 1 skipped (443), Tests 4842 passed 31 skipped, VERDICT command-exit 0. New file record-path.stageChange-28199.test.tsx: 14/14 @2837cf76. plugin-detail + i18n type-check exit 0 @2837cf76 (full dts closure). Ablations via scripts/ablation-replace.mjs (source alias, no dist): ifMatch dropped -> 1 red; allowStageChange gate removed -> 2 red; !inline.editing removed -> 1 red; resolveFieldAffordance removed -> 1 red; setRefusal removed -> 5 red; each restored with git diff HEAD empty.",
      "gates": "dispatch-gates --commands @2837cf76: 76 families, all exit 0; --ran reconciliation: 76 derived, 76 run, 0 NOT-MEASURED, 0 UNRUN. First pass @bc74bc54: check:skill-examples exit 3 (prerequisite: no spec dts) -> exit 0 after env -u OS_SKIP_DTS build. check-sdui-manifest exit 0; ui check:new-line-citations 0 new. Ran list: /mnt/project-files/ui-seat-1/r2026-10-30/out/28199-gates-ran-2837cf76.list. CI check-runs: in_progress at report time.",
      "line_budget": "22 files, +691 / -40 (under the 3000 human-merge threshold); hand-written 17, generated 5 (sdui.manifest.json, scripts/sdui-manifest.record.json, content/docs/ui/components/record.mdx, content/docs/ui/components/index.mdx; changeset is hand-written)",
      "files_changed": [
        ".changeset/28199-record-path-stage-change.md",
        "content/docs/ui/components/index.mdx",
        "content/docs/ui/components/record.mdx",
        "scripts/sdui-manifest.record.json",
        "sdui.manifest.json",
        "ui/apps/console/src/__tests__/registry-inputs-spec-parity.test.ts",
        "ui/packages/i18n/src/locales/ar.ts",
        "ui/packages/i18n/src/locales/de.ts",
        "ui/packages/i18n/src/locales/en.ts",
        "ui/packages/i18n/src/locales/es.ts",
        "ui/packages/i18n/src/locales/fr.ts",
        "ui/packages/i18n/src/locales/ja.ts",
        "ui/packages/i18n/src/locales/ko.ts",
        "ui/packages/i18n/src/locales/pt.ts",
        "ui/packages/i18n/src/locales/ru.ts",
        "ui/packages/i18n/src/locales/zh.ts",
        "ui/packages/plugin-detail/src/InlineEditSaveBar.tsx",
        "ui/packages/plugin-detail/src/index.tsx",
        "ui/packages/plugin-detail/src/renderers/__tests__/record-path.stageChange-28199.test.tsx",
        "ui/packages/plugin-detail/src/renderers/record-path.tsx",
        "ui/packages/plugin-detail/src/renderers/recordPathStageChange.tsx",
        "ui/packages/plugin-detail/src/useDetailTranslation.ts"
      ],
      "deviations": [
        "file surface: generated registry half added (sdui.manifest.json, scripts/sdui-manifest.record.json, content/docs/ui/components/record.mdx + index.mdx) as root AGENTS.md requires for a registry change; ui/packages/i18n locales are the claim's 'i18n packs'",
        "Clause-②: yes measured from the diff (registry inputs gain a key) vs the claim's expectation no; the dispatch order says publishing the input counts",
        "InlineEditSaveBar.updateVia gains a module export (not re-exported from src/index.tsx) so the stage press uses the same update path"
      ],
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "3 — mcp__github__issue_read x3 (get, get_comments x2); 0 writes",
      "api_writes": "2 — relay pr_create (objectstack-ai/objectstack#28303, run 41166422789), this os-dev-report comment via post-stamped.mjs",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: seat · noted, not filed: plugin-detail README says nothing about record:path or allowStageChange (ui/AGENTS.md #2 asks a README line); outside the claimed surface"
      ]
    }
  5. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Claim amendment · 2026-10-31T03:57Z · amends claim 6537955118 after the card thread's os-dev-report 6538697224. Append-only.

    Clause-②: yes (widening: the record:path block publishes the registry input allowStageChange, which reaches sdui.manifest.json; no accept set moves)

    The dev measured the change on PR #28303, and that measurement replaces the claim's no. The PR goes to the contract-review lane before the seat lands it.

    The seat accepts three changes to the file surface:

    • The generated registry half: sdui.manifest.json, scripts/sdui-manifest.record.json, content/docs/ui/components/record.mdx and index.mdx. These follow mechanically from publishing the input.
    • updateVia in ui/packages/plugin-detail/src/InlineEditSaveBar.tsx becomes a module export. The package index does not re-export it, so the block writes through the same update path record:details uses instead of a copy.
    • The ten i18n packs, for the confirm and refusal copy.

    Seat read on head 2837cf76 found no blockers so far:

    • A stage is pressable only when the page edit session's canEdit holds, the status field is not read-only or computed, and the reader's recordEdit field grant allows it.
    • A press confirms first, then writes with ifMatch set to the record's updated_at.
    • A refusal shows in place.
    • A view without the key keeps the read-only rail.
    • The UNPUBLISHED_EXEMPTIONS entry is removed.
  6. objectstack-fleet commented on Oct 31, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Landed · 2026-10-31T05:03Z · PR #28303 (seat ACCEPT 6538956195, pinned to 2837cf76; contract-review PASS 6538910207).

    reading value
    PR merged 2026-10-31T05:02:36Z as be25e2dd through the merge queue, on the first pass
    origin/main content ui/packages/plugin-detail/src/renderers/recordPathStageChange.tsx (useStageChange) is present. The path registry entry publishes allowStageChange, and its UNPUBLISHED_EXEMPTIONS entry is gone.

    State: Fixes #28199 closes the card as completed. pm:dispatched comes off in the same stroke as this note. The review's README flag (plugin-detail says nothing about record:path or the opt-in) is outside this card. The seat carries it to the next ui docs card. Nothing else remains on this card.

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

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchdomain:uienhancementNew feature or requestpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions