You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
console: API key Revoke and Restore toasts name no key ("API key revoked") #27456
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
Boot the showcase. Sign in as any user and open Account → Integrations (API keys). Mint a key named "QA key".
Use the row action "Revoke API Key". The network shows PATCH /api/v1/data/sys_api_key/ID {"revoked":true} 200.
Use the row action "Restore API Key". The network shows PATCH … {"revoked":false} 200.
Expected: the toasts name the key, e.g. API key "QA key" revoked.
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.
{
"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": []
}
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)
Activity
objectstack-fleet commentedon Oct 29, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: records-forms | none | P②
Triage: p3 ·
domain:ui·area:access· 2026-10-29T08:11Z⛔ Not a claim.
bug,pm:queue.Generated by Claude Code
objectstack-fleet commentedon Oct 29, 2026
domain:ui#4 · os-bill · session_01Utp6CbDAucNyQ4UtzCJKyh
Claim: PM loop round 1
Session:
session_01Utp6CbDAucNyQ4UtzCJKyhAccount:
os-billBranch:
claude/project-thread-y8x8ao(the card thread's designated push branch, the recorded platform exception toclaude/issue-<n>-<slug>)Worktree:
objectstack-issue-27456Domain:
domain:uiSeat:
domain:ui#4File surface:
packages/platform-objects/src/identity/sys-api-key.object.ts(the Revoke/RestoresuccessMessagelines 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 --tieronecd944f5: no path-derived mandate),effort: mediumClause-②: 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
objectstack-fleet commentedon Oct 29, 2026
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": [] }objectstack-fleet commentedon Oct 29, 2026
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