附錄:.ait/config.json
目前 1.1.1 持久化 Repository 設定的完整約定,包含歸屬、預設值、生命週期寫入方、worktree 覆蓋項與恢復邊界。
適用對象: 開發者、維運與 Repository 所有者
約定與權威#
.ait/config.json 是 1.1.1 裡權威的、持久化的 Repository 設定。它儲存 儲存庫身份與路由、工作流程預設值、遠端註冊資訊、Task worktree 放置位置,以及 一小組由 AIT 託管的執行時提示。這一頁把目前支援的每個欄位和巢狀欄位都 列全。
有三個 JSON 面是相關的,但彼此不能互換:
| 面 | 權威與行為 |
|---|---|
.ait/config.json | 持久化的儲存庫級權威。AIT 從規範的 Repository 根目錄讀這個檔案。 |
.ait-worktree.json | 某個已物化 worktree 裡由 AIT 託管的疊加層。非 null 的疊加值只在那個 worktree 的生效執行時裡替換對應的根值。 |
ait config show --json | 經過預設值、推導、actor 檢測、遠端解析和 worktree 疊加之後的生效診斷投影。它不是這兩個檔案中任何一個的逐位元組呈現。 |
JSON 讀取器在改寫某個設定時,可能會把不認識的 key 原樣保留下來。保留並 不等於支援。別把任意 key 當成擴充套件點。
安全的修改邊界#
只要 1.1.1 提供了擁有某個值的那條命令,就用那條命令:
ait config show --json
ait config set --workflow-mode solo_remote
ait config set --id-namespace-prefix W
ait config unset task-worktree-main-seed-ram-max-bytes
ait remote add origin https://server.example.invalid --default
ait doctor memory-root --jsonait config set 接受十項使用者持有的設定,ait config unset 接受八項可選 覆蓋項。儲存庫索引、Line 選擇器、遠端記錄、推匯出來的作用域、Plan 繫結的 內部細節、worktree 疊加層和等待提示,都不能透過 ait config set 寫。讓 擁有它們的那條 AIT 生命週期去寫。
如果確實要維護某個只能改檔案的高階值,就先停掉併發的 AIT 變更,留一份 可信副本,原子地寫入合法 JSON,驗證結果之後再繼續幹活。絕對不要照抄別的 Repository 的 repository_index、遠端對映或 worktree 疊加層。
有代表性的根檔案#
這份中性樣例只是展示常見形狀;它不是恢復用的模板。server 分配的索引、 遠端後設資料、各種路徑和身份,都必須來自這個 Repository 自己的生命週期。
{
"repo_name": "sample-project",
"default_line": "main",
"current_line": "main",
"default_remote": "origin",
"repository_index": 42,
"remotes": {
"origin": {
"remote_id": 1,
"url": "https://server.example.invalid",
"repo_name": "sample-project",
"created_at": "2026-08-17T08:00:00Z"
}
},
"id_namespace_prefix": "W",
"policy_profile": "prototype",
"default_author_mode": "ai_with_human_review",
"workflow_mode": "solo_remote",
"workflow_default_scope": "remote",
"task_default_scope": "remote",
"change_default_scope": "remote",
"sprint": "on",
"plan_task_binding": { "mode": "required" },
"task_worktree": {
"alias_root": ".ait-worktree-links",
"main_seed_ram_max_bytes": 8589934592
}
}全新初始化#
ait init 會建立 repo_name、default_line、current_line、一個為 null 的 default_remote、一個空的 id_namespace_prefix、policy_profile、 default_author_mode、sprint 和 plan_task_binding。在受支援的宿主上, 它還能記錄檢測到的 task_worktree.memory_root。可選的預設模型之後用 ait config set --default-model <model> 設定。
預設 Line 是 main。沒有明確給出 Repository 名時,用規範根目錄的目錄名。 全新的策略檔位是 prototype、team 或 release 之一;它必須和 .ait/policy.yaml 一致。
儲存庫身份與 Line 選擇#
| 欄位 | JSON 約定 | 歸屬、預設與修改方式 |
|---|---|---|
repo_name | 非空字串。 | 由 ait init 寫入。老儲存庫裡如果缺這個欄位,執行時回落到規範根目錄的目錄名。它不是遠端身份。 |
default_line | 非空的 Line 名字串。 | 由 ait init 寫入;預設時回落到 main。改動由儲存庫初始化流程負責。 |
current_line | 非空的 Line 名字串。 | 由 AIT 的 Line 操作維護,表示規範根上選中的 Line。預設時回落到 default_line。 |
default_remote | 遠端名字串或 null。 | 由 ait remote add ... --default 寫入。非 null 的值必須對應 remotes 裡的某一項;預設表示沒有預設遠端。 |
repository_index | 無符號 32 位整數。 | 由 server 分配,ait remote add 負責持久化。一旦存在,1.1.1 就拒絕用新傳回的索引替換它。沒有公開的 setter。 |
id_namespace_prefix | 只含 ASCII 字母或數字的字串;按大寫儲存。空值也合法。 | ait init、ait config set --id-namespace-prefix 或 ait config unset id-namespace-prefix。目前 server 名稱空間最多兩個字元;用空值,或者用客戶端和 server 都接受的值。 |
策略、溯源與本地評審人預設值#
| 欄位 | JSON 約定 | 歸屬、預設與修改方式 |
|---|---|---|
policy_profile | prototype、team 或 release。 | 由 ait init 選定;它必須等於 .ait/policy.yaml 裡的策略 ID。別隻改一邊。 |
default_author_mode | human_only、human_with_ai_assist、ai_with_human_review 或 ai_only_experimental。 | ait init、ait config set 或 ait config unset。預設時解析為 ai_with_human_review。 |
default_model | 存在時為非空字串。 | ait config set --default-model;ait config unset default-model 會刪掉它。預設時報告為 null。 |
user_name | 存在時為非空字串。 | ait config set 或 unset。這是必需評審或自動功能性 Task 評審所用的唯一設定身份。 |
user_email | 存在時為非空字串。 | ait config set 或 unset。用於非 Task 評審的 actor 身份展示面。 |
task_review | 布林值:true 表示必需;false 表示自動。 | ait config set --task-review required 或 ait config set --task-review automatic 會把這個詞轉成上面的布林值。預設時解析為自動。 |
生效的 actor 也可能來自 AIT_NATIVE_ACTOR。所以 ait config show --json 顯示出來的生效值,可能和存下來的身份欄位不一樣。
工作流程預設的聯動#
設整套預設,別單獨去改它下面那些從屬欄位:
workflow_mode | 儲存的作用域值 |
|---|---|
solo_local | workflow_default_scope、task_default_scope 和 change_default_scope 都是 local。 |
solo_remote | workflow_default_scope、task_default_scope 和 change_default_scope 都是 remote。 |
ait config set --workflow-mode <value> 會寫 workflow_mode 和那三個作用域 欄位。除非同一條命令裡帶了 --sprint off,否則它還會寫 sprint: "on" 和 plan_task_binding.mode: "required"。
| 欄位 | JSON 約定 | 歸屬、預設與修改方式 |
|---|---|---|
workflow_mode | solo_local、solo_remote 或 team_remote。 | ait config set --workflow-mode。預設或不自洽時,生效投影由各作用域和 Plan 繫結推導得出,可能報成 custom。 |
workflow_default_scope | local 或 remote。 | 由工作流程預設寫入。預設時解析為 local。 |
task_default_scope | local 或 remote。 | 由工作流程預設寫入。預設時繼承 workflow_default_scope。 |
change_default_scope | local 或 remote。 | 由工作流程預設寫入。預設時繼承 workflow_default_scope。 |
sprint | on 或 off。 | ait init 或 ait config set --sprint。只要它存在,它就是 Plan 繫結的生效權威。 |
plan_task_binding.mode | off、advisory、strict 或 required。 | 目前的公開寫入方在 sprint 開啟時寫 required,關閉時寫 off。如果 sprint 預設,就由這個物件提供生效模式;兩者都預設時,1.1.1 會預置 required。 |
改這些預設值,不會搬動或改寫已有的 Task、Change、Plan 繫結或 worktree。 已經開始的工作,按它開始時記錄下來的那份約定走完。
遠端對映#
remotes 是一個以本地遠端名為 key 的物件。它的公開寫入方是 ait remote add。
| 欄位 | JSON 約定 | 歸屬與行為 |
|---|---|---|
remotes | key 為非空遠端名的物件。 | 預設表示沒有註冊過遠端。每個 value 都必須是物件。 |
remotes.<name>.remote_id | 有符號整數。 | AIT 分配下一個本地序號。老條目沒有這個欄位時,按它在對映中確定性的序號讀取,但目前寫入都會帶上它。 |
remotes.<name>.url | 非空字串。 | 傳給 ait remote add 的必填 server 基礎 URL。 |
remotes.<name>.repo_name | 非空字串,或預設。 | AIT 記錄用於 server 註冊的規範 Repository 目錄名。 |
remotes.<name>.created_at | RFC 3339 時間戳字串。 | AIT 記錄註冊時間。老記錄可能沒有。 |
遠端 URL 可能暴露內網拓撲。它是路由資料,不是憑據。認證 token 屬於程序的 機密邊界,不該放在這個檔案裡。
task_worktree 物件與 AIT_RAM#
| 欄位 | JSON 約定 | 歸屬、預設與修改方式 |
|---|---|---|
task_worktree | 物件或 null。 | ait init 可以補上檢測到的 memory root 資料。預設時仍然允許宿主探測和回落到持久磁碟。 |
task_worktree.memory_root.kind | macos_ram_volume、linux_memory_root 或 windows_ramdisk。 | 必須和宿主一致,也要和 ait doctor memory-root --json 期望的證明一致。 |
task_worktree.memory_root.root | 非空路徑字串。 | 記憶體支撐的根目錄。由維運維護;用絕對路徑,診斷和恢復時才不會有歧義。 |
task_worktree.memory_root.volume_name | 非空字串,或預設。 | 僅 macOS 用的卷標。其他 kind 會忽略它。macOS 上預設時,AIT 可以從掛載點的 basename 推導。 |
task_worktree.memory_root.sector_count | 正整數,或預設。 | macOS RAM 盤容量,以 512 位元組扇區計。預設時用 16,777,216 個扇區,正好 8 GiB。其他 kind 會忽略它。 |
task_worktree.ephemeral_root | 非空路徑字串,或預設。 | 只能改檔案的 Task 執行時根目錄。相對路徑從規範的 Repository 根解析。預設時,只要有可用的有效 memory root,就據此推導執行時位置。 |
task_worktree.alias_root | 非空路徑字串,或預設。 | ait config set --task-worktree-alias-root;相對路徑從 Repository 根解析。預設時用 .ait-worktree-links。 |
task_worktree.main_seed_ram_max_bytes | 非負整數,或預設。 | ait config set 或 ait config unset task-worktree-main-seed-ram-max-bytes。預設表示沒有設定 Snapshot 大小的截斷線;它不代表實體記憶體無上限。 |
記憶體放置是在建立新的 Task worktree 時評估的。嚴格大於所設定 main seed 上限 的 Snapshot,會走 Repository 內部的持久儲存。除此之外,AIT 能用就用經過 校驗的受支援 RAM 根,用不了就回落到 Repository 內部的持久儲存。完整的 隔離、容量和恢復行為見 並行 Task 隔離。
由 AIT 託管的執行欄位#
| 欄位 | JSON 約定 | 歸屬、預設與行為 |
|---|---|---|
worktree_name | 非空字串,或預設。 | AIT 會臨時把規範根繫結到某個活動的受管 worktree,並在清理時解除繫結。別手改它。 |
workflow_ready_poll_seconds | 數字。 | AIT 從最近的遠端歷史裡學出一個取整後的就緒等待估計值。為正的生效值會被夾到 5 到 900 秒之間;0 表示嘗試過引導但沒有可用樣本。預設表示沒有快取的估計值。 |
workflow_land_poll_seconds | 數字。 | 同樣是 AIT 持有的估計值,用於遠端 Land 完成。它有同樣的 5 到 900 秒生效邊界和 0 引導標記。 |
這些等待值只是給使用者反饋用的提示,不是就緒、策略或超時方面的權威。刪掉 或改掉它們,並不會讓某個操作完成。
已有檔案裡的相容欄位#
這些欄位可以留在升級過來的儲存庫裡。這裡寫出來是為了讓備份或審計看得懂; 別把它們加進全新的 1.1.1 檔案。
| 欄位 | JSON 約定 | 目前 1.1.1 裡的含義 |
|---|---|---|
repo_id | 早期的不透明字串。 | 保留的相容資料。目前 server 的路由身份是 repository_index;不得用 repo_id 來選定遠端權威。 |
snapshot_binary_db_storage | 已有的標量值。 | 目前執行時一律使用 Binary DB layout 1,忽略這個選擇器的取值。不寫它,儲存行為完全一樣。 |
plan_binary_db_storage | 已有的標量值。 | 對 Plan 權威同樣是固定的 layout 1 行為。 |
remote_sync_binary_db_storage | 已有的標量值。 | 對遠端同步權威同樣是固定的 layout 1 行為。 |
plan_task_binding_mode | 早期的標量模式。 | 只被一條有界的相容路徑使用。目前設定讀寫的是 plan_task_binding.mode;別把這個標量加進新檔案。 |
完整的 worktree 疊加層#
AIT 會在受管 worktree 裡建立 .ait-worktree.json,並把其中每個非 null 的 值疊加到根設定之上,只對那個 worktree 生效。Task worktree 會用到下面這些 欄位:
| 欄位 | JSON 約定 | 含義 |
|---|---|---|
worktree_name | 非空字串。 | 穩定的、AIT 持有的物化名稱和清理身份。 |
current_line | 非空的 Line 名字串。 | 在這個 worktree 裡選中的 Task 功能 Line。 |
repo_root | 絕對路徑字串。 | 規範的 Repository 根,它的 .ait 權威透過受管連結共享出來。 |
workspace_root | 絕對路徑字串。 | 物理 worktree 根。它可以和麵向使用者的別名路徑不同。 |
created_at | RFC 3339 時間戳字串。 | 物化時間。 |
materialized_snapshot_id | Snapshot ID 字串,或預設。 | 目前恢復進這個 worktree 的 Snapshot;AIT 會在 restore 和 rebase 操作之後更新它。 |
這個疊加層是歸屬後設資料,不是可搬運的使用者畫像。別複製它、別編輯它,也別 把受管的 .ait 連結換成另一個權威。
驗證、備份與恢復#
做完一次受支援的改動之後,把生效投影和相關子系統都驗一遍:
ait config show --json
ait remote list --json
ait status --json
ait doctor memory-root --json備份整個 .ait 權威,不要只備份 config.json。這個檔案裡有 server 分配 的儲存庫索引和遠端路由,把本地權威重新接回已有的異地副本要靠它們。分享 診斷資訊之前,先把 server URL、本地路徑、姓名和郵箱地址脫敏掉。這個檔案 裡不應該出現密碼、bearer token 或整合用的機密。
萬一本地權威丟了,別指望對著一個同名的已有 server Repository 跑 ait remote add 就能重新掛上。作為已儲存本地權威的一部分,先恢復可信的 repository_index、default_remote 和 remotes 路由資料,用 ait config show --json 和 ait repo show --remote origin --json 驗證, 然後先預覽 ait remote recover-head --remote origin,再考慮加 --apply。如果確切的已儲存路由恢復不了,就停下來,別去造一個替代權威。