erdos-problems 0.1.10 → 0.1.11

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
@@ -22,6 +22,7 @@ Official binary:
22
22
  - workspace `.erdos/` state for active-problem selection, upstream refreshes, scaffolds, and pull bundles
23
23
  - sunflower cluster as the first deep harness pack
24
24
  - quartet-aware sunflower context for `20`, `536`, `856`, and `857`
25
+ - packaged atomic/bridge board packets for the full sunflower quartet
25
26
  - packaged compute-lane metadata for deep sunflower problems, surfaced directly in the CLI
26
27
  - seeded atlas now includes open and solved problems beyond sunflower
27
28
  - unseeded problems can still be pulled into a workspace from the bundled upstream snapshot
@@ -39,6 +40,7 @@ erdos problem list --cluster sunflower
39
40
  erdos bootstrap problem 857
40
41
  erdos problem artifacts 857 --json
41
42
  erdos sunflower status 857
43
+ erdos sunflower board 857
42
44
  erdos dossier show 857
43
45
  ```
44
46
 
@@ -136,9 +138,11 @@ The first deep pack is the sunflower quartet:
136
138
  - `536`: natural-density LCM analogue
137
139
  - `856`: harmonic-density LCM analogue
138
140
 
139
- Deep sunflower problems now also ship route packets:
140
- - `20`: `AGENT_START.md`, `ROUTE_PACKET.yaml`, `CHECKPOINT_PACKET.md`, `REPORT_PACKET.md`
141
- - `857`: `AGENT_START.md`, `ROUTE_PACKET.yaml`, `CHECKPOINT_PACKET.md`, `REPORT_PACKET.md`
141
+ Sunflower problems now ship pack packets:
142
+ - `20`: `AGENT_START.md`, `ROUTE_PACKET.yaml`, `CHECKPOINT_PACKET.md`, `REPORT_PACKET.md`, `ATOMIC_BOARD.yaml`, `ATOMIC_BOARD.md`
143
+ - `857`: `AGENT_START.md`, `ROUTE_PACKET.yaml`, `CHECKPOINT_PACKET.md`, `REPORT_PACKET.md`, `ATOMIC_BOARD.yaml`, `ATOMIC_BOARD.md`
144
+ - `536`: `AGENT_START.md`, `ROUTE_PACKET.yaml`, `CHECKPOINT_PACKET.md`, `REPORT_PACKET.md`, `ATOMIC_BOARD.yaml`, `ATOMIC_BOARD.md`
145
+ - `856`: `AGENT_START.md`, `ROUTE_PACKET.yaml`, `CHECKPOINT_PACKET.md`, `REPORT_PACKET.md`, `ATOMIC_BOARD.yaml`, `ATOMIC_BOARD.md`
142
146
 
143
147
  Useful sunflower commands:
144
148
 
@@ -146,6 +150,8 @@ Useful sunflower commands:
146
150
  erdos cluster show sunflower
147
151
  erdos sunflower status 20
148
152
  erdos sunflower status 536
153
+ erdos sunflower board 536
154
+ erdos sunflower board 857
149
155
  erdos sunflower status 857 --json
150
156
  ```
151
157
 
@@ -155,8 +161,17 @@ erdos sunflower status 857 --json
155
161
  - active route
156
162
  - route breakthrough state
157
163
  - problem-solved distinction
164
+ - atomic board posture, active ticket, ready-atom count, and first ready atom when a board packet exists
158
165
  - compute posture when a packet exists
159
166
 
167
+ `erdos sunflower board` surfaces:
168
+ - mirrored lab atomic boards for `20` and `857`
169
+ - lighter dossier-bridge boards for `536` and `856`
170
+ - route status
171
+ - ticket board summary
172
+ - first-principles ladder
173
+ - ready queue
174
+
160
175
  ## ORP
161
176
 
162
177
  `erdos-problems` now ships a bundled Open Research Protocol kit:
@@ -196,6 +211,7 @@ erdos workspace show
196
211
  erdos orp show
197
212
  erdos orp sync
198
213
  erdos sunflower status 857
214
+ erdos sunflower board 857
199
215
  erdos sunflower status --json
200
216
  erdos dossier show
201
217
  erdos upstream show
@@ -247,7 +263,7 @@ The CLI can surface these directly:
247
263
  For sunflower problems, the CLI also surfaces pack-specific artifacts:
248
264
  - pack README context
249
265
  - per-problem context files under `packs/sunflower/problems/<id>/`
250
- - route packets and checkpoint/report packets for `20` and `857`
266
+ - route packets, checkpoint/report packets, and board packets for the full sunflower quartet
251
267
  - compute packets under `packs/sunflower/compute/<id>/` when available
252
268
  - compute-governance evaluation under `breakthroughs`, surfaced through `erdos sunflower status`
253
269
 
@@ -69,6 +69,7 @@ The ORP kit travels with the workspace too:
69
69
 
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
+ - `erdos sunflower board <id>` exposes the packaged atomic or bridge board for the active sunflower problem
72
73
  - the CLI surfaces the selected rung, dispatch action, and the reason compute is admissible
73
74
  - this is compute governance and traceability, not an automatic compute launch
74
75
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "erdos-problems",
3
- "version": "0.1.10",
3
+ "version": "0.1.11",
4
4
  "description": "CLI atlas and staged research harness for Paul Erdos problems.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -15,5 +15,9 @@ Profiles:
15
15
  - `856`: dossier bridge, harmonic-density LCM analogue
16
16
 
17
17
  Deep route packets:
18
- - `20` ships `AGENT_START.md`, `ROUTE_PACKET.yaml`, `CHECKPOINT_PACKET.md`, `REPORT_PACKET.md`
19
- - `857` ships `AGENT_START.md`, `ROUTE_PACKET.yaml`, `CHECKPOINT_PACKET.md`, `REPORT_PACKET.md`
18
+ - `20` ships `AGENT_START.md`, `ROUTE_PACKET.yaml`, `CHECKPOINT_PACKET.md`, `REPORT_PACKET.md`, `ATOMIC_BOARD.yaml`, `ATOMIC_BOARD.md`
19
+ - `857` ships `AGENT_START.md`, `ROUTE_PACKET.yaml`, `CHECKPOINT_PACKET.md`, `REPORT_PACKET.md`, `ATOMIC_BOARD.yaml`, `ATOMIC_BOARD.md`
20
+
21
+ Bridge packets:
22
+ - `536` ships `AGENT_START.md`, `ROUTE_PACKET.yaml`, `CHECKPOINT_PACKET.md`, `REPORT_PACKET.md`, `ATOMIC_BOARD.yaml`, `ATOMIC_BOARD.md`
23
+ - `856` ships `AGENT_START.md`, `ROUTE_PACKET.yaml`, `CHECKPOINT_PACKET.md`, `REPORT_PACKET.md`, `ATOMIC_BOARD.yaml`, `ATOMIC_BOARD.md`
@@ -0,0 +1,45 @@
1
+ # Problem 20 Atomic Board Packet
2
+
3
+ - Profile: `deep_atomic_ops`
4
+ - Source board JSON: `sunflower-coda/repo/analysis/problem20_k3_gateboard.json`
5
+ - Source board markdown: `sunflower-coda/repo/docs/PROBLEM20_K3_OPS_BOARD.md`
6
+ - Module target: `sunflower-coda/repo/sunflower_lean/SunflowerLean/ErdosProblem20.lean`
7
+
8
+ ## Route Status
9
+
10
+ | Route | Loose | Strict |
11
+ |---|---:|---:|
12
+ | `uniform_prize` | `7/7` | `7/7` |
13
+ | `uniform_prize_final_k3` | `5/5` | `5/5` |
14
+ | `uniform_prize_full_all_k` | `0/1` | `0/1` |
15
+
16
+ ## Ticket Board
17
+
18
+ | Ticket | Leaf | Status | Gates | Atoms |
19
+ |---|---|---|---:|---:|
20
+ | `T1` | `UniformBoundF3Global` | `done` | `5/5` | `16/16` |
21
+ | `T2` | `UniformBoundF4Global` | `done` | `5/5` | `15/15` |
22
+ | `T3` | `UniformBoundF5Global` | `done` | `5/5` | `15/15` |
23
+ | `T4` | `UniformBoundF6Global` | `done` | `5/5` | `15/15` |
24
+ | `T5` | `UniformK3EnvelopeFrom7WithPolySlack` | `done` | `5/5` | `15/15` |
25
+ | `T6` | `UniformK3From7BaseRangeHyp` | `open` | `5/5` | `77/77` |
26
+
27
+ ## First-Principles Ladder
28
+
29
+ | Tier | Done |
30
+ |---|---:|
31
+ | `P0-SpecLock` | `18/18` |
32
+ | `P1-StructuralKernel` | `18/18` |
33
+ | `P2-QuantAssembly` | `13/13` |
34
+ | `P3-InterfaceLift` | `18/18` |
35
+ | `P4-Verification` | `86/86` |
36
+
37
+ ## Ready Queue
38
+
39
+ - *(none)*
40
+
41
+ ## Public-Pack Interpretation
42
+
43
+ - The public pack mirrors a lab board where the `uniform_prize_final_k3` route is closed.
44
+ - The support lane `T6` remains visible because it carries future reusable witness-construction pressure.
45
+ - The honest next move is not a dependency-satisfied atom today; it is to freeze the next support-lane witness packet before pretending progress is locally admissible.
@@ -0,0 +1,98 @@
1
+ board_packet_id: strong20_uniform_k3_atomic_board_v1
2
+ board_profile: deep_atomic_ops
3
+ board_title: Problem 20 K=3 Closure Ops Board
4
+ problem_id: "20"
5
+ active_route: uniform_k3_frontier
6
+ frontier_claim: Keep the public strong-sunflower pack aligned with the live k=3 closure board and surface the remaining support-lane pressure honestly.
7
+ module_target: sunflower-coda/repo/sunflower_lean/SunflowerLean/ErdosProblem20.lean
8
+ source_kind: mirrored_from_lab
9
+ source_board_json: sunflower-coda/repo/analysis/problem20_k3_gateboard.json
10
+ source_board_markdown: sunflower-coda/repo/docs/PROBLEM20_K3_OPS_BOARD.md
11
+ active_ticket_id: T6
12
+ route_status:
13
+ - route: uniform_prize
14
+ loose_done: 7
15
+ loose_total: 7
16
+ strict_done: 7
17
+ strict_total: 7
18
+ - route: uniform_prize_final_k3
19
+ loose_done: 5
20
+ loose_total: 5
21
+ strict_done: 5
22
+ strict_total: 5
23
+ - route: uniform_prize_full_all_k
24
+ loose_done: 0
25
+ loose_total: 1
26
+ strict_done: 0
27
+ strict_total: 1
28
+ tickets:
29
+ - ticket_id: T1
30
+ ticket_name: "Closure Lane T1: UniformBoundF3Global"
31
+ route_leaf: UniformBoundF3Global
32
+ leaf_status: done
33
+ gates_done: 5
34
+ gates_total: 5
35
+ atoms_done: 16
36
+ atoms_total: 16
37
+ - ticket_id: T2
38
+ ticket_name: "Closure Lane T2: UniformBoundF4Global"
39
+ route_leaf: UniformBoundF4Global
40
+ leaf_status: done
41
+ gates_done: 5
42
+ gates_total: 5
43
+ atoms_done: 15
44
+ atoms_total: 15
45
+ - ticket_id: T3
46
+ ticket_name: "Closure Lane T3: UniformBoundF5Global"
47
+ route_leaf: UniformBoundF5Global
48
+ leaf_status: done
49
+ gates_done: 5
50
+ gates_total: 5
51
+ atoms_done: 15
52
+ atoms_total: 15
53
+ - ticket_id: T4
54
+ ticket_name: "Closure Lane T4: UniformBoundF6Global"
55
+ route_leaf: UniformBoundF6Global
56
+ leaf_status: done
57
+ gates_done: 5
58
+ gates_total: 5
59
+ atoms_done: 15
60
+ atoms_total: 15
61
+ - ticket_id: T5
62
+ ticket_name: "Closure Lane T5: UniformK3EnvelopeFrom7WithPolySlack"
63
+ route_leaf: UniformK3EnvelopeFrom7WithPolySlack
64
+ leaf_status: done
65
+ gates_done: 5
66
+ gates_total: 5
67
+ atoms_done: 15
68
+ atoms_total: 15
69
+ - ticket_id: T6
70
+ ticket_name: "Support Lane T6: UniformK3From7 Base/Step Witness Construction"
71
+ route_leaf: UniformK3From7BaseRangeHyp
72
+ leaf_status: open
73
+ gates_done: 5
74
+ gates_total: 5
75
+ atoms_done: 77
76
+ atoms_total: 77
77
+ ladder:
78
+ - tier: P0-SpecLock
79
+ done: 18
80
+ total: 18
81
+ - tier: P1-StructuralKernel
82
+ done: 18
83
+ total: 18
84
+ - tier: P2-QuantAssembly
85
+ done: 13
86
+ total: 13
87
+ - tier: P3-InterfaceLift
88
+ done: 18
89
+ total: 18
90
+ - tier: P4-Verification
91
+ done: 86
92
+ total: 86
93
+ ready_queue: []
94
+ mirage_frontiers: []
95
+ notes:
96
+ - Mirrored from the live sunflower-coda problem-20 lab board; counts reflect the lab closure/support frontier.
97
+ - The final k=3 route is closed in the mirrored board.
98
+ - The support lane remains open but currently has no dependency-satisfied ready atom.
@@ -0,0 +1,15 @@
1
+ # Problem 536 Agent Start
2
+
3
+ Start here:
4
+ - treat `536` as a sunflower-family bridge problem, not a deep theorem harness yet
5
+ - read the dossier, the pack context, and the atomic bridge board together
6
+ - preserve the exact relation to `857`, `856`, and `20`
7
+
8
+ First loop:
9
+ - verify the publicized open status with the seeded public-status review
10
+ - freeze the exact statement and reference surface
11
+ - record the cleanest natural-density analogue back to the weak sunflower program
12
+
13
+ Do not do:
14
+ - do not pretend `536` already has Lean-scanner route depth
15
+ - do not overclaim progress on `857` from a loose analogy note alone
@@ -0,0 +1,25 @@
1
+ # Problem 536 Bridge Board Packet
2
+
3
+ - Profile: `dossier_bridge`
4
+ - Source kind: `public_pack_bridge`
5
+
6
+ ## Route Status
7
+
8
+ | Route | Loose | Strict |
9
+ |---|---:|---:|
10
+ | `natural_density_lcm_bridge` | `0/3` | `0/3` |
11
+
12
+ ## Active Ticket
13
+
14
+ | Ticket | Leaf | Status | Gates | Atoms |
15
+ |---|---|---|---:|---:|
16
+ | `T1` Dossier Source Lock | `public_status_and_statement_lock` | `open` | `1/3` | `2/6` |
17
+
18
+ ## Ready Queue
19
+
20
+ - `T1.G1.A3`: Run the public-status review and freeze the exact open-state snapshot for problem `536`
21
+
22
+ ## Notes
23
+
24
+ - This board is intentionally lighter than the theorem-engine boards for `20` and `857`.
25
+ - It exists to give agents a disciplined analogue bridge workflow instead of a loose note-taking lane.
@@ -0,0 +1,62 @@
1
+ board_packet_id: sunflower536_bridge_board_v1
2
+ board_profile: dossier_bridge
3
+ board_title: Problem 536 Natural-Density LCM Bridge Board
4
+ problem_id: "536"
5
+ active_route: natural_density_lcm_bridge
6
+ frontier_claim: Keep 536 research-ready by freezing public status, exact analogue statements, and explicit bridge artifacts back to 857.
7
+ module_target: ""
8
+ source_kind: public_pack_bridge
9
+ active_ticket_id: T1
10
+ route_status:
11
+ - route: natural_density_lcm_bridge
12
+ loose_done: 0
13
+ loose_total: 3
14
+ strict_done: 0
15
+ strict_total: 3
16
+ tickets:
17
+ - ticket_id: T1
18
+ ticket_name: Dossier Source Lock
19
+ route_leaf: public_status_and_statement_lock
20
+ leaf_status: open
21
+ gates_done: 1
22
+ gates_total: 3
23
+ atoms_done: 2
24
+ atoms_total: 6
25
+ - ticket_id: T2
26
+ ticket_name: Analogue Translation Bridge
27
+ route_leaf: lcm_analogue_bridge_note
28
+ leaf_status: open
29
+ gates_done: 0
30
+ gates_total: 3
31
+ atoms_done: 0
32
+ atoms_total: 6
33
+ - ticket_id: T3
34
+ ticket_name: Transfer Back To 857
35
+ route_leaf: density_to_weak_sunflower_hook
36
+ leaf_status: open
37
+ gates_done: 0
38
+ gates_total: 3
39
+ atoms_done: 0
40
+ atoms_total: 6
41
+ ladder:
42
+ - tier: P0-SpecLock
43
+ done: 2
44
+ total: 6
45
+ - tier: P1-StructuralKernel
46
+ done: 0
47
+ total: 6
48
+ - tier: P2-QuantAssembly
49
+ done: 0
50
+ total: 6
51
+ ready_queue:
52
+ - atom_id: T1.G1.A3
53
+ ticket_id: T1
54
+ gate_id: T1.G1
55
+ tier: P0-SpecLock
56
+ kind: review
57
+ title: Run the public-status review and freeze the exact open-state snapshot for problem 536
58
+ status: ready
59
+ mirage_frontiers: []
60
+ notes:
61
+ - This is a public-pack bridge board, not a Lean-scanner board.
62
+ - Counts track dossier and bridge completeness so agents can move with the same disciplined loop as the deep sunflower problems.
@@ -0,0 +1,11 @@
1
+ # Problem 536 Checkpoint Packet
2
+
3
+ Checkpoint when one of these becomes true:
4
+ - the public-status review is refreshed and clearly archived
5
+ - the exact analogue statement is normalized in dossier language
6
+ - a crisp bridge note back to `857` is written and cited
7
+
8
+ What to record:
9
+ - upstream/site/public-search provenance
10
+ - exact wording of the analogue
11
+ - what changed for the next agent
@@ -0,0 +1,11 @@
1
+ # Problem 536 Report Packet
2
+
3
+ Public-facing report shape:
4
+ - open problem status
5
+ - natural-density LCM framing
6
+ - relation to `857`, `856`, and `20`
7
+ - exact artifacts pulled this pass
8
+ - next honest bridge move
9
+
10
+ Avoid:
11
+ - speaking as if a theorem-harness closure happened here unless a real deeper pack is added later
@@ -0,0 +1,13 @@
1
+ route_packet_id: sunflower536_natural_density_bridge_v1
2
+ route_id: natural_density_lcm_bridge
3
+ frontier_claim: Keep the natural-density LCM analogue synchronized with the weak sunflower program and preserve an honest bridge from public status to research artifacts.
4
+ theorem_module: ""
5
+ checkpoint_packet: CHECKPOINT_PACKET.md
6
+ report_packet: REPORT_PACKET.md
7
+ ready_prompts:
8
+ - Which exact combinatorial-to-number-theoretic bridge from 536 to 857 should be frozen next?
9
+ - Which public-status or reference artifact is still missing from the 536 dossier bridge?
10
+ verification_hook:
11
+ - erdos sunflower status 536
12
+ - erdos sunflower board 536
13
+ - erdos problem artifacts 536 --json
@@ -0,0 +1,15 @@
1
+ # Problem 856 Agent Start
2
+
3
+ Start here:
4
+ - treat `856` as the harmonic-density / logarithmic-density LCM analogue inside the sunflower quartet
5
+ - keep the exponent-transfer story back to `857` explicit
6
+ - use the bridge board rather than improvising a loose literature pass
7
+
8
+ First loop:
9
+ - verify the publicized open status with the seeded public-status review
10
+ - freeze the exact statement and density language
11
+ - record how progress here would alter `857`-style exponent expectations
12
+
13
+ Do not do:
14
+ - do not pretend `856` already has the same theorem-board depth as `20` or `857`
15
+ - do not state an exponent consequence unless the supporting bridge artifact is explicitly written down
@@ -0,0 +1,25 @@
1
+ # Problem 856 Bridge Board Packet
2
+
3
+ - Profile: `dossier_bridge`
4
+ - Source kind: `public_pack_bridge`
5
+
6
+ ## Route Status
7
+
8
+ | Route | Loose | Strict |
9
+ |---|---:|---:|
10
+ | `harmonic_density_lcm_bridge` | `0/3` | `0/3` |
11
+
12
+ ## Active Ticket
13
+
14
+ | Ticket | Leaf | Status | Gates | Atoms |
15
+ |---|---|---|---:|---:|
16
+ | `T1` Dossier Source Lock | `public_status_and_density_lock` | `open` | `1/3` | `2/6` |
17
+
18
+ ## Ready Queue
19
+
20
+ - `T1.G1.A3`: Run the public-status review and freeze the exact open-state snapshot for problem `856`
21
+
22
+ ## Notes
23
+
24
+ - This board is intentionally lighter than the theorem-engine boards for `20` and `857`.
25
+ - It keeps the `856` to `857` exponent bridge explicit instead of leaving it as an unstructured literature hunch.
@@ -0,0 +1,62 @@
1
+ board_packet_id: sunflower856_bridge_board_v1
2
+ board_profile: dossier_bridge
3
+ board_title: Problem 856 Harmonic-Density LCM Bridge Board
4
+ problem_id: "856"
5
+ active_route: harmonic_density_lcm_bridge
6
+ frontier_claim: Keep 856 research-ready by freezing public status, exact density-language statements, and explicit exponent-transfer artifacts back to 857.
7
+ module_target: ""
8
+ source_kind: public_pack_bridge
9
+ active_ticket_id: T1
10
+ route_status:
11
+ - route: harmonic_density_lcm_bridge
12
+ loose_done: 0
13
+ loose_total: 3
14
+ strict_done: 0
15
+ strict_total: 3
16
+ tickets:
17
+ - ticket_id: T1
18
+ ticket_name: Dossier Source Lock
19
+ route_leaf: public_status_and_density_lock
20
+ leaf_status: open
21
+ gates_done: 1
22
+ gates_total: 3
23
+ atoms_done: 2
24
+ atoms_total: 6
25
+ - ticket_id: T2
26
+ ticket_name: Density Translation Bridge
27
+ route_leaf: harmonic_density_bridge_note
28
+ leaf_status: open
29
+ gates_done: 0
30
+ gates_total: 3
31
+ atoms_done: 0
32
+ atoms_total: 6
33
+ - ticket_id: T3
34
+ ticket_name: Exponent Transfer Back To 857
35
+ route_leaf: exponent_transfer_hook
36
+ leaf_status: open
37
+ gates_done: 0
38
+ gates_total: 3
39
+ atoms_done: 0
40
+ atoms_total: 6
41
+ ladder:
42
+ - tier: P0-SpecLock
43
+ done: 2
44
+ total: 6
45
+ - tier: P1-StructuralKernel
46
+ done: 0
47
+ total: 6
48
+ - tier: P2-QuantAssembly
49
+ done: 0
50
+ total: 6
51
+ ready_queue:
52
+ - atom_id: T1.G1.A3
53
+ ticket_id: T1
54
+ gate_id: T1.G1
55
+ tier: P0-SpecLock
56
+ kind: review
57
+ title: Run the public-status review and freeze the exact open-state snapshot for problem 856
58
+ status: ready
59
+ mirage_frontiers: []
60
+ notes:
61
+ - This is a public-pack bridge board, not a Lean-scanner board.
62
+ - Counts track dossier and bridge completeness so the exponent-transfer story stays explicit and checkpointable.
@@ -0,0 +1,11 @@
1
+ # Problem 856 Checkpoint Packet
2
+
3
+ Checkpoint when one of these becomes true:
4
+ - the public-status review is refreshed and archived
5
+ - the exact density-language statement is normalized in dossier form
6
+ - an explicit exponent-transfer note back to `857` is written
7
+
8
+ What to record:
9
+ - provenance for the status review
10
+ - exact wording of the density analogue
11
+ - what changed in the `856` to `857` bridge story
@@ -0,0 +1,11 @@
1
+ # Problem 856 Report Packet
2
+
3
+ Public-facing report shape:
4
+ - open problem status
5
+ - harmonic-density / logarithmic-density framing
6
+ - relation to `857`, `536`, and `20`
7
+ - exact artifacts pulled or normalized this pass
8
+ - next honest exponent-transfer move
9
+
10
+ Avoid:
11
+ - claiming more than a dossier/bridge advance unless a deeper theorem harness is actually added later
@@ -0,0 +1,13 @@
1
+ route_packet_id: sunflower856_harmonic_density_bridge_v1
2
+ route_id: harmonic_density_lcm_bridge
3
+ frontier_claim: Keep the harmonic-density LCM analogue synchronized with the weak sunflower program and preserve explicit exponent-transfer artifacts.
4
+ theorem_module: ""
5
+ checkpoint_packet: CHECKPOINT_PACKET.md
6
+ report_packet: REPORT_PACKET.md
7
+ ready_prompts:
8
+ - Which exact exponent-transfer statement from 856 back to 857 should be frozen next?
9
+ - Which density-language artifact is still missing from the 856 bridge dossier?
10
+ verification_hook:
11
+ - erdos sunflower status 856
12
+ - erdos sunflower board 856
13
+ - erdos problem artifacts 856 --json
@@ -0,0 +1,52 @@
1
+ # Problem 857 Atomic Board Packet
2
+
3
+ - Profile: `deep_atomic_ops`
4
+ - Source board JSON: `sunflower-coda/repo/analysis/problem857_redesign_gateboard.json`
5
+ - Source board markdown: `sunflower-coda/repo/docs/PROBLEM857_REDESIGN_OPS_BOARD.md`
6
+ - Module target: `sunflower-coda/repo/sunflower_lean/SunflowerLean/ObstructionExport.lean`
7
+
8
+ ## Route Status
9
+
10
+ | Route | Loose | Strict |
11
+ |---|---:|---:|
12
+ | `o1a_foundation` | `2/3` | `2/3` |
13
+ | `o1a_certificate_reduction` | `3/4` | `3/4` |
14
+ | `o1a_residual_router` | `2/5` | `2/5` |
15
+ | `o1a_hard_upgrade` | `1/5` | `1/5` |
16
+ | `b2_recurrence_spine` | `0/4` | `0/4` |
17
+ | `post_counting_redesign` | `3/9` | `3/9` |
18
+ | `global_family_card_export` | `1/1` | `1/1` |
19
+ | `chain_bucket_export` | `1/1` | `1/1` |
20
+ | `pair_count_export` | `1/1` | `1/1` |
21
+ | `core_slice_square_export` | `1/1` | `1/1` |
22
+ | `m_cube_export` | `1/1` | `1/1` |
23
+ | `explicit_remainder_export` | `1/1` | `1/1` |
24
+ | `explicit_M_remainder_export` | `1/1` | `1/1` |
25
+ | `o1a_existential_explicit_export` | `1/1` | `1/1` |
26
+ | `anchored_selector_linearization` | `0/1` | `0/1` |
27
+
28
+ ## Active Ticket
29
+
30
+ | Ticket | Leaf | Status | Gates | Atoms |
31
+ |---|---|---|---:|---:|
32
+ | `T10` Route Redesign T10: Anchored-Selector Linearization | `anchored_selector_linearization_realized` | `open` | `2/5` | `9/15` |
33
+
34
+ ## Ready Queue
35
+
36
+ - `T10.G3.A2`: Promote the helper/theorem stack into `anchored_selector_linearization_realized`
37
+
38
+ ## First-Principles Ladder
39
+
40
+ | Tier | Done |
41
+ |---|---:|
42
+ | `P0-SpecLock` | `30/30` |
43
+ | `P1-StructuralKernel` | `30/30` |
44
+ | `P2-QuantAssembly` | `24/30` |
45
+ | `P3-InterfaceLift` | `24/30` |
46
+ | `P4-Verification` | `26/30` |
47
+
48
+ ## Public-Pack Interpretation
49
+
50
+ - This packet mirrors the live redesign board rather than inventing a new public abstraction.
51
+ - The honest next atom is already known and dependency-satisfied.
52
+ - The public sunflower pack should therefore present `857` as a route with a concrete active atom, not just a broad frontier label.
@@ -0,0 +1,197 @@
1
+ board_packet_id: weak857_anchored_selector_atomic_board_v1
2
+ board_profile: deep_atomic_ops
3
+ board_title: Problem 857 Post-Counting Redesign + Anchored-Selector Linearization Ops Board
4
+ problem_id: "857"
5
+ active_route: anchored_selector_linearization
6
+ frontier_claim: Keep the public weak-sunflower pack aligned with the live anchored-selector frontier and expose the exact dependency-satisfied atom honestly.
7
+ module_target: sunflower-coda/repo/sunflower_lean/SunflowerLean/ObstructionExport.lean
8
+ source_kind: mirrored_from_lab
9
+ source_board_json: sunflower-coda/repo/analysis/problem857_redesign_gateboard.json
10
+ source_board_markdown: sunflower-coda/repo/docs/PROBLEM857_REDESIGN_OPS_BOARD.md
11
+ active_ticket_id: T10
12
+ route_status:
13
+ - route: o1a_foundation
14
+ loose_done: 2
15
+ loose_total: 3
16
+ strict_done: 2
17
+ strict_total: 3
18
+ - route: o1a_certificate_reduction
19
+ loose_done: 3
20
+ loose_total: 4
21
+ strict_done: 3
22
+ strict_total: 4
23
+ - route: o1a_residual_router
24
+ loose_done: 2
25
+ loose_total: 5
26
+ strict_done: 2
27
+ strict_total: 5
28
+ - route: o1a_hard_upgrade
29
+ loose_done: 1
30
+ loose_total: 5
31
+ strict_done: 1
32
+ strict_total: 5
33
+ - route: b2_recurrence_spine
34
+ loose_done: 0
35
+ loose_total: 4
36
+ strict_done: 0
37
+ strict_total: 4
38
+ - route: post_counting_redesign
39
+ loose_done: 3
40
+ loose_total: 9
41
+ strict_done: 3
42
+ strict_total: 9
43
+ - route: global_family_card_export
44
+ loose_done: 1
45
+ loose_total: 1
46
+ strict_done: 1
47
+ strict_total: 1
48
+ - route: chain_bucket_export
49
+ loose_done: 1
50
+ loose_total: 1
51
+ strict_done: 1
52
+ strict_total: 1
53
+ - route: pair_count_export
54
+ loose_done: 1
55
+ loose_total: 1
56
+ strict_done: 1
57
+ strict_total: 1
58
+ - route: core_slice_square_export
59
+ loose_done: 1
60
+ loose_total: 1
61
+ strict_done: 1
62
+ strict_total: 1
63
+ - route: m_cube_export
64
+ loose_done: 1
65
+ loose_total: 1
66
+ strict_done: 1
67
+ strict_total: 1
68
+ - route: explicit_remainder_export
69
+ loose_done: 1
70
+ loose_total: 1
71
+ strict_done: 1
72
+ strict_total: 1
73
+ - route: explicit_M_remainder_export
74
+ loose_done: 1
75
+ loose_total: 1
76
+ strict_done: 1
77
+ strict_total: 1
78
+ - route: o1a_existential_explicit_export
79
+ loose_done: 1
80
+ loose_total: 1
81
+ strict_done: 1
82
+ strict_total: 1
83
+ - route: anchored_selector_linearization
84
+ loose_done: 0
85
+ loose_total: 1
86
+ strict_done: 0
87
+ strict_total: 1
88
+ tickets:
89
+ - ticket_id: T1
90
+ ticket_name: "Route Redesign T1: Type-II Split Foundation"
91
+ route_leaf: typeII_bridge_v4
92
+ leaf_status: done
93
+ gates_done: 5
94
+ gates_total: 5
95
+ atoms_done: 15
96
+ atoms_total: 15
97
+ - ticket_id: T2
98
+ ticket_name: "Route Redesign T2: O1a Router and Core Split"
99
+ route_leaf: o1a_router_split_core_or_chain
100
+ leaf_status: open
101
+ gates_done: 5
102
+ gates_total: 5
103
+ atoms_done: 15
104
+ atoms_total: 15
105
+ - ticket_id: T3
106
+ ticket_name: "Route Redesign T3: Hard-Branch Certificate Reduction"
107
+ route_leaf: wlcert_hNotMem_reduction_o1aDomWL
108
+ leaf_status: done
109
+ gates_done: 5
110
+ gates_total: 5
111
+ atoms_done: 15
112
+ atoms_total: 15
113
+ - ticket_id: T4
114
+ ticket_name: "Route Redesign T4: Residual-Aware Router Leaf"
115
+ route_leaf: o1a_router_WmaxAt_reservoir_or_residual
116
+ leaf_status: open
117
+ gates_done: 5
118
+ gates_total: 5
119
+ atoms_done: 15
120
+ atoms_total: 15
121
+ - ticket_id: T5
122
+ ticket_name: "Route Redesign T5: Historical Hard Upgrade Interface"
123
+ route_leaf: o1a_upgrade_hasH_to_WmaxAt
124
+ leaf_status: open
125
+ gates_done: 2
126
+ gates_total: 5
127
+ atoms_done: 6
128
+ atoms_total: 15
129
+ - ticket_id: T6
130
+ ticket_name: "Route Redesign T6: B2 Recurrence Spine"
131
+ route_leaf: keyBadAgg_builder_on_minFiber_hardUpgrade
132
+ leaf_status: open
133
+ gates_done: 5
134
+ gates_total: 5
135
+ atoms_done: 15
136
+ atoms_total: 15
137
+ - ticket_id: T7
138
+ ticket_name: "Route Redesign T7: Global Family-Card Export"
139
+ route_leaf: global_family_card_export_under_O1aUpgradeRegime
140
+ leaf_status: done
141
+ gates_done: 5
142
+ gates_total: 5
143
+ atoms_done: 15
144
+ atoms_total: 15
145
+ - ticket_id: T8
146
+ ticket_name: "Route Redesign T8: Explicit Polynomial Remainder Export"
147
+ route_leaf: global_family_card_export_with_explicit_M_remainder_under_O1aUpgradeRegime
148
+ leaf_status: done
149
+ gates_done: 5
150
+ gates_total: 5
151
+ atoms_done: 15
152
+ atoms_total: 15
153
+ - ticket_id: T9
154
+ ticket_name: "Route Redesign T9: O1a Existential Explicit Export"
155
+ route_leaf: exists_anchor_with_explicit_M_remainder_export_of_ObstructionO1a
156
+ leaf_status: done
157
+ gates_done: 5
158
+ gates_total: 5
159
+ atoms_done: 15
160
+ atoms_total: 15
161
+ - ticket_id: T10
162
+ ticket_name: "Route Redesign T10: Anchored-Selector Linearization"
163
+ route_leaf: anchored_selector_linearization_realized
164
+ leaf_status: open
165
+ gates_done: 2
166
+ gates_total: 5
167
+ atoms_done: 9
168
+ atoms_total: 15
169
+ ladder:
170
+ - tier: P0-SpecLock
171
+ done: 30
172
+ total: 30
173
+ - tier: P1-StructuralKernel
174
+ done: 30
175
+ total: 30
176
+ - tier: P2-QuantAssembly
177
+ done: 24
178
+ total: 30
179
+ - tier: P3-InterfaceLift
180
+ done: 24
181
+ total: 30
182
+ - tier: P4-Verification
183
+ done: 26
184
+ total: 30
185
+ ready_queue:
186
+ - atom_id: T10.G3.A2
187
+ ticket_id: T10
188
+ gate_id: T10.G3
189
+ tier: P2-QuantAssembly
190
+ kind: work
191
+ title: Promote the helper/theorem stack into anchored_selector_linearization_realized
192
+ status: ready
193
+ mirage_frontiers: []
194
+ notes:
195
+ - Mirrored from the live sunflower-coda problem-857 lab board; counts reflect the current publicized redesign frontier.
196
+ - The first dependency-satisfied atom is T10.G3.A2, and the public pack should surface it directly rather than hiding it behind generic route language.
197
+ - Historical tickets such as T5 stay visible because they still matter for context, but T10 is the active public frontier.
package/src/cli/index.js CHANGED
@@ -36,6 +36,7 @@ function printUsage() {
36
36
  console.log(' erdos preflight [--allow-dirty] [--json]');
37
37
  console.log(' erdos checkpoints sync [--json]');
38
38
  console.log(' erdos sunflower status [<id>] [--json]');
39
+ console.log(' erdos sunflower board [<id>] [--json]');
39
40
  console.log(' erdos dossier show <id>');
40
41
  console.log(' erdos upstream show');
41
42
  console.log(' erdos upstream sync [--write-package-snapshot]');
@@ -25,6 +25,10 @@ function parseStatusArgs(args) {
25
25
  return parsed;
26
26
  }
27
27
 
28
+ function parseBoardArgs(args) {
29
+ return parseStatusArgs(args);
30
+ }
31
+
28
32
  function printSunflowerStatus(snapshot, registryPaths) {
29
33
  console.log(`${snapshot.displayName} sunflower harness`);
30
34
  console.log(`Title: ${snapshot.title}`);
@@ -51,6 +55,26 @@ function printSunflowerStatus(snapshot, registryPaths) {
51
55
  console.log(`Route frontier claim: ${snapshot.routePacket.frontierClaim ?? '(none)'}`);
52
56
  console.log(`Theorem module: ${snapshot.routePacket.theoremModule ?? '(none)'}`);
53
57
  }
58
+ console.log(`Atomic board present: ${snapshot.atomicBoardPresent ? 'yes' : 'no'}`);
59
+ if (snapshot.atomicBoardSummary) {
60
+ console.log(`Atomic board: ${snapshot.atomicBoardSummary.boardTitle ?? '(none)'}`);
61
+ console.log(`Atomic board profile: ${snapshot.atomicBoardSummary.boardProfile ?? '(none)'}`);
62
+ console.log(`Atomic board route: ${snapshot.atomicBoardSummary.activeRoute ?? '(none)'}`);
63
+ console.log(`Atomic board claim: ${snapshot.atomicBoardSummary.frontierClaim ?? '(none)'}`);
64
+ console.log(`Atomic board module: ${snapshot.atomicBoardSummary.moduleTarget ?? '(none)'}`);
65
+ if (snapshot.activeTicket) {
66
+ console.log(
67
+ `Atomic board active ticket: ${snapshot.activeTicket.ticketId} ${snapshot.activeTicket.ticketName} `
68
+ + `[${snapshot.activeTicket.gatesDone}/${snapshot.activeTicket.gatesTotal} gates, `
69
+ + `${snapshot.activeTicket.atomsDone}/${snapshot.activeTicket.atomsTotal} atoms]`,
70
+ );
71
+ }
72
+ console.log(`Atomic board ready atoms: ${snapshot.readyAtomCount}`);
73
+ console.log(`Atomic board mirage frontiers: ${snapshot.mirageFrontierCount}`);
74
+ if (snapshot.firstReadyAtom) {
75
+ console.log(`Atomic board first ready atom: ${snapshot.firstReadyAtom.atomId} — ${snapshot.firstReadyAtom.title}`);
76
+ }
77
+ }
54
78
  console.log(`Agent start packet: ${snapshot.agentStartPresent ? snapshot.agentStartPath : '(missing)'}`);
55
79
  console.log(`Checkpoint packet: ${snapshot.checkpointPacketPresent ? snapshot.checkpointPacketPath : '(missing)'}`);
56
80
  console.log(`Report packet: ${snapshot.reportPacketPresent ? snapshot.reportPacketPath : '(missing)'}`);
@@ -76,21 +100,107 @@ function printSunflowerStatus(snapshot, registryPaths) {
76
100
  console.log(`Registry record: ${registryPaths.latestPath}`);
77
101
  }
78
102
 
103
+ function printSunflowerBoard(snapshot) {
104
+ const board = snapshot.atomicBoardSummary;
105
+ if (!board) {
106
+ console.log(`${snapshot.displayName} has no packaged sunflower board yet.`);
107
+ return;
108
+ }
109
+
110
+ console.log(`${snapshot.displayName} sunflower board`);
111
+ console.log(`Title: ${board.boardTitle}`);
112
+ console.log(`Profile: ${board.boardProfile ?? '(none)'}`);
113
+ console.log(`Active route: ${board.activeRoute ?? '(none)'}`);
114
+ console.log(`Frontier claim: ${board.frontierClaim ?? '(none)'}`);
115
+ console.log(`Module target: ${board.moduleTarget ?? '(none)'}`);
116
+ console.log(`Source kind: ${board.sourceKind ?? '(none)'}`);
117
+ console.log(`Source board json: ${board.sourceBoardJson ?? '(none)'}`);
118
+ console.log(`Source board markdown: ${board.sourceBoardMarkdown ?? '(none)'}`);
119
+ console.log(`Board packet: ${board.atomicBoardPath}`);
120
+ console.log(`Board markdown: ${board.atomicBoardMarkdownPath ?? '(missing)'}`);
121
+ console.log(`Ready atoms: ${snapshot.readyAtomCount}`);
122
+ console.log(`Mirage frontiers: ${snapshot.mirageFrontierCount}`);
123
+ if (snapshot.activeTicket) {
124
+ console.log(
125
+ `Active ticket: ${snapshot.activeTicket.ticketId} ${snapshot.activeTicket.ticketName} `
126
+ + `[leaf=${snapshot.activeTicket.routeLeaf ?? '(none)'}, `
127
+ + `status=${snapshot.activeTicket.leafStatus ?? '(none)'}, `
128
+ + `gates=${snapshot.activeTicket.gatesDone}/${snapshot.activeTicket.gatesTotal}, `
129
+ + `atoms=${snapshot.activeTicket.atomsDone}/${snapshot.activeTicket.atomsTotal}]`,
130
+ );
131
+ }
132
+
133
+ console.log('Route status:');
134
+ if (board.routeStatus.length === 0) {
135
+ console.log(' (none)');
136
+ } else {
137
+ for (const route of board.routeStatus) {
138
+ console.log(
139
+ ` - ${route.route}: loose ${route.looseDone}/${route.looseTotal}, `
140
+ + `strict ${route.strictDone}/${route.strictTotal}`,
141
+ );
142
+ }
143
+ }
144
+
145
+ console.log('Ticket board:');
146
+ if (board.tickets.length === 0) {
147
+ console.log(' (none)');
148
+ } else {
149
+ for (const ticket of board.tickets) {
150
+ console.log(
151
+ ` - ${ticket.ticketId} ${ticket.ticketName}: ${ticket.routeLeaf ?? '(none)'} `
152
+ + `[leaf=${ticket.leafStatus ?? '(none)'}, gates=${ticket.gatesDone}/${ticket.gatesTotal}, `
153
+ + `atoms=${ticket.atomsDone}/${ticket.atomsTotal}]`,
154
+ );
155
+ }
156
+ }
157
+
158
+ console.log('First-principles ladder:');
159
+ if (board.ladder.length === 0) {
160
+ console.log(' (none)');
161
+ } else {
162
+ for (const rung of board.ladder) {
163
+ console.log(` - ${rung.tier}: ${rung.done}/${rung.total}`);
164
+ }
165
+ }
166
+
167
+ console.log('Ready queue:');
168
+ if (board.readyQueue.length === 0) {
169
+ console.log(' (none)');
170
+ } else {
171
+ for (const atom of board.readyQueue) {
172
+ console.log(
173
+ ` - ${atom.atomId} (${atom.ticketId} / ${atom.gateId} / ${atom.tier ?? 'tier-unknown'}): ${atom.title}`,
174
+ );
175
+ }
176
+ }
177
+
178
+ console.log('Notes:');
179
+ if (board.notes.length === 0) {
180
+ console.log(' (none)');
181
+ } else {
182
+ for (const note of board.notes) {
183
+ console.log(` - ${note}`);
184
+ }
185
+ }
186
+ }
187
+
79
188
  export function runSunflowerCommand(args) {
80
189
  const [subcommand, ...rest] = args;
81
190
 
82
191
  if (!subcommand || subcommand === 'help' || subcommand === '--help') {
83
192
  console.log('Usage:');
84
193
  console.log(' erdos sunflower status [<id>] [--json]');
194
+ console.log(' erdos sunflower board [<id>] [--json]');
85
195
  return 0;
86
196
  }
87
197
 
88
- if (subcommand !== 'status') {
198
+ if (subcommand !== 'status' && subcommand !== 'board') {
89
199
  console.error(`Unknown sunflower subcommand: ${subcommand}`);
90
200
  return 1;
91
201
  }
92
202
 
93
- const parsed = parseStatusArgs(rest);
203
+ const parsed = subcommand === 'board' ? parseBoardArgs(rest) : parseStatusArgs(rest);
94
204
  if (parsed.error) {
95
205
  console.error(parsed.error);
96
206
  return 1;
@@ -121,6 +231,11 @@ export function runSunflowerCommand(args) {
121
231
  return 0;
122
232
  }
123
233
 
234
+ if (subcommand === 'board') {
235
+ printSunflowerBoard(snapshot);
236
+ return 0;
237
+ }
238
+
124
239
  printSunflowerStatus(snapshot, registryPaths);
125
240
  return 0;
126
241
  }
@@ -58,6 +58,14 @@ export function runWorkspaceCommand(args) {
58
58
  console.log(`Sunflower harness profile: ${sunflower.harnessProfile ?? '(none)'}`);
59
59
  console.log(`Sunflower route: ${sunflower.activeRoute ?? '(none)'}`);
60
60
  console.log(`Sunflower frontier: ${sunflower.frontierDetail ?? '(none)'}`);
61
+ console.log(`Sunflower board: ${sunflower.atomicBoardPresent ? 'yes' : 'no'}`);
62
+ if (sunflower.atomicBoardSummary) {
63
+ console.log(`Sunflower board title: ${sunflower.atomicBoardSummary.boardTitle ?? '(none)'}`);
64
+ console.log(`Sunflower board ready atoms: ${sunflower.readyAtomCount}`);
65
+ if (sunflower.firstReadyAtom) {
66
+ console.log(`Sunflower first ready atom: ${sunflower.firstReadyAtom.atomId} — ${sunflower.firstReadyAtom.title}`);
67
+ }
68
+ }
61
69
  console.log(`Sunflower compute: ${sunflower.computeLanePresent ? 'yes' : 'no'}`);
62
70
  if (sunflower.activePacket) {
63
71
  console.log(`Sunflower compute lane: ${sunflower.activePacket.laneId} [${sunflower.activePacket.status}]`);
@@ -55,6 +55,14 @@ function getSunflowerReportPacketPath(problemId) {
55
55
  return path.join(getSunflowerProblemDir(problemId), 'REPORT_PACKET.md');
56
56
  }
57
57
 
58
+ function getSunflowerAtomicBoardPath(problemId) {
59
+ return path.join(getSunflowerProblemDir(problemId), 'ATOMIC_BOARD.yaml');
60
+ }
61
+
62
+ function getSunflowerAtomicBoardMarkdownPath(problemId) {
63
+ return path.join(getSunflowerProblemDir(problemId), 'ATOMIC_BOARD.md');
64
+ }
65
+
58
66
  function parseStringList(value) {
59
67
  if (!Array.isArray(value)) {
60
68
  return [];
@@ -170,6 +178,129 @@ function readSunflowerRoutePacket(problemId) {
170
178
  };
171
179
  }
172
180
 
181
+ function parseBoardCountEntries(value) {
182
+ if (!Array.isArray(value)) {
183
+ return [];
184
+ }
185
+
186
+ return value
187
+ .filter((entry) => entry && typeof entry === 'object')
188
+ .map((entry) => ({
189
+ route: compactText(entry.route),
190
+ tier: compactText(entry.tier),
191
+ looseDone: Number(entry.loose_done ?? 0),
192
+ looseTotal: Number(entry.loose_total ?? 0),
193
+ strictDone: Number(entry.strict_done ?? 0),
194
+ strictTotal: Number(entry.strict_total ?? 0),
195
+ done: Number(entry.done ?? 0),
196
+ total: Number(entry.total ?? 0),
197
+ }));
198
+ }
199
+
200
+ function parseTicketEntries(value) {
201
+ if (!Array.isArray(value)) {
202
+ return [];
203
+ }
204
+
205
+ return value
206
+ .filter((entry) => entry && typeof entry === 'object')
207
+ .map((entry) => ({
208
+ ticketId: compactText(entry.ticket_id),
209
+ ticketName: compactText(entry.ticket_name),
210
+ routeLeaf: compactText(entry.route_leaf),
211
+ leafStatus: compactText(entry.leaf_status),
212
+ gatesDone: Number(entry.gates_done ?? 0),
213
+ gatesTotal: Number(entry.gates_total ?? 0),
214
+ atomsDone: Number(entry.atoms_done ?? 0),
215
+ atomsTotal: Number(entry.atoms_total ?? 0),
216
+ }));
217
+ }
218
+
219
+ function parseReadyQueue(value) {
220
+ if (!Array.isArray(value)) {
221
+ return [];
222
+ }
223
+
224
+ return value
225
+ .filter((entry) => entry && typeof entry === 'object')
226
+ .map((entry) => ({
227
+ atomId: compactText(entry.atom_id),
228
+ ticketId: compactText(entry.ticket_id),
229
+ gateId: compactText(entry.gate_id),
230
+ tier: compactText(entry.tier),
231
+ kind: compactText(entry.kind),
232
+ title: compactText(entry.title),
233
+ status: compactText(entry.status),
234
+ }));
235
+ }
236
+
237
+ function parseMirageFrontiers(value) {
238
+ if (Array.isArray(value)) {
239
+ return value
240
+ .map((entry) => compactText(entry))
241
+ .filter(Boolean);
242
+ }
243
+ if (value === null || value === undefined) {
244
+ return [];
245
+ }
246
+ const text = compactText(value);
247
+ return text ? [text] : [];
248
+ }
249
+
250
+ function chooseActiveTicket(board) {
251
+ if (!board) {
252
+ return null;
253
+ }
254
+
255
+ if (board.activeTicketId) {
256
+ const explicit = board.tickets.find((ticket) => ticket.ticketId === board.activeTicketId);
257
+ if (explicit) {
258
+ return explicit;
259
+ }
260
+ }
261
+
262
+ return board.tickets.find((ticket) => ticket.leafStatus !== 'done')
263
+ ?? board.tickets[0]
264
+ ?? null;
265
+ }
266
+
267
+ function readSunflowerAtomicBoard(problemId) {
268
+ const atomicBoardPath = getSunflowerAtomicBoardPath(problemId);
269
+ const atomicBoardMarkdownPath = getSunflowerAtomicBoardMarkdownPath(problemId);
270
+ if (!fs.existsSync(atomicBoardPath)) {
271
+ return null;
272
+ }
273
+
274
+ const parsed = parse(fs.readFileSync(atomicBoardPath, 'utf8')) ?? {};
275
+ const board = {
276
+ boardPacketId: compactText(parsed.board_packet_id),
277
+ boardProfile: compactText(parsed.board_profile),
278
+ boardTitle: compactText(parsed.board_title),
279
+ problemId: compactText(parsed.problem_id) ?? String(problemId),
280
+ activeRoute: compactText(parsed.active_route),
281
+ frontierClaim: compactText(parsed.frontier_claim),
282
+ moduleTarget: compactText(parsed.module_target),
283
+ sourceKind: compactText(parsed.source_kind),
284
+ sourceBoardJson: compactText(parsed.source_board_json),
285
+ sourceBoardMarkdown: compactText(parsed.source_board_markdown),
286
+ activeTicketId: compactText(parsed.active_ticket_id),
287
+ routeStatus: parseBoardCountEntries(parsed.route_status),
288
+ tickets: parseTicketEntries(parsed.tickets),
289
+ ladder: parseBoardCountEntries(parsed.ladder),
290
+ readyQueue: parseReadyQueue(parsed.ready_queue),
291
+ mirageFrontiers: parseMirageFrontiers(parsed.mirage_frontiers),
292
+ notes: parseStringList(parsed.notes),
293
+ atomicBoardPath,
294
+ atomicBoardMarkdownPath,
295
+ atomicBoardMarkdownExists: fs.existsSync(atomicBoardMarkdownPath),
296
+ };
297
+
298
+ return {
299
+ ...board,
300
+ activeTicket: chooseActiveTicket(board),
301
+ };
302
+ }
303
+
173
304
  function chooseActivePacket(packets) {
174
305
  if (packets.length === 0) {
175
306
  return null;
@@ -278,6 +409,33 @@ function compactPacket(packet) {
278
409
  };
279
410
  }
280
411
 
412
+ function compactAtomicBoard(board) {
413
+ if (!board) {
414
+ return null;
415
+ }
416
+
417
+ return {
418
+ boardPacketId: board.boardPacketId,
419
+ boardProfile: board.boardProfile,
420
+ boardTitle: board.boardTitle,
421
+ activeRoute: board.activeRoute,
422
+ frontierClaim: board.frontierClaim,
423
+ moduleTarget: board.moduleTarget,
424
+ sourceKind: board.sourceKind,
425
+ sourceBoardJson: board.sourceBoardJson,
426
+ sourceBoardMarkdown: board.sourceBoardMarkdown,
427
+ atomicBoardPath: board.atomicBoardPath,
428
+ atomicBoardMarkdownPath: board.atomicBoardMarkdownExists ? board.atomicBoardMarkdownPath : null,
429
+ activeTicket: board.activeTicket,
430
+ routeStatus: board.routeStatus,
431
+ tickets: board.tickets,
432
+ ladder: board.ladder,
433
+ readyQueue: board.readyQueue,
434
+ mirageFrontiers: board.mirageFrontiers,
435
+ notes: board.notes,
436
+ };
437
+ }
438
+
281
439
  function deriveRouteState(problem, context) {
282
440
  const researchState = problem.researchState ?? {};
283
441
  const solvedBySite = String(problem.siteStatus ?? '').toLowerCase() === 'solved';
@@ -311,6 +469,7 @@ function defaultQuestionLedger(problemId, routeState) {
311
469
  export function buildSunflowerStatusSnapshot(problem) {
312
470
  const context = readSunflowerContext(problem.problemId);
313
471
  const routePacket = readSunflowerRoutePacket(problem.problemId);
472
+ const atomicBoard = readSunflowerAtomicBoard(problem.problemId);
314
473
  const packets = listSunflowerComputePackets(problem.problemId);
315
474
  const activePacket = chooseActivePacket(packets);
316
475
  const summary = deriveSummary(activePacket);
@@ -320,6 +479,8 @@ export function buildSunflowerStatusSnapshot(problem) {
320
479
  const checkpointPacketPath = getSunflowerCheckpointPacketPath(problem.problemId);
321
480
  const reportPacketPath = getSunflowerReportPacketPath(problem.problemId);
322
481
 
482
+ const firstReadyAtom = atomicBoard?.readyQueue?.[0] ?? null;
483
+
323
484
  return {
324
485
  generatedAt: new Date().toISOString(),
325
486
  problemId: problem.problemId,
@@ -334,10 +495,20 @@ export function buildSunflowerStatusSnapshot(problem) {
334
495
  harnessProfile: context?.harnessProfile ?? null,
335
496
  bootstrapFocus: context?.bootstrapFocus ?? null,
336
497
  routeStory: context?.routeStory ?? null,
337
- frontierLabel: context?.frontierLabel ?? (activePacket?.question ? 'compute_packet' : null),
338
- frontierDetail: context?.frontierDetail ?? activePacket?.question ?? summary.computeSummary,
498
+ frontierLabel:
499
+ context?.frontierLabel
500
+ ?? atomicBoard?.activeRoute
501
+ ?? (activePacket?.question ? 'compute_packet' : null),
502
+ frontierDetail:
503
+ context?.frontierDetail
504
+ ?? atomicBoard?.frontierClaim
505
+ ?? activePacket?.question
506
+ ?? summary.computeSummary,
339
507
  checkpointFocus: context?.checkpointFocus ?? null,
340
- nextHonestMove: context?.nextHonestMove ?? summary.computeNextAction,
508
+ nextHonestMove:
509
+ firstReadyAtom
510
+ ? `${firstReadyAtom.atomId} — ${firstReadyAtom.title}`
511
+ : context?.nextHonestMove ?? summary.computeNextAction,
341
512
  relatedCoreProblems: context?.relatedCoreProblems ?? [],
342
513
  literatureFocus: context?.literatureFocus ?? [],
343
514
  artifactFocus: context?.artifactFocus ?? [],
@@ -353,6 +524,14 @@ export function buildSunflowerStatusSnapshot(problem) {
353
524
  checkpointPacketPath: fs.existsSync(checkpointPacketPath) ? checkpointPacketPath : null,
354
525
  reportPacketPresent: fs.existsSync(reportPacketPath),
355
526
  reportPacketPath: fs.existsSync(reportPacketPath) ? reportPacketPath : null,
527
+ atomicBoardPresent: Boolean(atomicBoard),
528
+ atomicBoardPath: atomicBoard?.atomicBoardPath ?? null,
529
+ atomicBoardMarkdownPath: atomicBoard?.atomicBoardMarkdownExists ? atomicBoard.atomicBoardMarkdownPath : null,
530
+ atomicBoard,
531
+ activeTicket: atomicBoard?.activeTicket ?? null,
532
+ readyAtomCount: atomicBoard?.readyQueue?.length ?? 0,
533
+ firstReadyAtom,
534
+ mirageFrontierCount: atomicBoard?.mirageFrontiers?.length ?? 0,
356
535
  computeLanePresent: Boolean(activePacket),
357
536
  computeLaneCount: packets.length,
358
537
  computeSummary: summary.computeSummary,
@@ -363,6 +542,7 @@ export function buildSunflowerStatusSnapshot(problem) {
363
542
  computeGovernance,
364
543
  activePacket: compactPacket(activePacket),
365
544
  computePackets: packets.map((packet) => compactPacket(packet)),
545
+ atomicBoardSummary: compactAtomicBoard(atomicBoard),
366
546
  };
367
547
  }
368
548