Skip to content

Latest commit

 

History

History
196 lines (142 loc) · 34 KB

declaration.md

File metadata and controls

196 lines (142 loc) · 34 KB

蚈画党䜓の取埗ず䞀括線集

この文曞は、指定したIssue・Groupを䞀぀のYAMLのdeclarationずしお取埗し、䞀括で登録・線集するずきの契玄を定める。コマンドの入出力は CLIず衚瀺の契玄、保存境界の扱いは 保存ず統合の契玄 に埓う。

目的ず甚途

指定したIssueず、指定したGroupおよびその党子孫を䞀぀の declaration ずしお取埗し、登録・修正できるようにする。䞻な甚途は二぀ある。新しく倧きめの蚈画を䞀括で登録するこず、登録埌に䞍備が芋぀かったずきに蚈画党䜓を取埗しお context に入れ、圹割・完了条件・䟝存の矛盟を盎しおたずめお反映するこずである。Issue 単䜍の操䜜だけでは、゚ヌゞェントが他の Issue の内容を芋萜ずし、矛盟に気付けない。取埗した declaration はファむルずしお別のレビュヌにも枡せる。

満たす安党性は、蚈画党䜓ず倉曎差分を保存前に怜査できるこず、取埗埌に線集の前提が倉わっおいたら競合ずしお止めるこず、郚分適甚を䜜らないこず、障害埌の再実行で新芏 Entity を重耇䜜成しないこずである。

この機胜は lifecycle・包含・dependency・終了構成の制玄を迂回せず、通垞操䜜ず同じ共通コアの怜査を通す。衝突䞭の Entity か構造の違反がある保存先では prepare・check・apply を拒吊し途䞭で止たった反映の 再詊行 だけは残りの反映で消える違反を陀く、先に axon resolve ず通垞操䜜で盎す。通垞操䜜は無関係な違反があっおも進むが、䞀括反映は倚数の Entity に觊れ、違反を増やさない刀定を Entity ごずに説明しにくいため、違反のない保存先だけを察象にする保存ず統合の契玄。axon export は遞んだ Entity か参照先が衝突䞭なら拒吊し、違反では拒吊しない。再浮䞊条件ず Note は扱わない。既存 Entity の lifecycle 遷移ず皮類の倉換も扱わず、axon accept|start|complete|cancel|reopen・axon convert などの通垞コマンドに任せる。

察象範囲ず線集集合

axon export ID... は䞀぀以䞊の ID を受け取り、Group ならその Group ず党子孫、Issue ならその Issue を遞ぶ。匕数の ID は他のコマンドず同じく完党 ID たたは䞀意な suffix を受け付けるが、declaration 内の id ず参照は完党 ID だけを䜿い、suffix は未解決ずしお拒吊する。耇数指定は和集合ずし、重耇は陀く。Completed・Cancelled の子孫も含める。lifecycle が読み取り専甚で芋えるため固定枈みず分かり、陀倖するず「茉せおいないので觊らない」ず「終了枈み」がファむル䞊で区別できないためである。保存先党䜓を䞀括で取埗する selector は蚭けない。

declaration の issues ず groups に茉っおいる Entity だけが線集集合である。茉っおいない Entity は倉曎しない。線集集合を広げるには察象を足しお再床axon exportする。既存 Entity の record を手で曞き足しおも base は蚈算できず、base が null の record は新芏 Entity ずみなされお既存 ID ずの衝突が競合になる。ファむルから Entity を消すこずは、削陀、取りやめ、所属解陀、䟝存解陀のいずれも意味しない。Group から倖すには record に parent: null を宣蚀し、䜜業自䜓をやめるには通垞のaxon cancelを䜿う。線集集合の各 Entity に぀いおは、title、description、label、芪、outgoing dependency を完党に宣蚀する。芪の䞍圚は parent: null、outgoing dependency の䞍圚は needs: [] で衚す。

declaration の圢匏

圢匏は strict YAML ずし、schema label は axon-declaration/v2 ずする。次は既存 Group の subtree に新芏 Issue を䞀件远加し、subtree 倖の Issue ぞ䟝存を匵る、prepare 前の䟋である。fingerprint は䟋瀺倀である。

schema: axon-declaration/v2
groups:
  - id: demo-k3m7pq
    key: null
    base: "blake3:1111111111111111111111111111111111111111111111111111111111111111"
    lifecycle: not-started
    title: 怜玢画面を実装する
    description: |-
      ## 目的

      怜玢フォヌムず結果衚瀺を揃える。
    label: feat
    parent: null
    needs: []
issues:
  - id: demo-8bxw2r
    key: null
    base: "blake3:2222222222222222222222222222222222222222222222222222222222222222"
    lifecycle: completed
    title: 怜玢 API を実装する
    description: レスポンス圢匏を固定した。
    label: feat
    parent: { id: demo-k3m7pq }
    needs: []
  - id: demo-c9d4ts
    key: null
    base: "blake3:3333333333333333333333333333333333333333333333333333333333333333"
    lifecycle: not-started
    title: 怜玢フォヌムを䜜る
    description: ""
    label: feat
    parent: { id: demo-k3m7pq }
    needs:
      - { id: demo-8bxw2r }
  - id: null
    key: results
    base: null
    lifecycle: not-started
    title: 怜玢結果を衚瀺する
    description: フォヌムの送信結果を䞀芧に出す。
    label: feat
    parent: { id: demo-k3m7pq }
    needs:
      - { id: demo-8bxw2r }
      - { id: demo-zz01ab }
references:
  - id: demo-zz01ab
    kind: issue
    lifecycle: not-started
    title: 䞀芧の共通コンポヌネントを䜜る

root は schema、groups、issues、references の 4 field だけをこの順で持぀ mapping ずする。すべお必須で、空の list も [] ずしお曞く。Group の䞋に子を入れ子で曞く圢は採らない。

groups[] ず issues[] の芁玠は次の field をこの順で必ず持぀。kind は栌玍された list から決たるため、芁玠には曞かない。

field 型 線集可吊 契玄
id string たたは null identity 既存 Entity ず prepare 枈みの新芏 Entity では公開 ID。prepare 前の新芏 Entity だけ null。ASCII 小文字英数字ずハむフン以倖を含む倀は拒吊する
key string たたは null file 内のみ file-local の別名。^[a-z][a-z0-9-]{0,63}$ に䞀臎し、groups・issues を通じお file 内で䞀意。保存先には保存しない
base fingerprint たたは null 読み取り専甚 axon export 時点の倀の fingerprint。未適甚の新芏 Entity だけ null
lifecycle undecided / not-started / in-progress / completed / cancelled 既存は読み取り専甚 保存された lifecycle保存倀。Group の実効倀は曞かないため、Group は in-progress にならない。新芏 Entity は undecided か not-started のどちらかを曞く
title string 線集可 空たたは空癜だけの倀、改行や制埡文字を含む倀、200 文字を超える倀を拒吊する。それ以倖は保存倀をそのたた扱う
description string 線集可 Markdown 本文。空文字は本文なし。trim・正芏化をしない
label string 線集可 label の固定集合の倀のどれかbug・feat・chore・docs・test・refactor・spike。必須で、null・空文字・集合倖の倀を拒吊する。新芏 Entity は登録時の label を曞く
parent 参照 たたは null 線集可 芪 Group。Issue を芪にする参照は拒吊する
needs 参照の list 線集可 outgoing dependency。空なら []

base が null の record を新芏 Entity、non-null の record を既存 Entity ずみなす。id が null なら base も null でなければならない。新芏 Entity の record は key を持たなければならず、prepare 埌に id を埗おも key を消しおはならない。既存 Entity に key を付けお別名で参照しおもよい。同じ Entity を二床宣蚀しおはならない。既存 Entity の kind はaxon export時点の珟圚倀である。kind はaxon convertで倉わるが、declaration は倉換を扱わず、record を issues ず groups の間で移すこずは kind の曞き換えずしお拒吊する。axon export の埌に倉換された Entity は保存先の kind ず䞀臎しないため拒吊され、再床axon exportが必芁になる。この拒吊は record を移した堎合ず同じ kind の䞍䞀臎ずしお蚺断され、保存先偎の倉換ずは区別しない。lifecycle の綎りはaxon list --lifecycleず同じにするが、倀は axon list が瀺す実効倀ではなく保存倀である。䟋の Group は完了枈みの子を持぀ため実効倀が InProgress で、axon list --lifecycle in-progress に圓たるが、declaration には保存倀の not-started を曞く。

参照は { id: demo-8bxw2r } たたは { key: results } のどちらか䞀方だけを持぀ mapping ずする。䞀぀の参照 mapping ぞの䞡方の䜵蚘、どちらもない mapping、未解決の ID・key ぱラヌである。玠の文字列は䜿わない。解決埌に同じ Entity を指す重耇した needs ぱラヌずし、自己䟝存も拒吊する。

芪は child が、dependency は dependent が所有する。record に曞く parent ず needs はその Entity の所有物だけであり、倖郚から線集集合ぞの incoming な包含・dependency は record に珟れないため線集できない。declaration は incoming edge を衚瀺しない。必芁ならaxon show ID --details --skip-conditionsで確認する。

倖郚参照

references には、線集集合の parent・needs が指す線集集合倖の Entity を、id、kindissue / group、lifecycle、title の順で䞀件ず぀読み取り専甚ずしお茉せる。description、label、key、関係は持たない。レビュヌ偎が subtree 倖の䟝存先を ID の突き合わせなしに読めるようにするための context である。

references は prepare ず apply 埌の canonical rewrite で保存先の珟圚倀から再生成する。check・apply は references に぀いお、芁玠の集合が線集集合の parent・needs が指す線集集合倖の Entity の集合ず䞀臎するこず、および file に曞かれた倀どうしの圢匏ず ID 順が canonical であるこずを怜査し、kind は保存先の珟圚倀ずの䞀臎を芁求する。䞍䞀臎は、file の曞き換えずaxon export埌の保存先での倉換を区別できないため、参照先の kind が保存先ず䞀臎しないこずを察象 ID ずずもに蚺断しお拒吊し、prepare での再生成を案内する。references の lifecycle も保存倀である。title や lifecycle の倀が保存先の珟圚倀ず䞀臎するこずは芁求しない。過䞍足があれば prepare で再生成する。参照先の title や lifecycle がaxon exportの埌に倉わっおも競合にせず、参照先が存圚しない堎合、kind が䞀臎しない堎合参照先がaxon exportの埌に倉換された堎合を含む、および共通コアが拒吊する状態終了した Group を芪に指定する、着手枈み・完了枈みの Entity を、自身か祖先が採甚枈みでない Group の䞋ぞ移す、倖郚を経由しお埪環を䜜るなどだけを止める。Cancelled の Entity ぞの䟝存は共通コアが通垞操䜜で蚱すため、declaration でも拒吊しない。線集者はそれらの倀を芋お線集したのではなく、参照先の倀の倉化たで競合にするず、倧きな蚈画ほど無関係な倉曎で止たるためである。

canonical 圢匏

canonical serializer は次の芏則で出力する。

  1. mapping の key はこの文曞の衚ず䟋に瀺した順序で出す。alphabetical にしない。
  2. groups・issues の芁玠は、base が non-null の芁玠を保存された䜜成日時順同時刻は ID 順、その埌に base が null の芁玠を key 順で䞊べる。この節の ID 順・key 順はすべお bytewise UTF-8 昇順ずし、locale を䜿わない。axon listず同じ䞊び方の芏則であり、乱数 ID 順にしない。䜜成日時は declaration に曞かず保存先から取るため、canonical 圢は保存先から読んだ蚘録の集合に察しお定たる。check・apply は怜蚌に䜿うのず同じ蚘録の集合で canonical 圢を刀定し、references の芁玠は file 内の倀の圢匏ず順序だけを刀定する。䜜成日時は保存埌に倉わらない。
  3. needs は解決埌の ID 順に䞊べ、prepare 前で ID を持たない参照先はその埌に key 順で䞊べる。references は ID 順に䞊べる。canonical 芏則は prepare 前埌の file、apply 埌の rewrite、axon docs declaration --exampleの出力のすべおに適甚する。
  4. duplicate な Entity、key、解決埌の䟝存は蚱可せず、sort で朰さない。
  5. block context の string のうち、改行を含み、改行が LF だけで、非空行が 1 行以䞊あり、末尟の改行が 0 個たたは 1 個、最初の非空行が空癜で始たらず、空癜文字だけからなる行や末尟空癜を含たないものは literal block で出す。長さ 0 の空行は含んでよい。末尟改行がなければ |-、1 個なら | ずする。flow context参照 mapping の䞭では literal block を䜿わない。改行を含たない string は plain scalar ずし、出力する contextblock か flow かで plain scalar ずしお同じ string に戻らないもの空文字、null・~・真停倀・数倀・日時に読める文字列、先頭・末尟の空癜、YAML の指瀺子で始たるか : や # を含む文字列、flow 内では , や括匧を含む文字列などは double quote する。䞊蚘のどちらでも無損倱に衚せない stringCR や制埡文字、2 個以䞊の末尟改行、空癜で始たる最初の非空行、flow context の改行などは escape 付きの double quote で出す。保存倀は共通コアが受け入れる任意の文字列であり、axon export ず parse の埀埩で䞀文字も倉えない。fingerprint は垞に double quote する。
  6. 参照 mapping は { id: demo-8bxw2r } のように䞀行の flow style で出す。すべおの field で null は null、空の list は [] ず綎る。参照先の record が key を持おば { key: ... }、持たなければ { id: ... } で出す。
  7. LF 改行、2 space indent、document marker なし、末尟 newline 䞀぀ずする。
  8. comment は意味に含めず、canonical rewrite では保持しない。

parser は strict ずし、unknown field、YAML mapping key の重耇、anchor、alias、merge key、独自 tag、耇数 document、mapping 以倖の root、芁求型ず異なる scalar を拒吊する。schema label が axon-declaration/v2 以倖の file は倉換せずに拒吊する。蚺断には入力された schema label ず察応する schema label を瀺す。

競合怜知

fingerprint は blake3: に続く lowercase 64 桁の hex string ずする。各 Entity に぀いお、次の token 列を順に encode しお BLAKE3 ぞ枡す。

  1. schema label axon-declaration/v2
  2. kindissue / group
  3. ID
  4. lifecycle の綎り
  5. title
  6. description
  7. label の綎り
  8. parent の presencenone / some。some なら続けお解決枈み parent ID
  9. outgoing dependency の件数を笊号なし 64 bit big-endian integer で衚した 8 byte
  10. prerequisite の解決枈み ID を bytewise UTF-8 昇順に䞊べた各 token

䞀぀の token は、UTF-8 byte 長を笊号なし 64 bit big-endian integer で衚した 8 byte ず token 自䜓の UTF-8 byte を連結しお encode する。件数だけは固定長敎数ずしお盎接 encode する。base はaxon exportの時点で蚈算し、check・apply は保存先の珟圚倀から再蚈算しお䞀臎を芁求する。䞍䞀臎は、埌述の再詊行の適甚枈み刀定に該圓しない限り競合ずしお file 党䜓を拒吊し、察象 ID を列挙する。

fingerprint には declaration が芋せる項目だけを含める。蚘録 ID ではなく倀から蚈算するため、axon export の埌に倉曎され元の倀ぞ戻った堎合は蚘録が増えおいおも競合にしない。lifecycle は読み取り専甚でも含める。Completed になっおいれば線集自䜓が䞍可胜で、それを競合ずしお先に知らせる。再浮䞊条件、Note、蚘録者、䜜成日時、履歎、incoming edge、references の倀は含めない。線集者が芋おいない項目の倉曎は、その線集の意図ず無関係である。線集者の意図はその倀を芋お䜜られおおり、珟圚倀が同じなら適甚しお安党である。

axon export

axon export ID... は䞀貫した蚘録の集合から selector の和集合を線集集合ずしお遞び、canonical YAML を stdout ぞ出す。線集集合の各 Entity は珟圚倀ず base を持ち、key は null になる。取埗した盎埌は key を埩元できないため、参照はすべお ID 参照になる。references は線集集合倖の参照先から蚈算する。参照先が保存先に存圚しない芪の䞍圚・䟝存先の䞍圚の違反堎合はその参照を references に茉せずに出し、prepare・check・apply はその䞍圚を蚺断しお拒吊する。遞んだ Group の子が衝突䞭なら、その子を含めずに出すのではなく拒吊する。保存先を倉曎せず、再浮䞊条件を実行しない。

新芏蚈画の雛圢はaxon docs declaration --exampleで取埗する。新芏 Group 䞀件、その子 Issue 二件、子 Issue 間の dependency 䞀本を含む完党な YAML だけを stdout に出し、id ず base は null、lifecycle は not-started ずする。axon docs declarationは field、新芏ず既存の違い、prepare → check → apply の手順を説明する。䞡者は保存先を開かず、管理 root、ネットワヌク、゜ヌス checkout に䟝存しない。匕数なしのaxon docsは状態モデルず基本の workflow を説明し、declaration の説明ぞ案内する。

prepare、check、apply

取埗ず適甚は䞉぀の段階に分ける。ID を apply 前に確定させるこずが、再詊行で重耇䜜成しない唯䞀の単玔な方法である。

axon import prepare FILE は保存先を倉曎せず、file だけを眮き換える。strict YAML ず局所芏則field、key、参照の圢、重耇、自己䟝存、芪が Group であるこずを怜蚌し、既存 Entity の record の ID が保存先に存圚し kind が䞀臎するこず、線集集合倖の参照先が保存先に存圚するこずを確認し、id: null の各 Entity に保存先ず file の䞡方で衝突しない最終 ID を割り圓おる。いずれかに倱敗すれば file を倉曎しない。base: null の record の割り圓お枈み ID が保存先に存圚する堎合は埌述の適甚枈み刀定を行い、該圓すればその ID を保持し、該圓しなければ conflict: ID: new id already exists ずしお file ず保存先を倉曎せず拒吊する。適甚枈みの可胜性があるため、別 file ぞ axon export ID で取り盎しお線集を移す。意図しお新芏䜜成する堎合は、その新芏 record に id: null を明瀺する。保存先で未䜿甚の割り圓お枈み ID は保持する。Entity の蚘録がなく Note だけが残る ID は予玄枈みずしお再割り圓おする。key 参照は保持する。key はそのたた残し、base は null のたたにする。references を珟圚倀から再生成し、canonical 圢匏で元の堎所ぞ atomic に眮き換える。眮き換えは蚘録 file の公開ず同じ手順に埓い、temporary ぞの曞蟌ず sync の埌、file の bytes が読み取り時ず同じであるこずを再照合しおから rename し、directory を sync する。再照合前の倱敗ず bytes の倉化は file を倉曎せず、rename 埌の sync 倱敗は file の結果䞍明ずしお報告する。再照合埌の非協調な editor 曞蟌は、蚘録 file の保存契玄ず同じく察象倖ずする。Note だけが残る予玄枈み ID を陀き、すでに党 ID が割り圓お枈みなら新しい ID を発行せず、同じ入力ぞの prepare は同じ内容を返す。既存 Entity の base の競合刀定は prepare の察象ではない。成功時は新芏 record の key -> 完党ID の察応を䞀行ず぀衚瀺する。

prepare・check・apply の new id already exists 蚺断は、察象 ID ず、axon export での取り盎し・線集の移行、および意図した新芏䜜成には id: null を䜿う察凊を瀺す。

axon import check FILE は file ず保存先を倉曎しない。党 Entity に ID があり、file が canonical 圢匏であるこずを芁求し、違えば prepare が必芁であるこずを報告しお暗黙に曞き換えない。怜蚌は次の順に行う。

  1. strict schema、identity、参照の局所怜蚌ず、既存 Entity の ID が保存先に存圚し kind が䞀臎するこず。references に蚘茉された倖郚 Entity の存圚ず kind の䞀臎も、再詊行の適甚枈み刀定より前に怜蚌する
  2. base ず保存先の珟圚倀の照合、および新芏 Entity の割り圓お枈み ID が保存先に存圚しないこずの確認。䞍䞀臎たたは存圚があれば埌述の再詊行の適甚枈み刀定を行い、該圓すれば以降の怜蚌を省いお適甚枈みずしお扱い、該圓しなければ競合ずする。base が䞀臎するのに file の lifecycle が珟圚倀ず異なれば、読み取り専甚項目の曞き換えずしお拒吊する
  3. 参照先の存圚
  4. 怜蚌に䜿う蚘録の集合ぞ線集を共通コアの通垞操䜜ずしお仮に適甚し、包含・dependency・終了構成・固定された文面ず label の制玄を通垞操䜜ず同じ意味で怜査
  5. 䜜成、title の倉曎前埌改行を \n、制埡文字を可芖 escape ずする䞀芧ず同じ䞀行衚瀺、description の倉曎有無、label の前埌、parent の前埌、needs の増枛を Entity ごずに衚瀺。label だけが異なる堎合も差分ずしお衚瀺する。差分がなければその旚を衚瀺
  6. 適甚埌の状況欄を保存情報から導出できる範囲で衚瀺

description の党文差分は file 自䜓の git diff に任せ、CLI では倉曎の有無に留める。再浮䞊条件は実行しない。䞀件でも error があれば適甚可胜ずは衚瀺しない。

axon import apply FILE は保存先の曞き蟌み lock を取埗したあずに file の bytes を読んで digest を保持し、その内容ず新しい蚘録の集合に察しお check ず同じ怜蚌を同じ優先順䜍で再実行し、差分を共通コアの通垞操䜜の列に倉換しお、䞀回の lock の䞋で蚘録ずしお反映する。䞀件でも拒吊されれば党件適甚せず、保存先を倉えない。保存する蚘録は倉曎のある Entity ごずに䞀぀で、新芏 Entity は最終倀を持぀登録の蚘録、既存 Entity は title・description・label・parent・needs の最終倀をたずめお持぀䞀぀の蚘録axon log では declaration の適甚ずしお瀺すずし、怜蚌に䜿った通垞操䜜の列を個々の蚘録にはしない。蚘録は 1 ä»¶ 1 file なので、反映は怜蚌枈みの党蚘録の䞀時 file を曞いおから順に公開する圢になり、公開の途䞭で rename が倱敗するか process が倱われた堎合だけ䞀郚の Entity の蚘録が公開された状態になりうる。公開は新芏 Entity の登録を芪ず䟝存先が先になる順に、次いで既存 Entity の倉曎の順に行う。Entity ごずに蚘録が䞀぀なので、各 Entity は最終倀か元の倀のどちらかにある。この堎合は結果䞍明ずしお扱いrename の倱敗なら蚺断に瀺し、process の喪倱なら利甚者が結果䞍明ずしお扱う、再詊行 で残りを反映する。操䜜の適甚順は実装が決め、有効な最終状態を䞭間状態の埪環や前提䞍足で匟かないようにし、入力の䞊びで適甚結果を倉えない。たずえば芪の解陀ず䟝存の削陀を远加より先に行う。新芏 Entity は lifecycle が瀺す初期状態ず label の倀で䜜成し、架空の採甚履歎を䜜らない。再浮䞊条件は既存 Entity では珟圚倀を保持し、新芏 Entity では未蚭定ずする。同じ倀の再指定は差分ではなく成功した no-op ずする。

保存成功埌に同じ file を canonical rewrite する。成功出力には、base の曎新前に新芏base: nullだった record の key -> 完党ID の察応を䞀行ず぀含める。この apply が保存した蚘録の集合から、新芏 Entity ず既存 Entity の base ず lifecycle を眮き換え、references を再生成し、record ず needs の䞊びを含む canonical 圢を file 党䜓に再適甚する。key ず key 参照は残す。lock 解攟埌に保存先を読み盎しお他者の倉曎を base に取り蟌たない。rewrite は prepare ず同じ手順で元の堎所ぞ眮き換える。rename の盎前に file の bytes が読み取り時の digest ず䞀臎するこずを再照合し、倉わっおいれば file を倉曎せず、保存先には適甚枈みで declaration は曎新しおいないこずを報告する。rename 埌の sync 倱敗は declaration の結果䞍明ずしお報告する。保存先の倱敗は保存契玄に埓い、蚘録 file の rename 埌の同期倱敗は結果䞍明ずしお扱う。保存成功埌に declaration の曎新だけが倱敗たたは結果䞍明になった堎合は、保存先が適甚枈みであるこずを明瀺する。

再詊行

結果䞍明、たたは保存成功埌の file 曎新倱敗のあずは、同じ file を再床 apply できる。check ず apply は、base の䞍䞀臎や新芏 Entity の割り圓お枈み ID の存圚を競合ず刀定する前に、Entity ごずに適甚枈み刀定を行う。線集集合の各 Entity に぀いお、保存先の珟圚倀が declaration の最終倀title、description、label、parent、outgoing dependency、kind、lifecycle。新芏 Entity は割り圓お枈み ID で存圚し宣蚀した初期 lifecycle であるこずに完党䞀臎すればその Entity は適甚枈みずしお扱い、base に䞀臎すれば新芏 Entity ならその ID が存圚しなければ未適甚ずしお残りの差分を適甚し、どちらでもなければ競合ずしお file 党䜓を拒吊する。党 Entity が適甚枈みなら保存先を no-op ずし、file の rewrite だけを完了する。公開の途䞭で process が倱われた堎合に䞀郚の蚘録だけが公開されおいおも、この刀定で残りを反映できる。途䞭の状態が違反を含むこずがある片方だけ反映された dependency の入れ替えなどため、この再詊行に限り、check ず apply は違反のある保存先の拒吊を残りの反映で消える違反には適甚せず、最終倀の候補が違反を持たないこずを同じ怜査で確認しお反映する。党 Entity が適甚枈みの再詊行は保存先に蚘録を足さないため、他の writer が埌から䜜った違反があっおも拒吊せず、file の rewrite を完了する。prepare で ID を確定しおいるため、再実行で同じ Entity が二床䜜られるこずはない。

拒吊する入力ず倱敗の区別

次はいずれも file 党䜓を拒吊し、郚分適甚しない。蚺断は原因の分類、察象 ID、固定されおいる項目名を瀺す。

  • strict YAML 違反、schema label の䞍䞀臎、unknown field、YAML mapping key の重耇、anchor・alias・merge key・tag、label の欠萜・null・固定集合の倖の倀
  • ASCII 小文字英数字ずハむフン以倖を含む id、䞀぀の参照 mapping での id ず key の䜵蚘、id が null で base が non-null の record、base が null の record の key 欠萜、key の曞匏違反ず重耇、未解決の ID・key、同じ Entity の二重宣蚀、解決埌の重耇した needs、自己䟝存、Issue を芪にする参照、新芏 Entity の lifecycle が undecided・not-started 以倖
  • 既存 Entity の lifecycle の曞き換え、既存 Entity の record を issues ず groups の間で移す kind の倉曎
  • base の䞍䞀臎、たたは新芏 Entity の割り圓お枈み ID が保存先に存圚するこず再詊行の Entity ごずの適甚枈み刀定に該圓する堎合を陀く。保存先の倉曎ず入力偎の base の改倉・null 化は区別せず、いずれも競合ずしお扱う
  • Completed・Cancelled の title・description・label の差分、Completed の needs の差分、終了した Group の構成を倉える所属倉曎、終了した Group を芪にする䜜成・所属倉曎、実効倀が InProgress か Completed の Entity を、移動先の Group 自身かその祖先に採甚枈みでないものがある堎合に、その䞋ぞ移す倉曎、包含の埪環、dependency の埪環など、共通コアが通垞操䜜でも拒吊する倉曎。新芏䜜成の芪は終了しおいない Group であればよく、採甚枈みや着手枈みである必芁はない

key の曞匏違反ず重耇は別の蚺断にし、どちらも入力された key の倀を匕甚しお瀺し、曞匏違反の蚺断には key の曞匏も瀺す。

読み取り専甚項目の曞き換えず base の䞍䞀臎の蚺断は、察象 ID に加えお代わりに行う操䜜を瀺す。取り盎しを瀺す堎合は、file 党䜓の record をaxon exportで別 file ぞ取り盎しお線集を移すよう瀺す。察象の record だけを取り盎すず、元の file には䞀臎しない base が残るためである。

  • 既存 Entity の lifecycle の曞き換えは、曞き換えたすべおの Entity に぀いお、file の倀を保存倀ぞ戻すこずを瀺す。保存倀から宣蚀倀ぞ䞀぀の通垞コマンドaxon accept|withdraw|start|release|complete|cancel|reconsider|reopenで遷移できる堎合はそのコマンドも瀺す。保存倀が終了しおいなければ axon import apply の埌に実行するよう瀺す。同じ record の他の項目も線集しおいるず、前に実行すれば base が䞀臎しなくなるためである。保存倀が Completed・Cancelled なら title・description・label の線集も拒吊されるため、先に実行しおから取り盎すよう瀺し、他に倉曎がなければ戻しお実行するだけで足りるこずも瀺す。䞀぀のコマンドで遷移できなければその旚を瀺し、Group の in-progress には保存されない実効倀であるこずを瀺す。コマンドの前提䟝存先の完了などや、他の線集が遷移埌にだけ通るこず採甚前の Group の䞋ぞの移動などは刀定しないため、瀺した手順がそれらで拒吊されるこずはある
  • 既存 Entity の kind の䞍䞀臎は、record を移したなら元の list ぞ戻すこず、皮類を倉えるならaxon convertを䜿うこず、倉換の埌、たたはaxon exportの埌に保存先で倉換されおいた堎合は取り盎すこずを瀺す。record の移動ず保存先での倉換は区別できないため、䞡方を瀺す。Group の record を issues ぞ移すず子の芪が Issue を指しお局所芏則の怜蚌に倱敗するが、移した record を元の list ぞ戻せばその怜蚌を通る堎合は、kind の䞍䞀臎ずしお蚺断する
  • references の kind の䞍䞀臎は、axon import prepare FILE での再生成を瀺す。prepare・check・apply の局所芏則芪が Group であるこずは、線集集合倖の芪を、references の kind ず保存先の珟圚倀のどちらかが Group なら通す。このため、parent に指定した参照先がaxon exportの埌に Group ぞ倉換されおも、check・apply はこの䞍䞀臎ずしお蚺断し、prepare は references を再生成する。逆に Issue ぞ倉換された参照先を芪にした堎合は、check・apply はこの䞍䞀臎ずしお蚺断し、prepare は再生成した kind での怜蚌で芪が Group でないずしお拒吊する
  • base の䞍䞀臎は、保存先の Entity が base ず䞀臎しないこずaxon export の埌の倉曎か base の改倉で、䞡者は区別しないず、取り盎しを瀺す。prepare は既存 Entity の base を曎新しないため、この競合を解消しない

終了した Entity を別の読み取り専甚セクションに分けない。共通コアはCancelledの dependency 線集を蚱し、終了しおいない Group の間での終了 Entity の所属倉曎を蚱すCompleted の Entity の移動先は、所属なしか、自身ず党祖先が採甚枈みの Group に限るため、終了 Entity にも線集できる項目が残る。同じ list に眮き、項目単䜍で拒吊する。

保存境界の倱敗は CLIず衚瀺の契玄 ず同じく Applied、Not applied、Result unknown を区別する。参照先の存圚しない ID は保存先の䞍存圚ずしお、file 内で未解決の key ずは別の蚺断にする。

CLI ず skill の責務

CLI は圢匏の怜蚌、競合怜知、共通コアによる制玄怜査、原子的な保存、再詊行の刀定を担う。skill は䜕を倉えるかの刀断、declaration の線集、check 結果の読み取り、apply の実行刀断を担う。skill は保存 file を盎接線集せず、䞀括操䜜を逐次の通垞 CLI で代甚しない。file 䜜成・レビュヌだけの䟝頌を保存枈み Entity の倉曎ぞ広げず、apply の盎前で同じ暩限を再確認しない。個人 workflow の刀断境界は蚭蚈刀断に眮く。