From eec1a9f39af2a7fd5402cf3502b2461d6f4318ee Mon Sep 17 00:00:00 2001 From: Justin <9146678+brickfrog@users.noreply.github.com> Date: Thu, 6 Aug 2026 21:34:18 -0500 Subject: [PATCH 1/2] chore: clear MoonBit v0.10.6 diagnostics Empty `{}` map literals now warn as ambiguous (E0082) and `try?` is deprecated (E0020). Replace 31 `{}` literals with `Map([])` and rewrite the two `try?` sites as `try ... catch ... noraise`, since neither bound `Result` escaped its expression. No public surface change: the only `.mbti` delta is a trailing blank line dropped by the newer `moon info`. --- src/cmd/main/pkg.generated.mbti | 1 - src/console/pkg.generated.mbti | 1 - src/env_filter.mbt | 2 +- src/event.mbt | 4 ++-- src/field.mbt | 2 +- src/field_show.mbt | 2 +- src/file/pkg.generated.mbti | 1 - src/flame/flame.mbt | 8 ++++---- src/flame/pkg.generated.mbti | 1 - src/id_test.mbt | 4 ++-- src/json/pkg.generated.mbti | 1 - src/otlp/convert.mbt | 12 ++++++------ src/otlp/pkg.generated.mbti | 1 - src/otlp/transport/pkg.generated.mbti | 1 - src/otlp/types.mbt | 24 ++++++++++++------------ src/pkg.generated.mbti | 1 - src/scoped_test.mbt | 7 +++++-- src/span_async/pkg.generated.mbti | 1 - src/span_json.mbt | 2 +- src/span_observer.mbt | 2 +- src/test/pkg.generated.mbti | 1 - src/test/test_subscriber_test.mbt | 7 +++++-- 22 files changed, 41 insertions(+), 45 deletions(-) diff --git a/src/cmd/main/pkg.generated.mbti b/src/cmd/main/pkg.generated.mbti index f579f9f..b754108 100644 --- a/src/cmd/main/pkg.generated.mbti +++ b/src/cmd/main/pkg.generated.mbti @@ -10,4 +10,3 @@ package "brickfrog/moontrace/cmd/main" // Type aliases // Traits - diff --git a/src/console/pkg.generated.mbti b/src/console/pkg.generated.mbti index fbfaf84..4421783 100644 --- a/src/console/pkg.generated.mbti +++ b/src/console/pkg.generated.mbti @@ -17,4 +17,3 @@ pub fn subscriber(min_level? : @moontrace.Level, output? : (String) -> Unit, col // Type aliases // Traits - diff --git a/src/env_filter.mbt b/src/env_filter.mbt index cf4ddeb..61f6806 100644 --- a/src/env_filter.mbt +++ b/src/env_filter.mbt @@ -51,7 +51,7 @@ pub fn parse_env_filter( directive : String, ) -> Result[ParsedFilter, EnvFilterError] { let mut default_level = Info - let filters : Map[String, Level] = {} + let filters : Map[String, Level] = Map([]) for raw_part in directive.split(",") { let part = trim_env_filter_part(raw_part) if !part.is_empty() { diff --git a/src/event.mbt b/src/event.mbt index b5544d6..1ca664d 100644 --- a/src/event.mbt +++ b/src/event.mbt @@ -38,7 +38,7 @@ fn merge_fields(fields : Array[Field]) -> Array[Field] { if global_context.val.is_empty() { fields } else { - let explicit_keys : Map[String, Bool] = {} + let explicit_keys : Map[String, Bool] = Map([]) fields.each(fn(f) { explicit_keys.set(f.key, true) }) let merged : Array[Field] = [] global_context.val.each(fn(k, v) { @@ -325,7 +325,7 @@ pub fn trace( ///| pub fn Event::to_json(self : Event) -> Json { - let m : Map[String, Json] = {} + let m : Map[String, Json] = Map([]) m.set("level", self.level.to_json()) m.set("message", self.message.to_json()) m.set("timestamp", self.timestamp.to_json()) diff --git a/src/field.mbt b/src/field.mbt index 444a4ca..19801e0 100644 --- a/src/field.mbt +++ b/src/field.mbt @@ -6,7 +6,7 @@ pub(all) struct Field { ///| pub fn fields_to_json(fields : Array[Field]) -> Json { - let m : Map[String, Json] = {} + let m : Map[String, Json] = Map([]) fields.each(fn(f) { m.set(f.key, f.value) }) m.to_json() } diff --git a/src/field_show.mbt b/src/field_show.mbt index 8b92706..e6d5a9c 100644 --- a/src/field_show.mbt +++ b/src/field_show.mbt @@ -7,7 +7,7 @@ pub impl Show for Field with fn output(self, logger) { ///| pub fn Field::to_json(self : Field) -> Json { - let m : Map[String, Json] = {} + let m : Map[String, Json] = Map([]) m.set(self.key, self.value) m.to_json() } diff --git a/src/file/pkg.generated.mbti b/src/file/pkg.generated.mbti index 5321d48..e202188 100644 --- a/src/file/pkg.generated.mbti +++ b/src/file/pkg.generated.mbti @@ -34,4 +34,3 @@ pub fn FileSubscriberConfig::new(String, max_size_bytes? : Int, max_files? : Int // Type aliases // Traits - diff --git a/src/flame/flame.mbt b/src/flame/flame.mbt index af9a71d..f589802 100644 --- a/src/flame/flame.mbt +++ b/src/flame/flame.mbt @@ -32,18 +32,18 @@ pub fn FlameExporter::reset(self : FlameExporter) -> Unit { ///| pub fn fold_spans(spans : Array[@moontrace.Span]) -> String { - let spans_by_id : Map[String, @moontrace.Span] = {} + let spans_by_id : Map[String, @moontrace.Span] = Map([]) spans.each(fn(span) { spans_by_id.set(span_key(span.trace_id, span.span_id), span) }) - let direct_child_duration_by_parent : Map[String, UInt64] = {} + let direct_child_duration_by_parent : Map[String, UInt64] = Map([]) spans.each(fn(span) { let parent = span_key(span.trace_id, span.parent_span_id) if valid_parent_edge(span, spans_by_id, spans.length()) { add_weight(direct_child_duration_by_parent, parent, span.duration()) } }) - let folded_weights : Map[String, UInt64] = {} + let folded_weights : Map[String, UInt64] = Map([]) spans.each(fn(span) { let child_duration = direct_child_duration_by_parent.get_or_default( span_key(span.trace_id, span.span_id), @@ -129,7 +129,7 @@ fn valid_parent_edge( Some(parent_span) => Some(parent_span) None => return false } - let visited : Map[String, Bool] = {} + let visited : Map[String, Bool] = Map([]) let mut remaining = span_count while remaining > 0 { match current { diff --git a/src/flame/pkg.generated.mbti b/src/flame/pkg.generated.mbti index 54f44f1..6074786 100644 --- a/src/flame/pkg.generated.mbti +++ b/src/flame/pkg.generated.mbti @@ -24,4 +24,3 @@ pub fn FlameExporter::span_observer(Self) -> @moontrace.SpanLifecycleObserver // Type aliases // Traits - diff --git a/src/id_test.mbt b/src/id_test.mbt index 08a8972..b0ea700 100644 --- a/src/id_test.mbt +++ b/src/id_test.mbt @@ -39,7 +39,7 @@ test "ids are non-zero" { ///| test "bulk trace ids are unique" { - let seen : Map[String, Bool] = {} + let seen : Map[String, Bool] = Map([]) for _ in 0..<1000 { let id = @moontrace.next_trace_id() assert_true(!seen.contains(id)) @@ -49,7 +49,7 @@ test "bulk trace ids are unique" { ///| test "bulk span ids are unique" { - let seen : Map[String, Bool] = {} + let seen : Map[String, Bool] = Map([]) for _ in 0..<1000 { let id = @moontrace.next_span_id() assert_true(!seen.contains(id)) diff --git a/src/json/pkg.generated.mbti b/src/json/pkg.generated.mbti index d1283b1..6a9bb38 100644 --- a/src/json/pkg.generated.mbti +++ b/src/json/pkg.generated.mbti @@ -17,4 +17,3 @@ pub fn subscriber(min_level? : @moontrace.Level, output? : (String) -> Unit) -> // Type aliases // Traits - diff --git a/src/otlp/convert.mbt b/src/otlp/convert.mbt index 499a7b1..0b92eba 100644 --- a/src/otlp/convert.mbt +++ b/src/otlp/convert.mbt @@ -55,15 +55,15 @@ pub fn wrap_log_records( resource? : Resource = resource(), scope? : InstrumentationScope = instrumentation_scope(), ) -> Json { - let scope_logs : Map[String, Json] = {} + let scope_logs : Map[String, Json] = Map([]) scope_logs.set("scope", scope.to_json()) scope_logs.set("logRecords", records.map(fn(r) { r.to_json() }).to_json()) - let resource_logs : Map[String, Json] = {} + let resource_logs : Map[String, Json] = Map([]) resource_logs.set("resource", resource.to_json()) resource_logs.set("scopeLogs", [scope_logs.to_json()].to_json()) - let root : Map[String, Json] = {} + let root : Map[String, Json] = Map([]) root.set("resourceLogs", [resource_logs.to_json()].to_json()) root.to_json() } @@ -76,15 +76,15 @@ pub fn wrap_spans( resource? : Resource = resource(), scope? : InstrumentationScope = instrumentation_scope(), ) -> Json { - let scope_spans : Map[String, Json] = {} + let scope_spans : Map[String, Json] = Map([]) scope_spans.set("scope", scope.to_json()) scope_spans.set("spans", spans.map(fn(s) { s.to_json() }).to_json()) - let resource_spans : Map[String, Json] = {} + let resource_spans : Map[String, Json] = Map([]) resource_spans.set("resource", resource.to_json()) resource_spans.set("scopeSpans", [scope_spans.to_json()].to_json()) - let root : Map[String, Json] = {} + let root : Map[String, Json] = Map([]) root.set("resourceSpans", [resource_spans.to_json()].to_json()) root.to_json() } diff --git a/src/otlp/pkg.generated.mbti b/src/otlp/pkg.generated.mbti index b9144d7..dcab76f 100644 --- a/src/otlp/pkg.generated.mbti +++ b/src/otlp/pkg.generated.mbti @@ -108,4 +108,3 @@ pub fn Resource::to_json(Self) -> Json // Type aliases // Traits - diff --git a/src/otlp/transport/pkg.generated.mbti b/src/otlp/transport/pkg.generated.mbti index 02b90db..bf1da06 100644 --- a/src/otlp/transport/pkg.generated.mbti +++ b/src/otlp/transport/pkg.generated.mbti @@ -112,4 +112,3 @@ pub impl Show for TransportError pub(open) trait OtlpHttpClient { async fn post(Self, String, String, Map[String, String]) -> Result[HttpResponse, TransportError] } - diff --git a/src/otlp/types.mbt b/src/otlp/types.mbt index be51847..e64eb2d 100644 --- a/src/otlp/types.mbt +++ b/src/otlp/types.mbt @@ -105,22 +105,22 @@ pub fn instrumentation_scope( pub fn OtlpValue::to_json(self : OtlpValue) -> Json { match self { StringVal(s) => { - let m : Map[String, Json] = {} + let m : Map[String, Json] = Map([]) m.set("stringValue", s.to_json()) m.to_json() } IntVal(i) => { - let m : Map[String, Json] = {} + let m : Map[String, Json] = Map([]) m.set("intValue", i.to_string().to_json()) m.to_json() } BoolVal(b) => { - let m : Map[String, Json] = {} + let m : Map[String, Json] = Map([]) m.set("boolValue", b.to_json()) m.to_json() } DoubleVal(d) => { - let m : Map[String, Json] = {} + let m : Map[String, Json] = Map([]) m.set("doubleValue", d.to_json()) m.to_json() } @@ -129,7 +129,7 @@ pub fn OtlpValue::to_json(self : OtlpValue) -> Json { ///| pub fn OtlpAttribute::to_json(self : OtlpAttribute) -> Json { - let m : Map[String, Json] = {} + let m : Map[String, Json] = Map([]) m.set("key", self.key.to_json()) m.set("value", self.value.to_json()) m.to_json() @@ -137,7 +137,7 @@ pub fn OtlpAttribute::to_json(self : OtlpAttribute) -> Json { ///| pub fn OtlpLink::to_json(self : OtlpLink) -> Json { - let m : Map[String, Json] = {} + let m : Map[String, Json] = Map([]) m.set("traceId", self.trace_id.to_json()) m.set("spanId", self.span_id.to_json()) if !self.trace_state.is_empty() { @@ -149,7 +149,7 @@ pub fn OtlpLink::to_json(self : OtlpLink) -> Json { ///| pub fn OtlpSpan::to_json(self : OtlpSpan) -> Json { - let m : Map[String, Json] = {} + let m : Map[String, Json] = Map([]) m.set("traceId", self.trace_id.to_json()) m.set("spanId", self.span_id.to_json()) if !self.parent_span_id.is_empty() { @@ -162,7 +162,7 @@ pub fn OtlpSpan::to_json(self : OtlpSpan) -> Json { m.set("endTimeUnixNano", self.end_time_unix_nano.to_string().to_json()) m.set("attributes", self.attributes.map(fn(a) { a.to_json() }).to_json()) m.set("links", self.links.map(fn(link) { link.to_json() }).to_json()) - let status : Map[String, Json] = {} + let status : Map[String, Json] = Map([]) status.set("code", self.status_code.to_json()) if !self.status_message.is_empty() { status.set("message", self.status_message.to_json()) @@ -173,11 +173,11 @@ pub fn OtlpSpan::to_json(self : OtlpSpan) -> Json { ///| pub fn OtlpLogRecord::to_json(self : OtlpLogRecord) -> Json { - let m : Map[String, Json] = {} + let m : Map[String, Json] = Map([]) m.set("timeUnixNano", self.time_unix_nano.to_string().to_json()) m.set("severityNumber", self.severity_number.to_json()) m.set("severityText", self.severity_text.to_json()) - let body : Map[String, Json] = {} + let body : Map[String, Json] = Map([]) body.set("stringValue", self.body.to_json()) m.set("body", body.to_json()) m.set("attributes", self.attributes.map(fn(a) { a.to_json() }).to_json()) @@ -186,14 +186,14 @@ pub fn OtlpLogRecord::to_json(self : OtlpLogRecord) -> Json { ///| pub fn Resource::to_json(self : Resource) -> Json { - let m : Map[String, Json] = {} + let m : Map[String, Json] = Map([]) m.set("attributes", self.attributes.map(fn(a) { a.to_json() }).to_json()) m.to_json() } ///| pub fn InstrumentationScope::to_json(self : InstrumentationScope) -> Json { - let m : Map[String, Json] = {} + let m : Map[String, Json] = Map([]) m.set("name", self.name.to_json()) if !self.version.is_empty() { m.set("version", self.version.to_json()) diff --git a/src/pkg.generated.mbti b/src/pkg.generated.mbti index 1f362da..acd8645 100644 --- a/src/pkg.generated.mbti +++ b/src/pkg.generated.mbti @@ -452,4 +452,3 @@ pub struct TraceStateEntry { // Type aliases // Traits - diff --git a/src/scoped_test.mbt b/src/scoped_test.mbt index 07a55aa..5608d73 100644 --- a/src/scoped_test.mbt +++ b/src/scoped_test.mbt @@ -134,8 +134,11 @@ test "with_trace_state restores all globals after raised failure" { }) } - let result : Result[Unit, ScopedFailure] = try? fail_in_scope() - guard result is Err(_) else { abort("expected scoped failure") } + try fail_in_scope() catch { + _ => () + } noraise { + _ => abort("expected scoped failure") + } @moontrace.info("blocked after failure") @moontrace.warn("blocked by restored module filter after failure") diff --git a/src/span_async/pkg.generated.mbti b/src/span_async/pkg.generated.mbti index 0110994..5224974 100644 --- a/src/span_async/pkg.generated.mbti +++ b/src/span_async/pkg.generated.mbti @@ -17,4 +17,3 @@ pub async fn[T] with_span_async(String, fields? : Array[@moontrace.Field], async // Type aliases // Traits - diff --git a/src/span_json.mbt b/src/span_json.mbt index 661ef5b..36da630 100644 --- a/src/span_json.mbt +++ b/src/span_json.mbt @@ -1,6 +1,6 @@ ///| pub fn Span::to_json(self : Span) -> Json { - let m : Map[String, Json] = {} + let m : Map[String, Json] = Map([]) m.set("name", self.name.to_json()) m.set("trace_id", self.trace_id.to_json()) m.set("span_id", self.span_id.to_json()) diff --git a/src/span_observer.mbt b/src/span_observer.mbt index b429173..9299a69 100644 --- a/src/span_observer.mbt +++ b/src/span_observer.mbt @@ -214,7 +214,7 @@ pub fn SpanLinkKind::to_json(self : SpanLinkKind) -> Json { ///| pub fn SpanLink::to_json(self : SpanLink) -> Json { - let m : Map[String, Json] = {} + let m : Map[String, Json] = Map([]) m.set("trace_id", self.trace_id.to_json()) m.set("span_id", self.span_id.to_json()) m.set("kind", self.kind.to_json()) diff --git a/src/test/pkg.generated.mbti b/src/test/pkg.generated.mbti index a1bb7f0..1d540c2 100644 --- a/src/test/pkg.generated.mbti +++ b/src/test/pkg.generated.mbti @@ -121,4 +121,3 @@ pub fn[T] TestSubscriber::with_install(Self, () -> T raise?) -> T raise? // Type aliases // Traits - diff --git a/src/test/test_subscriber_test.mbt b/src/test/test_subscriber_test.mbt index 8e8449d..680c8b6 100644 --- a/src/test/test_subscriber_test.mbt +++ b/src/test/test_subscriber_test.mbt @@ -379,8 +379,11 @@ test "scoped install restores global subscriber and observer on raise" { }) } - let result : Result[Unit, ExampleFailure] = try? fail_in_scope() - guard result is Err(_) else { abort("expected ExampleFailure") } + try fail_in_scope() catch { + _ => () + } noraise { + _ => abort("expected ExampleFailure") + } @moontrace.info("after failure") let after_span = @moontrace.span("after failure span") From 6f4b68ff9253188fc6b0f3a6d6d0b624c3b192d4 Mon Sep 17 00:00:00 2001 From: Justin <9146678+brickfrog@users.noreply.github.com> Date: Thu, 6 Aug 2026 21:39:41 -0500 Subject: [PATCH 2/2] chore: pin CI toolchain to MoonBit 0.10.6 The repo now builds against moonc v0.10.6; the pin was still on 0.10.5, so CI would verify against a compiler that predates the diagnostics this branch clears. SHA-256 digests recomputed for both archives. Verified by running the pinned installer plus the full CI matrix (check and test on native/js/wasm-gc, and the fmt check) against the resulting isolated MOON_HOME. --- .github/scripts/setup-moonbit.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/scripts/setup-moonbit.sh b/.github/scripts/setup-moonbit.sh index be5fc45..7502bdc 100755 --- a/.github/scripts/setup-moonbit.sh +++ b/.github/scripts/setup-moonbit.sh @@ -2,11 +2,11 @@ set -euo pipefail -readonly MOONBIT_VERSION='0.10.5+5e7afb0c0' -readonly MOONBIT_VERSION_URL='0.10.5%2B5e7afb0c0' +readonly MOONBIT_VERSION='0.10.6+80dc50f24' +readonly MOONBIT_VERSION_URL='0.10.6%2B80dc50f24' readonly MOONBIT_BASE_URL='https://cli.moonbitlang.com' -readonly TOOLCHAIN_SHA256='07da4e4b21d3ea203b00183906e9e6a3104d77b9756a95c4d9e648471cf2e2d8' -readonly CORE_SHA256='d92991190e30d10a1ab6fcd7d0282b8ddd0004d0309bc40fbc056310cf20bfc5' +readonly TOOLCHAIN_SHA256='c67ad4e31320a5b0cce388eec51a4c9384b7f902e8d27e7479f2612491b13b6f' +readonly CORE_SHA256='a3ca729f2517b7c6170a2645aba9aae79154b3d71f13302470c9953311398174' : "${RUNNER_TEMP:?RUNNER_TEMP must be set}" : "${GITHUB_ENV:?GITHUB_ENV must be set}"