Skip to content

The ownership check is inert on main until TRANSLATION_BOT_LOGIN is set #68

Description

@os-zhuang

Ruled: 5989562325 · letter A · 2026-10-05T06:51Z
Maintainer-action: create the translation account (suggested objectos-translator), add it to this repository only as an outside collaborator with Write (no merge rights, no CODEOWNERS entry, no bypass), and set the repository variable TRANSLATION_BOT_LOGIN to its login — done when the Ownership & freshness job on a PR no longer prints TRANSLATION_BOT_LOGIN is not set

State

check-translation-ownership.mjs landed in #65 and runs on every PR, but it currently reports and passes without enforcing anything:

⚠ TRANSLATION_BOT_LOGIN is not set — ownership is not enforced yet.
  This PR touches 256 translation artifact(s) and 6 other file(s).

That was deliberate — the check had to land before the account existed, or it could never land at all. But a gate that cannot go red is indistinguishable from a gate that is working, and the only record of this one being switched off is the body of a merged PR. Hence this card.

Until the variable is set, both halves of the split are unenforced: a content PR can still hand-edit six locale siblings, and a translation PR can still edit English sources or site code.

Completion condition

  1. Create the dedicated translation account (suggested login objectos-translator; profile should identify it as a bot, since its PRs are visible to outside contributors).

  2. Add it to this repository only, as an outside collaborator with Write — not as an organization member and not via a team. Organization membership can inherit default repository access, and the org contains the private cloud repository. A translation account has no reason to be able to read the control-plane source, EE pricing, or unreleased roadmap.

  3. Do not give it merge rights, do not add it to CODEOWNERS, and do not add it to any branch-protection bypass list. Its PRs need a human approval like anyone else's.

  4. Set the repository variable TRANSLATION_BOT_LOGIN to that login (Settings → Secrets and variables → Actions → Variables). A variable, not a secret — the login is not sensitive and it must be readable by the workflow on fork PRs.

  5. Verify enforcement is actually on, in both directions, rather than assuming:

    • a PR from any other account touching a *.<locale>.mdx file fails;
    • a PR from the translation account touching an English .mdx fails.

    Step 5 is the point of the card. Steps 1–4 can all be done and leave the check silently passing if the login is misspelled — and a misspelled login and an unset variable produce different messages, so read the check output rather than the settings page.

Note

No credential is involved. The translation account authenticates locally (gh auth login) in whatever session runs the periodic pass; no token is stored in this repository. Setting this variable does not change that — this repository still holds no secret beyond the two Cloudflare deploy values.

Blocked-on

Nothing technical — this is a maintainer action. See also objectstack-ai/objectstack#9551 for which seat owns work in this repository.

Activity

  1. os-support-ai commented on Aug 18, 2026

    @os-support-ai
    Collaborator

    Triage: routed to the decision inbox (needs-user-decision) — every completion step is a maintainer-only action (bot account creation, collaborator grant, repository variable), and step 2 is an access-control boundary (outside collaborator vs org member, precisely to keep the private cloud repo unreadable), which sits on the human floor by rule. Nothing here is dispatchable to a dev until the variable exists; step 5's two-direction verification CAN be dispatched afterwards as a follow-up card. Four-facet note: business pull is real (the ownership gate landed in #65/#74 and is currently inert, so the translation/content split is unenforced on main today); long-term coherence and AI-error-resistance both favour doing this promptly (a gate that cannot go red is being read as protection); scope cost is one account + one variable, no standing obligation. Recommendation: execute steps 1–4 as written (login objectos-translator, outside collaborator, Write, no bypass), then file the step-5 verification as a queue card. (Triage seat, session session_01EUZUjvnLsqwHVkXkTv8TKQ.)


    Generated by Claude Code

  2. os-support-ai commented on Aug 18, 2026

    @os-support-ai
    Collaborator

    Maintainer ruling (2026-08-18, live PM chat with the triage seat, session session_01EUZUjvnLsqwHVkXkTv8TKQ; verbatim: 「其他接受你的建议」).

    Accepted: execute steps 1–4 as written — login objectos-translator, added to this repository only as an outside collaborator with Write, no merge rights / CODEOWNERS / bypass, then set the TRANSLATION_BOT_LOGIN repository variable. These are maintainer-only actions, so the card stays in the decision inbox until they are done. Once the variable is set, triage files the step-5 verification as a pm:queue card (both directions must be observed failing, reading the check output rather than the settings page).


    Generated by Claude Code

  3. removed their assignment
    on Aug 20, 2026
  4. hotlong commented on Aug 26, 2026

    @hotlong
    Contributor

    A bootstrap property worth knowing before this variable is set.

    Found while shipping #172 (zh-Hant), and recorded here rather than lost in that PR: the ownership check classifies *.zh-Hant.mdx as a translation artifact. #218's shape is 73 translation artifacts plus 10 other files, so once TRANSLATION_BOT_LOGIN is set, a PR like it would be rejected by the artifact/non-artifact split.

    That is a one-time property of adding a locale, not an ongoing one. After a derived locale is registered, the routine flow is English alone, then Simplified plus a regeneration — both landing on the account's side of the split. It is only the bootstrap commit, which necessarily carries the whole generated corpus alongside the generator and its registration, that mixes them.

    So this is not an argument against enforcing ownership. It is a note that whoever turns it on should expect locale-introduction PRs to need an exemption, and should decide in advance whether that is a label, a documented override, or a "split the bootstrap into two PRs" convention.

    Recorded now because #218 is the case that demonstrates it, and the next one will be years apart.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    Contributor

    Ruling: batch #1 item 2 · letter A · maintainer 「同意」 2026-10-05T06:50Z

    The repo:objectos seat (objectstack-ai/objectstack#9831, session session_01FeA1nwBz1ohH65dvffUGKr) presented this card in the director batch format at the maintainer's request. The maintainer answered the batch with 「同意」.

    A: execute the 2026-08-18 ruling (5328164163) as written. That means:

    • create the translation account (suggested objectos-translator);
    • add it to this repository only, as an outside collaborator with Write;
    • give it no merge rights, no CODEOWNERS entry and no bypass;
    • set the repository variable TRANSLATION_BOT_LOGIN to its login.

    The alternatives were rejected: shrinking to Simplified Chinese only (B), dropping all translations (C), and keeping the status quo (D).

    Why it is urgent, measured 2026-10-01T07:26Z: the Ownership & freshness job on PR #289 still printed ⚠ TRANSLATION_BOT_LOGIN is not set — ownership is not enforced yet. The translation backlog on main @ 7612ffe is 441 work items. Per locale, ja, de, es, fr and ko each have about 35 stale and 40 missing pages out of 79; zh-Hans has 49 stale and 17 missing.

    State: the decision is made, and what remains is a maintainer action outside GitHub. So needs-user-decision → pm:awaiting-maintainer, with the Maintainer-action: line now at the top of the body.

    After the variable is set:

    1. The seat confirms that the job output changed.
    2. It files the step-5 verification card: both directions must be observed failing.
    3. That card also settles in advance how a locale-introduction PR is exempted (the bootstrap note in 5421174590).
    4. The seat then dispatches the translation pass in per-locale batches.

    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

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions