Skip to content

fix(parser): liberal boolean parsing for OPNsense config.xml (#558) - #577

Merged
mergify[bot] merged 11 commits into
mainfrom
558-windows-error-parse
Apr 18, 2026
Merged

fix(parser): liberal boolean parsing for OPNsense config.xml (#558)#577
mergify[bot] merged 11 commits into
mainfrom
558-windows-error-parse

Conversation

@unclesp1d3r

@unclesp1d3r unclesp1d3r commented Apr 18, 2026

Copy link
Copy Markdown
Member

Summary

Fixes #558 — OPNsense 26.1 emits on into schema fields previously typed as Go int, causing strconv.ParseInt: parsing "on" to abort the parse with no element context. This PR introduces a layered liberal-boolean parsing stack in the schema layer, unifies three divergent truthy parsers into one canonical helper, and adds universal element-path annotation on XML decode errors across both OPNsense and pfSense parsers.

Impact: 31 files changed (+1508 / −205), ~75% of the net-new lines are tests, fixtures, and docs. CommonDevice (public consumer surface per NATS-144) remains native bool/int — wrapper types stay in the schema layer only.
Risk: 🟢 Low. Pure parser/schema layer change. common.CommonDevice field types unchanged. Full test suite + 3 rounds of automated review + post-merge solution doc.
Review time: ~30–40 minutes for the core changes; the rest is self-explanatory tests and docs.

What Changed

🔧 New package pkg/schema/shared/

Single source of truth for the liberal truthy vocabulary 1 | on | yes | true | enable | enabled (and their falsy counterparts), case-insensitive with whitespace trimming.

  • bool.goIsValueTrue(s) / IsValueFalse(s)
  • flex_bool.goFlexBool type: value-level liberal bool with XML/JSON/YAML marshal/unmarshal. Use when the element is always emitted.
  • flex_int.goFlexInt type: liberal int sibling; strict on unknown non-numeric input.

🔧 opnsense.BoolFlag.UnmarshalXML upgraded

Previously set true on any element presence — so <tag>0</tag> wrongly decoded to true (latent bug that predates #558). Now:

  • absent element → false
  • <tag/> or <tag></tag> (empty body) → true
  • <tag>body</tag>shared.IsValueTrue(body)

Marshal side untouched to preserve the pointer-receiver invariant from GOTCHAS §15.1.

🔧 Field migrations

  • OPNsense System (10 fields): int → BoolFlag: DNSAllowOverride, UseVirtualTerminal, DisableVLANHWFilter, DisableChecksumOffloading, DisableSegmentationOffloading, DisableLargeReceiveOffloading, PfShareForward, LbUseSticky, RrdBackup, NetflowBackup.
  • pfSense System (3 fields): same type change: DNSAllowOverride, DisableSegmentationOffloading, DisableLargeReceiveOffloading.
  • Retired pfsense.isPfSenseValueTrue; call sites in converter_network.go (BlockPriv, BlockBogons, FarGW) use shared.IsValueTrue.
  • Replaced strings.EqualFold(x, xmlBoolYes) for DisableNATReflection with shared.IsValueTrue(x) at both sites in opnsense/converter.go.

🔧 Universal element-path error annotation

New parser.WrapDecodeError helper in pkg/parser/xmlutil.go. Applied to both parsers so a decode failure like strconv.ParseInt: parsing "banana" now surfaces as field "/opnsense/system": strconv.ParseInt: parsing "banana". Reporters on future schema/config mismatches can share the exact offending element without having to reproduce.

✅ Tests

  • New pkg/schema/shared/bool_test.go, flex_bool_test.go, flex_int_test.go — full vocabulary + XML/JSON/YAML round-trip coverage including escape sequences and non-decimal YAML integer forms (0x10, 0o20, 1_000).
  • New pkg/schema/opnsense/system_liberal_bool_test.go — table-driven regression for windows error parse #558 exercising all 10 migrated OPNsense fields.
  • New internal/cfgparser/element_path_test.go — proves decode errors carry the element path.
  • New fixture testdata/system_liberal_bool.xml — reporter-scenario input (mixed on/yes/1/0/off/no bodies).
  • Updated common_test.go with the full BoolFlag vocabulary matrix (including explicit-falsy regression guard for the behavior change).
  • Deduped redundant test declarations across cmd/root_test.go / cmd/root_coverage_test.go / cmd/validate_test.go / cmd/shared_flags_coverage_test.go (surfaced while fixing lint).

📝 Docs

  • GOTCHAS.md §15 — new decision rubric table (BoolFlag vs FlexBool vs FlexInt vs strict) + extended §15.1 pointer-receiver caveat to cover the new types.
  • docs/development/standards.md §Type selection — resolved intra-doc contradiction; restricted BoolFlag recommendation to presence-based toggles.
  • docs/development/xml-structure-research.md — added "BoolFlag is NOT a drop-in" caveat with two migration criteria.
  • docs/solutions/runtime-errors/liberal-boolean-xml-parsing-opnsense-pfsense.md — full post-mortem solution doc (root cause, what didn't work, solution stack, prevention rules, session-history context).

Why These Changes

OPNsense and pfSense share the same liberal boolean vocabulary (PHP == "1" pattern). Before this PR, the codebase had three divergent truthy parsers and several schema fields miscategorised as int. The reporter's crash (#558) exposed one of them; the others were latent. The right fix is type-level: rename the mistake rather than wrap a coercion around it.

CommonDevice (pkg/model) is the documented public surface per NATS-144 (commit 33ccf82). Raw pkg/schema/opnsense/pkg/schema/pfsense types can change without semver implications for external consumers who use CommonDevice.

Type of Change

  • 🐛 Bug fix (non-breaking change which fixes an issue)
  • 📝 Documentation update
  • 🧪 Tests added/updated
  • ✨ New feature (non-breaking change which adds functionality)
  • 💥 Breaking change

How Has This Been Tested?

  • just ci-check — all 4 lint blockers from round 3 resolved
  • go test -race ./... — full suite including new regression fixtures
  • TestSystem_LiberalBoolean_Issue558 — exercises the reporter's exact scenario (<dnsallowoverride>on</dnsallowoverride> + mixed vocab) end-to-end via cfgparser.NewXMLParser().Parse
  • TestXMLParser_DecodeErrorIncludesElementPath — proves numeric-field malformed input still errors, but now with element-path context
  • TestBoolFlag_UnmarshalXML — full liberal vocabulary matrix including <tag>0</tag> → false regression guard
  • TestFlexBool_UnmarshalJSON_EscapeSequences — regression guard against the hand-stripped-quotes bug caught in review ("\u006fn" → true)
  • TestFlexInt_YAML with 0x10, 0o20, 1_000, -5 — verifies yaml.v3 native integer decoding (round 4 review finding)
  • Manual verification: reporter retest of opndossier audit <config.xml> on OPNsense 26.1 — pending on user

Breaking Changes

Schema layer only — not part of the public API surface per NATS-144.

Consumers who depend on the following face source-incompatible changes:

  1. opnsense.System fields (10 fields, listed above) are now BoolFlag instead of int. Comparisons like sys.RrdBackup == 1 fail to compile; read as bool(sys.RrdBackup) or sys.RrdBackup.Bool().
  2. pfsense.System fields (3 fields) likewise migrated.
  3. Direct JSON/YAML marshal of opnsense.System / pfsense.System (not via CommonDevice) now emits true/false for these fields instead of 0/1.
  4. pfsense.isPfSenseValueTrue deleted — was unexported, so no external consumer was possible.

CommonDevice consumers see no change (all migrated fields project to native bool in the converter).

Dependencies

No dependency additions, upgrades, or removals. encoding/json and gopkg.in/yaml.v3 were already transitive dependencies.

Risk Assessment

Factor Rating Notes
Blast radius 🟢 Low Schema/parser layer only. CommonDevice (public surface) unaffected.
Semantic change 🟡 Intentional BoolFlag.UnmarshalXML no longer treats <tag>0</tag> as true. Explicit regression guard added. Real fixtures using -1 convention no longer report as "enabled" — see solution doc for rationale.
External consumers 🟢 Low Only affects direct importers of raw schema types. CommonDevice is the documented public surface per NATS-144.
Test coverage 🟢 High 6 new test files + fixture. Reporter scenario, vocabulary variants, JSON/YAML round-trip, escape sequences, YAML native non-decimal forms, decode-error element-path annotation all covered.
Review depth 🟢 High 4 rounds of automated review (copilot + coderabbitai), all 25 threads resolved. Local just ci-check clean.

Cross-Cutting Architecture

graph TD
    xml_decoder["encoding/xml decoder"] --> BoolFlag
    xml_decoder --> FlexBool
    xml_decoder --> FlexInt
    xml_decoder --> strict_int["strict int/bool"]

    BoolFlag -->|non-empty body| IsValueTrue
    FlexBool -->|all bodies| IsValueTrue
    FlexInt -->|string fallback| IsValueTrue
    IsValueTrue["shared.IsValueTrue / IsValueFalse"]

    BoolFlag --> converter["pkg/parser/*/converter*.go"]
    FlexBool --> converter
    FlexInt --> converter
    strict_int --> converter
    converter --> CommonDevice["common.CommonDevice (native bool/int)"]
    CommonDevice --> downstream["builder, reporters, plugins,<br/>JSON/YAML exports"]

    classDef layer fill:#e8f5e9,stroke:#2e7d32
    classDef boundary fill:#fff3e0,stroke:#e65100
    class BoolFlag,FlexBool,FlexInt,strict_int layer
    class CommonDevice boundary
Loading

Boundary rule: schema wrapper types never escape the schema layer. Converters extract the native Go primitive when projecting into CommonDevice.

Review Checklist

General

  • Code follows project style guidelines (just lint 0 issues)
  • //nolint: directives on separate lines above calls (AGENTS.md §12.1 rule 6)
  • No debugging code, no hardcoded secrets
  • Error handling wraps with %w (errors.Is / errors.As work through WrapDecodeError)

Schema / Type Design

  • New types carry godoc explaining their contract and when to pick them
  • Compile-time interface compliance assertions present (xml.Marshaler/Unmarshaler + json.Marshaler/Unmarshaler + yaml.Marshaler/Unmarshaler)
  • GOTCHAS §15.1 pointer-receiver caveat extended to new types
  • Receiver-type convention documented (pointer for Marshal/Unmarshal, value for accessor; recvcheck suppressed on type declaration)

Tests

  • Reporter scenario covered end-to-end (TestSystem_LiberalBoolean_Issue558)
  • Explicit regression guards for intentional semantic changes (BoolFlag <tag>0</tag> → false)
  • Round-trip coverage (XML, JSON, YAML) for new types
  • Edge cases: empty body, whitespace, escape sequences, non-decimal YAML integers
  • Negative cases: unknown non-numeric input on FlexInt returns wrapped error

Documentation

  • GOTCHAS.md §15 updated in same commit as interface changes
  • docs/development/standards.md type-selection guidance updated
  • docs/development/xml-structure-research.md migration caveat added
  • docs/solutions/ entry written for future maintainers

Residual Actionable Work (tracked in .context/compound-engineering/todos/)

  • 097 (P1, ready): JSON/YAML format decision for migrated fields + pfSense vocabulary-widening tests + XML round-trip golden test + System-by-value marshal addressability test + FlexBool/FlexInt value-parent marshal test + FlexBool YAML native-bool-node test.
  • 098 (P2, ready, depends on 097): upgrade WrapDecodeError output to cfgparser.ParseError so CLI exit code and JSONError.Details.element_path are populated for automation consumers (addresses agent-native-reviewer W1/W2).
  • 099 (P2, ready): pfSense decode errors currently carry document-root path only (/pfsense) because pfSense decodes in one pass. OPNsense-style section-by-section restructure would improve leaf-level accuracy.

Additional Notes

Closes #558

OPNsense 26.1 emits "on" into schema fields previously typed as Go `int`
(DNSAllowOverride, UseVirtualTerminal, Disable*Offloading, etc.), causing
`strconv.ParseInt: parsing "on"` to abort the entire parse with no
element context.

This change introduces a layered boolean-parsing stack in the schema
layer and migrates the affected OPNsense toggle fields to `BoolFlag`:

- New `pkg/schema/shared/` package: `IsValueTrue` / `IsValueFalse` as
  the single canonical truthy/falsy parser (1|on|yes|true|enable|enabled
  and their falsy counterparts, case-insensitive); `FlexBool` as a
  value-level liberal bool type; `FlexInt` as a liberal int sibling for
  future hot-fixes.
- Upgraded `opnsense.BoolFlag.UnmarshalXML` to layer presence semantics
  over `FlexBool` parsing: absent → false, `<tag/>` → true,
  `<tag>body</tag>` → `IsValueTrue(body)`. Fixes a latent bug where
  `<tag>0</tag>` previously parsed as true. Marshal side untouched to
  preserve GOTCHAS §15.1 pointer-receiver invariants.
- Migrated ten `opnsense.System` fields from `int` to `BoolFlag` so
  "on"/"yes"/"1" all parse correctly; consumers switch from `== 1` /
  `!= 0` to plain bool reads.
- Retired `pfsense.isPfSenseValueTrue`; pfSense converter sites now
  consume `shared.IsValueTrue` directly, unifying the truthy vocabulary.
- New `parser.WrapDecodeError` annotates XML decode errors with the
  element path (`field "/opnsense/system": strconv.ParseInt: ...`)
  across both OPNsense and pfSense parsers so future field-specific
  parse failures surface the offending element by name.
- GOTCHAS §15 expanded with a decision rubric covering BoolFlag,
  FlexBool, FlexInt, and strict int/bool; addressability warning
  extended to the new types.

Wrapper types stay in the schema layer only — `CommonDevice` fields
remain native `bool`/`int`.

Plan: docs/plans/2026-04-18-002-fix-issue-558-parser-on-value.md
Closes #558

Signed-off-by: UncleSp1d3r <unclesp1d3r@evilbitlabs.io>
Copilot AI review requested due to automatic review settings April 18, 2026 16:38
@unclesp1d3r unclesp1d3r linked an issue Apr 18, 2026 that may be closed by this pull request
@dosubot dosubot Bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Apr 18, 2026
@mergify

mergify Bot commented Apr 18, 2026

Copy link
Copy Markdown
Contributor

Merge Protections

Your pull request matches the following merge protections and will not be merged until they are valid.

🟢 Enforce conventional commit

Wonderful, this rule succeeded.

Require conventional commit format per https://www.conventionalcommits.org/en/v1.0.0/. Skipped for dependabot and dosubot.

  • title ~= ^(fix|feat|docs|style|refactor|perf|test|build|ci|chore|revert)(?:\(.+\))?!?:

🟢 Full CI must pass

Wonderful, this rule succeeded.

All CI checks must pass. Activates for non-bot authors, or dependabot when files exist outside .github/workflows/.

  • check-success = Build
  • check-success = Coverage
  • check-success = Integration Tests
  • check-success = Lint
  • check-success = Test (macos-latest)
  • check-success = Test (ubuntu-latest)
  • check-success = Test (windows-latest)

🟢 Do not merge outdated PRs

Wonderful, this rule succeeded.

Make sure PRs are within 10 commits of the base branch before merging

  • #commits-behind <= 10

@dosubot dosubot Bot added bug Something isn't working go Pull requests that update go code labels Apr 18, 2026
@unclesp1d3r unclesp1d3r self-assigned this Apr 18, 2026
@coderabbitai

coderabbitai Bot commented Apr 18, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Centralized liberal boolean/integer parsing added (shared.IsValueTrue/IsValueFalse, FlexBool, FlexInt), BoolFlag.UnmarshalXML now treats empty bodies as presence=true and non-empty bodies via shared parsing, multiple schema fields migrated from int→BoolFlag, XML decode errors gain element-path context, and tests/docs updated accordingly.

Changes

Cohort / File(s) Summary
Documentation & Guidelines
AGENTS.md, GOTCHAS.md, docs/development/standards.md, docs/development/xml-structure-research.md, docs/solutions/runtime-errors/...
Updated markdown validation note; expanded/guided liberal boolean/integer parsing, BoolFlag semantics, marshal gotchas, and migration rationale; added runtime-error guidance.
Shared schema helpers & types
pkg/schema/shared/bool.go, pkg/schema/shared/flex_bool.go, pkg/schema/shared/flex_int.go
Add IsValueTrue/IsValueFalse, FlexBool, and FlexInt with XML/JSON/YAML marshal/unmarshal implementations and canonical semantics.
Shared tests
pkg/schema/shared/bool_test.go, pkg/schema/shared/flex_bool_test.go, pkg/schema/shared/flex_int_test.go
Comprehensive unit tests covering truthy/falsy vocab, XML/JSON/YAML behavior, edge cases, and error paths.
OPNsense schema & tests
pkg/schema/opnsense/system.go, pkg/schema/opnsense/common.go, pkg/schema/opnsense/common_test.go, pkg/schema/opnsense/*_test.go, pkg/schema/opnsense/testdata/*
Migrated ten System fields int→BoolFlag; updated BoolFlag.UnmarshalXML to consult shared.IsValueTrue for non-empty bodies; added regression tests and fixtures.
OPNsense parser & converter
pkg/parser/opnsense/converter.go, pkg/parser/opnsense/converter_test.go
Adjusted conversions to use bool(...) casts for migrated fields; updated tests to assert boolean values.
pfSense schema & parser
pkg/schema/pfsense/system.go, pkg/parser/pfsense/converter.go, pkg/parser/pfsense/converter_network.go, pkg/parser/pfsense/parser.go, pkg/parser/pfsense/parser_test.go, pkg/parser/pfsense/constants.go
Migrated several fields to BoolFlag, removed local isPfSenseValueTrue helper, replaced calls with shared.IsValueTrue, and updated parser error wrapping/tests to use element-path wrapping.
XML decode error wrapping
pkg/parser/xmlutil.go, internal/cfgparser/xml.go, internal/cfgparser/element_path_test.go
Added exported WrapDecodeError to annotate decode errors with element paths and wired it into cfgparser; added tests asserting element-path appears in decode errors.
Test reorg / CLI tests
cmd/root_coverage_test.go, cmd/root_test.go
Deleted older coverage test file and consolidated/added tests in cmd/root_test.go for build metadata and setupLightweightContext behavior.

Sequence Diagram

sequenceDiagram
    participant XML as XML Input
    participant CFG as cfgparser
    participant Unmarshal as Schema Unmarshaler<br/>(BoolFlag/FlexBool)
    participant Shared as shared.IsValueTrue
    participant Parser as Device Parser/Converter

    XML->>CFG: feed bytes to parser
    CFG->>Unmarshal: dec.DecodeElement(target, &se)
    Unmarshal->>Unmarshal: inspect element body
    alt empty body / self-closing
        Unmarshal-->>CFG: set presence=true (BoolFlag)
    else non-empty body
        Unmarshal->>Shared: IsValueTrue(body)
        Shared-->>Unmarshal: truthy/falsy result
        Unmarshal-->>CFG: set value accordingly
    end
    CFG->>Parser: return populated schema struct
    Parser->>Parser: convert schema fields (bool(...) / .Bool())
    Parser-->>Common: populate common.* types
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested labels

go, type:bug, testing, documentation

Poem

🎉 Rigid bits gave way to human yes,
Parsers now know "on", "true", "enabled" — no stress.
Errors point paths so we can see,
Tests and docs sing harmony.
Liberal booleans, parsed with glee.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The PR title follows conventional commit format with type(scope): description (#issue), clearly summarizing the fix for liberal boolean parsing in OPNsense config.xml.
Linked Issues check ✅ Passed The PR fully addresses #558's coding requirements: new shared package with liberal parsing helpers, updated BoolFlag.UnmarshalXML behavior, migrated 10 System fields to BoolFlag, removed isPfSenseValueTrue, and added WrapDecodeError for element-path annotation.
Out of Scope Changes check ✅ Passed All changes are scoped to #558: liberal boolean/integer parsing infrastructure, schema type migrations, test coverage, and documentation. Test file deletion (cmd/root_coverage_test.go) appears incidental to code organization but is properly documented.
Go Exported-Symbol Godoc ✅ Passed All exported Go identifiers in production files have proper godoc comments starting with identifier names per Go conventions.
Description check ✅ Passed The pull request description is comprehensive and well-structured, covering the problem statement, detailed changes across multiple components, test coverage, documentation updates, and risk assessment.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
✨ Simplify code
  • Create PR with simplified code
  • Commit simplified code in branch 558-windows-error-parse

Comment @coderabbitai help to get the list of available commands and usage tips.

@codecov

codecov Bot commented Apr 18, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 78.91156% with 31 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
pkg/schema/shared/flex_bool.go 56.52% 16 Missing and 4 partials ⚠️
pkg/schema/shared/flex_int.go 82.45% 7 Missing and 3 partials ⚠️
pkg/parser/xmlutil.go 75.00% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

@coderabbitai coderabbitai Bot added documentation Improvements or additions to documentation type:bug Bug or defect that needs fixing priority:normal Normal priority issue testing Test infrastructure and test-related issues labels Apr 18, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Fixes #558 by making schema parsing tolerant of liberal boolean encodings (e.g., on/yes/true/enabled) in OPNsense/pfSense XML, and improves decode errors with element-path context.

Changes:

  • Introduces pkg/schema/shared helpers (IsValueTrue/False) plus liberal wrapper types (FlexBool, FlexInt) with XML/JSON/YAML support.
  • Updates OPNsense BoolFlag and migrates several System toggle fields from int to BoolFlag, updating converters/tests accordingly.
  • Adds parser.WrapDecodeError and uses it in both parsers to annotate XML decode failures with an element path; adds regression/coverage tests.

Reviewed changes

Copilot reviewed 25 out of 25 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
pkg/schema/shared/bool.go Adds canonical shared truthy/falsy helpers.
pkg/schema/shared/bool_test.go Tests shared truthy/falsy vocabulary.
pkg/schema/shared/flex_bool.go Adds liberal boolean wrapper with XML/JSON/YAML support.
pkg/schema/shared/flex_bool_test.go Tests FlexBool XML/JSON/YAML behavior.
pkg/schema/shared/flex_int.go Adds liberal integer wrapper (numeric + truthy/falsy coercion).
pkg/schema/shared/flex_int_test.go Tests FlexInt XML marshal/unmarshal and error cases.
pkg/schema/opnsense/common.go Updates BoolFlag.UnmarshalXML to honor value bodies via shared truthy parser.
pkg/schema/opnsense/common_test.go Expands BoolFlag test coverage for liberal vocabulary and presence semantics.
pkg/schema/opnsense/system.go Migrates multiple system toggle fields from int to BoolFlag.
pkg/schema/opnsense/testdata/system_liberal_bool.xml Adds OPNsense 26.1-style fixture with mixed boolean encodings.
pkg/schema/opnsense/system_liberal_bool_test.go Adds #558 regression test ensuring on parses successfully.
pkg/schema/opnsense/opnsense.go Updates NAT summary logic to use BoolFlag-based fields.
pkg/schema/opnsense/opnsense_test.go Updates tests to set/read migrated BoolFlag fields.
pkg/parser/xmlutil.go Adds WrapDecodeError helper for consistent decode error annotation.
internal/cfgparser/xml.go Wraps decode errors with /opnsense/<section> element-path context.
internal/cfgparser/element_path_test.go Verifies decode errors include an element path for malformed numeric fields.
pkg/parser/pfsense/parser.go Wraps pfSense full-document decode errors with /pfsense path context.
pkg/parser/pfsense/parser_test.go Updates expectations for new wrapped error messages.
pkg/parser/pfsense/converter_network.go Switches pfSense value-boolean parsing to shared.IsValueTrue.
pkg/parser/pfsense/constants.go Removes pfSense-specific truthy helper and updates guidance/comments.
pkg/parser/opnsense/converter.go Updates OPNsense converter to use BoolFlag-based system fields.
pkg/parser/opnsense/converter_test.go Updates converter tests for BoolFlag-based inputs.
docs/development/standards.md Documents new shared boolean parsing guidance for pfSense/OPNsense.
GOTCHAS.md Documents selection/semantics of BoolFlag vs FlexBool vs FlexInt and addressability caveats.
AGENTS.md Updates markdown-validation guidance and other contributor rule text.

Comment thread internal/cfgparser/xml.go Outdated
Comment thread pkg/schema/shared/flex_bool_test.go Outdated
Comment thread AGENTS.md
Comment thread pkg/schema/shared/flex_int.go Outdated
Comment thread pkg/schema/shared/flex_bool.go Outdated
Comment thread pkg/schema/shared/flex_bool.go
@dosubot

dosubot Bot commented Apr 18, 2026

Copy link
Copy Markdown
Contributor

Related Documentation

1 document(s) may need updating based on files changed in this PR:

opnDossier

xml-structure-research /opnDossier/blob/main/docs/development/xml-structure-research.md — ⏳ Awaiting Merge

How did I do? Any feedback?

@dosubot dosubot Bot added size:XL This PR changes 500-999 lines, ignoring generated files. and removed size:L This PR changes 100-499 lines, ignoring generated files. labels Apr 18, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Warning

CodeRabbit couldn't request changes on this pull request because it doesn't have sufficient GitHub permissions.

Please grant CodeRabbit Pull requests: Read and write permission and re-run the review.

👉 Steps to fix this

Actionable comments posted: 8

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
pkg/schema/opnsense/opnsense_test.go (1)

295-304: ⚠️ Potential issue | 🟡 Minor

Update stale assertion wording after bool migration.

Line 303 still says “set to 0”, but the test now sets a bool (false). This can confuse failure triage.

✏️ Suggested tweak
-		t.Error("NATSummary.PfShareForward should be false when set to 0")
+		t.Error("NATSummary.PfShareForward should be false when set to false")
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/schema/opnsense/opnsense_test.go` around lines 295 - 304, The test
TestOpnSenseDocument_NATSummary_PfShareForwardZero has a stale failure message
referencing "set to 0" even though the test now sets doc.System.PfShareForward =
false; update the assertion message in the test (around
TestOpnSenseDocument_NATSummary_PfShareForwardZero where NewOpnSenseDocument,
doc.System.PfShareForward and summary.PfShareForward are used) to say
"NATSummary.PfShareForward should be false when set to false" (or similar clear
wording) so failure output matches the bool migration.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@docs/development/standards.md`:
- Line 721: Update the wording on line 721 to stop recommending BoolFlag for
generic value-based booleans and instead recommend FlexBool (or shared helpers)
for fields that are always emitted; reserve BoolFlag only for absence-sensitive
fields. Specifically, change the guidance that mentions using `BoolFlag` in
`pkg/schema/**/*.go` to instruct developers to use `FlexBool` for value-based
booleans (or call `shared.IsValueTrue()` at conversion boundaries) and to use
`BoolFlag` only when element absence carries meaning (i.e., presence semantics).

In `@pkg/parser/opnsense/converter.go`:
- Around line 116-128: The mapping currently checks sys.DisableNATReflection
(and the other hard-coded `"yes"` checks around the other mapping at the second
occurrence) with strings.EqualFold/xmlBoolYes which misses other truthy values;
replace those call sites so DisableNATReflection uses
shared.IsValueTrue(sys.DisableNATReflection) (or shared.IsValueFalse where
appropriate) and update the same pattern for the other affected fields (the
second block around lines referencing sys.DisableNATReflection/xmlBoolYes) to
consistently use shared.IsValueTrue()/shared.IsValueFalse() instead of
strings.EqualFold/xmlBoolYes.

In `@pkg/schema/opnsense/system_liberal_bool_test.go`:
- Line 13: The tiny helper function bytesReader is only used once (bytesReader(b
[]byte) in pkg/schema/opnsense/system_liberal_bool_test.go); remove the
bytesReader function and replace its single call with bytes.NewReader(data)
where it's invoked (e.g., in the test that currently calls bytesReader). Ensure
you import bytes is still present or add it if needed and run tests to verify no
other references to bytesReader remain.

In `@pkg/schema/shared/flex_bool_test.go`:
- Line 86: The subtests in flex_bool_test.go use anonymous t.Run names which
makes test output hard to read; update the t.Run calls inside the
TestMarshal/TestUnmarshal (and any marshal-related subtests) to use descriptive
names such as "marshal true" and "marshal false" (or "unmarshal true"/"unmarshal
false" where appropriate) so each subtest for the FlexBool marshal/unmarshal
cases is clearly identified in test output; locate the t.Run("", func(t
*testing.T) { ... }) occurrences around the FlexBool marshal tests and replace
the empty string with an appropriate descriptive label.

In `@pkg/schema/shared/flex_bool.go`:
- Around line 100-104: Add compile-time interface checks for JSON and YAML by
asserting that *FlexBool implements encoding/json.Marshaler and
encoding/json.Unmarshaler and the YAML marshaler/unmarshaler types used in the
repo (e.g., gopkg.in/yaml.v3.Marshaler and gopkg.in/yaml.v3.Unmarshaler). Update
the var block that currently contains _ xml.Marshaler/_ xml.Unmarshaler to also
include _ json.Marshaler = (*FlexBool)(nil), _ json.Unmarshaler =
(*FlexBool)(nil), and the corresponding yaml.Marshaler/yaml.Unmarshaler
assertions so the compiler will catch missing method implementations for
FlexBool.
- Around line 62-74: The UnmarshalJSON implementation in FlexBool manually
strips surrounding quotes which fails for escaped JSON string values; update
FlexBool.UnmarshalJSON to detect quoted inputs and use strconv.Unquote to obtain
the proper unescaped string before passing it to IsValueTrue, falling back to
the original string if Unquote returns an error; reference the
FlexBool.UnmarshalJSON method, the FlexBool type and IsValueTrue helper, and
import strconv if needed.

In `@pkg/schema/shared/flex_int_test.go`:
- Around line 61-74: The tests only cover XML for FlexInt
(TestFlexInt_MarshalXML) but lack JSON/YAML round-trip coverage like FlexBool;
add two tests (e.g., TestFlexInt_JSON and TestFlexInt_YAML) that create a
flexIntWrap or directly use shared.FlexInt(42), marshal to JSON and YAML and
then unmarshal back asserting equality and correct string/number encoding; use
encoding/json's Marshal/Unmarshal and gopkg.in/yaml.v3 (or the same YAML helper
used in flex_bool_test.go) to exercise shared.FlexInt's
MarshalJSON/UnmarshalJSON and MarshalYAML/UnmarshalYAML implementations.

In `@pkg/schema/shared/flex_int.go`:
- Around line 120-124: Add compile-time interface checks for JSON and YAML on
FlexInt similar to the existing XML checks: ensure FlexInt implements
encoding/json's json.Marshaler and json.Unmarshaler and the YAML package's
yaml.Marshaler and yaml.Unmarshaler by adding the appropriate var assertions
referencing (*FlexInt)(nil) (e.g., _ json.Marshaler = (*FlexInt)(nil), _
json.Unmarshaler = (*FlexInt)(nil), _ yaml.Marshaler = (*FlexInt)(nil), _
yaml.Unmarshaler = (*FlexInt)(nil)) next to the existing xml checks so the
compiler will validate those implementations.

---

Outside diff comments:
In `@pkg/schema/opnsense/opnsense_test.go`:
- Around line 295-304: The test
TestOpnSenseDocument_NATSummary_PfShareForwardZero has a stale failure message
referencing "set to 0" even though the test now sets doc.System.PfShareForward =
false; update the assertion message in the test (around
TestOpnSenseDocument_NATSummary_PfShareForwardZero where NewOpnSenseDocument,
doc.System.PfShareForward and summary.PfShareForward are used) to say
"NATSummary.PfShareForward should be false when set to false" (or similar clear
wording) so failure output matches the bool migration.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Repository UI (inherited), Organization UI (inherited)

Review profile: ASSERTIVE

Plan: Pro

Run ID: b69a27d0-d2f9-4787-87ea-bceb7014f626

📥 Commits

Reviewing files that changed from the base of the PR and between 33ccf82 and f33b64f.

📒 Files selected for processing (25)
  • AGENTS.md
  • GOTCHAS.md
  • docs/development/standards.md
  • internal/cfgparser/element_path_test.go
  • internal/cfgparser/xml.go
  • pkg/parser/opnsense/converter.go
  • pkg/parser/opnsense/converter_test.go
  • pkg/parser/pfsense/constants.go
  • pkg/parser/pfsense/converter_network.go
  • pkg/parser/pfsense/parser.go
  • pkg/parser/pfsense/parser_test.go
  • pkg/parser/xmlutil.go
  • pkg/schema/opnsense/common.go
  • pkg/schema/opnsense/common_test.go
  • pkg/schema/opnsense/opnsense.go
  • pkg/schema/opnsense/opnsense_test.go
  • pkg/schema/opnsense/system.go
  • pkg/schema/opnsense/system_liberal_bool_test.go
  • pkg/schema/opnsense/testdata/system_liberal_bool.xml
  • pkg/schema/shared/bool.go
  • pkg/schema/shared/bool_test.go
  • pkg/schema/shared/flex_bool.go
  • pkg/schema/shared/flex_bool_test.go
  • pkg/schema/shared/flex_int.go
  • pkg/schema/shared/flex_int_test.go

Comment thread docs/development/standards.md Outdated
Comment thread pkg/parser/opnsense/converter.go
Comment thread pkg/schema/opnsense/system_liberal_bool_test.go Outdated
Comment thread pkg/schema/shared/flex_bool_test.go Outdated
Comment thread pkg/schema/shared/flex_bool.go
Comment thread pkg/schema/shared/flex_bool.go
Comment thread pkg/schema/shared/flex_int_test.go
Comment thread pkg/schema/shared/flex_int.go
Addresses convergent findings from code-reviewer, silent-failure-hunter,
and pr-test-analyzer on PR #577.

Critical fix:
- pkg/schema/shared/flex_bool.go: FlexBool.UnmarshalJSON previously
  hand-stripped surrounding quotes without delegating to encoding/json,
  so escape sequences ("\u006fn" for "on") were compared literally and
  silently yielded false. Now cascades json.Unmarshal through native
  bool, native int, and string forms so escapes are decoded before the
  truthy-vocabulary check. Added TestFlexBool_UnmarshalJSON_EscapeSequences.

Complete the migration:
- pkg/schema/pfsense/system.go: DNSAllowOverride,
  DisableSegmentationOffloading, and DisableLargeReceiveOffloading were
  still typed as `int`, reproducing the exact #558 crash on pfSense
  configs that emit "on"/"yes". Migrated to opnsense.BoolFlag to match
  the OPNsense side. Converter and parser test updated.

Doc accuracy:
- pkg/schema/shared/flex_bool.go: FlexBool doc previously claimed
  BoolFlag delegates "through FlexBool"; actually both delegate to
  shared.IsValueTrue. Corrected.
- pkg/schema/opnsense/common.go: vocabulary list added "enable" (was
  listed in IsValueTrue and the decision rubric but missing from this
  type's docstring).
- pkg/parser/pfsense/constants.go: same vocabulary list update.

Signed-off-by: UncleSp1d3r <unclesp1d3r@evilbitlabs.io>
Copilot AI review requested due to automatic review settings April 18, 2026 16:53
@coderabbitai coderabbitai Bot added breaking_change Significant changes that disrupt backward compatibility. and removed documentation Improvements or additions to documentation go Pull requests that update go code type:bug Bug or defect that needs fixing priority:normal Normal priority issue testing Test infrastructure and test-related issues labels Apr 18, 2026
Captures the #558 root cause, the investigation dead ends
(escape-hatch FlexInt, BoolFlag/FlexBool collapse, hand-stripped JSON
quote handling), the shared-helper solution stack, why it works, and
prevention rules for the next time the "strconv.ParseInt: parsing
'on'" class of bug surfaces.

Key prevention guidance:
- Never hand-roll truthy parsers at converter sites; use
  shared.IsValueTrue/shared.IsValueFalse.
- BoolFlag vs FlexBool vs FlexInt vs strict: decision rubric with
  explicit "BoolFlag is NOT a drop-in" criteria.
- WrapDecodeError for element-path annotation on every new XML decode
  surface.
- Test both marshal and unmarshal of new schema types, including
  value-marshaled parent structs per GOTCHAS §15.1.
- recvcheck suppression goes on the type declaration, not the
  accessor method.

Includes historical context from prior session research: PR #461 set
the clean-fork precedent for pfSense type forks; GOTCHAS §15.1
pointer-receiver pattern originated March 2026.

Signed-off-by: UncleSp1d3r <unclesp1d3r@evilbitlabs.io>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 31 out of 31 changed files in this pull request and generated 1 comment.

Comment thread pkg/schema/shared/flex_int.go
Both copilot-pull-request-reviewer and coderabbitai flagged that
FlexInt.UnmarshalYAML passed node.Value directly to parse(), which
uses strconv.Atoi. That bypasses yaml.v3's native !!int decoding, so
legitimate YAML integer forms — 0x10 (hex), 0o20 (octal), 1_000
(underscored) — errored even though they are valid integers.

Mirror the branching from FlexBool.UnmarshalYAML: decode via
node.Decode(&int) on !!int tags, decode via node.Decode(&bool) on
!!bool tags (0/1 coercion), fall through to parse() for strings and
anything else. Added regression tests covering 0x10, 0o20, 1_000, -5,
and native bool true.

Signed-off-by: UncleSp1d3r <unclesp1d3r@evilbitlabs.io>
@coderabbitai coderabbitai Bot added documentation Improvements or additions to documentation go Pull requests that update go code type:bug Bug or defect that needs fixing testing Test infrastructure and test-related issues and removed priority:normal Normal priority issue labels Apr 18, 2026
@unclesp1d3r

Copy link
Copy Markdown
Member Author

@Mergifyio queue

@mergify

mergify Bot commented Apr 18, 2026

Copy link
Copy Markdown
Contributor

Merge Queue Status

🛑 Queue command has been cancelled

@mergify mergify Bot added the queued label Apr 18, 2026
mergify Bot added a commit that referenced this pull request Apr 18, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Warning

CodeRabbit couldn't request changes on this pull request because it doesn't have sufficient GitHub permissions.

Please grant CodeRabbit Pull requests: Read and write permission and re-run the review.

👉 Steps to fix this

Actionable comments posted: 5

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In
`@docs/solutions/runtime-errors/liberal-boolean-xml-parsing-opnsense-pfsense.md`:
- Around line 162-167: Add a "Cross-Repository Impact" subsection to the
document (near the "Why This Works" or "Prevention" section) describing
downstream changes required for opnConfigGenerator: note that opnConfigGenerator
(EvilBit-Labs/opnConfigGenerator) currently pins opnDossier v1.4.0 and
constructs BoolFlag values, requires a dependency bump to get migrated types
(BoolFlag/FlexBool/FlexInt), updates to any code that constructs those fields,
test updates for numeric XML encodings, and potential opnsense-config.xsd
changes to accommodate non-integer encodings; reference BoolFlag,
shared.IsValueTrue, WrapDecodeError and the 13 migrated fields so maintainers
can locate affected code and tests.
- Line 209: The file uses the UK spelling "miscategorisation" in the guidance
text; update that term to US spelling "miscategorization" wherever it appears
(the sentence referencing strconv.ParseInt, strconv.ParseBool, strconv.Atoi and
the OPNsense/pfSense PHP pattern $config[...] == "1") so the documentation
matches the codebase's US-English convention and keeps terminology consistent.
- Around line 46-48: The fenced code block that shows the error message opnsense
parser: strconv.ParseInt: parsing "on": invalid syntax is missing a language
identifier; update that fence to include a language label such as text (e.g.,
change the opening ``` to ```text) so the markdown shows the output correctly
and satisfies static analysis requirements.
- Around line 32-36: The related_docs list in
liberal-boolean-xml-parsing-opnsense-pfsense.md references a missing doc
"docs/plans/2026-04-18-002-fix-issue-558-parser-on-value.md"; fix by either
creating that plan file with the expected content and frontmatter matching other
docs (so the reference resolves) or remove the entry
"docs/plans/2026-04-18-002-fix-issue-558-parser-on-value.md" from the
related_docs array in the file to avoid a broken link; update the change so the
related_docs list only contains existing document paths.

In `@pkg/schema/shared/flex_int_test.go`:
- Around line 161-181: The nativeForms table-driven YAML test in
TestFlexInt_YAML loops without subtests, making failures hard to identify;
change the loop to run each case as a subtest using t.Run(tc.name, func(t
*testing.T) { ... }) and move the existing unmarshalling/assertions inside that
closure (using a new local variable for tc to avoid closure capture), mirroring
the XML/JSON tests' pattern and keeping assertions on shared.FlexInt.Int().
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Repository UI (inherited), Organization UI (inherited)

Review profile: ASSERTIVE

Plan: Pro

Run ID: 1a578839-5feb-4919-a5a0-5032166092c1

📥 Commits

Reviewing files that changed from the base of the PR and between c0af6f7 and 23ea5ba.

📒 Files selected for processing (3)
  • docs/solutions/runtime-errors/liberal-boolean-xml-parsing-opnsense-pfsense.md
  • pkg/schema/shared/flex_int.go
  • pkg/schema/shared/flex_int_test.go

Comment thread docs/solutions/runtime-errors/liberal-boolean-xml-parsing-opnsense-pfsense.md Outdated
Comment thread pkg/schema/shared/flex_int_test.go
Reviewer flagged "miscategorisation" on line 209 of the solution doc;
scanning the rest of the PR's new files surfaced the same UK spelling
in five more spots in the shared/ package:

- docs/solutions/runtime-errors/liberal-boolean-xml-parsing-opnsense-pfsense.md
  — "miscategorisation" → "miscategorization"
- pkg/schema/shared/flex_bool.go — "recognised"/"Unrecognised" × 3 →
  "recognized"/"Unrecognized"
- pkg/schema/shared/flex_int.go — "recognised" × 2 → "recognized"
  (including the FlexInt error message for invalid values)

Scope: only files created or modified in PR #577. Pre-existing docs
that use "behaviour", "categorisation", etc. (e.g., contributing.md,
firewall-security-controls-reference.md) remain unchanged — those are
out of scope for this PR's style normalization.

Signed-off-by: UncleSp1d3r <unclesp1d3r@evilbitlabs.io>
Copilot AI review requested due to automatic review settings April 18, 2026 18:57
@mergify mergify Bot removed the queued label Apr 18, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 31 out of 31 changed files in this pull request and generated 1 comment.

Comment thread pkg/schema/shared/flex_bool.go
@unclesp1d3r

Copy link
Copy Markdown
Member Author

@Mergifyio queue

@mergify

mergify Bot commented Apr 18, 2026

Copy link
Copy Markdown
Contributor

Merge Queue Status

  • 🟠 Waiting for queue conditions
  • ⏳ Enter queue
  • ⏳ Run checks
  • ⏳ Merge
Required conditions to enter a queue
  • -closed [📌 queue requirement]
  • -conflict [📌 queue requirement]
  • -draft [📌 queue requirement]
  • any of [📌 queue -> configuration change requirements]:
    • -mergify-configuration-changed
    • check-success = Configuration changed
  • any of [📌 queue requirement]:
    • check-success = Mergify Merge Protections
    • check-neutral = Mergify Merge Protections
    • check-skipped = Mergify Merge Protections
  • any of [🔀 queue conditions]:
    • all of [📌 queue conditions of queue rule default]:
      • all of [🛡 Merge Protections rule Do not merge outdated PRs]:
        • #commits-behind <= 10
      • all of [🛡 Merge Protections rule Enforce conventional commit]:
        • title ~= ^(fix|feat|docs|style|refactor|perf|test|build|ci|chore|revert)(?:\(.+\))?!?:
      • all of [🛡 Merge Protections rule Full CI must pass]:
        • check-success = Build
        • check-success = Coverage
        • check-success = Integration Tests
        • check-success = Lint
        • check-success = Test (macos-latest)
        • check-success = Test (ubuntu-latest)
        • check-success = Test (windows-latest)
      • any of [🛡 GitHub repository ruleset rule Main]:
        • check-success = Mergify Merge Protections
        • check-neutral = Mergify Merge Protections
        • check-skipped = Mergify Merge Protections
    • all of [📌 queue conditions of queue rule dependabot-workflows]:
      • -files ~= ^(?!\.github/workflows/)
      • author = dependabot[bot]
      • base = main
      • label != do-not-merge
      • all of [🛡 Merge Protections rule Do not merge outdated PRs]:
        • #commits-behind <= 10
      • all of [🛡 Merge Protections rule Enforce conventional commit]:
        • title ~= ^(fix|feat|docs|style|refactor|perf|test|build|ci|chore|revert)(?:\(.+\))?!?:
      • all of [🛡 Merge Protections rule Full CI must pass]:
        • check-success = Build
        • check-success = Coverage
        • check-success = Integration Tests
        • check-success = Lint
        • check-success = Test (macos-latest)
        • check-success = Test (ubuntu-latest)
        • check-success = Test (windows-latest)
      • any of [🛡 GitHub repository ruleset rule Main]:
        • check-success = Mergify Merge Protections
        • check-neutral = Mergify Merge Protections
        • check-skipped = Mergify Merge Protections
    • all of [📌 queue conditions of queue rule dependabot]:
      • author = dependabot[bot]
      • base = main
      • label != do-not-merge
      • all of [🛡 Merge Protections rule Do not merge outdated PRs]:
        • #commits-behind <= 10
      • all of [🛡 Merge Protections rule Enforce conventional commit]:
        • title ~= ^(fix|feat|docs|style|refactor|perf|test|build|ci|chore|revert)(?:\(.+\))?!?:
      • all of [🛡 Merge Protections rule Full CI must pass]:
        • check-success = Build
        • check-success = Coverage
        • check-success = Integration Tests
        • check-success = Lint
        • check-success = Test (macos-latest)
        • check-success = Test (ubuntu-latest)
        • check-success = Test (windows-latest)
      • any of [🛡 GitHub repository ruleset rule Main]:
        • check-success = Mergify Merge Protections
        • check-neutral = Mergify Merge Protections
        • check-skipped = Mergify Merge Protections
    • all of [📌 queue conditions of queue rule dosubot]:
      • author = dosubot[bot]
      • base = main
      • label != do-not-merge
      • all of [🛡 Merge Protections rule Do not merge outdated PRs]:
        • #commits-behind <= 10
      • all of [🛡 Merge Protections rule Enforce conventional commit]:
        • title ~= ^(fix|feat|docs|style|refactor|perf|test|build|ci|chore|revert)(?:\(.+\))?!?:
      • all of [🛡 Merge Protections rule Full CI must pass]:
        • check-success = Build
        • check-success = Coverage
        • check-success = Integration Tests
        • check-success = Lint
        • check-success = Test (macos-latest)
        • check-success = Test (ubuntu-latest)
        • check-success = Test (windows-latest)
      • any of [🛡 GitHub repository ruleset rule Main]:
        • check-success = Mergify Merge Protections
        • check-neutral = Mergify Merge Protections
        • check-skipped = Mergify Merge Protections

@mergify mergify Bot added the queued label Apr 18, 2026
@mergify

mergify Bot commented Apr 18, 2026

Copy link
Copy Markdown
Contributor

Merge Queue Status

This pull request spent 5 minutes 58 seconds in the queue, including 5 minutes 44 seconds running CI.

Required conditions to merge
  • check-success = Build
  • check-success = Coverage
  • check-success = Integration Tests
  • check-success = Lint
  • check-success = Test (macos-latest)
  • check-success = Test (ubuntu-latest)
  • check-success = Test (windows-latest)
  • all of [🛡 Merge Protections rule Do not merge outdated PRs]:
  • all of [🛡 Merge Protections rule Enforce conventional commit]:
  • all of [🛡 Merge Protections rule Full CI must pass]:
    • check-success = Build
    • check-success = Coverage
    • check-success = Integration Tests
    • check-success = Lint
    • check-success = Test (macos-latest)
    • check-success = Test (ubuntu-latest)
    • check-success = Test (windows-latest)
  • any of [🛡 GitHub repository ruleset rule Main]:
    • check-neutral = Mergify Merge Protections
    • check-skipped = Mergify Merge Protections
    • check-success = Mergify Merge Protections

mergify Bot added a commit that referenced this pull request Apr 18, 2026
@mergify
mergify Bot merged commit 0225387 into main Apr 18, 2026
28 checks passed
@mergify
mergify Bot deleted the 558-windows-error-parse branch April 18, 2026 19:09
@mergify mergify Bot removed the queued label Apr 18, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working documentation Improvements or additions to documentation go Pull requests that update go code size:XL This PR changes 500-999 lines, ignoring generated files. testing Test infrastructure and test-related issues type:bug Bug or defect that needs fixing

Projects

None yet

Development

Successfully merging this pull request may close these issues.

windows error parse

2 participants