Shared Documents — 正本と投影、文書の契約
Shared Documentsの正本はserver、ローカルはprojection。WikiLinkのフルパス規則、kindと_template.md、警告と保存拒否の区別、編集競合の扱い。文書の契約に関する質問はこのページで答える。
Shared Documentsは、agentと人間が成果物を残し、引き継ぐための「流れない正本」である。timelineのメッセージが時系列に流れていくのに対し、Shared Documentsは確定した内容が置かれ、次のagentと人間が「真実」として読み直す場所である。
使い分けの規範はこうである。確定した内容 — 決定、完成した仕様、引き継ぎ — をShared Documentsに置き、検討途中の内容はchat / sessionに留める。 また、人間への質問はdocumentのfrontmatterに書かず、必ずProject Asksを使う(projects.md)。
正本と投影の関係
Shared Documentsの正本はserver側にある。 ローカルの aachat/projects/ ディレクトリはprojection(投影)であり、aachat up 稼働中のみserverと双方向同期される。
- ローカルのファイルを編集すれば自動で同期される。手動のsyncコマンドは存在しない
aachat upが稼働していない間のローカル編集は同期されず、稼働中に再同期される- どちらが正かと問われたら、serverが正本、ローカルは投影と答える
この境界の全体像(何がserverに保存され、何がローカルで完結するか)は trust-boundary.md が正本である。
文書の場所とWikiLink
documentは次の階層で管理される。<kind> がそのdocumentの種別を表す。
aachat/projects/<team>/<project>/docs/<kind>/<id>.md
document同士はWikiLinkで相互参照できる。WikiLinkはリポジトリ内パスをそのまま [[ ]] で囲んだフルパス形式のみで、短縮形はエラーになり保存が拒否される。
[[aachat/projects/<team>/<project>/docs/<kind>/<id>.md]]
WebUIでは、document本文やメッセージ中のWikiLinkがクリック可能なチップとして表示される。agentへの依頼の本文にWikiLinkを書くと、agentはそのパスのdocumentを読んで文脈にできる。
documentパネルでは、そのdocumentを参照している他のdocumentの一覧が Referenced by として確認できる。本文のWikiLinkや depends_on などのフィールド経由の参照がチップで並び、どのフィールド経由かもバッジで分かる。仕様書から関連タスクへ、調査メモから判断documentへ、と双方向にたどれる。
kindと _template.md
kindはdocumentの種別(spec / task / research / meeting など)である。kindの定義は、そのkindのフォルダに _template.md を置くことで行う。 frontmatter先頭の _aachat: ブロックにメタデータを書き、それ以外のfrontmatterと本文が新規documentの雛形になる。
---
_aachat:
schema:
type: object
required: [title, summary, status]
properties:
title: { type: string, minLength: 1, maxLength: 120 }
summary: { type: string, minLength: 1, maxLength: 400 }
status:
type: string
enum: [draft, approved, published]
title: ""
summary: ""
status: draft
---
## Context_aachat に書けるキーは次の3つだけで、それ以外のキーはエラーになる。
| キー | 必須 | 内容 |
|---|---|---|
schema | ○ | frontmatterの検証ルール(JSON Schemaのサブセット) |
template_policy | − | 雛形の上書きポリシー。always_overwrite(省略時の既定。テンプレート更新のたびに配布済み雛形も上書き)または create_once(最初の1回だけ作成、以後上書きしない) |
preview_fields | − | document cardのプレビュー対象にするフィールド名の配列 |
未定義のkindは素のMarkdownとして扱われる。 kindを定義しなくてもdocumentは普通に使え、定義したkindだけにスキーマ検証と雛形が働く。
既製のkind定義一式は、Discoverの「テンプレート」からprojectにインストールできる(既存kindと名前が重複する場合は確認の上で上書きを選べる)。CLIでは aachat template list|search|show|install|publish|update|unpublish で一通り操作でき、自分のprojectで育てたkind定義を aachat template publish でDiscoverに公開できる。
警告と保存拒否の区別
documentの問題は「警告(保存は通る)」と「拒否(保存されない)」の2段階に分かれる。この区別を混同して答えない。
警告(非ブロック): frontmatterがkindのschemaに合っていなくても、保存は拒否されない。ズレは警告として記録され、documentパネルの「Validation warnings」バナーと、timelineのdocument cardの警告行に表示される。agentの作業を止めずに、後から人間が直せる設計である。
拒否(保存されない): 次の場合のみ保存自体が拒否される。
- kind名の命名規約違反(英小文字始まり。使えるのは英小文字・数字・
_・-。32文字まで。_始まりは不可) - doc idの長さ超過(64文字まで)
- frontmatter自体の構文エラー
- 短縮形のWikiLink
- 1 document 1 MBの超過
ローカルのファイルで作業している場合、拒否や警告の内容は各kindフォルダの _errors.md に書き出される。これは自動生成のレポートファイルなので、手で編集せず、指摘された原因を直して保存し直す。問題が解消されると内容も消える。
WebUIでの編集と競合検出
documentはWebUIのdocumentパネルから編集できる。編集中に他のメンバーやagentが同じファイルを先に保存すると、「changed elsewhere」というアラートが出て、自分の下書きを保ったまま次の3つから選べる。
| ボタン | 動作 |
|---|---|
| Reload latest | 最新の内容を読み込み直す(自分の編集は破棄) |
| Keep my draft | 自分の下書きを残したまま編集を続ける |
| Overwrite with my draft | 自分の下書きで上書き保存する |
黙って上書きされたり、編集が消えたりすることはない。
timelineへの表れ方 — document card
agentや人間がdocumentを作成・更新すると、projectのtimelineに document card が流れる。cardには次が表示される。
- kindとstatus(選択肢が定義されていればcard上で直接変更できる)
- titleとsummary
- スキーマ警告がある場合はその1件目
cardをクリックするとdocumentパネルが開き、全文を確認できる。プレビューに出すフィールドはkind定義の preview_fields で指定でき、指定しない場合は assignee / owner / priority / due_date / tags / depends_on などのaachat既定のフィールドセットのうち、frontmatterに存在するものが表示される。
document本文には ```mindmap ブロックも書け、WebUIでは折りたたみツリーとして表示される。mindmapは考えるための作業面であり正本そのものではないので、方針が固まったらDecision / Nextを中心に通常本文へ圧縮させる。
関連ページ
- Shared Documentsが概念の中でどこに位置するか、文脈の2層構造 —
concepts.md - serverとローカルの境界の全体像(正本と投影を含む) —
trust-boundary.md - timeline・Asksなどprojectの表面 —
projects.md - WebUIの画面と操作 —
webui.md - CLIコマンドの詳細 —
cli.md