log/slog — validation proof
Go’s own log/slog test suite, converted to C# by go2cs, built against the converted standard
library, run under the Go-semantics test host, and compared verdict for verdict against a clean
go test -json baseline of the same sources. This page is generated by the converter from that
comparison — it is the evidence behind the log/slog row in
Validated Test Packages.
Validated 2026-10-25 · converter 3e3f18925
228 matched · 21 disclosed — Go 1.26.10, windows/amd64, converted package
src/core/log/slog.
Measured at Release (tiered JIT off), oracle go version go1.26.10 windows/amd64.
Verdicts
| Test | go test |
go2cs |
|---|---|---|
TestAliasingAndClone |
pass | pass |
TestAlloc |
pass | fail (disclosed) |
TestAlloc/2_pairs |
pass | fail (disclosed) |
TestAlloc/2_pairs_disabled |
pass | pass |
TestAlloc/2_pairs_disabled_inline |
pass | fail (disclosed) |
TestAlloc/9_kvs |
pass | fail (disclosed) |
TestAlloc/Error |
pass | fail (disclosed) |
TestAlloc/Info |
pass | fail (disclosed) |
TestAlloc/attrs1 |
pass | fail (disclosed) |
TestAlloc/attrs3 |
pass | fail (disclosed) |
TestAlloc/attrs3_disabled |
pass | fail (disclosed) |
TestAlloc/attrs6 |
pass | fail (disclosed) |
TestAlloc/attrs9 |
pass | fail (disclosed) |
TestAlloc/logger.Info |
pass | fail (disclosed) |
TestAlloc/logger.Log |
pass | fail (disclosed) |
TestAlloc/pairs |
pass | fail (disclosed) |
TestAnyLevelAlloc |
pass | fail (disclosed) |
TestAnyValue |
pass | pass |
TestAppendJSONValue |
pass | pass |
TestAttrNoAlloc |
pass | fail (disclosed) |
TestAttrs |
pass | pass |
TestCallDepth |
pass | pass |
TestCallDepthConnection |
pass | pass |
TestCallDepthConnection/log.Default.Fatal |
pass | pass |
TestCallDepthConnection/log.Default.Fatalf |
pass | pass |
TestCallDepthConnection/log.Default.Fatalln |
pass | pass |
TestCallDepthConnection/log.Default.Output |
pass | pass |
TestCallDepthConnection/log.Default.Panic |
pass | pass |
TestCallDepthConnection/log.Default.Panicf |
pass | pass |
TestCallDepthConnection/log.Default.Panicln |
pass | pass |
TestCallDepthConnection/log.Fatal |
pass | pass |
TestCallDepthConnection/log.Fatalf |
pass | pass |
TestCallDepthConnection/log.Fatalln |
pass | pass |
TestCallDepthConnection/log.Output |
pass | pass |
TestCallDepthConnection/log.Panic |
pass | pass |
TestCallDepthConnection/log.Panicf |
pass | pass |
TestCallDepthConnection/log.Panicln |
pass | pass |
TestConcurrentWrites |
pass | pass |
TestConcurrentWrites/json |
pass | pass |
TestConcurrentWrites/text |
pass | pass |
TestConnections |
pass | pass |
TestConnections/wrap_default_handler |
pass | pass |
TestContext |
pass | pass |
TestDefaultHandle |
pass | pass |
TestDefaultHandle/attrs |
pass | pass |
TestDefaultHandle/group |
pass | pass |
TestDefaultHandle/groups |
pass | pass |
TestDefaultHandle/no_attrs |
pass | pass |
TestDefaultHandle/preformatted |
pass | pass |
TestDefaultHandle/preformatted_groups |
pass | pass |
TestDefaultHandle/two_with-groups |
pass | pass |
TestDiscardHandler |
pass | pass |
TestEmptyGroup |
pass | pass |
TestHandlerEnabled |
pass | pass |
TestJSONAllocs |
pass | fail (disclosed) |
TestJSONAllocs/attrs |
pass | fail (disclosed) |
TestJSONAllocs/message |
pass | fail (disclosed) |
TestJSONAndTextHandlers |
pass | pass |
TestJSONAndTextHandlers/GroupValue_as_Attr_value |
pass | pass |
TestJSONAndTextHandlers/GroupValue_as_Attr_value/json |
pass | pass |
TestJSONAndTextHandlers/GroupValue_as_Attr_value/text |
pass | pass |
TestJSONAndTextHandlers/LogValuer |
pass | pass |
TestJSONAndTextHandlers/LogValuer/json |
pass | pass |
TestJSONAndTextHandlers/LogValuer/text |
pass | pass |
TestJSONAndTextHandlers/Source |
pass | pass |
TestJSONAndTextHandlers/Source/json |
pass | pass |
TestJSONAndTextHandlers/Source/text |
pass | pass |
TestJSONAndTextHandlers/basic |
pass | pass |
TestJSONAndTextHandlers/basic/json |
pass | pass |
TestJSONAndTextHandlers/basic/text |
pass | pass |
TestJSONAndTextHandlers/byte_slice |
pass | pass |
TestJSONAndTextHandlers/byte_slice/json |
pass | pass |
TestJSONAndTextHandlers/byte_slice/text |
pass | pass |
TestJSONAndTextHandlers/cap_keys |
pass | pass |
TestJSONAndTextHandlers/cap_keys/json |
pass | pass |
TestJSONAndTextHandlers/cap_keys/text |
pass | pass |
TestJSONAndTextHandlers/empty_group |
pass | pass |
TestJSONAndTextHandlers/empty_group/json |
pass | pass |
TestJSONAndTextHandlers/empty_group/text |
pass | pass |
TestJSONAndTextHandlers/empty_key |
pass | pass |
TestJSONAndTextHandlers/empty_key/json |
pass | pass |
TestJSONAndTextHandlers/empty_key/text |
pass | pass |
TestJSONAndTextHandlers/empty_with-groups |
pass | pass |
TestJSONAndTextHandlers/empty_with-groups,_no_non-empty_attrs |
pass | pass |
TestJSONAndTextHandlers/empty_with-groups,_no_non-empty_attrs/json |
pass | pass |
TestJSONAndTextHandlers/empty_with-groups,_no_non-empty_attrs/text |
pass | pass |
TestJSONAndTextHandlers/empty_with-groups/json |
pass | pass |
TestJSONAndTextHandlers/empty_with-groups/text |
pass | pass |
TestJSONAndTextHandlers/escapes |
pass | pass |
TestJSONAndTextHandlers/escapes/json |
pass | pass |
TestJSONAndTextHandlers/escapes/text |
pass | pass |
TestJSONAndTextHandlers/group_and_key_(or_both)_needs_quoting |
pass | pass |
TestJSONAndTextHandlers/group_and_key_(or_both)_needs_quoting/json |
pass | pass |
TestJSONAndTextHandlers/group_and_key_(or_both)_needs_quoting/text |
pass | pass |
TestJSONAndTextHandlers/groups |
pass | pass |
TestJSONAndTextHandlers/groups/json |
pass | pass |
TestJSONAndTextHandlers/groups/text |
pass | pass |
TestJSONAndTextHandlers/inline_group |
pass | pass |
TestJSONAndTextHandlers/inline_group/json |
pass | pass |
TestJSONAndTextHandlers/inline_group/text |
pass | pass |
TestJSONAndTextHandlers/json.RawMessage |
pass | pass |
TestJSONAndTextHandlers/json.RawMessage/json |
pass | pass |
TestJSONAndTextHandlers/json.RawMessage/text |
pass | pass |
TestJSONAndTextHandlers/nested_empty_group |
pass | pass |
TestJSONAndTextHandlers/nested_empty_group/json |
pass | pass |
TestJSONAndTextHandlers/nested_empty_group/text |
pass | pass |
TestJSONAndTextHandlers/nested_non-empty_group |
pass | pass |
TestJSONAndTextHandlers/nested_non-empty_group/json |
pass | pass |
TestJSONAndTextHandlers/nested_non-empty_group/text |
pass | pass |
TestJSONAndTextHandlers/one_empty_with-group |
pass | pass |
TestJSONAndTextHandlers/one_empty_with-group/json |
pass | pass |
TestJSONAndTextHandlers/one_empty_with-group/text |
pass | pass |
TestJSONAndTextHandlers/preformatted |
pass | pass |
TestJSONAndTextHandlers/preformatted/json |
pass | pass |
TestJSONAndTextHandlers/preformatted/text |
pass | pass |
TestJSONAndTextHandlers/preformatted_cap_keys |
pass | pass |
TestJSONAndTextHandlers/preformatted_cap_keys/json |
pass | pass |
TestJSONAndTextHandlers/preformatted_cap_keys/text |
pass | pass |
TestJSONAndTextHandlers/preformatted_remove_all |
pass | pass |
TestJSONAndTextHandlers/preformatted_remove_all/json |
pass | pass |
TestJSONAndTextHandlers/preformatted_remove_all/text |
pass | pass |
TestJSONAndTextHandlers/preformatted_remove_built-in |
pass | pass |
TestJSONAndTextHandlers/preformatted_remove_built-in/json |
pass | pass |
TestJSONAndTextHandlers/preformatted_remove_built-in/text |
pass | pass |
TestJSONAndTextHandlers/preformatted_with-groups |
pass | pass |
TestJSONAndTextHandlers/preformatted_with-groups/json |
pass | pass |
TestJSONAndTextHandlers/preformatted_with-groups/text |
pass | pass |
TestJSONAndTextHandlers/remove_all |
pass | pass |
TestJSONAndTextHandlers/remove_all/json |
pass | pass |
TestJSONAndTextHandlers/remove_all/text |
pass | pass |
TestJSONAndTextHandlers/remove_built-in |
pass | pass |
TestJSONAndTextHandlers/remove_built-in/json |
pass | pass |
TestJSONAndTextHandlers/remove_built-in/text |
pass | pass |
TestJSONAndTextHandlers/replace_built-in_with_group |
pass | pass |
TestJSONAndTextHandlers/replace_built-in_with_group/json |
pass | pass |
TestJSONAndTextHandlers/replace_built-in_with_group/text |
pass | pass |
TestJSONAndTextHandlers/replace_empty |
pass | pass |
TestJSONAndTextHandlers/replace_empty/json |
pass | pass |
TestJSONAndTextHandlers/replace_empty/text |
pass | pass |
TestJSONAndTextHandlers/replace_empty_1 |
pass | pass |
TestJSONAndTextHandlers/replace_empty_1/json |
pass | pass |
TestJSONAndTextHandlers/replace_empty_1/text |
pass | pass |
TestJSONAndTextHandlers/replace_empty_2 |
pass | pass |
TestJSONAndTextHandlers/replace_empty_2/json |
pass | pass |
TestJSONAndTextHandlers/replace_empty_2/text |
pass | pass |
TestJSONAndTextHandlers/replace_empty_3 |
pass | pass |
TestJSONAndTextHandlers/replace_empty_3/json |
pass | pass |
TestJSONAndTextHandlers/replace_empty_3/text |
pass | pass |
TestJSONAndTextHandlers/replace_empty_inline |
pass | pass |
TestJSONAndTextHandlers/replace_empty_inline/json |
pass | pass |
TestJSONAndTextHandlers/replace_empty_inline/text |
pass | pass |
TestJSONAndTextHandlers/replace_partial_empty_attrs_1 |
pass | pass |
TestJSONAndTextHandlers/replace_partial_empty_attrs_1/json |
pass | pass |
TestJSONAndTextHandlers/replace_partial_empty_attrs_1/text |
pass | pass |
TestJSONAndTextHandlers/replace_partial_empty_attrs_2 |
pass | pass |
TestJSONAndTextHandlers/replace_partial_empty_attrs_2/json |
pass | pass |
TestJSONAndTextHandlers/replace_partial_empty_attrs_2/text |
pass | pass |
TestJSONAndTextHandlers/replace_partial_empty_attrs_3 |
pass | pass |
TestJSONAndTextHandlers/replace_partial_empty_attrs_3/json |
pass | pass |
TestJSONAndTextHandlers/replace_partial_empty_attrs_3/text |
pass | pass |
TestJSONAndTextHandlers/replace_resolved_group |
pass | pass |
TestJSONAndTextHandlers/replace_resolved_group/json |
pass | pass |
TestJSONAndTextHandlers/replace_resolved_group/text |
pass | pass |
TestJSONAndTextHandlers/resolve |
pass | pass |
TestJSONAndTextHandlers/resolve/json |
pass | pass |
TestJSONAndTextHandlers/resolve/text |
pass | pass |
TestJSONAndTextHandlers/two_with-groups |
pass | pass |
TestJSONAndTextHandlers/two_with-groups/json |
pass | pass |
TestJSONAndTextHandlers/two_with-groups/text |
pass | pass |
TestJSONAndTextHandlers/with-group |
pass | pass |
TestJSONAndTextHandlers/with-group/json |
pass | pass |
TestJSONAndTextHandlers/with-group/text |
pass | pass |
TestJSONAndTextHandlersWithUnavailableSource |
pass | pass |
TestJSONAndTextHandlersWithUnavailableSource/json |
pass | pass |
TestJSONAndTextHandlersWithUnavailableSource/text |
pass | pass |
TestJSONAppendAttrValueSpecial |
pass | pass |
TestJSONHandler |
pass | pass |
TestJSONHandler/none |
pass | pass |
TestJSONHandler/replace |
pass | pass |
TestKindString |
pass | pass |
TestLevelAppendText |
pass | pass |
TestLevelFlag |
pass | pass |
TestLevelMarshalJSON |
pass | pass |
TestLevelMarshalText |
pass | pass |
TestLevelParse |
pass | pass |
TestLevelParseError |
pass | pass |
TestLevelString |
pass | pass |
TestLevelVar |
pass | pass |
TestLevelVarAppendText |
pass | pass |
TestLevelVarFlag |
pass | pass |
TestLevelVarMarshalText |
pass | pass |
TestLevelVarString |
pass | pass |
TestLogLoggerLevelForDefaultHandler |
pass | pass |
TestLogLoggerLevelForHandlerWriter |
pass | pass |
TestLogTextHandler |
pass | pass |
TestLogValue |
pass | pass |
TestLoggerError |
pass | pass |
TestLoggerNoOps |
pass | pass |
TestMultiHandler |
pass | pass |
TestMultiHandler/Enabled_returns_false_if_no_handlers_are_enabled |
pass | pass |
TestMultiHandler/Enabled_returns_true_if_any_handler_is_enabled |
pass | pass |
TestMultiHandler/Handle_propagates_errors_from_handlers |
pass | pass |
TestMultiHandler/Handle_sends_log_to_all_handlers |
pass | pass |
TestMultiHandler/Handle_with_no_handlers |
pass | pass |
TestMultiHandler/WithAttrs_propagates_attributes_to_all_handlers |
pass | pass |
TestMultiHandler/WithGroup_propagates_group_to_all_handlers |
pass | pass |
TestNeedsQuoting |
pass | pass |
TestNewLogLogger |
pass | pass |
TestNewMultiHandlerCopy |
pass | pass |
TestPanics |
pass | pass |
TestRecordAttrs |
pass | pass |
TestRecordSource |
pass | pass |
TestReplaceAttrGroups |
pass | pass |
TestSecondWith |
pass | pass |
TestSetAttrs |
pass | pass |
TestSetDefault |
pass | pass |
TestSlogtest |
pass | pass |
TestSlogtest/JSON |
pass | pass |
TestSlogtest/Text |
pass | pass |
TestTextHandler |
pass | pass |
TestTextHandler/String_method |
pass | pass |
TestTextHandler/String_method/none |
pass | pass |
TestTextHandler/String_method/replace |
pass | pass |
TestTextHandler/TextMarshaler |
pass | pass |
TestTextHandler/TextMarshaler/none |
pass | pass |
TestTextHandler/TextMarshaler/replace |
pass | pass |
TestTextHandler/TextMarshaler_error |
pass | pass |
TestTextHandler/TextMarshaler_error/none |
pass | pass |
TestTextHandler/TextMarshaler_error/replace |
pass | pass |
TestTextHandler/nil_value |
pass | pass |
TestTextHandler/nil_value/none |
pass | pass |
TestTextHandler/nil_value/replace |
pass | pass |
TestTextHandler/quoted |
pass | pass |
TestTextHandler/quoted/none |
pass | pass |
TestTextHandler/quoted/replace |
pass | pass |
TestTextHandler/struct |
pass | pass |
TestTextHandler/struct/none |
pass | pass |
TestTextHandler/struct/replace |
pass | pass |
TestTextHandler/unquoted |
pass | pass |
TestTextHandler/unquoted/none |
pass | pass |
TestTextHandler/unquoted/replace |
pass | pass |
TestTextHandlerAlloc |
pass | fail (disclosed) |
TestTextHandlerPreformatted |
pass | pass |
TestValueAny |
pass | pass |
TestValueEqual |
pass | pass |
TestValueNoAlloc |
pass | fail (disclosed) |
TestValueString |
pass | pass |
TestValueTime |
pass | pass |
TestWriteTimeRFC3339 |
pass | pass |
Disclosed divergences
A disclosed divergence is a specific Go assertion this conversion does not satisfy — not
a skipped test and not a tolerance. Each one is pinned by exact failure signature in the package’s
hand-owned go2cs_test_disclosures.json;
a disclosed test that fails any other way is still a hard mismatch.
The Class column says which kind each one is: a deferred entry is an assertion the managed
CLR can meet, pinned against the named plan that will retire it; every other class is one it
provably cannot satisfy.
| Test | Class | Pinned reason |
|---|---|---|
TestAlloc |
aggregate |
no failure text of its own — the roll-up of this test’s disclosed subtests |
TestAlloc/2_pairs |
deferred |
wantAllocs assert with a NONZERO Go budget (2): the managed model pays a heap shell per boxed pair on top of Go’s two budgeted allocations, so the divergence is the shell count rather than the assert’s premise. RELABEL 2026-09-23 (C1, as ruled at ledger 2026-09-23 03:37 O2): alloc-profile -> deferred. The boxing/shell proof above is WITHDRAWN: the counter never charges a CLR box or an interface shell (AllocationCounter.cs:50-53), so it cannot explain a COUNT reading. The composition in the plan was READ in the emission at bb54ff0920 (C1); it replaces the ruling’s fitted F6/F7 for this row: F6 is the per-call literal (the converter’s degenerate-slug floor, hoistedLiteralOperations.go:103) and F7 the StringData element reference. RE-READ AT go1.26.10 (2026-10-25, G): reading moved from 10 per run at go1.24.13 to 6 per run on windows and linux; the test body changed between go1.24.13 and go1.26.10. |
TestAlloc/2_pairs_disabled_inline |
deferred |
wantAllocs(t, 0, …) over Logger.Log at LevelInfo with two key/value pairs, on a Logger over DiscardHandler, so the level check fails and nothing is formatted. go1.24.13 asserted wantAllocs(t, 2, …) here and the converted side met it; go1.26.10 tightened the budget to 0, and the converted side still counts 2 per run on both OSes. Its parent TestAlloc discloses as aggregate, with no entry of its own (plan §6). |
TestAlloc/9_kvs |
deferred |
wantAllocs assert with a nonzero Go budget (10): nine key/value pairs box into nine heap shells above Go’s budgeted slice growth. RELABEL 2026-09-23 (C1, as ruled at ledger 2026-09-23 03:37 O2): alloc-profile -> deferred. The boxing/shell proof above is WITHDRAWN: the counter never charges a CLR box or an interface shell (AllocationCounter.cs:50-53), so it cannot explain a COUNT reading. The composition in the plan was READ in the emission at bb54ff0920 (C1); it replaces the ruling’s fitted F6/F7 for this row: F6 is the per-call literal (the converter’s degenerate-slug floor, hoistedLiteralOperations.go:103) and F7 the StringData element reference. RE-READ AT go1.26.10 (2026-10-25, G): reading moved from 27 per run at go1.24.13 to 16 per run on windows and linux; the test body changed between go1.24.13 and go1.26.10. |
TestAlloc/Error |
deferred |
wantAllocs assert: same ...any boxing as TestAlloc/Info on the Error level path — one heap shell per argument where Go’s interface value allocates nothing. RELABEL 2026-09-23 (C1, as ruled at ledger 2026-09-23 03:37 O2): alloc-profile -> deferred. The boxing/shell proof above is WITHDRAWN: the counter never charges a CLR box or an interface shell (AllocationCounter.cs:50-53), so it cannot explain a COUNT reading. The composition in the plan was READ in the emission at bb54ff0920 (C1). |
TestAlloc/Info |
deferred |
wantAllocs assert: the variadic ...any argument list boxes each value into a heap shell where Go’s interface value is two words carrying the data pointer inline (DESIGN-iface-shell-caching §2 — ‘C# has no two-word interface value; the shell IS the itab+data fused into an object’). RELABEL 2026-09-23 (C1, as ruled at ledger 2026-09-23 03:37 O2): alloc-profile -> deferred. The boxing/shell proof above is WITHDRAWN: the counter never charges a CLR box or an interface shell (AllocationCounter.cs:50-53), so it cannot explain a COUNT reading. The composition in the plan was READ in the emission at bb54ff0920 (C1). |
TestAlloc/attrs1 |
deferred |
wantAllocs assert: constructing one Attr materializes a boxed Value in the managed model where Go’s Value packs the payload into its own struct fields. RELABEL 2026-09-23 (C1, as ruled at ledger 2026-09-23 03:37 O2): alloc-profile -> deferred. The boxing/shell proof above is WITHDRAWN: the counter never charges a CLR box or an interface shell (AllocationCounter.cs:50-53), so it cannot explain a COUNT reading. The composition in the plan was READ in the emission at bb54ff0920 (C1); it replaces the ruling’s fitted F6/F7 for this row: F6 is the per-call literal (the converter’s degenerate-slug floor, hoistedLiteralOperations.go:103) and F7 the StringData element reference. RE-READ AT go1.26.10 (2026-10-25, G): reading moved from 7 per run at go1.24.13 to 4 per run on windows and linux; the test body changed between go1.24.13 and go1.26.10. |
TestAlloc/attrs3 |
deferred |
wantAllocs assert: three Attrs, each carrying a boxed Value shell that Go’s packed Value representation does not allocate. RELABEL 2026-09-23 (C1, as ruled at ledger 2026-09-23 03:37 O2): alloc-profile -> deferred. The boxing/shell proof above is WITHDRAWN: the counter never charges a CLR box or an interface shell (AllocationCounter.cs:50-53), so it cannot explain a COUNT reading. The composition in the plan was READ in the emission at bb54ff0920 (C1); it replaces the ruling’s fitted F6/F7 for this row: F6 is the per-call literal (the converter’s degenerate-slug floor, hoistedLiteralOperations.go:103) and F7 the StringData element reference. RE-READ AT go1.26.10 (2026-10-25, G): reading moved from 12 per run at go1.24.13 to 7 per run on windows and linux; the test body changed between go1.24.13 and go1.26.10. |
TestAlloc/attrs3_disabled |
deferred |
wantAllocs assert: the Attrs are constructed — and therefore boxed — before the level check discards them, so the level-disabled path allocates in the managed model exactly as the enabled one does. RELABEL 2026-09-23 (C1, as ruled at ledger 2026-09-23 03:37 O2): alloc-profile -> deferred. The boxing/shell proof above is WITHDRAWN: the counter never charges a CLR box or an interface shell (AllocationCounter.cs:50-53), so it cannot explain a COUNT reading. The composition in the plan was READ in the emission at bb54ff0920 (C1); it replaces the ruling’s fitted F6/F7 for this row: F6 is the per-call literal (the converter’s degenerate-slug floor, hoistedLiteralOperations.go:103) and F7 the StringData element reference. RE-READ AT go1.26.10 (2026-10-25, G): reading moved from 9 per run at go1.24.13 to 4 per run on windows and linux; the test body changed between go1.24.13 and go1.26.10. |
TestAlloc/attrs6 |
deferred |
wantAllocs assert with a nonzero Go budget (1): six Attrs box six Values above Go’s single budgeted allocation. RELABEL 2026-09-23 (C1, as ruled at ledger 2026-09-23 03:37 O2): alloc-profile -> deferred. The boxing/shell proof above is WITHDRAWN: the counter never charges a CLR box or an interface shell (AllocationCounter.cs:50-53), so it cannot explain a COUNT reading. The composition in the plan was READ in the emission at bb54ff0920 (C1); it replaces the ruling’s fitted F6/F7 for this row: F6 is the per-call literal (the converter’s degenerate-slug floor, hoistedLiteralOperations.go:103) and F7 the StringData element reference. RE-READ AT go1.26.10 (2026-10-25, G): reading moved from 21 per run at go1.24.13 to 12 per run on windows and linux; the test body changed between go1.24.13 and go1.26.10. |
TestAlloc/attrs9 |
deferred |
wantAllocs assert with a nonzero Go budget (1): nine Attrs box nine Values above Go’s single budgeted allocation. RELABEL 2026-09-23 (C1, as ruled at ledger 2026-09-23 03:37 O2): alloc-profile -> deferred. The boxing/shell proof above is WITHDRAWN: the counter never charges a CLR box or an interface shell (AllocationCounter.cs:50-53), so it cannot explain a COUNT reading. The composition in the plan was READ in the emission at bb54ff0920 (C1); it replaces the ruling’s fitted F6/F7 for this row: F6 is the per-call literal (the converter’s degenerate-slug floor, hoistedLiteralOperations.go:103) and F7 the StringData element reference. RE-READ AT go1.26.10 (2026-10-25, G): reading moved from 28 per run at go1.24.13 to 16 per run on windows and linux; the test body changed between go1.24.13 and go1.26.10. |
TestAlloc/logger.Info |
deferred |
wantAllocs assert: the Logger.Info convenience path boxes its ...any arguments into heap shells where Go passes two-word interface values. RELABEL 2026-09-23 (C1, as ruled at ledger 2026-09-23 03:37 O2): alloc-profile -> deferred. The boxing/shell proof above is WITHDRAWN: the counter never charges a CLR box or an interface shell (AllocationCounter.cs:50-53), so it cannot explain a COUNT reading. The composition in the plan was READ in the emission at bb54ff0920 (C1). |
TestAlloc/logger.Log |
deferred |
wantAllocs assert: the Logger.Log path boxes its ...any arguments into heap shells where Go passes two-word interface values. RELABEL 2026-09-23 (C1, as ruled at ledger 2026-09-23 03:37 O2): alloc-profile -> deferred. The boxing/shell proof above is WITHDRAWN: the counter never charges a CLR box or an interface shell (AllocationCounter.cs:50-53), so it cannot explain a COUNT reading. The composition in the plan was READ in the emission at bb54ff0920 (C1). |
TestAlloc/pairs |
deferred |
wantAllocs assert: each key/value pair boxes through any into a heap shell; Go’s escape analysis keeps the equivalent interface values off the heap entirely. RELABEL 2026-09-23 (C1, as ruled at ledger 2026-09-23 03:37 O2): alloc-profile -> deferred. The boxing/shell proof above is WITHDRAWN: the counter never charges a CLR box or an interface shell (AllocationCounter.cs:50-53), so it cannot explain a COUNT reading. The composition in the plan was READ in the emission at bb54ff0920 (C1). RE-READ AT go1.26.10 (2026-10-25, G): reading moved from 6 per run at go1.24.13 to 3 per run on windows and linux; the test body changed between go1.24.13 and go1.26.10. |
TestAnyLevelAlloc |
deferred |
wantAllocs assert: passing a Level through any boxes the value type into a heap shell, which is precisely the allocation Go’s two-word interface value avoids. RELABEL 2026-09-23 (C1, as ruled at ledger 2026-09-23 03:37 O2): alloc-profile -> deferred. The boxing/shell proof above is WITHDRAWN: the counter never charges a CLR box or an interface shell (AllocationCounter.cs:50-53), so it cannot explain a COUNT reading. The composition in the plan was READ in the emission at bb54ff0920 (C1). RE-READ AT go1.26.10 (2026-10-25, G): unit COUNT -> BYTES. |
TestAttrNoAlloc |
deferred |
want-zero AllocsPerRun assert: each Attr constructor boxes its payload into a Value shell in the managed model, where Go’s Value stores the payload inline in the struct and allocates nothing. RELABEL 2026-09-23 (C1, as ruled at ledger 2026-09-23 03:37 O2): alloc-profile -> deferred. The boxing/shell proof above is WITHDRAWN: the counter never charges a CLR box or an interface shell (AllocationCounter.cs:50-53), so it cannot explain a COUNT reading. The composition in the plan was READ in the emission at bb54ff0920 (C1); it replaces the ruling’s fitted F6/F7 for this row: F6 is the per-call literal (the converter’s degenerate-slug floor, hoistedLiteralOperations.go:103) and F7 the StringData element reference. RE-READ AT go1.26.10 (2026-10-25, G): reading moved from 14 per run at go1.24.13 to 1 per run on windows and linux; the test body is identical at go1.24.13 and go1.26.10. |
TestJSONAllocs |
aggregate |
no failure text of its own — the roll-up of this test’s disclosed subtests |
TestJSONAllocs/attrs |
deferred |
wantAllocs(t, 1, …) over Logger.LogAttrs(ctx, LevelInfo, “hello world”, …) with five attributes – String, Int, Bool, Any over an error, Any over a three-field struct – through a JSONHandler writing to io.Discard; the test is new at go1.26.10. Go budgets exactly one allocation; the converted side counts 28 per run on windows and 26 on linux. |
TestJSONAllocs/message |
deferred |
wantAllocs(t, 0, …) over Logger.LogAttrs(ctx, LevelInfo, “hello world”) with no attributes, through a JSONHandler writing to io.Discard; the test is new at go1.26.10. Go budgets zero allocations; the converted side counts 12 per run on windows and 10 on linux. Its parent TestJSONAllocs discloses as aggregate, with no entry of its own (plan §6). |
TestTextHandlerAlloc |
deferred |
wantAllocs assert: TextHandler.Handle formats through boxed Values and an interface-typed Handler, so the append-only formatting path Go performs allocation-free pays one heap shell per attribute here. RELABEL 2026-09-23 (C1, as ruled at ledger 2026-09-23 03:37 O2): alloc-profile -> deferred. The boxing/shell proof above is WITHDRAWN: the counter never charges a CLR box or an interface shell (AllocationCounter.cs:50-53), so it cannot explain a COUNT reading. RE-READ AT go1.26.10 (2026-10-25, G): reading moved from 20 per run at go1.24.13 to 20 per run on windows, 19 on linux; the test body is identical at go1.24.13 and go1.26.10. |
TestValueNoAlloc |
deferred |
want-zero AllocsPerRun assert: every Value constructor boxes through any into a heap shell, the direct managed counterpart of Go’s inline-payload Value (DESIGN-iface-shell-caching §2 — the shell IS the interface value, and nothing short of IDynamicInterfaceCastable removes it). RELABEL 2026-09-23 (C1, as ruled at ledger 2026-09-23 03:37 O2): alloc-profile -> deferred. The boxing/shell proof above is WITHDRAWN: the counter never charges a CLR box or an interface shell (AllocationCounter.cs:50-53), so it cannot explain a COUNT reading. The composition in the plan was READ in the emission at bb54ff0920 (C1); it replaces the ruling’s fitted F6/F7 for this row: F6 is the per-call literal (the converter’s degenerate-slug floor, hoistedLiteralOperations.go:103) and F7 the StringData element reference. RE-READ AT go1.26.10 (2026-10-25, G): reading moved from 15 per run at go1.24.13 to 1 per run on windows and linux; the test body is identical at go1.24.13 and go1.26.10. |
Excluded declarations
Declarations filtered from both sides of the comparison, and therefore not claimed above:
Benchmark, Fuzz and Example declarations the converted host does not execute, plus any
test requiring a capability the managed runtime does not provide — a testing member the host
has not implemented, or a platform behavior it provably cannot reproduce. Each is named with
the capability it needs.
- BenchmarkAppendKey (benchmark): benchmark execution is deferred to Phase 4D
- BenchmarkAttrString (benchmark): benchmark execution is deferred to Phase 4D
- BenchmarkDispatch (benchmark): benchmark execution is deferred to Phase 4D
- BenchmarkJSONEncoding (benchmark): benchmark execution is deferred to Phase 4D
- BenchmarkJSONHandler (benchmark): benchmark execution is deferred to Phase 4D
- BenchmarkLevelString (benchmark): benchmark execution is deferred to Phase 4D
- BenchmarkNopLog (benchmark): benchmark execution is deferred to Phase 4D
- BenchmarkPC (benchmark): benchmark execution is deferred to Phase 4D
- BenchmarkPreformatting (benchmark): benchmark execution is deferred to Phase 4D
- BenchmarkRecord (benchmark): benchmark execution is deferred to Phase 4D
- BenchmarkUnsafeStrings (benchmark): benchmark execution is deferred to Phase 4D
- BenchmarkWriteTime (benchmark): benchmark execution is deferred to Phase 4D
- ExampleGroup (example): example execution is deferred to Phase 4D
- ExampleGroupAttrs (example): example execution is deferred to Phase 4D
- ExampleHandlerOptions_customLevels (example): example execution is deferred to Phase 4D
- ExampleHandler_levelHandler (example): example execution is deferred to Phase 4D
- ExampleLogValuer_group (example): example execution is deferred to Phase 4D
- ExampleLogValuer_secret (example): example execution is deferred to Phase 4D
- ExampleMultiHandler (example): example execution is deferred to Phase 4D
- ExampleSetLogLoggerLevel_log (example): example execution is deferred to Phase 4D
- ExampleSetLogLoggerLevel_slog (example): example execution is deferred to Phase 4D
- Example_discardHandler (example): example execution is deferred to Phase 4D
- Example_wrapping (example): example execution is deferred to Phase 4D