erdos-problems 0.1.4 → 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.
Files changed (40) hide show
  1. package/README.md +103 -13
  2. package/docs/ERDOS_PROBLEMS_PROBLEM_SCHEMA.md +65 -60
  3. package/docs/ERDOS_PROBLEMS_REPO_SPEC.md +97 -214
  4. package/docs/RESEARCH_LOOP.md +47 -0
  5. package/package.json +1 -1
  6. package/packs/sunflower/README.md +6 -4
  7. package/packs/sunflower/compute/20/u3_uniform_transfer_window_v0.yaml +16 -0
  8. package/packs/sunflower/problems/20/CONTEXT.md +14 -0
  9. package/packs/sunflower/problems/20/context.yaml +31 -0
  10. package/packs/sunflower/problems/536/CONTEXT.md +9 -0
  11. package/packs/sunflower/problems/536/context.yaml +17 -0
  12. package/packs/sunflower/problems/856/CONTEXT.md +9 -0
  13. package/packs/sunflower/problems/856/context.yaml +17 -0
  14. package/packs/sunflower/problems/857/CONTEXT.md +14 -0
  15. package/packs/sunflower/problems/857/context.yaml +32 -0
  16. package/problems/20/problem.yaml +8 -2
  17. package/problems/536/problem.yaml +9 -3
  18. package/problems/856/problem.yaml +9 -3
  19. package/src/cli/index.js +24 -0
  20. package/src/commands/bootstrap.js +7 -0
  21. package/src/commands/checkpoints.js +36 -0
  22. package/src/commands/continuation.js +60 -0
  23. package/src/commands/maintainer.js +182 -0
  24. package/src/commands/preflight.js +44 -0
  25. package/src/commands/problem.js +10 -0
  26. package/src/commands/pull.js +192 -41
  27. package/src/commands/state.js +57 -0
  28. package/src/commands/sunflower.js +12 -0
  29. package/src/commands/workspace.js +22 -0
  30. package/src/runtime/checkpoints.js +208 -0
  31. package/src/runtime/config.js +37 -0
  32. package/src/runtime/continuation.js +65 -0
  33. package/src/runtime/git.js +52 -0
  34. package/src/runtime/maintainer-seed.js +294 -0
  35. package/src/runtime/paths.js +75 -27
  36. package/src/runtime/preflight.js +106 -0
  37. package/src/runtime/problem-artifacts.js +63 -1
  38. package/src/runtime/state.js +269 -0
  39. package/src/runtime/sunflower.js +126 -6
  40. package/src/runtime/workspace.js +42 -22
@@ -12,7 +12,7 @@ upstream:
12
12
  status:
13
13
  site_status: open
14
14
  site_badge: OPEN
15
- repo_status: cataloged
15
+ repo_status: active
16
16
  upstream_status: open
17
17
  upstream_last_update: 2025-08-31
18
18
  cluster: sunflower
@@ -20,14 +20,15 @@ prize:
20
20
  display: no
21
21
  related_problems:
22
22
  - "857"
23
+ - "856"
24
+ - "20"
23
25
  family_tags:
24
26
  - sunflower-analogue
25
27
  - number-theory
26
28
  harness:
27
29
  depth: dossier
28
30
  statement:
29
- short: Number-theoretic analogue of the sunflower problem framed through least
30
- common multiples.
31
+ short: Number-theoretic analogue of the sunflower problem framed through least common multiples and natural-density structure.
31
32
  normalized_md_path: STATEMENT.md
32
33
  references_path: REFERENCES.md
33
34
  evidence_path: EVIDENCE.md
@@ -36,3 +37,8 @@ formalization:
36
37
  status: planned
37
38
  upstream_state: yes
38
39
  upstream_last_update: 2025-11-12
40
+ research_state:
41
+ open_problem: true
42
+ active_route: natural_density_lcm_bridge
43
+ route_breakthrough: false
44
+ problem_solved: false
@@ -12,7 +12,7 @@ upstream:
12
12
  status:
13
13
  site_status: open
14
14
  site_badge: OPEN
15
- repo_status: cataloged
15
+ repo_status: active
16
16
  upstream_status: open
17
17
  upstream_last_update: 2025-08-31
18
18
  cluster: sunflower
@@ -20,14 +20,15 @@ prize:
20
20
  display: no
21
21
  related_problems:
22
22
  - "857"
23
+ - "536"
24
+ - "20"
23
25
  family_tags:
24
26
  - sunflower-analogue
25
27
  - number-theory
26
28
  harness:
27
29
  depth: dossier
28
30
  statement:
29
- short: A harmonic or density-shaped LCM analogue whose exponents are explicitly
30
- linked to progress on the weak sunflower problem.
31
+ short: A harmonic or density-shaped LCM analogue whose exponent behavior is explicitly linked to progress on the weak sunflower problem.
31
32
  normalized_md_path: STATEMENT.md
32
33
  references_path: REFERENCES.md
33
34
  evidence_path: EVIDENCE.md
@@ -36,3 +37,8 @@ formalization:
36
37
  status: planned
37
38
  upstream_state: no
38
39
  upstream_last_update: 2025-08-31
40
+ research_state:
41
+ open_problem: true
42
+ active_route: harmonic_density_lcm_bridge
43
+ route_breakthrough: false
44
+ problem_solved: false
package/src/cli/index.js CHANGED
@@ -1,9 +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';
6
+ import { runMaintainerCommand } from '../commands/maintainer.js';
7
+ import { runPreflightCommand } from '../commands/preflight.js';
4
8
  import { runProblemCommand } from '../commands/problem.js';
5
9
  import { runPullCommand } from '../commands/pull.js';
6
10
  import { runScaffoldCommand } from '../commands/scaffold.js';
11
+ import { runStateCommand } from '../commands/state.js';
7
12
  import { runSunflowerCommand } from '../commands/sunflower.js';
8
13
  import { runUpstreamCommand } from '../commands/upstream.js';
9
14
  import { runWorkspaceCommand } from '../commands/workspace.js';
@@ -20,6 +25,12 @@ function printUsage() {
20
25
  console.log(' erdos cluster list');
21
26
  console.log(' erdos cluster show <name>');
22
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]');
23
34
  console.log(' erdos sunflower status [<id>] [--json]');
24
35
  console.log(' erdos dossier show <id>');
25
36
  console.log(' erdos upstream show');
@@ -28,6 +39,9 @@ function printUsage() {
28
39
  console.log(' erdos scaffold problem <id> [--dest <path>]');
29
40
  console.log(' erdos bootstrap problem <id> [--dest <path>] [--sync-upstream]');
30
41
  console.log(' erdos pull problem <id> [--dest <path>] [--include-site] [--refresh-upstream]');
42
+ console.log(' erdos pull artifacts <id> [--dest <path>] [--refresh-upstream]');
43
+ console.log(' erdos pull literature <id> [--dest <path>] [--include-site] [--refresh-upstream]');
44
+ console.log(' erdos maintainer seed problem <id> [--from-pull <path>] [--dest-root <path>] [--cluster <name>]');
31
45
  }
32
46
 
33
47
  const args = process.argv.slice(2);
@@ -43,6 +57,14 @@ if (!command || command === 'help' || command === '--help') {
43
57
  exitCode = runClusterCommand(rest);
44
58
  } else if (command === 'workspace') {
45
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);
46
68
  } else if (command === 'sunflower') {
47
69
  exitCode = runSunflowerCommand(rest);
48
70
  } else if (command === 'dossier') {
@@ -55,6 +77,8 @@ if (!command || command === 'help' || command === '--help') {
55
77
  exitCode = await runBootstrapCommand(rest);
56
78
  } else if (command === 'pull') {
57
79
  exitCode = await runPullCommand(rest);
80
+ } else if (command === 'maintainer') {
81
+ exitCode = runMaintainerCommand(rest);
58
82
  } else {
59
83
  console.error(`Unknown command: ${command}`);
60
84
  printUsage();
@@ -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,182 @@
1
+ import path from 'node:path';
2
+ import { seedProblemFromPullBundle } from '../runtime/maintainer-seed.js';
3
+
4
+ function parseMaintainerSeedArgs(args) {
5
+ const [kind, problemToken, ...rest] = args;
6
+ if (kind !== 'problem') {
7
+ return { error: 'Only `erdos maintainer seed problem <id>` is supported right now.' };
8
+ }
9
+
10
+ const parsed = {
11
+ problemId: problemToken,
12
+ fromPullDir: null,
13
+ destRoot: null,
14
+ cluster: null,
15
+ repoStatus: null,
16
+ harnessDepth: null,
17
+ title: null,
18
+ familyTags: [],
19
+ relatedProblems: [],
20
+ formalizationStatus: null,
21
+ activeRoute: null,
22
+ routeBreakthrough: false,
23
+ problemSolved: false,
24
+ force: false,
25
+ };
26
+
27
+ for (let index = 0; index < rest.length; index += 1) {
28
+ const token = rest[index];
29
+ if (token === '--from-pull') {
30
+ parsed.fromPullDir = rest[index + 1];
31
+ if (!parsed.fromPullDir) {
32
+ return { error: 'Missing path after --from-pull.' };
33
+ }
34
+ index += 1;
35
+ continue;
36
+ }
37
+ if (token === '--dest-root') {
38
+ parsed.destRoot = rest[index + 1];
39
+ if (!parsed.destRoot) {
40
+ return { error: 'Missing path after --dest-root.' };
41
+ }
42
+ index += 1;
43
+ continue;
44
+ }
45
+ if (token === '--cluster') {
46
+ parsed.cluster = rest[index + 1];
47
+ if (!parsed.cluster) {
48
+ return { error: 'Missing cluster value after --cluster.' };
49
+ }
50
+ index += 1;
51
+ continue;
52
+ }
53
+ if (token === '--repo-status') {
54
+ parsed.repoStatus = rest[index + 1];
55
+ if (!parsed.repoStatus) {
56
+ return { error: 'Missing repo status after --repo-status.' };
57
+ }
58
+ index += 1;
59
+ continue;
60
+ }
61
+ if (token === '--harness-depth') {
62
+ parsed.harnessDepth = rest[index + 1];
63
+ if (!parsed.harnessDepth) {
64
+ return { error: 'Missing harness depth after --harness-depth.' };
65
+ }
66
+ index += 1;
67
+ continue;
68
+ }
69
+ if (token === '--title') {
70
+ parsed.title = rest[index + 1];
71
+ if (!parsed.title) {
72
+ return { error: 'Missing title after --title.' };
73
+ }
74
+ index += 1;
75
+ continue;
76
+ }
77
+ if (token === '--family-tag') {
78
+ const tag = rest[index + 1];
79
+ if (!tag) {
80
+ return { error: 'Missing tag after --family-tag.' };
81
+ }
82
+ parsed.familyTags.push(tag);
83
+ index += 1;
84
+ continue;
85
+ }
86
+ if (token === '--related') {
87
+ const related = rest[index + 1];
88
+ if (!related) {
89
+ return { error: 'Missing problem id after --related.' };
90
+ }
91
+ parsed.relatedProblems.push(related);
92
+ index += 1;
93
+ continue;
94
+ }
95
+ if (token === '--formalization-status') {
96
+ parsed.formalizationStatus = rest[index + 1];
97
+ if (!parsed.formalizationStatus) {
98
+ return { error: 'Missing value after --formalization-status.' };
99
+ }
100
+ index += 1;
101
+ continue;
102
+ }
103
+ if (token === '--active-route') {
104
+ parsed.activeRoute = rest[index + 1];
105
+ if (!parsed.activeRoute) {
106
+ return { error: 'Missing value after --active-route.' };
107
+ }
108
+ index += 1;
109
+ continue;
110
+ }
111
+ if (token === '--route-breakthrough') {
112
+ parsed.routeBreakthrough = true;
113
+ continue;
114
+ }
115
+ if (token === '--problem-solved') {
116
+ parsed.problemSolved = true;
117
+ continue;
118
+ }
119
+ if (token === '--force') {
120
+ parsed.force = true;
121
+ continue;
122
+ }
123
+ return { error: `Unknown maintainer seed option: ${token}` };
124
+ }
125
+
126
+ return parsed;
127
+ }
128
+
129
+ export function runMaintainerCommand(args) {
130
+ const [subcommand, ...rest] = args;
131
+
132
+ if (!subcommand || subcommand === 'help' || subcommand === '--help') {
133
+ console.log('Usage:');
134
+ console.log(' erdos maintainer seed problem <id> [--from-pull <path>] [--dest-root <path>] [--cluster <name>] [--repo-status <status>] [--harness-depth <depth>] [--title <title>] [--family-tag <tag>] [--related <id>] [--formalization-status <status>] [--active-route <route>] [--route-breakthrough] [--problem-solved] [--force]');
135
+ return 0;
136
+ }
137
+
138
+ if (subcommand !== 'seed') {
139
+ console.error(`Unknown maintainer subcommand: ${subcommand}`);
140
+ return 1;
141
+ }
142
+
143
+ const parsed = parseMaintainerSeedArgs(rest);
144
+ if (parsed.error) {
145
+ console.error(parsed.error);
146
+ return 1;
147
+ }
148
+ if (!parsed.problemId) {
149
+ console.error('Missing problem id.');
150
+ return 1;
151
+ }
152
+
153
+ try {
154
+ const result = seedProblemFromPullBundle(parsed.problemId, {
155
+ fromPullDir: parsed.fromPullDir ? path.resolve(parsed.fromPullDir) : null,
156
+ destRoot: parsed.destRoot ? path.resolve(parsed.destRoot) : null,
157
+ cluster: parsed.cluster,
158
+ repoStatus: parsed.repoStatus,
159
+ harnessDepth: parsed.harnessDepth,
160
+ title: parsed.title,
161
+ familyTags: parsed.familyTags,
162
+ relatedProblems: parsed.relatedProblems,
163
+ formalizationStatus: parsed.formalizationStatus,
164
+ activeRoute: parsed.activeRoute,
165
+ routeBreakthrough: parsed.routeBreakthrough,
166
+ problemSolved: parsed.problemSolved,
167
+ force: parsed.force,
168
+ });
169
+
170
+ console.log(`Seeded dossier for problem ${parsed.problemId}`);
171
+ console.log(`Destination: ${result.destinationDir}`);
172
+ console.log(`Title: ${result.record.title}`);
173
+ console.log(`Cluster: ${result.record.cluster}`);
174
+ console.log(`Harness depth: ${result.record.harness.depth}`);
175
+ console.log(`Upstream record used: ${result.usedUpstreamRecord ? 'yes' : 'no'}`);
176
+ console.log(`Site snapshot used: ${result.usedSiteSnapshot ? 'yes' : 'no'}`);
177
+ return 0;
178
+ } catch (error) {
179
+ console.error(String(error.message ?? error));
180
+ return 1;
181
+ }
182
+ }
@@ -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) {
@@ -129,6 +130,12 @@ function printArtifactInventory(problem, inventory, asJson) {
129
130
  if (inventory.packContext) {
130
131
  console.log(`- ${inventory.packContext.label}: ${inventory.packContext.exists ? 'present' : 'missing'} (${inventory.packContext.path})`);
131
132
  }
133
+ if (inventory.packProblemArtifacts.length > 0) {
134
+ console.log('Pack problem artifacts:');
135
+ for (const artifact of inventory.packProblemArtifacts) {
136
+ console.log(`- ${artifact.label}: ${artifact.exists ? 'present' : 'missing'} (${artifact.path})`);
137
+ }
138
+ }
132
139
  if (inventory.computePackets.length > 0) {
133
140
  console.log('Compute packets:');
134
141
  for (const packet of inventory.computePackets) {
@@ -194,7 +201,10 @@ export function runProblemCommand(args) {
194
201
  return 1;
195
202
  }
196
203
  setCurrentProblem(problem.problemId);
204
+ const state = syncState();
197
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}`);
198
208
  return 0;
199
209
  }
200
210