erdos-problems 0.1.5 → 0.1.6

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
@@ -184,3 +184,34 @@ For sunflower problems, the CLI also surfaces pack-specific artifacts:
184
184
  - `docs/ERDOS_PROBLEMS_REPO_SPEC.md`
185
185
  - `docs/ERDOS_PROBLEMS_PROBLEM_SCHEMA.md`
186
186
  - `docs/ERDOS_SUNFLOWER_CLUSTER_SEED_PLAN.md`
187
+
188
+ ## Research loop
189
+
190
+ `erdos-problems` now carries the staged loop we defined in the sunflower lab and the `.gpd`-style harness work:
191
+
192
+ ```bash
193
+ erdos problem use 857
194
+ erdos state sync
195
+ erdos preflight
196
+ erdos continuation use route
197
+ erdos checkpoints sync
198
+ erdos workspace show
199
+ ```
200
+
201
+ This runtime writes:
202
+ - `.erdos/config.json`
203
+ - `.erdos/state.json`
204
+ - `.erdos/STATE.md`
205
+ - `.erdos/QUESTION-LEDGER.md`
206
+ - `.erdos/checkpoints/CHECKPOINTS.md`
207
+ - `.erdos/checkpoints/CHECKPOINTS.json`
208
+ - `.erdos/registry/preflight/`
209
+
210
+ The public package uses the same status ladder we settled on in the lab:
211
+ - open problem
212
+ - active route
213
+ - route breakthrough
214
+ - problem solved
215
+
216
+ See also:
217
+ - `docs/RESEARCH_LOOP.md`
@@ -0,0 +1,47 @@
1
+ # Research Loop
2
+
3
+ `erdos-problems` now carries the staged research loop that was proven out in the sunflower lab and refined by the `.gpd` flow in `longevity-research`.
4
+
5
+ ## Runtime layout
6
+
7
+ Workspace runtime files live under `.erdos/`:
8
+ - `config.json`
9
+ - `state.json`
10
+ - `STATE.md`
11
+ - `QUESTION-LEDGER.md`
12
+ - `checkpoints/CHECKPOINTS.md`
13
+ - `checkpoints/CHECKPOINTS.json`
14
+ - `registry/preflight/`
15
+ - `registry/compute/`
16
+
17
+ ## Core loop
18
+
19
+ 1. Select or bootstrap a problem.
20
+ 2. Sync state.
21
+ 3. Run preflight.
22
+ 4. Set continuation mode.
23
+ 5. Sync checkpoints.
24
+ 6. Pull or scaffold artifacts.
25
+ 7. Work the active route.
26
+ 8. Sync checkpoints again at honest boundaries.
27
+
28
+ ## Commands
29
+
30
+ ```bash
31
+ erdos problem use 857
32
+ erdos state sync
33
+ erdos preflight
34
+ erdos continuation use route
35
+ erdos checkpoints sync
36
+ erdos workspace show
37
+ ```
38
+
39
+ ## Status ladder
40
+
41
+ The public package uses the same ladder we converged on in the lab:
42
+ - open problem
43
+ - active route
44
+ - route breakthrough
45
+ - problem solved
46
+
47
+ The key rule is that route breakthroughs are never silently inflated into solved-problem claims.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "erdos-problems",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "CLI atlas and staged research harness for Paul Erdos problems.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -0,0 +1,16 @@
1
+ lane_id: u3_uniform_transfer_window_v0
2
+ problem_id: "20"
3
+ cluster: sunflower
4
+ question: Can the uniform k=3 lane be frozen into a transfer-ready reduction packet that talks cleanly to the weak 857 export route?
5
+ claim_level_goal: Verified
6
+ status: ready_for_local_scout
7
+ price_checked_local_date: 2026-03-25
8
+ recommendation: local_scout_first
9
+ approval_required: false
10
+ summary: Problem 20 now has a frozen local-scout packet for the uniform k=3 transfer window. The job is to verify a small explicit reduction bundle before any paid compute rung is considered.
11
+ source_repo: /Volumes/Code_2TB/code/sunflower-coda/repo
12
+ public_feature: uniform_k3_frontier
13
+ rungs:
14
+ - label: local_scout
15
+ mode: local
16
+ goal: verify the reduction packet, pull artifacts, and checkpoint the first honest route result
@@ -7,3 +7,8 @@ Role in family:
7
7
  Bootstrap focus:
8
8
  - start from the uniform k=3 lane
9
9
  - keep explicit bridges back to 857 whenever a route or method transfers cleanly
10
+
11
+ Frontier framing:
12
+ - the live goal is not “solve strong sunflower in one jump”
13
+ - the live goal is to package the uniform k=3 lane into a recurrence-ready and transfer-ready route
14
+ - checkpoint every route breakthrough before widening the public claim surface
@@ -3,6 +3,11 @@ family_role: strong_sunflower_core
3
3
  harness_profile: deep
4
4
  default_active_route: uniform_k3_frontier
5
5
  bootstrap_focus: Frame the strong or uniform k=3 sunflower lane as the direct sibling frontier to the weak 857 route.
6
+ route_story: Keep the uniform k=3 lane explicit, preserve every clean bridge to problem 857, and do not let local route work masquerade as full strong-sunflower closure.
7
+ frontier_label: uniform_k3_frontier
8
+ frontier_detail: Tighten the uniform k=3 route into a recurrence-ready and transfer-ready reduction packet that can talk honestly to the weak 857 export program.
9
+ checkpoint_focus: Record honest uniform-family route claims, bridge notes to 857, and any reusable reductions without overstating global closure.
10
+ next_honest_move: Pull the uniform k=3 dossier, sync checkpoints, and pressure the smallest recurrence-facing or reduction-facing obligation.
6
11
  related_core_problems:
7
12
  - "857"
8
13
  - "536"
@@ -16,3 +21,11 @@ artifact_focus:
16
21
  - uniform-family reductions
17
22
  - k=3 active route notes
18
23
  - bridge notes to 857
24
+ question_ledger:
25
+ open_questions:
26
+ - Which uniform k=3 reduction is the next smallest honest route step?
27
+ - What bridge result would cleanly transfer from problem 20 back into the weak 857 program?
28
+ active_route_notes:
29
+ - Keep the active route stated in uniform-family language, not generic sunflower shorthand.
30
+ route_breakthroughs:
31
+ - If a route breakthrough lands, checkpoint it before widening to strong-sunflower victory language.
@@ -7,3 +7,8 @@ Role in family:
7
7
  Bootstrap focus:
8
8
  - preserve the live route framing in the scaffold
9
9
  - keep literature, artifact, and compute packets aligned with the active frontier rather than generic sunflower chatter
10
+
11
+ Frontier framing:
12
+ - preserve the active export/compression route as the live frontier
13
+ - keep the recurrence-facing remainder terms explicit in every checkpoint
14
+ - do not blur route breakthroughs into claims that the open problem is solved
@@ -3,6 +3,11 @@ family_role: weak_sunflower_core
3
3
  harness_profile: deep
4
4
  default_active_route: anchored_selector_linearization
5
5
  bootstrap_focus: Start from the weak sunflower asymptotic route and preserve the active export/compression frontier in the scaffold.
6
+ route_story: Keep the weak sunflower route pointed at recurrence-facing export and compression work, and preserve the distinction between route breakthroughs and full problem closure.
7
+ frontier_label: anchored_selector_linearization
8
+ frontier_detail: Preserve the live export/compression frontier and keep the recurrence-facing remainder terms explicit rather than flattening them into generic sunflower notes.
9
+ checkpoint_focus: Record route breakthroughs, keep the open-problem versus active-route distinction sharp, and preserve the live remainder/compression obligations in every checkpoint.
10
+ next_honest_move: Sync checkpoints, then keep compressing the explicit O1a export into a true recurrence-facing step.
6
11
  related_core_problems:
7
12
  - "20"
8
13
  - "536"
@@ -16,3 +21,12 @@ artifact_focus:
16
21
  - active route notes
17
22
  - formal frontier checkpoints
18
23
  - compute lane packets when frozen
24
+ question_ledger:
25
+ open_questions:
26
+ - Which explicit compression step is the next honest reduction on the active weak-sunflower route?
27
+ - Which exported remainder term is still dominating the recurrence-facing frontier?
28
+ active_route_notes:
29
+ - Keep active-route notes tied to the explicit export/compression frontier, not generic sunflower chatter.
30
+ - Preserve the distinction between route breakthrough and full-problem solution in every artifact.
31
+ route_breakthroughs:
32
+ - When a route breakthrough lands, checkpoint it before selecting the next active route.
package/src/cli/index.js CHANGED
@@ -1,10 +1,14 @@
1
1
  import { runBootstrapCommand } from '../commands/bootstrap.js';
2
+ import { runCheckpointsCommand } from '../commands/checkpoints.js';
2
3
  import { runClusterCommand } from '../commands/cluster.js';
4
+ import { runContinuationCommand } from '../commands/continuation.js';
3
5
  import { runDossierCommand } from '../commands/dossier.js';
4
6
  import { runMaintainerCommand } from '../commands/maintainer.js';
7
+ import { runPreflightCommand } from '../commands/preflight.js';
5
8
  import { runProblemCommand } from '../commands/problem.js';
6
9
  import { runPullCommand } from '../commands/pull.js';
7
10
  import { runScaffoldCommand } from '../commands/scaffold.js';
11
+ import { runStateCommand } from '../commands/state.js';
8
12
  import { runSunflowerCommand } from '../commands/sunflower.js';
9
13
  import { runUpstreamCommand } from '../commands/upstream.js';
10
14
  import { runWorkspaceCommand } from '../commands/workspace.js';
@@ -21,6 +25,12 @@ function printUsage() {
21
25
  console.log(' erdos cluster list');
22
26
  console.log(' erdos cluster show <name>');
23
27
  console.log(' erdos workspace show');
28
+ console.log(' erdos state sync [--json]');
29
+ console.log(' erdos state show [--json]');
30
+ console.log(' erdos continuation show [--json]');
31
+ console.log(' erdos continuation use <atom|route|phase|milestone> [--json]');
32
+ console.log(' erdos preflight [--allow-dirty] [--json]');
33
+ console.log(' erdos checkpoints sync [--json]');
24
34
  console.log(' erdos sunflower status [<id>] [--json]');
25
35
  console.log(' erdos dossier show <id>');
26
36
  console.log(' erdos upstream show');
@@ -47,6 +57,14 @@ if (!command || command === 'help' || command === '--help') {
47
57
  exitCode = runClusterCommand(rest);
48
58
  } else if (command === 'workspace') {
49
59
  exitCode = runWorkspaceCommand(rest);
60
+ } else if (command === 'state') {
61
+ exitCode = runStateCommand(rest);
62
+ } else if (command === 'continuation') {
63
+ exitCode = runContinuationCommand(rest);
64
+ } else if (command === 'preflight') {
65
+ exitCode = runPreflightCommand(rest);
66
+ } else if (command === 'checkpoints') {
67
+ exitCode = runCheckpointsCommand(rest);
50
68
  } else if (command === 'sunflower') {
51
69
  exitCode = runSunflowerCommand(rest);
52
70
  } else if (command === 'dossier') {
@@ -1,7 +1,9 @@
1
1
  import path from 'node:path';
2
2
  import { getProblem } from '../atlas/catalog.js';
3
+ import { syncCheckpoints } from '../runtime/checkpoints.js';
3
4
  import { scaffoldProblem } from '../runtime/problem-artifacts.js';
4
5
  import { getWorkspaceProblemScaffoldDir } from '../runtime/paths.js';
6
+ import { syncState } from '../runtime/state.js';
5
7
  import { setCurrentProblem } from '../runtime/workspace.js';
6
8
  import { syncUpstream } from '../upstream/sync.js';
7
9
 
@@ -71,11 +73,16 @@ export async function runBootstrapCommand(args) {
71
73
  ? path.resolve(parsed.destination)
72
74
  : getWorkspaceProblemScaffoldDir(problem.problemId);
73
75
  const result = scaffoldProblem(problem, destination);
76
+ const state = syncState();
77
+ const checkpoints = syncCheckpoints();
74
78
 
75
79
  console.log(`Bootstrapped problem ${problem.problemId} (${problem.title})`);
76
80
  console.log(`Active problem: ${problem.problemId}`);
81
+ console.log(`Active route: ${state.activeRoute ?? '(none)'}`);
77
82
  console.log(`Scaffold dir: ${result.destination}`);
78
83
  console.log(`Artifacts copied: ${result.copiedArtifacts.length}`);
79
84
  console.log(`Upstream record included: ${result.inventory.upstreamRecordIncluded ? 'yes' : 'no'}`);
85
+ console.log(`Checkpoint shelf: ${checkpoints.indexPath}`);
86
+ console.log(`Next honest move: ${state.nextHonestMove}`);
80
87
  return 0;
81
88
  }
@@ -0,0 +1,36 @@
1
+ import { syncCheckpoints } from '../runtime/checkpoints.js';
2
+
3
+ export function runCheckpointsCommand(args) {
4
+ const [subcommand, ...rest] = args;
5
+ const asJson = rest.includes('--json');
6
+ const unknown = rest.filter((arg) => arg !== '--json');
7
+
8
+ if (!subcommand || subcommand === 'help' || subcommand === '--help') {
9
+ console.log('Usage:');
10
+ console.log(' erdos checkpoints sync [--json]');
11
+ return 0;
12
+ }
13
+
14
+ if (subcommand !== 'sync') {
15
+ console.error(`Unknown checkpoints subcommand: ${subcommand}`);
16
+ return 1;
17
+ }
18
+
19
+ if (unknown.length > 0) {
20
+ console.error(`Unknown checkpoints option: ${unknown[0]}`);
21
+ return 1;
22
+ }
23
+
24
+ const result = syncCheckpoints();
25
+ if (asJson) {
26
+ console.log(JSON.stringify(result, null, 2));
27
+ return 0;
28
+ }
29
+
30
+ console.log('Checkpoint shelf synced');
31
+ console.log(`Index path: ${result.indexPath}`);
32
+ console.log(`Checkpoint JSON: ${result.checkpointJsonPath}`);
33
+ console.log(`Checkpoint count: ${result.checkpoints.length}`);
34
+ console.log(`Last checkpoint sync: ${result.state.lastCheckpointSyncAt}`);
35
+ return 0;
36
+ }
@@ -0,0 +1,60 @@
1
+ import { ensureConfig, loadConfig, saveConfig } from '../runtime/config.js';
2
+ import { continuationDisplay, continuationModes, resolveContinuation } from '../runtime/continuation.js';
3
+ import { syncState } from '../runtime/state.js';
4
+
5
+ function printContinuation(payload) {
6
+ console.log('Continuation mode');
7
+ console.log(`Requested: ${payload.requestedMode}`);
8
+ console.log(`Resolved: ${continuationDisplay(payload)}`);
9
+ console.log(`Review cadence: ${payload.reviewCadence}`);
10
+ console.log(`Max unattended minutes: ${payload.maxUnattendedMinutes}`);
11
+ console.log(`Checkpoint after load-bearing result: ${payload.checkpointAfterLoadBearingResult ? 'yes' : 'no'}`);
12
+ console.log(`Stop rule: ${payload.stopRule}`);
13
+ }
14
+
15
+ export function runContinuationCommand(args) {
16
+ const [subcommand, value, ...rest] = args;
17
+ const asJson = rest.includes('--json');
18
+
19
+ if (!subcommand || subcommand === 'help' || subcommand === '--help') {
20
+ console.log('Usage:');
21
+ console.log(' erdos continuation show [--json]');
22
+ console.log(` erdos continuation use <${continuationModes().join('|')}> [--json]`);
23
+ return 0;
24
+ }
25
+
26
+ if (subcommand === 'show') {
27
+ const config = ensureConfig();
28
+ const continuation = resolveContinuation({ requestedMode: config.continuation });
29
+ if (asJson) {
30
+ console.log(JSON.stringify(continuation, null, 2));
31
+ return 0;
32
+ }
33
+ printContinuation(continuation);
34
+ return 0;
35
+ }
36
+
37
+ if (subcommand === 'use') {
38
+ if (!value) {
39
+ console.error('Missing continuation mode.');
40
+ return 1;
41
+ }
42
+ if (!continuationModes().includes(value)) {
43
+ console.error(`Unknown continuation mode: ${value}`);
44
+ return 1;
45
+ }
46
+ const config = loadConfig();
47
+ saveConfig({ ...config, continuation: value });
48
+ const state = syncState();
49
+ if (asJson) {
50
+ console.log(JSON.stringify(state.continuation, null, 2));
51
+ return 0;
52
+ }
53
+ console.log(`Continuation mode set to ${continuationDisplay(state.continuation)}`);
54
+ printContinuation(state.continuation);
55
+ return 0;
56
+ }
57
+
58
+ console.error(`Unknown continuation subcommand: ${subcommand}`);
59
+ return 1;
60
+ }
@@ -0,0 +1,44 @@
1
+ import { buildPreflightReport } from '../runtime/preflight.js';
2
+
3
+ function printChecks(checks) {
4
+ for (const [label, payload] of Object.entries(checks)) {
5
+ console.log(`- ${label}: ${payload.ok ? 'ok' : 'attention'} (${payload.detail})`);
6
+ }
7
+ }
8
+
9
+ export function runPreflightCommand(args) {
10
+ const asJson = args.includes('--json');
11
+ const allowDirty = args.includes('--allow-dirty');
12
+ const unknown = args.filter((arg) => arg !== '--json' && arg !== '--allow-dirty');
13
+
14
+ if (args.length > 0 && (args[0] === 'help' || args[0] === '--help')) {
15
+ console.log('Usage:');
16
+ console.log(' erdos preflight [--allow-dirty] [--json]');
17
+ return 0;
18
+ }
19
+
20
+ if (unknown.length > 0) {
21
+ console.error(`Unknown preflight option: ${unknown[0]}`);
22
+ return 1;
23
+ }
24
+
25
+ const report = buildPreflightReport({ allowDirty });
26
+ if (asJson) {
27
+ console.log(JSON.stringify(report, null, 2));
28
+ return report.verdict === 'blocked' ? 2 : 0;
29
+ }
30
+
31
+ console.log('Research preflight');
32
+ console.log(`- Workspace root: ${report.workspaceRoot}`);
33
+ console.log(`- Open problem: ${report.activeProblem ?? '(none)'}`);
34
+ console.log(`- Active route: ${report.activeRoute ?? '(none)'}`);
35
+ console.log(`- Route breakthrough: ${report.routeBreakthrough ? 'yes' : 'no'}`);
36
+ console.log(`- Problem solved: ${report.problemSolved ? 'yes' : 'no'}`);
37
+ console.log(`- Continuation policy: ${report.continuationDisplay}`);
38
+ console.log(`- Current frontier: ${report.currentFrontier.kind} / ${report.currentFrontier.detail}`);
39
+ console.log(`- Next honest move: ${report.nextHonestMove}`);
40
+ console.log('Checks:');
41
+ printChecks(report.checks);
42
+ console.log(`Verdict: ${report.verdict}`);
43
+ return report.verdict === 'blocked' ? 2 : 0;
44
+ }
@@ -1,5 +1,6 @@
1
1
  import { getProblem, listProblems } from '../atlas/catalog.js';
2
2
  import { getProblemArtifactInventory } from '../runtime/problem-artifacts.js';
3
+ import { syncState } from '../runtime/state.js';
3
4
  import { readCurrentProblem, setCurrentProblem } from '../runtime/workspace.js';
4
5
 
5
6
  function parseListFilters(args) {
@@ -200,7 +201,10 @@ export function runProblemCommand(args) {
200
201
  return 1;
201
202
  }
202
203
  setCurrentProblem(problem.problemId);
204
+ const state = syncState();
203
205
  console.log(`Active problem set to ${problem.problemId} (${problem.title})`);
206
+ console.log(`Active route: ${state.activeRoute ?? '(none)'}`);
207
+ console.log(`Next honest move: ${state.nextHonestMove}`);
204
208
  return 0;
205
209
  }
206
210
 
@@ -0,0 +1,57 @@
1
+ import { getWorkspaceQuestionLedgerPath, getWorkspaceStateMarkdownPath } from '../runtime/paths.js';
2
+ import { loadState, syncState } from '../runtime/state.js';
3
+
4
+ function printState(state) {
5
+ console.log('Erdos research state');
6
+ console.log(`Workspace root: ${state.workspaceRoot}`);
7
+ console.log(`Open problem: ${state.activeProblem || '(none)'}`);
8
+ console.log(`Problem title: ${state.problemTitle || '(none)'}`);
9
+ console.log(`Cluster: ${state.cluster || '(none)'}`);
10
+ console.log(`Family role: ${state.familyRole || '(none)'}`);
11
+ console.log(`Harness profile: ${state.harnessProfile || '(none)'}`);
12
+ console.log(`Active route: ${state.activeRoute || '(none)'}`);
13
+ console.log(`Route breakthrough: ${state.routeBreakthrough ? 'yes' : 'no'}`);
14
+ console.log(`Problem solved: ${state.problemSolved ? 'yes' : 'no'}`);
15
+ console.log(`Continuation mode: ${state.continuation.mode}`);
16
+ console.log(`Current frontier: ${state.currentFrontier.kind} / ${state.currentFrontier.detail}`);
17
+ console.log(`Route story: ${state.routeStory || '(none)'}`);
18
+ console.log(`Checkpoint focus: ${state.checkpointFocus || '(none)'}`);
19
+ console.log(`Next honest move: ${state.nextHonestMove}`);
20
+ console.log(`State markdown: ${getWorkspaceStateMarkdownPath()}`);
21
+ console.log(`Question ledger: ${getWorkspaceQuestionLedgerPath()}`);
22
+ }
23
+
24
+ export function runStateCommand(args) {
25
+ const [subcommand, ...rest] = args;
26
+ const asJson = rest.includes('--json');
27
+
28
+ if (!subcommand || subcommand === 'help' || subcommand === '--help') {
29
+ console.log('Usage:');
30
+ console.log(' erdos state sync [--json]');
31
+ console.log(' erdos state show [--json]');
32
+ return 0;
33
+ }
34
+
35
+ if (subcommand === 'sync') {
36
+ const state = syncState();
37
+ if (asJson) {
38
+ console.log(JSON.stringify(state, null, 2));
39
+ return 0;
40
+ }
41
+ printState(state);
42
+ return 0;
43
+ }
44
+
45
+ if (subcommand === 'show') {
46
+ const state = loadState();
47
+ if (asJson) {
48
+ console.log(JSON.stringify(state, null, 2));
49
+ return 0;
50
+ }
51
+ printState(state);
52
+ return 0;
53
+ }
54
+
55
+ console.error(`Unknown state subcommand: ${subcommand}`);
56
+ return 1;
57
+ }
@@ -35,6 +35,11 @@ function printSunflowerStatus(snapshot, registryPaths) {
35
35
  console.log(`Open problem: ${snapshot.openProblem ? 'yes' : 'no'}`);
36
36
  console.log(`Problem solved: ${snapshot.problemSolved ? 'yes' : 'no'}`);
37
37
  console.log(`Bootstrap focus: ${snapshot.bootstrapFocus ?? '(none)'}`);
38
+ console.log(`Route story: ${snapshot.routeStory ?? '(none)'}`);
39
+ console.log(`Frontier label: ${snapshot.frontierLabel ?? '(none)'}`);
40
+ console.log(`Frontier detail: ${snapshot.frontierDetail ?? '(none)'}`);
41
+ console.log(`Checkpoint focus: ${snapshot.checkpointFocus ?? '(none)'}`);
42
+ console.log(`Next honest move: ${snapshot.nextHonestMove}`);
38
43
  console.log(`Related core problems: ${snapshot.relatedCoreProblems.join(', ') || '(none)'}`);
39
44
  console.log(`Literature focus: ${snapshot.literatureFocus.join(', ') || '(none)'}`);
40
45
  console.log(`Artifact focus: ${snapshot.artifactFocus.join(', ') || '(none)'}`);
@@ -1,4 +1,5 @@
1
1
  import { getProblem } from '../atlas/catalog.js';
2
+ import { loadConfig } from '../runtime/config.js';
2
3
  import { buildSunflowerStatusSnapshot } from '../runtime/sunflower.js';
3
4
  import { getWorkspaceSummary } from '../runtime/workspace.js';
4
5
 
@@ -17,15 +18,31 @@ export function runWorkspaceCommand(args) {
17
18
  }
18
19
 
19
20
  const summary = getWorkspaceSummary();
21
+ const config = loadConfig();
20
22
  console.log(`Workspace root: ${summary.workspaceRoot}`);
21
23
  console.log(`State dir: ${summary.stateDir}`);
22
24
  console.log(`Initialized: ${summary.hasState ? 'yes' : 'no'}`);
23
25
  console.log(`Active problem: ${summary.activeProblem ?? '(none)'}`);
26
+ console.log(`Config path: ${summary.configPath}`);
27
+ console.log(`State file: ${summary.statePath}`);
28
+ console.log(`State markdown: ${summary.stateMarkdownPath}`);
29
+ console.log(`Question ledger: ${summary.questionLedgerPath}`);
30
+ console.log(`Checkpoint shelf: ${summary.checkpointIndexPath}`);
24
31
  console.log(`Workspace upstream dir: ${summary.upstreamDir}`);
25
32
  console.log(`Workspace scaffold dir: ${summary.scaffoldDir}`);
26
33
  console.log(`Workspace pull dir: ${summary.pullDir}`);
27
34
  console.log(`Workspace artifact dir: ${summary.artifactDir}`);
28
35
  console.log(`Workspace literature dir: ${summary.literatureDir}`);
36
+ console.log(`Preferred agent: ${config.preferredAgent}`);
37
+ console.log(`Continuation mode: ${summary.continuationMode ?? config.continuation}`);
38
+ console.log(`Active route: ${summary.activeRoute ?? '(none)'}`);
39
+ console.log(`Route breakthrough: ${summary.routeBreakthrough ? 'yes' : 'no'}`);
40
+ console.log(`Problem solved: ${summary.problemSolved ? 'yes' : 'no'}`);
41
+ console.log(`Checkpoint synced at: ${summary.lastCheckpointSyncAt ?? '(never)'}`);
42
+ console.log(`Next honest move: ${summary.nextHonestMove ?? '(none)'}`);
43
+ if (summary.currentFrontier) {
44
+ console.log(`Current frontier: ${summary.currentFrontier.kind} / ${summary.currentFrontier.detail}`);
45
+ }
29
46
  console.log(`Updated at: ${summary.updatedAt ?? '(none)'}`);
30
47
  if (summary.activeProblem) {
31
48
  const problem = getProblem(summary.activeProblem);
@@ -34,6 +51,7 @@ export function runWorkspaceCommand(args) {
34
51
  console.log(`Sunflower family role: ${sunflower.familyRole ?? '(none)'}`);
35
52
  console.log(`Sunflower harness profile: ${sunflower.harnessProfile ?? '(none)'}`);
36
53
  console.log(`Sunflower route: ${sunflower.activeRoute ?? '(none)'}`);
54
+ console.log(`Sunflower frontier: ${sunflower.frontierDetail ?? '(none)'}`);
37
55
  console.log(`Sunflower compute: ${sunflower.computeLanePresent ? 'yes' : 'no'}`);
38
56
  if (sunflower.activePacket) {
39
57
  console.log(`Sunflower compute lane: ${sunflower.activePacket.laneId} [${sunflower.activePacket.status}]`);