@@ -136,8 +136,8 @@ sml_body=...)`, `ensure_system(..., sml_body=...)`, and
136136` ensure_deployment(..., sml_body=..., parent_id=...) ` . The
137137` OS4CSAPI_STRICT_BOOTSTRAP=1 ` environment guardrail raises ` RuntimeError `
138138on closed-properties leakage during dry-run. Both have now been validated
139- against a real strict server with two publishers (aviation-wx, NDBC). They
140- work; reuse for the remaining seven publishers is mechanical.
139+ against a real strict server with three publishers (aviation-wx, NDBC,
140+ CO-OPS). They work; reuse for the remaining six publishers is mechanical.
141141
142142### 2.5 Architectural defects in upstream surfaced
143143
@@ -201,11 +201,16 @@ Each publisher refactor is the same surgery:
2012015 . Strip deployment stubs.
2022026 . Wire ` sml_body= ` and ` force_sml= ` into ` ensure_procedure(...) ` calls.
203203
204- Done by hand on aviation-wx (5 systems) and NDBC (2 procedures, 5 systems,
205- dual datastream schemas). Seven publishers remain (coops, iss, nws,
206- opensky, usgs_eq, usgs_nims, usgs_water). Without an extracted helper,
207- every fix to an upstream defect (e.g., when the procedure ` documentation `
208- typo is fixed) requires editing N publishers.
204+ Done by hand on aviation-wx (5 systems), NDBC (2 procedures, 5 systems,
205+ dual datastream schemas), and CO-OPS (1 procedure, 5 systems, 3-role
206+ contacts including ` qualityControl ` /CORMS). Six publishers remain (iss,
207+ nws, opensky, usgs_eq, usgs_nims, usgs_water). Without an extracted
208+ helper, every fix to an upstream defect (e.g., when the procedure
209+ ` documentation ` typo is fixed) requires editing N publishers.
210+
211+ ** Trigger reached:** Recommendation 6.1 (extract shared SML/stub builder
212+ after ~ 3 publishers) is now due. Three full-fidelity refactors are on
213+ record; the abstraction is no longer speculative.
209214
210215### 3.4 Workarounds carry "unfixed upstream typo" notes inline
211216
@@ -532,6 +537,37 @@ We mention it here so readers don't waste time probing.
532537
533538---
534539
540+ ### 4.7 Positive-test confirmations (CO-OPS pilot, commit ` 3ac7c88 ` )
541+
542+ The CO-OPS migration exercised three SensorML contact-shape variants not
543+ seen in aviation-wx or NDBC. All were accepted by ` /systems ` PUT with
544+ ` Content-Type: application/sml+json ` and round-tripped intact on a
545+ subsequent ` GET ... Accept: application/sml+json ` :
546+
547+ | Field / shape | Status | Notes |
548+ | ---| ---| ---|
549+ | Contact ` role: "qualityControl" ` | Accepted | CORMS contact preserved end-to-end on station 8518750. |
550+ | Contact ` contactInfo.phone.voice ` | Accepted | NWS-style voice phone number survives the round trip. |
551+ | Three-contact array (operator + qualityControl + publisher) | Accepted | Prior pilots only exercised two roles. |
552+
553+ These are not defects, and we record them here so subsequent publishers
554+ (NWS, USGS) don't re-probe. They also tighten the negative space around
555+ Issue #2 : the System SensorML JSON binding * does* implement
556+ ` contacts[*].role ` , ` contactInfo.phone ` , and the spec-defined extended
557+ contact roles — the binding gap is specifically ` characteristics ` and
558+ ` capabilities ` , not contact metadata.
559+
560+ ** Reproducer (succeeds):**
561+
562+ ``` bash
563+ curl -s -H " Accept: application/sml+json" \
564+ https://129-80-248-53.sslip.io/csapi-go-v2/systems/{coops_8518750_id} \
565+ | python -c " import json,sys; d=json.load(sys.stdin); print([c['role'] for c in d['contacts']])"
566+ # -> ['operator', 'qualityControl', 'publisher']
567+ ```
568+
569+ ---
570+
535571## 5. Summary Table of Upstream Issues
536572
537573| # | Endpoint | Field | Status | Severity | Defect type | Workaround |
@@ -542,6 +578,7 @@ We mention it here so readers don't waste time probing.
542578| 4 | POST /datastreams | SWE Time ` referenceTime ` | Rejected | P2 | Incomplete SWE Common decoder | Drop field; implicit epoch |
543579| 5 | POST /datastreams | top-level ` uid ` | Rejected | P3 | Possibly intentional; undocumented | Let server assign ID |
544580| 6 | POST /deployments | ` parent@link ` in properties | Rejected | Informational | Not a defect | Use ` parent_id= ` helper param |
581+ | 7 | PUT /systems | ` contacts[*].role=qualityControl ` , ` contactInfo.phone.voice ` , 3-role contact arrays | ** Accepted** | Confirmation | None — works as specified | None needed (CO-OPS pilot, commit ` 3ac7c88 ` ) |
545582
546583---
547584
@@ -627,8 +664,8 @@ Option (c) is fine if documented. Right now it's implicit.
627664
628665** Improvements (durable):**
629666
630- 1 . Two publishers (aviation-wx, NDBC) are portable across both server
631- families.
667+ 1 . Three publishers (aviation-wx, NDBC, CO-OPS ) are portable across both
668+ server families.
6326692 . Stub/SML separation matches OGC 23-001.
6336703 . Empirical schema is captured in three companion documents.
6346714 . Helper infrastructure (` bootstrap_helpers.ensure_* ` ) is validated.
0 commit comments