Signed-off-by: Nikos Mavrogiannopoulos <n.mavrogiannopoulos@gmail.com>
13 KiB
name: requirements-reconciliation type: reasoning description: > Systematic protocol for reconciling multiple requirements documents from different sources (RFCs, implementations, specifications) into a unified requirements document. Aligns requirements across sources, classifies compatibility, and documents conflicts with resolution options for human decision-making. applicable_to:
- reconcile-requirements
Protocol: Requirements Reconciliation
Apply this protocol when merging requirements extracted from multiple sources — RFCs, implementations, specifications — into a single unified requirements document. All sources are treated as equal inputs; no source is inherently authoritative. The goal is to produce a "most compatible" specification that documents what is universal, what is majority practice, where sources diverge, and what is unique to a single source.
Phase 1: Source Inventory
Catalog the input requirements documents.
-
For each source document, record:
- Source name and origin (e.g., "RFC 9293", "Linux TCP stack", "FreeBSD TCP stack", "Windows TCP stack")
- Total requirement count
- REQ-ID scheme used
- Keyword strength distribution (count of MUST, SHOULD, MAY)
- Categories/sections covered
-
Assess coverage overlap: Which functional areas do all sources cover? Which are covered by only a subset? Build a preliminary coverage matrix:
Functional Area Source 1 Source 2 Source 3 ... Connection setup ✓ ✓ ✓ Data transfer ✓ ✓ ✓ Congestion control ✓ ✓ ○ Use ✓ for covered, ○ for partially covered, ✗ for absent.
Phase 2: Requirement Alignment
Map requirements across sources to identify equivalences.
-
For each requirement in each source, find corresponding requirements in the other sources. Match by:
- Behavioral equivalence: The requirements describe the same behavior, possibly in different words.
- Functional area + condition: Requirements in the same functional area with the same triggering condition.
- State machine correspondence: Requirements about the same state, transition, or event.
Do NOT match by keyword or surface text similarity alone — two requirements can use similar words but specify different behaviors.
-
Build an alignment table: Each row represents a single behavior or constraint. Use temporary alignment IDs (U-001, U-002, ...) for working reference — these will be replaced with final unified REQ-IDs in Phase 5. Columns show how each source addresses it:
Alignment ID Behavior Source 1 Source 2 Source 3 ... U-001 SYN retransmit timeout REQ-TCP-034-012 (MUST, 3s) LINUX-CONN-007 (MUST, 1s) BSD-CONN-004 (MUST, 3s) -
Flag unmatched requirements: Requirements that exist in only one source and have no equivalent in any other source. These are candidates for the Extension compatibility class.
Phase 3: Compatibility Classification
For each aligned behavior (each row in the alignment table):
-
Compare keyword strength across sources:
- Do all sources agree on MUST/SHOULD/MAY?
- Does one source say MUST while another says SHOULD?
- Does any source omit this behavior entirely?
-
Compare specified values across sources:
- Do all sources agree on thresholds, timeouts, sizes?
- Where values differ, what is the range?
-
Assign a compatibility class:
-
UNIVERSAL: All sources specify this behavior with the same keyword strength and compatible values. This is safe to include as-is in the unified spec with the agreed keyword.
-
MAJORITY: Most sources (>50%) agree, but one or more diverge. Include in the unified spec with the majority keyword. Document which sources diverge and how.
-
DIVERGENT: Sources actively disagree — different keyword strengths, different values, or contradictory behaviors. Include in the unified spec with all variants documented. Do NOT pick a winner — the consumer must decide based on their use case.
-
EXTENSION: Only one source specifies this behavior. Include as MAY in the unified spec. Note which source defines it and why it may or may not be desirable for interoperability.
-
-
Record the classification rationale: For each non-UNIVERSAL requirement, briefly explain why it is not universal and what the specific differences are.
Phase 4: Conflict Analysis
For DIVERGENT requirements, perform deeper analysis:
-
Categorize the conflict:
- Value disagreement: Same behavior, different parameters (e.g., timeout 1s vs. 3s). Document the range across sources.
- Strength disagreement: Same behavior, different keyword (e.g., MUST vs. SHOULD). May indicate different risk assessments.
- Behavioral disagreement: Different behaviors for the same condition (e.g., "close connection" vs. "send reset"). These are true conflicts requiring human resolution.
- Presence disagreement: One source requires behavior another explicitly prohibits. These are the most dangerous conflicts.
-
Assess interoperability impact: For each conflict, answer:
- If an implementation follows source A's behavior and communicates with an implementation following source B's behavior, what happens?
- Is the result a failure, a degraded experience, or transparent?
-
Suggest resolution options (but do NOT pick one):
- Most conservative (strictest keyword, tightest value)
- Most permissive (loosest keyword, widest value)
- Most interoperable (the choice that causes fewest failures when communicating with other implementations)
Phase 5: Unified Specification Assembly
Produce the unified requirements document.
-
Assign unified REQ-IDs: Use the tag and scheme provided by the template (e.g.,
REQ-<TAG>-<CAT>-<NNN>where<TAG>is the user-provided unified tag). -
For each unified requirement, include:
- The unified REQ-ID and requirement text
- Compatibility class: UNIVERSAL / MAJORITY / DIVERGENT / EXTENSION
- Keyword strength: The unified keyword (for UNIVERSAL and MAJORITY) or all source keywords (for DIVERGENT)
- Source mapping: Which source requirements map to this unified requirement (REQ-IDs from each source)
- Acceptance criteria: Derived from the source with the most specific criteria, or synthesized from multiple sources
- Divergence notes (for non-UNIVERSAL): What differs and why
-
Group by category: Use functional area categories consistent across sources (e.g., CONNECTION, DATA_TRANSFER, CONGESTION, TEARDOWN, ERROR, SECURITY).
-
Produce a reconciliation summary:
- Total unified requirements
- Count by compatibility class
- Count by keyword strength
- List of DIVERGENT requirements requiring human resolution
- List of EXTENSION requirements for review
Phase 6: Interoperability Assessment
Produce an overall assessment of cross-source compatibility.
- Compatibility score: % of requirements that are UNIVERSAL.
- Risk areas: Functional areas with the highest concentration of DIVERGENT requirements.
- Interoperability hotspots: Specific behaviors where implementations will conflict if they follow different sources.
- Recommendations: Which DIVERGENT requirements are highest priority for resolution and why.
ocserv-Specific Extensions
The sections below extend the generic protocol for the sources and functional areas most relevant to ocserv: OpenConnect protocol, Cisco AnyConnect client behavior, relevant IETF RFCs, and the ocserv implementation itself.
Phase 1 — Source Inventory (ocserv)
The standard sources for ocserv protocol reconciliation are:
| Source ID | Origin | Normative weight |
|---|---|---|
OC-PROTO |
OpenConnect protocol documentation and libopenconnect implementation |
Primary interoperability target |
AC-CLIENT |
Observed Cisco AnyConnect client behavior (see doc/README-cisco-svc.md) |
Must not break; divergence must be flagged |
RFC-TLS |
RFC 8446 (TLS 1.3) and RFC 5246 (TLS 1.2) | Normative for TLS channel |
RFC-DTLS |
RFC 9147 (DTLS 1.3) and RFC 6347 (DTLS 1.2) | Normative for DTLS data channel |
OCSERV |
ocserv implementation (src/) |
Current behavior; may extend or diverge from specs |
When reconciling, read doc/README-cisco-svc.md before any other source —
it documents known AnyConnect deviations from the OpenConnect protocol that
ocserv already accommodates.
Functional areas for the coverage matrix:
| Functional Area | OC-PROTO | AC-CLIENT | RFC-TLS | RFC-DTLS | OCSERV |
|---|---|---|---|---|---|
| TLS channel setup | |||||
| DTLS channel setup | |||||
| CSTP auth exchange | |||||
| Cookie / session resumption | |||||
| IP/route configuration push | |||||
| Keepalive / dead-peer detection | |||||
| Session teardown |
Phase 2 — Requirement Alignment (ocserv)
When matching across sources, use these alignment anchors:
- CSTP header fields: Match by header name (e.g.,
X-CSTP-MTU,X-CSTP-DPD). Differences in casing or allowed values are a DIVERGENT signal. - HTTP exchange sequence: Match by phase (TLS handshake → HTTP GET/CONNECT → auth exchange → tunnel establishment). A requirement about "step N" in one source must be matched against the same protocol step, not the same HTTP method.
- TLS/DTLS parameters: Match by parameter class (cipher, version, extension). Different allowed ranges across sources are typically MAJORITY or DIVERGENT.
- Timeout and keepalive values: Match by semantic role (DPD interval, cookie lifetime, reconnect window). Numeric differences are DIVERGENT with value disagreement.
Flag unmatched OCSERV requirements as [EXTENSION: ocserv-only] — these
represent ocserv behaviors that extend the protocol (e.g., occtl management
interface, cgroup-based accounting, per-group config). They are not
interoperability risks but should be documented as extensions.
Phase 3 — Compatibility Classification (ocserv)
Interpretation of compatibility classes in the ocserv context:
-
UNIVERSAL: Safe to implement without concern for client or protocol compatibility. Core TLS handshake behavior, standard RFC MUST requirements.
-
MAJORITY: Implement the majority behavior as the default. If
AC-CLIENTis in the majority, the behavior is safe for AnyConnect compatibility. IfAC-CLIENTis the diverging source, flag as[COMPAT-RISK: AnyConnect]. -
DIVERGENT: Do NOT silently pick one behavior. Present all variants to the maintainer. Behaviors where
AC-CLIENTdiverges fromOC-PROTOor RFCs are the most common DIVERGENT class in ocserv and require explicit documentation indoc/README-cisco-svc.md. -
EXTENSION: Behaviors found only in
OCSERV. These are ocserv-specific features (management socket, virtual hosting, per-group routing) or accommodations for specific client quirks. They carry no interoperability risk with standard clients but must be documented indoc/ocserv.8.md.
Phase 4 — Conflict Analysis (ocserv)
For DIVERGENT requirements, apply this additional assessment:
- AnyConnect breakage risk: If an implementation following
OC-PROTOor the RFC would break an AnyConnect client, the conflict is[COMPAT-CRITICAL]. These conflicts must be escalated to the maintainer before any code change. - OpenConnect client compatibility: If a behavior would break the
openconnectreference client used in tests (tests/common.sh), it is a test infrastructure risk in addition to a protocol risk. - Security downgrade risk: Conflicts where one source requires a weaker
TLS version, weaker cipher, or looser certificate validation must be
classified as
[SEC-RISK]regardless of which source is the majority. The most conservative (strictest) option is the only acceptable default.
Resolution option format for ocserv:
- Most interoperable: The choice that preserves both AnyConnect and OpenConnect client compatibility.
- Most RFC-compliant: The choice that strictly follows the IETF RFC.
- Current ocserv behavior: What
OCSERVcurrently does (baseline).
Phase 5 — Unified Specification Assembly (ocserv)
Use these category tags in unified REQ-IDs:
| Tag | Description |
|---|---|
CONN |
TLS/DTLS connection establishment |
AUTH |
Authentication exchange (CSTP auth headers, certificate validation) |
SESSION |
Cookie issuance, session resumption, roaming |
DATA |
Data channel (CSTP, DTLS packet framing, MTU, compression) |
CTRL |
Keepalive, DPD, disconnect signaling |
CFG |
IP/route/DNS configuration push to client |
COMPAT |
AnyConnect-specific behaviors that deviate from OC-PROTO |
SEC |
Security properties (cipher requirements, certificate validation) |
EXT |
ocserv extensions not present in OC-PROTO or client behavior |
For every COMPAT requirement, add a note referencing doc/README-cisco-svc.md
if the behavior is already documented there, or flag it for addition if not.