Skip to content

配置系统概览

本页中的所有地址都适用于 libtpu-0.0.40-cp314 wheel 中的 libtpu.so(构建 libtpu_lts_20260413_b_RC00,build-id md5 89edbbe81c5b328a958fe628a9f2207d,781,691,048 字节,ELF x86-64 DYN,未 strip;反混淆后的 C++ 符号按原样引用)。其他版本会有所不同。

摘要

libtpu 没有自己的命令行参数,它是一个由 JAX/PJRT 加载的 .so,但它几乎完全由命令行风格的 flag 配置。配置系统就是把用户提供的字符串转换成某个 TPU 世代上的有效编译决策的机制。它分为三层,本页是单个旋钮如何穿过这三层的路线图。**第 1 层(flag 摄取)**从 LIBTPU_INIT_ARGS 环境变量构造一个 argv,交给 absl::ParseCommandLine,后者把值绑定到约 2048 个 absl::Flag<T> FLAGS_<name> 全局对象上;这些对象已由 dlopen 构造函数风暴预先注册。**第 2 层(两个 proto)**是绑定后的 flag 变成结构化配置的位置:通用 xla_* flag 落入 xla::DebugOptions(290 个 wire-field,是 XLA 在 CPU/GPU/TPU 之间共享的 proto),TPU 私有的 xla_tpu_* / xla_jf_* / megascale_* flag 落入 TpuCompilationEnvironment(TCE),这是一个 1121 字段的主 proto,其中每个字段都是一个已注册 flag。**第 3 层(AUTO 解析器)**是没有 LLVM 类比物的部分:约 330 个 TCE 字段不是普通值,而是通过 AutoOr<T> 三态(AUTO / ENABLED / DISABLED)读取的 AutoProto oneof,约 130 个手写访问器用每个旋钮自己的极性把这个三态折叠成具体值;这个极性就是文档化默认值。

重实现者的参照框架是 XLA 自己的 flag 系统,但有两个 TPU 特有的转折。第一,flag 注册表是在加载时构建的,而不是解析时构建的:ParseCommandLine 只会把值绑定到构造函数风暴已经填好的表上,所以如果重实现把 flag 注册推迟到 init 阶段,就没有可解析的目标。第二,一个旋钮的“默认值”不是单个数字:对约 330 个 AutoProto 字段来说,它是烘焙在每个消费者中的解析规则AUTO→off 与 AUTO→on);在此之上,每 codename 的 MSA overlay 又会按 TpuVersion 重写一组字段。JAX 用户实际得到的有效值是 flag-default ⊕ AUTO-resolution-polarity ⊕ per-version-overlay,并在消费者处惰性求值。

本页是一张地图,不是手册。它帮助读者定位三层结构、经注册表中介的分发,以及 TpuVersion 感知的前缀处理,然后交给拥有各子领域细节的兄弟页面。不要在这里寻找 flag 图谱、字段字典或字节级解析器表;它们都在下方链接中,并各自负责自己的内部细节。

对重实现而言,契约是:

  • flag→DebugOptions→TCE→effective-value 流水线 —— 一个旋钮经过的四个阶段,以及每个交接点由哪个符号负责。
  • 两个 proto —— 什么落入 DebugOptions,什么落入 TpuCompilationEnvironment,以及为什么 xla_tpu_* 家族不是 DebugOptions 字段。
  • AUTO 解析器 —— 约 330 个 TCE 字段通过 AutoOr<T> 三态解析,其极性编码了默认值,而 per-version overlay 在最后完成工作。
flag 摄取tensorflow::tpu::GetLibTpuInitArguments @ 0x20ccca20absl::ParseCommandLine(在 RealInitGoogle @ 0x210ae860 内部)
环境变量漏斗LIBTPU_INIT_ARGS(str @ file 0x918c880);整个已注册 flag 集都可通过它设置
已注册 flag约 2048 个 absl::Flag<T> FLAGS_<name> 全局对象;2107 个不同名称
DebugOptions protoxla::DebugOptions,290 个 wire-field,17 个嵌套 enum;DefaultDebugOptionsIgnoringFlags @ 0x1e66a860
TCE protoxla::jellyfish::TpuCompilationEnvironment,1121 个字段,sizeof 0x15e8_table_ @ 0x21cfa9e0
flag→TCE 桥OverrideTpuCompEnvByCmdLineFlags @ 0x1d73e640 · SetFieldFromFlagString @ 0x1d73fcc0 · CreateDefaultTpuCompEnv @ 0x1d73dfa0
AUTO 解析器AutoOr<bool>::FromProtoOrDie @ 0xf795300(present<<8)|val);约 130 个 ObjectView<TCE> 访问器 0x1d6b6420..0x1d6b9f60
AutoProtoxla.jellyfish.AutoProto,30 臂 oneof,_table_ @ 0x21cfa788;默认实例 AutoProto_globals_ @ 0x223c8968(全 AUTO)
字符串解析ParseAutoOrFromString<30> @ 0x1d7504c0 / ReadAutoOr<30> @ 0x1d74ca00
置信度CONFIRMED(以字节和反编译锚定),除非某行或 callout 另有说明

1. 流水线概览

目的

libtpu 中的配置旋钮会经历四个阶段。这些阶段由不同子系统拥有,并且值的含义在每一阶段都会变化:文本 token 变成类型化 flag 值,再变成 proto 字段,再变成已解析的编译决策。本节画出完整弧线,让读者能把每个兄弟页面放到对应位置;各阶段本身在 §2-§5 中详述。

四个阶段

text
STAGE 1 — INGEST  (env string → typed flag globals)            [env-vars.md, flag ingest]
  getenv("LIBTPU_INIT_ARGS")          0x918c880
    → GetLibTpuInitArguments          0x20ccca20   ── split on ' ' (absl::ByChar, AllowEmpty)
    → InitializeDriver argv build     0x204cecc0   ── ["./tpu_driver", <CloudTPU defaults>, <tokens>, NULL]
    → RealInitGoogle                  0x210ae860
        → absl::ParseCommandLine                    ── binds --xla_*/--xla_tpu_*/--megascale_* to FLAGS_<name>
                                                       (registry pre-built by the dlopen ctor storm)

STAGE 2a — DEBUGOPTIONS  (the xla_* subset → shared proto)     [debugoptions-proto.md]
  FLAGS_xla_foo  ↔  xla::DebugOptions.xla_foo                  ── 290 fields; only 2 standalone-flag-wired
    baseline = DefaultDebugOptionsIgnoringFlags   0x1e66a860    (rest reached via PJRT debug_options proto path)

STAGE 2b — TCE  (the xla_tpu_*/xla_jf_*/megascale_* set → TPU proto)  [tpu-compilation-environment.md]
  FLAGS_xla_tpu_foo  →  TpuCompilationEnvironment field        ── 1121 fields, 1:1 flag↔field
    CreateDefaultTpuCompEnv           0x1d73dfa0  ── fill from FLAGS_<name> defaults (+0x48 union)
    OverrideTpuCompEnvByCmdLineFlags  0x1d73e640  ── apply the parsed overrides
      SetFieldFromFlagString          0x1d73fcc0
      OverwriteFieldIfNotDefault      0x1d73f360

STAGE 3 — RESOLVE  (proto field → concrete compile value)     [autoproto-autoor-resolution.md]
  ~330 fields are AutoProto* (oneof) → AutoOr<T>::FromProtoOrDie  0xf795300
    → consumer polarity (AUTO=off / AUTO=on)  ── 130 accessors 0x1d6b6420..0x1d6b9f60
  67 fields are inline TristateProto enums   → cmpl $2,+OFF (ENABLED==2)
  + per-codename MSA overlay (v0..v5)         → effective per-TpuVersion value
```text

> **注意 ——** 这四个阶段不是同一个调用体。第 1 阶段在 `PJRT_Plugin_Initialize` 时运行一次(见 [../lifecycle/tftpu-initialize-bootstrap.md](../lifecycle/tftpu-initialize-bootstrap.md))。第 2 阶段在为一次编译物化 TCE 时运行。第 3 阶段在*每个消费者处惰性运行*,并不存在急切的“解析所有旋钮”过程。重实现者不应假设 init 时会快照出一个扁平 config 结构并在之后读取;AutoProto 旋钮的有效值会在每次调用其访问器时计算。

### 各家族的去向

最重要的结构性事实是 flag *家族*分流到两个 proto 中。重实现者必须把这个 GOOD/BAD 分界搞对:`--xla_tpu_*` **不是** DebugOptions 字段:

| 家族 | 数量 | 落入 | 详情页 |
|---|---:|---|---|
| `xla_*`(通用) | 121 | `xla::DebugOptions`(290 字段 proto;大多数通过 PJRT 到达,而不是独立 flag) | [debugoptions-proto.md](debugoptions-proto.md) |
| `xla_tpu_*` | 909 | `TpuCompilationEnvironment`(独立,TPU 私有) | [tpu-compilation-environment.md](tpu-compilation-environment.md) |
| `xla_jf_*` | 148 | `TpuCompilationEnvironment`(Jellyfish 后端) | [flag-families.md](flag-families.md) |
| `xla_sc_*` / `barna_core_*` | 92 / 61 | `TpuCompilationEnvironment`(SparseCore / embedding) | [flag-families.md](flag-families.md) |
| `megascale_*` | 150 | 独立 `absl::Flag`(DCN runtime,不是 TCE) | [flag-families.md](flag-families.md) |
| `xla_msa_*` / `xla_gf_*` / `xla_ior_*` / `xla_mosaic_*` / `xla_llo_*` | 49 | TCE + DebugOptions 混合 | [flag-families.md](flag-families.md) |
| `tpu_*` | 69 | runtime/cache/driver(非编译期) | [flag-families.md](flag-families.md) |

> **怪癖 ——** 此构建中没有注册 `xla_gpu_*` flag(零个 `AbslFlagHelpGenForxla_gpu_*` 符号),但 GPU/CPU 字段仍作为惰性元数据留在*共享* `DebugOptions` 描述符中;290 个字段中的大部分是 GPU/CPU 遗留项,在 TPU 上背后没有 flag。TPU 构建去掉了 GPU flag wiring,但保留了 proto 中的 GPU 字段。枚举 DebugOptions 字段的重实现者会看到没有对应 flag 的 GPU 字段;它们在 TPU 上是惰性的。(CONFIRMED;遗留集合枚举在 [debugoptions-proto.md](debugoptions-proto.md)。)

---

## 2. 第 1 阶段 —— flag 摄取

### 目的

插件 `.so` 没有 `argv`。libtpu 从 `LIBTPU_INIT_ARGS` 构造一个,前置合成的 `argv[0]` 和 Cloud-TPU 默认 flag,并把结果交给 `absl::ParseCommandLine`。因为解析是通用 absl 命令行解析,整个已注册 flag 集都能通过这一个 env var 设置,不存在“仅 init-args 可用”的子集。

### 算法

```c
function GetLibTpuInitArguments():                       // 0x20ccca20
    s = getenv("LIBTPU_INIT_ARGS")                       // str @ 0x918c880
    if s == NULL: return { {}, {} }                      // empty argv
    views = absl::StrSplit(s, ByChar(' '), AllowEmpty)   // plain space split — no shell tokenizing
    store = [ string(v) for v in views ]                 // owned std::string copies (24-B SSO)
    argv  = [ &str.data for str in store ]                // parallel char const* view
    return { store, argv }

0x20ccca20 的反编译逐字确认了这个函数体:第 41 行调用 getenv("LIBTPU_INIT_ARGS"),随后使用 absl::ByChar / AllowEmptySplitter ConvertToContainer 生成 vector<string_view>。然后 argv 被折入 InitializeDriver @ 0x204cecc0 内部的 driver argv,并在 RealInitGoogle @ 0x210ae860 内解析。完整摄取路径,包括锁门、once-guard 和 Cloud-TPU 默认值折叠,由 ../lifecycle/tftpu-initialize-bootstrap.md §2 拥有;本节只把它定位为第 1 阶段。

陷阱 —— 拆分方式是带 AllowEmpty 的单空格 absl::ByChar(' '),不是 shell tokenizer。LIBTPU_INIT_ARGS="--xla_tpu_foo=1 --bar"(双空格)会在两个 flag 之间产生一个空字符串 token,任何包含空格的 flag 都会被拆成多个 token(并且很可能被拒绝)。重实现者必须复现普通空格拆分,而不是支持引号的拆分。

本节负责的内容

env-var 名册(LIBTPU_INIT_ARGSTPU_LOAD_LIBRARYLIBTPU_ON_GCETPU_LIBRARY_PATH)及其消费者在 env-vars.mdTPU_LIBRARY_PATH 由 wheel 的 __init__.py 在加载前设置(它让 dlopen 指向捆绑的 libtpu.so);它不是 flag。flag 注册表,也就是约 2048 个 FLAGS_<name> 全局对象以及 dlopen 构造函数风暴如何构建它们,是这次解析的前置条件,由 lifecycle 页面和 atlas 拥有;atlas 在 xla-flag-atlas.md 枚举名称。


3. 第 2 阶段 —— 两个 proto

目的

一旦 ParseCommandLine 把值绑定到 flag 全局对象上,两个不同的 config 结构就会消费它们。知道一个 flag 落入哪个 proto,是找到它的字段和追逐不存在字段之间的差别。

xla::DebugOptions —— 共享的通用 proto

DebugOptions 是 XLA 在所有后端之间共享的 proto;xla_*(非 tpu)flag 命名它的字段(--xla_foo ↔ 字段 xla_foo)。libtpu 的描述符池中存在 290 个 live wire-field(最大 field# 501,211 个编号空洞);大多数是 GPU/CPU 遗留项,在 TPU 上惰性存在。直接交叉匹配只找到两个已注册 flag 交集(xla_tpu_detect_nanxla_tpu_detect_inf);经典 dump/HLO 旋钮通过 PJRT CompileOptions.debug_options proto 路径到达 DebugOptions,而不是作为独立 absl flag 到达。全默认 baseline 是 DefaultDebugOptionsIgnoringFlags @ 0x1e66a860(在反编译中与 GetNonDefaultDebugOptions @ 0x1c920540DumpNonDefaultDebugOptions @ 0x1c920d80 一起确认;后两者把 config 与该 baseline diff 用于日志)。该 proto 携带 17 个嵌套 enum(StepMarkerLocationCommandBufferSchedulingModeWhileLoopUnrolling 等)以及一个逃生口 xla_backend_extra_options string→string map。详情、proto-only 字段列表和 baseline 值见 debugoptions-proto.mddefault-debugoptions.md

TpuCompilationEnvironment(TCE)—— TPU 私有主 proto

TCE 是 TPU 编译器的主 config:一个 1121 字段 proto(sizeof 0x15e8 = 5608 B),其每个字段都是一个已注册的 absl::Flag。它的 _table_ @ 0x21cfa9e0 是字节精确的 field#→offset oracle:一个 TcParseTableBase 头(has_bits_offset=16field_entries_offset=0x370num_field_entries=1121num_aux_entries=349),后跟按字段号升序排列的 1121 项 FieldEntry 数组,所以 entry[i] 是第 i 个 live field,且其 offset 是确定的。proto 类型直方图(bool 418、message 349、int64 148、enum 74、string 37、float 34、int32 32、double 14、uint32 11、uint64 4)可由 FieldEntry.type_card 重新推导。

flag→TCE 桥是一小族函数:CreateDefaultTpuCompEnv @ 0x1d73dfa0FLAGS_<name> 默认 union(FlagImpl+0x48)填充 env,然后 OverrideTpuCompEnvByCmdLineFlags @ 0x1d73e640 通过 SetFieldFromFlagString @ 0x1d73fcc0OverwriteFieldIfNotDefault @ 0x1d73f360 应用已解析覆盖。field#→offset 机制、字节精确默认值普查和逐字段字典见 tpu-compilation-environment.mdtce-field-dictionary-a.mdtce-field-dictionary-b.mdtce-field-offsets-defaults.md

怪癖 —— absl flag 默认值以字节为权威;help/error 文本不是权威。两个 flag(xla_tpu_rwb_fusionxla_tpu_accumulate_into_mrb)在 help-string 文本中读作 =false,但它们的 FlagImpl+0x48 inline literal 是 01 00 00 00 = TRUE。help 文本描述的是消息想引导你的行为,而不是已注册默认值。重实现者必须从 flag/proto 初始化器读取默认值,绝不要从说明文字读取。(CONFIRMED —— 在 tce-field-offsets-defaults.md 上做了字节级修正。)


4. 第 3 阶段 —— AUTO 解析器

目的

这是没有 XLA-CPU/GPU 类比物的一层。1121 个 TCE 字段中约 330 个不是普通值,而是携带三态的 AutoProto oneof:AUTO(未设置)、ENABLEDDISABLED;具体编译值在消费者处惰性计算。机制是 AutoOr<T> 模板,加上每个旋钮一个手写访问器,其极性就是文档化默认值。

三态,字节精确

c
function AutoOr<bool>::FromProtoOrDie(AutoProto& p):     // 0xf795300
    if p.oneof_case_ == 0:        return 0               // +0x1c == 0  ⇒ AUTO ⇒ absent
    v = AutoOrTypeTraits<bool>::FromAutoProto(p)         // 0xf7953e0 — reads body +0x10
    return v | 0x100                                     // SET present-bit (bit8); pack (present<<8)|val
```text

`0xf795300` 的反编译精确确认了 `return v11 | 0x100u` 打包。`AutoProto` 内存布局固定:oneof body 位于 struct `+0x10`,判别器 `oneof_case_` 位于 `+0x1c`(活动臂的字段号;`0` = unset = AUTO)。打包返回值取决于类型类别:bool 为 `(present<<8)|val8`,int32/enum 为 `(present<<32)|val32`,int64 为 `{value, has-bit}`,message 为完整子消息 + has-flag。全 AUTO 默认实例是 `AutoProto_globals_ @ 0x223c8968`(oneof body 和 case 均为零),空 TCE 字段会回退到它;因此未设置的 AutoProto 旋钮总是通过其消费者的极性解析。30 臂 oneof(8 个硬编码标量臂、10 个经反射分发的 enum 臂、12 个 message 臂)由 [autoproto-message-arms.md](autoproto-message-arms.md) 拥有;按类型类别的解析器模板和打包由 [autoproto-autoor-resolution.md](autoproto-autoor-resolution.md) 拥有。

### 极性就是默认值

同一个三态编码会根据旋钮作者选择的惯用法产生*相反*默认值:

| 惯用法 | 测试 | AUTO 解析为 | 含义 | 数量 |
|---|---|---|---|---:|
| `AUTO=off` | `not; test $0x101; sete` | FALSE | 只有显式 `true` 才启用 | 45 bool |
| `AUTO=on` | `and $0x101; cmp $0x100; setne` | TRUE | 只有显式 `false` 才禁用 | 26 bool |
| int64 sentinel | `test $1,%dl; cmove rcx` | 每旋钮常量 | 例如 `INT64_MAX`、`0`、`1024` | 18 |
| enum/int default | `bt $0x20; cmovb; else 0` | enum-0 / zero | DEFAULT/第一个值 | 11 |

因此,`MxuLatencyBalancingUseSequenceDependencies`(env `+0xbe8`,`AUTO=off`)默认 OFF,而 `AllowSplitVmem`(env `+0x4a8`,`AUTO=on`)默认 ON;二者都由同一个全 AUTO 的 `AutoProto_globals_` 支撑。还存在第二种存储类别:67 个字段是*内联* `TristateProto.Value` enum(通过 `cmpl $0x2,+OFF` 读取的 4 字节字段,其中 `ENABLED==2`),而不是 AutoProto;例如 `EnableLloLinter` 读取 `+0x15ac`。完整约 130 个访问器普查(offset → polarity)和 int64-sentinel 表见 [autoproto-autoor-resolution.md](autoproto-autoor-resolution.md)。

### 摄取半边 —— string → AutoProto

用户在 `XLA_FLAGS` / `LIBTPU_INIT_ARGS` 中用类型化 token(`auto` / `enabled` / `disabled` / 字面量)拼写覆盖。text→`AutoOr<T>` 解析是 `ParseAutoOrFromString<30> @ 0x1d7504c0`,进入 `ReadAutoOr<30> @ 0x1d74ca00`(二者均已确认存在;`<25>` 和 `<30>` arity 是两个 oneof 大小),并以 `TpuCompEnvReflection::ParseFlagFromString @ 0x1d74e8a0` 作为按字段索引的入口。精确 token 语法和反向 unparse 由 [autoor-parse-grammar.md](autoor-parse-grammar.md) 与 [autoor-unparse.md](autoor-unparse.md) 拥有。

> **陷阱 ——** AutoProto 旋钮不存在急切的“快照 config”步骤。解析器在每次访问器调用时运行,并在字段未设置时回退到 `AutoProto_globals_`。如果重实现者在 init 时物化一个扁平 config 结构并之后一直读取它,就会漏掉 AUTO fallback 极性(以及下面的 per-version overlay),从而悄悄给约 330 个字段发出错误默认值。

---

## 5. 经注册表中介的分发与 per-version overlay

### 经注册表中介的 flag

flag→field 对应关系不是逐调用硬编码的;它经过 proto 反射。`TpuCompEnvReflection`(`ReadFlag @ 0x1d74af60`、`ParseFlagFromString @ 0x1d74e8a0`)按名称在 TCE 描述符中查找字段,然后 `SetFieldFromFlagString @ 0x1d73fcc0` 写入它。序列化/规范化方向通过 `NormalizeFieldType<T>` 和 `TpuCompEnvReflection::SetEnvField`,把解析后的 `AutoOr<T>` 映射到 20 备选项 TCE variant(`i8,u8,i32,i64,u32,u64,double,float,bool,string,RangeSpecProto,…,AutoProto`)。这种反射中介让一个通用桥能服务全部 1121 个字段;经注册表中介的路径详见 [registry-mediated-flags.md](registry-mediated-flags.md)。

### TpuVersion 感知的前缀分发

同一个逻辑旋钮可以用带版本限定的前缀寻址,使一个 flag 名称能按 TPU 世代选择不同存储;每 codename 的 MSA overlay 又会在 flag 默认值*之上*按 `TpuVersion` 重写一组字段。因此,本页描述的 flag-default baseline 不是交付值:有效的每 codename 默认值是 `baseline ⊕ family-overlay`(v0/1→jf,v2→cmem,v3→vf,v4/5→gf),由 `ComputeMemorySpaceAssignmentOptions` 和 `OverwriteFieldIfNotDefault @ 0x1d73f360` 应用。前缀分发机制和 per-version overlay 由 [flag-prefix-dispatch.md](flag-prefix-dispatch.md) 拥有;每 codename 的 MSA 值由 memory 子系统页面拥有。

> **注意 ——** 本页没有对具体的 prefix-strip/version-select 字符串机制做字节追踪(通用前缀处理符号 grep 没有分离出它;通过 `OverwriteFieldIfNotDefault` 的 overlay 路径**确认)。flag→reflection→field 桥和 `OverwriteFieldIfNotDefault` overlay 为 CONFIRMED;精确的 `TpuVersion` 感知前缀 token 处理由 [flag-prefix-dispatch.md](flag-prefix-dispatch.md) 拥有,本页对此置信度为 LOW。(LOW)

---

## 相关组件

| 组件 | 关系 |
|---|---|
| `GetLibTpuInitArguments @ 0x20ccca20` |1 阶段 —— `LIBTPU_INIT_ARGS` 摄取 |
| `RealInitGoogle @ 0x210ae860` | 承载绑定 flag 的 `absl::ParseCommandLine` |
| `xla::DebugOptions` |2a 阶段 —— `xla_*` flag 的共享通用 proto |
| `TpuCompilationEnvironment @ _table_ 0x21cfa9e0` |2b 阶段 —— 1121 字段 TPU 主 proto |
| `OverrideTpuCompEnvByCmdLineFlags @ 0x1d73e640` | flag→TCE 桥 |
| `AutoOr<bool>::FromProtoOrDie @ 0xf795300` |3 阶段 —— 三态解析器 |
| `AutoProto_globals_ @ 0x223c8968` | 未设置旋钮使用的全 AUTO 默认实例 |

## 交叉引用

- [../lifecycle/tftpu-initialize-bootstrap.md](../lifecycle/tftpu-initialize-bootstrap.md) —— 完整第 1 阶段:`LIBTPU_INIT_ARGS` 摄取、once-guard、Cloud-TPU 默认值折叠、`argv` 构建
- [env-vars.md](env-vars.md) —— env-var 名册(`LIBTPU_INIT_ARGS`、`TPU_LOAD_LIBRARY`、`LIBTPU_ON_GCE`、`TPU_LIBRARY_PATH`)及其消费者
- [xla-flag-atlas.md](xla-flag-atlas.md) —— 约 2107 名称的 flag 表面和 `AbslFlagHelpGenFor` 枚举方法
- [flag-families.md](flag-families.md) —— 家族拆分(`xla_tpu_*`、`xla_jf_*`、`megascale_*`、`xla_sc_*`、`barna_core_*` 等)以及每个家族落入哪个 proto
- [debugoptions-proto.md](debugoptions-proto.md) —— `xla::DebugOptions`:290 个 wire-field、17enum、GPU/CPU 遗留项与 flag-wired 的拆分
- [default-debugoptions.md](default-debugoptions.md) —— `DefaultDebugOptionsIgnoringFlags @ 0x1e66a860` baseline
- [tpu-compilation-environment.md](tpu-compilation-environment.md) —— TCE proto、`_table_` 头、field#→offset 机制
- [tce-field-dictionary-a.md](tce-field-dictionary-a.md) / [tce-field-dictionary-b.md](tce-field-dictionary-b.md) —— 逐字段名称/类型/含义字典
- [tce-field-offsets-defaults.md](tce-field-offsets-defaults.md) —— 字节精确的 field#→offset→default 参考
- [autoproto-autoor-resolution.md](autoproto-autoor-resolution.md) —— `AutoOr<T>` 三态、约 130 个访问器的极性普查、int64-sentinel 表
- [autoor-parse-grammar.md](autoor-parse-grammar.md) —— string→AutoProto 解析(`auto`/`enabled`/`disabled`/literal 语法)
- [autoor-unparse.md](autoor-unparse.md) —— 反向 `AbslUnparseFlag<AutoOr<T>>` 方向
- [autoproto-message-arms.md](autoproto-message-arms.md) —— 30 臂 AutoProto oneof 及其 12 个 message 臂
- [registry-mediated-flags.md](registry-mediated-flags.md) —— 经反射中介的 flag→field 桥(`TpuCompEnvReflection`)
- [flag-prefix-dispatch.md](flag-prefix-dispatch.md) —— `TpuVersion` 感知的前缀分发和 per-codename overlay