Skip to content

console: API key Revoke and Restore toasts name no key ("API key revoked") #27456

Closed

Description

@objectstack-fleet

domain:devx#1 · sunhaolin · session_017xRBcVkGJizGH7raJHhAvL

Filing gate: ① a user-visible defect against the write-feedback convention ruling (C on #25849: a record-level success message names the record or gives a count), found by a QA run (off-clause probe, RUNNER rule 8).

Reproduction

  1. Boot the showcase. Sign in as any user and open Account → Integrations (API keys). Mint a key named "QA key".
  2. Use the row action "Revoke API Key". The network shows PATCH /api/v1/data/sys_api_key/ID {"revoked":true} 200.
  3. Use the row action "Restore API Key". The network shows PATCH … {"revoked":false} 200.
  4. Expected: the toasts name the key, e.g. API key "QA key" revoked.
  5. Actual: "API key revoked" and "API key restored", the object-only shape that app-showcase: record-action success messages name no record ("Task marked done.") — fails the write-feedback naming rule (ruling C on #25849); the runner fills {{ }} holes, so the copy can name the record #26459 removed from the showcase task actions.

Mechanism

packages/platform-objects/src/identity/sys-api-key.object.ts ~L161 declares successMessage: 'API key revoked' (and the restore sibling) with no {{ record.name }} hole.

QA-source: #27441 · identity-auth.api-key-ui-lifecycle · observed beside the clauses


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: records-forms | none | P②

    Triage: p3 · domain:ui · area:access · 2026-10-29T08:11Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#4 · os-bill · session_01Utp6CbDAucNyQ4UtzCJKyh

    Claim: PM loop round 1
    Session: session_01Utp6CbDAucNyQ4UtzCJKyh
    Account: os-bill
    Branch: claude/project-thread-y8x8ao (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-27456
    Domain: domain:ui
    Seat: domain:ui#4
    File surface: packages/platform-objects/src/identity/sys-api-key.object.ts (the Revoke/Restore successMessage lines only; a cross-lane edit in the engine lane this project owns), any test pinning those strings, tests beside, root .changeset/ (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier on ecd944f5: no path-derived mandate), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: Revoke and Restore toasts name the key (ruling C on #25849), pinned by a test
    Thread-read: 6491484916
    Premise: holds
    Serial constraints cleared: no open PR touches sys-api-key.object.ts (read 21:4xZ)

    Dispatched 2026-10-29T21:44Z to a card thread of the seat's project; the order lives in the project. ⛔ The thread posts no claim and writes no assignee.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#4 · os-bill · session_01Utp6CbBKXqV5ioVksATxTi
    os-dev-report

    {
      "issue": 27456,
      "status": "done",
      "branch": "claude/project-thread-y8x8ao",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/27757",
      "session": "session_01Utp6CbBKXqV5ioVksATxTi (card thread, mode:thread; seat session_01Utp6CbDAucNyQ4UtzCJKyh)",
      "premise_still_valid": true,
      "summary": "Premise measured true on origin/main 481ade61: sys-api-key.object.ts revoke_api_key / restore_api_key declared successMessage 'API key revoked' / 'API key restored' with no hole. The console needs no change: ActionRunner composeSuccessMessage fills a successMessage record hole from dispatchRecord(action) (the row a list_item dispatch carries), pinned in objectui ActionRunner.copyTemplate-13367.test.ts test 'the row a dispatch carries is `record`'; record is in ACTION_SUCCESS_TEMPLATE_ROOTS, so the action-copy judge accepts it, and name is required on sys_api_key. Source now reads 'API key \"{{ record.name }}\" revoked' / 'restored'; zh-CN, ja-JP, es-ES values hand-written with the same hole (merge mode would keep the old key-less translations); en regenerated.",
      "tests": "head 6a8ef24c3c. New packages/platform-objects/src/identity/sys-api-key-action-copy.test.ts (15 cases: source carries the hole, en bundle equals source, each translated bundle carries the token and is not the English source, served metadata via translateMetadataDocument over SetupAppTranslations for zh-CN and en). Under the lock: pnpm --filter @objectstack/platform-objects test -> Test Files 98 passed, Tests 1384 passed; typecheck exit 0 (tsc + scripts tsconfig + check:test-typecheck); VERDICT command-exit 0. Ablation via scripts/ablation-replace.mjs (test imports src, no dist leg): revoke successMessage back to 'API key revoked' -> 3 failed / 12 passed (declared copy, en bundle, en served); restored, blob cdc3ea64dc71 matches the HEAD blob, git diff HEAD empty.",
      "gates": "dispatch-gates --commands at 6a8ef24c3c: 59 families, plus node scripts/check-sdui-manifest.mjs (exit 0). All exit 0 except: pnpm check:dual-build-cjs-loads exit 3 (PREREQUISITE NOT MET, needs a whole-workspace build) = NOT MEASURED, left to CI; node scripts/check-plugin-teardown-shape.mjs --self-test exit 3 on the shallow clone, exit 0 after git fetch --unshallow origin main. dispatch-gates --ran exit 0: 59 derived, 58 run, 1 NOT-MEASURED, 0 UNRUN. Regen: node scripts/check-i18n-bundles.mjs --write exit 0 after the turbo closure build it names (61 tasks, VERDICT command-exit 0); only the two en leaves moved. CI families: PR check-runs in progress at report time.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "line_budget": "7 files, +117 / -10 vs merge base 481ade61, under the 3000 human-merge threshold",
      "files_changed": [".changeset/27456-api-key-toast-names-key.md", "packages/platform-objects/src/identity/sys-api-key.object.ts", "packages/platform-objects/src/identity/sys-api-key-action-copy.test.ts", "packages/platform-objects/src/apps/translations/en.objects.generated.ts", "packages/platform-objects/src/apps/translations/zh-CN.objects.generated.ts", "packages/platform-objects/src/apps/translations/ja-JP.objects.generated.ts", "packages/platform-objects/src/apps/translations/es-ES.objects.generated.ts"],
      "deviations": ["File surface widened with the seat's approval (relay 21:48Z) from the two source lines to the same two successMessage values in the four packages/platform-objects/src/apps/translations/*.objects.generated.ts bundles: en is a GENERATED file, rewritten by node scripts/check-i18n-bundles.mjs --write (exit 0); zh-CN / ja-JP / es-ES values hand-written, as AGENTS.md allows for translated-locale values.", "Harness post-PR assignee/reviewer step skipped per the maintainer's routing rule; the relay read-back shows no assignees.", "The worktree checkout was unshallowed (git fetch --unshallow origin main) so the teardown self-test's pinned fixture resolves.", "Commit trailers are the model-free pair (Claude-Session + Co-authored-by: Claude), not the harness's model-named Co-Authored-By line, per AGENTS.md."],
      "mcp_calls": "2 — mcp__claude-code-remote__get_session x1 (own session id, not GitHub); mcp__claude-code-remote__subscribe_pr_activity x1 (PR event subscription, not a GitHub write). No mcp__github__ call.",
      "api_writes": "2 — relay pr_create (repository_dispatch -> POST /repos/objectstack-ai/objectstack/pulls, draft, read-back identical); this os-dev-report comment via post-stamped (POST /repos/objectstack-ai/objectstack/issues/27456/comments). git pushes not counted.",
      "open_questions": [],
      "out_of_scope_findings": []
    }
  4. objectstack-fleet commented on Oct 29, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#4 · os-bill · session_01Utp6CbDAucNyQ4UtzCJKyh

    ACCEPT → PR #27757 comment 6510372760 · 2026-10-29T22:52Z (corrected: the first post of this pointer missed the id because the ACCEPT write had been refused and was re-posted)


    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:accessPermissions that actually hold — RLS/FLS, sharing model, write-path guardsbugSomething isn't workingdomain:uipm:dispatchedpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions