docs: subscription extension fallback semantics in CONTEXT.md (#35)

把「环」从刷新失败清单移出:私有扩展(含环在内的任何无效)按子票 #4
决议回退标准扁平列表、刷新本身按成功处理,与实现一致。
This commit is contained in:
Qiu Yuzhou
2026-09-21 06:22:52 +08:00
parent 0ecca53a20
commit a88e96c1e8
+2 -1
View File
@@ -42,7 +42,8 @@
- A subscription owns its subscription group and its refreshed members; manual groups remain user-owned. Remote connection fields, membership, structure, order, and `remarks` are authoritative; only local enablement may be retained as a per-node overlay for a matched subscription identity.
- Subscription server and nested-group identities use provider-supplied stable IDs scoped to that subscription. When a remote record has no stable ID, continuity is allowed only for an exactly matching canonical record; endpoint, name, or path heuristics must not merge identities.
- Subscription-owned nodes and nested groups permit no local connection-field, name/remark, membership, parent, or order override. A matched remote node or group may retain only its local `enabled` state; new records default to enabled, and removed records lose their overlays rather than leaving tombstones.
- Each subscription refresh is a complete, validated snapshot committed atomically. A valid empty snapshot replaces the remote subtree with an empty group; transport, HTTP/authentication, decoding, schema, duplicate-ID, cycle, or record-validation failures leave the last successful snapshot, local enablement, active target, and runtime state unchanged while marking the source stale. An initial failed refresh leaves an empty group with an error state.
- Each subscription refresh is a complete, validated snapshot committed atomically. A valid empty snapshot replaces the remote subtree with an empty group; transport, HTTP/authentication, decoding, schema, duplicate-ID, or record-validation failures leave the last successful snapshot, local enablement, active target, and runtime state unchanged while marking the source stale. An initial failed refresh leaves an empty group with an error state.
- The private `x_shadowsocksx_ng` extension is optional decoration on the standard SIP-008 server list. When it is absent, uses an unsupported schema version, or fails validation — unresolvable child references, duplicate or ID-colliding groups, shared parents, or cycles — the refresh still succeeds: the standard flat server list becomes the direct children of the subscription group and only the extension is discarded.
- Editing a subscription URL keeps the subscription, fixed group, and remote identity namespace; the last successful snapshot remains available until the new URL succeeds. To isolate a different source, delete the old subscription and create a new one. Deleting a subscription removes its source, fixed group, remote members, and local overlays after explicit confirmation; an active target is cleared and proxying stops without fallback.
- A Legacy import reads a current snapshot and commits atomically; skipping leaves an import entry available, success prevents automatic repetition, and an explicitly requested re-import creates a separate manual group.
- A unique, syntactically valid Legacy server UUID is preserved. An otherwise valid server with a missing, malformed, or duplicate UUID receives a fresh UUID; invalid records are omitted with a user-visible report, and an active target is kept only when it maps unambiguously.