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 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
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "erdos-problems",
3
- "version": "0.1.11",
3
+ "version": "0.1.12",
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
@@ -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 (subcommand !== 'status' && subcommand !== 'board') {
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
- const parsed = subcommand === 'board' ? parseBoardArgs(rest) : parseStatusArgs(rest);
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
 
@@ -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: sunflower.activePacket ? 'compute_lane' : (sunflower.frontierLabel ? 'route_frontier' : 'pack_context'),
170
- detail: sunflower.frontierDetail || sunflower.computeSummary || sunflower.bootstrapFocus || problem.shortStatement,
185
+ kind: frontierKind,
186
+ detail: frontierDetail,
171
187
  },
172
- routeStory: sunflower.routeStory || sunflower.bootstrapFocus || null,
173
- checkpointFocus: sunflower.checkpointFocus || null,
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
  };