projectkeeper 0.0.0-stage → 1.0.0

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 (276) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/LICENSE +21 -0
  3. package/README.md +283 -2
  4. package/README.zh-CN.md +285 -0
  5. package/THIRD_PARTY_NOTICES.md +53 -0
  6. package/bin/pk.mjs +6 -0
  7. package/bin/postinstall.mjs +5 -0
  8. package/bin/strip-types.mjs +28 -0
  9. package/package.json +68 -4
  10. package/patches/README.md +111 -0
  11. package/patches/pi-ai-0.85.0.ts +122 -0
  12. package/patches/pi-ai-0.87.1.ts +122 -0
  13. package/scripts/apply-pi-streaming-patch.ts +86 -0
  14. package/skills/clerk/coverage/SKILL.md +35 -0
  15. package/skills/clerk/cross-check/SKILL.md +118 -0
  16. package/skills/clerk/deepen-dispatch/SKILL.md +69 -0
  17. package/skills/clerk/lane-follow-up/SKILL.md +94 -0
  18. package/skills/clerk/lane-plan/SKILL.md +107 -0
  19. package/skills/clerk/lane-slot/SKILL.md +113 -0
  20. package/skills/clerk/lane-topic/SKILL.md +116 -0
  21. package/skills/clerk/orientation/SKILL.md +160 -0
  22. package/skills/clerk/reconcile/SKILL.md +77 -0
  23. package/skills/clerk/skeleton-dispatch/SKILL.md +43 -0
  24. package/skills/clerk/spot-check/SKILL.md +52 -0
  25. package/skills/clerk/synthesis/SKILL.md +65 -0
  26. package/skills/table-follow-up/SKILL.md +42 -0
  27. package/src/cli.ts +319 -0
  28. package/src/codemap/README.md +13 -0
  29. package/src/codemap/engines.ts +102 -0
  30. package/src/codemap/facts.ts +504 -0
  31. package/src/context/agent-entry.ts +232 -0
  32. package/src/context/ask.ts +97 -0
  33. package/src/context/assemble.ts +1058 -0
  34. package/src/context/code-source.ts +103 -0
  35. package/src/context/k-briefs.ts +114 -0
  36. package/src/context/lineage.ts +100 -0
  37. package/src/context/object-brief.ts +300 -0
  38. package/src/context/owner-words.ts +191 -0
  39. package/src/context/pack-fixture.ts +342 -0
  40. package/src/context/project-rules.ts +160 -0
  41. package/src/intake/intake.ts +392 -0
  42. package/src/intake/material-rules.ts +166 -0
  43. package/src/intake/removal.ts +316 -0
  44. package/src/intake/skipped.ts +72 -0
  45. package/src/keeper/adjustment.ts +565 -0
  46. package/src/keeper/bounds/boundary.ts +509 -0
  47. package/src/keeper/bounds/command.ts +1665 -0
  48. package/src/keeper/bounds/paths.ts +164 -0
  49. package/src/keeper/bounds/reads.ts +718 -0
  50. package/src/keeper/bounds/shell-write-guard.ts +521 -0
  51. package/src/keeper/capabilities.ts +136 -0
  52. package/src/keeper/clerk-steps.ts +151 -0
  53. package/src/keeper/clerk-tools.ts +1424 -0
  54. package/src/keeper/conversation.ts +253 -0
  55. package/src/keeper/evidence.ts +662 -0
  56. package/src/keeper/fake-provider.ts +132 -0
  57. package/src/keeper/held.ts +15 -0
  58. package/src/keeper/history-tools.ts +163 -0
  59. package/src/keeper/jobs/answering.ts +53 -0
  60. package/src/keeper/key-check.ts +105 -0
  61. package/src/keeper/ledger-tools.ts +295 -0
  62. package/src/keeper/link-check.ts +185 -0
  63. package/src/keeper/merge.ts +260 -0
  64. package/src/keeper/note-origin.ts +56 -0
  65. package/src/keeper/numbers-check.ts +102 -0
  66. package/src/keeper/open-in-pi.ts +57 -0
  67. package/src/keeper/organize/absence.ts +266 -0
  68. package/src/keeper/organize/carried-on.ts +214 -0
  69. package/src/keeper/organize/clerk-coverage.ts +293 -0
  70. package/src/keeper/organize/clerk-prompts.ts +132 -0
  71. package/src/keeper/organize/clerk.ts +1395 -0
  72. package/src/keeper/organize/coverage-gate.ts +19 -0
  73. package/src/keeper/organize/coverage-tools.ts +765 -0
  74. package/src/keeper/organize/entries.ts +153 -0
  75. package/src/keeper/organize/entry-gate.ts +289 -0
  76. package/src/keeper/organize/fill-tools.ts +718 -0
  77. package/src/keeper/organize/follow-up.ts +280 -0
  78. package/src/keeper/organize/generation-check.ts +504 -0
  79. package/src/keeper/organize/graph.ts +230 -0
  80. package/src/keeper/organize/lane-tools.ts +289 -0
  81. package/src/keeper/organize/looked-tools.ts +54 -0
  82. package/src/keeper/organize/materials.ts +243 -0
  83. package/src/keeper/organize/owner-lines.ts +493 -0
  84. package/src/keeper/organize/place-tools.ts +216 -0
  85. package/src/keeper/organize/placement-inference.ts +1045 -0
  86. package/src/keeper/organize/placement-time.ts +320 -0
  87. package/src/keeper/organize/placing.ts +821 -0
  88. package/src/keeper/organize/positioning.ts +33 -0
  89. package/src/keeper/organize/readiness.ts +47 -0
  90. package/src/keeper/organize/reading.ts +401 -0
  91. package/src/keeper/organize/round-blocks.ts +65 -0
  92. package/src/keeper/organize/round-news.ts +164 -0
  93. package/src/keeper/organize/round-open.ts +586 -0
  94. package/src/keeper/organize/schedule-state.ts +39 -0
  95. package/src/keeper/organize/schedule.ts +137 -0
  96. package/src/keeper/organize/service.ts +409 -0
  97. package/src/keeper/organize/skills.ts +116 -0
  98. package/src/keeper/organize/slots.ts +85 -0
  99. package/src/keeper/organize/stage-gate.ts +175 -0
  100. package/src/keeper/organize/stage-tools.ts +471 -0
  101. package/src/keeper/organize/standing-notes.ts +141 -0
  102. package/src/keeper/organize/table-follow-up.ts +330 -0
  103. package/src/keeper/organize/takeover-clerk.ts +832 -0
  104. package/src/keeper/organize/takeover-state.ts +103 -0
  105. package/src/keeper/organize/takeover.ts +216 -0
  106. package/src/keeper/organize/update-pending.ts +535 -0
  107. package/src/keeper/organize/workbench-placement.ts +92 -0
  108. package/src/keeper/own-keys.ts +114 -0
  109. package/src/keeper/owner-text.ts +165 -0
  110. package/src/keeper/project-folder.ts +334 -0
  111. package/src/keeper/prompts.ts +101 -0
  112. package/src/keeper/references.ts +177 -0
  113. package/src/keeper/relook/compose.ts +120 -0
  114. package/src/keeper/relook/prompts.ts +36 -0
  115. package/src/keeper/roles.ts +259 -0
  116. package/src/keeper/round-tools.ts +227 -0
  117. package/src/keeper/route.ts +148 -0
  118. package/src/keeper/rules.ts +97 -0
  119. package/src/keeper/runtime.ts +1858 -0
  120. package/src/keeper/scope-tools.ts +194 -0
  121. package/src/keeper/sendback-text.ts +83 -0
  122. package/src/keeper/step-timing.ts +207 -0
  123. package/src/keeper/testing/clerk-script.ts +212 -0
  124. package/src/keeper/testing/streaming-arguments.ts +57 -0
  125. package/src/keeper/tools.ts +2340 -0
  126. package/src/keeper/utterance-tools.ts +64 -0
  127. package/src/keeper/verbatim.ts +397 -0
  128. package/src/ledger/adapters.ts +186 -0
  129. package/src/ledger/arrangements.ts +257 -0
  130. package/src/ledger/blame.ts +58 -0
  131. package/src/ledger/code-engine-child.ts +69 -0
  132. package/src/ledger/code-engine.ts +548 -0
  133. package/src/ledger/code.ts +607 -0
  134. package/src/ledger/docs.ts +294 -0
  135. package/src/ledger/git-read.ts +321 -0
  136. package/src/ledger/index.ts +1850 -0
  137. package/src/ledger/item-range.ts +16 -0
  138. package/src/ledger/lines.ts +328 -0
  139. package/src/ledger/numbering.ts +269 -0
  140. package/src/ledger/ranges.ts +74 -0
  141. package/src/ledger/rebuild-worker.ts +15 -0
  142. package/src/ledger/rebuild.ts +387 -0
  143. package/src/ledger/repo-scan.ts +181 -0
  144. package/src/ledger/schema.ts +450 -0
  145. package/src/ledger/sessions.ts +134 -0
  146. package/src/ledger/text-scan.ts +466 -0
  147. package/src/ledger/time.ts +185 -0
  148. package/src/ledger/ts-symbols.ts +180 -0
  149. package/src/ledger/views.ts +377 -0
  150. package/src/mcp/server.ts +127 -0
  151. package/src/mcp/tools.ts +187 -0
  152. package/src/model/ids.ts +23 -0
  153. package/src/model/k-types.ts +912 -0
  154. package/src/model/time.ts +85 -0
  155. package/src/model/types.ts +1382 -0
  156. package/src/model/views-k.ts +707 -0
  157. package/src/model/vocab.ts +269 -0
  158. package/src/process/analysis.ts +79 -0
  159. package/src/process/breakpoint-candidates.ts +383 -0
  160. package/src/process/breakpoints.ts +746 -0
  161. package/src/process/claim-check.ts +295 -0
  162. package/src/process/delivery-links.ts +52 -0
  163. package/src/process/facts.ts +487 -0
  164. package/src/process/generations.ts +138 -0
  165. package/src/process/index.ts +243 -0
  166. package/src/process/integration.ts +128 -0
  167. package/src/process/placement.ts +107 -0
  168. package/src/process/plan.ts +276 -0
  169. package/src/process/sendbacks.ts +244 -0
  170. package/src/process/text.ts +185 -0
  171. package/src/process/units.ts +543 -0
  172. package/src/process/unnumbered.ts +431 -0
  173. package/src/process/work.ts +884 -0
  174. package/src/scope/candidates.ts +86 -0
  175. package/src/scope/decisions.ts +229 -0
  176. package/src/scope/discover.ts +741 -0
  177. package/src/scope/ignore.ts +126 -0
  178. package/src/scope/ignored-place.ts +93 -0
  179. package/src/scope/skip.ts +161 -0
  180. package/src/scope/toolchain.ts +180 -0
  181. package/src/scope/worktree.ts +187 -0
  182. package/src/server/api.ts +549 -0
  183. package/src/server/app.ts +595 -0
  184. package/src/server/drafts-api.ts +170 -0
  185. package/src/server/folders-api.ts +243 -0
  186. package/src/server/graph-view.ts +639 -0
  187. package/src/server/http.ts +224 -0
  188. package/src/server/k-agent-api.ts +56 -0
  189. package/src/server/k-rounds-d99.ts +91 -0
  190. package/src/server/k-views.ts +405 -0
  191. package/src/server/keeper-page.ts +446 -0
  192. package/src/server/keys-api.ts +239 -0
  193. package/src/server/project-folder-api.ts +104 -0
  194. package/src/server/vendor.ts +14 -0
  195. package/src/server/workbench-content.ts +561 -0
  196. package/src/sources/anchor.ts +129 -0
  197. package/src/sources/files.ts +267 -0
  198. package/src/sources/gitobs.ts +41 -0
  199. package/src/sources/history.ts +231 -0
  200. package/src/sources/scan-worker.ts +10 -0
  201. package/src/sources/sessions/locate.ts +292 -0
  202. package/src/sources/sessions/read.ts +346 -0
  203. package/src/sources/sessions/scope.ts +42 -0
  204. package/src/sources/sessions/utterances.ts +223 -0
  205. package/src/sources/watch.ts +215 -0
  206. package/src/store/json-file.ts +50 -0
  207. package/src/store/paths.ts +39 -0
  208. package/src/store/project-store.ts +295 -0
  209. package/src/store/versions.ts +172 -0
  210. package/src/store/workspace.ts +216 -0
  211. package/src/table/check.ts +333 -0
  212. package/src/table/follow-up-tools.ts +30 -0
  213. package/src/table/follow-up.ts +344 -0
  214. package/src/table/import.ts +610 -0
  215. package/src/table/project-home.ts +61 -0
  216. package/src/table/sessions.ts +168 -0
  217. package/src/table/takeover.ts +483 -0
  218. package/src/util/git-check.ts +29 -0
  219. package/src/util/git.ts +411 -0
  220. package/src/util/own-ts.ts +15 -0
  221. package/src/util/paths.ts +225 -0
  222. package/template/FILLING-IN.md +148 -0
  223. package/template/examples/papertrail.json +747 -0
  224. package/template/projectkeeper.schema.json +1001 -0
  225. package/ui/app.js +1135 -0
  226. package/ui/failures.js +82 -0
  227. package/ui/flyout.js +120 -0
  228. package/ui/folder-chooser.js +264 -0
  229. package/ui/glossary.js +156 -0
  230. package/ui/graph-fit.js +157 -0
  231. package/ui/graph-material.js +61 -0
  232. package/ui/graph-palette.js +109 -0
  233. package/ui/graph-tools.js +62 -0
  234. package/ui/graph.js +1712 -0
  235. package/ui/index.html +31 -0
  236. package/ui/k/code-view.js +230 -0
  237. package/ui/k/draft-view.js +93 -0
  238. package/ui/k/k-views.css +224 -0
  239. package/ui/k/round-tree.js +450 -0
  240. package/ui/k/scope-k.js +159 -0
  241. package/ui/k-data.js +118 -0
  242. package/ui/k-fold.js +106 -0
  243. package/ui/k-process.css +302 -0
  244. package/ui/k-process.js +934 -0
  245. package/ui/keeper-activity.js +175 -0
  246. package/ui/keeper-view.js +801 -0
  247. package/ui/keeper.css +101 -0
  248. package/ui/key-order.js +62 -0
  249. package/ui/list-fold.js +67 -0
  250. package/ui/markdown.d.ts +21 -0
  251. package/ui/markdown.js +472 -0
  252. package/ui/placement.d.ts +92 -0
  253. package/ui/placement.js +445 -0
  254. package/ui/popover-place.d.ts +16 -0
  255. package/ui/popover-place.js +89 -0
  256. package/ui/popover.js +198 -0
  257. package/ui/project-folder.js +37 -0
  258. package/ui/shell-state.js +40 -0
  259. package/ui/strip-rows.js +171 -0
  260. package/ui/styles.css +492 -0
  261. package/ui/theme-pick.js +36 -0
  262. package/ui/theme.js +74 -0
  263. package/ui/themes/LICENSE.md +13 -0
  264. package/ui/themes/README.md +44 -0
  265. package/ui/themes/TOKENS.md +291 -0
  266. package/ui/themes/a1/board.css +1557 -0
  267. package/ui/themes/a1/pk.css +392 -0
  268. package/ui/themes/b1/board.css +1163 -0
  269. package/ui/themes/b1/pk.css +218 -0
  270. package/ui/themes/d2/board.css +518 -0
  271. package/ui/themes/d2/pk.css +243 -0
  272. package/ui/themes/guard.css +73 -0
  273. package/ui/themes/i1/board.css +776 -0
  274. package/ui/themes/i1/pk.css +223 -0
  275. package/ui/themes/manifest.json +13 -0
  276. package/ui/views.js +2796 -0
@@ -0,0 +1,1001 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/feiyanglyy-stack/ProjectKeeper/template/projectkeeper.schema.json",
4
+ "title": "ProjectKeeper table",
5
+ "description": "One project's picture, filled in by an agent and drawn by ProjectKeeper as its Graph, List and Code views. Lives at projectkeeper/project.json inside the project, or, for a public project, in ProjectKeeper's own folder; its paths are relative to the project folder either way. FILLING-IN.md says what each part means. This schema fixes the shape only; what to read, what deserves an entry and where it belongs are the filler's judgement.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "format",
10
+ "project",
11
+ "ownerWants",
12
+ "product",
13
+ "goals",
14
+ "areas",
15
+ "requirements",
16
+ "designs",
17
+ "decisions",
18
+ "plans",
19
+ "work",
20
+ "code",
21
+ "notes"
22
+ ],
23
+ "properties": {
24
+ "$schema": {
25
+ "type": "string"
26
+ },
27
+ "format": {
28
+ "const": "projectkeeper.table/1"
29
+ },
30
+ "project": {
31
+ "$ref": "#/$defs/ProjectHeader"
32
+ },
33
+ "ownerWants": {
34
+ "type": "array",
35
+ "items": {
36
+ "$ref": "#/$defs/OwnerWant"
37
+ }
38
+ },
39
+ "product": {
40
+ "$ref": "#/$defs/Product"
41
+ },
42
+ "goals": {
43
+ "type": "array",
44
+ "items": {
45
+ "$ref": "#/$defs/Goal"
46
+ }
47
+ },
48
+ "areas": {
49
+ "type": "array",
50
+ "minItems": 1,
51
+ "items": {
52
+ "$ref": "#/$defs/Area"
53
+ }
54
+ },
55
+ "requirements": {
56
+ "type": "array",
57
+ "items": {
58
+ "$ref": "#/$defs/Intent"
59
+ }
60
+ },
61
+ "designs": {
62
+ "type": "array",
63
+ "items": {
64
+ "$ref": "#/$defs/Intent"
65
+ }
66
+ },
67
+ "decisions": {
68
+ "type": "array",
69
+ "items": {
70
+ "$ref": "#/$defs/Intent"
71
+ }
72
+ },
73
+ "plans": {
74
+ "type": "array",
75
+ "items": {
76
+ "$ref": "#/$defs/Plan"
77
+ }
78
+ },
79
+ "work": {
80
+ "type": "array",
81
+ "items": {
82
+ "$ref": "#/$defs/Work"
83
+ }
84
+ },
85
+ "code": {
86
+ "type": "array",
87
+ "items": {
88
+ "$ref": "#/$defs/Territory"
89
+ }
90
+ },
91
+ "notes": {
92
+ "type": "array",
93
+ "items": {
94
+ "$ref": "#/$defs/Note"
95
+ }
96
+ }
97
+ },
98
+ "$defs": {
99
+ "Id": {
100
+ "description": "The project's own number or name for the thing when it has one (D32, CKC-12, T-18); otherwise a short name of your own. Unique across the whole table.",
101
+ "type": "string",
102
+ "pattern": "^\\S(.*\\S)?$",
103
+ "maxLength": 80
104
+ },
105
+ "Text": {
106
+ "type": "string",
107
+ "minLength": 1
108
+ },
109
+ "Date": {
110
+ "type": "string",
111
+ "pattern": "^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2})?(\\.\\d+)?(Z|[+-]\\d{2}:\\d{2})?)?$"
112
+ },
113
+ "Status": {
114
+ "description": "Whether it still holds. Current: in force now. Proposed: put forward, not yet in force. Deferred: kept for later. Replaced: something later took its place (name it in replacedBy). Abandoned: dropped with nothing in its place (say why).",
115
+ "enum": [
116
+ "Current",
117
+ "Proposed",
118
+ "Deferred",
119
+ "Replaced",
120
+ "Abandoned"
121
+ ]
122
+ },
123
+ "Progress": {
124
+ "description": "How far the work got, as the records show it. Not whether anyone accepted or checked it.",
125
+ "enum": [
126
+ "Planned",
127
+ "In progress",
128
+ "Done",
129
+ "On hold"
130
+ ]
131
+ },
132
+ "Source": {
133
+ "description": "Where it came from. The program checks every source: the file and lines exist, the commit exists, the session message exists, and a quote stands word for word in what it cites.",
134
+ "oneOf": [
135
+ {
136
+ "type": "object",
137
+ "additionalProperties": false,
138
+ "required": [
139
+ "file"
140
+ ],
141
+ "properties": {
142
+ "file": {
143
+ "type": "string",
144
+ "description": "Path relative to the project folder, with forward slashes (product/PLAN.md, app/src/cli.ts)."
145
+ },
146
+ "lines": {
147
+ "type": "string",
148
+ "pattern": "^\\d+(-\\d+)?$",
149
+ "description": "A line or a range, 1-based (12 or 12-30)."
150
+ },
151
+ "quote": {
152
+ "$ref": "#/$defs/Text",
153
+ "description": "Words copied exactly from those lines."
154
+ }
155
+ }
156
+ },
157
+ {
158
+ "type": "object",
159
+ "additionalProperties": false,
160
+ "required": [
161
+ "commit"
162
+ ],
163
+ "properties": {
164
+ "commit": {
165
+ "type": "string",
166
+ "pattern": "^[0-9a-f]{7,40}$"
167
+ },
168
+ "repo": {
169
+ "type": "string",
170
+ "description": "The repository's folder relative to the project folder, when it is not the project folder itself (app)."
171
+ }
172
+ }
173
+ },
174
+ {
175
+ "type": "object",
176
+ "additionalProperties": false,
177
+ "required": [
178
+ "session",
179
+ "message"
180
+ ],
181
+ "properties": {
182
+ "session": {
183
+ "type": "string",
184
+ "description": "The session as the session material names it (claude:4f1c…, codex:0199…)."
185
+ },
186
+ "message": {
187
+ "type": "integer",
188
+ "minimum": 0,
189
+ "description": "The message number in that session, as the session material numbers it."
190
+ },
191
+ "quote": {
192
+ "$ref": "#/$defs/Text",
193
+ "description": "Words copied exactly from that message."
194
+ }
195
+ }
196
+ }
197
+ ]
198
+ },
199
+ "Sources": {
200
+ "type": "array",
201
+ "minItems": 1,
202
+ "items": {
203
+ "$ref": "#/$defs/Source"
204
+ }
205
+ },
206
+ "ProjectHeader": {
207
+ "type": "object",
208
+ "additionalProperties": false,
209
+ "required": [
210
+ "name",
211
+ "asOf",
212
+ "filledBy"
213
+ ],
214
+ "properties": {
215
+ "name": {
216
+ "$ref": "#/$defs/Text"
217
+ },
218
+ "asOf": {
219
+ "type": "object",
220
+ "additionalProperties": false,
221
+ "required": [
222
+ "date",
223
+ "repos"
224
+ ],
225
+ "description": "The moment the table describes: the commit each repository stood at when it was read.",
226
+ "properties": {
227
+ "date": {
228
+ "$ref": "#/$defs/Date"
229
+ },
230
+ "repos": {
231
+ "type": "array",
232
+ "minItems": 1,
233
+ "items": {
234
+ "type": "object",
235
+ "additionalProperties": false,
236
+ "required": [
237
+ "path",
238
+ "commit"
239
+ ],
240
+ "properties": {
241
+ "path": {
242
+ "type": "string",
243
+ "description": "Folder relative to the project folder; \".\" for the project folder itself."
244
+ },
245
+ "commit": {
246
+ "type": "string",
247
+ "pattern": "^[0-9a-f]{7,40}$"
248
+ }
249
+ }
250
+ }
251
+ }
252
+ }
253
+ },
254
+ "filledBy": {
255
+ "type": "object",
256
+ "additionalProperties": false,
257
+ "required": [
258
+ "agent",
259
+ "at"
260
+ ],
261
+ "properties": {
262
+ "agent": {
263
+ "$ref": "#/$defs/Text",
264
+ "description": "Which agent and model filled it (Codex, gpt-6.1-sol, high)."
265
+ },
266
+ "at": {
267
+ "$ref": "#/$defs/Date"
268
+ },
269
+ "read": {
270
+ "$ref": "#/$defs/Text",
271
+ "description": "In a few sentences: what was read, in what order, and what was not read."
272
+ }
273
+ }
274
+ }
275
+ }
276
+ },
277
+ "OwnerWant": {
278
+ "description": "One thing the owner wants, as the owner said it. Several sayings of the same thing are one entry.",
279
+ "type": "object",
280
+ "additionalProperties": false,
281
+ "required": [
282
+ "id",
283
+ "want",
284
+ "kind",
285
+ "status",
286
+ "said"
287
+ ],
288
+ "properties": {
289
+ "id": {
290
+ "$ref": "#/$defs/Id"
291
+ },
292
+ "want": {
293
+ "$ref": "#/$defs/Text",
294
+ "description": "One sentence: what the owner wants."
295
+ },
296
+ "kind": {
297
+ "enum": [
298
+ "Product",
299
+ "Way of working"
300
+ ],
301
+ "description": "About the product, or about how the work is to be done."
302
+ },
303
+ "status": {
304
+ "enum": [
305
+ "Current",
306
+ "Replaced",
307
+ "Open",
308
+ "Not raised again"
309
+ ],
310
+ "description": "Current: still what the owner wants. Replaced: the owner said otherwise later (replacedBy). Open: the owner left it undecided. Not raised again: said once, never taken up or confirmed since."
311
+ },
312
+ "replacedBy": {
313
+ "$ref": "#/$defs/Id"
314
+ },
315
+ "said": {
316
+ "type": "array",
317
+ "minItems": 1,
318
+ "description": "The owner's own words, one to three of the clearest, each with its source and a quote.",
319
+ "items": {
320
+ "$ref": "#/$defs/Source"
321
+ }
322
+ },
323
+ "approvedProposal": {
324
+ "type": "object",
325
+ "additionalProperties": false,
326
+ "required": [
327
+ "part",
328
+ "source"
329
+ ],
330
+ "description": "When the owner said yes to something an agent proposed: which part was approved, and the agent message it was.",
331
+ "properties": {
332
+ "part": {
333
+ "$ref": "#/$defs/Text"
334
+ },
335
+ "source": {
336
+ "$ref": "#/$defs/Source"
337
+ }
338
+ }
339
+ },
340
+ "changed": {
341
+ "type": "array",
342
+ "description": "How it changed over time, oldest first.",
343
+ "items": {
344
+ "type": "object",
345
+ "additionalProperties": false,
346
+ "required": [
347
+ "before",
348
+ "after",
349
+ "source"
350
+ ],
351
+ "properties": {
352
+ "before": {
353
+ "$ref": "#/$defs/Text"
354
+ },
355
+ "after": {
356
+ "$ref": "#/$defs/Text"
357
+ },
358
+ "source": {
359
+ "$ref": "#/$defs/Source"
360
+ }
361
+ }
362
+ }
363
+ },
364
+ "reflectedIn": {
365
+ "type": "array",
366
+ "description": "The goals, areas, requirements, designs, decisions or work items that carry it out. Empty when nothing in the project does yet.",
367
+ "items": {
368
+ "$ref": "#/$defs/Id"
369
+ }
370
+ }
371
+ }
372
+ },
373
+ "Product": {
374
+ "type": "object",
375
+ "additionalProperties": false,
376
+ "required": [
377
+ "id",
378
+ "name",
379
+ "summary",
380
+ "forWhom",
381
+ "sources"
382
+ ],
383
+ "properties": {
384
+ "id": {
385
+ "$ref": "#/$defs/Id"
386
+ },
387
+ "name": {
388
+ "$ref": "#/$defs/Text"
389
+ },
390
+ "summary": {
391
+ "$ref": "#/$defs/Text",
392
+ "description": "What the product is, in two or three sentences."
393
+ },
394
+ "forWhom": {
395
+ "$ref": "#/$defs/Text"
396
+ },
397
+ "sources": {
398
+ "$ref": "#/$defs/Sources"
399
+ }
400
+ }
401
+ },
402
+ "Goal": {
403
+ "type": "object",
404
+ "additionalProperties": false,
405
+ "required": [
406
+ "id",
407
+ "name",
408
+ "summary",
409
+ "status",
410
+ "sources"
411
+ ],
412
+ "properties": {
413
+ "id": {
414
+ "$ref": "#/$defs/Id"
415
+ },
416
+ "name": {
417
+ "$ref": "#/$defs/Text"
418
+ },
419
+ "summary": {
420
+ "$ref": "#/$defs/Text"
421
+ },
422
+ "status": {
423
+ "$ref": "#/$defs/Status"
424
+ },
425
+ "replacedBy": {
426
+ "$ref": "#/$defs/Id"
427
+ },
428
+ "why": {
429
+ "$ref": "#/$defs/Text",
430
+ "description": "For Replaced, Abandoned or Deferred: what happened, in a sentence."
431
+ },
432
+ "sources": {
433
+ "$ref": "#/$defs/Sources"
434
+ }
435
+ }
436
+ },
437
+ "Area": {
438
+ "description": "A part of the product: a module, a feature, or a theme when the project names no modules. Each area is a column of the Graph.",
439
+ "type": "object",
440
+ "additionalProperties": false,
441
+ "required": [
442
+ "id",
443
+ "name",
444
+ "summary",
445
+ "status",
446
+ "sources"
447
+ ],
448
+ "properties": {
449
+ "id": {
450
+ "$ref": "#/$defs/Id"
451
+ },
452
+ "name": {
453
+ "$ref": "#/$defs/Text"
454
+ },
455
+ "summary": {
456
+ "$ref": "#/$defs/Text"
457
+ },
458
+ "status": {
459
+ "$ref": "#/$defs/Status"
460
+ },
461
+ "goals": {
462
+ "type": "array",
463
+ "items": {
464
+ "$ref": "#/$defs/Id"
465
+ }
466
+ },
467
+ "foundation": {
468
+ "type": "boolean",
469
+ "description": "A cross-cutting base the project's own documents put beside its modules. Drawn as the last column."
470
+ },
471
+ "sources": {
472
+ "$ref": "#/$defs/Sources"
473
+ },
474
+ "why": {
475
+ "$ref": "#/$defs/Text",
476
+ "description": "For Replaced, Abandoned or Deferred: what happened, in a sentence."
477
+ }
478
+ }
479
+ },
480
+ "Place": {
481
+ "description": "Where a requirement, design or decision belongs: one area, several areas, one plan (an execution decision), or the whole product with the reason.",
482
+ "oneOf": [
483
+ {
484
+ "type": "object",
485
+ "additionalProperties": false,
486
+ "required": [
487
+ "area"
488
+ ],
489
+ "properties": {
490
+ "area": {
491
+ "$ref": "#/$defs/Id"
492
+ }
493
+ }
494
+ },
495
+ {
496
+ "type": "object",
497
+ "additionalProperties": false,
498
+ "required": [
499
+ "areas"
500
+ ],
501
+ "properties": {
502
+ "areas": {
503
+ "type": "array",
504
+ "minItems": 2,
505
+ "items": {
506
+ "$ref": "#/$defs/Id"
507
+ }
508
+ }
509
+ }
510
+ },
511
+ {
512
+ "type": "object",
513
+ "additionalProperties": false,
514
+ "required": [
515
+ "plan"
516
+ ],
517
+ "properties": {
518
+ "plan": {
519
+ "$ref": "#/$defs/Id"
520
+ }
521
+ }
522
+ },
523
+ {
524
+ "type": "object",
525
+ "additionalProperties": false,
526
+ "required": [
527
+ "wholeProduct"
528
+ ],
529
+ "properties": {
530
+ "wholeProduct": {
531
+ "$ref": "#/$defs/Text",
532
+ "description": "Why it concerns the whole product rather than an area."
533
+ }
534
+ }
535
+ }
536
+ ]
537
+ },
538
+ "Intent": {
539
+ "description": "A requirement (what the product must do), a design (how it is meant to be built or behave) or a decision (something decided, or a constraint to respect).",
540
+ "type": "object",
541
+ "additionalProperties": false,
542
+ "required": [
543
+ "id",
544
+ "name",
545
+ "summary",
546
+ "status",
547
+ "place",
548
+ "sources"
549
+ ],
550
+ "properties": {
551
+ "id": {
552
+ "$ref": "#/$defs/Id"
553
+ },
554
+ "name": {
555
+ "$ref": "#/$defs/Text"
556
+ },
557
+ "summary": {
558
+ "$ref": "#/$defs/Text"
559
+ },
560
+ "status": {
561
+ "$ref": "#/$defs/Status"
562
+ },
563
+ "replacedBy": {
564
+ "$ref": "#/$defs/Id"
565
+ },
566
+ "partlyReplaced": {
567
+ "type": "array",
568
+ "minItems": 1,
569
+ "description": "When a later entry overturned only part of this one: which part, and by which entry. The entry itself stays Current.",
570
+ "items": {
571
+ "type": "object",
572
+ "additionalProperties": false,
573
+ "required": [
574
+ "by",
575
+ "part"
576
+ ],
577
+ "properties": {
578
+ "by": {
579
+ "$ref": "#/$defs/Id"
580
+ },
581
+ "part": {
582
+ "$ref": "#/$defs/Text",
583
+ "description": "The part that no longer holds, in a sentence."
584
+ }
585
+ }
586
+ }
587
+ },
588
+ "why": {
589
+ "$ref": "#/$defs/Text",
590
+ "description": "For Replaced, Abandoned or Deferred: what happened, in a sentence."
591
+ },
592
+ "boundary": {
593
+ "type": "boolean",
594
+ "description": "A decision that says what the product will not do."
595
+ },
596
+ "place": {
597
+ "$ref": "#/$defs/Place"
598
+ },
599
+ "inferred": {
600
+ "type": "boolean",
601
+ "description": "True when no document states it and you concluded it from the material."
602
+ },
603
+ "sources": {
604
+ "$ref": "#/$defs/Sources"
605
+ }
606
+ }
607
+ },
608
+ "Plan": {
609
+ "description": "A plan, milestone or phase. A current plan is a row of the Graph. A plan that a later one replaced is an earlier generation: its rows roll up, and each of its work items says what became of it.",
610
+ "type": "object",
611
+ "additionalProperties": false,
612
+ "required": [
613
+ "id",
614
+ "name",
615
+ "summary",
616
+ "status",
617
+ "sources"
618
+ ],
619
+ "properties": {
620
+ "id": {
621
+ "$ref": "#/$defs/Id"
622
+ },
623
+ "name": {
624
+ "$ref": "#/$defs/Text"
625
+ },
626
+ "summary": {
627
+ "$ref": "#/$defs/Text"
628
+ },
629
+ "status": {
630
+ "$ref": "#/$defs/Status"
631
+ },
632
+ "replacedBy": {
633
+ "$ref": "#/$defs/Id"
634
+ },
635
+ "why": {
636
+ "$ref": "#/$defs/Text",
637
+ "description": "For Replaced, Abandoned or Deferred: what happened, in a sentence."
638
+ },
639
+ "ended": {
640
+ "$ref": "#/$defs/Date",
641
+ "description": "For a replaced plan: when the later one took over."
642
+ },
643
+ "sources": {
644
+ "$ref": "#/$defs/Sources"
645
+ }
646
+ }
647
+ },
648
+ "Became": {
649
+ "description": "What became of a work item of an earlier generation.",
650
+ "oneOf": [
651
+ {
652
+ "type": "object",
653
+ "additionalProperties": false,
654
+ "required": [
655
+ "carriedOnBy"
656
+ ],
657
+ "properties": {
658
+ "carriedOnBy": {
659
+ "$ref": "#/$defs/Id",
660
+ "description": "The current work item that carries it on."
661
+ }
662
+ }
663
+ },
664
+ {
665
+ "type": "object",
666
+ "additionalProperties": false,
667
+ "required": [
668
+ "movedTo"
669
+ ],
670
+ "properties": {
671
+ "movedTo": {
672
+ "$ref": "#/$defs/Id",
673
+ "description": "The current plan it moved to, unchanged."
674
+ }
675
+ }
676
+ },
677
+ {
678
+ "type": "object",
679
+ "additionalProperties": false,
680
+ "required": [
681
+ "deferred"
682
+ ],
683
+ "properties": {
684
+ "deferred": {
685
+ "$ref": "#/$defs/Text"
686
+ }
687
+ }
688
+ },
689
+ {
690
+ "type": "object",
691
+ "additionalProperties": false,
692
+ "required": [
693
+ "dropped"
694
+ ],
695
+ "properties": {
696
+ "dropped": {
697
+ "$ref": "#/$defs/Text"
698
+ }
699
+ }
700
+ },
701
+ {
702
+ "type": "object",
703
+ "additionalProperties": false,
704
+ "required": [
705
+ "finished"
706
+ ],
707
+ "properties": {
708
+ "finished": {
709
+ "$ref": "#/$defs/Text",
710
+ "description": "It was done under the earlier plan and nothing needed to carry it on."
711
+ }
712
+ }
713
+ }
714
+ ]
715
+ },
716
+ "Step": {
717
+ "description": "A step the program cannot find by itself from the work item's number in the commits and documents. Add one only with its evidence.",
718
+ "type": "object",
719
+ "additionalProperties": false,
720
+ "required": [
721
+ "kind",
722
+ "source"
723
+ ],
724
+ "properties": {
725
+ "kind": {
726
+ "enum": [
727
+ "Planned",
728
+ "Dispatched",
729
+ "Delivered",
730
+ "QC",
731
+ "Review",
732
+ "Walkthrough",
733
+ "Fix",
734
+ "Merged",
735
+ "Accepted"
736
+ ]
737
+ },
738
+ "at": {
739
+ "$ref": "#/$defs/Date"
740
+ },
741
+ "verdict": {
742
+ "type": "string",
743
+ "description": "For QC, Review or Walkthrough: the verdict as the report writes it."
744
+ },
745
+ "source": {
746
+ "$ref": "#/$defs/Source"
747
+ }
748
+ }
749
+ },
750
+ "Work": {
751
+ "description": "One piece of work from the project's own plan: a task, a contract, a ticket. A commit or a session never becomes a work item by itself.",
752
+ "type": "object",
753
+ "additionalProperties": false,
754
+ "required": [
755
+ "id",
756
+ "name",
757
+ "summary",
758
+ "plan",
759
+ "status",
760
+ "progress",
761
+ "sources"
762
+ ],
763
+ "properties": {
764
+ "id": {
765
+ "$ref": "#/$defs/Id",
766
+ "description": "The project's own number. The program finds this work's commits, dispatches, receipts, reviews and merges by it."
767
+ },
768
+ "name": {
769
+ "$ref": "#/$defs/Text"
770
+ },
771
+ "summary": {
772
+ "$ref": "#/$defs/Text"
773
+ },
774
+ "plan": {
775
+ "$ref": "#/$defs/Id"
776
+ },
777
+ "area": {
778
+ "$ref": "#/$defs/Id",
779
+ "description": "The area it mainly serves: its column."
780
+ },
781
+ "alsoAreas": {
782
+ "type": "array",
783
+ "items": {
784
+ "$ref": "#/$defs/Id"
785
+ },
786
+ "description": "Other areas it serves; it shows there too, dashed."
787
+ },
788
+ "wholePlan": {
789
+ "$ref": "#/$defs/Text",
790
+ "description": "Instead of an area: why it serves its whole plan and no single area (a milestone review)."
791
+ },
792
+ "implements": {
793
+ "type": "array",
794
+ "items": {
795
+ "$ref": "#/$defs/Id"
796
+ },
797
+ "description": "The requirements, designs or decisions it carries out."
798
+ },
799
+ "dependsOn": {
800
+ "type": "array",
801
+ "items": {
802
+ "$ref": "#/$defs/Id"
803
+ }
804
+ },
805
+ "status": {
806
+ "$ref": "#/$defs/Status"
807
+ },
808
+ "replacedBy": {
809
+ "$ref": "#/$defs/Id"
810
+ },
811
+ "why": {
812
+ "$ref": "#/$defs/Text",
813
+ "description": "For Replaced, Abandoned or Deferred: what happened, in a sentence."
814
+ },
815
+ "progress": {
816
+ "$ref": "#/$defs/Progress"
817
+ },
818
+ "accepted": {
819
+ "$ref": "#/$defs/Source",
820
+ "description": "Where the owner accepted it, when the project records an acceptance."
821
+ },
822
+ "open": {
823
+ "$ref": "#/$defs/Text",
824
+ "description": "What is still open about it, in a sentence."
825
+ },
826
+ "became": {
827
+ "$ref": "#/$defs/Became",
828
+ "description": "Required when its plan is Replaced."
829
+ },
830
+ "steps": {
831
+ "type": "array",
832
+ "items": {
833
+ "$ref": "#/$defs/Step"
834
+ }
835
+ },
836
+ "sources": {
837
+ "$ref": "#/$defs/Sources"
838
+ }
839
+ },
840
+ "oneOf": [
841
+ {
842
+ "required": [
843
+ "area"
844
+ ]
845
+ },
846
+ {
847
+ "required": [
848
+ "wholePlan"
849
+ ]
850
+ }
851
+ ]
852
+ },
853
+ "Territory": {
854
+ "description": "A piece of code and the area it belongs to. Sizes, tests, who built it and whether the current plan still uses it are computed from git by the program.",
855
+ "type": "object",
856
+ "additionalProperties": false,
857
+ "required": [
858
+ "id",
859
+ "name",
860
+ "summary",
861
+ "area",
862
+ "paths"
863
+ ],
864
+ "properties": {
865
+ "id": {
866
+ "$ref": "#/$defs/Id"
867
+ },
868
+ "name": {
869
+ "$ref": "#/$defs/Text"
870
+ },
871
+ "summary": {
872
+ "$ref": "#/$defs/Text"
873
+ },
874
+ "area": {
875
+ "$ref": "#/$defs/Id"
876
+ },
877
+ "alsoAreas": {
878
+ "type": "array",
879
+ "items": {
880
+ "$ref": "#/$defs/Id"
881
+ }
882
+ },
883
+ "paths": {
884
+ "type": "array",
885
+ "minItems": 1,
886
+ "items": {
887
+ "type": "string"
888
+ },
889
+ "description": "Files or folders, relative to the project folder; each must exist at the asOf commit."
890
+ },
891
+ "anomalies": {
892
+ "type": "array",
893
+ "items": {
894
+ "type": "object",
895
+ "additionalProperties": false,
896
+ "required": [
897
+ "kind",
898
+ "text"
899
+ ],
900
+ "properties": {
901
+ "kind": {
902
+ "enum": [
903
+ "Unreferenced",
904
+ "Looks residual, is live",
905
+ "Built without a claiming work item",
906
+ "Docs disagree"
907
+ ]
908
+ },
909
+ "text": {
910
+ "$ref": "#/$defs/Text"
911
+ },
912
+ "sources": {
913
+ "$ref": "#/$defs/Sources"
914
+ }
915
+ }
916
+ }
917
+ }
918
+ }
919
+ },
920
+ "Note": {
921
+ "description": "Something for the owner's attention: what is wrong in the project, or where what the owner wants and what the project does part ways.",
922
+ "type": "object",
923
+ "additionalProperties": false,
924
+ "required": [
925
+ "id",
926
+ "title",
927
+ "kind",
928
+ "ask",
929
+ "by",
930
+ "on",
931
+ "text",
932
+ "sources"
933
+ ],
934
+ "properties": {
935
+ "id": {
936
+ "$ref": "#/$defs/Id"
937
+ },
938
+ "title": {
939
+ "$ref": "#/$defs/Text",
940
+ "description": "The first sentence: what is wrong, or what the owner is asked to decide."
941
+ },
942
+ "kind": {
943
+ "enum": [
944
+ "Anomaly",
945
+ "Owner and project differ",
946
+ "Question"
947
+ ]
948
+ },
949
+ "ask": {
950
+ "enum": [
951
+ "For your decision",
952
+ "Worth discussing",
953
+ "For information"
954
+ ]
955
+ },
956
+ "by": {
957
+ "enum": [
958
+ "Owner's words",
959
+ "Project",
960
+ "Main agent"
961
+ ],
962
+ "description": "Who wrote it: the reader of the owner's words, the reader of the project, or the main agent after reading both."
963
+ },
964
+ "on": {
965
+ "type": "array",
966
+ "minItems": 1,
967
+ "items": {
968
+ "$ref": "#/$defs/Id"
969
+ },
970
+ "description": "The entries it is about; it shows on each of them."
971
+ },
972
+ "text": {
973
+ "$ref": "#/$defs/Text",
974
+ "description": "Background, then why it matters. No internal ids beyond the project's own numbers."
975
+ },
976
+ "options": {
977
+ "type": "array",
978
+ "items": {
979
+ "type": "object",
980
+ "additionalProperties": false,
981
+ "required": [
982
+ "choice",
983
+ "consequence"
984
+ ],
985
+ "properties": {
986
+ "choice": {
987
+ "$ref": "#/$defs/Text"
988
+ },
989
+ "consequence": {
990
+ "$ref": "#/$defs/Text"
991
+ }
992
+ }
993
+ }
994
+ },
995
+ "sources": {
996
+ "$ref": "#/$defs/Sources"
997
+ }
998
+ }
999
+ }
1000
+ }
1001
+ }