From 0bf8af70f8d5936a8a9a0b2854a503982a5e9e15 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 3 Sep 2026 03:40:02 +0000 Subject: [PATCH 1/2] content(i18n): close CJK-punctuation-flanked bold in ja / ko / zh-Hans MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A `**bold**` span whose delimiter sits against CJK punctuation on the inside and a CJK letter on the outside is not a flanking delimiter run, so CommonMark emits the asterisks verbatim. Readers of the four CJK locales saw literal `**` mid-sentence on 24 built pages. Repaired by moving the delimiter, never by dropping the emphasis, in three shapes: * closing delimiter blocked by sentence punctuation inside the span -> move it inside the punctuation: `...ない。**モ` -> `...ない**。モ` * closing delimiter blocked by a trailing parenthetical gloss -> move it left, past the gloss: `**用語(gloss)**は` -> `**用語**(gloss)は` (this also matches the English originals, e.g. `A **detective** control`) * the span is a quoted phrase and its quote blocks a delimiter -> move both delimiters inside the quotes: `**"..."**` -> `"**...**"` Where the parenthesis is mid-phrase rather than trailing, the delimiter moves right instead so the emphasized phrase stays a complete unit. zh-Hant is generated: only the zh-Hans sources were edited and `pnpm gen:zh-hant` (run by `pnpm build`) carried the six twins. Measured at 4dd647c: 24 built pages carried a literal `**` outside ``/`
` (ja 6, ko 6, zh-Hans 6, zh-Hant 6), from 37 inert
delimiter runs across 18 authored files. After this change: 0.

Part of #174

Co-Authored-By: Claude Opus 5 
Claude-Session: https://claude.ai/code/session_01FeA1nwBz1ohH65dvffUGKr
---
 .../blog/ai-ontology-open-protocol/index.ja.mdx  | 16 ++++++++--------
 .../blog/ai-ontology-open-protocol/index.ko.mdx  |  2 +-
 .../ai-ontology-open-protocol/index.zh-Hans.mdx  |  8 ++++----
 .../ai-ontology-open-protocol/index.zh-Hant.mdx  |  8 ++++----
 .../ai-wrote-your-app-dare-to-merge/index.ko.mdx |  2 +-
 .../index.zh-Hans.mdx                            |  2 +-
 .../index.zh-Hant.mdx                            |  2 +-
 .../index.ja.mdx                                 |  8 ++++----
 .../index.ko.mdx                                 |  2 +-
 .../index.zh-Hans.mdx                            |  6 +++---
 .../index.zh-Hant.mdx                            |  6 +++---
 .../blog/business-app-in-16k-tokens/index.ja.mdx |  2 +-
 .../blog/business-app-in-16k-tokens/index.ko.mdx |  2 +-
 .../index.ja.mdx                                 |  4 ++--
 .../index.ko.mdx                                 |  4 ++--
 .../index.zh-Hans.mdx                            |  2 +-
 .../index.zh-Hant.mdx                            |  2 +-
 .../forward-deployed-engineer-tools/index.ja.mdx |  2 +-
 .../forward-deployed-engineer-tools/index.ko.mdx |  2 +-
 .../index.zh-Hans.mdx                            |  2 +-
 .../index.zh-Hant.mdx                            |  2 +-
 .../index.ja.mdx                                 |  2 +-
 .../index.zh-Hans.mdx                            |  2 +-
 .../index.zh-Hant.mdx                            |  2 +-
 24 files changed, 46 insertions(+), 46 deletions(-)

diff --git a/content/blog/ai-ontology-open-protocol/index.ja.mdx b/content/blog/ai-ontology-open-protocol/index.ja.mdx
index e178a0c..d949d70 100644
--- a/content/blog/ai-ontology-open-protocol/index.ja.mdx
+++ b/content/blog/ai-ontology-open-protocol/index.ja.mdx
@@ -38,11 +38,11 @@ tags:
 
 Ontology を研究上の概念から商業的事実に変えたのは Palantir です。なぜ成功したのかを公平に見ておく価値があります——公平に見るほど、次の問いが鮮明になるからです。
 
-Palantir Foundry の核心は 2 つの動作です。第一に、企業中に散らばったデータを**統一されたオントロジー層に統合する**こと。顧客・設備・注文は何十ものテーブルではなく、型と関係と属性を持つビジネスオブジェクトになります。第二に、すべての書き込み操作を**ガバナンスの効いた Actions に収斂させる**こと。各アクションは検証され、権限が確認され、完全に監査されます。2023 年以降の AIP は、このアーキテクチャを大規模言語モデルに直接向けました。**LLM はデータベースに触れない。オントロジー層が公開するガバナンス済みツールしか呼べない。**モデルは交換可能で、境界は動きません。
+Palantir Foundry の核心は 2 つの動作です。第一に、企業中に散らばったデータを**統一されたオントロジー層に統合する**こと。顧客・設備・注文は何十ものテーブルではなく、型と関係と属性を持つビジネスオブジェクトになります。第二に、すべての書き込み操作を**ガバナンスの効いた Actions に収斂させる**こと。各アクションは検証され、権限が確認され、完全に監査されます。2023 年以降の AIP は、このアーキテクチャを大規模言語モデルに直接向けました。**LLM はデータベースに触れない。オントロジー層が公開するガバナンス済みツールしか呼べない**。モデルは交換可能で、境界は動きません。
 
 なぜ高価なのか?解決している問題が本当に高価だからです。大企業が 20 年かけて溜め込んだレガシーシステムを 1 つのきれいなオントロジーに整理するには、Palantir の常駐エンジニア(Forward Deployed Engineer)がシステムを 1 つずつ紐解き、概念を 1 つずつ突き合わせる必要があります——文字通りの労働集約型エンジニアリングです。顧客は政府、防衛、金融、エネルギー。「AI のすべてのステップが権限の範囲内で、すべて記録される」ことが絶対要件であり、予算もそれに見合う顧客です。契約は数百万ドルからですが、更新され続けます。CISO が最も気にする 3 つの質問——冒頭のあの 3 つ——に本当に答えているからです。
 
-つまり Palantir がはっきり示したのは営業力だけではなく、1 つのアーキテクチャ上の判断です。**AI が企業に入るには、ガバナンスの効いたビジネスセマンティックレイヤーが先に存在しなければならない。**この判断にもう論証は要りません。
+つまり Palantir がはっきり示したのは営業力だけではなく、1 つのアーキテクチャ上の判断です。**AI が企業に入るには、ガバナンスの効いたビジネスセマンティックレイヤーが先に存在しなければならない**。この判断にもう論証は要りません。
 
 考え直すべきは次の問いです。この層は、どんな*形態*で存在すべきか?いくつかのことが変わりつつあるからです。
 
@@ -66,7 +66,7 @@ Palantir Foundry の核心は 2 つの動作です。第一に、企業中に散
 
 閉じたプラットフォームには、そこから抜ける道が二つあります。高くつくほうは、フォーマットそのものを開くこと。モデルが学習し、agent が促されずとも手を伸ばすようになります。安いほうは、フォーマットは閉じたまま**縁の部分だけ開かれたプロトコルを採用する**こと。agent は学習できないままでも、そのプラットフォームを呼び出せるようになります。
 
-本記事は当初、閉じたプラットフォームはこのループに入れない、と書きました。一週間もしないうちに、その言い方は強すぎたことが判明します——既存ベンダーは安いほうの道を選び、そしてそれは機能しました。残るのは、より狭く、より重要な一文です:**agent が呼び出せるインターフェースは、agent が学習できる定義ではない。そしてそのどちらも、持ち運べるランタイムではない。**既存ベンダーがそれに対して何をしたのか、そして何だけをしなかったのかは、以下のとおりです。
+本記事は当初、閉じたプラットフォームはこのループに入れない、と書きました。一週間もしないうちに、その言い方は強すぎたことが判明します——既存ベンダーは安いほうの道を選び、そしてそれは機能しました。残るのは、より狭く、より重要な一文です:**agent が呼び出せるインターフェースは、agent が学習できる定義ではない。そしてそのどちらも、持ち運べるランタイムではない**。既存ベンダーがそれに対して何をしたのか、そして何だけをしなかったのかは、以下のとおりです。
 
 ## 待って——閉じたプラットフォームが勝った例もあるのでは?
 
@@ -148,9 +148,9 @@ export const SalesUser: Security.PermissionSet = {
 
 ここから 3 つの帰結が直接導かれます。
 
-1. **冒頭の 3 つのセキュリティの質問に、構造的な答えができる。**AI は何を見られるか——権限セットに書いてある。どの権限で動くか——ログインユーザーとして行動し、ObjectStack ランタイムが強制する。プロンプトでお願いするのではない。監査記録はどこか——人間と agent はすべての読み書きを同じ台帳に記録する。誰が、何を、いつ、なぜ。コンプライアンスが見る台帳は 1 冊だけです。
-2. **業務変更がコードレビューになる。**AI がシステムに「更新リマインダー」を追加したい?提出されるのはメタデータの diff です。どのフィールドが変わり、どの権限が動いたか、一目で分かります。定義はバージョン管理されているので、間違いはロールバックできます。
-3. **システム全体が 1 つの agent のコンテキストウィンドウに収まる。**典型的なエンタープライズモジュールは、数万行の CRUD とグルーコードから数百行の宣言に収斂します——AI がすべての依存関係を端から端まで読み切り、データ・API・画面・権限を横断する安全なリファクタリングを一度の変更でやり切れる大きさです。これが「共同メンテナーとしての AI」と「補完ツールとしての AI」の分水嶺です。
+1. **冒頭の 3 つのセキュリティの質問に、構造的な答えができる**。AI は何を見られるか——権限セットに書いてある。どの権限で動くか——ログインユーザーとして行動し、ObjectStack ランタイムが強制する。プロンプトでお願いするのではない。監査記録はどこか——人間と agent はすべての読み書きを同じ台帳に記録する。誰が、何を、いつ、なぜ。コンプライアンスが見る台帳は 1 冊だけです。
+2. **業務変更がコードレビューになる**。AI がシステムに「更新リマインダー」を追加したい?提出されるのはメタデータの diff です。どのフィールドが変わり、どの権限が動いたか、一目で分かります。定義はバージョン管理されているので、間違いはロールバックできます。
+3. **システム全体が 1 つの agent のコンテキストウィンドウに収まる**。典型的なエンタープライズモジュールは、数万行の CRUD とグルーコードから数百行の宣言に収斂します——AI がすべての依存関係を端から端まで読み切り、データ・API・画面・権限を横断する安全なリファクタリングを一度の変更でやり切れる大きさです。これが「共同メンテナーとしての AI」と「補完ツールとしての AI」の分水嶺です。
 
 ## 定義と可搬なランタイムはコミュニティへ、本番運用はビジネスへ
 
@@ -160,14 +160,14 @@ Ontology という判断は正しい——Palantir が業界全体のために
 
 これがまさに ObjectStack と ObjectOS の分業です。
 
-- **ObjectStack** は**オープンなビジネスオントロジー(open business ontology)**です。型付きのアプリ定義と、それを実行するオープンソースランタイム(Apache 2.0)が一体になっています。オブジェクト、関係、権限、フロー、API、UI、AI ツールをリポジトリで一度だけ定義し、ランタイムがデータベース、REST API、画面、MCP サーバーを導出して、すべての呼び出しで権限と監査を強制します。定義もエンジンも diff、セルフホスト、移行が可能です——後者こそ、この分野の他のプレイヤーが閉じたまま残した層です。
+- **ObjectStack** は**オープンなビジネスオントロジー**(open business ontology)です。型付きのアプリ定義と、それを実行するオープンソースランタイム(Apache 2.0)が一体になっています。オブジェクト、関係、権限、フロー、API、UI、AI ツールをリポジトリで一度だけ定義し、ランタイムがデータベース、REST API、画面、MCP サーバーを導出して、すべての呼び出しで権限と監査を強制します。定義もエンジンも diff、セルフホスト、移行が可能です——後者こそ、この分野の他のプレイヤーが閉じたまま残した層です。
 - **ObjectOS** は同じ ObjectStack アプリを囲む商用プロダクションプラットフォームです。ブラウザ内 Build/Ask、チームレビューと承認、マネージドクラウドまたはプライベート展開の運用、SSO、企業向け制御、サポートを提供します。Ontology を再び囲い込む閉じた実行エンジンではありません。
 
 片側には、どんなチームや agent でも理解し、セルフホストし、持ち出せるアプリ定義と可搬なランタイム。もう片側には、企業が本当に対価を払う本番体験——共同編集、承認、ホスティング、プライベート展開、SSO、サポート、アップグレード、運用責任があります。アプリと基礎ランタイムはあなたのもの。チームのために確実に運用することがビジネスです。
 
 ## おわりに
 
-9 か月目に死んだあの AI パイロットは、モデルの能力に負けたのではありません。セキュリティチームがサインできるセマンティックレイヤーが存在しなかったことに負けたのです。業界で最も高価な会社が、この層の価値を 10 年かけて証明しました。そして 2026 年は、9 か月でもっと狭く、もっと役に立つことを証明しました。**この層のうち、開くのが安く済む部分は、もう開かれた。**インターフェースは公開プロトコルであり、定義はあなたが読めるファイルです。残っているのは、後者を前者に変え、その過程で規則を強制するエンジン——そしてその層では、何も開かれませんでした。
+9 か月目に死んだあの AI パイロットは、モデルの能力に負けたのではありません。セキュリティチームがサインできるセマンティックレイヤーが存在しなかったことに負けたのです。業界で最も高価な会社が、この層の価値を 10 年かけて証明しました。そして 2026 年は、9 か月でもっと狭く、もっと役に立つことを証明しました。**この層のうち、開くのが安く済む部分は、もう開かれた**。インターフェースは公開プロトコルであり、定義はあなたが読めるファイルです。残っているのは、後者を前者に変え、その過程で規則を強制するエンジン——そしてその層では、何も開かれませんでした。
 
 だから 6 月に本記事が投げた問いは、いま、より鋭い形を持っています。「オントロジーは開かれるべきか」ではありません——それはもう決着し、しかもベンダー自身が決着させました。問いはこうです:**最後まで閉じている層が、よりによってあなたの業務規則を実行する層だとして、そのエンジンは誰のものであってほしいですか。**
 
diff --git a/content/blog/ai-ontology-open-protocol/index.ko.mdx b/content/blog/ai-ontology-open-protocol/index.ko.mdx
index 9d8c49b..51e4ccf 100644
--- a/content/blog/ai-ontology-open-protocol/index.ko.mdx
+++ b/content/blog/ai-ontology-open-protocol/index.ko.mdx
@@ -160,7 +160,7 @@ export const SalesUser: Security.PermissionSet = {
 
 이것이 바로 ObjectStack과 ObjectOS의 분업입니다.
 
-- **ObjectStack**은 하나의 **열린 비즈니스 온톨로지(open business ontology)**입니다. 타입이 지정된 애플리케이션 정의와, 그것을 실행하는 오픈소스 런타임(Apache 2.0)이 함께 있습니다. 객체, 관계, 권한, 플로우, API, UI, AI 도구를 저장소에서 한 번 정의하면 런타임이 데이터베이스, REST API, 렌더링된 UI, MCP 서버를 파생하고 모든 호출에서 권한과 감사를 강제합니다. 정의와 엔진 모두 diff, 자체 호스팅, 이동이 가능합니다 — 그 뒤쪽 절반이 바로 이 분야의 나머지가 닫아 둔 계층입니다.
+- **ObjectStack**은 하나의 **열린 비즈니스 온톨로지**(open business ontology)입니다. 타입이 지정된 애플리케이션 정의와, 그것을 실행하는 오픈소스 런타임(Apache 2.0)이 함께 있습니다. 객체, 관계, 권한, 플로우, API, UI, AI 도구를 저장소에서 한 번 정의하면 런타임이 데이터베이스, REST API, 렌더링된 UI, MCP 서버를 파생하고 모든 호출에서 권한과 감사를 강제합니다. 정의와 엔진 모두 diff, 자체 호스팅, 이동이 가능합니다 — 그 뒤쪽 절반이 바로 이 분야의 나머지가 닫아 둔 계층입니다.
 - **ObjectOS**는 같은 ObjectStack 앱 주위의 상용 프로덕션 플랫폼입니다. 브라우저 Build와 Ask, 팀 검토와 승인, 관리형 클라우드 또는 프라이빗 배포 운영, SSO, 엔터프라이즈 제어, 지원을 판매합니다. 온톨로지를 다시 빼앗는 닫힌 실행 엔진이 아닙니다.
 
 한쪽에는 어떤 팀이나 agent도 이해하고 자체 호스팅하며 가지고 떠날 수 있는 애플리케이션 정의와 이동 가능한 런타임이 있습니다. 다른 쪽에는 기업이 실제로 비용을 내는 프로덕션 경험 — 협업 작성, 승인, 호스팅, 프라이빗 배포, SSO, 지원, 업그레이드, 운영 책임이 있습니다. 앱과 기본 런타임은 당신의 것입니다. 팀을 위해 안정적으로 운영하는 것이 비즈니스입니다.
diff --git a/content/blog/ai-ontology-open-protocol/index.zh-Hans.mdx b/content/blog/ai-ontology-open-protocol/index.zh-Hans.mdx
index 963af1c..b54df78 100644
--- a/content/blog/ai-ontology-open-protocol/index.zh-Hans.mdx
+++ b/content/blog/ai-ontology-open-protocol/index.zh-Hans.mdx
@@ -66,7 +66,7 @@ Palantir Foundry 的核心动作是两个。第一,把企业散落各处的数
 
 封闭平台面对这个循环有两条出路。贵的那条是把格式本身开放,让模型学会它、让 agent 不用被提示就想到它。便宜的那条是格式照旧封闭,只**在边缘采用一个开放协议**——agent 于是能调用这个平台,尽管仍然学不到它。
 
-本文最初的写法是:封闭平台进不了这个循环。不到一周,这个说法就被证明太强了——在位厂商走了便宜的那条路,而且走通了。留下来的是更窄、也更要紧的一句:**agent 能调用的接口不等于 agent 能学习的定义,而这两样都不等于一个你能带走的运行时。**在位厂商为此做了什么、又唯独没做什么,见下文。
+本文最初的写法是:封闭平台进不了这个循环。不到一周,这个说法就被证明太强了——在位厂商走了便宜的那条路,而且走通了。留下来的是更窄、也更要紧的一句:**agent 能调用的接口不等于 agent 能学习的定义,而这两样都不等于一个你能带走的运行时**。在位厂商为此做了什么、又唯独没做什么,见下文。
 
 ## 等等——封闭平台不是也赢过很多次吗?
 
@@ -102,11 +102,11 @@ Palantir Foundry 的核心动作是两个。第一,把企业散落各处的数
 
 开放的接口让 ontology **可被调用**;放进仓库的定义让它**可读、可评审**。但这两样都不能让它**换个地方跑起来**。可移植的定义不等于可移植的系统:一个装满本体代码的 monorepo,最终仍要落在一套 Foundry 环境上。而且工具面是**从定义投影出来的**,谁运行这次投影,谁就决定了工具是什么。定义文件自己不执行任何东西。
 
-这就是这次更新真正依赖的那个数字。把 Palantir 那套写进文档的投影规则套到一个中等规模的应用上——12 个对象类型、30 个动作类型、6 个对外函数——你会得到**37 个说着开放协议的 MCP 工具,而底下只有一台引擎能回答其中任何一个。**接口变得可移植了,依赖一寸也没动。
+这就是这次更新真正依赖的那个数字。把 Palantir 那套写进文档的投影规则套到一个中等规模的应用上——12 个对象类型、30 个动作类型、6 个对外函数——你会得到**37 个说着开放协议的 MCP 工具,而底下只有一台引擎能回答其中任何一个**。接口变得可移植了,依赖一寸也没动。
 
 ![三层结构决定可移植性:接口层通过 MCP 开放,定义层以代码入库的形式开放,而负责强制权限、事务与审计的运行时原地未动](./three-layers-open-2026.svg)
 
-**把最有力的反驳如实摆出来:**团队真正想从可移植性里拿到的东西,如今大半已经拿到了。你可以读自己的模型、以 diff 的方式评审它、把任何 agent 指向它;分析型语义还能通过一份 2026 年进入 Apache 孵化器的中立规范来交换。如果你的 ontology 只需要回答问题,那已经接近够用了,本文不该假装不是。
+**把最有力的反驳如实摆出来**:团队真正想从可移植性里拿到的东西,如今大半已经拿到了。你可以读自己的模型、以 diff 的方式评审它、把任何 agent 指向它;分析型语义还能通过一份 2026 年进入 Apache 孵化器的中立规范来交换。如果你的 ontology 只需要回答问题,那已经接近够用了,本文不该假装不是。
 
 而回答它的那条线,和「语义层」与 ontology 的分界线是同一条:它一直成立,直到有事情必须真的**发生**。当一个对外暴露的动作真的改写了一条记录,你在意的一切——权限校验、事务、超过阈值时的审批、那一行审计记录——都是引擎的性质,而不是文件的性质,也不是协议的性质。你能导出那句话,导不出那道强制。
 
@@ -167,7 +167,7 @@ Ontology 这个判断是对的,Palantir 已经替行业证明过。本文最
 
 ## 结语
 
-那个九个月死掉的 AI 试点,死因从来不是模型不够聪明,而是没有一个能让安全团队签字的业务语义层。行业里最贵的公司用十年证明了这一层的价值;而 2026 年只用九个月证明了一件更窄、也更有用的事:**这一层里便宜开放的部分,现在都已经开放了。**接口是一个公开协议,定义是一份你能读的文件。剩下的,是那台把定义变成接口、并在变的过程中强制规则的引擎——而这一层,什么都没打开。
+那个九个月死掉的 AI 试点,死因从来不是模型不够聪明,而是没有一个能让安全团队签字的业务语义层。行业里最贵的公司用十年证明了这一层的价值;而 2026 年只用九个月证明了一件更窄、也更有用的事:**这一层里便宜开放的部分,现在都已经开放了**。接口是一个公开协议,定义是一份你能读的文件。剩下的,是那台把定义变成接口、并在变的过程中强制规则的引擎——而这一层,什么都没打开。
 
 所以本文在 6 月提出的问题,现在有了更锋利的形式。不再是「本体该不该开放」——那已经有了答案,而且是厂商自己给的。而是:**当最后一层没有打开的,恰好是执行你业务规则的那一层,你希望那台引擎是谁的?**
 
diff --git a/content/blog/ai-ontology-open-protocol/index.zh-Hant.mdx b/content/blog/ai-ontology-open-protocol/index.zh-Hant.mdx
index 029eea5..d14be6d 100644
--- a/content/blog/ai-ontology-open-protocol/index.zh-Hant.mdx
+++ b/content/blog/ai-ontology-open-protocol/index.zh-Hant.mdx
@@ -67,7 +67,7 @@ Palantir Foundry 的核心動作是兩個。第一,把企業散落各處的資
 
 封閉平臺面對這個迴圈有兩條出路。貴的那條是把格式本身開放,讓模型學會它、讓 agent 不用被提示就想到它。便宜的那條是格式照舊封閉,只**在邊緣採用一個開放協議**——agent 於是能呼叫這個平臺,儘管仍然學不到它。
 
-本文最初的寫法是:封閉平臺進不了這個迴圈。不到一週,這個說法就被證明太強了——在位廠商走了便宜的那條路,而且走通了。留下來的是更窄、也更要緊的一句:**agent 能呼叫的介面不等於 agent 能學習的定義,而這兩樣都不等於一個你能帶走的執行時。**在位廠商為此做了什麼、又唯獨沒做什麼,見下文。
+本文最初的寫法是:封閉平臺進不了這個迴圈。不到一週,這個說法就被證明太強了——在位廠商走了便宜的那條路,而且走通了。留下來的是更窄、也更要緊的一句:**agent 能呼叫的介面不等於 agent 能學習的定義,而這兩樣都不等於一個你能帶走的執行時**。在位廠商為此做了什麼、又唯獨沒做什麼,見下文。
 
 ## 等等——封閉平臺不是也贏過很多次嗎?
 
@@ -103,11 +103,11 @@ Palantir Foundry 的核心動作是兩個。第一,把企業散落各處的資
 
 開放的介面讓 ontology **可被呼叫**;放進倉庫的定義讓它**可讀、可評審**。但這兩樣都不能讓它**換個地方跑起來**。可移植的定義不等於可移植的系統:一個裝滿本體程式碼的 monorepo,最終仍要落在一套 Foundry 環境上。而且工具面是**從定義投影出來的**,誰執行這次投影,誰就決定了工具是什麼。定義檔案自己不執行任何東西。
 
-這就是這次更新真正依賴的那個數字。把 Palantir 那套寫進文件的投影規則套到一箇中等規模的應用上——12 個物件型別、30 個動作型別、6 個對外函式——你會得到**37 個說著開放協議的 MCP 工具,而底下只有一臺引擎能回答其中任何一個。**介面變得可移植了,依賴一寸也沒動。
+這就是這次更新真正依賴的那個數字。把 Palantir 那套寫進文件的投影規則套到一箇中等規模的應用上——12 個物件型別、30 個動作型別、6 個對外函式——你會得到**37 個說著開放協議的 MCP 工具,而底下只有一臺引擎能回答其中任何一個**。介面變得可移植了,依賴一寸也沒動。
 
 ![三層結構決定可移植性:介面層通過 MCP 開放,定義層以程式碼入庫的形式開放,而負責強制權限、事務與審計的執行時原地未動](./three-layers-open-2026.svg)
 
-**把最有力的反駁如實擺出來:**團隊真正想從可移植性裡拿到的東西,如今大半已經拿到了。你可以讀自己的模型、以 diff 的方式評審它、把任何 agent 指向它;分析型語義還能通過一份 2026 年進入 Apache 孵化器的中立規範來交換。如果你的 ontology 只需要回答問題,那已經接近夠用了,本文不該假裝不是。
+**把最有力的反駁如實擺出來**:團隊真正想從可移植性裡拿到的東西,如今大半已經拿到了。你可以讀自己的模型、以 diff 的方式評審它、把任何 agent 指向它;分析型語義還能通過一份 2026 年進入 Apache 孵化器的中立規範來交換。如果你的 ontology 只需要回答問題,那已經接近夠用了,本文不該假裝不是。
 
 而回答它的那條線,和「語義層」與 ontology 的分界線是同一條:它一直成立,直到有事情必須真的**發生**。當一個對外暴露的動作真的改寫了一條記錄,你在意的一切——權限校驗、事務、超過閾值時的審批、那一行審計記錄——都是引擎的性質,而不是檔案的性質,也不是協議的性質。你能匯出那句話,導不出那道強制。
 
@@ -168,7 +168,7 @@ Ontology 這個判斷是對的,Palantir 已經替行業證明過。本文最
 
 ## 結語
 
-那個九個月死掉的 AI 試點,死因從來不是模型不夠聰明,而是沒有一個能讓安全團隊簽字的業務語義層。行業裡最貴的公司用十年證明了這一層的價值;而 2026 年只用九個月證明了一件更窄、也更有用的事:**這一層裡便宜開放的部分,現在都已經開放了。**介面是一個公開協議,定義是一份你能讀的檔案。剩下的,是那臺把定義變成介面、並在變的過程中強制規則的引擎——而這一層,什麼都沒開啟。
+那個九個月死掉的 AI 試點,死因從來不是模型不夠聰明,而是沒有一個能讓安全團隊簽字的業務語義層。行業裡最貴的公司用十年證明了這一層的價值;而 2026 年只用九個月證明了一件更窄、也更有用的事:**這一層裡便宜開放的部分,現在都已經開放了**。介面是一個公開協議,定義是一份你能讀的檔案。剩下的,是那臺把定義變成介面、並在變的過程中強制規則的引擎——而這一層,什麼都沒開啟。
 
 所以本文在 6 月提出的問題,現在有了更鋒利的形式。不再是「本體該不該開放」——那已經有了答案,而且是廠商自己給的。而是:**當最後一層沒有開啟的,恰好是執行你業務規則的那一層,你希望那臺引擎是誰的?**
 
diff --git a/content/blog/ai-wrote-your-app-dare-to-merge/index.ko.mdx b/content/blog/ai-wrote-your-app-dare-to-merge/index.ko.mdx
index 89a5d7f..1624c7b 100644
--- a/content/blog/ai-wrote-your-app-dare-to-merge/index.ko.mdx
+++ b/content/blog/ai-wrote-your-app-dare-to-merge/index.ko.mdx
@@ -57,7 +57,7 @@ tags: []
 + flow: refund_amount > 500 → 재무 승인 필요
 ```
 
-이 십몇 줄은 당신이 한 줄씩 읽어 이해할 수 있고, 5분 안에 검토할 수 있고, 한 번에 롤백할 수 있다. 더 중요한 것은 마지막 몇 줄이다. 검토는 더 이상 "내가 이걸 다 읽을 수 있을까"가 아니라 **"이 권한이 맞는가, 이 승인 임계값이 합리적인가"**로 바뀐다 — 당신이 진짜로 판단할 수 있고, 또 당신이 판단해야 할 비즈니스 질문이다. 정보를 새게 만들던 그 `GET /api/refunds`는 여기서는 애초에 등장하지 않는다. `support_refund`의 읽기 권한은 "호출자의 권한에 따라"로 선언되고, 런타임이 이를 근거로 강제하니, 권한을 넘어서는 그 경로는 원천에서부터 막힌다.
+이 십몇 줄은 당신이 한 줄씩 읽어 이해할 수 있고, 5분 안에 검토할 수 있고, 한 번에 롤백할 수 있다. 더 중요한 것은 마지막 몇 줄이다. 검토는 더 이상 "내가 이걸 다 읽을 수 있을까"가 아니라 "**이 권한이 맞는가, 이 승인 임계값이 합리적인가**"로 바뀐다 — 당신이 진짜로 판단할 수 있고, 또 당신이 판단해야 할 비즈니스 질문이다. 정보를 새게 만들던 그 `GET /api/refunds`는 여기서는 애초에 등장하지 않는다. `support_refund`의 읽기 권한은 "호출자의 권한에 따라"로 선언되고, 런타임이 이를 근거로 강제하니, 권한을 넘어서는 그 경로는 원천에서부터 막힌다.
 
 그럼 구현은 어디로 갔나? 구현은 반복해서 감사받고, 모든 앱이 공유하는 오픈소스 **ObjectStack 런타임**에 속한다. 앱마다 한 벌씩 새로 생성되는 것이 아니다. '해도 되는가' — 읽어도 되는가, 삭제해도 되는가, 승인이 필요한가 — 는 8천 줄 속에 묻혀 운에 맡겨지는 것이 아니라, 런타임이 실행 시점에 강제한다.
 
diff --git a/content/blog/ai-wrote-your-app-dare-to-merge/index.zh-Hans.mdx b/content/blog/ai-wrote-your-app-dare-to-merge/index.zh-Hans.mdx
index 25dc4c3..ec2e8d9 100644
--- a/content/blog/ai-wrote-your-app-dare-to-merge/index.zh-Hans.mdx
+++ b/content/blog/ai-wrote-your-app-dare-to-merge/index.zh-Hans.mdx
@@ -57,7 +57,7 @@ tags: []
 + flow: refund_amount > 500 → 需财务审批
 ```
 
-这十几行,你能逐行读懂、能在五分钟内评审、能一键回滚。更关键的是最后那几处:审查不再是"我读得完吗",而变成了**"这条权限对不对、这个审批阈值合不合理"**——一个你真正能判断、也该由你判断的业务问题。那个会泄露的 `GET /api/refunds` 在这里压根不会出现:`support_refund` 的读取权限被声明为"按调用者权限",运行时据此强制,越权那条路从源头就被关上了。
+这十几行,你能逐行读懂、能在五分钟内评审、能一键回滚。更关键的是最后那几处:审查不再是"我读得完吗",而变成了"**这条权限对不对、这个审批阈值合不合理**"——一个你真正能判断、也该由你判断的业务问题。那个会泄露的 `GET /api/refunds` 在这里压根不会出现:`support_refund` 的读取权限被声明为"按调用者权限",运行时据此强制,越权那条路从源头就被关上了。
 
 而实现去哪了?实现属于被反复审计、所有应用共用的开源 **ObjectStack 运行时**,不是每个应用各生成一份。"该不该做"——能不能读、能不能删、要不要审批——由运行时在执行时强制,而不是埋在八千行里靠运气。
 
diff --git a/content/blog/ai-wrote-your-app-dare-to-merge/index.zh-Hant.mdx b/content/blog/ai-wrote-your-app-dare-to-merge/index.zh-Hant.mdx
index 42474ae..a94dd53 100644
--- a/content/blog/ai-wrote-your-app-dare-to-merge/index.zh-Hant.mdx
+++ b/content/blog/ai-wrote-your-app-dare-to-merge/index.zh-Hant.mdx
@@ -58,7 +58,7 @@ tags: []
 + flow: refund_amount > 500 → 需財務審批
 ```
 
-這十幾行,你能逐行讀懂、能在五分鐘內評審、能一鍵回滾。更關鍵的是最後那幾處:審查不再是"我讀得完嗎",而變成了**"這條權限對不對、這個審批閾值合不合理"**——一個你真正能判斷、也該由你判斷的業務問題。那個會洩露的 `GET /api/refunds` 在這裡壓根不會出現:`support_refund` 的讀取權限被宣告為"按呼叫者權限",執行時據此強制,越權那條路從源頭就被關上了。
+這十幾行,你能逐行讀懂、能在五分鐘內評審、能一鍵回滾。更關鍵的是最後那幾處:審查不再是"我讀得完嗎",而變成了"**這條權限對不對、這個審批閾值合不合理**"——一個你真正能判斷、也該由你判斷的業務問題。那個會洩露的 `GET /api/refunds` 在這裡壓根不會出現:`support_refund` 的讀取權限被宣告為"按呼叫者權限",執行時據此強制,越權那條路從源頭就被關上了。
 
 而實現去哪了?實現屬於被反覆審計、所有應用共用的開源 **ObjectStack 執行時**,不是每個應用各生成一份。"該不該做"——能不能讀、能不能刪、要不要審批——由執行時在執行時強制,而不是埋在八千行裡靠運氣。
 
diff --git a/content/blog/airtable-omni-vs-governed-ai-app-platform/index.ja.mdx b/content/blog/airtable-omni-vs-governed-ai-app-platform/index.ja.mdx
index 10f32bf..263da98 100644
--- a/content/blog/airtable-omni-vs-governed-ai-app-platform/index.ja.mdx
+++ b/content/blog/airtable-omni-vs-governed-ai-app-platform/index.ja.mdx
@@ -30,8 +30,8 @@ tags:
 
 代わりに正確なほうを書こう。セキュリティと監査のフレームワークはコントロールを2種類に分け、あなたの監査人はその区別に従って生きている。
 
-- **検知的(detective)**コントロールは、何かが起きた*後で*それが起きたと教えてくれる。監査ログがその典型例だ。これは必要であり、Airtableはそれを備えている。
-- **予防的(preventive)**コントロールは、認可されていないことを*そもそも*起こさせない。機密な変更に対する承認ゲートがその典型例だ。
+- **検知的**(detective)コントロールは、何かが起きた*後で*それが起きたと教えてくれる。監査ログがその典型例だ。これは必要であり、Airtableはそれを備えている。
+- **予防的**(preventive)コントロールは、認可されていないことを*そもそも*起こさせない。機密な変更に対する承認ゲートがその典型例だ。
 
 「元に戻す」は*どちらでもない*。それはコントロールではなく、変更がすでに本番に出た後で動く個人的な便利機能であり、誰か一人が気づくことに依存し、*誰がその変更を許容できると判断したのか*の記録を残さない——残るのは取り消されたという事実だけだ。SOC 2の変更管理基準(CC8.1)と、あらゆる本気の変更プロセスが存在するのは、まさに機密な変更については検知的なものだけでは足りないからだ。ARRが公開されたと*発見する*ことは許されない。あなたは、承認なしに公開されることを*阻止していた*のでなければならない。
 
@@ -74,7 +74,7 @@ tags:
 
 ## その数字:認可外公開までの平均時間
 
-自分の組織について計算できる数値がある。抽象を具体にしてくれるからだ。これを**認可外公開までの平均時間(mean time to unauthorized exposure、MTUE)**と呼ぼう。AIの変更が越えてはならない一線を越えた瞬間から、それが本番から消えるまで、どれだけかかるか。
+自分の組織について計算できる数値がある。抽象を具体にしてくれるからだ。これを**認可外公開までの平均時間**(mean time to unauthorized exposure、MTUE)と呼ぼう。AIの変更が越えてはならない一線を越えた瞬間から、それが本番から消えるまで、どれだけかかるか。
 
 - **予防的**ゲートがあれば、MTUEは**構造上ゼロ**に近づく。一線を越える変更は未承認では本番に出ず、承認ステップで待つ。公開の窓を設計上なくせる。
 - **元に戻す+検知的ログ**の場合、MTUEは*検知までの時間*であり、これは正直に見積もるべきだ。最良の場合、同僚がその日の午後に気づく。現実的な場合、それは誰かがそのビューを監査するとき、あるいは四半期ごとのアクセスレビューが走るとき、あるいは——シナリオのように——外部監査人が最初に見つけるときだ。他システムへ同期するデータ(AirtableのHyperDBのデフォルトは24時間に一度の同期)では、誰かが見る前に公開が伝播しうる。
@@ -93,7 +93,7 @@ tags:
 
 予防的モデルが元を取るのは、レビューされない変更1件のコストが、変更をレビューするコストを上回るときだけだ——すなわち、機密データがあり、本物の権限モデルがあり、いずれそれを監査する誰かがいるときだ。それが線である。その下ではAirtableが実力で勝つ。その上では、「元に戻す」の差こそが評価を終わらせるものであり、しかも機能を比べる前に終わらせる。
 
-そしてもう一つ、以上のすべてとは別で、一部の買い手にとっては同じくらい決定的なものがある。**Airtableは自己ホストせず、しないと明言している。**あなたのランタイムが、データと規制当局が要求する場所——主権、エアギャップ、所在地——になければならないなら、ガバナンスの精緻さがいくらあっても助けにはならない。プラットフォームが、あなたの必要とする場所に存在できないからだ。その層の買い手にとって、比較は最初の要件で終わっている。
+そしてもう一つ、以上のすべてとは別で、一部の買い手にとっては同じくらい決定的なものがある。**Airtableは自己ホストせず、しないと明言している**。あなたのランタイムが、データと規制当局が要求する場所——主権、エアギャップ、所在地——になければならないなら、ガバナンスの精緻さがいくらあっても助けにはならない。プラットフォームが、あなたの必要とする場所に存在できないからだ。その層の買い手にとって、比較は最初の要件で終わっている。
 
 ## ObjectStackの立ち位置
 
diff --git a/content/blog/airtable-omni-vs-governed-ai-app-platform/index.ko.mdx b/content/blog/airtable-omni-vs-governed-ai-app-platform/index.ko.mdx
index eab8d68..2ec40d7 100644
--- a/content/blog/airtable-omni-vs-governed-ai-app-platform/index.ko.mdx
+++ b/content/blog/airtable-omni-vs-governed-ai-app-platform/index.ko.mdx
@@ -74,7 +74,7 @@ tags:
 
 ## 그 수치: 인가되지 않은 노출까지의 평균 시간
 
-자기 조직에 대해 계산할 수 있는 수치가 있다. 추상을 구체로 만들어 주기 때문이다. 이를 **인가되지 않은 노출까지의 평균 시간(mean time to unauthorized exposure, MTUE)**이라 부르자. AI 변경이 넘지 말아야 할 선을 넘는 순간부터, 그것이 운영에서 사라지기까지 얼마나 걸리는가.
+자기 조직에 대해 계산할 수 있는 수치가 있다. 추상을 구체로 만들어 주기 때문이다. 이를 **인가되지 않은 노출까지의 평균 시간**(mean time to unauthorized exposure, MTUE)이라 부르자. AI 변경이 넘지 말아야 할 선을 넘는 순간부터, 그것이 운영에서 사라지기까지 얼마나 걸리는가.
 
 - **예방적** 게이트가 있으면 MTUE는 **구조상 0**이다. 선을 넘는 변경은 결코 운영에 나가지 않고, 승인 단계에서 대기한다. 노출 창은 존재하지 않는다.
 - **실행 취소 + 탐지적 로그**의 경우, MTUE는 *탐지까지의 시간*이며, 이것은 정직하게 값을 매겨야 한다. 최선의 경우, 동료가 그날 오후에 알아챈다. 현실적인 경우, 그것은 누군가 그 뷰를 감사할 때, 또는 분기별 접근 검토가 돌 때, 또는 — 시나리오처럼 — 외부 감사인이 먼저 찾아낼 때다. 다른 시스템으로 동기화되는 데이터(Airtable의 HyperDB 기본값은 24시간마다 한 번 동기화)에서는, 어떤 사람이 들여다보기 전에 노출이 전파될 수 있다.
diff --git a/content/blog/airtable-omni-vs-governed-ai-app-platform/index.zh-Hans.mdx b/content/blog/airtable-omni-vs-governed-ai-app-platform/index.zh-Hans.mdx
index decd531..d2049f1 100644
--- a/content/blog/airtable-omni-vs-governed-ai-app-platform/index.zh-Hans.mdx
+++ b/content/blog/airtable-omni-vs-governed-ai-app-platform/index.zh-Hans.mdx
@@ -30,8 +30,8 @@ tags:
 
 写精确的那一种。安全与审计框架把控制分为两类,而你的审计师正是依这个区分行事:
 
-- **检测型(detective)**控制在某件事发生*之后*告诉你它发生了。审计日志就是典型例子。它是必要的,而 Airtable 有它。
-- **预防型(preventive)**控制*根本*不让未经授权的事情发生。对敏感变更设一道审批闸门就是典型例子。
+- **检测型**(detective)控制在某件事发生*之后*告诉你它发生了。审计日志就是典型例子。它是必要的,而 Airtable 有它。
+- **预防型**(preventive)控制*根本*不让未经授权的事情发生。对敏感变更设一道审批闸门就是典型例子。
 
 撤销*两者都不是*。它不是一种控制,而是一种个人便利,它在变更已经上线之后才运行,依赖某个人去注意到,而且不留下*谁判断这个变更可以接受*的记录——只留下它被回退了。SOC 2 的变更管理准则(CC8.1)以及一切认真的变更流程之所以存在,恰恰是因为对敏感变更而言,只有检测型是不够的。你不该是去*发现* ARR 被暴露了;你必须是已经阻止了它在未经签字的情况下被暴露。
 
@@ -89,7 +89,7 @@ tags:
 
 ## 这套论证*不*适用的地方
 
-为了智识上的诚实——因为这类文章的失败模式,就是假装这个取舍是免费的。预防型模型有真实的代价:**摩擦。**对每一个敏感变更都设一道审批闸门,对一个在内部追踪表上迭代的三人小队来说,恰恰是错误的人机工学。对他们而言,撤销*才是*正确的设计,表格的使用体验是真正的愉悦,而 Airtable 的模板生态和"做出第一个应用"的时间,领先于任何更重的东西——包括我们。我们不会在"做出第一个应用"的速度上去超过 Airtable,假装能超过,会是反方向上同样的不诚实。
+为了智识上的诚实——因为这类文章的失败模式,就是假装这个取舍是免费的。预防型模型有真实的代价:**摩擦**。对每一个敏感变更都设一道审批闸门,对一个在内部追踪表上迭代的三人小队来说,恰恰是错误的人机工学。对他们而言,撤销*才是*正确的设计,表格的使用体验是真正的愉悦,而 Airtable 的模板生态和"做出第一个应用"的时间,领先于任何更重的东西——包括我们。我们不会在"做出第一个应用"的速度上去超过 Airtable,假装能超过,会是反方向上同样的不诚实。
 
 预防型模型只有在一个未经审阅的变更的代价超过审阅变更的代价时才划得来——也就是说,当存在机密数据、一个真正的权限模型,以及一个终将去审计它的人时。这就是那条线。线之下,Airtable 凭实力取胜。线之上,撤销缺口才是那个终结评估的东西,而且它在功能比较之前就把评估终结了。
 
diff --git a/content/blog/airtable-omni-vs-governed-ai-app-platform/index.zh-Hant.mdx b/content/blog/airtable-omni-vs-governed-ai-app-platform/index.zh-Hant.mdx
index 8830a84..d5f6c6d 100644
--- a/content/blog/airtable-omni-vs-governed-ai-app-platform/index.zh-Hant.mdx
+++ b/content/blog/airtable-omni-vs-governed-ai-app-platform/index.zh-Hant.mdx
@@ -31,8 +31,8 @@ tags:
 
 寫精確的那一種。安全與審計框架把控制分為兩類,而你的審計師正是依這個區分行事:
 
-- **檢測型(detective)**控制在某件事發生*之後*告訴你它發生了。審計日誌就是典型例子。它是必要的,而 Airtable 有它。
-- **預防型(preventive)**控制*根本*不讓未經授權的事情發生。對敏感變更設一道審批閘門就是典型例子。
+- **檢測型**(detective)控制在某件事發生*之後*告訴你它發生了。審計日誌就是典型例子。它是必要的,而 Airtable 有它。
+- **預防型**(preventive)控制*根本*不讓未經授權的事情發生。對敏感變更設一道審批閘門就是典型例子。
 
 撤銷*兩者都不是*。它不是一種控制,而是一種個人便利,它在變更已經上線之後才執行,依賴某個人去注意到,而且不留下*誰判斷這個變更可以接受*的記錄——只留下它被回退了。SOC 2 的變更管理準則(CC8.1)以及一切認真的變更流程之所以存在,恰恰是因為對敏感變更而言,只有檢測型是不夠的。你不該是去*發現* ARR 被暴露了;你必須是已經阻止了它在未經簽字的情況下被暴露。
 
@@ -90,7 +90,7 @@ tags:
 
 ## 這套論證*不*適用的地方
 
-為了智識上的誠實——因為這類文章的失敗模式,就是假裝這個取捨是免費的。預防型模型有真實的代價:**摩擦。**對每一個敏感變更都設一道審批閘門,對一個在內部追蹤表上迭代的三人小隊來說,恰恰是錯誤的人機工學。對他們而言,撤銷*才是*正確的設計,表格的使用體驗是真正的愉悅,而 Airtable 的模板生態和"做出第一個應用"的時間,領先於任何更重的東西——包括我們。我們不會在"做出第一個應用"的速度上去超過 Airtable,假裝能超過,會是反方向上同樣的不誠實。
+為了智識上的誠實——因為這類文章的失敗模式,就是假裝這個取捨是免費的。預防型模型有真實的代價:**摩擦**。對每一個敏感變更都設一道審批閘門,對一個在內部追蹤表上迭代的三人小隊來說,恰恰是錯誤的人機工學。對他們而言,撤銷*才是*正確的設計,表格的使用體驗是真正的愉悅,而 Airtable 的模板生態和"做出第一個應用"的時間,領先於任何更重的東西——包括我們。我們不會在"做出第一個應用"的速度上去超過 Airtable,假裝能超過,會是反方向上同樣的不誠實。
 
 預防型模型只有在一個未經審閱的變更的代價超過審閱變更的代價時才划得來——也就是說,當存在機密資料、一個真正的權限模型,以及一個終將去審計它的人時。這就是那條線。線之下,Airtable 憑實力取勝。線之上,撤銷缺口才是那個終結評估的東西,而且它在功能比較之前就把評估終結了。
 
diff --git a/content/blog/business-app-in-16k-tokens/index.ja.mdx b/content/blog/business-app-in-16k-tokens/index.ja.mdx
index 3c6d5f5..4da5e6d 100644
--- a/content/blog/business-app-in-16k-tokens/index.ja.mdx
+++ b/content/blog/business-app-in-16k-tokens/index.ja.mdx
@@ -14,7 +14,7 @@ tags:
   - AI エージェント
 ---
 
-**要約:** 完全な CRM は **150,000 トークン未満**の型付きメタデータに収まります。全オブジェクト、ワークフロー、アクション、権限からなるビジネスロジックは **100,000 未満**、宣言的 UI が約 **50,000** を加えます。同梱の `app-crm` リファレンスはさらに小さく、31 ファイル・1,792 行、約 **16,000 トークン**です。この 16k はリファレンスサンプルの値であり、製品レベルの完全な CRM の上限ではありません。どちらも 200k のコンテキストウィンドウに収まります。これが**コンテキストサイズのソフトウェア(context-sized software)**です。AI エージェントは全体を保持・推論・リファクタリングし、人は diff をレビューできます。
+**要約:** 完全な CRM は **150,000 トークン未満**の型付きメタデータに収まります。全オブジェクト、ワークフロー、アクション、権限からなるビジネスロジックは **100,000 未満**、宣言的 UI が約 **50,000** を加えます。同梱の `app-crm` リファレンスはさらに小さく、31 ファイル・1,792 行、約 **16,000 トークン**です。この 16k はリファレンスサンプルの値であり、製品レベルの完全な CRM の上限ではありません。どちらも 200k のコンテキストウィンドウに収まります。これが**コンテキストサイズのソフトウェア**(context-sized software)です。AI エージェントは全体を保持・推論・リファクタリングし、人は diff をレビューできます。
 
 ## 自分で数えてみる
 
diff --git a/content/blog/business-app-in-16k-tokens/index.ko.mdx b/content/blog/business-app-in-16k-tokens/index.ko.mdx
index 17a58da..e44a57c 100644
--- a/content/blog/business-app-in-16k-tokens/index.ko.mdx
+++ b/content/blog/business-app-in-16k-tokens/index.ko.mdx
@@ -14,7 +14,7 @@ tags:
   - AI 에이전트
 ---
 
-**요약:** 완전한 CRM은 **150,000 토큰 미만**의 타입 메타데이터로 구성할 수 있습니다. 모든 객체·워크플로·액션·권한을 담은 비즈니스 로직은 **100,000 미만**, 선언형 UI는 약 **50,000**을 더합니다. 번들 `app-crm` 레퍼런스는 더 작아서 31개 파일, 1,792줄, 약 **16,000 토큰**입니다. 이 16k는 레퍼런스 샘플의 수치이지 제품 수준의 완전한 CRM 상한이 아닙니다. 둘 다 200k 컨텍스트 윈도우에 들어갑니다. 이것이 **컨텍스트 크기의 소프트웨어(context-sized software)**입니다. AI 에이전트는 앱 전체를 담고 추론하고 리팩터링하며, 사람은 diff를 리뷰합니다.
+**요약:** 완전한 CRM은 **150,000 토큰 미만**의 타입 메타데이터로 구성할 수 있습니다. 모든 객체·워크플로·액션·권한을 담은 비즈니스 로직은 **100,000 미만**, 선언형 UI는 약 **50,000**을 더합니다. 번들 `app-crm` 레퍼런스는 더 작아서 31개 파일, 1,792줄, 약 **16,000 토큰**입니다. 이 16k는 레퍼런스 샘플의 수치이지 제품 수준의 완전한 CRM 상한이 아닙니다. 둘 다 200k 컨텍스트 윈도우에 들어갑니다. 이것이 **컨텍스트 크기의 소프트웨어**(context-sized software)입니다. AI 에이전트는 앱 전체를 담고 추론하고 리팩터링하며, 사람은 diff를 리뷰합니다.
 
 ## 직접 세어 보세요
 
diff --git a/content/blog/enterprise-ontology-race-open-vs-closed/index.ja.mdx b/content/blog/enterprise-ontology-race-open-vs-closed/index.ja.mdx
index bac6e53..76df965 100644
--- a/content/blog/enterprise-ontology-race-open-vs-closed/index.ja.mdx
+++ b/content/blog/enterprise-ontology-race-open-vs-closed/index.ja.mdx
@@ -33,7 +33,7 @@ tags:
 - コンプライアンス部門に、EU 顧客データは EU 域内に留め、米国クラウドに置けないという通知が届いた。
 - 買収が完了し、Salesforce 上で動く数千社の顧客を抱えた営業組織が丸ごと加わった。
 
-こうして遠峰には**3 つの「顧客」**ができた。Fabric に 1 つ、Salesforce に 1 つ、コンプライアンス隔離された EU 環境にもう 1 つ。
+こうして遠峰には**3 つの「顧客」ができた**。Fabric に 1 つ、Salesforce に 1 つ、コンプライアンス隔離された EU 環境にもう 1 つ。
 
 転機は H グループと呼ぶ主要顧客で訪れた。ある日、営業部長が agent に尋ねた。「H グループの来年の更新リスクはどのくらい高いか」。agent は「低い」と答えた。それは Fabric のオントロジーを読んでおり、そこでは H グループの直近の受注は健全で、数字は綺麗だった。
 
@@ -138,7 +138,7 @@ MCP エンドポイントは読み取り経路であって、権利証ではな
 
 このパターン自体は新しくないが、新しい例で語る価値がある。繰り返し起きているからだ。
 
-エコシステム全体が共同で依存する「定義層」は、中立になっていく傾向がある。最も古い例は SQL だ。データベースベンダーは激しく競ったが、クエリ言語そのものは公共のままだった。より新しい例が 2 つある。中立な CNCF がホストする可観測性データ標準の **OpenTelemetry**、そして Microsoft が公開し、オープンだったからこそ多くのエディタに採用された **LSP(Language Server Protocol)**である。
+エコシステム全体が共同で依存する「定義層」は、中立になっていく傾向がある。最も古い例は SQL だ。データベースベンダーは激しく競ったが、クエリ言語そのものは公共のままだった。より新しい例が 2 つある。中立な CNCF がホストする可観測性データ標準の **OpenTelemetry**、そして Microsoft が公開し、オープンだったからこそ多くのエディタに採用された **LSP**(Language Server Protocol)である。
 
 LSP の例が特に有用なのは、Microsoft 自身がパターンを証明したからだ。定義層を開放し、最良の実装で競う方が、層を閉じるより多くの価値を生みうる。ただし LSP が実際に何を開いたかに注目してほしい——**プロトコル**と、**言語サーバーが提供すべきものの定義**だ。オントロジーについては、MCP が前半を済ませた。Apache Ossie が分析部分の後半に挑んでいる。そして「動く」部分については、まだ誰もやっていない。
 
diff --git a/content/blog/enterprise-ontology-race-open-vs-closed/index.ko.mdx b/content/blog/enterprise-ontology-race-open-vs-closed/index.ko.mdx
index d514e24..711ed7a 100644
--- a/content/blog/enterprise-ontology-race-open-vs-closed/index.ko.mdx
+++ b/content/blog/enterprise-ontology-race-open-vs-closed/index.ko.mdx
@@ -33,7 +33,7 @@ tags:
 - 컴플라이언스 부서에 EU 고객 데이터는 EU에 머물러야 하며 미국 클라우드에 둘 수 없다는 통지가 왔다.
 - 인수가 마무리되며 Salesforce 위에서 돌아가는 수천 개 고객사의 영업 조직이 통째로 들어왔다.
 
-그렇게 위안펑에는 **세 개의 "고객"**이 생겼다. Fabric에 하나, Salesforce에 하나, 컴플라이언스로 격리된 EU 환경에 또 하나.
+그렇게 위안펑에는 **세 개의 "고객"이 생겼다**. Fabric에 하나, Salesforce에 하나, 컴플라이언스로 격리된 EU 환경에 또 하나.
 
 전환점은 H 그룹이라 부를 핵심 고객에서 왔다. 어느 날 영업 총괄이 agent에게 물었다. "H 그룹의 내년 갱신 리스크는 얼마나 높습니까?" agent는 "낮습니다"라고 답했다. 그것은 Fabric 온톨로지를 읽고 있었고, 거기서 H 그룹의 최근 수주는 건강했으며 숫자는 보기 좋았다.
 
@@ -138,7 +138,7 @@ MCP 엔드포인트는 읽기 경로이지 소유권 증서가 아니다. 당신
 
 패턴 자체는 새롭지 않지만 새 사례로 말할 가치가 있다. 계속 반복되고 있기 때문이다.
 
-생태계 전체가 함께 의존하는 "정의 계층"은 중립으로 가는 경향이 있다. 가장 오래된 예는 SQL이다. 데이터베이스 벤더는 치열하게 경쟁했지만 질의 언어 자체는 공공으로 남았다. 더 최근의 두 예는 중립적인 CNCF가 호스팅하는 관측성 데이터 표준 **OpenTelemetry**, 그리고 Microsoft가 공개했고 열려 있었기 때문에 많은 에디터가 채택한 **LSP(Language Server Protocol)**다.
+생태계 전체가 함께 의존하는 "정의 계층"은 중립으로 가는 경향이 있다. 가장 오래된 예는 SQL이다. 데이터베이스 벤더는 치열하게 경쟁했지만 질의 언어 자체는 공공으로 남았다. 더 최근의 두 예는 중립적인 CNCF가 호스팅하는 관측성 데이터 표준 **OpenTelemetry**, 그리고 Microsoft가 공개했고 열려 있었기 때문에 많은 에디터가 채택한 **LSP**(Language Server Protocol)다.
 
 LSP 사례가 특히 유용한 것은 Microsoft 자신이 그 패턴을 증명했기 때문이다. 정의 계층을 열고 최고의 구현으로 경쟁하는 편이 계층을 걸어 잠그는 것보다 더 큰 가치를 만들 수 있다. 다만 LSP가 실제로 무엇을 열었는지 보라 — **프로토콜**, 그리고 **언어 서버가 무엇을 제공해야 하는지에 대한 정의**다. 온톨로지에 대해서는 MCP가 앞의 절반을 해냈다. Apache Ossie가 분석 부분의 뒤 절반을 시도하고 있다. 그리고 행위하는 부분은 아직 아무도 하지 않았다.
 
diff --git a/content/blog/enterprise-ontology-race-open-vs-closed/index.zh-Hans.mdx b/content/blog/enterprise-ontology-race-open-vs-closed/index.zh-Hans.mdx
index cb34f2b..a6fb5ad 100644
--- a/content/blog/enterprise-ontology-race-open-vs-closed/index.zh-Hans.mdx
+++ b/content/blog/enterprise-ontology-race-open-vs-closed/index.zh-Hans.mdx
@@ -140,7 +140,7 @@ MCP 端点是一条读取通道,不是一张地契。你的 agent 得到了一
 
 被整个生态共同依赖的"定义层",最终都会走向中立。最老的例子是 SQL:数据库厂商杀成红海,可查询语言本身是公共的。更近的两个例子是 **OpenTelemetry**——可观测性的数据标准,由中立的 CNCF 托管;以及 **LSP(语言服务协议)**——微软自己开的,却恰恰因为开放,被众多编辑器采纳。
 
-LSP 这个例子尤其值得玩味,因为它是微软亲手证明的一件事:把定义层开放出去、自己靠最好的实现去赚钱,比把它锁死更赢。但要注意 LSP 到底开放了什么——**协议**,以及**"一个语言服务必须提供什么"的定义**。对本体来说,MCP 做完了前一半;Apache Ossie 正在尝试做分析部分的后一半。而"会动作"的那一部分,还没有任何人做过。
+LSP 这个例子尤其值得玩味,因为它是微软亲手证明的一件事:把定义层开放出去、自己靠最好的实现去赚钱,比把它锁死更赢。但要注意 LSP 到底开放了什么——**协议**,以及"**一个语言服务必须提供什么**"的定义。对本体来说,MCP 做完了前一半;Apache Ossie 正在尝试做分析部分的后一半。而"会动作"的那一部分,还没有任何人做过。
 
 一个同时被你的应用、你的 agent、你的审计系统,外加五家厂商的工具依赖的层,不可能长期归其中任何一方私有,除非你接受它持续制造远峰那样的分裂。
 
diff --git a/content/blog/enterprise-ontology-race-open-vs-closed/index.zh-Hant.mdx b/content/blog/enterprise-ontology-race-open-vs-closed/index.zh-Hant.mdx
index 6aacd06..224f477 100644
--- a/content/blog/enterprise-ontology-race-open-vs-closed/index.zh-Hant.mdx
+++ b/content/blog/enterprise-ontology-race-open-vs-closed/index.zh-Hant.mdx
@@ -141,7 +141,7 @@ MCP 端點是一條讀取通道,不是一張地契。你的 agent 得到了一
 
 被整個生態共同依賴的"定義層",最終都會走向中立。最老的例子是 SQL:資料庫廠商殺成紅海,可查詢語言本身是公共的。更近的兩個例子是 **OpenTelemetry**——可觀測性的資料標準,由中立的 CNCF 託管;以及 **LSP(語言服務協議)**——微軟自己開的,卻恰恰因為開放,被眾多編輯器採納。
 
-LSP 這個例子尤其值得玩味,因為它是微軟親手證明的一件事:把定義層開放出去、自己靠最好的實現去賺錢,比把它鎖死更贏。但要注意 LSP 到底開放了什麼——**協議**,以及**"一個語言服務必須提供什麼"的定義**。對本體來說,MCP 做完了前一半;Apache Ossie 正在嘗試做分析部分的後一半。而"會動作"的那一部分,還沒有任何人做過。
+LSP 這個例子尤其值得玩味,因為它是微軟親手證明的一件事:把定義層開放出去、自己靠最好的實現去賺錢,比把它鎖死更贏。但要注意 LSP 到底開放了什麼——**協議**,以及"**一個語言服務必須提供什麼**"的定義。對本體來說,MCP 做完了前一半;Apache Ossie 正在嘗試做分析部分的後一半。而"會動作"的那一部分,還沒有任何人做過。
 
 一個同時被你的應用、你的 agent、你的審計系統,外加五家廠商的工具依賴的層,不可能長期歸其中任何一方私有,除非你接受它持續製造遠峰那樣的分裂。
 
diff --git a/content/blog/forward-deployed-engineer-tools/index.ja.mdx b/content/blog/forward-deployed-engineer-tools/index.ja.mdx
index 094cc76..04c8cea 100644
--- a/content/blog/forward-deployed-engineer-tools/index.ja.mdx
+++ b/content/blog/forward-deployed-engineer-tools/index.ja.mdx
@@ -149,7 +149,7 @@ HotCRM はこの語彙の完全な使用例です:15 オブジェクト、17 フ
 | **6 月 30 日** | AWS がフォワードデプロイドエンジニアリング部門に **10 億ドル**をコミット。5〜6 名のポッドを顧客内部に常駐させる | [CNBC](https://www.cnbc.com/2026/06/30/aws-amazon-ai-forward-deployed-engineers.html) |
 | **7 月 2 日** | Microsoft が Frontier を立ち上げ — **25 億ドル、6,000 名** — 同じ仕事のために | [CNBC](https://www.cnbc.com/2026/07/02/microsoft-commits-2point5-billion-6000-employees-ai-implementation-unit.html) |
 
-この波と一緒に出回る数字がもう 2 つあり、それらは復唱ではなく出所の明示に値します。**FDE 求人票の前年比 +1,165%** は Live Data Technologies の集計を [Paraform](https://www.paraform.com/blog/forward-deployed-engineer-demand-quadrupled) が伝えたもの — FDE 採用を商売にしている採用マーケットプレイスです — そして数えているのは求人票であって、充足されたポジションではありません。**Salesforce の「1,000 名の FDE チーム」**は [Salesforce 自身のブログ](https://www.salesforce.com/blog/forward-deployed-engineer/)発。意思表明であって、開示された人員数ではありません。どちらも方向としては本物で、どちらも監査は受けていません。
+この波と一緒に出回る数字がもう 2 つあり、それらは復唱ではなく出所の明示に値します。**FDE 求人票の前年比 +1,165%** は Live Data Technologies の集計を [Paraform](https://www.paraform.com/blog/forward-deployed-engineer-demand-quadrupled) が伝えたもの — FDE 採用を商売にしている採用マーケットプレイスです — そして数えているのは求人票であって、充足されたポジションではありません。**Salesforce の「1,000 名の FDE チーム」は** [Salesforce 自身のブログ](https://www.salesforce.com/blog/forward-deployed-engineer/)発。意思表明であって、開示された人員数ではありません。どちらも方向としては本物で、どちらも監査は受けていません。
 
 さて、実務にとって重要なのはここからです。あの表のコミットメントはすべて、**エンジニアとドル**で表示されています。2 回目のデプロイメントが 1 回目より安くなるかどうかを決めるもの — *エンジニアのアウトプットが何に書き込まれるのか* — で表示されたものは 1 つもありません。Palantir のメソッドが効くのは、FDE が顧客専用オントロジーに書き込み、アプリケーションがそこから導出されるからです — 基盤こそが製品であり、エンジニアはそれが顧客に届く経路です。まったく同じ人材を、基盤のない組織に採用しても、外から見た仕事は 1 年ほどはまったく同じに見えます。
 
diff --git a/content/blog/forward-deployed-engineer-tools/index.ko.mdx b/content/blog/forward-deployed-engineer-tools/index.ko.mdx
index 9452e76..befc5cc 100644
--- a/content/blog/forward-deployed-engineer-tools/index.ko.mdx
+++ b/content/blog/forward-deployed-engineer-tools/index.ko.mdx
@@ -149,7 +149,7 @@ HotCRM이 이 어휘의 완전한 사용례입니다: 15개 객체, 17개 플로
 | **6월 30일** | AWS가 포워드 디플로이드 엔지니어링 조직에 **10억 달러**를 투입하고, 5~6명 단위 팀을 고객 내부에 상주시킴 | [CNBC](https://www.cnbc.com/2026/06/30/aws-amazon-ai-forward-deployed-engineers.html) |
 | **7월 2일** | Microsoft가 Frontier를 출범 — **25억 달러와 6,000명** — 같은 일을 위해 | [CNBC](https://www.cnbc.com/2026/07/02/microsoft-commits-2point5-billion-6000-employees-ai-implementation-unit.html) |
 
-이 물결과 함께 도는 숫자가 둘 더 있는데, 되풀이하기보다 출처를 밝히는 편이 옳습니다. **FDE 채용 공고 전년 대비 +1,165%**는 Live Data Technologies의 집계를 [Paraform](https://www.paraform.com/blog/forward-deployed-engineer-demand-quadrupled)이 전달한 것으로 — FDE 채용을 사업으로 하는 채용 마켓플레이스입니다 — 세는 대상은 공고이지 채워진 자리가 아닙니다. **Salesforce의 "1,000명 FDE 팀"**은 [Salesforce 자체 블로그](https://www.salesforce.com/blog/forward-deployed-engineer/)에서 나온 것으로, 공시된 인원이 아니라 의향 표명입니다. 둘 다 방향으로는 사실이고, 둘 다 감사받지 않았습니다.
+이 물결과 함께 도는 숫자가 둘 더 있는데, 되풀이하기보다 출처를 밝히는 편이 옳습니다. **FDE 채용 공고 전년 대비 +1,165%는** Live Data Technologies의 집계를 [Paraform](https://www.paraform.com/blog/forward-deployed-engineer-demand-quadrupled)이 전달한 것으로 — FDE 채용을 사업으로 하는 채용 마켓플레이스입니다 — 세는 대상은 공고이지 채워진 자리가 아닙니다. **Salesforce의 "1,000명 FDE 팀"은** [Salesforce 자체 블로그](https://www.salesforce.com/blog/forward-deployed-engineer/)에서 나온 것으로, 공시된 인원이 아니라 의향 표명입니다. 둘 다 방향으로는 사실이고, 둘 다 감사받지 않았습니다.
 
 이제 일하는 사람에게 중요한 부분입니다. 저 표의 모든 약속은 **엔지니어와 달러**로 표시되어 있습니다. 두 번째 배포가 첫 번째보다 싸질지를 결정하는 것 — *엔지니어의 산출물이 무엇에 쓰이는가* — 으로 표시된 것은 하나도 없습니다. Palantir의 방법이 통하는 이유는 FDE가 고객 전용 온톨로지에 쓰고 애플리케이션이 거기서 파생되기 때문입니다 — 기반이 곧 제품이고, 엔지니어는 그것이 고객에게 닿는 경로입니다. 똑같은 사람을 기반 없는 조직에 채용해도, 바깥에서 보는 일의 모습은 1년쯤은 똑같습니다.
 
diff --git a/content/blog/vibe-coding-technical-debt-2026/index.zh-Hans.mdx b/content/blog/vibe-coding-technical-debt-2026/index.zh-Hans.mdx
index 79b18d6..e19c948 100644
--- a/content/blog/vibe-coding-technical-debt-2026/index.zh-Hans.mdx
+++ b/content/blog/vibe-coding-technical-debt-2026/index.zh-Hans.mdx
@@ -34,7 +34,7 @@ tags: []
 
 AI 生成的代码把这个最后的兜底也抽走了。它的"作者"是一个无状态的模型,生成完那一刻就不存在了。它没有把可追溯的设计判断留下来,于是你手上是一坨**能跑、但谁都无法解释、也无人可问**的实现。明享那一万两千行,就是这种债——它不欠在代码质量上,欠在"再也没人真正理解它"上。
 
-把它叫作**理解债(comprehension debt)**更准确:系统能跑,但组织没有真正理解它。速度是真的,债也是真的——只是债不在交付那天结账,而是在第七个月、第一条业务规则改变时找上门。
+把它叫作**理解债**(comprehension debt)更准确:系统能跑,但组织没有真正理解它。速度是真的,债也是真的——只是债不在交付那天结账,而是在第七个月、第一条业务规则改变时找上门。
 
 ## 可代码生成不是在飞速变好吗?
 
diff --git a/content/blog/vibe-coding-technical-debt-2026/index.zh-Hant.mdx b/content/blog/vibe-coding-technical-debt-2026/index.zh-Hant.mdx
index 3fbb4d1..c02a3c9 100644
--- a/content/blog/vibe-coding-technical-debt-2026/index.zh-Hant.mdx
+++ b/content/blog/vibe-coding-technical-debt-2026/index.zh-Hant.mdx
@@ -35,7 +35,7 @@ tags: []
 
 AI 生成的程式碼把這個最後的兜底也抽走了。它的"作者"是一個無狀態的模型,生成完那一刻就不存在了。它沒有把可追溯的設計判斷留下來,於是你手上是一坨**能跑、但誰都無法解釋、也無人可問**的實現。明享那一萬兩千行,就是這種債——它不欠在程式碼質量上,欠在"再也沒人真正理解它"上。
 
-把它叫作**理解債(comprehension debt)**更準確:系統能跑,但組織沒有真正理解它。速度是真的,債也是真的——只是債不在交付那天結賬,而是在第七個月、第一條業務規則改變時找上門。
+把它叫作**理解債**(comprehension debt)更準確:系統能跑,但組織沒有真正理解它。速度是真的,債也是真的——只是債不在交付那天結賬,而是在第七個月、第一條業務規則改變時找上門。
 
 ## 可程式碼生成不是在飛速變好嗎?
 
diff --git a/content/blog/when-ai-agent-deletes-production-database/index.ja.mdx b/content/blog/when-ai-agent-deletes-production-database/index.ja.mdx
index 9dad0f6..6708076 100644
--- a/content/blog/when-ai-agent-deletes-production-database/index.ja.mdx
+++ b/content/blog/when-ai-agent-deletes-production-database/index.ja.mdx
@@ -34,7 +34,7 @@ tags:
 
 ほとんどのエージェント開発者はこれらを一つに潰してしまう。エージェントには広い能力(あなたのデータベースの読み書き、マイグレーションの実行、デプロイ)が手渡される——*その広さこそがエージェントを有用にするから*だ——そして「ただし本番には触れるな」へと狭め直すことは、プロンプトに委ねられる。プロンプトは助言にすぎない。Replitのエージェントは本番に触れるなと告げられたが、それでも本番に触れ、そしてそれを隠した。プロンプトで硬い限界に到達することはできない。プロンプトは要求であり、モデルはそれを自由に読み違え、上書きし、あるいは——ここでのように——事後に取り繕うことができるからだ。
 
-タスクが必要とする以上の権限を代理人に与えるという障害モードに、セキュリティには名前がある——**confused deputy(混乱した代理人)**であり、その修正策はアクセス制御と同じくらい古い——**least privilege(最小権限)**だ。エージェントは危険なことを*できない*スコープ化されたアイデンティティの下で動作すべきであり、そうすればモデルがそれを*したい*かどうかは無関係になる。「テーブルを削除するな」は指示だ。「このアイデンティティはテーブルを削除する付与を持たず、いかなる破壊的アクションも人間の承認を必要とする」はガードレールだ。モデルが間違っているとき持ちこたえるのは後者だけだ。
+タスクが必要とする以上の権限を代理人に与えるという障害モードに、セキュリティには名前がある——**confused deputy**(混乱した代理人)であり、その修正策はアクセス制御と同じくらい古い——**least privilege**(最小権限)だ。エージェントは危険なことを*できない*スコープ化されたアイデンティティの下で動作すべきであり、そうすればモデルがそれを*したい*かどうかは無関係になる。「テーブルを削除するな」は指示だ。「このアイデンティティはテーブルを削除する付与を持たず、いかなる破壊的アクションも人間の承認を必要とする」はガードレールだ。モデルが間違っているとき持ちこたえるのは後者だけだ。
 
 ## なぜ「より賢いモデル」は事態を改善せず、悪化させるのか
 
diff --git a/content/blog/when-ai-agent-deletes-production-database/index.zh-Hans.mdx b/content/blog/when-ai-agent-deletes-production-database/index.zh-Hans.mdx
index 659505a..214ef38 100644
--- a/content/blog/when-ai-agent-deletes-production-database/index.zh-Hans.mdx
+++ b/content/blog/when-ai-agent-deletes-production-database/index.zh-Hans.mdx
@@ -58,7 +58,7 @@ Replit 回应得很好,这一点你必须诚实地予以肯定:它道了歉
 
 要诚实地看待这个取舍,因为最小权限并非免费。对于一个单打独斗的构建者,或者一个启动全新项目、背后没有任何不可替代之物的团队来说,一个能从提示词直接生成一个上线、托管好的 app 的高能力智能体,确实是真正变革性的——而 Replit 把这件事做得不输任何人。当影响半径只是一个用完即弃的项目时,宽泛的权限是一项特性,而批准门控则是纯粹的摩擦,你完全有理由对它心生不满。
 
-但这套算法在智能体开始针对一个**记录系统(system of record)**运作的那一刻就反转了——真实的客户、真实的资金、无法重新生成的真实历史(而"重新生成"在这句话里承担着令人痛苦的分量,想想那 4000 行假数据)。在那里,"智能体能做开发者能做的任何事"不是一项特性;它是一项无界的负债,而值得为之付费的修复方案是架构性的那些,而不是动机性的那些。
+但这套算法在智能体开始针对一个**记录系统**(system of record)运作的那一刻就反转了——真实的客户、真实的资金、无法重新生成的真实历史(而"重新生成"在这句话里承担着令人痛苦的分量,想想那 4000 行假数据)。在那里,"智能体能做开发者能做的任何事"不是一项特性;它是一项无界的负债,而值得为之付费的修复方案是架构性的那些,而不是动机性的那些。
 
 ## ObjectStack 的立场
 
diff --git a/content/blog/when-ai-agent-deletes-production-database/index.zh-Hant.mdx b/content/blog/when-ai-agent-deletes-production-database/index.zh-Hant.mdx
index 9d8a341..708ab55 100644
--- a/content/blog/when-ai-agent-deletes-production-database/index.zh-Hant.mdx
+++ b/content/blog/when-ai-agent-deletes-production-database/index.zh-Hant.mdx
@@ -59,7 +59,7 @@ Replit 回應得很好,這一點你必須誠實地予以肯定:它道了歉
 
 要誠實地看待這個取捨,因為最小權限並非免費。對於一個單打獨鬥的構建者,或者一個啟動全新專案、背後沒有任何不可替代之物的團隊來說,一個能從提示詞直接生成一個上線、託管好的 app 的高能力智慧體,確實是真正變革性的——而 Replit 把這件事做得不輸任何人。當影響半徑只是一個用完即棄的專案時,寬泛的權限是一項特性,而批准門控則是純粹的摩擦,你完全有理由對它心生不滿。
 
-但這套演算法在智慧體開始針對一個**記錄系統(system of record)**運作的那一刻就反轉了——真實的客戶、真實的資金、無法重新生成的真實歷史(而"重新生成"在這句話裡承擔著令人痛苦的分量,想想那 4000 行假資料)。在那裡,"智慧體能做開發者能做的任何事"不是一項特性;它是一項無界的負債,而值得為之付費的修復方案是架構性的那些,而不是動機性的那些。
+但這套演算法在智慧體開始針對一個**記錄系統**(system of record)運作的那一刻就反轉了——真實的客戶、真實的資金、無法重新生成的真實歷史(而"重新生成"在這句話裡承擔著令人痛苦的分量,想想那 4000 行假資料)。在那裡,"智慧體能做開發者能做的任何事"不是一項特性;它是一項無界的負債,而值得為之付費的修復方案是架構性的那些,而不是動機性的那些。
 
 ## ObjectStack 的立場
 

From f41147fd61f4596b19ff712eb6c73abda74a1a06 Mon Sep 17 00:00:00 2001
From: Claude 
Date: Thu, 3 Sep 2026 03:45:31 +0000
Subject: [PATCH 2/2] content-lint: gate literal ** in rendered prose, read
 from built HTML
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Nothing in the chain saw the defect the previous commit repaired: the
markdown is valid, so this script's MDX pass, `astro check`, `astro
build` and `seo:smoke` all pass on a post that renders `**` to the
reader. Without a gate the next translated post reintroduces it silently,
and only a reader of the CJK locales would ever notice.

`content-lint.mjs --dist` reads the BUILT HTML and fails when a blog page
carries a literal `**` outside ``/`
`. Two properties it is
built on:

  * it asserts over `dist/`, after `astro build`, because the defect
    exists only in rendered output — an MDX-level check would have to
    re-implement CommonMark's flanking rule tolerantly, and a tolerant
    re-parse of the thing being gated is how a gate stops gating;
  * the ``/`
` exclusion is structural, not a regex that hopes.
    The emitted HTML is parsed and those elements skipped. Real pages
    depend on it: `138****5678` is a masked phone number and
    an English post quotes `**` in a snippet — both correct, both green.

A run that measured nothing fails rather than passes: no `dist/`, or a
`dist/` with no blog pages, reports the reason and exits non-zero, so the
gate cannot go quietly green if the build layout moves.

Wired into `pnpm build` after `astro build`, which is why package.json
moves here too — CI already runs `pnpm build`, so no workflow change.

Part of #174

Co-Authored-By: Claude Opus 5 
Claude-Session: https://claude.ai/code/session_01FeA1nwBz1ohH65dvffUGKr
---
 package.json             |   2 +-
 scripts/content-lint.mjs | 209 ++++++++++++++++++++++++++++++++++++++-
 2 files changed, 209 insertions(+), 2 deletions(-)

diff --git a/package.json b/package.json
index b1213ba..c9868f9 100644
--- a/package.json
+++ b/package.json
@@ -13,7 +13,7 @@
     "gen:zh-hant": "node scripts/gen-zh-hant.mjs",
     "content:lint": "node scripts/content-lint.mjs",
     "seo:smoke": "node scripts/seo-smoke.mjs",
-    "build": "node scripts/gen-zh-hant.mjs && node scripts/content-lint.mjs --published && astro build",
+    "build": "node scripts/gen-zh-hant.mjs && node scripts/content-lint.mjs --published && astro build && node scripts/content-lint.mjs --dist",
     "preview": "astro preview",
     "check": "astro check"
   },
diff --git a/scripts/content-lint.mjs b/scripts/content-lint.mjs
index c36c85d..4a5a5eb 100644
--- a/scripts/content-lint.mjs
+++ b/scripts/content-lint.mjs
@@ -2,7 +2,9 @@
 // Deterministic content checks for the blog publishing gate.
 //
 // Default behavior checks every MDX file. Use `--published` in CI/builds to
-// skip archived content and check only indexable content.
+// skip archived content and check only indexable content. `--dist` is a
+// separate mode that checks the BUILT HTML instead of the sources; it runs
+// after `astro build` (see the `build` script in package.json).
 
 import { readdir, readFile, access } from 'node:fs/promises';
 import path from 'node:path';
@@ -23,6 +25,211 @@ today.setHours(23, 59, 59, 999);
 
 const VALID_STATUS = new Set(['published', 'archived']);
 
+// ─── Built HTML: no literal `**` in rendered prose ────────────────────────
+//
+// A `**bold**` span whose delimiter touches CJK punctuation on the inside and
+// a CJK letter on the outside is not a flanking delimiter run, so CommonMark
+// emits the asterisks verbatim and the reader sees `**` mid-sentence. It is
+// not a renderer bug and the markdown is valid, which is exactly why nothing
+// else here catches it: this script's MDX pass, `astro check`, `astro build`
+// and `seo:smoke` all pass on a post that renders broken. English almost never
+// trips it because English puts a space next to the delimiter; the four CJK
+// locales — the ones least likely to have a reader who reports it — trip it
+// constantly. An audit at 4dd647c found 24 built pages in that state.
+//
+// Two decisions this check is deliberately built on:
+//
+//   * It reads the BUILT HTML, not the MDX. The defect exists only in rendered
+//     output, so an MDX-level heuristic would have to re-implement CommonMark's
+//     flanking rule tolerantly — and a tolerant re-parse of the thing being
+//     gated is how a gate silently stops gating. The renderer's own output is
+//     the only source that cannot disagree with the renderer.
+//   * The ``/`
` exclusion is STRUCTURAL — the emitted HTML is parsed
+//     and those elements skipped — not a regex hoping to spot a code fence.
+//     Real pages depend on it: `138****5678` is a masked phone
+//     number, and an English post quotes `**` in a snippet. Both are correct,
+//     and a regex that tried to except them by pattern would either miss them
+//     or punch a hole a real defect could hide in.
+const DIST = path.join(ROOT, 'dist');
+
+/** Elements whose text is not prose: never scanned. */
+const SKIP_ELEMENTS = new Set(['code', 'pre']);
+
+/**
+ * HTML elements whose content is raw text rather than markup. Their bodies are
+ * scripts and stylesheets, not anything a reader reads, and `**` is ordinary
+ * there (`a ** b` is exponentiation). Skipped for the same reason as the two
+ * above: the rule is about rendered prose.
+ */
+const RAW_TEXT_ELEMENTS = new Set(['script', 'style', 'textarea', 'title']);
+
+/** Index of the `>` closing a tag, honouring quoted attribute values. */
+function tagEnd(html, from) {
+  let quote = null;
+  for (let i = from; i < html.length; i++) {
+    const c = html[i];
+    if (quote) {
+      if (c === quote) quote = null;
+    } else if (c === '"' || c === "'") {
+      quote = c;
+    } else if (c === '>') {
+      return i;
+    }
+  }
+  return -1;
+}
+
+/**
+ * Text nodes of a document that are prose: outside ``/`
` and outside
+ * raw-text elements. Returns `{ index, text }` so a hit can be reported with
+ * the surrounding sentence.
+ */
+function proseTextNodes(html) {
+  const nodes = [];
+  let i = 0;
+  let skipDepth = 0;
+  while (i < html.length) {
+    const lt = html.indexOf('<', i);
+    if (lt === -1) {
+      if (skipDepth === 0) nodes.push({ index: i, text: html.slice(i) });
+      break;
+    }
+    if (lt > i && skipDepth === 0) nodes.push({ index: i, text: html.slice(i, lt) });
+    if (html.startsWith('', lt + 4);
+      i = end === -1 ? html.length : end + 3;
+      continue;
+    }
+    if (html.startsWith('/blog//index.html`. */
+async function builtBlogPages(dir) {
+  const pages = [];
+  let entries;
+  try {
+    entries = await readdir(dir, { withFileTypes: true });
+  } catch {
+    return pages;
+  }
+  for (const entry of entries) {
+    const full = path.join(dir, entry.name);
+    if (entry.isDirectory()) pages.push(...(await builtBlogPages(full)));
+    else if (entry.name === 'index.html' && /(^|[\\/])blog[\\/]/.test(path.relative(DIST, full))) {
+      pages.push(full);
+    }
+  }
+  return pages;
+}
+
+/**
+ * The gate. Returns the process exit code.
+ *
+ * A run that measured nothing is a failure, not a pass: with no `dist/`, or a
+ * `dist/` holding no blog pages, "no page contains `**`" is true and means
+ * nothing. Reporting that as green is how this gate would quietly stop gating
+ * the day the build layout moves.
+ */
+async function checkBuiltProse() {
+  const pages = await builtBlogPages(DIST);
+  if (pages.length === 0) {
+    console.error(
+      `✗ content lint --dist found no built blog pages under ${path.relative(ROOT, DIST)}/.\n` +
+        `  This mode reads the rendered HTML, so it must run AFTER \`astro build\` — ` +
+        `\`pnpm build\` wires it in that order.\n` +
+        `  Nothing was checked, which is not the same as nothing being wrong.`
+    );
+    return 1;
+  }
+
+  const offenders = [];
+  for (const page of pages.sort()) {
+    const html = await readFile(page, 'utf8');
+    const hits = [];
+    for (const node of proseTextNodes(html)) {
+      const text = decodeAsterisks(node.text);
+      let at = text.indexOf('**');
+      while (at !== -1) {
+        const from = Math.max(0, at - 60);
+        hits.push(text.slice(from, at + 60).replace(/\s+/g, ' ').trim());
+        at = text.indexOf('**', at + 2);
+      }
+    }
+    if (hits.length > 0) offenders.push({ page: path.relative(DIST, page), hits });
+  }
+
+  if (offenders.length === 0) {
+    console.log(
+      `✓ content lint --dist passed (${pages.length} built blog page${pages.length === 1 ? '' : 's'} checked)`
+    );
+    return 0;
+  }
+
+  for (const { page, hits } of offenders) {
+    console.log(`✗ ${page}: ${hits.length} literal ** in rendered prose`);
+    for (const hit of hits) console.log(`    …${hit}…`);
+  }
+  console.error(
+    `\n✗ content lint --dist failed (${offenders.length} page${offenders.length === 1 ? '' : 's'} of ` +
+      `${pages.length} render a literal **)\n` +
+      `  A bold span did not close. CommonMark closes \`**\` only on a flanking delimiter run: ` +
+      `a closing run preceded by punctuation must also be followed by whitespace or punctuation, ` +
+      `and an opening run followed by punctuation must be preceded by whitespace or punctuation. ` +
+      `CJK prose puts a letter where English puts a space, so a delimiter sitting against ` +
+      `()「」。:" does not pair.\n` +
+      `  Fix it by MOVING the delimiter, never by deleting the emphasis:\n` +
+      `    **用語(gloss)**は…   ->  **用語**(gloss)は…      (past a trailing gloss)\n` +
+      `    …しか呼べない。**モ    ->  …しか呼べない**。モ       (inside sentence punctuation)\n` +
+      `    **"引用"**の…          ->  "**引用**"の…             (inside the quotes)\n` +
+      `  Edit the authored locale; zh-Hant is generated by \`pnpm gen:zh-hant\`.`
+  );
+  return 1;
+}
+
+if (args.has('--dist')) {
+  exit(await checkBuiltProse());
+}
+
 // The frontmatter taxonomy, derived from the module that declares it instead of
 // restated here. `src/lib/term-data.ts` holds the same rows `src/content.config.ts`
 // turns into its Zod enums (through `slugsByGroup` in `src/lib/terms.ts`), so one