Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
6c2db71
WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)
Jul 20, 2026
8e4b676
Plan cycle-4: chain B DONE, chain A single gate = comprehensive impor…
Jul 20, 2026
d5f15ca
WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)
Jul 20, 2026
850ab27
Plan cycle-5: v1_deletion_plan.dag becomes the FULL three-gate roadma…
Jul 20, 2026
b0b9617
WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)
Jul 20, 2026
7940484
Fix parse error in roadmap: in-string braces trigger string interpola…
Jul 20, 2026
3635cdc
WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)
Jul 20, 2026
3a74767
Roadmap: wire Gate 3's ledger receipts to gate the cutover (review 40…
Jul 20, 2026
8ae0e8d
WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)
Jul 20, 2026
773e9a9
WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)
Jul 20, 2026
e2fbaf6
WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)
Jul 20, 2026
7a91462
Merge remote-tracking branch 'origin/main' into session/sharp-bee-290…
Jul 20, 2026
ce909b6
WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)
Jul 20, 2026
62d7915
WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)
Jul 20, 2026
b7d9825
WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)
Jul 20, 2026
d6c7bb0
WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)
Jul 20, 2026
1f2818c
WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)
Jul 20, 2026
9430d96
WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)
Jul 20, 2026
b2057ec
Merge remote-tracking branch 'origin/main' into session/sharp-bee-290…
Jul 20, 2026
ea05eb0
Merge remote-tracking branch 'origin/main' into session/sharp-bee-290…
Jul 20, 2026
80144e9
Roadmap convergence: three-gate progress on the srv1 dashboard (autho…
Jul 20, 2026
4bff2f9
WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)
Jul 20, 2026
f919317
Resolve #6942 merge: combine dispatch launch-button with three-gate p…
Jul 20, 2026
6a2f696
WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)
Jul 20, 2026
2e0f7a7
Review 40401 finding 2: three-gate widget renders only the 3 proving …
Jul 20, 2026
933c601
Merge remote-tracking branch 'origin/main' into session/sharp-bee-290…
Jul 20, 2026
3644226
Review 40401 finding 1: typed bar-brick discriminator excludes seed-s…
Jul 20, 2026
1d63288
WIP: Weak Self Host -> Strong Self Host (Wave 1 -> 4, on 1 exit)
Jul 20, 2026
3340a20
Fix host_standup witness stale after #6947 nbd_proxy typed-effect mig…
Jul 20, 2026
0b96d19
Merge remote-tracking branch 'origin/main' into session/sharp-bee-290…
Jul 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 28 additions & 2 deletions .github/live-deploy-srv1-apply.sh

Large diffs are not rendered by default.

149 changes: 142 additions & 7 deletions dag/gunbc/roadmap_page.dag
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,136 @@ import gunbc.roadmap_status { RoadmapItem, DerivableLine, AuthoredLine, PlainLin
import gunbc.roadmap_document { RoadmapDocument, RoadmapSection }
import gunbc.roadmap_authority { roadmap_authority, authored_merged_prs }
import gunbc.roadmap_spawner { spawn_frontier, SpawnFrontier }
import gunbc.v1_deletion_plan {
v1_deletion_gates, v1_deletion_milestones, PlanGateSpec, PlanMilestone,
PlanGate, GateEmitterFixedPoint, GateHonestFrontier, GateLedgerGreen, GateDeletion,
BrickState, Placed, InFlight, Gated,
BrickRole, BarBrick, SeedShrink,
}

fn roadmap_page_max_depth() -> Int { 8 }

fn tg_gate_index(g: PlanGate) -> Int {
match g {
GateEmitterFixedPoint => 0
GateHonestFrontier => 1
GateLedgerGreen => 2
GateDeletion => 3
}
}

fn tg_gate_eq(a: PlanGate, b: PlanGate) -> Bool { tg_gate_index(g: a) == tg_gate_index(g: b) }

fn tg_brick_is_placed(bs: BrickState) -> Bool {
match bs {
Placed => true
InFlight => false
Gated => false
}
}

fn tg_brick_is_remaining(bs: BrickState) -> Bool {
match bs {
Placed => false
InFlight => true
Gated => true
}
}

fn tg_brick_state_class(bs: BrickState) -> String {
match bs {
Placed => "placed"
InFlight => "inflight"
Gated => "gated"
}
}

fn tg_brick_state_label(bs: BrickState) -> String {
match bs {
Placed => "done"
InFlight => "in flight"
Gated => "gated"
}
}

fn tg_is_bar_brick(m: PlanMilestone) -> Bool {
match m.role {
BarBrick => true
SeedShrink => false
}
}

fn tg_gate_bricks(g: PlanGate) -> List<PlanMilestone> {
filter(v1_deletion_milestones, m => tg_gate_eq(a: m.gate, b: g) && tg_is_bar_brick(m: m))
}

fn tg_gate_total(g: PlanGate) -> Int { count(tg_gate_bricks(g: g)) }

fn tg_gate_placed(g: PlanGate) -> Int {
count(filter(tg_gate_bricks(g: g), m => tg_brick_is_placed(bs: m.brick_state)))
}

fn tg_gate_percent(placed: Int, total: Int) -> Int {
if total == 0 { 0 } else { placed * 100 / total }
}

fn tg_gate_count_label(placed: Int, total: Int) -> String {
concat(to_string(placed), concat(" / ", to_string(total)))
}

fn tg_bar_fill(pct: Int) -> MarkupNode {
ElementNode {
tag: "div",
attrs: [
MarkupAttr { name: "class", value: "bar-fill" },
MarkupAttr { name: "style", value: concat("width: ", concat(to_string(pct), "%")) },
],
children: [],
}
}

fn tg_brick_li(m: PlanMilestone) -> MarkupNode {
el_class("li", concat("brick brick-", tg_brick_state_class(bs: m.brick_state)), [
el_class("span", "brick-state", [ txt(tg_brick_state_label(bs: m.brick_state)) ]),
el_class("span", "brick-title", [ txt(m.title) ]),
])
}

fn tg_gate_remaining_ul(g: PlanGate) -> MarkupNode {
el_class("ul", "bricks",
map(filter(tg_gate_bricks(g: g), m => tg_brick_is_remaining(bs: m.brick_state)), m => tg_brick_li(m: m)))
}

fn tg_gate_progress_row(spec: PlanGateSpec) -> MarkupNode {
let total = tg_gate_total(g: spec.gate)
let placed = tg_gate_placed(g: spec.gate)
el_class("section", "gate-row", [
el_class("div", "gate-head", [
el_class("span", "gate-name", [ txt(spec.name) ]),
el_class("span", "gate-count", [ txt(tg_gate_count_label(placed: placed, total: total)) ]),
]),
el_class("div", "gate-bar", [ tg_bar_fill(pct: tg_gate_percent(placed: placed, total: total)) ]),
tg_gate_remaining_ul(g: spec.gate),
])
}

fn tg_is_bar_gate(g: PlanGate) -> Bool {
match g {
GateEmitterFixedPoint => true
GateHonestFrontier => true
GateLedgerGreen => true
GateDeletion => false
}
}

fn three_gate_progress_markup() -> MarkupNode {
el_class("section", "three-gate-progress",
concat(
[ el("h2", [ txt("v1-delete bar: three gates") ]) ],
map(filter(v1_deletion_gates, spec => tg_is_bar_gate(g: spec.gate)),
spec => tg_gate_progress_row(spec: spec))))
}

fn txt(s: String) -> MarkupNode { TextNode { text: s } }

fn el(tag: String, children: List<MarkupNode>) -> MarkupNode {
Expand Down Expand Up @@ -255,7 +382,7 @@ fn roadmap_frontier_markup(frontier: SpawnFrontier, merged: List<Int>) -> Markup
])
}

fn roadmap_daily_workspace_page(doc: RoadmapDocument, merged: List<Int>) -> MarkupNode {
fn roadmap_daily_workspace_page_impl(doc: RoadmapDocument, merged: List<Int>, main_prefix: List<MarkupNode>) -> MarkupNode {
let frontier = spawn_frontier(doc: doc, merged: merged)
ElementNode {
tag: "html",
Expand All @@ -268,19 +395,19 @@ fn roadmap_daily_workspace_page(doc: RoadmapDocument, merged: List<Int>) -> Mark
]),
el("body", [
el("header", [ el("h1", [ txt("gunbc — daily workspace") ]) ]),
el_class("main", "daily-workspace", [
el_class("main", "daily-workspace", concat(main_prefix, [
roadmap_frontier_markup(frontier: frontier, merged: merged),
]),
])),
dispatch_client_script(),
]),
],
}
}

fn roadmap_page(doc: RoadmapDocument, merged: List<Int>) -> MarkupNode {
fn roadmap_page_impl(doc: RoadmapDocument, merged: List<Int>, main_prefix: List<MarkupNode>) -> MarkupNode {
let lead = map(doc.lead_lanes, s => section_markup(s: s, merged: merged))
let secs = map(doc.sections, s => section_markup(s: s, merged: merged))
let main_children = concat(lead, secs)
let main_children = concat(main_prefix, concat(lead, secs))
let body_base = [
el("header", [ el("h1", [ txt("gunbc — roadmap") ]) ]),
el_class("main", "roadmap", main_children),
Expand All @@ -304,10 +431,18 @@ fn roadmap_page(doc: RoadmapDocument, merged: List<Int>) -> MarkupNode {
}
}

fn roadmap_page(doc: RoadmapDocument, merged: List<Int>) -> MarkupNode {
roadmap_page_impl(doc: doc, merged: merged, main_prefix: [])
}

fn roadmap_page_for_authority() -> MarkupNode {
roadmap_page(doc: roadmap_authority(), merged: authored_merged_prs())
roadmap_page_impl(doc: roadmap_authority(), merged: authored_merged_prs(), main_prefix: [ three_gate_progress_markup() ])
}

fn roadmap_daily_workspace_page(doc: RoadmapDocument, merged: List<Int>) -> MarkupNode {
roadmap_daily_workspace_page_impl(doc: doc, merged: merged, main_prefix: [])
}

fn roadmap_daily_workspace_page_for_authority() -> MarkupNode {
roadmap_daily_workspace_page(doc: roadmap_authority(), merged: authored_merged_prs())
roadmap_daily_workspace_page_impl(doc: roadmap_authority(), merged: authored_merged_prs(), main_prefix: [ three_gate_progress_markup() ])
}
13 changes: 13 additions & 0 deletions dag/gunbc/roadmap_style.dag
Original file line number Diff line number Diff line change
Expand Up @@ -47,5 +47,18 @@ fn roadmap_css() -> String {
css_rule(selector: ".frontier-ready h2", props: "color: #856404"),
css_rule(selector: ".frontier-upcoming h2", props: "color: #084298"),
css_rule(selector: ".frontier-done h2", props: "color: #0a3622"),
css_rule(selector: ".three-gate-progress", props: "display: flex; flex-direction: column; gap: 12px; margin-bottom: 24px"),
css_rule(selector: ".three-gate-progress h2", props: "margin: 0 0 4px"),
css_rule(selector: ".gate-row", props: "border: 1px solid #e0e0e0; border-radius: 6px; padding: 12px 16px; background: #fff"),
css_rule(selector: ".gate-head", props: "display: flex; justify-content: space-between; align-items: baseline; margin-bottom: 6px"),
css_rule(selector: ".gate-name", props: "font-weight: 600; font-size: 14px"),
css_rule(selector: ".gate-count", props: "font-family: ui-monospace, monospace; font-size: 13px; color: #555; font-variant-numeric: tabular-nums"),
css_rule(selector: ".gate-bar", props: "height: 10px; border-radius: 5px; background: #eef1f4; overflow: hidden; margin-bottom: 8px"),
css_rule(selector: ".bar-fill", props: "height: 100%; background: #2da44e"),
css_rule(selector: "ul.bricks", props: "list-style: none; padding-left: 0; display: flex; flex-direction: column; gap: 3px"),
css_rule(selector: "li.brick", props: "font-size: 12px; padding: 1px 0; color: #444; display: flex; align-items: baseline"),
css_rule(selector: ".brick-state", props: "display: inline-block; flex: 0 0 auto; width: 62px; font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.03em; margin-right: 8px"),
css_rule(selector: ".brick-inflight .brick-state", props: "color: #9a6700"),
css_rule(selector: ".brick-gated .brick-state", props: "color: #999"),
], "\n")
}
Loading
Loading