erdos-problems 0.1.11 → 0.1.12
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.md +10 -0
- package/docs/RESEARCH_LOOP.md +2 -0
- package/package.json +1 -1
- package/src/cli/index.js +2 -0
- package/src/commands/sunflower.js +81 -2
- package/src/runtime/checkpoints.js +12 -0
- package/src/runtime/state.js +20 -4
package/README.md
CHANGED
|
@@ -151,6 +151,8 @@ erdos cluster show sunflower
|
|
|
151
151
|
erdos sunflower status 20
|
|
152
152
|
erdos sunflower status 536
|
|
153
153
|
erdos sunflower board 536
|
|
154
|
+
erdos sunflower ready 857
|
|
155
|
+
erdos sunflower ladder 20
|
|
154
156
|
erdos sunflower board 857
|
|
155
157
|
erdos sunflower status 857 --json
|
|
156
158
|
```
|
|
@@ -172,6 +174,12 @@ erdos sunflower status 857 --json
|
|
|
172
174
|
- first-principles ladder
|
|
173
175
|
- ready queue
|
|
174
176
|
|
|
177
|
+
`erdos sunflower ready` surfaces:
|
|
178
|
+
- the current dependency-satisfied ready queue for the active sunflower board
|
|
179
|
+
|
|
180
|
+
`erdos sunflower ladder` surfaces:
|
|
181
|
+
- the first-principles ladder for the active sunflower board
|
|
182
|
+
|
|
175
183
|
## ORP
|
|
176
184
|
|
|
177
185
|
`erdos-problems` now ships a bundled Open Research Protocol kit:
|
|
@@ -212,6 +220,8 @@ erdos orp show
|
|
|
212
220
|
erdos orp sync
|
|
213
221
|
erdos sunflower status 857
|
|
214
222
|
erdos sunflower board 857
|
|
223
|
+
erdos sunflower ready 857
|
|
224
|
+
erdos sunflower ladder 857
|
|
215
225
|
erdos sunflower status --json
|
|
216
226
|
erdos dossier show
|
|
217
227
|
erdos upstream show
|
package/docs/RESEARCH_LOOP.md
CHANGED
|
@@ -70,6 +70,8 @@ The ORP kit travels with the workspace too:
|
|
|
70
70
|
For sunflower compute lanes, ORP now sits above `breakthroughs`:
|
|
71
71
|
- `erdos sunflower status <id>` evaluates the packaged compute lane with `breakthroughs`
|
|
72
72
|
- `erdos sunflower board <id>` exposes the packaged atomic or bridge board for the active sunflower problem
|
|
73
|
+
- `erdos sunflower ready <id>` exposes the dependency-satisfied ready queue for the packaged board
|
|
74
|
+
- `erdos sunflower ladder <id>` exposes the first-principles ladder for the packaged board
|
|
73
75
|
- the CLI surfaces the selected rung, dispatch action, and the reason compute is admissible
|
|
74
76
|
- this is compute governance and traceability, not an automatic compute launch
|
|
75
77
|
|
package/package.json
CHANGED
package/src/cli/index.js
CHANGED
|
@@ -37,6 +37,8 @@ function printUsage() {
|
|
|
37
37
|
console.log(' erdos checkpoints sync [--json]');
|
|
38
38
|
console.log(' erdos sunflower status [<id>] [--json]');
|
|
39
39
|
console.log(' erdos sunflower board [<id>] [--json]');
|
|
40
|
+
console.log(' erdos sunflower ready [<id>] [--json]');
|
|
41
|
+
console.log(' erdos sunflower ladder [<id>] [--json]');
|
|
40
42
|
console.log(' erdos dossier show <id>');
|
|
41
43
|
console.log(' erdos upstream show');
|
|
42
44
|
console.log(' erdos upstream sync [--write-package-snapshot]');
|
|
@@ -29,6 +29,14 @@ function parseBoardArgs(args) {
|
|
|
29
29
|
return parseStatusArgs(args);
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
+
function parseReadyArgs(args) {
|
|
33
|
+
return parseStatusArgs(args);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function parseLadderArgs(args) {
|
|
37
|
+
return parseStatusArgs(args);
|
|
38
|
+
}
|
|
39
|
+
|
|
32
40
|
function printSunflowerStatus(snapshot, registryPaths) {
|
|
33
41
|
console.log(`${snapshot.displayName} sunflower harness`);
|
|
34
42
|
console.log(`Title: ${snapshot.title}`);
|
|
@@ -185,6 +193,56 @@ function printSunflowerBoard(snapshot) {
|
|
|
185
193
|
}
|
|
186
194
|
}
|
|
187
195
|
|
|
196
|
+
function printSunflowerReady(snapshot) {
|
|
197
|
+
const board = snapshot.atomicBoardSummary;
|
|
198
|
+
if (!board) {
|
|
199
|
+
console.log(`${snapshot.displayName} has no packaged sunflower board yet.`);
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
console.log(`${snapshot.displayName} sunflower ready queue`);
|
|
204
|
+
console.log(`Board: ${board.boardTitle}`);
|
|
205
|
+
console.log(`Active route: ${board.activeRoute ?? '(none)'}`);
|
|
206
|
+
console.log(`Ready atoms: ${snapshot.readyAtomCount}`);
|
|
207
|
+
console.log(`Mirage frontiers: ${snapshot.mirageFrontierCount}`);
|
|
208
|
+
|
|
209
|
+
if (board.readyQueue.length === 0) {
|
|
210
|
+
console.log('Ready queue:');
|
|
211
|
+
console.log(' (none)');
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
console.log('Ready queue:');
|
|
216
|
+
for (const atom of board.readyQueue) {
|
|
217
|
+
console.log(
|
|
218
|
+
` - ${atom.atomId} (${atom.ticketId} / ${atom.gateId} / ${atom.tier ?? 'tier-unknown'} / ${atom.kind ?? 'kind-unknown'}): ${atom.title}`,
|
|
219
|
+
);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function printSunflowerLadder(snapshot) {
|
|
224
|
+
const board = snapshot.atomicBoardSummary;
|
|
225
|
+
if (!board) {
|
|
226
|
+
console.log(`${snapshot.displayName} has no packaged sunflower board yet.`);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
console.log(`${snapshot.displayName} sunflower ladder`);
|
|
231
|
+
console.log(`Board: ${board.boardTitle}`);
|
|
232
|
+
console.log(`Active route: ${board.activeRoute ?? '(none)'}`);
|
|
233
|
+
|
|
234
|
+
if (board.ladder.length === 0) {
|
|
235
|
+
console.log('First-principles ladder:');
|
|
236
|
+
console.log(' (none)');
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
console.log('First-principles ladder:');
|
|
241
|
+
for (const rung of board.ladder) {
|
|
242
|
+
console.log(` - ${rung.tier}: ${rung.done}/${rung.total}`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
188
246
|
export function runSunflowerCommand(args) {
|
|
189
247
|
const [subcommand, ...rest] = args;
|
|
190
248
|
|
|
@@ -192,15 +250,26 @@ export function runSunflowerCommand(args) {
|
|
|
192
250
|
console.log('Usage:');
|
|
193
251
|
console.log(' erdos sunflower status [<id>] [--json]');
|
|
194
252
|
console.log(' erdos sunflower board [<id>] [--json]');
|
|
253
|
+
console.log(' erdos sunflower ready [<id>] [--json]');
|
|
254
|
+
console.log(' erdos sunflower ladder [<id>] [--json]');
|
|
195
255
|
return 0;
|
|
196
256
|
}
|
|
197
257
|
|
|
198
|
-
if (
|
|
258
|
+
if (!['status', 'board', 'ready', 'ladder'].includes(subcommand)) {
|
|
199
259
|
console.error(`Unknown sunflower subcommand: ${subcommand}`);
|
|
200
260
|
return 1;
|
|
201
261
|
}
|
|
202
262
|
|
|
203
|
-
|
|
263
|
+
let parsed;
|
|
264
|
+
if (subcommand === 'board') {
|
|
265
|
+
parsed = parseBoardArgs(rest);
|
|
266
|
+
} else if (subcommand === 'ready') {
|
|
267
|
+
parsed = parseReadyArgs(rest);
|
|
268
|
+
} else if (subcommand === 'ladder') {
|
|
269
|
+
parsed = parseLadderArgs(rest);
|
|
270
|
+
} else {
|
|
271
|
+
parsed = parseStatusArgs(rest);
|
|
272
|
+
}
|
|
204
273
|
if (parsed.error) {
|
|
205
274
|
console.error(parsed.error);
|
|
206
275
|
return 1;
|
|
@@ -236,6 +305,16 @@ export function runSunflowerCommand(args) {
|
|
|
236
305
|
return 0;
|
|
237
306
|
}
|
|
238
307
|
|
|
308
|
+
if (subcommand === 'ready') {
|
|
309
|
+
printSunflowerReady(snapshot);
|
|
310
|
+
return 0;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
if (subcommand === 'ladder') {
|
|
314
|
+
printSunflowerLadder(snapshot);
|
|
315
|
+
return 0;
|
|
316
|
+
}
|
|
317
|
+
|
|
239
318
|
printSunflowerStatus(snapshot, registryPaths);
|
|
240
319
|
return 0;
|
|
241
320
|
}
|
|
@@ -83,6 +83,15 @@ function renderRouteCheckpoint(problem, state) {
|
|
|
83
83
|
const frontier = sunflower?.frontierDetail ?? state.currentFrontier.detail;
|
|
84
84
|
const routeStory = sunflower?.routeStory ?? state.routeStory ?? '(none yet)';
|
|
85
85
|
const checkpointFocus = sunflower?.checkpointFocus ?? state.checkpointFocus ?? '(none yet)';
|
|
86
|
+
const activeTicketLine = sunflower?.activeTicket
|
|
87
|
+
? `- Active Ticket: ${sunflower.activeTicket.ticketId} ${sunflower.activeTicket.ticketName} [gates=${sunflower.activeTicket.gatesDone}/${sunflower.activeTicket.gatesTotal}, atoms=${sunflower.activeTicket.atomsDone}/${sunflower.activeTicket.atomsTotal}]`
|
|
88
|
+
: '- Active Ticket: *(none packaged)*';
|
|
89
|
+
const readyAtomLine = sunflower?.firstReadyAtom
|
|
90
|
+
? `- First Ready Atom: ${sunflower.firstReadyAtom.atomId} — ${sunflower.firstReadyAtom.title}`
|
|
91
|
+
: '- First Ready Atom: *(none)*';
|
|
92
|
+
const mirageLine = sunflower
|
|
93
|
+
? `- Mirage Frontiers: ${sunflower.mirageFrontierCount}`
|
|
94
|
+
: null;
|
|
86
95
|
|
|
87
96
|
return `# Problem ${problem.problemId} Active Route Checkpoint
|
|
88
97
|
|
|
@@ -96,6 +105,9 @@ function renderRouteCheckpoint(problem, state) {
|
|
|
96
105
|
## Current Frontier
|
|
97
106
|
|
|
98
107
|
- ${frontier}
|
|
108
|
+
${activeTicketLine}
|
|
109
|
+
${readyAtomLine}
|
|
110
|
+
${mirageLine ? `\n${mirageLine}` : ''}
|
|
99
111
|
|
|
100
112
|
## Route Story
|
|
101
113
|
|
package/src/runtime/state.js
CHANGED
|
@@ -158,6 +158,22 @@ function deriveGenericProblemSummary(problem) {
|
|
|
158
158
|
function deriveProblemSummary(problem) {
|
|
159
159
|
if (problem.cluster === 'sunflower') {
|
|
160
160
|
const sunflower = buildSunflowerStatusSnapshot(problem);
|
|
161
|
+
const frontierKind = sunflower.firstReadyAtom
|
|
162
|
+
? 'ready_atom'
|
|
163
|
+
: sunflower.atomicBoardPresent
|
|
164
|
+
? 'atomic_board'
|
|
165
|
+
: sunflower.activePacket
|
|
166
|
+
? 'compute_lane'
|
|
167
|
+
: (sunflower.frontierLabel ? 'route_frontier' : 'pack_context');
|
|
168
|
+
const frontierDetail = sunflower.firstReadyAtom
|
|
169
|
+
? `${sunflower.firstReadyAtom.atomId} — ${sunflower.firstReadyAtom.title}`
|
|
170
|
+
: sunflower.frontierDetail || sunflower.computeSummary || sunflower.bootstrapFocus || problem.shortStatement;
|
|
171
|
+
const routeStory = sunflower.activeTicket
|
|
172
|
+
? `Work ${sunflower.activeTicket.ticketId} (${sunflower.activeTicket.ticketName}) without blurring ticket-local pressure into solved-problem claims.`
|
|
173
|
+
: (sunflower.routeStory || sunflower.bootstrapFocus || null);
|
|
174
|
+
const checkpointFocus = sunflower.activeTicket
|
|
175
|
+
? `Keep the board packet honest around ${sunflower.activeTicket.ticketId} while preserving the open-problem / active-route / route-breakthrough ladder.`
|
|
176
|
+
: (sunflower.checkpointFocus || null);
|
|
161
177
|
return {
|
|
162
178
|
familyRole: sunflower.familyRole,
|
|
163
179
|
harnessProfile: sunflower.harnessProfile,
|
|
@@ -166,11 +182,11 @@ function deriveProblemSummary(problem) {
|
|
|
166
182
|
problemSolved: sunflower.problemSolved,
|
|
167
183
|
openProblem: sunflower.openProblem,
|
|
168
184
|
currentFrontier: {
|
|
169
|
-
kind:
|
|
170
|
-
detail:
|
|
185
|
+
kind: frontierKind,
|
|
186
|
+
detail: frontierDetail,
|
|
171
187
|
},
|
|
172
|
-
routeStory
|
|
173
|
-
checkpointFocus
|
|
188
|
+
routeStory,
|
|
189
|
+
checkpointFocus,
|
|
174
190
|
nextHonestMove: sunflower.nextHonestMove || sunflower.computeNextAction || 'Refresh the active route and package a new honest checkpoint.',
|
|
175
191
|
questionLedger: sunflower.questionLedger,
|
|
176
192
|
};
|