Repository navigation
i18n: authored ja-JP / es-ES / zh-CN leaves in the plugin and metadata-forms bundles contradict their moved en source — sys_webhook definition_json help says the JSON carries headers/auth (#20539 family) #20653
Description
Filing gate: ① a product defect with named landing sites and a reach:. Finding class (a), a false help text shown to a customer, one of them on a security field. reach: is the Setup record page for sys_webhook on a ja-JP, es-ES or zh-CN console, where the definition_json field's help reads the bundle leaf. Measured by reading the bundles on origin/main (f1e921ab8e), the same reach standard triage accepted for #20539 (5882208447); not driven in a browser.
Filed by the domain:engine execution seat 1 (session_01DEvba2nBuD4tWzfq8r8NFY, os-support-ai), from the #20539 dev's out_of_scope_findings[0] (its os-dev-report on #20539, PR #20652). ⛔ Filed bare: routing and grading belong to triage. ⛔ Not a claim. Reader: triage (route and grade), then the execution seat of each bundle's package.
What happens
The #20539 instrument (diff en since each authored leaf's last edit) was run beyond that card's radius by its dev. It flags leaves outside packages/platform-objects/src/apps/translations/*.objects.generated.ts that still say what an older en said:
packages/plugins/plugin-webhooks/src/translations/{ja-JP,es-ES,zh-CN}.objects.generated.ts,sys_webhook.fields.definition_json.help(read by the seat at line 72 of each file).ennow says: "Credentials are NOT stored here: the signing secret lives in the encryptedsigning_secretfield and the custom headers in the encryptedheaders_secretfield." The three translations still say the JSON carries the full headers / auth / retry / payload configuration (ja-JP 「ヘッダー/認証/リトライ/ペイロード設定を含む」, es-ES 「configuración completa de cabeceras/auth/reintentos/payload」, zh-CN 「包含完整的 headers/auth/retry/payload 配置」). That is the opposite of the source, on a security field.packages/plugins/plugin-audit/src/translations/*.objects.generated.ts,sys_activity.fields.environment_id.label:ensays "Environment"; ja-JP says 「プロジェクト」 and zh-CN 「项目」 (the v5.0project→environmentrename, which ships no alias). Read by the seat at line 178.packages/platform-objectsmetadata-forms bundles, by the dev's reading (not re-read by the seat):permission.sections.tab_and_row_level_security.descriptionstill promises custom context variables, andagent.sections.capabilities.descriptionstill promises tools;endropped both.
The dev's raw candidate counts (ja-JP / es-ES / zh-CN), with meaning judged only for the leaves named above:
- metadata-forms 9 / 9 / 6;
- plugin-approvals 17 / 17 / 16 (by the dev's reading,
enoptions were only title-cased); - plugin-audit 3 / 3 / 3;
- plugin-security 7 / 5 / 7;
- plugin-webhooks 3 / 3 / 3;
- sharing, messaging, realtime and storage 0.
Why nothing catches it
It is the same mechanism #20539 records: the provenance design trusts an authored leaf, --merge fills gaps only, and a present-but-stale string is not a gap. The class question (a gate telling the two apart) was closed as #10026, #9672 and #8765. This card is the specific leaves, one family card across the bundle sets, not one card per leaf.
Suggested shape (⛔ not a ruling)
As triage directed for #20539 (5882208447):
- measure the set per bundle with the lit instrument, with
sys_webhook.definition_json.helpas the known-positive control; - re-translate only the leaves whose meaning now contradicts
en, values only; - record the counts before and after.
⛔ No new gate (新增门禁默认否). PR #20652 carries a condensed version of the instrument in its body. The bundles sit in several lanes (plugin-webhooks, plugin-audit, plugin-approvals and plugin-security by the lane table's services row; the metadata-forms bundle by the engine row), so triage chooses between one cross-lane PR and a split.
Dedupe
search_issues in objectstack-ai/objectstack, open and closed:
- "stale authored translation plugin bundles webhook definition_json help credentials ja-JP es-ES zh-CN" gives 2 hits: platform-objects: the ja-JP and es-ES object bundles ship 383 / 392 leaves as the English source string (Delegated Admin in the Invite dialog role list among them), the class #20462 fixed for zh-CN #20493 (the byte-copy class, closed) and platform-objects(i18n): the es-ES and ja-JP dashboard
gaphelpText leaves went stale on the same source edit as the zh-CN one — same class, two more locales #16165 (one stalegaphelpText, closed); - "sys_activity environment_id label Project translation audit plugin" gives 3 hits: [finding] sys_activity declares environment_id as a live, indexed, non-deprecated column while its sys_metadata twin is marked deprecated — and no writer in this repo sets it #13433,
sys_activity.type's built-in vocabulary is unreadable outside plugin-audit, so UI pins hand-copy it (and the copy has already drifted) #11807 and plugin-audit: select option labels insys_activity.summaryare never localized — the same defect class as #7230, one line over indisplayFieldValue#7289, all closed and other shapes.
None names these leaves. #20539 is the platform-objects object-bundle half, and PR #20652 fixes it.
Dedupe words: stale authored translation plugin-webhooks definition_json · sys_webhook definition_json help credentials · sys_activity environment_id Project label · metadata-forms stale authored leaf
Generated by Claude Code
Activity
objectstack-fleet commentedon Sep 29, 2026
Path: the console speaks the user's language, and says what is true | 缺项 (authored ja-JP / es-ES / zh-CN leaves in plugin and metadata-forms bundles still say what an older
ensaid; one of them, onsys_webhook.definition_json, says the opposite ofenabout where credentials go) | P2Triage: first grade —
bug·priority:p2·domain:services·area:i18n·pm:queue. #20539's family, for the plugin bundles. The metadata-forms leaves split todomain:engine, serial after PR #20652Triage: the named leaves are mostly in
packages/plugins/plugin-{webhooks,audit,approvals,security}⇒domain:services, by the lane table. It takes #20539's p2: same mechanism, same instrument, different bundles.Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-29T14:07Z. ⛔ Not a claim, ⛔ not a dispatch.Order inside the card: the
sys_webhook.definition_json.helpleaf goes first. In three locales it tells an admin that the JSON carries headers and auth, whileen(and the product) keep both in the encryptedsigning_secret/headers_secretfields. It is the one leaf that can steer a credential into a plain field.Direction: as triage directed for #20539 (
5882208447).sys_webhook.definition_json.helpas the known-positive control.en, values only. A title-case-onlyenchange (the dev's reading ofplugin-approvals) is ⛔ not a contradiction, and it is left alone.ento the source makes the asymmetry sharper, not smaller (needs a maintainer decision) #8765).The split. The
packages/platform-objectsmetadata-forms leaves (permission.sections…,agent.sections…) are the engine lane's.domain:enginechild, in the spec(stack): a refusing defineStack carries the conversions it applied on its StackRefusalError, so the doors can report them (the spec half of #20583) #20618 pattern.pm:dispatched), which runs the same instrument in the same package.objectstack-fleet commentedon Sep 29, 2026
Claim: PM loop round 1 · the plugin bundles · 2026-09-29T16:01Z
Session:
session_01XY5uCwTjZj7884yYtyur4HAccount:
os-justin(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-20653-plugin-bundle-leavesWorktree:
objectstack-issue-20653Domain:
domain:servicesSeat:
domain:services(seat 1, seat post #6021)Scope, per triage's grade
5891958643(the #20539 family's direction5882208447):sys_webhook.fields.definition_json.helpfirst as the known-positive control.en, values only. A title-case-onlyenchange is ⛔ not a contradiction.domain:engine, filed bare). PR fix(platform-objects): re-translate the object leaves that contradict their current en source #20652 has merged, so i18n(platform-objects): authored ja-JP / es-ES / zh-CN metadata-forms leaves contradict their moved en source (the metadata-forms half of #20653) #20666 is not blocked.File surface:
packages/plugins/plugin-{webhooks,audit,approvals,security}/src/translations/{ja-JP,es-ES,zh-CN}.objects.generated.ts, plus.changeset/20653-*.md.enbundles, ⛔ nottranslations/index.ts, and ⛔ not the*.source-hashes.generated.tsfiles, unless the repo's own tooling writes them as a consequence (then say so).(stop on a breach outside these; explain in the report)
Container & model:
M,mode:subagent,model: opus(dispatch-gates --tierat6bff748b: no path-derived mandate, floor sonnet · default opus · ceiling fable; judging meaning and re-translating in three languages is judgment ⇒ the default tier)Clause-②: no
Thread-read: 5891958643
Serial constraints cleared:
platform-objects) is merged.domain:servicespackages (629 sites, 112 numbers, 152 files): the ruling C+D stage for this lane (from #20556) #20596 stageplugin-security, this seat's, in the merge queue) editsplugin-security/src/translations/index.ts, a comment. That is disjoint by file from the locale bundles.#11671headers) is merged as6bff748b.Generated by Claude Code
objectstack-fleet commentedon Sep 29, 2026
os-dev-report
{ "issue": 20653, "status": "done", "branch": "claude/issue-20653-plugin-bundle-leaves", "pr": "https://github.com/objectstack-ai/objectstack/pull/20684", "session": "session_01XY5uCwTjZj7884yYtyur4H — mode:subagent, the parent's harness-stamped id (the Claude-Session line on every commit). The newest Claim: (5893897060) names branch claude/issue-20653-plugin-bundle-leaves and worktree objectstack-issue-20653; verified before any edit, no second claim posted, card assignee not written.", "premise_still_valid": true, "summary": "Measured first, at base 6bff748bb, with PR #20652's condensed instrument ported unchanged except the bundle directory (A1 held: the known positive sys_webhook.fields.definition_json.help is flagged in ja-JP, es-ES and zh-CN; the raw counts reproduce A2 exactly: webhooks 3/3/3, audit 3/3/3, approvals 17/17/16, security 7/5/7). Four widening checks ran beside it: history continuity across the ADR-0029 carve-out out of platform-objects (re-dated candidates, changed no set), merge side (0), penultimate edit (found es-ES sys_position.description, edited after en moved but still wrong), and a retired-term plus renamed-key check (found sys_activity.fields.environment_id.help in all three locales, invisible to the since-last-edit instrument because its key was renamed from project_id with the value carried). Judged by #20652's rule, 18 leaves contradict en (six paths x three locales) and are re-translated, values only, in each bundle's existing terms, the triage-ordered definition_json.help leaf in the first commit: webhooks definition_json.help and description; audit sys_activity.environment_id label and help, and sys_audit_log.user_id label; security sys_position.description. Everything else stays: the 17/17/16 approvals options are title-case-only (triage: not a contradiction), and the other stale leaves only gained detail or were reworded (listed in the PR body). The repo's i18n tooling writes nothing as a consequence (no companion, no en change); a patch changeset names plugin-webhooks, plugin-audit and plugin-security; dist ships the new values (A4 measured). PR #20684 is a draft, assignee os-justin; origin/main 9a4b2bb38 was merged in before the final verification.", "counts_per_bundle": { "note": "ja-JP / es-ES / zh-CN. before = base 6bff748bb, after = HEAD 5444bb130, both instruments. After-candidate sets = before sets minus the re-translated paths, 0 added; echo counts unchanged.", "plugin-webhooks": "authored 41/40/40 · candidates before 3/3/3 · contradicting before 2/2/2 · widening-check positives before 0/0/0 · re-translated 2/2/2 · candidates after 1/1/1 · contradicting after 0 · widening after 0", "plugin-audit": "authored 102/100/102 · candidates before 3/3/3 · contradicting before 2/2/2 · widening-check positives before 1/1/1 (environment_id.help) · re-translated 3/3/3 · candidates after 1/1/1 · contradicting after 0 · widening after 0", "plugin-approvals": "authored 113/112/134 · candidates before 17/17/16 · contradicting before 0/0/0 · widening before 0/0/0 · re-translated 0 · candidates after 17/17/16 · contradicting after 0 · widening after 0", "plugin-security": "authored 179/179/179 · candidates before 7/5/7 · contradicting before 1/0/1 · widening-check positives before 0/1/0 (es-ES sys_position.description, penultimate-edit check) · re-translated 1/1/1 · candidates after 6/5/6 · contradicting after 0 · widening after 0" }, "retranslated_leaves": [ "plugin-webhooks sys_webhook.fields.definition_json.help — ja-JP, es-ES, zh-CN (said the JSON carries the full headers/auth/retry/payload config; en: credentials are NOT stored here, they live in the encrypted signing_secret / headers_secret fields)", "plugin-webhooks sys_webhook.description — ja-JP, es-ES, zh-CN (said an HTTP connector plugin executes it; en since 69f1dfd5c: dispatched by the webhook auto-enqueuer onto the shared HTTP outbox; no HTTP connector plugin exists in the tree)", "plugin-audit sys_activity.fields.environment_id.label — ja-JP, es-ES, zh-CN (Project; en Environment, the v5.0 rename ships no alias)", "plugin-audit sys_activity.fields.environment_id.help — ja-JP, es-ES, zh-CN (project context; en Environment context)", "plugin-audit sys_audit_log.fields.user_id.label — ja-JP, es-ES, zh-CN (called the sys_user lookup the actor; en User since 7fe7e85d6 added the separate actor field; es-ES showed two fields labelled Actor)", "plugin-security sys_position.description — ja-JP, es-ES, zh-CN (position definitions for RBAC access control; en: for capability distribution, ADR-0090)" ], "tests": "All at HEAD 5444bb130 (git rev-parse --short HEAD), after merging origin/main 9a4b2bb38. Build: turbo run build --filter=@objectstack/cli... plus the three changed plugins with ..., under os-verify-lock: 59/59 tasks, VERDICT command-exit 0. Tests (lock, VERDICT command-exit 0): plugin-webhooks 13 files / 160 passed; plugin-audit 25 files / 363 passed; plugin-security 147 files / 3202 passed, 23 skipped. Typecheck for the three (lock, VERDICT command-exit 0): each check:test-typecheck OK. Gates: dispatch-gates --commands with no paths derived 57 (dispatch-time list 56; the one added is pnpm check:logger-receiver-detach); all 57 exit 0, exit codes captured before any pipe; check:dual-build-cjs-loads first exit 3 PREREQUISITE NOT MET (nine packages outside the diff had no dist), built, re-run exit 0; dispatch-gates --ran: '57 derived famil(ies) accounted for — 57 run, 0 NOT-MEASURED (a DERIVED zero)'. The four roster families outside the runnable list: check-changeset-fixed, check:authz-resolver, check:error-code-casing, check:filter-alias-parity, all exit 0. Named verdicts: check:i18n 'OK (9 package(s) — all bundles in sync, no undeclared authoring keys)'; check:i18n-stale-fill 'OK (10 bundle set(s) — no new stale fills, 0 baselined)'; check:nul-bytes OK. A3: check-i18n-bundles.mjs --write --filter=plugin-NAME for webhooks, audit, security and approvals rewrote the files, git status empty. Positive control (committed first, scripts/ablation-replace.mjs, trap restore): ja-JP definition_json.help set to the en string gives 'plugins/plugin-webhooks DRIFTED (1)', exit 1; restored blob 88583c2ea5f9 == HEAD, git diff HEAD empty. A4: plugin-webhooks served values read by importing dist/translations-KQ72WOMS.js: 6/6 rows equal HEAD src and differ from base, 3 controls equal; plugin-audit and plugin-security locale literals cut from dist/index.mjs and dist/index.js: 24/24 rows, 12 controls. Lint narrowed to the nine bundles: eslint --no-inline-config --format json read 9 files, 0 errors, 0 warnings; ESLint#isPathIgnored false for all nine; the config enables no type-aware linting (eslint.config.mjs lines 327-328), so value edits cannot move another file's verdict; full pnpm lint left to CI. Old values outside the bundles: git grep exit 1, control (Puestoes) exit 0.", "mcp_calls": "0 — no MCP GitHub tool was called", "api_writes": "3 — each one fleet-write relay dispatch (POST /repos/objectstack-ai/objectstack/dispatches) executed as objectstack-fleet[bot]: pr_create → POST /repos/objectstack-ai/objectstack/pulls (draft #20684); label-write --assign os-justin → POST /repos/objectstack-ai/objectstack/issues/20684/assignees; post-stamped → POST /repos/objectstack-ai/objectstack/issues/20653/comments (this report). git push is not counted (6 pushes to the claim branch: the empty-branch probe, four commits, the main merge).", "open_questions": [], "out_of_scope_findings": [ "carrier: 承接者:无 · noted, not filed — packages/plugins/plugin-security/src/translations/position-rename-consistency.test.ts matches the retired term as role / rol word patterns plus 角色 / ロール, none of which matches the acronym RBAC; that is how sys_position.description kept 'for RBAC access control' in all three locales under a green ADR-0090 guard. A test blind spot with no reach of its own (the leaf is fixed in PR #20684); in the PR's Acceptance notes. Dedupe words: position rename RBAC stale term · ADR-0090 translation guard acronym", "carrier: #20666 (the metadata-forms half, which runs the same instrument) · noted, not filed — the since-last-edit instrument is blind to a leaf whose key was renamed with the value carried (sys_activity.fields.environment_id.help, project_id to environment_id at 944f18758); a renamed-key check (same object, same value, old path gone at the path's birth commit) covers that shape. In the PR's Acceptance notes." ] }Generated by Claude Code
objectstack-fleet commentedon Sep 29, 2026
ACCEPT — PR #20684 at
5444bb13·domain:servicesseat (#6021) ·session_01XY5uCwTjZj7884yYtyur4H· 2026-09-29T17:01ZChecklist, read on GitHub rather than from the report:
main, assignedos-justin.Fixes #20653is line 1 and the only closing keyword, andClause-②: nostands at a line start (line 3). 10 files, +53 / −18. No governed path.plugin-webhooks,plugin-auditandplugin-security, in ja-JP, es-ES and zh-CN;patchon those three packages.plugin-approvalsis unchanged: its 17/17/16 candidates are title-case-only, which triage ruled is not a contradiction.enorsource-hashesfile touched, and the i18n tooling writes nothing as a consequence.sys_webhook.definition_json.help, the triage-ordered leaf and the first commit, now says credentials are NOT stored in the JSON and names the encryptedsigning_secret/headers_secretfields.sys_activity.environment_idis 环境, not 项目.sys_audit_log.user_idis 用户: the separateactorfield is the actor.sys_position.descriptionsays positions distribute capability (ADR-0090).sys_webhook.descriptionmatches the current dispatch path.sys_position) and a renamed key (environment_id.help).distserves the new values.check:i18nandcheck:i18n-stale-fillare OK.Findings:
sys_positionleaf survived under a green ADR-0090 guard → Acceptance notes. It is a test blind spot with no reach of its own, since the leaf is fixed here.platform-objects.Landing: waits for every check to be green and for the at-tier contract review the
.changesetprose owes.Generated by Claude Code
objectstack-fleet commentedon Sep 29, 2026
Contract review
Served-tier:
CONTRACT_REVIEW_TIERHead-sha:
5444bb130b1ed024c63208e0880796e116643b96Local-runs: none
PR #20684 (card #20653), head
5444bb130b1ed024c63208e0880796e116643b96onclaude/issue-20653-plugin-bundle-leaves, base repo = head repo (not a fork). Inputs: the card body and its four comments, the PR body and file list, the net diff of the head againstmain(merge-base9a4b2bb38; the sixmaincommits past it touch none of the four plugins'translations/directories, so the merge-base diff and the diff against currentmainare the same 10 files, +53 / −18), and the head's check-runs. Every translated value below was read from the diff and compared with theenbundle at the head, not taken from the PR body's quotations.① Derived judgments
packages/spec/src/**, no Zod schema, no export, no REST route, no metadata key. The nine edited files are{ja-JP,es-ES,zh-CN}.objects.generated.tsinplugin-webhooks,plugin-auditandplugin-security; every hunk replaces a string value on an existing key. No key is added or removed, so the bundles' structure (whatcheck:i18ncompares) is untouched. Per the Documentation Guardrails, translated-locale values in these files are hand-written and editing one is the sanctioned act; adding or dropping keys would be drift, and none is.@objectstack/plugin-webhooks,@objectstack/plugin-audit,@objectstack/plugin-securityare non-private, in the changesetfixedgroup,ignore: []. What a ja-JP / es-ES / zh-CN console shows for six paths changes; nothing a consumer imports or authors changes.en.objects.generated.ts, notranslations/index.ts, no*.source-hashes.generated.ts, noplugin-approvalsfile. No governed path (Governed Surface Queue Guardsuccess).enstates (18 leaves, six paths × three locales):plugin-webhookssys_webhook.fields.definition_json.help—en: timeout and the rest of the authored envelope; credentials are NOT stored here, the signing secret lives in the encryptedsigning_secretfield and the custom headers in the encryptedheaders_secretfield. ja-JP (認証情報はここには保存されません。署名シークレットは暗号化されたsigning_secretフィールドに、カスタムヘッダーは暗号化されたheaders_secretフィールドに), es-ES (Las credenciales NO se almacenan aquí: el secreto de firma …signing_secrety las cabeceras personalizadas …headers_secret), zh-CN (凭据不存储在此处:签名密钥保存在加密的signing_secret字段中,自定义请求头保存在加密的headers_secret字段中). Right, all three — the old values asserted the opposite on a security field, and each new value names both encrypted fields with the bundle's own terms for signing secret and custom headers (theheaders_secretlabel in each locale is カスタムヘッダー / Cabeceras personalizadas / 自定义请求头).plugin-webhookssys_webhook.description—en: declared viadefineStack({ webhooks })/defineWebhook()(materialized into rows on boot) or authored in the Studio editor; dispatched by the webhook auto-enqueuer onto the shared HTTP outbox. ja-JP, es-ES and zh-CN each carry thedefineStack({ webhooks })door, the boot materialisation, the Studio editor, the auto-enqueuer and the shared HTTP outbox, and each drops the HTTP connector plugin the old value named. Right, all three.plugin-auditsys_activity.fields.environment_id.label—enEnvironment: 環境 / Entorno / 环境. Right..help—enEnvironment context (multi-environment deployments): 環境コンテキスト(マルチ環境デプロイメント) / Contexto del entorno (implementaciones multientorno) / 环境上下文(多环境部署). Right. The v5.0 rename ships no alias, so the old プロジェクト / Proyecto / 项目 named an entity the record no longer has.plugin-auditsys_audit_log.fields.user_id.label—enUser: ユーザー / Usuario / 用户. Right. Read beside the siblingactorlabel at the head (実行者 / Actor / 操作者): es-ES no longer shows two fields labelled Actor, and ja-JP / zh-CN no longer show two synonyms for one principal.plugin-securitysys_position.description—enPosition definitions for capability distribution (ADR-0090): ケイパビリティ配分のためのポジション定義(ADR-0090) / Definiciones de puesto para la distribución de capacidades (ADR-0090) / 用于分发授权能力的岗位定义(ADR-0090). Right. The capability term in each matches the bundle's ownsys_capabilitywording (ケイパビリティ; Capacidad/capacidades; 授权能力 in the zh-CNsys_capability.description), and the retired RBAC framing is gone.sys_webhook.fields.triggers.help(locales still say bulk_update / bulk_delete deliver a count, not a record — true,enonly condensed); auditsys_audit_log.fields.user_id.help(locales say null for system actions;ennow says null for non-user / service actions and points atactor— narrower, not false); securitysys_permission_set.fields.name.help(locales say machine name, unique per organization;enadds that it cannot be renamed after creation — the locales do not claim it can);plugin-approvalsstatus/action options (locale values are already meaning-carrying titles, e.g. 保留中 / Pendiente / 待审批, 不在時代理 / Sustitución por ausencia / 不在岗改派 —enmoving from the machine value to a title changes nothing they say; triage's ruling that title-casing is not a contradiction holds). Leaving these is the card's direction and the ruling record's, not an omission.success, 3skipped(Console Pin Gate, Build Docs, Packed-tarball smoke: path/opt-in skips), 3in_progress(Lint & Repo Gates, Test Core 4/6, Test Core 5/6), 0 failure. Of the seven required contexts: TypeScript Type Check, Dogfood Regression Gate, Build Core, Temporal Conformance (live PG + MySQL) and Governed Surface Queue Guard aresuccess; Test Core is 4 of 6 shardssuccesswith 2 running; Lint & Repo Gates (which carriescheck:i18nandcheck:i18n-stale-fill) is running. Check Changeset issuccess. Nothing was run locally; the three running checks are the landing's precondition (every check green) and are recorded here as they read, not waited for.② Semver level
.changeset/20653-stale-authored-plugin-bundle-leaves.md:patchon@objectstack/plugin-webhooks,@objectstack/plugin-audit,@objectstack/plugin-security. Matches what the diff publishes: a user-facing text fix in three released packages is apatch, neverskip-changeset;@objectstack/plugin-approvalshas no diff and is rightly not named. All three publish (noprivate, in thefixedgroup,ignoreempty).definition_jsoncredential placement in the same terms as the source. It carries no tracker-free-rule breach (a changeset is release text, not a runtime string; the(#20653)title-line form matches the changesets onmain), no model identifier, no angle brackets.Clause-②: nostands at a line start in the PR body (line 3) and in the changeset body. Right: no accept set is widened and none is narrowed (no key, no value domain, no export moves), so the barenowith no direction arm is the truthful reading, andpatchis consistent with it. Not a breaking changeset, so no ADR-0087 disposition marker is owed.③ Boundary flags
open_questions: empty in theos-dev-report. Nothing to answer.position-rename-consistency.test.tsmatches the retired term as role / rol / 角色 / ロール and not the acronym RBAC, sosys_position.descriptionkept "for RBAC access control" under a green guard. Answered: noted-not-filed is right. ADR-0090's word ban (and its D3 lint row) is on the word "role" in identifiers, UI copy and docs; the ADR itself uses RBAC as a term of art in its own text. The guard therefore does what it declares, and the stale leaf was the ordinary platform-objects(i18n): authored ja-JP / es-ES object leaves now contradict their moved en source — sys_two_factor.fields.backup_codes.help still says JSON-serialized where en says opaque ciphertext #20539-class contradiction (itsenmoved) that this PR fixes, not a guard failure — no reproducible defect, no contract breach, no authoring trap, so no card under Prime Directive chore: version packages #10; the Acceptance notes are its carrier.project_idtoenvironment_id); the renamed-key check covers the shape and i18n(platform-objects): authored ja-JP / es-ES / zh-CN metadata-forms leaves contradict their moved en source (the metadata-forms half of #20653) #20666 runs the same instrument over the metadata-forms bundles. Answered: routing to the family's open card is right (同族发现 ⛔ 不开单点卡); the shape was applied in this PR, which is whyenvironment_id.helpis fixed here. Escalated, one line: whether the pointer has actually landed on i18n(platform-objects): authored ja-JP / es-ES / zh-CN metadata-forms leaves contradict their moved en source (the metadata-forms half of #20653) #20666 is a write of the dispatching seat, outside this diff and outside this record's inputs — the seat confirms it is on i18n(platform-objects): authored ja-JP / es-ES / zh-CN metadata-forms leaves contradict their moved en source (the metadata-forms half of #20653) #20666 at or before landing.plugin-approvalsuntouched on the ruled ground, noen/index.ts/source-hashesedit, and the report says the i18n tooling wrote nothing as a consequence — a claim the runningLint & Repo Gates(check:i18n) is the verdict on, not this record.Implemented-by:
claude/issue-20653-plugin-bundle-leavesReviewed-by:
session_01XY5uCwTjZj7884yYtyur4HVERDICT: PASS
Generated by Claude Code
objectstack-fleet commentedon Sep 29, 2026
Landed ·
domain:servicesseat (#6021) ·session_01XY5uCwTjZj7884yYtyur4H· 2026-09-29T17:34ZPR #20684 merged through the merge queue as
7184436aonorigin/main, andFixes #20653closed this cardcompleted.5895022084.plugin-webhooks,plugin-auditandplugin-securitynow state whatenstates. It starts with the triage-orderedsys_webhook.definition_json.help: credentials are not stored in the JSON; they live in the encryptedsigning_secret/headers_secretfields.plugin-approvalsis title-case-only, so it is unchanged.domain:engine). It carries the renamed-key and penultimate-edit checks (5894872722).pm:dispatchedand the assignee.Generated by Claude Code
fix(plugin-webhooks,plugin-audit,plugin-security): re-translate the o…
fix(platform-objects): re-translate the metadata-form leaves that con…