Skip to content

skills/objectstack-i18n: the _actions row and the translation-target-unknown paragraph omit the action-entry keys os validate judges (param options, outcomeMessages, resultDialog leaves and fields) #21583

Description

@objectstack-fleet

Filed on the maintainer's instruction, given in session session_01UtnxvdiN376GF3sgXwAw4d's chat and quoted verbatim: 「1. 一处技能文档修改等您动手: skills/objectstack-i18n/SKILL.md 有一处修改没有建卡,你应该创建issue」. Until now this was a debt without a card, recorded on the domain:spec seat post #6017 under "Owed by this seat, no card". Filed by domain:spec seat 1 after stand-down. ⛔ Filed bare: routing and grading are triage's. ⛔ Not a claim.

What is wrong (read on origin/main cc645f2385)

The published skill skills/objectstack-i18n/SKILL.md teaches the translation-bundle shape that agents write. It lags what os validate / os lint / os compile now judge under an action entry. Those rules came with #21216 (PR #21258), #21264 (PR #21304) and #21261. The reference page, content/docs/protocol/kernel/i18n-standard.mdx :1039–:1058, already states every rule. The skill states only part of them.

  1. The _actions.{action_name} row (:164) lists label, description, confirmText, successMessage, params.{param_name} and a bare resultDialog. Missing:

    • params.{param}.options.{value}: a param's inline option values. A wrong key is a translation-option-key-unknown warning. A param that references a field with no inline options is not judged.
    • outcomeMessages.{outcome}: an outcome the action's own outcomeMessages declares.
    • resultDialog.title / .description / .acknowledge: valid only when the action declares a resultDialog. Under an action that declares none, they are a translation-target-unknown error (checkActionResultDialogLeaves, packages/lint/src/validate-translation-references.ts :2065).
    • resultDialog.fields.{path}: the literal path of a field in resultDialog.fields[], dots included (client.secret is one key).
    • The same sub-keys hold under globalActions.{action} (checkActionEntry, called from both loops).
  2. The globalActions line (:170) reads "(object-less actions)". It matches lint: os validate refuses a bound action's globalActions translation key as "never read", but the spec's own i18n resolver reads it as the object-scoped key's fallback #21261. It does not say that a globalActions key naming a bound action is an error, or that the message names the objects.{owner}._actions.{action} key to write instead (i18n-standard.mdx :1053).

  3. The translation-target-unknown paragraph (:198–:202) lists what a key can fail to name: "object, field, view, tab, action, param, section, validation rule, app, nav item, dashboard, widget or flow screen". It omits three cases that are now errors:

    • an outcome the action does not declare;
    • a result-dialog field path the action does not declare;
    • result-dialog copy under an action with no resultDialog.

    It also does not say that param option keys share the option warning.

Reach: an agent that authors a bundle from this skill gets no warning about any of these shapes:

  • it has no way to learn that outcomeMessages and resultDialog.fields copy is keyable;
  • it gets no warning that dialog copy under a dialog-less action fails os validate with an error;
  • it is not told that a bound action's copy under globalActions is refused.

The skill's own pointer to translation.zod.ts does not cover the lint's cross-reference rules.

Direction (for triage, not a ruling)

Dedupe

All 134 open issues and PRs were listed over REST, and the 300 most recently updated closed ones. Their titles and bodies were grepped for objectstack-i18n, i18n/SKILL, resultDialog and outcomeMessages. The hits are:

None carries this edit.

Dedupe words: objectstack-i18n skill _actions outcomeMessages resultDialog · translation-target-unknown skill paragraph · i18n SKILL.md Tier H action keys

Activity

  1. objectstack-fleet commented on Oct 3, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — documentation · priority:p2 · domain:skills · area:i18n · pm:queue. The skill states what os validate judges under an action entry

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-03T12:55Z. ⛔ Not a claim, ⛔ not a dispatch.

    Why p2. It is AI-facing published text that lags the gate (NORTH-STAR priority rule 4). An agent that authors from it never learns that some keys are keyable, and writes one shape the validator refuses with an error. Nothing is silently wrong at runtime: the gate is loud.

    Routing: skills/objectstack-i18n/SKILL.md is Tier H, so domain:skills, through its own governed PR. The card is the maintainer's own instruction (quoted on it).

    Ruling: mirror the reference page, which already states every rule (content/docs/protocol/kernel/i18n-standard.mdx, :1039–:1058).

    • The _actions row names every key the card lists: param options, outcomeMessages, the resultDialog leaves and fields.{path}. It says the same keys hold under globalActions.
    • The globalActions line says a key naming a bound action is an error, and what the message prescribes.
    • The translation-target-unknown paragraph names the three new error cases and the shared option warning.
    • ⛔ The skill does not restate the gate's internals. It names the shapes and the outcomes.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01CB6W87z22K2yjUCDyVrJRk
    Account: os-project-manager (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-21583-i18n-skill-action-entry-keys
    Worktree: objectstack-issue-21583
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: skills/objectstack-i18n/SKILL.md — the bundle-shape table's _actions row (about :164 on origin/main 1968d5e), the globalActions line (about :170) and the translation-target-unknown paragraph (about :198–202); ⛔ no other file (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: CONTRACT_REVIEW_TIER — MANDATORY per dispatch-gates --tier --repo objectstack-ai/objectstack skills/objectstack-i18n/SKILL.md, which prints "skills/objectstack-i18n/SKILL.md ⇢ 'skills/**' — clause ①"; Tier H landing (an authorized APPROVED review, then this seat lands)
    Clause-②: no
    Thread-read: 5969376283
    Serial constraints cleared: none — the open objectstack PRs (read at 2026-10-04T00:20Z, plus this seat's own PRs #21650 / #21651 / #21652) touch no skills/objectstack-i18n/** path; no in-flight claim on this file; same-day churn none (last touch d0f1845). Token ratchet at 0c50b5d: 4752 / 6338 (headroom 1586). Readings taken at 2026-10-04T00:32Z.

  3. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 21583,
      "status": "done",
      "branch": "claude/issue-21583-i18n-skill-action-entry-keys",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/21656",
      "session": "session_01CB6W87z22K2yjUCDyVrJRk",
      "premise_still_valid": true,
      "summary": "Premise verified on origin/main 759dbe9e: the three spots read exactly as the card and the dispatch quoted (:164 row, :170 line, :198-203 paragraph), and packages/lint/src/validate-translation-references.ts judges every rule i18n-standard.mdx :1039-:1058 states (checkActionEntry from both the _actions and globalActions loops; param options as the warning rule with the field-backed skip; outcomes, dialog leaves and field paths as the error; a bound action under globalActions as an orphan whose hint names objects.{owner}._actions.{action}) — page and gate agree, so the page was not touched. Edited skills/objectstack-i18n/SKILL.md in three places, mirroring the page with no second vocabulary: the _actions.{action_name} row now names params.{param_name}.options.{value}, outcomeMessages.{outcome}, resultDialog.title/.description/.acknowledge (only under an action that declares a resultDialog) and resultDialog.fields.{path} (literal, dots included) and says the same keys hold under globalActions.{action_name}; the globalActions line says a key naming a bound action is an error whose message names the objects.{owner}._actions.{action_name} key; the translation-target-unknown paragraph names the three action-entry error shapes and the shared option warning (field-backed param with no inline options not judged). Draft PR opened via the fleet-write relay, left draft (Tier H, skills/**).",
      "tests": "line_budget: file 496 → 503 (net +7 of at most +8); package skills/**/SKILL.md 4397 → 4404; token ratchet 4752 → 5032 / ceiling 6338 (headroom 1586 → 1306), ceiling untouched. gates (tree afecd20b, every exit captured before any pipe): node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 24 commands = the dispatch's 24; --ran reconciliation 'Run reconciliation — 24 derived, 24 run, 0 NOT-MEASURED, 0 UNRUN' with all 24 exit codes recorded. All exit 0: check-ci-filter-parity; check-closing-keyword-parity + --self-test (40 assertions); check-comment-mask-corpus (8122 files, 0 disagree); check-doc-route-spelling --advisory ('population clean') + --self-test; check-skills-token-ratchet ('54 authored bundle file(s) within their ceilings') + --self-test (65 cases); pnpm check:agent-test-spelling (0 violations), check:corpus-claim-drift (251 files, 53 under skills), check:cross-package-test-inputs, check:doc-authoring ('53 published skill files clean — no internal issue-id references'), check:driver-memory-census, check:gitlink-declared, check:nul-bytes ('10027 text file(s) … no raw ASCII control bytes'), check:pm-governed-merges, check:refd-timer-probe, check:role-word, check:skill-compatibility ('10 SKILL.md file(s) reconciled'), check:skill-frame-sync, check:skill-identifier-liveness ('Leg 1: 457 citation(s) over 53 published file(s) … Leg 2: 8 registered exhaustive section(s), 0 ledgered gap(s)'), check:watch-hint-literal; pnpm --filter @objectstack/spec run check:skill-docs ('Skill docs in sync') and check:skill-refs ('9 generated files in sync', added per AGENTS.md for a SKILL.md body edit; both read frontmatter/src via tsx, no build needed); pnpm --filter @objectstack/lint run check:doc-formula-expressions ('22 record-scoped formula example(s) across 460 files / 1381 TS blocks judged clean') after turbo run build --filter=@objectstack/lint under os-verify-lock.sh (OS_VERIFY_LOCK_SLOT=issue-21583; 4 tasks all cache hits; VERDICT command-exit 0; no tracked file changed). Not measured locally, declared to CI: whole-tree families, type-check lanes, Test Core shards (no TypeScript or package touched). Byte hygiene: grep -naP for control bytes on the file = none; no tracker-shaped ids; no 'role'; no new code fence. ablation: none — a prose-only change, no behaviour to ablate.",
      "mcp_calls": "0 — no MCP GitHub tool used; issue and comments read with gh api (REST read), writes through scripts/pm/ only",
      "api_writes": "3 REST writes, all as objectstack-fleet[bot] through scripts/pm/ over the fleet-write relay (no bare curl/gh write, no MCP): ① POST /repos/objectstack-ai/objectstack/pulls (pr_create, draft forced; relay run 37166938480); ② one label-write dispatch = POST /repos/objectstack-ai/objectstack/issues/21656/labels (skip-changeset) + POST /repos/objectstack-ai/objectstack/issues/21656/assignees (os-project-manager); relay run 37167004297, read-back matched; ③ POST /repos/objectstack-ai/objectstack/issues/21583/comments (this os-dev-report, via post-stamped). Plus 2 git push (empty-branch probe, then afecd20b) — not REST. One REFUSED attempt landed nothing (see deviations).",
      "gates": "24/24 derived families green at afecd20b (+ check:skill-refs green); CI not awaited",
      "line_budget": "skills/objectstack-i18n/SKILL.md +7 net (at most +8); package 4397 → 4404; tokens 5032/6338",
      "files_changed": [
        "skills/objectstack-i18n/SKILL.md"
      ],
      "deviations": "① The first pr_create dispatch was refused by the fleet write-pace budget (scripts/pm/write-pace.mjs: 40 of 40 writes in the trailing hour, exit 10, 'REFUSED until 2026-10-04T01:05Z'); not a classifier refusal and no route change — waited in the foreground inside this round (polling the local ledger, no write retried until the ledger said a slot was free), then sent once more on the same route at 01:05Z, success. ② Labels `documentation` and `size/s` on PR 21656 were set by another actor (the labeler), not by me; left untouched. ③ `pnpm --filter @objectstack/spec run check:skill-refs` run in addition to the 24 derived families (AGENTS.md ties it to any SKILL.md body edit); green. ④ No build was needed for check:skill-docs / check:skill-refs (both read frontmatter and packages/spec/src through tsx), so the dispatch's 'build spec first' step was replaced by a turbo build under the verify lock that turned out to be an all-cache-hit no-op; check:doc-formula-expressions did need the lint/formula dists and got them from that build.",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed · the skill states only the consequence of a field-backed action param with no inline options ('is not judged'); the page also gives the reason ('takes the field's list when the dialog renders') — left out to stay inside the +8 line budget; in the PR's Acceptance notes."
      ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — PR #21656 (head afecd20b) · skills seat 1, session_01CB6W87z22K2yjUCDyVrJRk · 2026-10-04T01:16Z

    Reviewed against GitHub, not the report (references/review-checklist.md):

    • PR form: draft, base main, first line Fixes #21583, Clause-②: no at line start; no closing keyword beside another card number; one session-URL footer. Files: skills/objectstack-i18n/SKILL.md +14/−7, the claimed surface and nothing else (the reference page untouched, as instructed).
    • Text vs the reference page (this seat's own read of i18n-standard.mdx :1039–1058): the _actions row names param options (the warning), outcomeMessages.{outcome}, the three resultDialog leaves only under an action that declares a dialog, resultDialog.fields.{path} with dots included, and the same keys under globalActions; the globalActions line states the bound-action error and the key its message prescribes; the paragraph names the three error shapes and the shared option warning. No second vocabulary.
    • Readings off the head blob (this seat's own): 496 → 503 lines (+7, budget ≤ +8); 4752 → 5032 tokens (ceiling 6338); catalog SKILL.md sum 4397 → 4404. No ceiling moved.
    • Scope and changeset: skill text only; skip-changeset applies; documentation / size/s are the labeler's. Report comment 5975258458 present and parses; mcp_calls 0; api_writes 3 as listed; the one deviation is a write-pace wait (exit 10, resent after the window reopened), not a route change.
    • Value density (customer-agent seat): the row grows by the keys an author can actually write and the outcomes os validate returns; nothing restates the gate. Accepted.
    • Contract review record (skills/**, governed rule text): PASS on afecd20b, posted on the PR.
    • CI at this write: Governed Surface Queue Guard success; Lint & Repo Gates, Type Check · workspace, Test Core 1/6, 2/6 in progress — read again before the four-piece and at landing.

    Landing: Tier H (skills/**). The PR stays draft. Once the required jobs are green: needs-user-decision on the PR, the final 维护者速读, review requested of os-zhuang / hotlong. After an authorized APPROVED review this seat clears the label and lands through the relay (pr_ready + automerge_enable).

  5. objectstack-fleet commented on Oct 4, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed — skills seat 1, session_01CB6W87z22K2yjUCDyVrJRk · 2026-10-04T02:13Z

    PR #21656 MERGED through the queue at 2026-10-04T02:01Z as 506fb6da (one parent: squash), approved, readied, auto-merged and enqueued by os-zhuang himself (2026-10-04T01:35Z to 2026-10-04T01:36Z), so the seat's landing stroke was not needed; in-seat contract review PASS 5975318963 and ACCEPT 5975322135 on afecd20b are the record. Confirmed on origin/main by content: skills/objectstack-i18n/SKILL.md carries outcomeMessages.{outcome} (1 hit) and the globalActions error sentence naming objects.{owner}._actions.{action_name}. Fixes #21583 closed this card completed; pm:dispatched and the assignee are stripped in this stroke (the PR's needs-user-decision was stripped at 2026-10-04T01:44Z). The lane's open set matches expectation (no other card closed by a keyword).

  6. added a commit that references this issue on Oct 7, 2026
    506fb6d
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:i18nThe customer's own language, across UI, metadata and notificationsdocumentationImprovements or additions to documentationdomain:skillspriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions