perttool 0.1.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/LICENSE +21 -0
  3. package/README.md +134 -0
  4. package/dist/analysis/graph.d.ts +41 -0
  5. package/dist/analysis/graph.d.ts.map +1 -0
  6. package/dist/analysis/graph.js +199 -0
  7. package/dist/analysis/graph.js.map +1 -0
  8. package/dist/analysis/precedence.d.ts +52 -0
  9. package/dist/analysis/precedence.d.ts.map +1 -0
  10. package/dist/analysis/precedence.js +187 -0
  11. package/dist/analysis/precedence.js.map +1 -0
  12. package/dist/analysis/resource.d.ts +96 -0
  13. package/dist/analysis/resource.d.ts.map +1 -0
  14. package/dist/analysis/resource.js +522 -0
  15. package/dist/analysis/resource.js.map +1 -0
  16. package/dist/application/analyze.d.ts +32 -0
  17. package/dist/application/analyze.d.ts.map +1 -0
  18. package/dist/application/analyze.js +144 -0
  19. package/dist/application/analyze.js.map +1 -0
  20. package/dist/application/check.d.ts +24 -0
  21. package/dist/application/check.d.ts.map +1 -0
  22. package/dist/application/check.js +43 -0
  23. package/dist/application/check.js.map +1 -0
  24. package/dist/application/format.d.ts +21 -0
  25. package/dist/application/format.d.ts.map +1 -0
  26. package/dist/application/format.js +52 -0
  27. package/dist/application/format.js.map +1 -0
  28. package/dist/application/mutate.d.ts +4 -0
  29. package/dist/application/mutate.d.ts.map +1 -0
  30. package/dist/application/mutate.js +175 -0
  31. package/dist/application/mutate.js.map +1 -0
  32. package/dist/application/next.d.ts +86 -0
  33. package/dist/application/next.d.ts.map +1 -0
  34. package/dist/application/next.js +310 -0
  35. package/dist/application/next.js.map +1 -0
  36. package/dist/cli.d.ts +3 -0
  37. package/dist/cli.d.ts.map +1 -0
  38. package/dist/cli.js +2103 -0
  39. package/dist/cli.js.map +1 -0
  40. package/dist/conversion/mermaid-import.d.ts +26 -0
  41. package/dist/conversion/mermaid-import.d.ts.map +1 -0
  42. package/dist/conversion/mermaid-import.js +655 -0
  43. package/dist/conversion/mermaid-import.js.map +1 -0
  44. package/dist/conversion/mermaid.d.ts +38 -0
  45. package/dist/conversion/mermaid.d.ts.map +1 -0
  46. package/dist/conversion/mermaid.js +362 -0
  47. package/dist/conversion/mermaid.js.map +1 -0
  48. package/dist/editing/unified-diff.d.ts +7 -0
  49. package/dist/editing/unified-diff.d.ts.map +1 -0
  50. package/dist/editing/unified-diff.js +81 -0
  51. package/dist/editing/unified-diff.js.map +1 -0
  52. package/dist/formatter/source-formatter.d.ts +17 -0
  53. package/dist/formatter/source-formatter.d.ts.map +1 -0
  54. package/dist/formatter/source-formatter.js +210 -0
  55. package/dist/formatter/source-formatter.js.map +1 -0
  56. package/dist/help/registry.d.ts +37 -0
  57. package/dist/help/registry.d.ts.map +1 -0
  58. package/dist/help/registry.js +657 -0
  59. package/dist/help/registry.js.map +1 -0
  60. package/dist/index.d.ts +44 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +23 -0
  63. package/dist/index.js.map +1 -0
  64. package/dist/io/document-file.d.ts +9 -0
  65. package/dist/io/document-file.d.ts.map +1 -0
  66. package/dist/io/document-file.js +19 -0
  67. package/dist/io/document-file.js.map +1 -0
  68. package/dist/io/safe-write.d.ts +33 -0
  69. package/dist/io/safe-write.d.ts.map +1 -0
  70. package/dist/io/safe-write.js +280 -0
  71. package/dist/io/safe-write.js.map +1 -0
  72. package/dist/model/diagnostics.d.ts +43 -0
  73. package/dist/model/diagnostics.d.ts.map +1 -0
  74. package/dist/model/diagnostics.js +47 -0
  75. package/dist/model/diagnostics.js.map +1 -0
  76. package/dist/model/rational.d.ts +21 -0
  77. package/dist/model/rational.d.ts.map +1 -0
  78. package/dist/model/rational.js +84 -0
  79. package/dist/model/rational.js.map +1 -0
  80. package/dist/model/syntax.d.ts +67 -0
  81. package/dist/model/syntax.d.ts.map +1 -0
  82. package/dist/model/syntax.js +15 -0
  83. package/dist/model/syntax.js.map +1 -0
  84. package/dist/model/units.d.ts +18 -0
  85. package/dist/model/units.d.ts.map +1 -0
  86. package/dist/model/units.js +29 -0
  87. package/dist/model/units.js.map +1 -0
  88. package/dist/mutation/advance.d.ts +26 -0
  89. package/dist/mutation/advance.d.ts.map +1 -0
  90. package/dist/mutation/advance.js +261 -0
  91. package/dist/mutation/advance.js.map +1 -0
  92. package/dist/mutation/diagnostics.d.ts +10 -0
  93. package/dist/mutation/diagnostics.d.ts.map +1 -0
  94. package/dist/mutation/diagnostics.js +10 -0
  95. package/dist/mutation/diagnostics.js.map +1 -0
  96. package/dist/mutation/entity-editor.d.ts +16 -0
  97. package/dist/mutation/entity-editor.d.ts.map +1 -0
  98. package/dist/mutation/entity-editor.js +103 -0
  99. package/dist/mutation/entity-editor.js.map +1 -0
  100. package/dist/mutation/milestone.d.ts +5 -0
  101. package/dist/mutation/milestone.d.ts.map +1 -0
  102. package/dist/mutation/milestone.js +194 -0
  103. package/dist/mutation/milestone.js.map +1 -0
  104. package/dist/mutation/resource.d.ts +5 -0
  105. package/dist/mutation/resource.d.ts.map +1 -0
  106. package/dist/mutation/resource.js +145 -0
  107. package/dist/mutation/resource.js.map +1 -0
  108. package/dist/mutation/source.d.ts +22 -0
  109. package/dist/mutation/source.d.ts.map +1 -0
  110. package/dist/mutation/source.js +155 -0
  111. package/dist/mutation/source.js.map +1 -0
  112. package/dist/mutation/task.d.ts +10 -0
  113. package/dist/mutation/task.d.ts.map +1 -0
  114. package/dist/mutation/task.js +644 -0
  115. package/dist/mutation/task.js.map +1 -0
  116. package/dist/mutation/text-edits.d.ts +8 -0
  117. package/dist/mutation/text-edits.d.ts.map +1 -0
  118. package/dist/mutation/text-edits.js +33 -0
  119. package/dist/mutation/text-edits.js.map +1 -0
  120. package/dist/mutation/types.d.ts +153 -0
  121. package/dist/mutation/types.d.ts.map +1 -0
  122. package/dist/mutation/types.js +2 -0
  123. package/dist/mutation/types.js.map +1 -0
  124. package/dist/parser/document-parser.d.ts +6 -0
  125. package/dist/parser/document-parser.d.ts.map +1 -0
  126. package/dist/parser/document-parser.js +735 -0
  127. package/dist/parser/document-parser.js.map +1 -0
  128. package/dist/recommendation/explanation-types.d.ts +226 -0
  129. package/dist/recommendation/explanation-types.d.ts.map +1 -0
  130. package/dist/recommendation/explanation-types.js +2 -0
  131. package/dist/recommendation/explanation-types.js.map +1 -0
  132. package/dist/recommendation/explanation-validation.d.ts +4 -0
  133. package/dist/recommendation/explanation-validation.d.ts.map +1 -0
  134. package/dist/recommendation/explanation-validation.js +745 -0
  135. package/dist/recommendation/explanation-validation.js.map +1 -0
  136. package/dist/recommendation/explanation-values.d.ts +7 -0
  137. package/dist/recommendation/explanation-values.d.ts.map +1 -0
  138. package/dist/recommendation/explanation-values.js +283 -0
  139. package/dist/recommendation/explanation-values.js.map +1 -0
  140. package/dist/recommendation/explanation.d.ts +8 -0
  141. package/dist/recommendation/explanation.d.ts.map +1 -0
  142. package/dist/recommendation/explanation.js +1022 -0
  143. package/dist/recommendation/explanation.js.map +1 -0
  144. package/dist/recommendation/failure.d.ts +3 -0
  145. package/dist/recommendation/failure.d.ts.map +1 -0
  146. package/dist/recommendation/failure.js +4 -0
  147. package/dist/recommendation/failure.js.map +1 -0
  148. package/dist/recommendation/json.d.ts +3 -0
  149. package/dist/recommendation/json.d.ts.map +1 -0
  150. package/dist/recommendation/json.js +252 -0
  151. package/dist/recommendation/json.js.map +1 -0
  152. package/dist/recommendation/override-types.d.ts +117 -0
  153. package/dist/recommendation/override-types.d.ts.map +1 -0
  154. package/dist/recommendation/override-types.js +2 -0
  155. package/dist/recommendation/override-types.js.map +1 -0
  156. package/dist/recommendation/override.d.ts +7 -0
  157. package/dist/recommendation/override.d.ts.map +1 -0
  158. package/dist/recommendation/override.js +717 -0
  159. package/dist/recommendation/override.js.map +1 -0
  160. package/dist/recommendation/ranking.d.ts +7 -0
  161. package/dist/recommendation/ranking.d.ts.map +1 -0
  162. package/dist/recommendation/ranking.js +391 -0
  163. package/dist/recommendation/ranking.js.map +1 -0
  164. package/dist/recommendation/types.d.ts +83 -0
  165. package/dist/recommendation/types.d.ts.map +1 -0
  166. package/dist/recommendation/types.js +2 -0
  167. package/dist/recommendation/types.js.map +1 -0
  168. package/dist/semantic/validator.d.ts +4 -0
  169. package/dist/semantic/validator.d.ts.map +1 -0
  170. package/dist/semantic/validator.js +490 -0
  171. package/dist/semantic/validator.js.map +1 -0
  172. package/dist/version.d.ts +2 -0
  173. package/dist/version.d.ts.map +1 -0
  174. package/dist/version.js +2 -0
  175. package/dist/version.js.map +1 -0
  176. package/package.json +61 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,53 @@
1
+ # Changelog
2
+
3
+ このプロジェクトの主な変更を記録する。形式は[Keep a Changelog](https://keepachangelog.com/ja/1.1.0/)を参考にし、versionは[Semantic Versioning](https://semver.org/lang/ja/)に従う。
4
+
5
+ ## [Unreleased]
6
+
7
+ ## [0.1.0-alpha.2] - 2026-07-23
8
+
9
+ 2回目の公開開発プレビュー。安全な編集・進行操作、Mermaid相互変換、説明可能なtask recommendationを追加し、同じartifactをGitHub Releaseとnpmの`alpha` tagへ配布する。
10
+
11
+ ### Added
12
+
13
+ - `dsl format`とtask/milestone/resource/batch mutationのatomic `--write`、exclusive `--out`、`--expect-digest`
14
+ - `Perttool.MermaidProfile.v1`のsemantic record、integrity digest、fail-closed import設計契約と規範artifact
15
+ - `exportMermaid` Coreと`dag render --to mermaid`のlossless/plain profile、解析annotation、strict loss、exclusive `--out`
16
+ - `importMermaid` Coreと`dag import --from mermaid`のfail-closed profile復元、plain loss report、strict loss、exclusive `--out`
17
+ - canonical keep/remove set、partial join、idempotenceを保証するpure `planAdvance` Coreとpreview-first `dag advance` CLI
18
+ - exact typed fact、comparison、decision trace、canonical descriptionを持つcomplete recommendation graphとpublic `NextResultV3` Core型
19
+ - 5つのself-use planでv3 contract、byte determinism、operational互換、structured why-notを検査するrecommendation shadow gateとgolden
20
+ - feasible replacement、`PTOVR-101`から`PTOVR-106`、caller-asserted human reason、normal trace reference、deterministic `Perttool.OverrideDecision.v1`を返すread-only `validateOverride` Core
21
+ - completeかつknownな`NextResult.v3`をnormal AI task selection authorityへ採用する共有指示、help、unknown-version safe stop dry-run
22
+ - npm publish normalizationを検査するpackage preflight、同一tarballをfail-closedでpublishするmaintainer script、`alpha` dist-tag固定
23
+
24
+ ### Changed
25
+
26
+ - pre-release breaking changeとして`dag next`のdefault JSONを`Perttool.NextResult.v2`から`Perttool.NextResult.v3`へ変更し、Core、CLI JSON/text、help、packageをatomicに公開
27
+ - npmがCLI entrypointを除去しないよう`bin.perttool`をcanonicalな`dist/cli.js`へ修正
28
+
29
+ ## [0.1.0-alpha.1] - 2026-07-21
30
+
31
+ 最初の公開開発プレビュー。DSLとCLIの評価、read-onlyな計画検査・分析・次task選択を目的とする。stable MVPではなく、互換性のない変更が入る可能性がある。
32
+
33
+ ### Added
34
+
35
+ - Activity-on-Arrow DSLのparser、semantic/graph validation、複数error recovery
36
+ - exact Rationalを使うPERT/CPM precedence分析とcritical path列挙
37
+ - renewable resource capacityを扱う決定的`parallel-sgs` heuristic schedule
38
+ - `active`、`ready`、`runnable_now`、`blocked_now`、`upcoming`の機械的判定
39
+ - Point見積りとproject-wide velocityによるday/hour forecast
40
+ - text/JSON CLI、構造化help、stable diagnostic codeとsource span
41
+ - `npm link`およびGitHub Release tarballによるCLI導入
42
+
43
+ ### Known limitations
44
+
45
+ - `dsl format`、task/milestone/resource mutation、`dag advance`は未実装
46
+ - Mermaid import/exportは未実装
47
+ - Resource scheduleは`optimal=false`のheuristicであり、厳密最適解ではない
48
+ - npm registryには未公開。GitHub Release assetを使用する
49
+ - Node.js 24以上が必要
50
+
51
+ [Unreleased]: https://github.com/mako10k/perttool/compare/v0.1.0-alpha.2...HEAD
52
+ [0.1.0-alpha.2]: https://github.com/mako10k/perttool/compare/v0.1.0-alpha.1...v0.1.0-alpha.2
53
+ [0.1.0-alpha.1]: https://github.com/mako10k/perttool/releases/tag/v0.1.0-alpha.1
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Makoto Katsumata
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,134 @@
1
+ # perttool
2
+
3
+ PERT 線図を、Git 管理しやすい文書として記述・検査・分析するためのタスク管理CLI。
4
+
5
+ `v0.1.0-alpha.2`は公開開発プレビューです。`dsl check`、`dsl format`、`dsl help`、`dag analyze`、`dag next`、`dag advance`、`dag render --to mermaid`、`dag import --from mermaid`、source-preservingなtask/milestone/resource/batch mutation、atomic `--write`、exclusive `--out`、`--expect-digest`を実装済みです。`dag next`はcompleteなrecommendation graphを持つ`Perttool.NextResult.v3`を返し、public Core型とCLI JSON/text/helpを同じ判断へ接続します。Node.js 24以上が必要で、pre-release中は互換性のない変更が入る可能性があります。
6
+
7
+ - [要件定義](docs/requirements.md)
8
+ - [基本設計](docs/basic-design.md)
9
+ - [DSL 文法仕様](docs/specs/dsl-grammar.md)
10
+ - [Graph Semantics 仕様](docs/specs/graph-semantics.md)
11
+ - [Analysis 仕様](docs/specs/analysis.md)
12
+ - [Mutation Semantics 仕様](docs/specs/mutation.md)
13
+ - [Mermaid Profile 仕様](docs/specs/mermaid-profile.md)
14
+ - [Recommendation Semantics 仕様](docs/specs/recommendation.md)
15
+ - [Recommendation Ranking Policy 仕様](docs/specs/recommendation-ranking.md)
16
+ - [Recommendation Reason Taxonomy 仕様](docs/specs/recommendation-reasons.md)
17
+ - [Recommendation Structured Explanation 仕様](docs/specs/recommendation-explanation.md)
18
+ - [Recommendation Interface Contract 仕様](docs/specs/recommendation-interface.md)
19
+ - [Recommendation Human Override Contract 仕様](docs/specs/recommendation-override.md)
20
+ - [Recommendation 規範例](docs/examples/recommendation.md)
21
+ - [Mermaid Profile 規範例](docs/examples/mermaid-profile.md)
22
+ - [Recommendation 実装・自己利用migration](docs/process/recommendation-migration.md)
23
+ - [NextResult.v3 consumer migration guide](docs/process/next-v3-consumer-migration.md)
24
+ - [Recommendation 設計受け入れレビュー](docs/process/recommendation-design-review.md)
25
+ - [MVP release readiness監査](docs/process/mvp-release-readiness.md)
26
+ - [CLI Interface 仕様](docs/specs/interfaces.md)
27
+ - [Architecture Decision Records](docs/adr/0001-activity-on-arrow.md)
28
+ - [DSL サンプル](docs/examples/README.md)
29
+ - [自己利用計画](docs/process/self-use.md)
30
+ - [MVPマイルストーン計画](plans/mvp.pert)
31
+ - [現在の文法作業計画](plans/grammar.pert)
32
+ - [AI工程制御設計計画](plans/control-plane.pert)
33
+ - [操作系M1-M4実装計画](plans/operations.pert)
34
+ - [Recommendation実装計画](plans/recommendation.pert)
35
+ - [AI 開発ガイド](docs/process/ai-development.md)
36
+
37
+ 基本方針は次のとおりです。
38
+
39
+ - Activity-on-Arrow とし、タスクを DAG のエッジ、マイルストーンをノードとして扱う
40
+ - 独自 DSL 文書をプロジェクト状態の正本とする
41
+ - PERT/CPM 計算と「次のタスク」の判定を機械的かつ決定的に行う
42
+ - 相対見積り`p`を基準に保持し、明示したproject-wide velocityで`d`または`h`の予測へexact換算する
43
+ - 共有resourceのcapacityから排他実行と並列実行可能数を扱う
44
+ - Mermaid との相互変換、CLI、構造化ヘルプ、AI向けJSON操作導線を同じ共通コア上に提供する
45
+ - MVPはCLIをprimary interfaceとし、MCP/LSP adapterはMVP後に追加する
46
+ - 現行文書は現在と未来を表し、過去は Git 履歴で追跡する
47
+ - parser・check・analyze・next が安定した時点で、文法作業の計画から自己利用を開始する
48
+
49
+ ## Install
50
+
51
+ 公開開発プレビューはnpm registryの`alpha` dist-tagとGitHub prereleaseから導入できます。Maintainer向けの安全境界は[npm publication手順](docs/process/npm-publication.md)を参照してください。
52
+
53
+ ```sh
54
+ npm install --global perttool@alpha
55
+ perttool --version
56
+ ```
57
+
58
+ ローカルcheckoutを開発中のNode.jsユーザー環境へlinkする場合:
59
+
60
+ ```sh
61
+ git clone https://github.com/mako10k/perttool.git
62
+ cd perttool
63
+ npm ci
64
+ npm link
65
+ perttool --version
66
+ ```
67
+
68
+ `prepare` lifecycleが`dist/`をbuildしてから、`perttool` binaryを現在のnpm global prefixへsymlinkします。System領域へsudoでinstallせず、NVMなどuser-ownedのnpm prefixを使用してください。解除はcheckoutで`npm unlink --global perttool`を実行します。
69
+
70
+ ## Development
71
+
72
+ Setupとrepository check:
73
+
74
+ ```sh
75
+ npm ci
76
+ npm run check
77
+ ```
78
+
79
+ 実CLI processを使うE2Eシナリオだけを実行する場合:
80
+
81
+ ```sh
82
+ npm run test:e2e
83
+ ```
84
+
85
+ ## CLI examples
86
+
87
+ ```sh
88
+ perttool --help
89
+ perttool dsl check docs/examples/parallel.pert
90
+ perttool dsl check PLAN.pert --max-diagnostics 20 --format json
91
+ perttool dsl format PLAN.pert --check
92
+ perttool dsl format PLAN.pert --diff
93
+ perttool dsl format PLAN.pert --write --expect-digest "$EXPECTED_DIGEST"
94
+ perttool dsl help syntax estimate --level detail --format json
95
+ perttool dsl help syntax velocity --level detail --format json
96
+ perttool dag analyze docs/examples/point-velocity.pert --format json
97
+ perttool dag analyze docs/examples/parallel.pert
98
+ perttool dag analyze docs/examples/parallel.pert --capacity DEVELOPERS=3 --capacity TEST_ENV=2 --format json
99
+ perttool dag next docs/examples/parallel.pert
100
+ perttool dag next docs/examples/parallel.pert --capacity DEVELOPERS=3 --format json
101
+ perttool dag advance docs/examples/advance-partial-before.pert --diff
102
+ perttool dag advance PLAN.pert --write --expect-digest "$EXPECTED_DIGEST"
103
+ perttool dag render docs/examples/parallel.pert --to mermaid --analysis both
104
+ perttool dag render docs/examples/parallel.pert --to mermaid --analysis resource --capacity TEST_ENV=2 --out parallel.mmd
105
+ perttool dag import parallel.mmd --from mermaid
106
+ perttool dag import parallel.mmd --from mermaid --strict-loss --out parallel.pert
107
+ perttool task set docs/examples/minimal.pert WORK --status active --diff
108
+ perttool task set PLAN.pert WORK --status active --write --expect-digest "$EXPECTED_DIGEST"
109
+ perttool resource set docs/examples/parallel.pert TEST_ENV --capacity 2 --format json
110
+ perttool mutation apply docs/examples/minimal.pert --request changes.json --diff
111
+ perttool mutation apply PLAN.pert --request changes.json --out UPDATED.pert
112
+ ```
113
+
114
+ `dag analyze`はexact RationalによるPERT/CPMと、renewable resource capacityを守る決定的な`parallel-sgs` scheduleを別resultとして返します。`duration_unit point`では`velocity 20p/10d`のように宣言し、基準のPoint値とday/hourの`velocity_forecast`を分離して返します。Resource scheduleは実行可能なheuristicであり、最適解とは表示しません。
115
+
116
+ `dag next`は依存関係上の`ready`、既存schedulerが選ぶ`runnable_now`、工程authorityであるroot `recommendation`を分離します。JSONは全ready taskのtier、exact typed fact、comparison、decision trace、canonical descriptionをcomplete graphとして返し、textは4 tierの`complete=false` summaryとJSON導線を返します。開始できないready taskには不足resourceと占有task、upcoming taskには未充足依存の説明も従来どおり保持します。Consumerは[移行ガイド](docs/process/next-v3-consumer-migration.md)に従い、`schema_version`を最初に検査します。
117
+
118
+ 5 planのshadowとMIG-07 safe-stop dry-runを経て、knownかつcompleteな`NextResult.v3`をperttool開発のnormal AI task selection authorityへ採用しました。Macro recommendationからworkstreamを選んでdetailを再解析し、unknown version、incomplete trace、`PTREC-*`、deferred/discouraged selectionでは開始せず停止します。
119
+
120
+ Public libraryの`validateOverride`はcompleteな`NextResultV3`と明示的なhuman requestから、normal recommendationを変更せずdeterministicな`Perttool.OverrideDecision.v1`を生成します。これはread-only validationであり、task state、file、Git、networkを変更しません。Override applyとaudit writeのCLIは未実装です。
121
+
122
+ `dag advance`はeffective reachedより過去のtask/gate/milestoneだけを除去し、未到達joinに必要なdone taskとsatisfied gateを保持します。既定はcandidate previewで、削除entityとfrontier/readyの前後比較をtext/JSONへ含めます。`--write`、`--out`、`--expect-digest`は他のediting commandと同じsafe-write経路を使います。
123
+
124
+ `dag render --to mermaid`は既定でlosslessな`Perttool.MermaidProfile.v1`をstdoutへ生成します。`--analysis`でprecedence/resource解析値をprojectionへ注記でき、`--out`は既存targetを上書きしません。`--profile plain`はsemantic metadataを持たないため`PTCNV-206`を返し、`--strict-loss`でartifactを拒否できます。
125
+
126
+ `dag import --from mermaid`はperttool profileのcanonical JSON、record順、metadata/projection digest、semantic model、projection対応をfail-closedで検査し、canonical DSLをpreviewします。Plain Mermaidはstable generated IDとloss reportを返す限定best-effortで、`--strict-loss`はlossy candidateと`--out`を拒否します。
127
+
128
+ `dsl format`とMutation commandは既定では検査済みcandidateをpreviewし、`--diff`ではunified diffを返します。`dsl format --check`は変更が必要なときだけexit 1です。Preview確認後は`--write`でinitial digestを再照合してatomic replaceし、`--expect-digest`でcaller lockを追加できます。`--out`は既存targetを上書きせず新規documentを作成します。`--format json`ではcandidate、diff、UTF-16 TextEdit、digest、write結果を同じresultへ含めます。
129
+
130
+ 現在は[MVPマイルストーン計画](plans/mvp.pert)をmacro roadmapとするStage 3のpreview-first advance自己利用を行っています。[Recommendation実装計画](plans/recommendation.pert)のMIG-01からMIG-07全22pを1 active dayで完了し、recommendation固有の暫定実測Velocityを`22p/1d`へ更新しました。Detail残作業は0pで、normal recommendation authorityを採用済みです。Macroの唯一のready、`runnable_now`、recommended、precedence/schedule critical work packageは`RELEASE_E2E`、残るmakespanは2dです。Issue #2のAI Agent Guidance RegistryとIssue #3のmulti-plan compositionは独立backlogのままです。
131
+
132
+ ## Security and license
133
+
134
+ 脆弱性は[Security Policy](SECURITY.md)に従って非公開で報告してください。本ソフトウェアは[MIT License](LICENSE)で公開します。変更履歴と既知の制約は[CHANGELOG](CHANGELOG.md)を参照してください。
@@ -0,0 +1,41 @@
1
+ import type { DeclarationNode, DocumentNode, RequirementValue } from "../model/syntax.js";
2
+ import type { Rational } from "../model/rational.js";
3
+ import type { DurationUnit, Velocity } from "../model/units.js";
4
+ export type TaskStatus = "planned" | "active" | "blocked" | "done";
5
+ export interface AnalysisResource {
6
+ readonly declaration: DeclarationNode;
7
+ readonly id: string;
8
+ readonly capacity: number;
9
+ }
10
+ export interface AnalysisEdge {
11
+ readonly declaration: DeclarationNode;
12
+ readonly id: string;
13
+ readonly kind: "task" | "gate";
14
+ readonly source: string;
15
+ readonly target: string;
16
+ readonly status: TaskStatus | null;
17
+ readonly expected: Rational;
18
+ readonly variance: Rational;
19
+ readonly priority: number;
20
+ readonly requirements: readonly RequirementValue[];
21
+ }
22
+ export interface ResidualGraph {
23
+ readonly document: DocumentNode;
24
+ readonly project: DeclarationNode;
25
+ readonly finish: string;
26
+ readonly durationUnit: DurationUnit;
27
+ readonly velocity: Velocity | null;
28
+ readonly criticalEpsilon: Rational;
29
+ readonly vertices: ReadonlyMap<string, DeclarationNode>;
30
+ readonly resources: ReadonlyMap<string, AnalysisResource>;
31
+ readonly edges: readonly AnalysisEdge[];
32
+ readonly incoming: ReadonlyMap<string, readonly AnalysisEdge[]>;
33
+ readonly outgoing: ReadonlyMap<string, readonly AnalysisEdge[]>;
34
+ readonly topologicalOrder: readonly string[];
35
+ readonly effectiveReached: ReadonlySet<string>;
36
+ readonly frontier: readonly string[];
37
+ readonly blockedTaskIds: readonly string[];
38
+ }
39
+ export declare function computeEffectiveReached(document: DocumentNode): ReadonlySet<string>;
40
+ export declare function buildResidualGraph(document: DocumentNode): ResidualGraph;
41
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/analysis/graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,YAAY,EAEZ,gBAAgB,EAEjB,MAAM,oBAAoB,CAAC;AAG5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAWrD,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAEhE,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;AAEnE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,WAAW,EAAE,eAAe,CAAC;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,SAAS,gBAAgB,EAAE,CAAC;CACpD;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,eAAe,EAAE,QAAQ,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACxD,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;IAC1D,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC,CAAC;IAChE,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC,CAAC;IAChE,QAAQ,CAAC,gBAAgB,EAAE,SAAS,MAAM,EAAE,CAAC;IAC7C,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;CAC5C;AA6CD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,YAAY,GAAG,WAAW,CAAC,MAAM,CAAC,CAkCnF;AAoCD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,YAAY,GAAG,aAAa,CA+GxE"}
@@ -0,0 +1,199 @@
1
+ import { fieldNamed } from "../model/syntax.js";
2
+ import { compareStableStrings } from "../model/diagnostics.js";
3
+ import { ZERO, add, divide, multiply, rational, rationalFromDuration, square, subtract, } from "../model/rational.js";
4
+ function durationFieldValue(declaration, name) {
5
+ const field = fieldNamed(declaration, name);
6
+ if (field === undefined || typeof field.value !== "object" || field.value === null) {
7
+ throw new Error(`validated ${declaration.id} is missing duration field ${name}`);
8
+ }
9
+ return rationalFromDuration(field.value);
10
+ }
11
+ function edgeNumbers(declaration) {
12
+ if (declaration.kind === "gate")
13
+ return { expected: ZERO, variance: ZERO };
14
+ const status = (fieldNamed(declaration, "status")?.value ?? "planned");
15
+ if (status === "done")
16
+ return { expected: ZERO, variance: ZERO };
17
+ const estimate = fieldNamed(declaration, "estimate");
18
+ if (estimate === undefined) {
19
+ return { expected: durationFieldValue(declaration, "duration"), variance: ZERO };
20
+ }
21
+ const children = estimate.children ?? [];
22
+ const optimistic = durationFieldValueFromChild(declaration, children, "optimistic");
23
+ const mostLikely = durationFieldValueFromChild(declaration, children, "most_likely");
24
+ const pessimistic = durationFieldValueFromChild(declaration, children, "pessimistic");
25
+ const expected = divide(add(add(optimistic, multiply(rational(4n), mostLikely)), pessimistic), rational(6n));
26
+ const variance = square(divide(subtract(pessimistic, optimistic), rational(6n)));
27
+ return { expected, variance };
28
+ }
29
+ function durationFieldValueFromChild(declaration, children, name) {
30
+ const child = children.find((candidate) => candidate.name === name);
31
+ if (child === undefined || typeof child.value !== "object" || child.value === null) {
32
+ throw new Error(`validated estimate ${declaration.id} is missing ${name}`);
33
+ }
34
+ return rationalFromDuration(child.value);
35
+ }
36
+ export function computeEffectiveReached(document) {
37
+ const milestones = document.declarations.filter((declaration) => declaration.kind === "milestone");
38
+ const edges = document.declarations.filter((declaration) => declaration.kind === "task" || declaration.kind === "gate");
39
+ const incoming = new Map(milestones.map((milestone) => [milestone.id, []]));
40
+ for (const edge of edges)
41
+ incoming.get(edge.to).push(edge);
42
+ for (const list of incoming.values()) {
43
+ list.sort((left, right) => compareStableStrings(left.id, right.id));
44
+ }
45
+ const reached = new Set(milestones
46
+ .filter((milestone) => fieldNamed(milestone, "state")?.value === "reached")
47
+ .map((milestone) => milestone.id));
48
+ const satisfied = (edge) => {
49
+ if (!reached.has(edge.from))
50
+ return false;
51
+ return edge.kind === "gate" || fieldNamed(edge, "status")?.value === "done";
52
+ };
53
+ let changed = true;
54
+ while (changed) {
55
+ changed = false;
56
+ for (const milestone of milestones) {
57
+ if (reached.has(milestone.id))
58
+ continue;
59
+ const edgesIn = incoming.get(milestone.id);
60
+ if (edgesIn.length > 0 && edgesIn.every(satisfied)) {
61
+ reached.add(milestone.id);
62
+ changed = true;
63
+ }
64
+ }
65
+ }
66
+ return reached;
67
+ }
68
+ function stableTopologicalOrder(vertices, edges) {
69
+ const indegree = new Map([...vertices.keys()].map((id) => [id, 0]));
70
+ const outgoing = new Map([...vertices.keys()].map((id) => [id, []]));
71
+ for (const edge of edges) {
72
+ indegree.set(edge.target, indegree.get(edge.target) + 1);
73
+ outgoing.get(edge.source).push(edge);
74
+ }
75
+ for (const list of outgoing.values()) {
76
+ list.sort((left, right) => compareStableStrings(left.id, right.id));
77
+ }
78
+ const available = [...indegree]
79
+ .filter(([, degree]) => degree === 0)
80
+ .map(([id]) => id)
81
+ .sort(compareStableStrings);
82
+ const order = [];
83
+ while (available.length > 0) {
84
+ const current = available.shift();
85
+ order.push(current);
86
+ for (const edge of outgoing.get(current)) {
87
+ const degree = indegree.get(edge.target) - 1;
88
+ indegree.set(edge.target, degree);
89
+ if (degree === 0) {
90
+ available.push(edge.target);
91
+ available.sort(compareStableStrings);
92
+ }
93
+ }
94
+ }
95
+ if (order.length !== vertices.size)
96
+ throw new Error("validated residual graph contains a cycle");
97
+ return order;
98
+ }
99
+ export function buildResidualGraph(document) {
100
+ const project = document.declarations.find((declaration) => declaration.kind === "project");
101
+ if (project === undefined)
102
+ throw new Error("validated document has no project");
103
+ const finish = fieldNamed(project, "finish").value;
104
+ const durationUnit = fieldNamed(project, "duration_unit").value;
105
+ const velocityField = fieldNamed(project, "velocity");
106
+ const velocityValue = velocityField?.value;
107
+ const velocity = velocityValue === undefined
108
+ ? null
109
+ : {
110
+ points: rationalFromDuration(velocityValue.points),
111
+ period: rationalFromDuration(velocityValue.period),
112
+ periodUnit: velocityValue.period.suffix === "d" ? "day" : "hour",
113
+ };
114
+ const epsilonField = fieldNamed(project, "critical_epsilon");
115
+ const criticalEpsilon = epsilonField === undefined
116
+ ? ZERO
117
+ : rationalFromDuration(epsilonField.value);
118
+ const effectiveReached = computeEffectiveReached(document);
119
+ const allMilestones = new Map(document.declarations
120
+ .filter((declaration) => declaration.kind === "milestone")
121
+ .map((declaration) => [declaration.id, declaration]));
122
+ const edges = document.declarations
123
+ .filter((declaration) => (declaration.kind === "task" || declaration.kind === "gate") &&
124
+ !effectiveReached.has(declaration.to))
125
+ .map((declaration) => {
126
+ const numbers = edgeNumbers(declaration);
127
+ return {
128
+ declaration,
129
+ id: declaration.id,
130
+ kind: declaration.kind,
131
+ source: declaration.from,
132
+ target: declaration.to,
133
+ status: declaration.kind === "task"
134
+ ? (fieldNamed(declaration, "status")?.value ?? "planned")
135
+ : null,
136
+ expected: numbers.expected,
137
+ variance: numbers.variance,
138
+ priority: declaration.kind === "task"
139
+ ? (fieldNamed(declaration, "priority")?.value ?? 0)
140
+ : 0,
141
+ requirements: declaration.kind === "task"
142
+ ? (fieldNamed(declaration, "requires")?.value ?? [])
143
+ : [],
144
+ };
145
+ });
146
+ edges.sort((left, right) => compareStableStrings(left.id, right.id));
147
+ const vertexIds = new Set([finish]);
148
+ for (const edge of edges) {
149
+ vertexIds.add(edge.source);
150
+ vertexIds.add(edge.target);
151
+ }
152
+ const vertices = new Map([...vertexIds]
153
+ .sort(compareStableStrings)
154
+ .map((id) => [id, allMilestones.get(id)]));
155
+ const incomingMutable = new Map([...vertices.keys()].map((id) => [id, []]));
156
+ const outgoingMutable = new Map([...vertices.keys()].map((id) => [id, []]));
157
+ for (const edge of edges) {
158
+ incomingMutable.get(edge.target).push(edge);
159
+ outgoingMutable.get(edge.source).push(edge);
160
+ }
161
+ for (const list of [...incomingMutable.values(), ...outgoingMutable.values()]) {
162
+ list.sort((left, right) => compareStableStrings(left.id, right.id));
163
+ }
164
+ const resources = new Map(document.declarations
165
+ .filter((declaration) => declaration.kind === "resource")
166
+ .sort((left, right) => compareStableStrings(left.id, right.id))
167
+ .map((declaration) => [
168
+ declaration.id,
169
+ {
170
+ declaration,
171
+ id: declaration.id,
172
+ capacity: fieldNamed(declaration, "capacity").value,
173
+ },
174
+ ]));
175
+ const frontier = [...vertices.keys()]
176
+ .filter((id) => effectiveReached.has(id))
177
+ .sort(compareStableStrings);
178
+ return {
179
+ document,
180
+ project,
181
+ finish,
182
+ durationUnit,
183
+ velocity,
184
+ criticalEpsilon,
185
+ vertices,
186
+ resources,
187
+ edges,
188
+ incoming: incomingMutable,
189
+ outgoing: outgoingMutable,
190
+ topologicalOrder: stableTopologicalOrder(vertices, edges),
191
+ effectiveReached,
192
+ frontier,
193
+ blockedTaskIds: edges
194
+ .filter((edge) => edge.status === "blocked")
195
+ .map((edge) => edge.id)
196
+ .sort(compareStableStrings),
197
+ };
198
+ }
199
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/analysis/graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import type { Rational } from "../model/rational.js";
2
+ import type { AnalysisEdge, ResidualGraph, TaskStatus } from "./graph.js";
3
+ export interface MilestoneTiming {
4
+ readonly id: string;
5
+ readonly earliest: Rational;
6
+ readonly latest: Rational;
7
+ readonly slack: Rational;
8
+ }
9
+ export interface EdgeTiming {
10
+ readonly id: string;
11
+ readonly source: string;
12
+ readonly target: string;
13
+ readonly kind: "task" | "gate";
14
+ readonly status: TaskStatus | null;
15
+ readonly expected: Rational;
16
+ readonly variance: Rational;
17
+ readonly es: Rational;
18
+ readonly ef: Rational;
19
+ readonly ls: Rational;
20
+ readonly lf: Rational;
21
+ readonly totalFloat: Rational;
22
+ readonly freeFloat: Rational;
23
+ readonly isCritical: boolean;
24
+ readonly isDriving: boolean;
25
+ readonly edge: AnalysisEdge;
26
+ }
27
+ export interface CriticalPath {
28
+ readonly edgeIds: readonly string[];
29
+ readonly taskIds: readonly string[];
30
+ readonly gateIds: readonly string[];
31
+ readonly variance: Rational;
32
+ }
33
+ export interface CriticalResult {
34
+ readonly milestoneIds: readonly string[];
35
+ readonly taskIds: readonly string[];
36
+ readonly gateIds: readonly string[];
37
+ readonly drivingEdgeIds: readonly string[];
38
+ readonly representativePath: CriticalPath;
39
+ readonly pathCount: bigint;
40
+ readonly paths: readonly CriticalPath[];
41
+ readonly pathsTruncated: boolean;
42
+ }
43
+ export interface PrecedenceResult {
44
+ readonly makespan: Rational;
45
+ readonly conditionalOnBlocksResolved: boolean;
46
+ readonly blockedTaskIds: readonly string[];
47
+ readonly milestones: readonly MilestoneTiming[];
48
+ readonly edges: readonly EdgeTiming[];
49
+ readonly critical: CriticalResult;
50
+ }
51
+ export declare function analyzePrecedence(graph: ResidualGraph, maxPaths: number): PrecedenceResult;
52
+ //# sourceMappingURL=precedence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"precedence.d.ts","sourceRoot":"","sources":["../../src/analysis/precedence.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AASrD,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE1E,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;CAC7B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,kBAAkB,EAAE,YAAY,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;IACxC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,2BAA2B,EAAE,OAAO,CAAC;IAC9C,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,UAAU,EAAE,SAAS,eAAe,EAAE,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;CACnC;AA6ED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,aAAa,EACpB,QAAQ,EAAE,MAAM,GACf,gBAAgB,CAyGlB"}