Files
3x-ui-agent/internal/singbox
Rogue 29de9761c8
CI / go-test (push) Waiting to run
CI / postgres-durable-first (push) Waiting to run
CI / codegen (push) Waiting to run
CI / govulncheck (push) Waiting to run
CI / race (push) Waiting to run
CI / fuzz-smoke (push) Waiting to run
CI / golangci (push) Waiting to run
CI / frontend (push) Waiting to run
Docs CI / build (push) Waiting to run
Docs Deploy (GitHub Pages) / build (push) Waiting to run
Docs Deploy (GitHub Pages) / deploy (push) Blocked by required conditions
Release 3X-UI / build (386) (push) Waiting to run
Release 3X-UI / build (amd64) (push) Waiting to run
Release 3X-UI / build (arm64) (push) Waiting to run
Release 3X-UI / build (armv5) (push) Waiting to run
Release 3X-UI / build (armv6) (push) Waiting to run
Release 3X-UI / build (armv7) (push) Waiting to run
Release 3X-UI / build (s390x) (push) Waiting to run
Release 3X-UI / Build for Windows (amd64) (push) Waiting to run
Release 3X-UI / Publish rolling dev release (push) Blocked by required conditions
CodeQL Advanced / Analyze (go) (push) Waiting to run
CodeQL Advanced / Analyze (actions) (push) Waiting to run
CodeQL Advanced / Analyze (javascript-typescript) (push) Waiting to run
V2.0.1: listen override fix, sing-box core fetch, probe settings page + fast report, spx removal, core mem env
- 0: sing-box gen overrides fragment listen/port from the inbound row
  (empty listen -> "::"), Update/Add recompute the stored fragment;
  non-loopback E2E against the real core binary.
- 1: agent fetches the sing-box core from the Gitea release when
  missing, self-checks it, and only then latches the switch.
- 2: node list shows the sing-box core version (heartbeat field,
  persisted on the node row), xray version as fallback.
- 3: public-page fallback returns 404 to anonymous visitors when the
  page is disabled.
- 4: settings restart hint bar removed, dead i18n keys cleaned.
- 5: two PUT calls missing JSON headers fixed (audit: only those two),
  batch probe-task creation endpoint + UI.
- 6: cf-probe retirement card and coverage pipeline removed.
- 7: generated vless links no longer carry spx (panel export + sub);
  parser still accepts spx; golden fixtures updated.
- probe batch: dedicated probe settings tab (public-page settings,
  tasks, per-node meta), retention_days editable, per-node traffic
  calibration + stat-interface pinning, runtime metrics split into a
  lightweight fast report (default 3s, 1-60s adjustable).
- 8: sing-box core processes start with GOMEMLIMIT=32MiB, GOGC=50.
- 9: dead /getTwoFactorEnable docs entries removed (frontend call and
  contract entry already gone at base; verified by grep).
2026-10-23 07:53:11 +00:00
..

ITEM6 golden fixtures (B0)

Per-protocol × representative-transport fixtures for the xray→sing-box migration. Consumed by B1 (data model + migrator) and B2 (config builder) as the acceptance baseline; see ITEM6-CONVERSION-SPEC.md in ~/workspace/xui-lite-work/ for the normative mapping behind every file.

Layout

testdata/golden/<case>/
  input.json             current-shape sample (see below)
  expected-singbox.json  expected converter output fragment
  expected-link.txt      expected share link for the primary client

input.json fields: case, title, source (where the shape was taken from — frontend defaults / backend tests / production backup traits), disposition, risk (ITEM6-SCOPE N-number or null), notes, inbound (a model.Inbound row shape: settings / streamSettings / sniffing as embedded objects), clientEmail, client (the primary client's settings-mirror entry — the same object embedded in settings.clients where the protocol carries one).

expected-singbox.json is a fragment: inbounds[] (and endpoints[] for WireGuard). Keys starting with _ are fixture metadata (_b0: disposition, unmapped concepts awaiting Q1, notes) and are stripped before comparison. Blocked cases intentionally contain no fabricated output — inbounds is empty and _b0.unmapped records exactly what has no sing-box carrier, pending the user's Q1 decision.

expected-link.txt files were generated on 2026-10-23 by running the current code (main 8e89960) SubService.GetLink over each input.json inbound — i.e. they are the pre-migration outputs the migration must reproduce byte for byte (ITEM6-SCOPE §2.4). A throwaway harness test produced them and was deleted afterwards; regenerate only by re-running GetLink against the same inputs on pre-migration code. Empty files are real current behaviour for http-auth, tun and tunnel-dokodemo (no share link exists today).

All credentials in this corpus are fake (sequential-byte X25519/WireGuard keys, fx- passwords, TEST-NET 203.0.113.10). In fixtures, listen doubles as the resolved share address, mirroring the characterization tests in internal/sub; bind-address defaults are B2 base-config business, not fixture content.

Per the 2026-10-23 product decision, the JSON and Clash subscription families are being deleted wholesale (separate work line); subscriptions converge on the link format only. No Clash/JSON baselines are built or kept here, and ITEM6-SCOPE Q2 is closed by that decision.

Dispositions

  • direct — full mapping defined; B2 must reproduce the fragment.
  • partial-pending-q1 — mappable body is in the fragment; _b0.unmapped lists concepts with no sing-box carrier, awaiting Q1.
  • blocked-pending-q1 — no valid output exists until Q1 picks a carrier; fragment is an explicit marker, not a silent drop.
  • external-runtime — protocol never enters the core (mtproto, amneziawg); the migration duty is verbatim data passthrough only.