@quolu/lattice 0.35.0 → 0.36.1

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.
@@ -0,0 +1,298 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/kitepon-rgb/Lattice/blob/main/docs/schemas/lattice.todo_extraction.v2.schema.json",
4
+ "title": "lattice.todo_extraction.v2",
5
+ "description": "G4 migration-wave-only intermediate artifact authored by AI. Version 2 adds fail-closed historical in-progress registration without changing v1.",
6
+ "$comment": "Runtime validation additionally enforces UTF-8 byte bounds, strict sort order, unique and resolvable task ids, and extraction_digest as the canonical self-digest. Registration separately rejects an extraction with no register_* task.",
7
+ "type": "object",
8
+ "additionalProperties": false,
9
+ "required": [
10
+ "schema",
11
+ "project_id",
12
+ "plan_key",
13
+ "plan_version",
14
+ "actor",
15
+ "recorded_at",
16
+ "tasks",
17
+ "hard_dependencies",
18
+ "joins",
19
+ "extraction_digest"
20
+ ],
21
+ "properties": {
22
+ "schema": { "const": "lattice.todo_extraction.v2" },
23
+ "project_id": { "$ref": "#/$defs/identifier" },
24
+ "plan_key": { "$ref": "#/$defs/identifier" },
25
+ "plan_version": { "$ref": "#/$defs/identifier" },
26
+ "actor": { "$ref": "#/$defs/actor" },
27
+ "recorded_at": { "$ref": "#/$defs/strictTimestamp" },
28
+ "tasks": {
29
+ "type": "array",
30
+ "minItems": 1,
31
+ "maxItems": 512,
32
+ "items": { "$ref": "#/$defs/task" }
33
+ },
34
+ "hard_dependencies": {
35
+ "type": "array",
36
+ "maxItems": 2048,
37
+ "items": {
38
+ "type": "object",
39
+ "additionalProperties": false,
40
+ "required": ["from", "to"],
41
+ "properties": {
42
+ "from": { "$ref": "#/$defs/nodeRef" },
43
+ "to": { "$ref": "#/$defs/nodeRef" }
44
+ }
45
+ }
46
+ },
47
+ "joins": {
48
+ "type": "array",
49
+ "maxItems": 128,
50
+ "items": {
51
+ "type": "object",
52
+ "additionalProperties": false,
53
+ "required": ["id", "after", "before"],
54
+ "properties": {
55
+ "id": { "$ref": "#/$defs/identifier" },
56
+ "after": {
57
+ "type": "array",
58
+ "minItems": 1,
59
+ "maxItems": 512,
60
+ "items": { "$ref": "#/$defs/nodeRef" }
61
+ },
62
+ "before": { "$ref": "#/$defs/nodeRef" }
63
+ }
64
+ }
65
+ },
66
+ "extraction_digest": { "$ref": "#/$defs/digest" }
67
+ },
68
+ "$defs": {
69
+ "identifier": {
70
+ "type": "string",
71
+ "pattern": "^[0-9A-Za-z](?:[0-9A-Za-z._-]{0,127})$"
72
+ },
73
+ "digest": {
74
+ "type": "string",
75
+ "pattern": "^[0-9a-f]{64}$"
76
+ },
77
+ "repoRef": {
78
+ "type": "string",
79
+ "minLength": 1,
80
+ "maxLength": 1024,
81
+ "pattern": "^(?!/)(?!.*(?:^|/)\\.{1,2}(?:/|$))(?!.*\\\\)(?!.*[\\u0000-\\u001f\\u007f])[^/]+(?:/[^/]+)*$"
82
+ },
83
+ "text": {
84
+ "type": "string",
85
+ "minLength": 1,
86
+ "maxLength": 16384
87
+ },
88
+ "nullableText": {
89
+ "oneOf": [
90
+ { "type": "null" },
91
+ { "$ref": "#/$defs/text" }
92
+ ]
93
+ },
94
+ "strictTimestamp": {
95
+ "type": "string",
96
+ "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}\\.[0-9]{3}Z$",
97
+ "$comment": "Runtime validation also requires Date.parse(value).toISOString() byte equality."
98
+ },
99
+ "actor": {
100
+ "type": "object",
101
+ "additionalProperties": false,
102
+ "required": ["host", "session", "agent"],
103
+ "properties": {
104
+ "host": { "$ref": "#/$defs/identifier" },
105
+ "session": { "$ref": "#/$defs/identifier" },
106
+ "agent": { "$ref": "#/$defs/identifier" }
107
+ }
108
+ },
109
+ "nodeRef": {
110
+ "type": "object",
111
+ "additionalProperties": false,
112
+ "required": ["project_id", "plan_key", "task_id"],
113
+ "properties": {
114
+ "project_id": { "$ref": "#/$defs/identifier" },
115
+ "plan_key": { "$ref": "#/$defs/identifier" },
116
+ "task_id": { "$ref": "#/$defs/identifier" },
117
+ "expected_topology_digest": { "$ref": "#/$defs/digest" }
118
+ }
119
+ },
120
+ "sourceLocation": {
121
+ "type": "object",
122
+ "additionalProperties": false,
123
+ "required": [
124
+ "origin_plan_ref",
125
+ "origin_line",
126
+ "source_commit",
127
+ "heading_path",
128
+ "markdown_depth",
129
+ "parent_task_id",
130
+ "checkbox_state"
131
+ ],
132
+ "properties": {
133
+ "origin_plan_ref": { "$ref": "#/$defs/repoRef" },
134
+ "origin_line": { "type": "integer", "minimum": 1 },
135
+ "source_commit": { "type": "string", "pattern": "^(?:[0-9a-f]{40}|[0-9a-f]{64})$" },
136
+ "heading_path": {
137
+ "type": "array",
138
+ "maxItems": 32,
139
+ "items": { "type": "string", "minLength": 1, "maxLength": 1024 }
140
+ },
141
+ "markdown_depth": { "type": "integer", "minimum": 0, "maximum": 64 },
142
+ "parent_task_id": {
143
+ "oneOf": [
144
+ { "type": "null" },
145
+ { "$ref": "#/$defs/identifier" }
146
+ ]
147
+ },
148
+ "checkbox_state": {
149
+ "enum": ["checked", "unchecked", "absent", "ambiguous"]
150
+ }
151
+ }
152
+ },
153
+ "migrationContext": {
154
+ "type": "object",
155
+ "additionalProperties": false,
156
+ "required": [
157
+ "external_canonical_ref",
158
+ "carry_over_ref",
159
+ "h_required",
160
+ "condition",
161
+ "evidence_refs",
162
+ "notes"
163
+ ],
164
+ "properties": {
165
+ "external_canonical_ref": { "$ref": "#/$defs/nullableText" },
166
+ "carry_over_ref": { "$ref": "#/$defs/nullableText" },
167
+ "h_required": { "type": "boolean" },
168
+ "condition": { "$ref": "#/$defs/nullableText" },
169
+ "evidence_refs": {
170
+ "type": "array",
171
+ "maxItems": 64,
172
+ "items": { "type": "string", "minLength": 1, "maxLength": 4096 }
173
+ },
174
+ "notes": {
175
+ "type": "array",
176
+ "maxItems": 64,
177
+ "items": { "type": "string", "minLength": 1, "maxLength": 4096 }
178
+ }
179
+ }
180
+ },
181
+ "historicalStart": {
182
+ "type": "object",
183
+ "additionalProperties": false,
184
+ "required": ["start_mode", "status", "started_at"],
185
+ "properties": {
186
+ "start_mode": { "const": "historical_import" },
187
+ "status": { "const": "in-progress" },
188
+ "started_at": {
189
+ "oneOf": [
190
+ { "const": "unknown_requires_evidence" },
191
+ { "$ref": "#/$defs/strictTimestamp" }
192
+ ]
193
+ }
194
+ }
195
+ },
196
+ "historicalCompletion": {
197
+ "type": "object",
198
+ "additionalProperties": false,
199
+ "required": ["done_mode", "completed_at"],
200
+ "properties": {
201
+ "done_mode": { "const": "historical_import" },
202
+ "completed_at": {
203
+ "oneOf": [
204
+ { "const": "unknown_requires_evidence" },
205
+ { "$ref": "#/$defs/strictTimestamp" }
206
+ ]
207
+ }
208
+ }
209
+ },
210
+ "taskBase": {
211
+ "type": "object",
212
+ "additionalProperties": false,
213
+ "required": [
214
+ "task_id",
215
+ "title",
216
+ "lane",
217
+ "narrative_ref",
218
+ "compile_binding",
219
+ "disposition",
220
+ "start",
221
+ "completion",
222
+ "source",
223
+ "migration_context"
224
+ ],
225
+ "properties": {
226
+ "task_id": { "$ref": "#/$defs/identifier" },
227
+ "title": { "$ref": "#/$defs/text" },
228
+ "lane": { "$ref": "#/$defs/identifier" },
229
+ "narrative_ref": {
230
+ "oneOf": [
231
+ { "type": "null" },
232
+ { "$ref": "#/$defs/repoRef" }
233
+ ]
234
+ },
235
+ "compile_binding": { "type": "null" },
236
+ "disposition": {
237
+ "enum": [
238
+ "register_pending",
239
+ "register_in_progress",
240
+ "register_done",
241
+ "exclude_superseded",
242
+ "exclude_compatibility_record",
243
+ "unknown_requires_evidence"
244
+ ]
245
+ },
246
+ "start": {
247
+ "oneOf": [
248
+ { "type": "null" },
249
+ { "$ref": "#/$defs/historicalStart" }
250
+ ]
251
+ },
252
+ "completion": {
253
+ "oneOf": [
254
+ { "type": "null" },
255
+ { "$ref": "#/$defs/historicalCompletion" }
256
+ ]
257
+ },
258
+ "source": { "$ref": "#/$defs/sourceLocation" },
259
+ "migration_context": { "$ref": "#/$defs/migrationContext" }
260
+ }
261
+ },
262
+ "task": {
263
+ "allOf": [
264
+ { "$ref": "#/$defs/taskBase" },
265
+ {
266
+ "if": {
267
+ "properties": { "disposition": { "const": "register_in_progress" } },
268
+ "required": ["disposition"]
269
+ },
270
+ "then": {
271
+ "properties": {
272
+ "start": { "$ref": "#/$defs/historicalStart" },
273
+ "completion": { "type": "null" }
274
+ }
275
+ },
276
+ "else": {
277
+ "if": {
278
+ "properties": { "disposition": { "const": "register_done" } },
279
+ "required": ["disposition"]
280
+ },
281
+ "then": {
282
+ "properties": {
283
+ "start": { "type": "null" },
284
+ "completion": { "$ref": "#/$defs/historicalCompletion" }
285
+ }
286
+ },
287
+ "else": {
288
+ "properties": {
289
+ "start": { "type": "null" },
290
+ "completion": { "type": "null" }
291
+ }
292
+ }
293
+ }
294
+ }
295
+ ]
296
+ }
297
+ }
298
+ }
@@ -0,0 +1,220 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/kitepon-rgb/Lattice/blob/main/docs/schemas/lattice.todo_revision.v2.schema.json",
4
+ "title": "lattice.todo_revision.v2",
5
+ "description": "`lattice todo revise`が受理する最新契約。v1のdesired state・source inventory・reconciliationへ、per-ToDoのsource cutover batch(Markdown置換の証跡)を加える。",
6
+ "$comment": "Runtime validation (src/todo-revision.mjs validateTodoRevision) additionally enforces: canonical JSON+LF bytes; strict sort order on task_migration (by from_task_id) and source_inventory.excluded_tombstones/source_cutover_batch.operations (by source_ref); uniqueness of from_task_id/to_task_id/source_ref across those collections; desired_plan.plan_version === todoRevisionPlanVersion(...); reconciliation.reconciliation_digest === todoReconciliationDigest(...); revision_digest as the canonical self-digest over every other top-level field; and that every task_migration.to_task_id (other than 'removed') resolves to a desired_plan task.",
7
+ "type": "object",
8
+ "additionalProperties": false,
9
+ "required": [
10
+ "schema", "project_id", "plan_key", "predecessor", "desired_plan", "task_migration",
11
+ "source_inventory", "reconciliation", "source_cutover_batch", "revision_digest"
12
+ ],
13
+ "properties": {
14
+ "schema": { "const": "lattice.todo_revision.v2" },
15
+ "project_id": { "$ref": "#/$defs/identifier" },
16
+ "plan_key": { "$ref": "#/$defs/identifier" },
17
+ "predecessor": { "$ref": "#/$defs/predecessor" },
18
+ "desired_plan": { "$ref": "#/$defs/desiredPlanV3" },
19
+ "task_migration": {
20
+ "type": "array", "minItems": 1, "maxItems": 512,
21
+ "items": { "$ref": "#/$defs/taskMigrationEntry" }
22
+ },
23
+ "source_inventory": { "$ref": "#/$defs/sourceInventory" },
24
+ "reconciliation": {
25
+ "type": "object", "additionalProperties": false,
26
+ "required": ["predecessor_reconciliation_digest", "source_inventory_digest", "reconciliation_digest"],
27
+ "properties": {
28
+ "predecessor_reconciliation_digest": { "$ref": "#/$defs/digest" },
29
+ "source_inventory_digest": { "$ref": "#/$defs/digest" },
30
+ "reconciliation_digest": { "$ref": "#/$defs/digest" }
31
+ }
32
+ },
33
+ "source_cutover_batch": { "$ref": "#/$defs/sourceCutoverBatch" },
34
+ "revision_digest": { "$ref": "#/$defs/digest" }
35
+ },
36
+ "$defs": {
37
+ "identifier": { "type": "string", "pattern": "^[0-9A-Za-z](?:[0-9A-Za-z._-]{0,127})$" },
38
+ "digest": { "type": "string", "pattern": "^[0-9a-f]{64}$" },
39
+ "nullableDigest": { "oneOf": [{ "type": "null" }, { "$ref": "#/$defs/digest" }] },
40
+ "gitSha": { "type": "string", "pattern": "^[0-9a-f]{40}$" },
41
+ "repoRef": {
42
+ "type": "string",
43
+ "minLength": 1,
44
+ "maxLength": 1024,
45
+ "pattern": "^(?!/)(?!.*(?:^|/)\\.{1,2}(?:/|$))(?!.*\\\\)(?!.*[\\u0000-\\u001f\\u007f])[^/]+(?:/[^/]+)*$"
46
+ },
47
+ "sourceLineRef": {
48
+ "type": "string",
49
+ "minLength": 1,
50
+ "maxLength": 1024,
51
+ "$comment": "repoRefと同じ形に加え#L<line>を必須にする。実際の判定はparseTodoSourceRef(src/todo-revision.mjs)。",
52
+ "pattern": "^(?!/)(?!.*(?:^|/)\\.{1,2}(?:/|$))(?!.*\\\\)(?!.*[\\u0000-\\u001f\\u007f])[^/]+(?:/[^/]+)*#L[1-9][0-9]*$"
53
+ },
54
+ "nullableRepoRef": { "oneOf": [{ "type": "null" }, { "$ref": "#/$defs/repoRef" }] },
55
+ "text": { "type": "string", "minLength": 1, "maxLength": 16384 },
56
+ "nullableText": { "oneOf": [{ "type": "null" }, { "$ref": "#/$defs/text" }] },
57
+ "nodeRef": {
58
+ "type": "object", "additionalProperties": false,
59
+ "required": ["project_id", "plan_key", "task_id"],
60
+ "properties": {
61
+ "project_id": { "$ref": "#/$defs/identifier" },
62
+ "plan_key": { "$ref": "#/$defs/identifier" },
63
+ "task_id": { "$ref": "#/$defs/identifier" },
64
+ "expected_topology_digest": { "$ref": "#/$defs/digest" }
65
+ }
66
+ },
67
+ "edge": {
68
+ "type": "object", "additionalProperties": false, "required": ["from", "to"],
69
+ "properties": { "from": { "$ref": "#/$defs/nodeRef" }, "to": { "$ref": "#/$defs/nodeRef" } }
70
+ },
71
+ "join": {
72
+ "type": "object", "additionalProperties": false, "required": ["id", "after", "before"],
73
+ "properties": {
74
+ "id": { "$ref": "#/$defs/identifier" },
75
+ "after": { "type": "array", "minItems": 1, "maxItems": 512, "items": { "$ref": "#/$defs/nodeRef" } },
76
+ "before": { "$ref": "#/$defs/nodeRef" }
77
+ }
78
+ },
79
+ "narrativeAnchor": {
80
+ "type": "object", "additionalProperties": false,
81
+ "required": ["origin_plan_ref", "origin_line", "source_commit", "source_line_digest"],
82
+ "properties": {
83
+ "origin_plan_ref": { "$ref": "#/$defs/repoRef" },
84
+ "origin_line": { "type": "integer", "minimum": 1 },
85
+ "source_commit": { "type": "string", "pattern": "^(?:[0-9a-f]{40}|[0-9a-f]{64})$" },
86
+ "source_line_digest": { "$ref": "#/$defs/digest" }
87
+ }
88
+ },
89
+ "compileBinding": {
90
+ "oneOf": [
91
+ { "type": "null" },
92
+ {
93
+ "type": "object", "additionalProperties": false,
94
+ "required": ["boundary_manifest_digest", "compiled_plan_digest", "topology_digest", "base_sha"],
95
+ "properties": {
96
+ "boundary_manifest_digest": { "$ref": "#/$defs/digest" },
97
+ "compiled_plan_digest": { "$ref": "#/$defs/digest" },
98
+ "topology_digest": { "$ref": "#/$defs/digest" },
99
+ "base_sha": { "$ref": "#/$defs/gitSha" }
100
+ }
101
+ }
102
+ ]
103
+ },
104
+ "predecessor": {
105
+ "type": "object", "additionalProperties": false,
106
+ "required": ["plan_digest", "journal_head_digest", "plan_version"],
107
+ "properties": {
108
+ "plan_digest": { "$ref": "#/$defs/digest" },
109
+ "journal_head_digest": { "$ref": "#/$defs/digest" },
110
+ "plan_version": { "$ref": "#/$defs/identifier" }
111
+ }
112
+ },
113
+ "taskV3": {
114
+ "type": "object", "additionalProperties": false,
115
+ "required": [
116
+ "task_id", "title", "lane", "narrative_ref", "narrative_anchor", "compile_binding", "parent_task_id"
117
+ ],
118
+ "properties": {
119
+ "task_id": { "$ref": "#/$defs/identifier" },
120
+ "title": { "$ref": "#/$defs/nullableText" },
121
+ "lane": { "$ref": "#/$defs/identifier" },
122
+ "narrative_ref": { "$ref": "#/$defs/nullableRepoRef" },
123
+ "narrative_anchor": { "oneOf": [{ "type": "null" }, { "$ref": "#/$defs/narrativeAnchor" }] },
124
+ "compile_binding": { "$ref": "#/$defs/compileBinding" },
125
+ "parent_task_id": { "oneOf": [{ "type": "null" }, { "$ref": "#/$defs/identifier" }] }
126
+ }
127
+ },
128
+ "desiredPlanV3": {
129
+ "type": "object", "additionalProperties": false,
130
+ "required": [
131
+ "schema", "project_id", "plan_key", "plan_version", "predecessor_plan_digest",
132
+ "tasks", "hard_dependencies", "joins", "topology_digest", "plan_digest"
133
+ ],
134
+ "properties": {
135
+ "schema": { "const": "lattice.todo_plan.v3" },
136
+ "project_id": { "$ref": "#/$defs/identifier" },
137
+ "plan_key": { "$ref": "#/$defs/identifier" },
138
+ "plan_version": { "$ref": "#/$defs/identifier" },
139
+ "predecessor_plan_digest": { "$ref": "#/$defs/nullableDigest" },
140
+ "tasks": { "type": "array", "minItems": 1, "maxItems": 512, "items": { "$ref": "#/$defs/taskV3" } },
141
+ "hard_dependencies": { "type": "array", "maxItems": 2048, "items": { "$ref": "#/$defs/edge" } },
142
+ "joins": { "type": "array", "maxItems": 128, "items": { "$ref": "#/$defs/join" } },
143
+ "topology_digest": { "$ref": "#/$defs/digest" },
144
+ "plan_digest": { "$ref": "#/$defs/digest" }
145
+ }
146
+ },
147
+ "taskMigrationEntry": {
148
+ "type": "object", "additionalProperties": false,
149
+ "required": ["from_task_id", "to_task_id", "state_policy"],
150
+ "properties": {
151
+ "from_task_id": { "$ref": "#/$defs/identifier" },
152
+ "to_task_id": { "oneOf": [{ "const": "removed" }, { "$ref": "#/$defs/identifier" }] },
153
+ "state_policy": {
154
+ "enum": ["carry", "carry_reconciled_metadata", "reset_pending", "removed"],
155
+ "$comment": "'removed'はto_task_id==='removed'の時だけ、他の3値はto_task_idがidentifierの時だけ許される(runtime cross-check)。"
156
+ }
157
+ }
158
+ },
159
+ "sourceInventoryActiveEntry": {
160
+ "type": "object", "additionalProperties": false,
161
+ "required": ["task_id", "source_ref", "source_digest"],
162
+ "properties": {
163
+ "task_id": { "$ref": "#/$defs/identifier" },
164
+ "source_ref": { "$ref": "#/$defs/sourceLineRef" },
165
+ "source_digest": { "$ref": "#/$defs/digest" }
166
+ }
167
+ },
168
+ "sourceInventoryTombstone": {
169
+ "type": "object", "additionalProperties": false,
170
+ "required": ["source_ref", "source_digest", "exclusion_reason"],
171
+ "properties": {
172
+ "source_ref": { "$ref": "#/$defs/sourceLineRef" },
173
+ "source_digest": { "$ref": "#/$defs/digest" },
174
+ "exclusion_reason": { "$ref": "#/$defs/text" }
175
+ }
176
+ },
177
+ "sourceInventory": {
178
+ "type": "object", "additionalProperties": false,
179
+ "required": ["active", "excluded_tombstones"],
180
+ "$comment": "activeはdesired_plan.tasksと同じ順序・同じtask_id集合でなければならない(runtime cross-check)。",
181
+ "properties": {
182
+ "active": {
183
+ "type": "array", "maxItems": 512, "items": { "$ref": "#/$defs/sourceInventoryActiveEntry" }
184
+ },
185
+ "excluded_tombstones": {
186
+ "type": "array", "maxItems": 2048, "items": { "$ref": "#/$defs/sourceInventoryTombstone" }
187
+ }
188
+ }
189
+ },
190
+ "sourceCutoverOperation": {
191
+ "type": "object", "additionalProperties": false,
192
+ "required": ["task_id", "disposition", "source_ref", "source_digest", "live_replacement"],
193
+ "properties": {
194
+ "task_id": { "oneOf": [{ "type": "null" }, { "$ref": "#/$defs/identifier" }] },
195
+ "disposition": { "enum": ["active", "excluded"] },
196
+ "source_ref": { "$ref": "#/$defs/sourceLineRef" },
197
+ "source_digest": { "$ref": "#/$defs/digest" },
198
+ "live_replacement": {
199
+ "type": "string", "minLength": 1, "maxLength": 4096,
200
+ "$comment": "改行・制御文字禁止に加え、Markdownチェックボックス行に見える文字列は拒否される(validLiveReplacement)。"
201
+ }
202
+ }
203
+ },
204
+ "sourceCutoverBatch": {
205
+ "type": "object", "additionalProperties": false,
206
+ "required": ["batch_id", "archive_ref", "operations", "batch_digest"],
207
+ "properties": {
208
+ "batch_id": { "$ref": "#/$defs/identifier" },
209
+ "archive_ref": {
210
+ "allOf": [{ "$ref": "#/$defs/repoRef" }, { "pattern": "\\.md$" }],
211
+ "$comment": "#L<line>付きのsourceLineRef形にはなり得ない(runtime cross-check)。"
212
+ },
213
+ "operations": {
214
+ "type": "array", "minItems": 1, "maxItems": 512, "items": { "$ref": "#/$defs/sourceCutoverOperation" }
215
+ },
216
+ "batch_digest": { "$ref": "#/$defs/digest" }
217
+ }
218
+ }
219
+ }
220
+ }