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 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
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "erdos-problems",
3
- "version": "0.1.12",
3
+ "version": "0.1.13",
4
4
  "description": "CLI atlas and staged research harness for Paul Erdos problems.",
5
5
  "type": "module",
6
6
  "bin": {
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.atomicBoardSummary;
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
  }