@quolu/lattice 0.36.1 → 0.38.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.
- package/README.ja.md +29 -0
- package/README.md +25 -0
- package/bin/lattice-dashboard.mjs +2 -2
- package/package.json +1 -1
- package/src/cli-help.mjs +17 -1
- package/src/todo-cli.mjs +373 -12
- package/src/todo-contracts.mjs +80 -3
- package/src/todo-gantt-html-independence.mjs +29 -3
- package/src/todo-gantt-html-style.mjs +6 -0
- package/src/todo-gantt-html.mjs +28 -6
- package/src/todo-note-store.mjs +492 -0
- package/src/todo-store.mjs +40 -12
package/README.ja.md
CHANGED
|
@@ -43,6 +43,21 @@ planを再コンパイルします。共有面が共有でなくなるので、
|
|
|
43
43
|
|
|
44
44
|
人が手で切ったのではありません。**工程を並列化するために製品が切りました。**
|
|
45
45
|
|
|
46
|
+
### 作業記憶はToDoと一緒に渡る
|
|
47
|
+
|
|
48
|
+
AIは、次の担当が作業を続けるために必要な方針、棄却案、調査結果、注意、未解決事項をToDoへ追記できます。
|
|
49
|
+
通常の`lattice todo show`と、成功するすべての`lattice todo start`は、元version/元task、訂正状態、
|
|
50
|
+
note chain head、overflow、全履歴コマンドを含む最新のbounded `note_context`を自動で返します。
|
|
51
|
+
次のAIが別のnote読取コマンドを知っている必要はありません。
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
lattice todo note --plan <key> --task <id> --message "既存parserを使い、fallbackは追加しない"
|
|
55
|
+
lattice todo show --plan <key> --task <id> --json
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
ローカルGanttでは、選択したToDoの右ペインへ同じ作業記録を表示します。公開Gantt/dashboardは契約として
|
|
59
|
+
note本文を含めません。
|
|
60
|
+
|
|
46
61
|
### 変換の受入五条件
|
|
47
62
|
|
|
48
63
|
**5つすべて**を満たしたときだけ採用します。1つでも欠ければ棄却です。
|
|
@@ -213,6 +228,20 @@ lattice todo phase review --plan <key> --phase terminal-audit --reason <text>
|
|
|
213
228
|
lattice todo phase accept --plan <key> --phase terminal-audit --input <file>
|
|
214
229
|
```
|
|
215
230
|
|
|
231
|
+
**過去の工程は監査できません。** 監査対象のコードが既に変化しているためです。そこで
|
|
232
|
+
「監査なしで閉じた」という状態を別に持ちます——`accepted`(監査を通った)へは絶対に化けず、
|
|
233
|
+
記録は永久に区別できます。工程図では畳まれるので監査待ちの札は外れます。
|
|
234
|
+
|
|
235
|
+
```bash
|
|
236
|
+
lattice todo phase close-unaudited --plan <key> --phase terminal-audit --reason <text>
|
|
237
|
+
lattice todo phase baseline --reason <text> --except <監査したいplan_key> # 一括
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
一括の入口は、現在監査待ちで一度も監査に触れていないPhaseだけを対象にします。**自動では
|
|
241
|
+
実行しません**——どれを監査し、どれを歴史として畳むかは人が決め、Latticeは宣言を受け取って
|
|
242
|
+
記録するだけです。`--except`は「最近の作業でコードも生きているので本当に監査したい」planを
|
|
243
|
+
残すための口です。規約は[ADR 0148](docs/adr/0148-history-closes-unaudited-not-audited.md)が正です。
|
|
244
|
+
|
|
216
245
|
誤ってphase無しで作ったplanへ後からPhaseを被せる場合は、`revise-phase`の
|
|
217
246
|
`state_policy: acquire_phase`でdone状態を保ったまま獲得できます(未割当→割当の向きだけを許し、
|
|
218
247
|
既にphaseを持つtaskの付け替えは拒否します)。
|
package/README.md
CHANGED
|
@@ -58,6 +58,22 @@ the same parallel group.
|
|
|
58
58
|
|
|
59
59
|
Nobody hand-refactored that file. The product cut it so the work could parallelize.
|
|
60
60
|
|
|
61
|
+
### Task memory travels with the task
|
|
62
|
+
|
|
63
|
+
An agent can append the decisions, rejected approaches, findings, cautions, and open questions needed
|
|
64
|
+
to continue a ToDo. A normal `lattice todo show` and every successful `lattice todo start` return the
|
|
65
|
+
latest bounded `note_context` automatically, including origin, correction state, chain head, overflow,
|
|
66
|
+
and the full-history command. The next agent does not need to discover or remember a separate note
|
|
67
|
+
lookup command.
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
lattice todo note --plan <key> --task <id> --message "Use the existing parser; do not add a fallback"
|
|
71
|
+
lattice todo show --plan <key> --task <id> --json
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
The same context appears in the selected ToDo's detail pane in a local Gantt. Public Gantt and
|
|
75
|
+
dashboard rendering exclude note bodies by contract.
|
|
76
|
+
|
|
61
77
|
### The five acceptance conditions
|
|
62
78
|
|
|
63
79
|
A transform is adopted only when **all five** hold. One missing condition rejects it:
|
|
@@ -158,6 +174,15 @@ rejected over it; the requirement is reported instead. And the audit gate never
|
|
|
158
174
|
phases order reviews, the ToDo DAG orders work
|
|
159
175
|
([ADR 0147](docs/adr/0147-audit-is-on-by-default.md)).
|
|
160
176
|
|
|
177
|
+
**History closes unaudited, never audited.** Work that finished long ago cannot be audited — the
|
|
178
|
+
code under review has already moved. Demanding an audit there produces either a false finding
|
|
179
|
+
(pointing at a later, intentional change) or a rubber stamp. So there is a third terminal state,
|
|
180
|
+
`closed_unaudited`: recorded with a reason, folded away like finished work, and **structurally
|
|
181
|
+
incapable of passing as `accepted`** — phase-accept dependencies unlock on `accepted` alone. The
|
|
182
|
+
bulk entry point never runs by itself, and the machine never infers "old enough to skip"; a human
|
|
183
|
+
decides what gets audited and what becomes history
|
|
184
|
+
([ADR 0148](docs/adr/0148-history-closes-unaudited-not-audited.md)).
|
|
185
|
+
|
|
161
186
|
## Patent
|
|
162
187
|
|
|
163
188
|
The design in this repository is the subject of a Japanese patent application:
|
|
@@ -5,7 +5,7 @@ import path from 'node:path';
|
|
|
5
5
|
|
|
6
6
|
import { readTodoStoreStable } from '../src/todo-store.mjs';
|
|
7
7
|
import { projectTodoStatus } from '../src/todo-status.mjs';
|
|
8
|
-
import { ganttLiveHeadDigest,
|
|
8
|
+
import { ganttLiveHeadDigest, renderPublicTodoGanttForProject } from '../src/todo-cli.mjs';
|
|
9
9
|
import {
|
|
10
10
|
readVisibleTodoDashboardProjects,
|
|
11
11
|
writeTodoDashboardDaemonDescriptor,
|
|
@@ -87,7 +87,7 @@ async function synchronize() {
|
|
|
87
87
|
displayName: entry.display_name,
|
|
88
88
|
render: async ({ displayName }) => {
|
|
89
89
|
const store = await readCachedStore(entry.repo_root);
|
|
90
|
-
const result = await
|
|
90
|
+
const result = await renderPublicTodoGanttForProject({ repoRoot: entry.repo_root,
|
|
91
91
|
stable: true, displayName, readModel: store });
|
|
92
92
|
return {
|
|
93
93
|
html: result.rendered.html,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@quolu/lattice",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.38.0",
|
|
4
4
|
"description": "Schedulability compiler for multi-agent development: observe real code boundaries, refactor the conflicting seam, recompile the plan for parallel execution",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Quo / クオ at kitepon.dev",
|
package/src/cli-help.mjs
CHANGED
|
@@ -61,6 +61,8 @@ Commands:
|
|
|
61
61
|
|
|
62
62
|
Read commands:
|
|
63
63
|
status [--json]
|
|
64
|
+
show --plan <key> --task <id> --json # 個別ToDoと最新bounded note contextを追加操作なしで返す
|
|
65
|
+
note list --plan <key> [--task <id>] --json # note全履歴の診断面(通常read/startでは不要)
|
|
64
66
|
bindings [--plan <key>] [--json] # compile_binding付きTaskをTODO identityつきで投影する
|
|
65
67
|
independence [--plan <key>] [--json] # readyを検証済み並列・要直列・未検査へ分けて投影する
|
|
66
68
|
seam-profile --plan <key> --file <path> [--json] # 係争fileの切断コスト内訳を投影する(read-only)
|
|
@@ -73,6 +75,8 @@ Read commands:
|
|
|
73
75
|
phase status --plan <key>
|
|
74
76
|
|
|
75
77
|
Write commands:
|
|
78
|
+
note --plan <key> --task <id> (--message <text>|--input <file>)
|
|
79
|
+
# ToDoへ作業継続に必要な方針・調査結果・注意をappend-onlyで追記する
|
|
76
80
|
migrate --input <extraction.json> [--serialization-reviewed]
|
|
77
81
|
# 既存storeへplanを追加する(plan createは空store初期化専用)。
|
|
78
82
|
# 依存グラフがほぼ一直線なら一度突き返し、再考後の --serialization-reviewed で通す
|
|
@@ -98,6 +102,12 @@ Write commands:
|
|
|
98
102
|
phase review --plan <key> --phase <id> --reason <text>
|
|
99
103
|
phase <accept|reject> --plan <key> --phase <id> --input <file>
|
|
100
104
|
phase reopen --plan <key> --phase <id> --reason <text> [--override-reason <text>]
|
|
105
|
+
phase close-unaudited --plan <key> --phase <id> --reason <text>
|
|
106
|
+
# 監査せず「監査なしで閉じた」として明示的に閉じる(ADR 0148)。前提はgate_readyで、
|
|
107
|
+
# acceptedへは化けない(phase_accept_dependenciesを解錠しない)
|
|
108
|
+
phase baseline --reason <text> [--except <plan_key>]...
|
|
109
|
+
# 現在gate_readyかつphase eventを1つも持たないPhaseを一括でclosed_unauditedへ宣言する。
|
|
110
|
+
# 自動実行はしない(明示コマンドのみ)。--exceptで指定したplanは対象から除外する
|
|
101
111
|
|
|
102
112
|
Write commands require LATTICE_TODO_ACTOR_HOST, LATTICE_TODO_ACTOR_SESSION,
|
|
103
113
|
and LATTICE_TODO_ACTOR_AGENT.
|
|
@@ -162,6 +172,9 @@ const SUBCOMMAND_USAGE = Object.freeze({
|
|
|
162
172
|
'run seam resolve': 'run seam resolve --run .lattice/runs/<id> --finding <digest> --input <seam-request.json>',
|
|
163
173
|
'event verify': 'event verify --run .lattice/runs/<id>',
|
|
164
174
|
'todo status': 'todo status [--json]',
|
|
175
|
+
'todo show': 'todo show --plan <key> --task <id> --json',
|
|
176
|
+
'todo note': 'todo note --plan <key> --task <id> (--message <text>|--input <file>) | list --plan <key> [--task <id>] --json',
|
|
177
|
+
'todo note list': 'todo note list --plan <key> [--task <id>] --json',
|
|
165
178
|
'todo bindings': 'todo bindings [--plan <key>] [--json]',
|
|
166
179
|
'todo independence': 'todo independence [--plan <key>] [--json] | compile --plan <key> --input <file> | witness migrate --plan <key>',
|
|
167
180
|
'todo seam-profile': 'todo seam-profile --plan <key> --file <path> [--json]',
|
|
@@ -169,12 +182,15 @@ const SUBCOMMAND_USAGE = Object.freeze({
|
|
|
169
182
|
'todo verify': 'todo verify [--plan <key>] [--json]',
|
|
170
183
|
'todo snapshot': 'todo snapshot --rebuild --plan <key>',
|
|
171
184
|
'todo gantt': 'todo gantt [--out <file>] [--scope live|all] | status [--out <file>] | serve --port <port> [--scope live|all]',
|
|
172
|
-
'todo phase': 'todo phase <status|review|accept|reject|reopen> --plan <key> [options]'
|
|
185
|
+
'todo phase': 'todo phase <status|review|accept|reject|reopen|close-unaudited> --plan <key> [options]'
|
|
186
|
+
+ ' | baseline --reason <text> [--except <plan_key>]...',
|
|
173
187
|
'todo phase status': 'todo phase status --plan <key>',
|
|
174
188
|
'todo phase review': 'todo phase review --plan <key> --phase <id> --reason <text>',
|
|
175
189
|
'todo phase accept': 'todo phase accept --plan <key> --phase <id> --input <file>',
|
|
176
190
|
'todo phase reject': 'todo phase reject --plan <key> --phase <id> --input <file>',
|
|
177
191
|
'todo phase reopen': 'todo phase reopen --plan <key> --phase <id> --reason <text> [--override-reason <text>]',
|
|
192
|
+
'todo phase close-unaudited': 'todo phase close-unaudited --plan <key> --phase <id> --reason <text>',
|
|
193
|
+
'todo phase baseline': 'todo phase baseline --reason <text> [--except <plan_key>]...',
|
|
178
194
|
'todo start': 'todo start --plan <key> --task <id> [--parallel-frontier|--override-reason <text>]',
|
|
179
195
|
'todo block': 'todo block --plan <key> --task <id> --reason <text>',
|
|
180
196
|
'todo unblock': 'todo unblock --plan <key> --task <id>',
|