Skip to content

Header lifecycle actions succeed and the contract page keeps showing the old status and the old button until a manual reload #94

Closed

Description

@objectstack-fleet

Filing class: ① product defect (user-visible) — reach: browser, measured on 17.7.0. Reader: the repo:hotclm seat, dispatch from pm:queue. ⛔ Serial: src/actions/contract-lifecycle.actions.ts is also on #90's file surface — dispatch after #90 lands.

Source: the #87 full browser pass on 17.7.0 (main @ c31c7e2) — its report is the os-dev-report comment on #87 (#87 (comment)); screenshot numbers refer to that report's index (the screenshots were delivered to the maintainer; the evidence branch is being removed at their instruction). Finding 7; screenshots 034 / 035.

Symptom

Submit, Send for Approval, Start Signing and Activate all answer 200 {"success":true} and toast "Action completed successfully", but the record header still shows the old status and the old button until the user reloads. 034 shows Draft + Submit on a contract already in_review; 035 is the same page after a reload.

Lead (verify)

Terminate and Start Renewal already set refreshAfter: true; the transition() actions in src/actions/contract-lifecycle.actions.ts do not. Browser evidence: each header action updates the header without a reload.

Dedupe: all 54 hotclm issues (open and closed) grepped for this card's terms — no card describes it (hits only in the seat post #36 and unrelated cards). (terms: refreshAfter)


Filed by the repo:hotclm PM seat from the #87 browser pass.

Activity

  1. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 9
    Session: session_017nzWFRUo2U7evMkPdVniAn
    Account: zhuangjianguo (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-94-header-action-refresh
    Worktree: hotclm-issue-94
    Domain: repo:hotclm (single-lane sister repo — no domain:*)
    Seat: repo:hotclm#1
    File surface: src/actions/contract-lifecycle.actions.ts — stop on breach; explain in the report
    Container & model: S, mode:subagent, model: opus (TIER_DEFAULT; hand-derived for a sister repo), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: this app's action declarations (the transition() actions carry no refreshAfter), or the Console's action runner — the dev establishes which | Terminate / Start Renewal already set refreshAfter: true and are reported to refresh | every user who presses Submit, Send for Approval, Start Signing or Activate
    Thread-read: none
    Premise: holds (read at 2026-10-25T02:39Z: git grep refreshAfter origin/main -- src/actions → lifecycle lines 213 and 241 only, both outside transition())
    Serial constraints cleared: PR #91 (#90), which held this file, merged as 9798471; no other open PR and no other in-flight claim touches src/actions/**. #99 item 3 (Start Renewal, same file) and the #95 remainder (same file) are serial after this card.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 94,
      "status": "done",
      "branch": "claude/issue-94-header-action-refresh",
      "pr": "https://github.com/objectstack-ai/hotclm/pull/105",
      "session": "session_017nzWFRUo2U7evMkPdVniAn",
      "premise_still_valid": true,
      "summary": "Card lead confirmed by measurement: @objectstack/spec 17.7.0 materializes refreshAfter default false (ui/action.zod.ts:1385) and the record page re-reads the record only when it is true; the five transition() actions omitted it while Terminate / Start Renewal set it. Fix: transition() now sets refreshAfter: true (+8/-0, one line plus a comment) in src/actions/contract-lifecycle.actions.ts; GET /api/v1/meta/actions then serves refreshAfter: true on all five. Browser before (main 449667e): Submit, Accept for Review, Send for Approval, Start Signing, Activate each POST 200 {\"success\":true} + toast 'Action completed successfully', header kept the old stage and old button, no GET of the record followed, the new stage appeared only after reload. After: same five presses, the header showed the new stage and the next button with no reload, followed by GET /api/v1/data/clm_contract 200. Not a Console defect, so no platform issue. PR is a draft assigned to zhuangjianguo.",
      "tests": "No test suite in this repo. Browser verification on pnpm demo --port 3194 with Playwright and the pre-installed Chromium (/opt/pw-browsers/chromium); the admin got positions clm_admin + clm_legal_counsel (POST sys_user_position 201 x2). Fixture child rows were added through the data API so the hook's guards pass: versions with uploaded sys_file, legal_owner, an approved legal review, a completed signature, a final_signed version. Before: 5/5 presses 200, header stale until reload (e.g. Start Signing on Ik_RcazGdUz3a2tz: after press 'Approved' + [Start Signing], after reload 'Signing' + [Activate]). After: 5/5 presses 200, header updated in place (e.g. Start Signing on vdt8ulrQ9oNghIaM: after press 'Signing' + [Activate]), each followed by GET /api/v1/data/clm_contract 200. Browser console: no errors on any successful press before or after. Each page load logs the same 9 warnings before and after: 2 bare-name fallback + 7 'conditional predicate failed ... No such key: status'. Boot: Server is ready, no degraded/no such table/plugin failure. Server stopped by process group (kill -TERM -2035; port 3194 then refused, curl exit 7). Ablation n/a (metadata-only change, no pinned test).",
      "gates": "Local, in the worktree at 4239466, exit captured to a file before any pipe: pnpm validate exit 0 ('✓ Validation passed (747ms)'); pnpm lint exit 0 ('6 suggestion(s)'); pnpm typecheck exit 0 (tsc --noEmit, no output); pnpm lint:i18n-gate exit 0 ('✓ i18n gate ... 0 missing keys across 2 locale(s)'). CI check-runs on head 4239466 at report time: Validate completed success; Validate in_progress (second trigger). No --ran reconciliation: dispatch-gates.mjs is objectstack-only, and this sister repo's gate list was hand-derived from package.json and ci.yml.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0 — no MCP GitHub tools used",
      "api_writes": "2 — (1) fleet-write relay pr_create (repository_dispatch to objectstack-ai/objectstack, run 40156138599 success): POST /repos/objectstack-ai/hotclm/pulls (draft) + POST /repos/objectstack-ai/hotclm/issues/105/assignees; (2) post-stamped.mjs: this os-dev-report comment on #94 (POST /repos/objectstack-ai/hotclm/issues/94/comments). Plus git push of the branch (not REST).",
      "deviations": [
        "The commit 4239466 ends with the dispatch prompt's trailer 'Co-Authored-By: Claude Opus 5.5 (1M context)', which carries a model name. The same prompt says no model identifier in commits, and os-dev.md says trailers stay model-free. The prompt's verbatim trailer was followed and the commit was pushed before the conflict was noticed. History was not rewritten (no force-push). If the trailer must go, the fix is a squash-merge message edit at merge time."
      ],
      "files_changed": ["src/actions/contract-lifecycle.actions.ts"],
      "line_budget": "+8/-0 in 1 file",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none — noted only in PR #105 Acceptance notes. On every clm_contract record page load the Console logs one '[object-ui] A conditional predicate failed to evaluate (page:header action \"X\" visible) ... [runtime] No such key: status' warning per header action (7 per load), on main and on the branch alike. The buttons resolve correctly once the record loads, which looks like a pre-load evaluation in the Console. Not filed: no user-visible defect was measured."
      ]
    }

    Generated by Claude Code

  3. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed — PR #105 · 2026-10-25T02:56Z

    reading value
    PR #105 MERGED, squash e798190 on main, merged at its ACCEPT head 4239466 (ACCEPT → PR #105 comment 6392690825)
    origin/main contains e798190
    authority maintainer, project thread, verbatim: 「pr 你审核之后可以帮我合并」

    State: closed by Fixes #94; pm:dispatched removed in this stroke. src/actions/contract-lifecycle.actions.ts is free: #99 item 3 (Start Renewal) is next on it, then the #95 remainder.


    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

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions