erdos-problems 0.1.12 → 0.1.13
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 +16 -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 +143 -2
package/README.md
CHANGED
|
@@ -41,6 +41,8 @@ erdos bootstrap problem 857
|
|
|
41
41
|
erdos problem artifacts 857 --json
|
|
42
42
|
erdos sunflower status 857
|
|
43
43
|
erdos sunflower board 857
|
|
44
|
+
erdos sunflower routes 857
|
|
45
|
+
erdos sunflower tickets 857
|
|
44
46
|
erdos dossier show 857
|
|
45
47
|
```
|
|
46
48
|
|
|
@@ -153,6 +155,8 @@ erdos sunflower status 536
|
|
|
153
155
|
erdos sunflower board 536
|
|
154
156
|
erdos sunflower ready 857
|
|
155
157
|
erdos sunflower ladder 20
|
|
158
|
+
erdos sunflower routes 857
|
|
159
|
+
erdos sunflower tickets 857
|
|
156
160
|
erdos sunflower board 857
|
|
157
161
|
erdos sunflower status 857 --json
|
|
158
162
|
```
|
|
@@ -180,6 +184,16 @@ erdos sunflower status 857 --json
|
|
|
180
184
|
`erdos sunflower ladder` surfaces:
|
|
181
185
|
- the first-principles ladder for the active sunflower board
|
|
182
186
|
|
|
187
|
+
`erdos sunflower routes` surfaces:
|
|
188
|
+
- the strategic route table for the active sunflower board
|
|
189
|
+
- loose and strict progress for every publicized route
|
|
190
|
+
- which route is the currently active frontier
|
|
191
|
+
|
|
192
|
+
`erdos sunflower tickets` surfaces:
|
|
193
|
+
- the operational ticket table for the active sunflower board
|
|
194
|
+
- the active ticket, leaf theorem, and gate/atom counts
|
|
195
|
+
- which tickets are closed versus still honest live pressure
|
|
196
|
+
|
|
183
197
|
## ORP
|
|
184
198
|
|
|
185
199
|
`erdos-problems` now ships a bundled Open Research Protocol kit:
|
|
@@ -222,6 +236,8 @@ erdos sunflower status 857
|
|
|
222
236
|
erdos sunflower board 857
|
|
223
237
|
erdos sunflower ready 857
|
|
224
238
|
erdos sunflower ladder 857
|
|
239
|
+
erdos sunflower routes 857
|
|
240
|
+
erdos sunflower tickets 857
|
|
225
241
|
erdos sunflower status --json
|
|
226
242
|
erdos dossier show
|
|
227
243
|
erdos upstream show
|
package/docs/RESEARCH_LOOP.md
CHANGED
|
@@ -72,6 +72,8 @@ For sunflower compute lanes, ORP now sits above `breakthroughs`:
|
|
|
72
72
|
- `erdos sunflower board <id>` exposes the packaged atomic or bridge board for the active sunflower problem
|
|
73
73
|
- `erdos sunflower ready <id>` exposes the dependency-satisfied ready queue for the packaged board
|
|
74
74
|
- `erdos sunflower ladder <id>` exposes the first-principles ladder for the packaged board
|
|
75
|
+
- `erdos sunflower routes <id>` exposes the public route table for the packaged board
|
|
76
|
+
- `erdos sunflower tickets <id>` exposes the ticket table for the packaged board
|
|
75
77
|
- the CLI surfaces the selected rung, dispatch action, and the reason compute is admissible
|
|
76
78
|
- this is compute governance and traceability, not an automatic compute launch
|
|
77
79
|
|
package/package.json
CHANGED
package/src/cli/index.js
CHANGED
|
@@ -39,6 +39,8 @@ function printUsage() {
|
|
|
39
39
|
console.log(' erdos sunflower board [<id>] [--json]');
|
|
40
40
|
console.log(' erdos sunflower ready [<id>] [--json]');
|
|
41
41
|
console.log(' erdos sunflower ladder [<id>] [--json]');
|
|
42
|
+
console.log(' erdos sunflower routes [<id>] [--json]');
|
|
43
|
+
console.log(' erdos sunflower tickets [<id>] [--json]');
|
|
42
44
|
console.log(' erdos dossier show <id>');
|
|
43
45
|
console.log(' erdos upstream show');
|
|
44
46
|
console.log(' erdos upstream sync [--write-package-snapshot]');
|
|
@@ -37,6 +37,60 @@ function parseLadderArgs(args) {
|
|
|
37
37
|
return parseStatusArgs(args);
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
+
function parseRoutesArgs(args) {
|
|
41
|
+
return parseStatusArgs(args);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function parseTicketsArgs(args) {
|
|
45
|
+
return parseStatusArgs(args);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function getBoard(snapshot) {
|
|
49
|
+
return snapshot.atomicBoardSummary;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function getBoardActiveRoute(snapshot) {
|
|
53
|
+
return snapshot.atomicBoardSummary?.activeRoute ?? snapshot.activeRoute ?? null;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function routeProgressLabel(route, snapshot) {
|
|
57
|
+
const strictClosed = route.strictTotal > 0 && route.strictDone >= route.strictTotal;
|
|
58
|
+
const looseClosed = route.looseTotal > 0 && route.looseDone >= route.looseTotal;
|
|
59
|
+
const activeRoute = getBoardActiveRoute(snapshot);
|
|
60
|
+
|
|
61
|
+
if (route.route && route.route === activeRoute) {
|
|
62
|
+
return strictClosed ? 'active, strict-closed' : 'active';
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (strictClosed) {
|
|
66
|
+
return 'strict-closed';
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (looseClosed) {
|
|
70
|
+
return 'loose-closed';
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return 'open';
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function ticketProgressLabel(ticket, snapshot) {
|
|
77
|
+
const isActive = snapshot.activeTicket?.ticketId === ticket.ticketId;
|
|
78
|
+
|
|
79
|
+
if (isActive && ticket.leafStatus === 'done') {
|
|
80
|
+
return 'active, closed';
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (isActive) {
|
|
84
|
+
return 'active';
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (ticket.leafStatus === 'done') {
|
|
88
|
+
return 'closed';
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return 'open';
|
|
92
|
+
}
|
|
93
|
+
|
|
40
94
|
function printSunflowerStatus(snapshot, registryPaths) {
|
|
41
95
|
console.log(`${snapshot.displayName} sunflower harness`);
|
|
42
96
|
console.log(`Title: ${snapshot.title}`);
|
|
@@ -221,7 +275,7 @@ function printSunflowerReady(snapshot) {
|
|
|
221
275
|
}
|
|
222
276
|
|
|
223
277
|
function printSunflowerLadder(snapshot) {
|
|
224
|
-
const board = snapshot
|
|
278
|
+
const board = getBoard(snapshot);
|
|
225
279
|
if (!board) {
|
|
226
280
|
console.log(`${snapshot.displayName} has no packaged sunflower board yet.`);
|
|
227
281
|
return;
|
|
@@ -243,6 +297,77 @@ function printSunflowerLadder(snapshot) {
|
|
|
243
297
|
}
|
|
244
298
|
}
|
|
245
299
|
|
|
300
|
+
function printSunflowerRoutes(snapshot) {
|
|
301
|
+
const board = getBoard(snapshot);
|
|
302
|
+
if (!board) {
|
|
303
|
+
console.log(`${snapshot.displayName} has no packaged sunflower board yet.`);
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
console.log(`${snapshot.displayName} sunflower routes`);
|
|
308
|
+
console.log(`Board: ${board.boardTitle}`);
|
|
309
|
+
console.log(`Profile: ${board.boardProfile ?? '(none)'}`);
|
|
310
|
+
console.log(`Active route: ${getBoardActiveRoute(snapshot) ?? '(none)'}`);
|
|
311
|
+
console.log(`Route breakthrough: ${snapshot.routeBreakthrough ? 'yes' : 'no'}`);
|
|
312
|
+
console.log(`Frontier claim: ${board.frontierClaim ?? '(none)'}`);
|
|
313
|
+
console.log(`Ready atoms: ${snapshot.readyAtomCount}`);
|
|
314
|
+
console.log(`Mirage frontiers: ${snapshot.mirageFrontierCount}`);
|
|
315
|
+
if (snapshot.firstReadyAtom) {
|
|
316
|
+
console.log(`First ready atom: ${snapshot.firstReadyAtom.atomId} — ${snapshot.firstReadyAtom.title}`);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
if (board.routeStatus.length === 0) {
|
|
320
|
+
console.log('Route table:');
|
|
321
|
+
console.log(' (none)');
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
console.log('Route table:');
|
|
326
|
+
for (const route of board.routeStatus) {
|
|
327
|
+
console.log(
|
|
328
|
+
` - ${route.route} [${routeProgressLabel(route, snapshot)}]: `
|
|
329
|
+
+ `loose ${route.looseDone}/${route.looseTotal}, `
|
|
330
|
+
+ `strict ${route.strictDone}/${route.strictTotal}`,
|
|
331
|
+
);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
function printSunflowerTickets(snapshot) {
|
|
336
|
+
const board = getBoard(snapshot);
|
|
337
|
+
if (!board) {
|
|
338
|
+
console.log(`${snapshot.displayName} has no packaged sunflower board yet.`);
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
const closedTickets = board.tickets.filter((ticket) => ticketProgressLabel(ticket, snapshot) === 'closed').length;
|
|
343
|
+
|
|
344
|
+
console.log(`${snapshot.displayName} sunflower tickets`);
|
|
345
|
+
console.log(`Board: ${board.boardTitle}`);
|
|
346
|
+
console.log(`Active route: ${getBoardActiveRoute(snapshot) ?? '(none)'}`);
|
|
347
|
+
console.log(`Active ticket: ${snapshot.activeTicket?.ticketId ?? '(none)'}`);
|
|
348
|
+
console.log(`Closed tickets: ${closedTickets}/${board.tickets.length}`);
|
|
349
|
+
console.log(`Ready atoms: ${snapshot.readyAtomCount}`);
|
|
350
|
+
if (snapshot.firstReadyAtom) {
|
|
351
|
+
console.log(`First ready atom: ${snapshot.firstReadyAtom.atomId} — ${snapshot.firstReadyAtom.title}`);
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
if (board.tickets.length === 0) {
|
|
355
|
+
console.log('Ticket table:');
|
|
356
|
+
console.log(' (none)');
|
|
357
|
+
return;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
console.log('Ticket table:');
|
|
361
|
+
for (const ticket of board.tickets) {
|
|
362
|
+
console.log(
|
|
363
|
+
` - ${ticket.ticketId} ${ticket.ticketName} [${ticketProgressLabel(ticket, snapshot)}]: `
|
|
364
|
+
+ `${ticket.routeLeaf ?? '(none)'} `
|
|
365
|
+
+ `[leaf=${ticket.leafStatus ?? '(none)'}, gates=${ticket.gatesDone}/${ticket.gatesTotal}, `
|
|
366
|
+
+ `atoms=${ticket.atomsDone}/${ticket.atomsTotal}]`,
|
|
367
|
+
);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
246
371
|
export function runSunflowerCommand(args) {
|
|
247
372
|
const [subcommand, ...rest] = args;
|
|
248
373
|
|
|
@@ -252,10 +377,12 @@ export function runSunflowerCommand(args) {
|
|
|
252
377
|
console.log(' erdos sunflower board [<id>] [--json]');
|
|
253
378
|
console.log(' erdos sunflower ready [<id>] [--json]');
|
|
254
379
|
console.log(' erdos sunflower ladder [<id>] [--json]');
|
|
380
|
+
console.log(' erdos sunflower routes [<id>] [--json]');
|
|
381
|
+
console.log(' erdos sunflower tickets [<id>] [--json]');
|
|
255
382
|
return 0;
|
|
256
383
|
}
|
|
257
384
|
|
|
258
|
-
if (!['status', 'board', 'ready', 'ladder'].includes(subcommand)) {
|
|
385
|
+
if (!['status', 'board', 'ready', 'ladder', 'routes', 'tickets'].includes(subcommand)) {
|
|
259
386
|
console.error(`Unknown sunflower subcommand: ${subcommand}`);
|
|
260
387
|
return 1;
|
|
261
388
|
}
|
|
@@ -267,6 +394,10 @@ export function runSunflowerCommand(args) {
|
|
|
267
394
|
parsed = parseReadyArgs(rest);
|
|
268
395
|
} else if (subcommand === 'ladder') {
|
|
269
396
|
parsed = parseLadderArgs(rest);
|
|
397
|
+
} else if (subcommand === 'routes') {
|
|
398
|
+
parsed = parseRoutesArgs(rest);
|
|
399
|
+
} else if (subcommand === 'tickets') {
|
|
400
|
+
parsed = parseTicketsArgs(rest);
|
|
270
401
|
} else {
|
|
271
402
|
parsed = parseStatusArgs(rest);
|
|
272
403
|
}
|
|
@@ -315,6 +446,16 @@ export function runSunflowerCommand(args) {
|
|
|
315
446
|
return 0;
|
|
316
447
|
}
|
|
317
448
|
|
|
449
|
+
if (subcommand === 'routes') {
|
|
450
|
+
printSunflowerRoutes(snapshot);
|
|
451
|
+
return 0;
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
if (subcommand === 'tickets') {
|
|
455
|
+
printSunflowerTickets(snapshot);
|
|
456
|
+
return 0;
|
|
457
|
+
}
|
|
458
|
+
|
|
318
459
|
printSunflowerStatus(snapshot, registryPaths);
|
|
319
460
|
return 0;
|
|
320
461
|
}
|