@luckydraw/cumulus 1.0.40 → 1.0.41
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/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v1.0.41
|
|
4
|
+
|
|
5
|
+
Patch release. Refresh no longer rewrites the finished half of your task file.
|
|
6
|
+
|
|
7
|
+
- **`## Done` is now withheld from the worker entirely.** The first live press of Refresh made twelve edits and every one of them appended "the reload has happened" to a note on a _finished_ task — because the one fact Refresh is handed that it cannot read from the file, the version the gateway is running, is only ever mentioned in notes that live in Done. That section is the record; the format's own rule is that it is never sent to a model. It is now split off before the prompt is built and re-attached unchanged afterwards, so the model cannot edit what it never sees. The prompt is smaller for it.
|
|
8
|
+
- **An empty queue is refused before anything happens.** No snapshot commit, no model call — just "nothing to refresh". Given a file with nothing left to do, a model will find something to do anyway. The exception is a file that does not parse: a queue that reads as empty because the file is broken is exactly the case Refresh exists to fix, so that still runs.
|
|
9
|
+
- **A task the worker judges finished stays in the queue with a ✓.** Moving a task out of the queue is Close and Archive in the drawer, which is your decision, not the worker's.
|
|
10
|
+
|
|
3
11
|
## v1.0.40
|
|
4
12
|
|
|
5
13
|
Patch release. A **Refresh** button in the `/tasks` drawer brings an old task file up to date and re-checks what every task's state actually is — run by a background worker you never see.
|
|
@@ -17,6 +17,11 @@
|
|
|
17
17
|
* is checked before it is written, and a run that loses a task id, fails to
|
|
18
18
|
* parse, or comes back without the marker is refused WHOLE. The git snapshot is
|
|
19
19
|
* the belt; these checks are the braces.
|
|
20
|
+
*
|
|
21
|
+
* Task 180, after the first live press: `## Done` is now split off before the
|
|
22
|
+
* prompt is built and re-attached after, and an empty queue is refused outright.
|
|
23
|
+
* See {@link splitOffDone} — the model was rewriting the one section the format
|
|
24
|
+
* says is never sent to a model, because it was the only thing left to touch.
|
|
20
25
|
*/
|
|
21
26
|
import { type TasksPayload } from './tasks.js';
|
|
22
27
|
import { type RunWorkerOptions } from './worker.js';
|
|
@@ -39,6 +44,34 @@ export declare class TasksRefreshError extends Error {
|
|
|
39
44
|
* would work only on un-migrated ones. Found by test, not by reading.
|
|
40
45
|
*/
|
|
41
46
|
export declare function taskIdsIn(content: string): string[];
|
|
47
|
+
export interface DoneSplit {
|
|
48
|
+
/** Everything above `## Done`. The only part a model ever sees of a migrated file. */
|
|
49
|
+
head: string;
|
|
50
|
+
/** The `## Done` heading and everything under it, or null if the file has no such section. */
|
|
51
|
+
done: string | null;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Split a tasks file at its `## Done` heading.
|
|
55
|
+
*
|
|
56
|
+
* Task 180: `## Done` is the record of work that has left the queue, and the
|
|
57
|
+
* format's own rule is that it is never sent to a model. The first live Refresh
|
|
58
|
+
* proved why that has to be enforced with scissors rather than with a sentence in
|
|
59
|
+
* the prompt: handed the whole file and an empty queue, the model spent its one
|
|
60
|
+
* call appending "the reload has happened" to twelve finished tasks.
|
|
61
|
+
*
|
|
62
|
+
* The LAST heading wins, because the manual carried inside every migrated file
|
|
63
|
+
* quotes `## Done` while describing the grammar.
|
|
64
|
+
*/
|
|
65
|
+
export declare function splitOffDone(content: string): DoneSplit;
|
|
66
|
+
/**
|
|
67
|
+
* Re-attach the withheld record to the model's answer.
|
|
68
|
+
*
|
|
69
|
+
* The original section goes back byte-for-byte. If the model emitted a `## Done`
|
|
70
|
+
* of its own — it is told not to — those rows are spliced in ABOVE the preserved
|
|
71
|
+
* ones rather than discarded: dropping them would lose their ids, and the drop
|
|
72
|
+
* check would then refuse an answer whose only sin was disobedience.
|
|
73
|
+
*/
|
|
74
|
+
export declare function stitchDone(answer: string, originalDone: string): string;
|
|
42
75
|
/** Strip a ```-fenced wrapper, which a chat-tuned model adds however firmly it is told not to. */
|
|
43
76
|
export declare function unfence(answer: string): string;
|
|
44
77
|
/**
|
|
@@ -56,16 +89,9 @@ export interface RefreshPromptInput {
|
|
|
56
89
|
migrated: boolean;
|
|
57
90
|
docs: string[];
|
|
58
91
|
version: string;
|
|
92
|
+
/** True when `## Done` was split off and will be re-attached unchanged (task 180). */
|
|
93
|
+
doneWithheld: boolean;
|
|
59
94
|
}
|
|
60
|
-
/**
|
|
61
|
-
* The whole prompt, as one pure function so the instructions are testable
|
|
62
|
-
* without a model.
|
|
63
|
-
*
|
|
64
|
-
* The three facts at the end are the ones the model cannot get from the file and
|
|
65
|
-
* would otherwise invent: which task docs exist, and what the gateway is actually
|
|
66
|
-
* running. That last one is the thing Karl complained about — rows still saying
|
|
67
|
-
* "needs reload" long after the reload happened.
|
|
68
|
-
*/
|
|
69
95
|
export declare function buildRefreshPrompt(input: RefreshPromptInput): string;
|
|
70
96
|
export interface RefreshResult {
|
|
71
97
|
payload: TasksPayload;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks-refresh.d.ts","sourceRoot":"","sources":["../../src/gateway/tasks-refresh.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"tasks-refresh.d.ts","sourceRoot":"","sources":["../../src/gateway/tasks-refresh.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AASH,OAAO,EAAmC,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/D,yDAAyD;AACzD,qBAAa,iBAAkB,SAAQ,KAAK;CAAG;AAO/C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAWnD;AAKD,MAAM,WAAW,SAAS;IACxB,sFAAsF;IACtF,IAAI,EAAE,MAAM,CAAC;IACb,8FAA8F;IAC9F,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAMvD;AAOD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,CAOvE;AAED,kGAAkG;AAClG,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAO9C;AAMD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CA6B/D;AAcD,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,sFAAsF;IACtF,YAAY,EAAE,OAAO,CAAC;CACvB;AA4CD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAyCpE;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,YAAY,CAAC;IACtB,uFAAuF;IACvF,SAAS,EAAE,OAAO,CAAC;IACnB,kFAAkF;IAClF,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,cAAe,SAAQ,gBAAgB;IACtD,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAChD;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,IAAI,GAAE,cAAmB,GACxB,OAAO,CAAC,aAAa,CAAC,CAiDxB"}
|
|
@@ -17,6 +17,11 @@
|
|
|
17
17
|
* is checked before it is written, and a run that loses a task id, fails to
|
|
18
18
|
* parse, or comes back without the marker is refused WHOLE. The git snapshot is
|
|
19
19
|
* the belt; these checks are the braces.
|
|
20
|
+
*
|
|
21
|
+
* Task 180, after the first live press: `## Done` is now split off before the
|
|
22
|
+
* prompt is built and re-attached after, and an empty queue is refused outright.
|
|
23
|
+
* See {@link splitOffDone} — the model was rewriting the one section the format
|
|
24
|
+
* says is never sent to a model, because it was the only thing left to touch.
|
|
20
25
|
*/
|
|
21
26
|
import { execFileSync } from 'child_process';
|
|
22
27
|
import * as fs from 'fs';
|
|
@@ -61,6 +66,50 @@ export function taskIdsIn(content) {
|
|
|
61
66
|
}
|
|
62
67
|
return ids;
|
|
63
68
|
}
|
|
69
|
+
/** The `## Done` heading, alone on its line — the same shape the parser accepts. */
|
|
70
|
+
const DONE_HEADING_RE = /^## +Done *$/;
|
|
71
|
+
/**
|
|
72
|
+
* Split a tasks file at its `## Done` heading.
|
|
73
|
+
*
|
|
74
|
+
* Task 180: `## Done` is the record of work that has left the queue, and the
|
|
75
|
+
* format's own rule is that it is never sent to a model. The first live Refresh
|
|
76
|
+
* proved why that has to be enforced with scissors rather than with a sentence in
|
|
77
|
+
* the prompt: handed the whole file and an empty queue, the model spent its one
|
|
78
|
+
* call appending "the reload has happened" to twelve finished tasks.
|
|
79
|
+
*
|
|
80
|
+
* The LAST heading wins, because the manual carried inside every migrated file
|
|
81
|
+
* quotes `## Done` while describing the grammar.
|
|
82
|
+
*/
|
|
83
|
+
export function splitOffDone(content) {
|
|
84
|
+
const lines = content.split('\n');
|
|
85
|
+
let at = -1;
|
|
86
|
+
for (let i = 0; i < lines.length; i++)
|
|
87
|
+
if (DONE_HEADING_RE.test(lines[i]))
|
|
88
|
+
at = i;
|
|
89
|
+
if (at < 0)
|
|
90
|
+
return { head: content, done: null };
|
|
91
|
+
return { head: lines.slice(0, at).join('\n'), done: lines.slice(at).join('\n') };
|
|
92
|
+
}
|
|
93
|
+
/** The rows under a `## Done` heading, with the heading and its blank padding gone. */
|
|
94
|
+
function doneBody(section) {
|
|
95
|
+
return section.split('\n').slice(1).join('\n').trim();
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Re-attach the withheld record to the model's answer.
|
|
99
|
+
*
|
|
100
|
+
* The original section goes back byte-for-byte. If the model emitted a `## Done`
|
|
101
|
+
* of its own — it is told not to — those rows are spliced in ABOVE the preserved
|
|
102
|
+
* ones rather than discarded: dropping them would lose their ids, and the drop
|
|
103
|
+
* check would then refuse an answer whose only sin was disobedience.
|
|
104
|
+
*/
|
|
105
|
+
export function stitchDone(answer, originalDone) {
|
|
106
|
+
const split = splitOffDone(answer);
|
|
107
|
+
const moved = split.done ? doneBody(split.done) : '';
|
|
108
|
+
const kept = doneBody(originalDone);
|
|
109
|
+
const heading = originalDone.split('\n', 1)[0];
|
|
110
|
+
const body = [moved, kept].filter(Boolean).join('\n');
|
|
111
|
+
return `${split.head.trimEnd()}\n\n${heading}\n\n${body}\n`;
|
|
112
|
+
}
|
|
64
113
|
/** Strip a ```-fenced wrapper, which a chat-tuned model adds however firmly it is told not to. */
|
|
65
114
|
export function unfence(answer) {
|
|
66
115
|
const trimmed = answer.trim();
|
|
@@ -131,10 +180,43 @@ function taskDocListing(cwd) {
|
|
|
131
180
|
* running. That last one is the thing Karl complained about — rows still saying
|
|
132
181
|
* "needs reload" long after the reload happened.
|
|
133
182
|
*/
|
|
183
|
+
/**
|
|
184
|
+
* Rules 1 and 6 — the two that change when the record is withheld: what to
|
|
185
|
+
* output, and where a finished task goes.
|
|
186
|
+
*/
|
|
187
|
+
function promptShape(doneWithheld) {
|
|
188
|
+
if (doneWithheld) {
|
|
189
|
+
return {
|
|
190
|
+
rule1: [
|
|
191
|
+
'1. Output the file down to the END OF THE QUEUE and stop there: a `# <name> Tasks`',
|
|
192
|
+
' title, the marker line `<!-- cumulus:tasks v1 -->` alone on its own line within',
|
|
193
|
+
' the first ten lines, then `## Format` (verbatim as given above) and `## Queue`.',
|
|
194
|
+
' Do NOT write a `## Done` section. The file has one; it is finished work, it was',
|
|
195
|
+
' deliberately withheld from you, and it is re-attached unchanged after you answer.',
|
|
196
|
+
].join('\n'),
|
|
197
|
+
rule6: [
|
|
198
|
+
'6. When a task is finished, mark its row `[✅]` and LEAVE IT IN THE QUEUE. Moving a',
|
|
199
|
+
" task out of the queue is the user's decision, taken in the drawer, not yours.",
|
|
200
|
+
].join('\n'),
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
rule1: [
|
|
205
|
+
'1. Output the whole file: a `# <name> Tasks` title, the marker line',
|
|
206
|
+
' `<!-- cumulus:tasks v1 -->` alone on its own line within the first ten lines,',
|
|
207
|
+
' then `## Format` (verbatim as given above), `## Queue`, and `## Done`.',
|
|
208
|
+
].join('\n'),
|
|
209
|
+
rule6: [
|
|
210
|
+
'6. Finished work belongs in `## Done` with a `done <YYYY-MM-DD>` field. Work still',
|
|
211
|
+
' to do belongs in `## Queue`, in build order, most important first.',
|
|
212
|
+
].join('\n'),
|
|
213
|
+
};
|
|
214
|
+
}
|
|
134
215
|
export function buildRefreshPrompt(input) {
|
|
135
216
|
const docs = input.docs.length
|
|
136
217
|
? input.docs.map(d => `- docs/tasks/${d}`).join('\n')
|
|
137
218
|
: '(no docs/tasks directory)';
|
|
219
|
+
const shape = promptShape(input.doneWithheld);
|
|
138
220
|
return [
|
|
139
221
|
'You are rewriting a project task file into the exact format specified below.',
|
|
140
222
|
'Return ONLY the complete new file. No preamble, no explanation, no code fence.',
|
|
@@ -143,30 +225,30 @@ export function buildRefreshPrompt(input) {
|
|
|
143
225
|
TASKS_FORMAT_SECTION,
|
|
144
226
|
'',
|
|
145
227
|
'=== RULES ===',
|
|
146
|
-
|
|
147
|
-
'
|
|
148
|
-
' then `## Format` (verbatim as given above), `## Queue`, and `## Done`.',
|
|
149
|
-
'2. EVERY task in the current file must appear in your output, with the SAME id.',
|
|
228
|
+
shape.rule1,
|
|
229
|
+
'2. EVERY task shown to you must appear in your output, with the SAME id.',
|
|
150
230
|
' Losing an id fails the whole refresh and nothing is written. If a task has no',
|
|
151
231
|
' id, mint one that does not collide with any other id in the file.',
|
|
152
232
|
'3. Prose belongs in `note` lines and nowhere else. A task row is one line.',
|
|
153
233
|
"4. Re-check each task's status against the evidence below. If you CANNOT ground a",
|
|
154
234
|
' status change in that evidence, leave the status exactly as it is.',
|
|
155
235
|
'5. When you do change a status, add a `note` saying why, so the change is auditable.',
|
|
156
|
-
|
|
157
|
-
' to do belongs in `## Queue`, in build order, most important first.',
|
|
236
|
+
shape.rule6,
|
|
158
237
|
'',
|
|
159
238
|
'=== EVIDENCE YOU CANNOT GET FROM THE FILE ===',
|
|
160
|
-
`The gateway is currently running version ${input.version}.
|
|
161
|
-
'change is "published, needs reload" for a version at or below this one is
|
|
162
|
-
'the reload has happened
|
|
239
|
+
`The gateway is currently running version ${input.version}. A QUEUED task whose note`,
|
|
240
|
+
'claims its change is "published, needs reload" for a version at or below this one is',
|
|
241
|
+
'stale — the reload has happened, and that is grounds to re-check its status. Do not',
|
|
242
|
+
'rewrite a note merely to say so: an edit that changes no status is not worth making.',
|
|
163
243
|
'',
|
|
164
244
|
'Task documents that exist on disk (use these for `doc` fields; do not invent paths):',
|
|
165
245
|
docs,
|
|
166
246
|
'',
|
|
167
|
-
input.
|
|
168
|
-
? '=== THE CURRENT FILE
|
|
169
|
-
:
|
|
247
|
+
input.doneWithheld
|
|
248
|
+
? '=== THE CURRENT FILE, DOWN TO THE END OF THE QUEUE (its `## Done` is withheld) ==='
|
|
249
|
+
: input.migrated
|
|
250
|
+
? '=== THE CURRENT FILE (already in this format — re-check it) ==='
|
|
251
|
+
: '=== THE CURRENT FILE (free-form — convert it) ===',
|
|
170
252
|
input.content,
|
|
171
253
|
].join('\n');
|
|
172
254
|
}
|
|
@@ -182,19 +264,48 @@ export async function refreshTasksFile(threadName, opts = {}) {
|
|
|
182
264
|
if (!target) {
|
|
183
265
|
throw new TasksRefreshError('This thread has no Tasks.md in its always-include list, so there is nothing to refresh.');
|
|
184
266
|
}
|
|
267
|
+
// Task 180: nothing in the queue, nothing to refresh. Refused BEFORE the
|
|
268
|
+
// snapshot and the model call, because the alternative is what happened on the
|
|
269
|
+
// first live press — a model with no legal work finding some anyway. A file
|
|
270
|
+
// that fails to parse is exempt: a queue that reads as empty because the file
|
|
271
|
+
// is broken is precisely the case Refresh exists to fix.
|
|
272
|
+
if (target.migrated) {
|
|
273
|
+
const current = parseTasksFile(target.content);
|
|
274
|
+
if (current.queue.length === 0 && current.errors.length === 0) {
|
|
275
|
+
throw new TasksRefreshError('Nothing to refresh — the queue is empty. Finished work in `## Done` is the record ' +
|
|
276
|
+
'and is left alone.');
|
|
277
|
+
}
|
|
278
|
+
}
|
|
185
279
|
const committed = snapshotBeforeRefresh(target.filePath);
|
|
280
|
+
// The record is split off rather than trusted to the prompt — see splitOffDone.
|
|
281
|
+
const split = target.migrated
|
|
282
|
+
? splitOffDone(target.content)
|
|
283
|
+
: { head: target.content, done: null };
|
|
186
284
|
const prompt = buildRefreshPrompt({
|
|
187
|
-
content: target.content,
|
|
285
|
+
content: split.done ? split.head : target.content,
|
|
188
286
|
migrated: target.migrated,
|
|
189
287
|
docs: taskDocListing(target.cwd),
|
|
190
288
|
version: getCurrentVersion(),
|
|
289
|
+
doneWithheld: split.done !== null,
|
|
191
290
|
});
|
|
192
291
|
const raw = opts.runModel
|
|
193
292
|
? await opts.runModel(prompt)
|
|
194
293
|
: await runWorker(threadName, 'tasks-refresh', prompt, opts);
|
|
195
|
-
const
|
|
196
|
-
|
|
197
|
-
|
|
294
|
+
const answer = unfence(raw);
|
|
295
|
+
const next = split.done ? stitchDone(answer, split.done) : answer;
|
|
296
|
+
assertUsable(answer, next, target.content);
|
|
297
|
+
fs.writeFileSync(target.filePath, next.endsWith('\n') ? next : `${next}\n`, 'utf-8');
|
|
298
|
+
return { payload: await readTasks(threadName), committed, droppedIds: [] };
|
|
299
|
+
}
|
|
300
|
+
/**
|
|
301
|
+
* The guard rails. Each one refuses the WHOLE answer; none patches it up, and
|
|
302
|
+
* every one throws before the single `writeFileSync` above runs, so a refusal
|
|
303
|
+
* leaves the file byte-identical to what the snapshot just committed.
|
|
304
|
+
*/
|
|
305
|
+
function assertUsable(answer, next, original) {
|
|
306
|
+
// Emptiness is judged on the ANSWER, not the stitched file: re-attaching the
|
|
307
|
+
// record to nothing would produce a plausible-looking file with no queue.
|
|
308
|
+
if (!answer) {
|
|
198
309
|
throw new TasksRefreshError('The worker returned an empty file. Nothing was written.');
|
|
199
310
|
}
|
|
200
311
|
if (!hasTasksMarker(next)) {
|
|
@@ -209,7 +320,7 @@ export async function refreshTasksFile(threadName, opts = {}) {
|
|
|
209
320
|
// The one check that catches the failure this whole task is built around: a
|
|
210
321
|
// wholesale rewrite that silently loses a row. Compared against the RAW ids of
|
|
211
322
|
// the file that went in, so it holds for un-migrated files too.
|
|
212
|
-
const before = new Set(taskIdsIn(
|
|
323
|
+
const before = new Set(taskIdsIn(original));
|
|
213
324
|
const after = new Set(parsed.queue.concat(parsed.done).map(row => row.id));
|
|
214
325
|
const droppedIds = [...before].filter(id => !after.has(id));
|
|
215
326
|
if (droppedIds.length > 0) {
|
|
@@ -218,7 +329,5 @@ export async function refreshTasksFile(threadName, opts = {}) {
|
|
|
218
329
|
if (after.size === 0 && before.size > 0) {
|
|
219
330
|
throw new TasksRefreshError('The worker returned a file with no tasks in it. Nothing was written.');
|
|
220
331
|
}
|
|
221
|
-
fs.writeFileSync(target.filePath, next.endsWith('\n') ? next : `${next}\n`, 'utf-8');
|
|
222
|
-
return { payload: await readTasks(threadName), committed, droppedIds: [] };
|
|
223
332
|
}
|
|
224
333
|
//# sourceMappingURL=tasks-refresh.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks-refresh.js","sourceRoot":"","sources":["../../src/gateway/tasks-refresh.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"tasks-refresh.js","sourceRoot":"","sources":["../../src/gateway/tasks-refresh.ts"],"names":[],"mappings":"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"}
|