Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
4ea80e6
XL-2 step 2: interpolation hole-type census (gunbc test //gunbc/instr…
Oct 5, 2026
1a2349f
Census: recover v1-fused adjacent holes; spell holes from the node; p…
Oct 5, 2026
12ff967
Census: corpus completeness gates the exit; name every expression kin…
Oct 5, 2026
0baeb25
WIP conversions
Oct 5, 2026
2cf9a0e
Merge census head
Oct 5, 2026
91a7389
WIP: move decimal renderers to std.nat / std.integer
Oct 5, 2026
b6fa8ec
Merge origin/main
Oct 5, 2026
3f55d3c
Merge census head + origin/main
Oct 5, 2026
f06abea
XL-2: named conversions for every non-String interpolation hole; deci…
Oct 5, 2026
dd9aede
WIP: cron witness, fusion RFM row, grounding imports
Oct 5, 2026
a1603c0
contributor_onboarding_path: keep the historical renderer name; cite …
Oct 5, 2026
6c3662b
Merge origin/main into #13436 (retargeted to main after #13405 landed)
Oct 8, 2026
f777bec
Seed bootstrap: #13436's own std_integer/std_nat/semver mirrors (they…
Oct 8, 2026
b3875e9
Regenerate stage0 mirrors after the main merge (required-regen drift …
Oct 8, 2026
3cbc3fa
Digits by construction: Nat split yields a DecimalDigit; Int units di…
Oct 8, 2026
2fa50c5
Regenerate std_nat/std_integer stage0 mirrors for the digit construction
Oct 8, 2026
9528758
Nat rendering back to O(digits): divide by the declared nat_div_rem_b…
Oct 8, 2026
f1ce785
Regenerate std_nat stage0 mirror for the O(digits) renderer
Oct 8, 2026
f1e47f0
grounding: import layer_prefix_from_dotted_qualified_name from its ne…
Oct 8, 2026
0f14618
Merge origin/main into session/deep-newt-14-conv
Oct 9, 2026
82da0e4
Close the post-main census: drop the Map interpolation hole, concat t…
Oct 9, 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
11 changes: 6 additions & 5 deletions dag/extdeps/cron/schedule_model.dag
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import std.integer { NonNegativeInt, PositiveInt }
import std.types { List }
import extdeps.external_authority { ExternalAuthority }
import extdeps.uri { Uri, Https }
import std.nat { nat_to_decimal_string }

data extdeps_external_authority_anchor: ExternalAuthority = ExternalAuthority {
uri: Uri {
Expand Down Expand Up @@ -36,13 +37,13 @@ type CronEntry {
fn render_cron_field(f: CronField) -> String {
match f {
Wildcard => "*"
Exact { value: v } => "{v}"
Listed { values } => values |> map(v => "{v}") |> join(separator: ",")
Ranged { start: s, end: e } => "{s}-{e}"
Exact { value: v } => nat_to_decimal_string(value: v)
Listed { values } => values |> map(v => nat_to_decimal_string(value: v)) |> join(separator: ",")
Ranged { start: s, end: e } => concat(nat_to_decimal_string(value: s), concat("-", nat_to_decimal_string(value: e)))
Step { start: st, step: sp } =>
match st {
0 => "*/{sp}"
_ => "{st}/{sp}"
0 => concat("*/", nat_to_decimal_string(value: sp))
_ => concat(nat_to_decimal_string(value: st), concat("/", nat_to_decimal_string(value: sp)))
}
}
}
Expand Down
4 changes: 3 additions & 1 deletion dag/extdeps/filesystem/filesystem_rust_realization.dag
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
module extdeps.filesystem.rust_realization

import std.integer { int_to_decimal_string }

// THE RUST REALIZATION OF create-new PUBLISH, AS ONE AUTHORITY BOTH CONSUMERS COPY.
//
// `extdeps.filesystem` owns the INTERFACE shape of a filesystem operation. This module owns one
Expand Down Expand Up @@ -118,7 +120,7 @@ data rust_file_create_staging_candidate_attempt_limit: Int = 1024
fn rust_file_create_staging_candidate_attempt_limit_def() -> String {
concat(
"pub const GUNBC_CREATE_STAGING_CANDIDATE_ATTEMPT_LIMIT: u32 = ",
"{rust_file_create_staging_candidate_attempt_limit}",
int_to_decimal_string(value: rust_file_create_staging_candidate_attempt_limit),
";\n",
)
}
Expand Down
7 changes: 4 additions & 3 deletions dag/extdeps/posix/identity.dag
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import extdeps.external_authority { ExternalAuthority, ExternalModelScope, Exter
import std.decl_ref { DeclarationRef, WholeDeclaration }
import extdeps.uri { Uri, Https }
import std.optional { Optional, Present, Absent }
import v2.std.integer { integer_lexeme_to_int_optional, integer_nat_to_decimal_string }
import v2.std.integer { integer_lexeme_to_int_optional }
import std.nat { nat_to_decimal_string }
import std.algebra { trim }

data extdeps_external_authority_anchor: ExternalAuthority = ExternalAuthority {
Expand Down Expand Up @@ -100,11 +101,11 @@ fn posix_group_id_from_text(text: String) -> Optional<PosixGroupId> {
}

fn posix_user_id_text(user: PosixUserId) -> String {
integer_nat_to_decimal_string(value: user.value)
nat_to_decimal_string(value: user.value)
}

fn posix_group_id_text(group: PosixGroupId) -> String {
integer_nat_to_decimal_string(value: group.value)
nat_to_decimal_string(value: group.value)
}

// THE ONE SPELLING OF chown(1)'s OWNER[:GROUP] SEPARATOR. Both forms below -- numeric ids and names
Expand Down
15 changes: 8 additions & 7 deletions dag/extdeps/version/pep440.dag
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import std.types { List }
import std.types { NonEmptyStr }
import extdeps.external_authority { ExternalAuthority }
import extdeps.uri { Uri, Https }
import std.nat { nat_to_decimal_string }

data extdeps_external_authority_anchor: ExternalAuthority = ExternalAuthority {
uri: Uri {
Expand Down Expand Up @@ -230,21 +231,21 @@ fn pep440_pre_release_phase_label(phase: Pep440PreReleasePhase) -> String {
fn pep440_pre_release_label(pre: Pep440PreRelease) -> String {
concat(
pep440_pre_release_phase_label(phase: pre.phase),
"{pre.number}"
nat_to_decimal_string(value: pre.number)
)
}

fn pep440_release_segments_label(segments: Pep440ReleaseSegments) -> String {
let head = "{segments.first}"
let head = nat_to_decimal_string(value: segments.first)
if segments.rest.length() == 0 {
head
} else {
concat(head, concat(".", segments.rest |> map(n => "{n}") |> join(separator: ".")))
concat(head, concat(".", segments.rest |> map(n => nat_to_decimal_string(value: n)) |> join(separator: ".")))
}
}

fn pep440_epoch_prefix(epoch: NonNegativeInt) -> String {
if epoch == 0 { "" } else { concat("{epoch}", "!") }
if epoch == 0 { "" } else { concat(nat_to_decimal_string(value: epoch), "!") }
}

fn pep440_public_version_label(v: Pep440PublicVersion) -> String {
Expand All @@ -257,18 +258,18 @@ fn pep440_public_version_label(v: Pep440PublicVersion) -> String {
Absent => base
}
let with_post = match v.post_release {
Present { value: n } => concat(with_pre, concat(".post", "{n}"))
Present { value: n } => concat(with_pre, concat(".post", nat_to_decimal_string(value: n)))
Absent => with_pre
}
match v.dev_release {
Present { value: n } => concat(with_post, concat(".dev", "{n}"))
Present { value: n } => concat(with_post, concat(".dev", nat_to_decimal_string(value: n)))
Absent => with_post
}
}

fn pep440_local_segment_label(seg: Pep440LocalSegment) -> String {
match seg {
Pep440LocalNumeric { value: v } => "{v}"
Pep440LocalNumeric { value: v } => nat_to_decimal_string(value: v)
Pep440LocalLexicographic { label: s } => s
}
}
Expand Down
4 changes: 2 additions & 2 deletions dag/extdeps/version/semver.dag
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import extdeps.version { VersionIdentity, VersionScheme, VersionConstraint }
import std.algebra { Ordering, Less, Equal, Greater }
import std.integer { NonNegativeInt }
import std.types { List, Int }
import std.nat { nat_compare }
import std.nat { nat_compare, nat_to_decimal_string }
import std.types { NonEmptyStr, String }
import std.algebra { trim }
import std.checked_arithmetic { checked_int_to_nat }
Expand Down Expand Up @@ -151,7 +151,7 @@ fn semver_minimum_of_constraint(constraint: VersionConstraint) -> SemVerVersion?

fn semver_identifier_label(id: SemVerIdentifier) -> String {
match id {
SemVerNumericIdentifier { value: v } => "{v}"
SemVerNumericIdentifier { value: v } => nat_to_decimal_string(value: v)
SemVerAlphanumericIdentifier { label: s } => s
}
}
Expand Down
4 changes: 2 additions & 2 deletions dag/gunbc/ci/ci_failure_class.dag
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import gunbc.recurring_failure_mode.command_not_found_exit_cannot_distinguish_ev
}
import v2.std.node { Node }
import v2.std.diagnostic { Outcome }
import v2.std.integer { integer_int_to_decimal_string }
import std.integer { int_to_decimal_string }
import v2.extdeps.languages.bash_build {
bash_build_and_then,
bash_build_assign,
Expand Down Expand Up @@ -254,7 +254,7 @@ fn floor_outcome_wire(o: FloorOutcome) -> String {
}

fn posix_exit_status_decimal(code: Int) -> String {
integer_int_to_decimal_string(value: code)
int_to_decimal_string(value: code)
}

fn infra_signature_wire(sig: InfraSignature) -> String {
Expand Down
13 changes: 7 additions & 6 deletions dag/gunbc/contributor_onboarding_path.dag
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module gunbc.contributor_onboarding_path

import std.types { String, List, NonEmptyStr }
import v2.std.integer { integer_int_to_decimal_string }
import std.integer { int_to_decimal_string }
import std.optional { Optional, Absent, Present }
import std.markdown { MarkdownDocument, MarkdownBlock }
import gunbc.plans.md_helpers { h1, h2, h3, p, li, ul, ol, hr }
Expand Down Expand Up @@ -111,11 +111,12 @@ type OnboardingBlocker

// THE ORDINAL IS AN Int, AND THAT IS A CORRECTION RATHER THAN A PREFERENCE (review 64609).
// It was first declared `std.nat` `Nat` -- `CommutativeSemiring<Magnitude>` -- and rendered with
// `integer_nat_to_decimal_string`, whose parameter is `v2.std.nat.Nat`, the Peano `Zero | Succ`
// `integer_nat_to_decimal_string` (then in `v2.std.integer`, since moved to `std.nat` as
// `nat_to_decimal_string` by gunbc#13436), whose parameter was `v2.std.nat.Nat`, the Peano `Zero | Succ`
// coproduct. Two materially different types sharing one spelling is the DESIGN section 3 meaning
// fork, and this instance is invisible exactly where it is authored: under the interpreter's
// numeric grounding the projection rendered 1 through 10 correctly, while the emitted closure
// refuses it. `v2.std.integer` `integer_int_to_decimal_string` records that same class as already
// refuses it. `std.integer` `int_to_decimal_string` records that same class as already
// repaired for two Int-valued callers, so re-introducing it would have been a silent regression of
// that fix. Every other `dag/gunbc` caller consumes the Int renderer; this one now does too.
//
Expand Down Expand Up @@ -653,7 +654,7 @@ fn obstacles_with_undeclared_step() -> List<OnboardingObstacle> {
// repair the rule roster above received, and the step ordinal was the last authored position left.

fn step_blocks(s: OnboardingStep, position: Int) -> List<MarkdownBlock> {
let head = h3(text: join([integer_int_to_decimal_string(value: position), ". ", (s.id as String)], ""))
let head = h3(text: join([int_to_decimal_string(value: position), ". ", (s.id as String)], ""))
let goal = p(text: (s.goal as String))
let who = p(text: join(["Who is needed: ", blocker_rendered(b: s.blocker)], ""))
let verify = p(text: join(["Done when: ", (s.verification as String)], ""))
Expand Down Expand Up @@ -690,7 +691,7 @@ fn onboarding_preamble_blocks() -> List<MarkdownBlock> {
p(text: "Generated from `gunbc.contributor_onboarding_path`. Do not hand-edit — the generated-artifact phase adjudicates this file against that authority. Every command below is derived from the authority that owns it, so this page moves when the build, the lane partition or the source roots move."),
p(text: "This page is an index of a path, not the proof that it works. What establishes the path is walking it: clone, build, run the lanes, make one change, get it reviewed, land it. If a step here does not work, that is a defect in the path and worth reporting as one — the obstacle roster below exists because each of its rows was hit rather than imagined."),
p(text: "`DESIGN.md` is the authority for every judgement about a change and is not a first-day document. The reading order at the end of this page says what you need before your first build, what you need before your first commit, and what can wait."),
p(text: join(["**", integer_int_to_decimal_string(value: count(onboarding_rules)), " RULES APPLY TO EVERY STEP BELOW, because three strangers walking this page lost their build to them.**"], "")),
p(text: join(["**", int_to_decimal_string(value: count(onboarding_rules)), " RULES APPLY TO EVERY STEP BELOW, because three strangers walking this page lost their build to them.**"], "")),
ol(items: map(onboarding_rules, r => li(text: join(["**", (r.name as String), ".** ", (r.rule as String)], "")))),
hr(),
]
Expand Down Expand Up @@ -723,7 +724,7 @@ fn onboarding_step_blocks() -> List<MarkdownBlock> {
[
[
h2(text: "The path"),
p(text: join([integer_int_to_decimal_string(value: count(onboarding_steps)), " steps in order. Run each verification before moving on: a step that half-worked is the expensive kind, because the failure surfaces several steps later attached to the wrong cause."], "")),
p(text: join([int_to_decimal_string(value: count(onboarding_steps)), " steps in order. Run each verification before moving on: a step that half-worked is the expensive kind, because the failure surfaces several steps later attached to the wrong cause."], "")),
],
rendered_step_blocks(steps: onboarding_steps),
],
Expand Down
3 changes: 2 additions & 1 deletion dag/gunbc/instruments/emit_host_fixtures.dag
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
module tools.emit_host_fixtures

import std.measure { ByteSize, byte_size }
import std.integer { int_to_decimal_string }

data rust_stdout_fixture_source: String = "fn main() { let _ = std::io::Write::write_all(&mut std::io::stdout(), &[0u8; 5]); }"

Expand All @@ -15,7 +16,7 @@ data ts_host_fixture_right_operand: Int = 3
data ts_host_fixture_expected_sum: Int = ts_host_fixture_left_operand + ts_host_fixture_right_operand

data ts_host_fixture_harness_suffix: String = "
const __gunbc_r = add({ts_host_fixture_left_operand}, {ts_host_fixture_right_operand});
const __gunbc_r = add({int_to_decimal_string(value: ts_host_fixture_left_operand)}, {int_to_decimal_string(value: ts_host_fixture_right_operand)});
const __gunbc_b = Buffer.alloc(4);
__gunbc_b.writeInt32LE(__gunbc_r, 0);
process.stdout.write(__gunbc_b);
Expand Down
11 changes: 6 additions & 5 deletions dag/gunbc/native_frontier_ratchet.dag
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import v2.std.node { symbol_lexeme }
import v2.std.algebra { any, filter, fold_list, is_empty, length, list_flat_map, list_map }
import std.algebra { list_append }
import v2.std.collection { Map, map_lookup }
import v2.std.integer { Int, integer_int_to_decimal_string }
import v2.std.integer { Int }
import std.integer { int_to_decimal_string }
import std.optional { Optional, Present, Absent, optional_present, optional_absent }
import extdeps.bazel.target_pattern { TargetPattern, target_pattern_within }
import v2.compiler.native_test_vocabulary {
Expand Down Expand Up @@ -321,7 +322,7 @@ fn native_frontier_flip_accept_to_refuse_row(f: NativeFrontierOwnedCorrectnessFl
fn native_frontier_flip_citation(f: NativeFrontierOwnedCorrectnessFlip) -> String {
join([
"v2.workflow.compile_door_cause_ownership correctness flip of gunbc#",
integer_int_to_decimal_string(value: f.flip.pull_request), " (", f.flip.why, ")"
int_to_decimal_string(value: f.flip.pull_request), " (", f.flip.why, ")"
], "")
}

Expand Down Expand Up @@ -659,22 +660,22 @@ fn native_frontier_report_lines(v: NativeFrontierVerdict) -> List<String> {
FrontierAdvanced { advanced: a, proposal: _ } =>
list_append(
left: [join([
integer_int_to_decimal_string(value: length(xs: a)),
int_to_decimal_string(value: length(xs: a)),
" roster change(s) the run supports, NOT YET APPLIED: the committed gunbc.native_frontier_roster stays authoritative until a reviewed pull request replaces it with the proposal below"
], "")],
right: a
)
FrontierGrewByOwnedCorrectnessFlip { flips: fl, advanced: a, proposal: _ } =>
list_append(
left: [join([
integer_int_to_decimal_string(value: length(xs: fl)),
int_to_decimal_string(value: length(xs: fl)),
" added identit(ies) owed debt under an owned correctness flip, NOT YET APPLIED: the committed gunbc.native_frontier_roster stays authoritative until a reviewed pull request replaces it with the proposal below"
], "")],
right: list_append(left: list_map(xs: fl, f: native_frontier_flip_text), right: a)
)
FrontierLost { findings: fs } => fs
FrontierUnminted { proposal: p } =>
[join(["UNMINTED: gunbc.native_frontier_roster carries no roster; this complete run proposes a universe of ", integer_int_to_decimal_string(value: length(xs: p.universe)), " identities and ", integer_int_to_decimal_string(value: length(xs: p.rows)), " debt row(s) for review"], "")]
[join(["UNMINTED: gunbc.native_frontier_roster carries no roster; this complete run proposes a universe of ", int_to_decimal_string(value: length(xs: p.universe)), " identities and ", int_to_decimal_string(value: length(xs: p.rows)), " debt row(s) for review"], "")]
FrontierNotAMeasurement { reasons: rs } =>
list_map(xs: rs, f: fn(r) { join(["NOT A MEASUREMENT ", r], "") })
}
Expand Down
4 changes: 2 additions & 2 deletions dag/gunbc/product/altra_motherboard/placement.dag
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module product.altra_motherboard.placement

import std.types { String, Bool, NonEmptyStr, List }
import std.integer { Int }
import std.integer { Int, int_to_decimal_string }
import std.decl_ref { DeclarationRef, declaration_ref_eq, decl_ref }
import std.coordinate_frame { CoordinateFrameIdentity, coordinate_frame_identity }
import std.affine_space { Point2, point2 }
Expand Down Expand Up @@ -748,7 +748,7 @@ fn memory_slot_obligations(d: AltraMinimalMotherboard) -> List<PlannedComponent>
let pos = dimm_slot_position_ordinal(p: s.position)
concat(acc, [obligation(
g: NeedsSomeoneToFindTheDocument { what_is_missing: "a selected part for the MemoryModuleSlot role; no vendor has been chosen, so there is no mechanical drawing to read a body envelope from" },
id: "dimm_ddr{ch}_slot{pos}",
id: "dimm_ddr{int_to_decimal_string(value: ch)}_slot{int_to_decimal_string(value: pos)}",
r: MemoryModuleSlot { slot: s },
x: 150000 + (pos * 14000),
y: 20000 + (ch * 12000)
Expand Down
10 changes: 5 additions & 5 deletions dag/gunbc/product/spatial_dimension.dag
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
module product.spatial_dimension

import std.types { Bool, NonEmptyStr, brand }
import std.nat { Nat }
import std.nat { Nat, nat_to_decimal_string }
import std.measure { Millimeter, millimeter_count }
import std.interval {
OrderedClosedInterval,
Expand Down Expand Up @@ -148,12 +148,12 @@ fn render_wire(dimension: RoomDimensionKnowledge) -> String {
let style = render_style_wire(style: render_style(rendering: rendering))
match rendering {
RenderMeasured { value: v, uncertainty: _ } =>
"<line class={style} data-mm={millimeter_count(m: v)}/>"
"<line class={style} data-mm={nat_to_decimal_string(value: millimeter_count(m: v))}/>"
RenderEstimated { region: r } =>
"<band class={style} data-low={millimeter_count(m: interval_low(interval: r))} data-high={millimeter_count(m: interval_high(interval: r))}/>"
"<band class={style} data-low={nat_to_decimal_string(value: millimeter_count(m: interval_low(interval: r)))} data-high={nat_to_decimal_string(value: millimeter_count(m: interval_high(interval: r)))}/>"
RenderHypothesis { value: v, purpose: _ } =>
"<line class={style} data-mm={millimeter_count(m: v)}/>"
"<line class={style} data-mm={nat_to_decimal_string(value: millimeter_count(m: v))}/>"
RenderUnknown { obligation: o } =>
"<obligation class={style} data-survey={o as String}/>"
concat("<obligation class=", concat(style, concat(" data-survey=", concat(o as String, "/>"))))
}
}
Loading
Loading