Skip to content

[Decision] An English docs correction leaves its locale siblings asserting the corrected-away claim — #59 says delete them, the seat post says leave them, and #68 blocks the pass that would fix them #256

Description

@os-bill

Ruled: 5989567068 · letter A · 2026-10-05T06:52Z

Filed by the repo:objectos seat, session_01ChPQM8jamxLUfUAxwFpJ8S, round 1, from a concrete instance created by this lane, today. Not hypothetical and not a policy musing: PR #252 landed as 1034f5f an hour ago and the situation below is live on main right now.

The instance

#250 was filed because configure/data-sources.mdx told readers a shipped capability was a roadmap item. Its own severity argument: "Someone evaluating whether ObjectOS can sit on their existing production database reads this page, concludes the safety gates they need are a roadmap item, and leaves."

PR #252 fixed that — in English. Measured on origin/main after the merge:

File Still carries the retired forecast?
data-sources.mdx (en) no — clean, 0 hits
data-sources.ja.mdx:165 yes — 「計画されている、まだ出荷されていないもの」
data-sources.ko.mdx:165 yes — 「계획되어 있지만 아직 출시되지 않은」
data-sources.fr.mdx:250 yes — "(statut : Proposed). Prévu, pas encore livré"
data-sources.zh-Hans.mdx:198 yes — 「计划中、尚未发布的内容」
data-sources.zh-Hant.mdx:199 yes — 「計劃中、尚未釋出的內容」
data-sources.de.mdx:238 yes — ## Roadmap: In-Product External Datasource Federation
data-sources.es.mdx:238 yes — same section, ADR-0015 link intact

So the exact harm the card was filed over is fixed in one language and live in seven. No gate fires: check-translations.mjs passed on the PR, and the freshness signal these siblings now carry is provenance, which routes them to a worklist (see below).

This is not a one-off. Every English correction this lane lands creates it. #254 — already queued, the twin defect on extend-existing-systems.mdx — will create it again on that page's siblings the moment it lands.

Why the seat cannot settle this: two recorded positions point opposite ways

#59 (closed, adjudicated) says delete:

Fumadocs falls back to English when a translation is missing, so ⇒ Delete the stale translations of any rewritten page rather than leaving them. A stale translation renders wrong content; a missing one renders correct English. ⛔ Do not leave a translated page asserting the retired story.

The repo:objectos seat post (standing note) says leave:

Locale siblings go stale by design — seven quickstart.*.mdx still carry the 3002 banner, correctly.

Both have a real argument. #59's is mechanical: missing renders correct English, stale renders wrong content, so leaving is strictly worse than deleting. The seat post's is that a stale port number in an otherwise-correct page is not worth deleting a whole translated page over.

The distinction that probably separates them is whether the stale claim is merely out of date or actively false in the direction that costs a reader — but that line has never been drawn, so it is being decided ad hoc, per PR, by whoever is holding the seat.

And the escape hatch is closed. PR #252's body says the siblings "the next translation pass fixes". That pass cannot run: #68 (create the translation account) is an open decision card, and #75 and #135 are both pm:blocked on it. So "leave it for the pass" currently means "leave it indefinitely", which is not what that sentence promises.

四维分析

维度 读数
长远合理性(权重 ≥50%) 指向「按判据删」。 #59 的论证是机械的、与具体页面无关的:缺失 → 回退到正确英文;过期 → 渲染错误内容。留着永远严格更差。而现状最坏的不是任一选项,是没有规则 —— 同一个问题每次由当班席位临时决定,#59 与座位贴各被引用一半,这正是本卡要终结的漂移。
实际业务需求 指向「删」,而且这次有量。 受影响的是评估期读者 —— #250 自己论证的正是这类读者「读完就走」。七种语言里,日/韩/法/简/繁五种明确写着「尚未发布」。这不是陈旧,是反向错误。
防 AI 写代码犯错 指向「删」并写成机械判据。 现在没有任何门禁能区分「过期但无害」与「过期且反向错误」,靠的是 dev 和 PM 每次的判断力 —— 而本轮的 dev 在 PR 正文里写下了「下一次翻译 pass 会修」这句今天为假的话,不是失职,是它信了座位贴那条note。声明即强制:没有机制兑现的承诺不该写进 PR 正文。
创业阶段不扩散 偏向最小动作。 删除 = 少 7 个文件、读者拿到正确英文、零新机制。反过来「先建翻译账号再补翻译」是把一个内容删除挂在一条未决的基础设施决定(#68)后面。⚠️ 但删除是发布内容的删除,不可逆(重译需要 #68 那个不存在的账号),所以本席不自裁。

四棱基本同向(删),但落在人工地板上:发布内容的破坏性删除 + 两条在案记录直接冲突。 按规则恒交维护者。⛔ 本席不代裁 —— 执行席无代裁通道,且这不是「恢复不变量」那类自带答案的修复。

Options

动作 代价
A(推荐) 定一条判据:英文修正移除或反转一条能力断言时,同 PR 删除其 locale 兄弟;纯措辞/数字漂移(如 3002 端口)照旧留给 pass。立即适用于本次 7 个文件与 #254 需要写清判据;删除不可逆
B 一律删除任何被改写页面的 locale 兄弟(#59 字面) 简单机械,但会因一个端口号删掉整页翻译
C 一律留着,等 #68 解锁翻译 pass 诚实但今天等于「无限期留着错的」;需要同时撤掉 PR 正文里那句承诺
D 先解 #68,再回来定这条 把内容正确性挂在基础设施决定后面

推荐 A,判据落在「断言被移除或反转」而不是「文件被改动」——它正好把 #59 的案例(退役故事)和座位贴的案例(端口号)分到两边,两条在案记录都不必被推翻。

若你选 A 或 B,本席立即派发本次 7 个文件的删除,并把判据写进座位贴的常设条款,#254 落地时同步适用。 若选 C,本席会去修正 PR #252 正文里那句今天为假的承诺。

Re-check

git -C objectos fetch origin main
for f in $(git ls-tree -r --name-only origin/main content/docs/configure | grep -E 'data-sources\..*\.mdx$'); do
  echo "--- $f"; git show origin/main:$f | grep -niE 'ADR-0015|Proposed|Roadmap' | head -2
done
git -C objectos show origin/main:content/docs/configure/data-sources.mdx | grep -c 'not yet shipped'

Related: #59 (the delete ruling) · #68 (blocks the translation pass) · #75 · #135 (both blocked on #68) · #250 / PR #252 (the instance) · #254 (will repeat it).

Activity

  1. os-bill commented on Sep 2, 2026

    @os-bill
    CollaboratorAuthor

    Correction to my own framing above — it overstated the mechanism, and the difference matters for the decision.

    I wrote that "Every English correction this lane lands creates it." That is wrong. Measured on 8e665c7, the commit immediately before PR #252 landed:

    File at 8e665c7 (pre-fix) Carried the stale forecast?
    data-sources.mdx (en) yes — 2 hits
    data-sources.ja.mdx yes — already

    So the seven siblings were already wrong before my fix. A translation is derived from its English source, so when the English page carries a false claim, its siblings carry the same false claim from birth. PR #252 did not create eight bad pages — it fixed one of eight copies of a defect that was already there, and made the other seven visible by leaving them provenance-stale.

    What changes, and what does not:

    The four-quadrant reading above holds on its own terms — the long-term axis was about having a criterion at all, not about attributing blame — but the business-need axis should be read one notch cooler than I first wrote it.

    Recording this rather than quietly editing the body: the original claim is what a reader would have decided against, and I would rather be visibly corrected than silently accurate. The root error is the same one this lane keeps paying for — I inferred the causal direction from the after-state instead of reading the before-state, which is one git show at the parent commit.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    Contributor

    Ruling: batch #1 item 4 · 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, the criterion: an English correction that removes or reverses a capability assertion deletes that page's locale siblings in the same PR. Wording drift and number drift (a port number, a timing) stay with the translation pass, as AGENTS.md step 2 says. This narrows step 2 and extends step 3's own reasoning ("a translation of a page that was rewritten to assert something different is worse than none"). It overturns neither, and it matches docs/TRANSLATION.md rule 3 and #59's ruling. Option B (always delete), C (always leave) and D (wait for #68) are rejected.

    Measured on main @ 7612ffe: 14 locale files still tell readers that external datasource federation is planned and unshipped.

    • content/docs/configure/data-sources.{de,es,fr,ja,ko,zh-Hans,zh-Hant}.mdx
    • content/docs/extend-existing-systems.{de,es,fr,ja,ko,zh-Hans,zh-Hant}.mdx

    The English sources of both pages no longer say this (#250 / PR #252, #254).

    Execution:

    1. A content PR deletes those 14 files. It carries a contract-review record and lands through the seat.
    2. A separate governed PR adds the criterion to AGENTS.md step 3 (Tier H). It waits for maintainer approval, with a 维护者速读.

    PR #252's sentence that "the next translation pass fixes" the siblings is superseded by this ruling.

    needs-user-decision → pm:queue.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop, repo:objectos seat, R3
    Session: session_01FeA1nwBz1ohH65dvffUGKr
    Account: hotlong (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/pm-dispatch-objectos-ju9td1. This is the session's one designated push branch. Its remote head 1430ec1203b6cf1a6e6519673120143b417913d3 is PR #289, already squash-merged as 7612ffe, so the branch is restarted from origin/main.
    Worktree: objectos-issue-256
    Domain: n/a (single-lane repo)
    Seat: repo:objectos (objectstack-ai/objectstack#9831)
    File surface: deletion of exactly 14 files, content/docs/configure/data-sources.{de,es,fr,ja,ko,zh-Hans,zh-Hant}.mdx and content/docs/extend-existing-systems.{de,es,fr,ja,ko,zh-Hans,zh-Hant}.mdx. Nothing else (stop on breach; explain in the report).
    Container & model: S, mechanical. mode:subagent, model: default. dispatch-gates.mjs --repo objectstack-ai/objectos --tier on these paths (objectstack 088428fb) answers "no path-derived mandate". The deletion is mechanical, but the dev must confirm the claim reversal on each file and check the build's fallback, so this runs at default rather than floor.
    Clause-②: no
    Thread-read: 5989567068
    Serial constraints cleared: no open PR touches these files; the five open PRs are dependabot bumps. Nothing else is dispatched. #171 and #167 are queued behind this card on the same branch, as a transport limit.

    Scope is this ruling's part 1 only: ruling 5989567068, item 4, letter A. Part 2, the governed AGENTS.md step-3 amendment, is a separate later dispatch.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    Contributor

    os-dev-report
    {
    "issue": 256,
    "status": "done",
    "branch": "claude/pm-dispatch-objectos-ju9td1",
    "pr": "#290",
    "session": "session_01FeA1nwBz1ohH65dvffUGKr",
    "premise_still_valid": true,
    "final_commit": "f6dd7a0d853eade0480b8116a3d1b5f2bb1d9abb",
    "summary": "Part 1 of ruling 5989567068 (letter A): draft PR #290 deletes exactly the 14 named locale siblings and changes nothing else. First line: Part of #256. All four Zone-2 assumptions held when measured. CI on f6dd7a0: build, Ownership & freshness and Node floor all success; Deploy docs skipped.",
    "gates": {
    "measured_on": "f6dd7a0 (git status empty; worktree base 7612ffe)",
    "local": [
    {
    "gate": "pnpm turbo run build --force --concurrency=2 (os-verify-lock)",
    "exit": 0,
    "verdict": "VERDICT command-exit 0; Tasks: 1 successful, 1 total; Cached: 0 cached, 1 total"
    },
    {
    "gate": "pnpm turbo run test --force --concurrency=2 (os-verify-lock)",
    "exit": 0,
    "verdict": "VERDICT command-exit 0; Tasks: 1 successful, 1 total (@objectos/ci-scripts:test); Cached: 0 cached, 1 total"
    },
    {
    "gate": "pnpm turbo run type-check --continue --force --concurrency=2 (os-verify-lock; not on the dispatch list, CI runs it)",
    "exit": 0,
    "verdict": "VERDICT command-exit 0; Tasks: 1 successful, 1 total; ✓ Types generated successfully"
    },
    {
    "gate": "node .github/scripts/check-locale-surface.mjs",
    "exit": 0,
    "verdict": "Oracle 383 docs entries; sitemap.xml 395/395, unexpected 0, missing 0, duplicated 0; ✓ every advertised URL has a source file and every source file is advertised; …"
    },
    {
    "gate": "node .github/scripts/check-translations.mjs",
    "exit": 0,
    "verdict": "✓ translations gate passed; translations 318 at 7612ffe, 304 at f6dd7a0; per translated locale stale -2, missing +2 (reported, not blocking)"
    },
    {
    "gate": "node apps/docs/scripts/gen-zh-hant.mjs --check",
    "exit": 0,
    "verdict": "✓ zh-Hant: 71 generated file(s) match the zh-Hans sources byte for byte. (73 at 7612ffe)"
    },
    {
    "gate": "node .github/scripts/check-translation-ownership.mjs --actor "objectstack-fleet[bot]" --files changed.txt (git diff --name-only 7612ffe...HEAD, 14 paths)",
    "exit": 0,
    "verdict": "⚠ TRANSLATION_BOT_LOGIN is not set — ownership is not enforced yet. This PR touches 14 translation artifact(s) and 0 other file(s)."
    },
    {
    "gate": "node .github/scripts/check-translation-output.mjs --self-test",
    "exit": 0,
    "verdict": "✓ self-test: 29 rule case(s), 9 split case(s) and 5 derived-locale case(s) …"
    },
    {
    "gate": "node .github/scripts/check-translation-output.mjs --files changed-output.txt",
    "exit": 0,
    "verdict": "blocking on 14 changed translation(s); ✓ translation output gate passed (127 pre-existing finding(s) reported)"
    }
    ],
    "ci_on_f6dd7a0": {
    "build": "success (steps: Generated zh-Hant is current, type-check, build, Locale surface, test, Worker package + size budget, preview smoke-check all success; Upload the Worker bundle skipped)",
    "Ownership & freshness": "success (Ownership, Freshness, Output validator self-test, Output all success)",
    "Node floor": "success",
    "Deploy docs": "skipped"
    }
    },
    "measurements": {
    "stale_line_per_file": {
    "note": "Quoted from 7612ffe. Line breaks shown as spaces; the ADR-0015 URL shortened to (…). pattern_hits = lines matching ADR-0015, Proposed or Propuesto (seat said 1-3; measured 1-2).",
    "files": [
    {
    "file": "content/docs/configure/data-sources.de.mdx",
    "lines": "245-246",
    "quote": "in aktiver Konzeption (Status: Proposed). Geplant, noch nicht ausgeliefert:",
    "pattern_hits": 2
    },
    {
    "file": "content/docs/configure/data-sources.es.mdx",
    "lines": "239",
    "quote": "(estado: Propuesto). Previsto, pero aún no disponible:",
    "pattern_hits": 2
    },
    {
    "file": "content/docs/configure/data-sources.fr.mdx",
    "lines": "250",
    "quote": "(statut : Proposed). Prévu, pas encore livré :",
    "pattern_hits": 2
    },
    {
    "file": "content/docs/configure/data-sources.ja.mdx",
    "lines": "165",
    "quote": "(ステータス: Proposed)の下で活発に設計中です。計画されている、まだ出荷されていないもの:",
    "pattern_hits": 1
    },
    {
    "file": "content/docs/configure/data-sources.ko.mdx",
    "lines": "165",
    "quote": "(상태: Proposed) 아래에서 활발히 설계되고 있습니다. 계획되어 있지만 아직 출시되지 않은 것들:",
    "pattern_hits": 1
    },
    {
    "file": "content/docs/configure/data-sources.zh-Hans.mdx",
    "lines": "198",
    "quote": "下积极设计中(状态:Proposed)。计划中、尚未发布的内容:",
    "pattern_hits": 2
    },
    {
    "file": "content/docs/configure/data-sources.zh-Hant.mdx",
    "lines": "199",
    "quote": "下積極設計中(狀態:Proposed)。計劃中、尚未釋出的內容:",
    "pattern_hits": 2
    },
    {
    "file": "content/docs/extend-existing-systems.de.mdx",
    "lines": "98-100",
    "quote": "eingebaute Sicherheits-Gates — ist in aktiver Konzeption unter ADR-0015 (Status: Proposed). Bis es soweit ist, ist der dokumentierte Weg —",
    "pattern_hits": 2
    },
    {
    "file": "content/docs/extend-existing-systems.es.mdx",
    "lines": "97-99",
    "quote": "propiedad externa, y barreras de seguridad integradas — está en diseño activo bajo ADR-0015 (estado: Propuesto). Hasta que llegue, el camino documentado —",
    "pattern_hits": 2
    },
    {
    "file": "content/docs/extend-existing-systems.fr.mdx",
    "lines": "98-100",
    "quote": "garde-fous de sécurité intégrés — est en cours de conception active sous ADR-0015 (statut : Proposed). En attendant son arrivée, le parcours documenté —",
    "pattern_hits": 2
    },
    {
    "file": "content/docs/extend-existing-systems.ja.mdx",
    "lines": "91-92",
    "quote": "は ADR-0015 (ステータス: Proposed)のもとで活発に設計が進められています。それが",
    "pattern_hits": 2
    },
    {
    "file": "content/docs/extend-existing-systems.ko.mdx",
    "lines": "89-90",
    "quote": "ADR-0015 아래에서 활발히 설계 중입니다(상태: Proposed). 그것이 도착하기 전까지,",
    "pattern_hits": 2
    },
    {
    "file": "content/docs/extend-existing-systems.zh-Hans.mdx",
    "lines": "84-85",
    "quote": "ADR-0015 下积极设计中(状态:Proposed)。在它落地之前,这条已记录的",
    "pattern_hits": 2
    },
    {
    "file": "content/docs/extend-existing-systems.zh-Hant.mdx",
    "lines": "85-86",
    "quote": "ADR-0015 下積極設計中(狀態:Proposed)。在它落地之前,這條已記錄的",
    "pattern_hits": 2
    }
    ]
    },
    "english_grep": {
    "command": "grep -ciE 'not yet shipped|Proposed|Roadmap|planned|in active design'",
    "content/docs/configure/data-sources.mdx": "0 hits; line 243 reads "(status: Accepted), ships today: bind objects to tables ObjectOS does" (PR #252, 1034f5f): assertion REVERSED",
    "content/docs/extend-existing-systems.mdx": "0 hits; the "Where this is headed" section was deleted by ea9405b = PR #257, the English correction for finding #254: assertion REMOVED"
    },
    "fallback_route": {
    "built_file": "apps/docs/.next/server/app/ja/docs/configure/data-sources.html exists after deletion (also ko, zh-Hans, zh-Hant; ja/ko/zh-Hant extend-existing-systems)",
    "served_by_next_start": [
    "/ja/docs/configure/data-sources: 200, html lang="ja", title "Data Sources | ObjectOS", "ships today" 2 hits, まだ出荷されていない 0, Proposed 0, canonical https://docs.objectos.ai/docs/configure/data-sources",
    "/zh-Hant/docs/configure/data-sources: 200, html lang="zh-Hant", English body ("ships today" 2), 尚未釋出 0, Proposed 0, canonical = English URL",
    "/ko/docs/extend-existing-systems: 200, html lang="ko", title "Extend Existing Systems | ObjectOS", Proposed 0, canonical https://docs.objectos.ai/docs/extend-existing-systems",
    "control /ja/docs/quickstart (still translated): 200, html lang="ja", title "クイックスタート | ObjectOS", canonical https://docs.objectos.ai/ja/docs/quickstart"
    ],
    "sitemap": "built sitemap.xml lists configure/data-sources and extend-existing-systems only under en + x-default, with no locale alternates. Control: /ja/docs/quickstart is listed with hreflang="ja".",
    "conclusion": "Locale routes still render, in the locale page shell, with the current English body. SEO treats them as English: canonical and hreflang point at the English URL."
    },
    "generator": {
    "reading": "gen-zh-hant.mjs plan() claims a zh-Hant target only for an existing *.zh-Hans.mdx, and strays() flags any *.zh-Hant.mdx nothing claims. With both files of a pair deleted, --check expects neither. The generator was not edited.",
    "before": "7612ffe: exit 0, 73 generated file(s)",
    "after": "f6dd7a0: exit 0, 71 generated file(s)",
    "control_leg": "Restored only content/docs/configure/data-sources.zh-Hant.mdx (10298 bytes, carries the @generated marker) with its zh-Hans source still deleted: exit 1, "no zh-Hans source, so nothing generates it: content/docs/configure/data-sources.zh-Hant.mdx". Then removed it: git diff HEAD 0 lines, porcelain 0 lines, --check exit 0 with 71 files. One-off, not kept."
    },
    "ownership_gate_when_enforced": "TRANSLATION_BOT_LOGIN=placeholder-translator, actor objectstack-fleet[bot], this diff: exit 1, "This PR edits 14 translation artifact(s)". English-only control diff under the same setting: exit 0. Inert today: PR #218 by hotlong touched zh-Hant artifacts and passed Ownership & freshness, #68 is open, and this PR passed it."
    },
    "files_changed": [
    "D content/docs/configure/data-sources.de.mdx",
    "D content/docs/configure/data-sources.es.mdx",
    "D content/docs/configure/data-sources.fr.mdx",
    "D content/docs/configure/data-sources.ja.mdx",
    "D content/docs/configure/data-sources.ko.mdx",
    "D content/docs/configure/data-sources.zh-Hans.mdx",
    "D content/docs/configure/data-sources.zh-Hant.mdx",
    "D content/docs/extend-existing-systems.de.mdx",
    "D content/docs/extend-existing-systems.es.mdx",
    "D content/docs/extend-existing-systems.fr.mdx",
    "D content/docs/extend-existing-systems.ja.mdx",
    "D content/docs/extend-existing-systems.ko.mdx",
    "D content/docs/extend-existing-systems.zh-Hans.mdx",
    "D content/docs/extend-existing-systems.zh-Hant.mdx"
    ],
    "deviations": [
    "Commit trailers are the model-free pair (Co-Authored-By: Claude noreply@anthropic.com + Claude-Session URL), and the PR footer is the session-URL form. The dev contract requires both and takes precedence over the harness attribution reminder, which asked for a model-named trailer and a different PR footer.",
    "Two git pushes to the one permitted branch: the force-with-lease empty route probe 1430ec1 to 7612ffe, then a plain push 7612ffe to f6dd7a0. Both were sanctioned by the dispatch.",
    "Gates beyond the dispatch list: pnpm turbo run type-check (CI runs it), and a served-route check with next start on port 4567. The setsid wrapper PID (6057) exited at once and the real server was PID 6059. I found it by port 4567 and its worktree cwd and killed only that PID. Its 3 child processes (esbuild x2, workerd) are gone and the port is free. Nothing was killed by name.",
    "Turbo build/test also ran with --concurrency=2, per the dev contract resource rule.",
    "Dispatch pairing correction: #254 is the finding issue. The English correction for extend-existing-systems landed as PR #257 (ea9405b).",
    "I waited for CI in the foreground because the dispatch asked for each job conclusion on the final push. A one-shot bounded poll loop, no background watcher.",
    "Report shape: the dispatch asked for machine-checkable fields only. The dev contract template also carries session/summary/tests. I kept session and a short summary, and folded tests into gates.",
    "The worktree /home/user/objectos-issue-256 was removed after the PR opened, without --force. The local branch issue-256-siblings remains in the shared repo."
    ],
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: part 2 of #256 (the governed AGENTS.md PR) · AGENTS.md:69 says "Coverage tracks Simplified exactly (62 of 79 pages today). The 17 without …"; after PR #290 it is 60 of 79 and 19 without (git ls-files zh-Hans count 62 at 7612ffe, 60 at f6dd7a0) · in PR #290 Acceptance notes, not filed",
    "carrier: #68 (turns the gate on) and part 2 of #256 (writes the criterion into step 3) · check-translation-ownership.mjs counts deleted locale paths as hand-edited artifacts. Enforced, this diff exits 1 and an English-only control exits 0. So once TRANSLATION_BOT_LOGIN is set, every PR under the ruled criterion or AGENTS.md step 3 retire/rename rule is rejected, while the gate own failure text recommends that very deletion · dormant (variable unset, #68 open) · in PR #290 Acceptance notes, not filed · dedupe words: ownership gate deleted siblings, TRANSLATION_BOT_LOGIN retire rename, check-translation-ownership deletion, locale sibling deletion rejected",
    "carrier: none (承接者:无) · fallback pages serve the English body under html lang=LOCALE. Pre-existing for every untranslated page, and the Fumadocs fallback design · Acceptance notes only"
    ],
    "api_writes": "4 strokes (budget 4). 1) git push x2 to claude/pm-dispatch-objectos-ju9td1 (git, not REST). 2) pr_create: POST /repos/objectstack-ai/objectstack/dispatches (204), executed by relay run 37276429004 as POST /repos/objectstack-ai/objectos/pulls, which opened draft #290 (read-back identical, 8570 bytes). 3) label-write --assign hotlong: POST /repos/objectstack-ai/objectstack/dispatches (204), executed by relay run 37276492878 as POST /repos//issues/290/assignees (read-back MATCHES, 0 labels written). 4) This report: post-stamped comment on #256. Plus one --dry-run of pr_create, which sent nothing. All other API calls were GET reads.",
    "mcp_calls": "0"
    }


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    Contributor

    ACCEPT: PR #290 (part 1 of ruling 5989567068) · 2026-10-05T07:18Z. Driving it to landing.

    Checklist, read from GitHub:

    • PR shape. Draft, base main @ 7612ffe, first line Part of #256. No closing keyword appears in the body or in the one commit f6dd7a0.
    • Files. 14 files, all removed, +0/−2306. The file set equals exactly the 14 the ruling names.
    • Checks on head f6dd7a0d853eade0480b8116a3d1b5f2bb1d9abb: build, Ownership & freshness and Node floor success. Deploy docs skipped, which is correct on a PR event.

    Docs-prose check, sentence by sentence. Per #21192, docs prose is checked in the seat's ACCEPT, not in an isolated review.

    Measured behaviour accepted:

    • Fallback. /ja/docs/configure/data-sources serves 200 with the current English body ("ships today" ×2, 0 Proposed), and its canonical points at the English URL. The sitemap lists both pages only under en and x-default.
    • Generator. gen-zh-hant.mjs --check passes with 71 files, down from 73. The control leg confirms that a zh-Hant file without its zh-Hans source fails. This shows deleting both files of a pair is what the generator expects.

    Out-of-scope findings:

    1. AGENTS.md:69 says "62 of 79" zh-Hans pages, which becomes 60 after this merge. Taken up by part 2, the governed AGENTS.md PR, which already edits that file.
    2. Taken, and acted on separately. check-translation-ownership.mjs counts a deleted locale file as a hand-edited translation artifact. With the variable set (measured with a placeholder login), this very diff exits 1, while an English-only control exits 0. Once The ownership check is inert on main until TRANSLATION_BOT_LOGIN is set #68 sets TRANSLATION_BOT_LOGIN, every PR that follows this ruling, or AGENTS.md step 3's own retire/rename rule, would be rejected. The gate would contradict the governing text. Dormant today, but The ownership check is inert on main until TRANSLATION_BOT_LOGIN is set #68 was just ruled to proceed, so it is no longer theoretical. The seat files it as a gate defect before the variable is set.
    3. Fallback pages render the English body under the locale's lang. This is the existing Fumadocs fallback behaviour; Acceptance notes only.

    Deviations accepted: the route-probe push, type-check run beyond the dispatch list, a served-route check killed by PID, and the worktree removed after the PR opened.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    Contributor

    Part 1 landed and published. Part 2 remains: pm:dispatched → pm:queue · 2026-10-05T07:32Z

    Release: session session_01FeA1nwBz1ohH65dvffUGKr, because part 1 of the ruling is delivered. The remaining governed part goes back to the queue for its own dispatch. Assignee cleared.

    • PR docs: delete the 14 locale siblings that still forecast federation as unshipped #290, squash 9c11af4 (one parent). It deleted the 14 locale siblings. On main, 0 locale files of configure/data-sources or extend-existing-systems remain.
    • CI run 37277187948: build and Node floor success. The deploy job reads ✓ deploy: 21550f9a-989e-4c77-844b-477733d06a57 is serving, replacing 2ae77863-0ad8-46b6-9aea-339f0ba702b0, the live smoke check succeeded, and roll-back was skipped.
    • No open card disappeared from the board.

    What remains on this card, ruling 5989567068 part 2: a governed PR that writes the criterion into AGENTS.md step 3. It is Tier H and waits for maintainer approval with a 维护者速读. It also corrects the zh-Hans coverage figure at AGENTS.md:69 ("62 of 79", now 60). It is dispatched last on this lane's single push branch, because a PR awaiting approval would hold that branch.

    Related, filed separately: #291. The ownership gate would reject this ruling's deletions once #68 sets the variable. It is dispatched before part 2.


    Generated by Claude Code

  7. 6 remaining items

  8. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop, repo:objectos seat
    Session: session_01FeA1nwBz1ohH65dvffUGKr
    Account: hotlong (the seat's linked user, as GET /user answers it; always the card's assignee)
    Branch: claude/pm-dispatch-objectos-ju9td1, the session's one designated push branch. This is part 2 of ruling 5989567068 (letter A), and it is a governed surface: AGENTS.md, human-merge only.

    The PR carries a 维护者速读.
    Stop on breach and explain in the report.
    Container & model: S, mode:subagent, model: default.
    Clause-②: no
    Thread-read: 5990100003
    Serial constraints cleared: no. Pushes are serial on the one branch: #316 → this card.


    Generated by Claude Code

  9. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    Contributor

    os-dev-report
    {
    "issue": 256,
    "status": "staged",
    "branch": "staged/issue-256-p2 (local only, not pushed)",
    "worktree": "/home/user/objectos-issue-256-p2 (kept, per staged mode)",
    "base_sha": "94ce848184c7eb938981c5691fffd4f4bbc733c2",
    "final_commit": "fdc30ca",
    "commits": [
    "fe36dbf docs(agents): delete locale siblings when an English correction reverses a capability claim",
    "fdc30ca docs(agents): record the type-check order and why it is load-bearing"
    ],
    "pr": null,
    "pr_body_draft": "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-256-p2/pr-body.md (first line: Part of #256; carries the 维护者速读 draft with 席位意见 left for the seat)",
    "session": "session_01FeA1nwBz1ohH65dvffUGKr",
    "premise_still_valid": true,
    "summary": "Part 2 of ruling 5989567068 (letter A), staged as two commits on AGENTS.md only (+2/-2). Step 3 of the Translation workflow now names a second exception next to retire/rename: an English correction that removes or reverses a capability assertion deletes the page's locale siblings in the same PR. Wording and number drift (a port number, a timing) stay with the pass, as step 2 says, and the sentence links the ruling on #256. The Commands line for npm run type-check now shows the origin/main order, next typegen && fumadocs-mdx && tsc --noEmit (verbatim match with apps/docs/package.json @ 94ce848), plus one sentence on the race from #311. That sentence is a tighter rewrite of 4afa327, which applied cleanly but ran to five sentences. Part of, not Fixes: the part-1 landing note 5990100003 lists the AGENTS.md:69 coverage figure as remaining on this card, and this dispatch does not carry it (open question 1). If the seat adds it, the first line can switch from Part of to Fixes.",
    "diff": "diff --git a/AGENTS.md b/AGENTS.md\nindex de16be0..75597d0 100644\n--- a/AGENTS.md\n+++ b/AGENTS.md\n@@ -81,7 +81,7 @@ pnpm --filter @objectos/docs gen:zh-hant --check # what CI runs\n When the English source changes:\n 1. Edit the English .mdx; verify it renders. That is the whole task.\n 2. Leave the locale siblings alone. They are stale now, the freshness gate says so on your PR, and the next pass fixes them. Stale is reported, not blocking — English landing on its own is the design, not an oversight.\n-3. Retiring or renaming a page is the exception: delete its locale siblings in the same PR. An orphaned translation blocks the gate, and a translation of a page that was rewritten to assert something different is worse than none — a missing translation renders correct English, a stale one renders content the English source no longer claims.\n+3. Retiring or renaming a page is the exception, and so is an English correction that removes or reverses a capability assertion: delete its locale siblings in the same PR. An orphaned translation blocks the gate, and a translation of a page that was rewritten to assert something different is worse than none — a missing translation renders correct English, a stale one renders content the English source no longer claims. Wording drift and number drift (a port number, a timing) do not count: they stay with the translation pass, as step 2 says (ruling on #256).\n 4. Never hand-write the translation: frontmatter block. Only check-translations.mjs --stamp writes it; a hand-typed sha is a lie the gate cannot catch.\n \n Status at any time:\n@@ -104,7 +104,7 @@ node .github/scripts/check-translations.mjs --worklist # what the next pass wil\n \n From apps/docs/:\n - npm run dev — dev server on http://localhost:3000\n-- npm run type-check — fumadocs-mdx && next typegen && tsc --noEmit\n+- npm run type-check — next typegen && fumadocs-mdx && tsc --noEmit. ⛔ Keep this order (#311): next typegen can exit mid-way through the un-awaited .source/* rewrite that createMDX() in next.config.mjs starts, leaving a truncated .source/server.ts that tsc rejects (TS2306), so the awaited fumadocs-mdx CLI goes after it as the last writer.\n - npm run build — production build\n \n ## Turbo caching and content changes\n",
    "checks": {
    "measured_on": "fdc30ca; git status empty; merge-base with origin/main = 94ce848",
    "ownership_workflow_argv": [
    "git diff --name-status --no-renames origin/main...HEAD > changed.txt: one line, 'M TAB AGENTS.md'",
    "check-translation-ownership.mjs --actor objectstack-fleet[bot] --files changed.txt, TRANSLATION_BOT_LOGIN unset (as live): exit 0, '⚠ TRANSLATION_BOT_LOGIN is not set — ownership is not enforced yet. … This PR touches 0 translation artifact(s) and 1 other file(s).'",
    "same, TRANSLATION_BOT_LOGIN=placeholder-translator: exit 0, '✓ 1 file(s) changed, no translation artifacts touched.'",
    "control, actor = placeholder-translator: exit 1, '✗ translation PRs may only touch translation artifacts.'",
    "--self-test: exit 0, '✓ self-test: 21 case(s), each run enforced and unset — deletion allowed, addition and modification rejected, the translation account confined, the unset path dormant'"
    ],
    "governed_predicate": "objectstack @ ba5927f7, check-governed-merges.mjs --test AGENTS.md --additions 2 --deletions 2: exit 3, '⛔ GOVERNED — a human merge is the review record for this PR', 'landing tier: H(人合)', 'size: 4 changed line(s) (+2 / -2) ≤ 5000'",
    "dispatch_gates_tier": "objectstack @ ba5927f7, dispatch-gates.mjs --tier --repo objectstack-ai/objectos AGENTS.md: exit 0, 'Model tier — no path-derived mandate: the surface hits none of the 3 declared glob(s)'",
    "control_bytes": "grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]' over git diff 94ce848..HEAD: grep exit 1, 0 hits; over AGENTS.md: grep exit 1; over pr-body.md: grep exit 1; positive control (a file with a DEL byte): grep exit 0",
    "order_check": "scripts['type-check'] read from origin/main:apps/docs/package.json = 'next typegen && fumadocs-mdx && tsc --noEmit'; it appears as a code span in the new AGENTS.md line (grep -cF = 1). The mechanism was re-read from installed fumadocs-mdx 15.0.7, dist/next/index.js: createMDX() calls init(isDev, core) without awaiting it",
    "not_applicable": [
    "objectos .github/scripts has no governed-prose, skill-lint or line-ratchet gate: 11 scripts plus lib/derived-locales.mjs, and none reads AGENTS.md as input (grep finds AGENTS.md in comments and failure text only)",
    "objectstack check-governed-prose / check-skill-id-lint / check-skill-line-ratchet set REPO_ROOT from the script's own location (objectstack), so they cannot read objectos AGENTS.md",
    "check:nul-bytes scans the repo it lives in (objectstack); the grep scan above stands in for it",
    "no package changed, so no build/test/type-check is owed locally; CI build and Node floor run on any PR (ci.yml has no paths filter)"
    ],
    "families_by_hand": "objectos has no dispatch-gates.mjs (only scripts/pm/check-half-states.mjs), so the families were derived from its package.json and .github/workflows: ci.yml (node-floor; build: half-state self-test, gen-zh-hant --check, type-check, build, locale surface, positioning, search locales, test, worker package, smoke), translations.yml (paths filter: content/docs/, apps/docs/lib/i18n.ts, .github/scripts/, its own yml; AGENTS.md is NOT in it, so Ownership & freshness will not run on this PR), deploy-docs/rollback/half-state-patrol (not PR gates). No family reads AGENTS.md."
    },
    "tests": "No code changed, so no unit or type tests are owed. Gate verdicts are under checks, all measured on fdc30ca after the final commit. Extra measurement: with TRANSLATION_BOT_LOGIN set, an A-shaped list (English M plus 3 locale D) exits 0 with '✓ 4 file(s) changed: 3 translation artifact(s) deleted, none added or modified.' The control with a locale M exits 1 with '✗ translations are generated, not hand-written.' So the enforced gate already admits criterion-A deletions.",
    "mcp_calls": "0",
    "api_writes": "1 — this os-dev-report comment on #256 via objectstack scripts/pm/post-stamped.mjs (fleet-write relay route). No push, no PR, no label, no assignee write. All other GitHub calls were GET reads (issues/256, issues/256/comments, issues/311, pulls/313).",
    "deviations": [
    "Status 'staged' is outside the template enum (done/rework/blocked/needs_decision). The dispatch asked for it.",
    "No route-probe push of the empty branch, and no PR or label write. Staged mode forbids pushing, and the dispatch overrides the contract's first-action push.",
    "pnpm install skipped in the worktree. The diff is AGENTS.md only, and no check run here needs dependencies. That leaves no node_modules behind in a worktree that staged mode keeps.",
    "Commit 1 was amended once before reporting: 'a correction' became 'an English correction', and 'are not a reversal' became 'do not count'. Method: git reset --hard 93d3d68 on my own unpushed branch with a clean tree, commit --amend, then cherry-pick 0de9c34. The superseded shas 93d3d68 and 0de9c34 were never pushed. Every check was re-run on fdc30ca.",
    "4afa327 was not cherry-picked. git apply --check exited 0, but the dispatch allowed a tighter rewrite, and the five-sentence line became one sentence of why. The commit message names 4afa327.",
    "Commit trailers are the model-free pair (Co-Authored-By: Claude noreply@anthropic.com + Claude-Session URL). The PR body draft ends with the session-URL footer. The harness attribution reminder asked for a model-named Co-Authored-By and a different PR footer; the dev contract takes precedence. Squash commits on main carry the model-named form; reported, not imitated.",
    "The coverage-figure correction at AGENTS.md:69 was NOT made, despite landing note 5990100003 ('It also corrects the zh-Hans coverage figure'). The dispatch ('Two changes, as two commits') and the later Claim 6021328246 name two changes only. Flagged as open question 1, not settled either way.",
    "The governed predicates and dispatch-gates --tier were run from /home/user/objectstack @ ba5927f7, read-only. That checkout was not modified."
    ],
    "open_questions": [
    {
    "question": "AGENTS.md:69 says 'Coverage tracks Simplified exactly (62 of 79 pages today). The 17 without a Simplified sibling …'. On 94ce848, git ls-files counts 79 English pages and 48 zh-Hans (48 zh-Hant) siblings, so 31 have none. Landing note 5990100003 puts this on part 2; this dispatch does not. Should this PR carry it?",
    "options": [
    "A: add a third commit before opening that drops the count. Replace the first two sentences with 'Coverage tracks Simplified exactly. A page without a Simplified sibling has no Traditional one either, so it is never advertised in the sitemap or an hreflang cluster — it simply renders English.' Then switch the first line from Part of to Fixes.",
    "B: add a third commit that updates the numbers to '48 of 79' and 'The 31 without'.",
    "C: leave it for a later governed AGENTS.md PR and keep Part of #256."
    ],
    "recommendation": "A. The count has gone stale twice in two days (62 → 60 → 48) and nothing gates it, so removing the number ends the drift where B only resets it. The file is governed, so riding the one human merge costs nothing extra. With it, this PR delivers everything listed for the card, and a Fixes first line becomes correct."
    },
    {
    "question": "docs/TRANSLATION.md is broader than criterion A. Rule 3 (lines 20-23) says, unqualified, 'A stale translation is worse than a missing one … When in doubt, delete rather than leave behind'. § Retiring a page (line 196) says 'Never leave a translation behind for a page that was rewritten to say something different'. Read literally, a changed port number qualifies, which is option B (rejected) and contradicts AGENTS.md step 2 and the new step 3. The tension with step 2 predates this PR; criterion A narrows it. Align it?",
    "options": [
    "A: a separate one-paragraph docs PR that qualifies rule 3 and § Retiring a page with criterion A's line. docs/TRANSLATION.md is not governed (check-governed-merges --test docs/TRANSLATION.md: exit 0, NOT governed), so it lands through the ordinary queue.",
    "B: widen this PR's surface to docs/TRANSLATION.md. It stays Tier H because of AGENTS.md.",
    "C: leave it. The ruling text says A 'matches docs/TRANSLATION.md rule 3', which holds for its reasoning but not its literal scope."
    ],
    "recommendation": "A. Aligning the wording carries out a ruling already made, not a new decision. Kept out of the governed PR, it does not wait on the maintainer, and this PR's file surface stays as claimed."
    }
    ],
    "out_of_scope_findings": [
    "carrier: the repo:objectos seat (open question 2) · docs/TRANSLATION.md rule 3 (lines 20-23) and § Retiring a page (line 196) are unqualified, so read literally they prescribe deleting siblings on number drift too (option B, rejected), contrary to AGENTS.md steps 2-3 · in PR Acceptance notes, not filed · dedupe words: TRANSLATION.md rule 3 stale worse than missing, retiring a page rewritten to say something different, criterion A capability assertion, number drift port",
    "carrier: this PR if the seat takes open question 1, else the next governed AGENTS.md PR · AGENTS.md:69 coverage '62 of 79 … The 17 without' is 48 of 79 and 31 on 94ce848 (git ls-files) · in PR Acceptance notes, not filed",
    "carrier: none (承接者:无) · check-translation-ownership.mjs header (lines 21-23) and failure text (line 240) name only retire/rename as the reason a human PR deletes a locale file. That stays true but is no longer exhaustive after criterion A. The enforced gate already admits A-shaped deletions (measured: exit 0; locale-M control exit 1) · Acceptance notes only"
    ]
    }


    Generated by Claude Code

  10. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    Contributor

    os-dev-report-addendum
    {
    "issue": 256,
    "addendum_to": "os-dev-report 6021547533",
    "status": "staged",
    "trigger": "Coordinator review: open questions 1 and 2 both answered A",
    "session": "session_01FeA1nwBz1ohH65dvffUGKr",
    "branches": {
    "governed": {
    "branch": "staged/issue-256-p2 (local only, not pushed)",
    "worktree": "/home/user/objectos-issue-256-p2 (kept)",
    "base_sha": "94ce848184c7eb938981c5691fffd4f4bbc733c2",
    "tip": "f49f796cb788c58178ba7b26d51d5f303abb5029",
    "commits": [
    "fe36dbf docs(agents): delete locale siblings when an English correction reverses a capability claim",
    "fdc30ca docs(agents): record the type-check order and why it is load-bearing",
    "f49f796 docs(agents): drop the zh-Hans coverage count that nothing keeps current"
    ],
    "files": "AGENTS.md only, +5/-5",
    "pr_body_draft": "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-256-p2/pr-body.md (first line: Fixes #256; body and 维护者速读 list all three changes; 席位意见 left for the seat)",
    "new_commit_diff": "diff --git a/AGENTS.md b/AGENTS.md\nindex 75597d0..5d9fa93 100644\n--- a/AGENTS.md\n+++ b/AGENTS.md\n@@ -66,9 +66,9 @@ pnpm --filter @objectos/docs gen:zh-hant --check # what CI runs\n every PR and fails on any byte of drift.\n - Retiring a page or its Simplified sibling takes the Traditional file with it —\n re-run the generator, which prunes what it no longer produces.\n-- Coverage tracks Simplified exactly (62 of 79 pages today). The 17 without a\n- Simplified sibling have no Traditional one either, so they are never\n- advertised in the sitemap or an hreflang cluster — they simply render English.\n+- Coverage tracks Simplified exactly. A page without a Simplified sibling has no\n+ Traditional one either, so it is never advertised in the sitemap or an\n+ hreflang cluster — it simply renders English.\n - Committed output, not on-the-fly conversion, because lib/seo.ts tells a real\n translation from an English fallback by the presence of a locale-suffixed\n file. A conversion done while rendering produces no such file, and the locale\n"
    },
    "non_governed": {
    "branch": "staged/issue-256-p3 (local only, not pushed)",
    "worktree": "/home/user/objectos-issue-256-p3 (kept)",
    "base_sha": "94ce848184c7eb938981c5691fffd4f4bbc733c2",
    "tip": "80a765380675daaec33189f2678c2faf23d1b780",
    "commits": [
    "80a7653 docs(translation): delete siblings only when a correction reverses a capability claim"
    ],
    "files": "docs/TRANSLATION.md only, +8/-4",
    "pr_body_draft": "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-256-p3/pr-body.md (first line: Part of #256; lands before the governed PR)",
    "diff": "diff --git a/docs/TRANSLATION.md b/docs/TRANSLATION.md\nindex 7984f80..31136c4 100644\n--- a/docs/TRANSLATION.md\n+++ b/docs/TRANSLATION.md\n@@ -19,8 +19,11 @@ Three rules hold the model together:\n matches its source is indistinguishable from one that does.\n 3. A stale translation is worse than a missing one. A missing translation\n renders correct English — Fumadocs falls back automatically. A stale one\n- renders content the English source no longer claims. When in doubt, delete\n- rather than leave behind.\n+ renders content the English source no longer claims. So an English\n+ correction that removes or reverses a capability assertion deletes that\n+ page's locale siblings in the same PR; wording and number drift (a port\n+ number, a timing) stay with the translation pass\n+ (ruling on #256).\n \n ## Running a pass\n \n@@ -193,8 +196,9 @@ Delete the English source and its locale siblings in the same PR. A translation\n whose English source is gone is reported as orphaned and blocks the gate:\n it can never be reached and can never be refreshed.\n \n-Never leave a translation behind for a page that was rewritten to say something\n-different. Deleting it is the correct action — English renders in its place.\n+Never leave a translation behind for a page that was rewritten to remove or\n+reverse a capability assertion (rule 3). Deleting it is the correct action —\n+English renders in its place.\n \n ## Derived locales\n \n"
    }
    },
    "summary": "Q1 = A: a third commit on the governed branch drops the stale count at AGENTS.md:69, using the proposed wording. The bullets on either side (retiring prunes the Traditional file; committed output, not on-the-fly conversion) still read correctly, and a grep for '62 of 79|17 without' finds no match. The governed PR body now starts 'Fixes #256' and lists three changes. Q2 = A: a separate non-governed branch qualifies docs/TRANSLATION.md rule 3 and section Retiring a page with criterion A, linking the ruling. Rule 3's 'When in doubt, delete rather than leave behind' becomes the ruled line. 'rewritten to say something different' becomes 'rewritten to remove or reverse a capability assertion (rule 3)'. The rule headline and its reasoning are unchanged. GUIDE_REV is not bumped, because no existing translation output is invalidated. The two branches touch different files, so they cannot conflict.",
    "checks": {
    "governed_on_f49f796": [
    "status empty; merge-base with origin/main = 94ce848; workflow list: one line, 'M TAB AGENTS.md'",
    "ownership --actor objectstack-fleet[bot], TRANSLATION_BOT_LOGIN unset: exit 0, '⚠ TRANSLATION_BOT_LOGIN is not set — ownership is not enforced yet. … This PR touches 0 translation artifact(s) and 1 other file(s).'",
    "ownership, TRANSLATION_BOT_LOGIN=placeholder-translator: exit 0, '✓ 1 file(s) changed, no translation artifacts touched.'",
    "control, actor = placeholder-translator: exit 1, '✗ translation PRs may only touch translation artifacts.'",
    "objectstack @ ba5927f7, check-governed-merges --test AGENTS.md --additions 5 --deletions 5: exit 3, '⛔ GOVERNED — a human merge is the review record for this PR', 'landing tier: H(人合)', 'size: 10 changed line(s) (+5 / -5) ≤ 5000'",
    "control bytes over git diff 94ce848..HEAD and AGENTS.md: grep exit 1 both (no match); DEL positive control exit 0"
    ],
    "non_governed_on_80a7653": [
    "status empty; merge-base with origin/main = 94ce848; workflow list: one line, 'M TAB docs/TRANSLATION.md'",
    "ownership --actor objectstack-fleet[bot], TRANSLATION_BOT_LOGIN unset: exit 0, '⚠ TRANSLATION_BOT_LOGIN is not set — ownership is not enforced yet. … This PR touches 0 translation artifact(s) and 1 other file(s).'",
    "ownership, TRANSLATION_BOT_LOGIN=placeholder-translator: exit 0, '✓ 1 file(s) changed, no translation artifacts touched.'",
    "control, actor = placeholder-translator: exit 1, '✗ translation PRs may only touch translation artifacts. @placeholder-translator is the translation account, but this PR also changes: docs/TRANSLATION.md'",
    "ownership --self-test: exit 0, '✓ self-test: 21 case(s), each run enforced and unset …'",
    "objectstack @ ba5927f7, check-governed-merges --test docs/TRANSLATION.md --additions 8 --deletions 4: exit 0, '✅ NOT governed — ordinary queue landing applies to a PR with exactly this file list.', 'size: 12 changed line(s) (+8 / -4) ≤ 5000'",
    "control bytes over git diff 94ce848..HEAD and docs/TRANSLATION.md: grep exit 1 both (no match); DEL positive control exit 0",
    "no gate reads docs/TRANSLATION.md as input: readFileSync of it has 0 hits under .github, apps/docs/scripts and tools (grep exit 1); the scripts only mention it in comments and failure text"
    ],
    "pr_bodies": "both drafts: no tag-shaped fragment (grep exit 1), no control bytes (grep exit 1). The only closing keyword is the governed body's first line, Fixes #256",
    "ci_note": "translations.yml paths filter covers neither AGENTS.md nor docs/**, so Ownership & freshness will not run on either PR and the ownership results above are local only. ci.yml (build, Node floor) has no paths filter and runs on both"
    },
    "mcp_calls": "0",
    "api_writes": "1 — this addendum comment on #256 via objectstack scripts/pm/post-stamped.mjs (fleet-write relay). The earlier report comment 6021547533 was the first write. No push, no PR, no label, no assignee write.",
    "deviations": [
    "The governed branch now has three commits, not the two the original dispatch named. The coordinator ruled Q1 = A.",
    "The check-translation-ownership.mjs header and failure text were left alone, as the coordinator directed (out of surface). Both PR bodies record the gap in Acceptance notes.",
    "pnpm install skipped in the p3 worktree too. The diff is docs only, and no check run needs dependencies.",
    "Neither worktree was removed, nothing was pushed, and git stash was never used."
    ],
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: none (承接者:无) · check-translation-ownership.mjs header (lines 21-23) and failure text (line 240) name only retire/rename as the reason to delete a locale file. That stays true but is no longer exhaustive after criterion A. The enforced gate admits A-shaped deletions (measured exit 0; locale-M control exit 1) · Acceptance notes of both PRs only"
    ]
    }


    Generated by Claude Code

  11. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    Contributor

    ACCEPT: PR #319 (part of #256) on head e4634474cd2f7b9c3fd75fad16cfea30676d13ed · 2026-10-07T02:31Z. I am landing it now: the change is one file, the path is not governed, and every check is green.

    Path surface (get_files): docs/TRANSLATION.md, +8/−4. check-governed-merges --test docs/TRANSLATION.md exits 0: "NOT governed — ordinary queue landing applies".

    Checks on e463447: build and Node floor succeeded; Deploy docs was skipped. Ownership & freshness does not run, because translations.yml's paths filter does not cover docs/**. The dev ran it locally with the workflow argv: exit 0, and the control exits 1. mergeable_state is clean on base 94ce848.

    Push: fast-forward with no force. It starts at the remote branch head 7c17974, merges origin/main @ 94ce848 (the diff against main is then empty), and cherry-picks 80a7653; the patch equals the staged branch's.

    Review against the ruling (5989567068, letter A):

    • Rule 3. It now says that an English correction that removes or reverses a capability assertion deletes the page's locale siblings in the same PR, and that wording and number drift stay with the translation pass. It links the ruling. This replaces the unqualified "When in doubt, delete rather than leave behind", which, read literally, was option B, the one the ruling rejected.
    • § Retiring a page. It now reads "rewritten to remove or reverse a capability assertion (rule 3)". The rule's headline and its reasoning are unchanged.
    • Consistency. The wording matches the governed AGENTS.md step 3, which goes up next as its own PR. AGENTS.md steps 2–3 and this file no longer contradict each other. GUIDE_REV is not bumped, because no existing translation output is invalidated.

    Next: the governed AGENTS.md PR (staged/issue-256-p2, Fixes #256), which the maintainer merges. #316 is in flight.


    Generated by Claude Code

  12. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    Contributor

    Part 3 landed and live · 2026-10-07T02:39Z


    Generated by Claude Code

  13. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    Contributor

    Governed PR open, held for the maintainer · 2026-10-07T04:22Z


    Generated by Claude Code

  14. objectstack-fleet commented on Oct 7, 2026

    @objectstack-fleet
    Contributor

    Landed and live · 2026-10-07T04:38Z


    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

Labels

No labels
No labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions