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 +31 -0
- package/docs/RESEARCH_LOOP.md +47 -0
- package/package.json +1 -1
- package/packs/sunflower/compute/20/u3_uniform_transfer_window_v0.yaml +16 -0
- package/packs/sunflower/problems/20/CONTEXT.md +5 -0
- package/packs/sunflower/problems/20/context.yaml +13 -0
- package/packs/sunflower/problems/857/CONTEXT.md +5 -0
- package/packs/sunflower/problems/857/context.yaml +14 -0
- package/src/cli/index.js +18 -0
- package/src/commands/bootstrap.js +7 -0
- package/src/commands/checkpoints.js +36 -0
- package/src/commands/continuation.js +60 -0
- package/src/commands/preflight.js +44 -0
- package/src/commands/problem.js +4 -0
- package/src/commands/state.js +57 -0
- package/src/commands/sunflower.js +5 -0
- package/src/commands/workspace.js +18 -0
- package/src/runtime/checkpoints.js +208 -0
- package/src/runtime/config.js +37 -0
- package/src/runtime/continuation.js +65 -0
- package/src/runtime/git.js +52 -0
- package/src/runtime/paths.js +67 -31
- package/src/runtime/preflight.js +106 -0
- package/src/runtime/state.js +269 -0
- package/src/runtime/sunflower.js +40 -1
- package/src/runtime/workspace.js +40 -24
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
|
@@ -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
|
+
}
|
package/src/commands/problem.js
CHANGED
|
@@ -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}]`);
|