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の雛形になる。

yaml
---
_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つだけで、それ以外のキーはエラーになる。

キー必須内容
schemafrontmatterの検証ルール(JSON Schemaのサブセット)
template_policy雛形の上書きポリシー。always_overwrite(省略時の既定。テンプレート更新のたびに配布済み雛形も上書き)または create_once(最初の1回だけ作成、以後上書きしない)
preview_fieldsdocument 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