Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
509da51
WIP: v4 de-prose: src/v4/extdeps/languages/cpp.dag — 93.4%→<20% stric…
briansrls May 18, 2026
d69847f
WIP: v4 de-prose: src/v4/extdeps/languages/cpp.dag — 93.4%→<20% stric…
briansrls May 18, 2026
3c9fbf1
WIP: v4 de-prose: src/v4/extdeps/languages/cpp.dag — 93.4%→<20% stric…
briansrls May 18, 2026
228f2aa
Merge remote-tracking branch 'origin/main' into session/tidy-carp-737
briansrls May 19, 2026
3b4818d
fix(v4): cpp.dag extdeps fidelity + DECISIONS Practice-4 ledger (#3289)
briansrls May 19, 2026
427d3ce
fix(v4): remove non-Practice-9 `// Ledger:` line from cpp.dag
briansrls May 19, 2026
2a1ee9f
fix(v4): correct CppIntegerOverflowDisposition DECISIONS receipt vs I…
briansrls May 19, 2026
c44b060
Merge remote-tracking branch 'origin/main' into session/tidy-carp-737
briansrls May 19, 2026
a3b15ee
Merge remote-tracking branch 'origin/main' into session/tidy-carp-737
briansrls May 19, 2026
9302c28
Merge remote-tracking branch 'origin/main' into session/tidy-carp-737
briansrls May 19, 2026
b1da98c
Merge remote-tracking branch 'origin/main' into session/tidy-carp-737
briansrls May 19, 2026
ba0d7dc
Merge remote-tracking branch 'origin/main' into session/tidy-carp-737
briansrls May 19, 2026
2b35f9a
WIP: [Mode-1 MAX-PAR] De-prose #3289 redo: refresh branch/PR against …
briansrls May 19, 2026
5a3465e
fix(v4): cpp.dag Practice-9 header + coproduct tag (Composer #3289)
briansrls May 19, 2026
460292f
Merge remote-tracking branch 'origin/main' into session/tidy-carp-737
briansrls May 19, 2026
dc0e12e
fix(v4): restore DECISIONS Part 6 coproduct tag on cpp overflow sum
briansrls May 19, 2026
420887e
fix(v4): cpp.dag — drop DECISIONS path from overflow coproduct tag
briansrls May 19, 2026
90180e2
Merge remote-tracking branch 'origin/main' into session/tidy-carp-737
briansrls May 19, 2026
1af69d9
fix(ci): stabilize v4 gate — PR-scoped concurrency + larger runner
briansrls May 19, 2026
7406c75
WIP: [Mode-1 MAX-PAR] De-prose #3289 redo: refresh branch/PR against …
briansrls May 19, 2026
393f659
chore(ci): retrigger Actions for folded v4 bootstrap gate
briansrls May 19, 2026
deb9c65
merge: origin/main into session/tidy-carp-737
briansrls May 19, 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
118 changes: 44 additions & 74 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,12 @@ permissions:
contents: read
pull-requests: read
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}-${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}
# One in-flight `ci` workflow per pull request (keyed by PR number). Omitting
# `head.sha` from the group lets a newer `synchronize` supersede (cancel) an
# older run instead of stacking multiple v2→v4 bootstrap compiles on
# `ubicloud-standard-*` — correlated with runner shutdown mid-compile under
# burst merges / merge-main hops. Push-to-main still keys off `run_id`.
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}
cancel-in-progress: true
env:
CARGO_TERM_COLOR: always
Expand Down Expand Up @@ -65,7 +70,9 @@ jobs:
if: github.event.pull_request.draft != true
needs: [affected]
runs-on: ubicloud-standard-2
timeout-minutes: 25
# Includes folded v4 bootstrap gate when `affected.outputs.v4` — wall clock can
# exceed the old 25m cap (v2 release build + full v4 resolve on cold cache).
timeout-minutes: 40
steps:
- name: Checkout
uses: actions/checkout@v4
Expand Down Expand Up @@ -153,6 +160,33 @@ jobs:
- name: T-15 v4 bin main.dag smoke (live integration receipt)
if: needs.affected.outputs.v4 == 'true' || needs.affected.outputs.v3 == 'true' || needs.affected.outputs.workflow_policy == 'true' || (github.event_name == 'push' && github.ref == 'refs/heads/main')
run: cargo test -p v3-compiler --test integration v4_bin_main_dag_smoke_test::v4_bin_main_dag_tokenizes_and_parses_with_trampoline_source_anchor -- --exact --quiet
# v4 bootstrap viability — historically a standalone job, but Ubicloud repeatedly
# dropped that runner mid `v2-compiler compile` (~5m wall) with a shutdown signal
# while this `ci` job stayed healthy. Folding into `ci` keeps one runner lifecycle;
# the separate `v4` job is a receipt-only stub so required check names stay stable.
- name: Cache v2-compiler binary (v4 bootstrap gate)
if: needs.affected.outputs.v4 == 'true'
id: v4-v2-bin
uses: actions/cache@v4
with:
path: target/release/v2-compiler
key: v2-compiler-bin-${{ runner.os }}-${{ hashFiles('src/v2/stage0/src/**', 'src/v2/stage0/Cargo.toml', 'Cargo.toml', '**/Cargo.lock', 'rust-toolchain.toml') }}
- name: Build v2 compiler (v4 bootstrap gate)
if: needs.affected.outputs.v4 == 'true' && steps.v4-v2-bin.outputs.cache-hit != 'true'
run: cargo build -p v2-compiler --release
- name: v2 → v4 bootstrap viability (parse all v4 .dag files via v2)
if: needs.affected.outputs.v4 == 'true'
run: |
set -euo pipefail
rm -rf /tmp/v4-stage1
mkdir -p /tmp/v4-stage1
target/release/v2-compiler compile --source-root src/v4 --output-dir /tmp/v4-stage1 --target dag
echo "Bootstrap viability OK — v2 indexed and resolved all v4 modules."
- name: 'INTERIM (T-24 bridge) — v4 v2-run-preflight notice (run gate deferred T-22)'
if: needs.affected.outputs.v4 == 'true'
env:
V2_PREFLIGHT_SKIP_COMPILE: "1"
run: bash scripts/v2-run-preflight.sh
# v2 fixed-point — runs only when src/v2/ is affected. v2 is restored as
# comparison artifact + v4 bootstrap source (frozen-buildable). Verifies
# that any modification to v2 preserves the self-host fixed-point property.
Expand Down Expand Up @@ -187,82 +221,18 @@ jobs:
run: |
set -euo pipefail
cargo test -p v2-compiler-tests --release bootstrap_fixed_point -- --ignored --exact
# v4 bootstrap viability — verifies v2's compiled binary can still parse
# every v4 .dag file. v4 stage0 must stay in v2-syntax-compatible subset
# (per closed-tree bootstrap / `docs/design-pure-bootstrap-zero.md`) until v4 self-compiles.
# This gate catches any v4 change that introduces syntax v2 can't parse.
# v4 — check name preserved for branch protection / dashboard. The load-bearing
# `v2-compiler compile` over src/v4 runs inside the `ci` job (see folded steps there)
# after Ubicloud repeatedly dropped standalone v4 runners mid-compile.
v4:
if: github.event.pull_request.draft != true && needs.affected.outputs.v4 == 'true'
needs: [affected]
runs-on: ubicloud-standard-8
timeout-minutes: 15
needs: [affected, ci]
runs-on: ubicloud-standard-2
timeout-minutes: 5
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 1
- name: Setup Rust
uses: actions-rust-lang/setup-rust-toolchain@v1.16.0
with:
cache: false
rustflags: ''
- name: Cache Cargo (v4 — shares with v2 since we build v2 binary)
uses: actions/cache@v4
with:
path: |
~/.cargo/registry/index/
~/.cargo/registry/cache/
~/.cargo/git/db/
target/
key: cargo-v2-${{ runner.os }}-${{ hashFiles('**/Cargo.lock') }}-${{ hashFiles('src/v2/**') }}
restore-keys: |
cargo-v2-${{ runner.os }}-${{ hashFiles('**/Cargo.lock') }}-
cargo-v2-${{ runner.os }}-
# Cache the built v2-compiler BINARY, keyed on the frozen bootstrap
# seed. src/v2/ is touched almost never (and CI-gated when it is), so
# this key is near-permanently stable — a hit skips the cold ~1m
# v2-compiler rebuild entirely. Caching target/ alone is unreliable:
# cargo's freshness check over a cache-restored target/ frequently
# recompiles anyway; caching the output artifact and not invoking
# cargo at all sidesteps that.
#
# Interim MANUAL key. The structural form is content_hash() over the
# src/v2/stage0 input subgraph — see src/v4/lens/affected_set.dag and
# src/v4/workflow/ci.dag. Once workflow/ci.dag (T-24) emits this
# workflow, the key becomes an emitted content-hash, not a hashFiles
# glob.
- name: Cache v2-compiler binary
id: v2-bin
uses: actions/cache@v4
with:
path: target/release/v2-compiler
# Root Cargo.toml is included: its [profile.release] settings
# affect the v2-compiler binary without touching Cargo.lock or
# src/v2/stage0/**.
key: v2-compiler-bin-${{ runner.os }}-${{ hashFiles('src/v2/stage0/src/**', 'src/v2/stage0/Cargo.toml', 'Cargo.toml', '**/Cargo.lock', 'rust-toolchain.toml') }}
- name: Build v2 compiler (bootstrap stage minus one)
if: steps.v2-bin.outputs.cache-hit != 'true'
run: cargo build -p v2-compiler --release
- name: v2 → v4 bootstrap viability (parse all v4 .dag files via v2)
- name: v4 receipt (bootstrap gate runs in ci job)
run: |
set -euo pipefail
rm -rf /tmp/v4-stage1
mkdir -p /tmp/v4-stage1
set +e
timeout 120s target/release/v2-compiler compile --source-root src/v4 --output-dir /tmp/v4-stage1 --target dag 2>&1 | tee /tmp/v4-stage1.log
status=${PIPESTATUS[0]}
set -e
if [[ "$status" -eq 0 ]]; then
echo "Bootstrap viability OK — v2 compiled all v4 modules."
elif [[ "$status" -eq 124 ]] && grep -q "resolved .* sources (transitive import closure)" /tmp/v4-stage1.log; then
echo "Bootstrap viability OK — v2 indexed and resolved all v4 modules; emit path remains T-22-deferred."
else
exit "$status"
fi
- name: 'INTERIM (T-24 bridge) — v4 v2-run-preflight notice (run gate deferred T-22)'
env:
V2_PREFLIGHT_SKIP_COMPILE: "1"
run: bash scripts/v2-run-preflight.sh
echo "::notice::v4 bootstrap viability + v2-run-preflight ran inside the ci job when v4 is affected."
# v3 — FROZEN 2026-05-15 pending v4 program. Runs only when src/v3/ or dsl/
# is affected (or on push-to-main for trunk verification). v3 is no longer
# the active compiler; v4 program supersedes it (see PR #3147).
Expand Down
111 changes: 47 additions & 64 deletions dsl/gunbc/ci_github_actions_workflow.dag
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ data gunbc_ci_github_actions_workflow: Workflow = {
on: [Push { branches: ["main"], paths: [] }, PullRequest { branches: ["main"], types: [Opened, Synchronize, Reopened, ReadyForReview] }],
concurrency: Some {
value: ConcurrencyMappingQueueNotMax {
group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}-${{ github.event_name == 'pull_request' && github.event.pull_request.head.sha || github.sha }}",
group: "${{ github.workflow }}-${{ github.event.pull_request.number || github.run_id }}",
cancel_in_progress: Some { value: CancelInProgressBool { value: true } },
explicit_single: none
}
Expand Down Expand Up @@ -319,13 +319,52 @@ data gunbc_ci_github_actions_workflow: Workflow = {
if_condition: Some { value: "needs.affected.outputs.v4 == 'true' || needs.affected.outputs.v3 == 'true' || needs.affected.outputs.workflow_policy == 'true' || (github.event_name == 'push' && github.ref == 'refs/heads/main')" },
continue_on_error: false,
timeout_minutes: none
}, UsesStep {
name: Some { value: "Cache v2-compiler binary (v4 bootstrap gate)" },
id: Some { value: "v4-v2-bin" },
uses: { owner: "actions", repo: "cache", ref: "v4" },
with: { "path": "target/release/v2-compiler", "key": "v2-compiler-bin-${{ runner.os }}-${{ hashFiles('src/v2/stage0/src/**', 'src/v2/stage0/Cargo.toml', 'Cargo.toml', '**/Cargo.lock', 'rust-toolchain.toml') }}" },
env: none,
if_condition: Some { value: "needs.affected.outputs.v4 == 'true'" },
continue_on_error: false,
timeout_minutes: none
}, RunStep {
name: Some { value: "Build v2 compiler (v4 bootstrap gate)" },
id: none,
run: "cargo build -p v2-compiler --release",
shell: Bash,
env: none,
working_directory: none,
if_condition: Some { value: "needs.affected.outputs.v4 == 'true' && steps.v4-v2-bin.outputs.cache-hit != 'true'" },
continue_on_error: false,
timeout_minutes: none
}, RunStep {
name: Some { value: "v2 → v4 bootstrap viability (parse all v4 .dag files via v2)" },
id: none,
run: "set -euo pipefail\nrm -rf /tmp/v4-stage1\nmkdir -p /tmp/v4-stage1\ntarget/release/v2-compiler compile --source-root src/v4 --output-dir /tmp/v4-stage1 --target dag\necho \"Bootstrap viability OK — v2 indexed and resolved all v4 modules.\"\n",
shell: Bash,
env: none,
working_directory: none,
if_condition: Some { value: "needs.affected.outputs.v4 == 'true'" },
continue_on_error: false,
timeout_minutes: none
}, RunStep {
name: Some { value: "INTERIM (T-24 bridge) — v4 v2-run-preflight notice (run gate deferred T-22)" },
id: none,
run: "bash scripts/v2-run-preflight.sh",
shell: Bash,
env: { "V2_PREFLIGHT_SKIP_COMPILE": "1" },
working_directory: none,
if_condition: Some { value: "needs.affected.outputs.v4 == 'true'" },
continue_on_error: false,
timeout_minutes: none
}],
needs: ["affected"],
env: none,
outputs: none,
if_condition: Some { value: "github.event.pull_request.draft != true" },
strategy: none,
timeout_minutes: Some { value: 25 },
timeout_minutes: Some { value: 40 },
continue_on_error: false,
concurrency: none
}, {
Expand Down Expand Up @@ -381,80 +420,24 @@ data gunbc_ci_github_actions_workflow: Workflow = {
}, {
id: "v4",
name: none,
runner: SelfHosted { labels: ["ubicloud-standard-8"] },
steps: [UsesStep {
name: Some { value: "Checkout" },
id: none,
uses: { owner: "actions", repo: "checkout", ref: "v4" },
with: { "fetch-depth": "1" },
env: none,
if_condition: none,
continue_on_error: false,
timeout_minutes: none
}, UsesStep {
name: Some { value: "Setup Rust" },
id: none,
uses: { owner: "actions-rust-lang", repo: "setup-rust-toolchain", ref: "v1.16.0" },
with: { "cache": "false", "rustflags": "" },
env: none,
if_condition: none,
continue_on_error: false,
timeout_minutes: none
}, UsesStep {
name: Some { value: "Cache Cargo (v4 — shares with v2 since we build v2 binary)" },
id: none,
uses: { owner: "actions", repo: "cache", ref: "v4" },
with: { "path": "~/.cargo/registry/index/\n~/.cargo/registry/cache/\n~/.cargo/git/db/\ntarget/\n", "key": "cargo-v2-${{ runner.os }}-${{ hashFiles('**/Cargo.lock') }}-${{ hashFiles('src/v2/**') }}", "restore-keys": "cargo-v2-${{ runner.os }}-${{ hashFiles('**/Cargo.lock') }}-\ncargo-v2-${{ runner.os }}-\n" },
env: none,
if_condition: none,
continue_on_error: false,
timeout_minutes: none
}, UsesStep {
name: Some { value: "Cache v2-compiler binary" },
id: Some { value: "v2-bin" },
uses: { owner: "actions", repo: "cache", ref: "v4" },
with: { "path": "target/release/v2-compiler", "key": "v2-compiler-bin-${{ runner.os }}-${{ hashFiles('src/v2/stage0/src/**', 'src/v2/stage0/Cargo.toml', 'Cargo.toml', '**/Cargo.lock', 'rust-toolchain.toml') }}" },
env: none,
if_condition: none,
continue_on_error: false,
timeout_minutes: none
}, RunStep {
name: Some { value: "Build v2 compiler (bootstrap stage minus one)" },
id: none,
run: "cargo build -p v2-compiler --release",
shell: Bash,
env: none,
working_directory: none,
if_condition: Some { value: "steps.v2-bin.outputs.cache-hit != 'true'" },
continue_on_error: false,
timeout_minutes: none
}, RunStep {
name: Some { value: "v2 → v4 bootstrap viability (parse all v4 .dag files via v2)" },
runner: SelfHosted { labels: ["ubicloud-standard-2"] },
steps: [RunStep {
name: Some { value: "v4 receipt (bootstrap gate runs in ci job)" },
id: none,
run: "set -euo pipefail\nrm -rf /tmp/v4-stage1\nmkdir -p /tmp/v4-stage1\nset +e\ntimeout 120s target/release/v2-compiler compile --source-root src/v4 --output-dir /tmp/v4-stage1 --target dag 2>&1 | tee /tmp/v4-stage1.log\nstatus=${PIPESTATUS[0]}\nset -e\nif [[ \"$status\" -eq 0 ]]; then\n echo \"Bootstrap viability OK — v2 compiled all v4 modules.\"\nelif [[ \"$status\" -eq 124 ]] && grep -q \"resolved .* sources (transitive import closure)\" /tmp/v4-stage1.log; then\n echo \"Bootstrap viability OK — v2 indexed and resolved all v4 modules; emit path remains T-22-deferred.\"\nelse\n exit \"$status\"\nfi\n",
run: "echo \"::notice::v4 bootstrap viability + v2-run-preflight ran inside the ci job when v4 is affected.\"\n",
shell: Bash,
env: none,
working_directory: none,
if_condition: none,
continue_on_error: false,
timeout_minutes: none
}, RunStep {
name: Some { value: "INTERIM (T-24 bridge) — v4 v2-run-preflight notice (run gate deferred T-22)" },
id: none,
run: "bash scripts/v2-run-preflight.sh",
shell: Bash,
env: { "V2_PREFLIGHT_SKIP_COMPILE": "1" },
working_directory: none,
if_condition: none,
continue_on_error: false,
timeout_minutes: none
}],
needs: ["affected"],
needs: ["affected", "ci"],
env: none,
outputs: none,
if_condition: Some { value: "github.event.pull_request.draft != true && needs.affected.outputs.v4 == 'true'" },
strategy: none,
timeout_minutes: Some { value: 15 },
timeout_minutes: Some { value: 5 },
continue_on_error: false,
concurrency: none
}, {
Expand Down
3 changes: 2 additions & 1 deletion scripts/v2-run-preflight.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@
#
# INTERIM (T-24 bridge): Move 1 / Move 3 pre-flight helper. The structural
# authority for CI remains `v2-compiler compile` (see .github/workflows/ci.yml
# v4 job). v2 `run` over src/v4 is **not** a green gate today — see
# v4 bootstrap steps folded into the `ci` job when v4 is affected). v2 `run` over
# src/v4 is **not** a green gate today — see
# src/v4/test/v2_run_preflight/MOVE1_COVERAGE.txt (deferred until T-22).
#
# Usage: from repo root, with v2-compiler already built:
Expand Down
20 changes: 1 addition & 19 deletions src/v4/extdeps/cpp_abi.dag
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,7 @@ type CppMachineWidth16
type CppMachineWidth32
type CppMachineWidth64

<<<<<<< HEAD
// 🟢 pretty-much-done — closed ABI integer-width atoms; testcase: test/claim/manual/cpp_scalar_grounding_anchor.dag.
// 🟢 coproduct dissolution — DECISIONS.md T29-ABI.
=======
// 🟢 coproduct dissolution — T29-ABI.
>>>>>>> origin/main
type CppIntegerWidth
= CppWidth8 { width: CppMachineWidth8 }
| CppWidth16 { width: CppMachineWidth16 }
Expand All @@ -29,22 +24,16 @@ type CppIntegerWidth
// 🟢 pretty-much-done — core integer-width bundle includes wchar_t width; testcase: test/claim/manual/cpp_scalar_grounding_anchor.dag.
type CppCoreIntegerWidthModel<char_width, short_width, int_width, long_width, long_long_width, pointer_width, wchar_t_width>

<<<<<<< HEAD
// 🟢 pretty-much-done — implementation-defined plain-char signedness coordinate; testcase: test/claim/manual/cpp_scalar_grounding_anchor.dag.
// 🟢 coproduct dissolution — DECISIONS.md T29-ABI.
=======
// 🟢 coproduct dissolution — T29-ABI.
>>>>>>> origin/main
type CppPlainCharSignedness
= PlainCharSigned { tag: CppPlainCharSigned }
| PlainCharUnsigned { tag: CppPlainCharUnsigned }

type CppPlainCharSigned
type CppPlainCharUnsigned

<<<<<<< HEAD
// 🟢 pretty-much-done — implementation-defined wchar_t signedness coordinate; testcase: test/claim/manual/cpp_scalar_grounding_anchor.dag.
// 🟢 coproduct dissolution — DECISIONS.md T29-ABI.
// 🟢 coproduct dissolution — T29-ABI.
type CppWcharTSignedness
= WcharTSigned { tag: CppWcharTSigned }
| WcharTUnsigned { tag: CppWcharTUnsigned }
Expand All @@ -53,10 +42,7 @@ type CppWcharTSigned
type CppWcharTUnsigned

// 🟢 pretty-much-done — standard data-model family names; testcase: test/claim/manual/cpp_scalar_grounding_anchor.dag.
// 🟢 coproduct dissolution — DECISIONS.md T29-ABI.
=======
// 🟢 coproduct dissolution — T29-ABI.
>>>>>>> origin/main
type CppDataModelFamily
= ILP32 { tag: CppDataModelFamilyILP32 }
| LP64 { tag: CppDataModelFamilyLP64 }
Expand All @@ -68,12 +54,8 @@ type CppDataModelFamilyLP64
type CppDataModelFamilyLLP64
type CppDataModelFamilyILP64

<<<<<<< HEAD
// 🟢 pretty-much-done — ABI model selector; testcase: test/claim/manual/cpp_scalar_grounding_anchor.dag.
// 🟢 coproduct dissolution — DECISIONS.md T29-ABI.
=======
// 🟢 coproduct dissolution — T29-ABI.
>>>>>>> origin/main
type CppAbiModel
= ItaniumCxxAbi186 { tag: CppAbiModelItaniumCxxAbi186 }
| PlatformCxxAbi { tag: CppAbiModelPlatformCxxAbi }
Expand Down
Loading
Loading