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
platform-objects: sys_session.revoke_reason's description is the field's published vocabulary and lacks admin_password_reset, the value PR #23440's forced-reset revocation writes #23477
Filing gate ①, class (b): a declared contract that a producer breaks. reach: is a named producer: packages/plugins/plugin-auth/src/forced-reset-revocation.ts (PR #23440, #23287) writes revoke_reason: 'admin_password_reset' on every live session a forced reset revokes, ON by default (the maintainer's letter A on #23287).
Filed by domain:spec seat 4 (#18917) · sunhaolin · session session_0121ooBYRmS8ziFXm9ai5YHm, from PR #23440's contract review (6167875771, ③ (b), escalated to this seat), checked on origin/main. ⛔ Not a claim. Lane, type and grade are triage's.
The contract
packages/platform-objects/src/identity/sys-session.object.ts, field revoke_reason: the in-code comment says "this description IS the published vocabulary — there is no Zod enum behind this column (it is free text), so this line is the only contract a consumer can read". The description lists idle_timeout, absolute_max, concurrent_cap, user_revoked, admin and organization_membership_ended. It does not list admin_password_reset.
The description names admin_password_reset beside the other causes (an administrator's forced password reset revoked the session), and the four translation bundles regenerate (node scripts/check-i18n-bundles.mjs --write). This lands with or after PR #23440. The value does not exist on main until that PR lands.
Reader who acts: triage routes it. The fix is one description line in platform-objects plus its generated bundles.
Dedupe
MCP search_issues on this repo, closed included: sys_session revoke_reason vocabulary description admin_password_reset forced reset → 1 hit: #7732 (closed), the interactive revoke path tombstoning rather than deleting — a different defect on the same field. #15784 (closed) widened this vocabulary for organization_membership_ended; it is the precedent, not this.
Dedupe words: revoke_reason vocabulary admin_password_reset; sys_session revoke reason description forced reset; published vocabulary free text column.
Read fresh. PR #23440 merged, so main now writes revoke_reason: 'admin_password_reset', and the field's description (the published vocabulary: free text with no enum, per its own comment) does not list it.
Claim: PM loop round 1
Session: session_01D6F9axfoPzR7t8G1J7Ytzz
Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-23477-revoke-reason-vocabulary
Worktree: objectstack-issue-23477
Domain: domain:spec
Seat: domain:spec#3 (seat post #18883)
File surface (at origin/mainf9b421716 or later; stop on a breach and explain it in the report): packages/platform-objects/src/identity/sys-session.object.ts (the revoke_reason description and its comment, ~192-201); the translation bundles node scripts/check-i18n-bundles.mjs --write regenerates for that field; a test that pins the description names FORCED_RESET_REVOKE_REASON if the package has a vocabulary pin; .changeset/23477-*.md.
Container & model: S mechanical, mode:subagent, model: floor (per dispatch-gates --tier: no path-derived mandate; floor · default · ceiling); one description line plus regenerated bundles, judged by the i18n gates
Clause-②: no
Responsibility: packages/platform-objects' sys_session.revoke_reason description (the field's only published vocabulary) | the producer packages/plugins/plugin-auth/src/forced-reset-revocation.ts (FORCED_RESET_REVOKE_REASON = 'admin_password_reset', PR #23440, merged) already writes the value | any consumer reading the session's revoke reason
Thread-read: 6168824114
Serial constraints cleared: open PR #23469 regenerates packages/platform-objects/src/apps/translations/* (a different bundle folder from identity); open PR #23503 regenerates plugin-security bundles. Generated-file concurrency: the later lander re-runs the generator, never hand-merges.
Read on origin/mainf9b421716 at 2026-10-14T15:27Z: the description lists admin, organization_membership_ended, … (sys-session.object.ts:201) and not admin_password_reset; forced-reset-revocation.ts:46 writes it.
{
"issue": 23477,
"status": "done",
"branch": "claude/issue-23477-revoke-reason-vocabulary",
"pr": "https://github.com/objectstack-ai/objectstack/pull/23518",
"session": "session_01D6F9axfoPzR7t8G1J7Ytzz",
"premise_still_valid": true,
"summary": "sys_session.revoke_reason description now names admin_password_reset (after organization_membership_ended) with its cause in the in-code comment; en bundle regenerated, zh-CN/ja-JP/es-ES help strings hand-updated; added a plugin-auth test asserting the description contains FORCED_RESET_REVOKE_REASON (no prior pin existed; dependency direction forbids the test in platform-objects); patch changeset. Bundles live in apps/translations, not identity; #23469 touches the same folder so the later lander re-runs the generator.",
"tests": "plugin-auth new test 1/1; platform-objects 70 files/1091 tests; both typechecks OK; spec test:repo 60 files/1029 tests; check-i18n-bundles --write exit 0 then check exit 0 (all in sync); dispatch-gates 66 derived, 66 run, all exit 0 except check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET (NOT MEASURED, unrelated dist missing). No accept/refuse change.",
"mcp_calls": "0",
"api_writes": "2 via fleet-write relay: pr_create (with assignees baozhoutao) and this comment; plus git push",
"open_questions": [],
"out_of_scope_findings": []
}
Session session_01D6F9axfoPzR7t8G1J7Ytzz · baozhoutao. Reviewer of record; checked against GitHub, not the report.
Shape: draft, Fixes #23477, Clause-②: no; +26/−5, 7 files; not governed. No packages/spec/src/**, no Clause-②: yes: no contract-tier review is owed; this is the seat's read.
Pin:plugin-auth/src/forced-reset-revoke-reason-vocabulary.test.ts asserts the description contains FORCED_RESET_REVOKE_REASON (it lives in plugin-auth, the producer, because platform-objects cannot depend on it). A future value the producer adds without naming it fails there.
Changeset prose:23477-revoke-reason-vocabulary.md, platform-objectspatch, "Description text only"; it says what the diff does.
Session session_01D6F9axfoPzR7t8G1J7Ytzz · baozhoutao. Merged through the merge queue; the squash equals the reviewed head c9d07c88c by git patch-id --stable; on origin/main. The card closed completed on Fixes #23477; pm:dispatched is removed in this act. sys_session.revoke_reason's description names admin_password_reset, pinned against FORCED_RESET_REVOKE_REASON in plugin-auth. Open PR #23469 regenerates the same translations folder; its lander re-runs check-i18n-bundles --write.
Activity
objectstack-fleet commentedon Oct 14, 2026
Triage: first grade ·
bug·priority:p1+target:v18·domain:spec·area:access·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-14T12:54ZRead fresh. PR #23440 merged, so
mainnow writesrevoke_reason: 'admin_password_reset', and the field's description (the published vocabulary: freetextwith no enum, per its own comment) does not list it.target:label. The fix is one description line plus the regenerated bundles.domain:spec: auth-gate parity: a request carrying an API key beside a session cookie held by ADR-0069 is refused at REST but admitted by the five raw-host route families — one cross-seam answer is owed (session versus user) #23287's family (PR feat(spec,core,plugin-auth)!: an API key answers as its owner's session does when the ADR-0069 policy holds the account (#23287) #23440's seat filed it).node scripts/check-i18n-bundles.mjs --write. Precedent: revoke a session whose membership ended, so "Remove member" actually signs the person out — the courtesy half of #15409, ⛔ never the enforcement #15784.objectstack-fleet commentedon Oct 14, 2026
Claim: PM loop round 1
Session:
session_01D6F9axfoPzR7t8G1J7YtzzAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-23477-revoke-reason-vocabularyWorktree:
objectstack-issue-23477Domain:
domain:specSeat:
domain:spec#3(seat post #18883)File surface (at
origin/mainf9b421716or later; stop on a breach and explain it in the report):packages/platform-objects/src/identity/sys-session.object.ts(therevoke_reasondescription and its comment, ~192-201); the translation bundlesnode scripts/check-i18n-bundles.mjs --writeregenerates for that field; a test that pins the description namesFORCED_RESET_REVOKE_REASONif the package has a vocabulary pin;.changeset/23477-*.md.Container & model:
S mechanical,mode:subagent,model: floor (per dispatch-gates --tier: no path-derived mandate; floor · default · ceiling); one description line plus regenerated bundles, judged by the i18n gatesClause-②: no
Responsibility:
packages/platform-objects'sys_session.revoke_reasondescription (the field's only published vocabulary) | the producerpackages/plugins/plugin-auth/src/forced-reset-revocation.ts(FORCED_RESET_REVOKE_REASON = 'admin_password_reset', PR #23440, merged) already writes the value | any consumer reading the session's revoke reasonThread-read: 6168824114
Serial constraints cleared: open PR #23469 regenerates
packages/platform-objects/src/apps/translations/*(a different bundle folder fromidentity); open PR #23503 regenerates plugin-security bundles. Generated-file concurrency: the later lander re-runs the generator, never hand-merges.Read on
origin/mainf9b421716at 2026-10-14T15:27Z: the description listsadmin, organization_membership_ended, …(sys-session.object.ts:201) and notadmin_password_reset;forced-reset-revocation.ts:46writes it.Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
os-dev-report
{ "issue": 23477, "status": "done", "branch": "claude/issue-23477-revoke-reason-vocabulary", "pr": "https://github.com/objectstack-ai/objectstack/pull/23518", "session": "session_01D6F9axfoPzR7t8G1J7Ytzz", "premise_still_valid": true, "summary": "sys_session.revoke_reason description now names admin_password_reset (after organization_membership_ended) with its cause in the in-code comment; en bundle regenerated, zh-CN/ja-JP/es-ES help strings hand-updated; added a plugin-auth test asserting the description contains FORCED_RESET_REVOKE_REASON (no prior pin existed; dependency direction forbids the test in platform-objects); patch changeset. Bundles live in apps/translations, not identity; #23469 touches the same folder so the later lander re-runs the generator.", "tests": "plugin-auth new test 1/1; platform-objects 70 files/1091 tests; both typechecks OK; spec test:repo 60 files/1029 tests; check-i18n-bundles --write exit 0 then check exit 0 (all in sync); dispatch-gates 66 derived, 66 run, all exit 0 except check:dual-build-cjs-loads exit 3 PREREQUISITE NOT MET (NOT MEASURED, unrelated dist missing). No accept/refuse change.", "mcp_calls": "0", "api_writes": "2 via fleet-write relay: pr_create (with assignees baozhoutao) and this comment; plus git push", "open_questions": [], "out_of_scope_findings": [] }objectstack-fleet commentedon Oct 14, 2026
Review: ACCEPT · PR #23518 @
c9d07c88c1a7ddc6cb960c594328d96b48c69bd5·domain:specseat 3 · 2026-10-14T16:39ZSession
session_01D6F9axfoPzR7t8G1J7Ytzz·baozhoutao. Reviewer of record; checked against GitHub, not the report.Fixes #23477,Clause-②: no; +26/−5, 7 files; not governed. Nopackages/spec/src/**, noClause-②: yes: no contract-tier review is owed; this is the seat's read.6168824114):sys_session.revoke_reason's description namesadmin_password_resetafterorganization_membership_ended, and the in-code comment gives its cause (an administrator's forced password reset,FORCED_RESET_REVOKE_REASON). Theenbundle is regenerated bycheck-i18n-bundles --write; thezh-CN/ja-JP/es-EShelp strings are translations, each gaining the one value, as revoke a session whose membership ended, so "Remove member" actually signs the person out — the courtesy half of #15409, ⛔ never the enforcement #15784 did;check-i18n-bundlespasses after.plugin-auth/src/forced-reset-revoke-reason-vocabulary.test.tsasserts the description containsFORCED_RESET_REVOKE_REASON(it lives inplugin-auth, the producer, becauseplatform-objectscannot depend on it). A future value the producer adds without naming it fails there.23477-revoke-reason-vocabulary.md,platform-objectspatch, "Description text only"; it says what the diff does.packages/platform-objects/src/apps/translations/(the claim guessed anidentityfolder). Open PR feat(metadata-core,metadata-protocol)!: the sys_metadata family declares no organization column; indexes re-keyed (ADR-0131 D6/D7, C7b S2) #23469 regenerates the same folder; the later lander re-runs the generator.Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
Landed · PR #23518 →
main3f0a30741·domain:specseat 3 · 2026-10-14T17:37ZSession
session_01D6F9axfoPzR7t8G1J7Ytzz·baozhoutao. Merged through the merge queue; the squash equals the reviewed headc9d07c88cbygit patch-id --stable; onorigin/main. The card closedcompletedonFixes #23477;pm:dispatchedis removed in this act.sys_session.revoke_reason's description namesadmin_password_reset, pinned againstFORCED_RESET_REVOKE_REASONinplugin-auth. Open PR #23469 regenerates the same translations folder; its lander re-runscheck-i18n-bundles --write.Generated by Claude Code