xoonya 2.11.0 → 2.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/RELEASE_NOTES.md +2 -4
- package/index.js +2 -0
- package/lib/release_history.js +12 -0
- package/lib/trust_portability_pack.js +224 -0
- package/lib/verification_service_pack.js +149 -0
- package/package.json +4 -2
- package/scripts/verify_release_candidate.js +5 -6
- package/scripts/verify_service.js +26 -0
- package/scripts/verify_trust_portability.js +56 -0
- package/scripts/verify_verification_services.js +56 -0
- package/server.js +45 -0
package/RELEASE_NOTES.md
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
`xoonya` 2.11.0 is the lowercase-brand-convention line for aligned npm, GitHub, website, code, documentation, and public-copy surfaces.
|
|
1
|
+
`xoonya` 2.12.0 is the proof-release truth line for aligned npm, GitHub, website, code, documentation, and public-copy surfaces.
|
|
4
2
|
|
|
5
3
|
Highlights:
|
|
6
4
|
|
|
7
5
|
- normalizes visible `xoonya`, `xytara`, and `naxytra` product references to the lowercase convention across package docs, native-standard copy, CLI release surfaces, server routes, and verifier call sites
|
|
8
|
-
- preserves XNYA-compatible conformance, native reference implementation boundaries, external proof import boundaries, and the PQ/hybrid design gate
|
|
6
|
+
- preserves XNYA-compatible conformance, native reference implementation boundaries, external proof import boundaries, trust-portability surfaces, and the PQ/hybrid design gate
|
|
9
7
|
- keeps `RELEASE_NOTES.md` scoped to the current release so npm and GitHub release notes stay clean
|
|
10
8
|
- keeps the canonical `https://naxytra.com/xoonya` public product URL and single naxytra website positioning intact
|
|
11
9
|
- verifies the lowercase convention through the release candidate, full package verifier, umbrella pre-deploy gates, and clean-consumer release smoke
|
package/index.js
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
module.exports = {
|
|
4
4
|
...require("./proof_sdk"),
|
|
5
5
|
...require("./integrations/registry"),
|
|
6
|
+
...require("./lib/verification_service_pack"),
|
|
7
|
+
...require("./lib/trust_portability_pack"),
|
|
6
8
|
...require("./lib/release_pack"),
|
|
7
9
|
...require("./lib/release_manifest"),
|
|
8
10
|
...require("./lib/release_center"),
|
package/lib/release_history.js
CHANGED
|
@@ -10,6 +10,18 @@ function buildReleaseHistory() {
|
|
|
10
10
|
current_version: packageJson.version,
|
|
11
11
|
release_track: "public_release",
|
|
12
12
|
history: [
|
|
13
|
+
{
|
|
14
|
+
version: "2.12.0",
|
|
15
|
+
channel: "public_release",
|
|
16
|
+
maturity_posture: "proof_release_truth",
|
|
17
|
+
headline: "proof-release truth line aligning verification services, trust portability, and public release-coherence surfaces",
|
|
18
|
+
milestone_refs: [
|
|
19
|
+
"proof_release_truth_bundle",
|
|
20
|
+
"verification_service_public_surface",
|
|
21
|
+
"trust_portability_public_surface",
|
|
22
|
+
"public_release_surface_alignment"
|
|
23
|
+
]
|
|
24
|
+
},
|
|
13
25
|
{
|
|
14
26
|
version: "2.11.0",
|
|
15
27
|
channel: "public_release",
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const packageJson = require("../package.json");
|
|
4
|
+
const {
|
|
5
|
+
buildAuthInteropContract,
|
|
6
|
+
summarizeAuthInteropContract
|
|
7
|
+
} = require("./auth_interop_contract");
|
|
8
|
+
const {
|
|
9
|
+
buildIdentityInteropContract,
|
|
10
|
+
summarizeIdentityInteropContract
|
|
11
|
+
} = require("./identity_interop_contract");
|
|
12
|
+
const {
|
|
13
|
+
buildResultPackageTrustLanePack,
|
|
14
|
+
summarizeResultPackageTrustLanePack
|
|
15
|
+
} = require("./result_package_trust_lane_contract");
|
|
16
|
+
const {
|
|
17
|
+
buildPhase4TrustContinuityPack,
|
|
18
|
+
summarizePhase4TrustContinuityPack
|
|
19
|
+
} = require("./phase_4_trust_continuity_pack");
|
|
20
|
+
const {
|
|
21
|
+
buildPhase4IdentityRegistryProofPack,
|
|
22
|
+
summarizePhase4IdentityRegistryProofPack
|
|
23
|
+
} = require("./phase_4_identity_registry_proof_pack");
|
|
24
|
+
const {
|
|
25
|
+
buildVerificationServicesPack,
|
|
26
|
+
summarizeVerificationServicesPack
|
|
27
|
+
} = require("./verification_service_pack");
|
|
28
|
+
|
|
29
|
+
function buildTrustPortabilityPack() {
|
|
30
|
+
const authInterop = buildAuthInteropContract();
|
|
31
|
+
const authInteropSummary = summarizeAuthInteropContract();
|
|
32
|
+
const identityInterop = buildIdentityInteropContract();
|
|
33
|
+
const identityInteropSummary = summarizeIdentityInteropContract();
|
|
34
|
+
const resultPackageTrust = buildResultPackageTrustLanePack();
|
|
35
|
+
const resultPackageTrustSummary = summarizeResultPackageTrustLanePack();
|
|
36
|
+
const phase4TrustContinuity = buildPhase4TrustContinuityPack();
|
|
37
|
+
const phase4TrustContinuitySummary = summarizePhase4TrustContinuityPack();
|
|
38
|
+
const phase4IdentityRegistry = buildPhase4IdentityRegistryProofPack();
|
|
39
|
+
const phase4IdentityRegistrySummary = summarizePhase4IdentityRegistryProofPack();
|
|
40
|
+
const verificationServices = buildVerificationServicesPack();
|
|
41
|
+
const verificationServicesSummary = summarizeVerificationServicesPack();
|
|
42
|
+
const servicesById = Object.fromEntries(
|
|
43
|
+
(verificationServices.verification_services || []).map((entry) => [entry.service_id, entry])
|
|
44
|
+
);
|
|
45
|
+
|
|
46
|
+
const profiles = [
|
|
47
|
+
{
|
|
48
|
+
profile_id: "agent_identity_portability",
|
|
49
|
+
profile_label: "agent identity portability",
|
|
50
|
+
portability_axis: "agent_identity",
|
|
51
|
+
claim_status: "bounded_live",
|
|
52
|
+
portability_state: "identity_attestation_registry_and_bundle_linkage_present",
|
|
53
|
+
callable_surfaces: [
|
|
54
|
+
"/v1/identity-interop",
|
|
55
|
+
"/v1/phases/phase-4/identity-registry/proof/summary",
|
|
56
|
+
"/v1/receipts/verify"
|
|
57
|
+
],
|
|
58
|
+
supporting_surfaces: [
|
|
59
|
+
"/v1/identity-interop/summary",
|
|
60
|
+
"/v1/phases/phase-4/trust-continuity/summary",
|
|
61
|
+
"/v1/proof-center/verification-services/summary"
|
|
62
|
+
],
|
|
63
|
+
supporting_counts: {
|
|
64
|
+
identity_interop_profile_count: identityInteropSummary.profile_count,
|
|
65
|
+
identity_registry_resolution_mode_count: phase4IdentityRegistrySummary.resolution_mode_count,
|
|
66
|
+
verification_service_count: verificationServicesSummary.service_count
|
|
67
|
+
},
|
|
68
|
+
expected_portability_outcome: "identity refs remain reviewable and portable across proof bundles, registry proof, and carried receipts",
|
|
69
|
+
claim_boundary: "identity_portability_binds_reviewable_identity_refs_and_registry_resolution_without_becoming_global_login_or_external_issuer_truth"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
profile_id: "delegation_capability_portability",
|
|
73
|
+
profile_label: "delegation/capability portability",
|
|
74
|
+
portability_axis: "delegation_capabilities",
|
|
75
|
+
claim_status: "bounded_live",
|
|
76
|
+
portability_state: "auth_interop_bridge_handoff_and_review_followthrough_present",
|
|
77
|
+
callable_surfaces: [
|
|
78
|
+
"/v1/auth-profiles",
|
|
79
|
+
"/v1/proof-center/bridge/economic-handoff",
|
|
80
|
+
"/v1/proof-center/result-package-handoff/review/handoff-intake"
|
|
81
|
+
],
|
|
82
|
+
supporting_surfaces: [
|
|
83
|
+
"/v1/auth-profiles/summary",
|
|
84
|
+
"/v1/proof-center/bridge/summary",
|
|
85
|
+
"/v1/result-package-trust/summary"
|
|
86
|
+
],
|
|
87
|
+
supporting_counts: {
|
|
88
|
+
auth_interop_profile_count: authInteropSummary.profile_count,
|
|
89
|
+
bridge_flow_count: Array.isArray(resultPackageTrust.first_run_flows) ? resultPackageTrust.first_run_flows.length : 0,
|
|
90
|
+
delivery_verify_callable_surface_count: Array.isArray(servicesById.delivery_verify && servicesById.delivery_verify.callable_surfaces)
|
|
91
|
+
? servicesById.delivery_verify.callable_surfaces.length
|
|
92
|
+
: 0
|
|
93
|
+
},
|
|
94
|
+
expected_portability_outcome: "delegated capability context can cross runtime-to-proof handoff while staying reviewable and bounded",
|
|
95
|
+
claim_boundary: "delegation_portability_preserves_handoff_capability_context_without_becoming_session_authority_or_runtime_execution_truth"
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
profile_id: "delivery_history_portability",
|
|
99
|
+
profile_label: "delivery history portability",
|
|
100
|
+
portability_axis: "delivery_history",
|
|
101
|
+
claim_status: "bounded_live",
|
|
102
|
+
portability_state: "result_package_delivery_review_and_followthrough_present",
|
|
103
|
+
callable_surfaces: [
|
|
104
|
+
"/v1/result-package-trust",
|
|
105
|
+
"/v1/proof-center/result-package-handoff/review/summary",
|
|
106
|
+
"/v1/proof-center/transaction-handoff/run"
|
|
107
|
+
],
|
|
108
|
+
supporting_surfaces: [
|
|
109
|
+
"/v1/result-package-trust/summary",
|
|
110
|
+
"/v1/phases/phase-4/trust-continuity/summary",
|
|
111
|
+
"/v1/proof-center/verification-services/summary"
|
|
112
|
+
],
|
|
113
|
+
supporting_counts: {
|
|
114
|
+
proof_readiness_state: resultPackageTrustSummary.proof_readiness_state,
|
|
115
|
+
trust_continuity_signal_count: phase4TrustContinuitySummary.signal_count,
|
|
116
|
+
delivery_verify_callable_surface_count: Array.isArray(servicesById.delivery_verify && servicesById.delivery_verify.callable_surfaces)
|
|
117
|
+
? servicesById.delivery_verify.callable_surfaces.length
|
|
118
|
+
: 0
|
|
119
|
+
},
|
|
120
|
+
expected_portability_outcome: "delivery history stays inspectable through carried result packages, handoff review, and delivery verification surfaces",
|
|
121
|
+
claim_boundary: "delivery_history_portability_preserves_reviewable_result_package_continuity_not_runtime_success_truth_beyond_carried_evidence"
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
profile_id: "settlement_linked_trust_portability",
|
|
125
|
+
profile_label: "settlement-linked trust portability",
|
|
126
|
+
portability_axis: "settlement_linked_trust",
|
|
127
|
+
claim_status: "bounded_live",
|
|
128
|
+
portability_state: "bridge_anchor_and_settlement_verification_followthrough_present",
|
|
129
|
+
callable_surfaces: [
|
|
130
|
+
"/v1/proof-center/bridge/validator-verify",
|
|
131
|
+
"/v1/proof-center/bridge/economic-handoff",
|
|
132
|
+
"/v1/proof-center/native-anchor-profile/summary"
|
|
133
|
+
],
|
|
134
|
+
supporting_surfaces: [
|
|
135
|
+
"/v1/proof-center/bridge/summary",
|
|
136
|
+
"/v1/proof-center/verification-services/summary",
|
|
137
|
+
"/v1/phases/phase-4/trust-continuity/summary"
|
|
138
|
+
],
|
|
139
|
+
supporting_counts: {
|
|
140
|
+
settlement_verify_callable_surface_count: Array.isArray(servicesById.settlement_verify && servicesById.settlement_verify.callable_surfaces)
|
|
141
|
+
? servicesById.settlement_verify.callable_surfaces.length
|
|
142
|
+
: 0,
|
|
143
|
+
anchor_verify_callable_surface_count: Array.isArray(servicesById.anchor_finality_verify && servicesById.anchor_finality_verify.callable_surfaces)
|
|
144
|
+
? servicesById.anchor_finality_verify.callable_surfaces.length
|
|
145
|
+
: 0,
|
|
146
|
+
phase_4_review_mode_count: phase4TrustContinuitySummary.review_mode_count
|
|
147
|
+
},
|
|
148
|
+
expected_portability_outcome: "trust continuity can remain attached to settlement evidence, anchor context, and carried economic handoff without overclaiming chain truth",
|
|
149
|
+
claim_boundary: "settlement_linked_trust_portability_binds_reviewable_settlement_and_anchor_context_without_claiming_external_chain_or_custody_truth"
|
|
150
|
+
}
|
|
151
|
+
];
|
|
152
|
+
|
|
153
|
+
return {
|
|
154
|
+
ok: true,
|
|
155
|
+
product: packageJson.name,
|
|
156
|
+
category: "xoonya-trust-portability-pack",
|
|
157
|
+
pack_version: "xoonya-trust-portability-pack-v1",
|
|
158
|
+
doctrine: "cross_venue_identity_delegation_delivery_and_settlement_linked_trust_portability",
|
|
159
|
+
portability_profiles: profiles,
|
|
160
|
+
supporting_contracts: {
|
|
161
|
+
auth_interop_summary: authInteropSummary,
|
|
162
|
+
identity_interop_summary: identityInteropSummary,
|
|
163
|
+
result_package_trust_summary: resultPackageTrustSummary,
|
|
164
|
+
phase_4_trust_continuity_summary: phase4TrustContinuitySummary,
|
|
165
|
+
phase_4_identity_registry_proof_summary: phase4IdentityRegistrySummary,
|
|
166
|
+
verification_service_summary: verificationServicesSummary
|
|
167
|
+
},
|
|
168
|
+
first_run_flow: {
|
|
169
|
+
flow_ref: "cross_venue_trust_portability_review",
|
|
170
|
+
recommended_reason: "show that identity, delegation, delivery history, and settlement-linked trust remain portable across proof-facing surfaces",
|
|
171
|
+
http_sequence: [
|
|
172
|
+
"/v1/proof-center/trust-portability/summary",
|
|
173
|
+
"/v1/identity-interop/summary",
|
|
174
|
+
"/v1/result-package-trust/summary",
|
|
175
|
+
"/v1/proof-center/verification-services/summary"
|
|
176
|
+
]
|
|
177
|
+
},
|
|
178
|
+
public_claim_boundaries: [
|
|
179
|
+
"trust_portability_is_reviewable_followthrough_not_global_identity_or_login_truth",
|
|
180
|
+
"delegation_portability_stays_bound_to_listed_auth_and_handoff_surfaces",
|
|
181
|
+
"delivery_history_portability_stays_bound_to_carried_result_package_and_review_surfaces",
|
|
182
|
+
"settlement_linked_trust_portability_does_not_claim_external_chain_or_custody_truth"
|
|
183
|
+
],
|
|
184
|
+
linked_surfaces: {
|
|
185
|
+
auth_interop_ref: "/v1/auth-profiles",
|
|
186
|
+
auth_interop_summary_ref: "/v1/auth-profiles/summary",
|
|
187
|
+
identity_interop_ref: "/v1/identity-interop",
|
|
188
|
+
identity_interop_summary_ref: "/v1/identity-interop/summary",
|
|
189
|
+
result_package_trust_ref: "/v1/result-package-trust",
|
|
190
|
+
result_package_trust_summary_ref: "/v1/result-package-trust/summary",
|
|
191
|
+
phase_4_trust_continuity_ref: "/v1/phases/phase-4/trust-continuity",
|
|
192
|
+
phase_4_trust_continuity_summary_ref: "/v1/phases/phase-4/trust-continuity/summary",
|
|
193
|
+
phase_4_identity_registry_proof_ref: "/v1/phases/phase-4/identity-registry/proof",
|
|
194
|
+
phase_4_identity_registry_proof_summary_ref: "/v1/phases/phase-4/identity-registry/proof/summary",
|
|
195
|
+
verification_services_ref: "/v1/proof-center/verification-services",
|
|
196
|
+
verification_services_summary_ref: "/v1/proof-center/verification-services/summary"
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
function getTrustPortabilityProfile(profileId) {
|
|
202
|
+
return buildTrustPortabilityPack().portability_profiles.find((entry) => entry.profile_id === profileId) || null;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function summarizeTrustPortabilityPack() {
|
|
206
|
+
const pack = buildTrustPortabilityPack();
|
|
207
|
+
return {
|
|
208
|
+
ok: true,
|
|
209
|
+
product: pack.product,
|
|
210
|
+
category: "xoonya-trust-portability-summary",
|
|
211
|
+
summary_version: "xoonya-trust-portability-summary-v1",
|
|
212
|
+
profile_count: pack.portability_profiles.length,
|
|
213
|
+
bounded_live_profile_count: pack.portability_profiles.filter((entry) => entry.claim_status === "bounded_live").length,
|
|
214
|
+
callable_profile_count: pack.portability_profiles.filter((entry) => Array.isArray(entry.callable_surfaces) && entry.callable_surfaces.length >= 2).length,
|
|
215
|
+
portability_axis_count: Array.from(new Set(pack.portability_profiles.map((entry) => entry.portability_axis))).length,
|
|
216
|
+
linked_surfaces: pack.linked_surfaces
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
module.exports = {
|
|
221
|
+
buildTrustPortabilityPack,
|
|
222
|
+
getTrustPortabilityProfile,
|
|
223
|
+
summarizeTrustPortabilityPack
|
|
224
|
+
};
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const packageJson = require("../package.json");
|
|
4
|
+
const proofSdk = require("../proof_sdk");
|
|
5
|
+
|
|
6
|
+
function buildVerificationServicesPack() {
|
|
7
|
+
const proofCenter = proofSdk.summarizeDefaultProofCenter();
|
|
8
|
+
const resultPackageCenter = proofSdk.summarizeInteractionResultPackageHandoffCenter();
|
|
9
|
+
const transactionHandoff = proofSdk.summarizeTransactionProofHandoffCenter();
|
|
10
|
+
const interactionHandoff = proofSdk.summarizeInteractionSpineProofHandoffCenter();
|
|
11
|
+
const governance = proofSdk.summarizeGovernanceCenter();
|
|
12
|
+
const nativeAnchor = proofSdk.summarizexoonyaNativeAnchorProfile();
|
|
13
|
+
const bridge = proofSdk.summarizeBridgeCenter();
|
|
14
|
+
|
|
15
|
+
const services = [
|
|
16
|
+
{
|
|
17
|
+
service_id: "bundle_verify",
|
|
18
|
+
service_label: "bundle verify",
|
|
19
|
+
verification_kind: "bundle_verify",
|
|
20
|
+
claim_status: "live",
|
|
21
|
+
callable_surfaces: ["/v1/proof-bundles/verify", "/v1/proof-center/default-loops/run"],
|
|
22
|
+
supporting_surfaces: ["/v1/proof-center/summary", "/v1/proof-center/default-loops/summary"],
|
|
23
|
+
verification_methods: proofCenter.verification_methods,
|
|
24
|
+
claim_boundary: "verifies_xoonya_bundle_contract_and_registered_methods_not_external_issuer_truth"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
service_id: "delivery_verify",
|
|
28
|
+
service_label: "delivery verify",
|
|
29
|
+
verification_kind: "delivery_verify",
|
|
30
|
+
claim_status: "bounded_live",
|
|
31
|
+
callable_surfaces: [
|
|
32
|
+
"/v1/proof-center/transaction-handoff/run",
|
|
33
|
+
"/v1/proof-center/interaction-spine-handoff/run",
|
|
34
|
+
"/v1/proof-center/result-package-handoff/review/summary"
|
|
35
|
+
],
|
|
36
|
+
supporting_surfaces: [
|
|
37
|
+
"/v1/proof-center/transaction-handoff/summary",
|
|
38
|
+
"/v1/proof-center/interaction-spine-handoff/summary",
|
|
39
|
+
"/v1/proof-center/result-package-handoff/summary"
|
|
40
|
+
],
|
|
41
|
+
supporting_counts: {
|
|
42
|
+
transaction_source_count: transactionHandoff.transaction_handoff_source_count,
|
|
43
|
+
interaction_source_count: interactionHandoff.interaction_spine_source_count,
|
|
44
|
+
result_package_source_count: resultPackageCenter.result_package_source_count
|
|
45
|
+
},
|
|
46
|
+
claim_boundary: "delivery_verification_confirms_bundle_continuity_and_handoff_shape_not_runtime_success_beyond_carried_evidence"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
service_id: "settlement_verify",
|
|
50
|
+
service_label: "settlement verify",
|
|
51
|
+
verification_kind: "settlement_verify",
|
|
52
|
+
claim_status: "bounded_live",
|
|
53
|
+
callable_surfaces: ["/v1/proof-center/bridge/validator-verify"],
|
|
54
|
+
supporting_surfaces: ["/v1/proof-center/bridge/summary", "/v1/proof-center/native-anchor-profile/summary"],
|
|
55
|
+
supporting_counts: {
|
|
56
|
+
bridge_profile_count: bridge.profile_count,
|
|
57
|
+
anchor_binding_count: nativeAnchor.anchor_ref_type_count
|
|
58
|
+
},
|
|
59
|
+
claim_boundary: "settlement_verification_binds_settlement_evidence_and_anchor_context_without_claiming_external_chain_truth_by_default"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
service_id: "dispute_replay",
|
|
63
|
+
service_label: "dispute replay",
|
|
64
|
+
verification_kind: "dispute_replay",
|
|
65
|
+
claim_status: "bounded_live",
|
|
66
|
+
callable_surfaces: [
|
|
67
|
+
"/v1/proof-center/governance/disputes/summary",
|
|
68
|
+
"/v1/proof-center/governance/disputes/case-review",
|
|
69
|
+
"/v1/proof-center/governance/disputes/case-bundle",
|
|
70
|
+
"/v1/proof-center/governance/disputes/resolution-pack"
|
|
71
|
+
],
|
|
72
|
+
supporting_surfaces: ["/v1/proof-center/governance/summary", "/v1/proof-center/governance/review-link"],
|
|
73
|
+
supporting_counts: {
|
|
74
|
+
workflow_count: governance.workflow_count,
|
|
75
|
+
dispute_surface_count: 4
|
|
76
|
+
},
|
|
77
|
+
claim_boundary: "dispute_replay_preserves_reviewable_evidence_and_resolution_shape_not_external_legal_judgment_truth"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
service_id: "identity_link_verify",
|
|
81
|
+
service_label: "identity-link verify",
|
|
82
|
+
verification_kind: "identity_link_verify",
|
|
83
|
+
claim_status: "bounded_live",
|
|
84
|
+
callable_surfaces: ["/v1/receipts/verify", "/v1/proof-center/native-anchor-profile/summary"],
|
|
85
|
+
supporting_surfaces: ["/v1/identity-interop/summary", "/v1/proof-center/result-package-handoff/review/handoff-intake"],
|
|
86
|
+
supporting_counts: {
|
|
87
|
+
verification_method_count: proofCenter.verification_method_count,
|
|
88
|
+
native_methods_present: nativeAnchor.required_method_count
|
|
89
|
+
},
|
|
90
|
+
claim_boundary: "identity_link_verification_binds_identity_refs_inside_the_bundle_without_becoming_login_session_or_global_identity_truth"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
service_id: "anchor_finality_verify",
|
|
94
|
+
service_label: "anchor/finality verify",
|
|
95
|
+
verification_kind: "anchor_finality_verify",
|
|
96
|
+
claim_status: "bounded_live",
|
|
97
|
+
callable_surfaces: ["/v1/proof-center/native-anchor-profile/summary"],
|
|
98
|
+
supporting_surfaces: ["/v1/proof-center/native-anchor-profile", "/v1/proof-center/bridge/summary"],
|
|
99
|
+
supporting_counts: {
|
|
100
|
+
anchor_ref_type_count: nativeAnchor.anchor_ref_type_count,
|
|
101
|
+
bridge_profile_count: bridge.profile_count
|
|
102
|
+
},
|
|
103
|
+
claim_boundary: "anchor_and_finality_verification_confirms_xoonya_binding_and_declared_anchor_refs_not_external_provider_or_chain_truth"
|
|
104
|
+
}
|
|
105
|
+
];
|
|
106
|
+
|
|
107
|
+
return {
|
|
108
|
+
ok: true,
|
|
109
|
+
product: packageJson.name,
|
|
110
|
+
category: "xoonya-verification-services-pack",
|
|
111
|
+
pack_version: "xoonya-verification-services-pack-v1",
|
|
112
|
+
doctrine: "native_optional_external_methods_supported_verification_and_replay_are_first_class_services",
|
|
113
|
+
service_count: services.length,
|
|
114
|
+
verification_services: services,
|
|
115
|
+
public_claim_boundaries: [
|
|
116
|
+
"keep_external_identity_and_signature_truth_outside_xoonya_without_external_verifier_evidence",
|
|
117
|
+
"keep_native_optional_not_mandatory",
|
|
118
|
+
"keep_anchor_and_finality_checks_bound_to_xoonya_binding_not_external_chain_truth",
|
|
119
|
+
"keep_dispute_replay_as_reviewable_evidence_not_universal_judgment_truth"
|
|
120
|
+
],
|
|
121
|
+
linked_surfaces: {
|
|
122
|
+
proof_center_ref: "/v1/proof-center",
|
|
123
|
+
proof_center_summary_ref: "/v1/proof-center/summary",
|
|
124
|
+
bridge_summary_ref: "/v1/proof-center/bridge/summary",
|
|
125
|
+
governance_summary_ref: "/v1/proof-center/governance/summary",
|
|
126
|
+
native_anchor_profile_ref: "/v1/proof-center/native-anchor-profile",
|
|
127
|
+
result_package_handoff_summary_ref: "/v1/proof-center/result-package-handoff/summary"
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function summarizeVerificationServicesPack() {
|
|
133
|
+
const pack = buildVerificationServicesPack();
|
|
134
|
+
return {
|
|
135
|
+
ok: true,
|
|
136
|
+
product: pack.product,
|
|
137
|
+
category: "xoonya-verification-services-summary",
|
|
138
|
+
summary_version: "xoonya-verification-services-summary-v1",
|
|
139
|
+
service_count: pack.service_count,
|
|
140
|
+
live_service_count: pack.verification_services.filter((entry) => entry.claim_status === "live").length,
|
|
141
|
+
bounded_live_service_count: pack.verification_services.filter((entry) => entry.claim_status === "bounded_live").length,
|
|
142
|
+
linked_surfaces: pack.linked_surfaces
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
module.exports = {
|
|
147
|
+
buildVerificationServicesPack,
|
|
148
|
+
summarizeVerificationServicesPack
|
|
149
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "xoonya",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.12.0",
|
|
4
4
|
"description": "Deterministic proof and review engine for receipts, handoffs, governance, and verification.",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
@@ -80,11 +80,13 @@
|
|
|
80
80
|
"verify:reference-promotion-gate": "node scripts/verify_reference_promotion_gate.js",
|
|
81
81
|
"verify:reference-rust-scaffold": "node scripts/verify_reference_rust_scaffold.js",
|
|
82
82
|
"verify:native-hybrid-gate": "node scripts/verify_native_hybrid_design_gate.js",
|
|
83
|
+
"verify:verification-services": "node scripts/verify_verification_services.js",
|
|
84
|
+
"verify:trust-portability": "node scripts/verify_trust_portability.js",
|
|
83
85
|
"verify:vectors": "node scripts/verify_vectors.js",
|
|
84
86
|
"verify:examples": "node scripts/verify_examples.js",
|
|
85
87
|
"verify:service": "node scripts/verify_service.js",
|
|
86
88
|
"verify:release-candidate": "node scripts/verify_release_candidate.js",
|
|
87
|
-
"verify:all": "node scripts/verify_all.js && node scripts/verify_external_proof_import_gate.js && node scripts/verify_integrations.js && node scripts/verify_tooling.js && node scripts/verify_vectors.js && node scripts/verify_reference_python.js && node scripts/verify_reference_promotion_gate.js && node scripts/verify_reference_rust_scaffold.js && node scripts/verify_native_hybrid_design_gate.js && node scripts/verify_examples.js && node scripts/verify_service.js",
|
|
89
|
+
"verify:all": "node scripts/verify_all.js && node scripts/verify_external_proof_import_gate.js && node scripts/verify_integrations.js && node scripts/verify_tooling.js && node scripts/verify_vectors.js && node scripts/verify_reference_python.js && node scripts/verify_reference_promotion_gate.js && node scripts/verify_reference_rust_scaffold.js && node scripts/verify_native_hybrid_design_gate.js && node scripts/verify_verification_services.js && node scripts/verify_trust_portability.js && node scripts/verify_examples.js && node scripts/verify_service.js",
|
|
88
90
|
"prepublishOnly": "npm run verify:release-candidate"
|
|
89
91
|
}
|
|
90
92
|
}
|
|
@@ -18,12 +18,10 @@ function parsePackDryRun() {
|
|
|
18
18
|
function verifyReleaseNotes() {
|
|
19
19
|
const notesPath = path.resolve(__dirname, "..", "RELEASE_NOTES.md");
|
|
20
20
|
const notes = fs.readFileSync(notesPath, "utf8");
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
[`# xoonya ${packageJson.version} Release Notes`],
|
|
26
|
-
"RELEASE_NOTES.md must contain only the current xoonya release heading"
|
|
21
|
+
assert.strictEqual(
|
|
22
|
+
/^#\s+xoonya\s+\d+\.\d+\.\d+\s+Release Notes\s*$/m.test(notes),
|
|
23
|
+
false,
|
|
24
|
+
"RELEASE_NOTES.md must not duplicate the GitHub release title as a heading"
|
|
27
25
|
);
|
|
28
26
|
assert.strictEqual(
|
|
29
27
|
notes.includes(`xoonya\` ${packageJson.version}`),
|
|
@@ -102,6 +100,7 @@ function main() {
|
|
|
102
100
|
assert.strictEqual(dryRun.files.some((entry) => entry.path === "scripts/verify_reference_promotion_gate.js"), true, "npm pack dry-run missing reference promotion gate verifier script");
|
|
103
101
|
assert.strictEqual(dryRun.files.some((entry) => entry.path === "scripts/verify_reference_rust_scaffold.js"), true, "npm pack dry-run missing Rust reference scaffold verifier script");
|
|
104
102
|
assert.strictEqual(dryRun.files.some((entry) => entry.path === "scripts/verify_native_hybrid_design_gate.js"), true, "npm pack dry-run missing native hybrid design-gate verifier script");
|
|
103
|
+
assert.strictEqual(dryRun.files.some((entry) => entry.path === "scripts/verify_verification_services.js"), true, "npm pack dry-run missing verification services verifier script");
|
|
105
104
|
assert.strictEqual(dryRun.files.some((entry) => entry.path === "scripts/verify_all.js"), true, "npm pack dry-run missing package verifier script");
|
|
106
105
|
assert.strictEqual(dryRun.files.some((entry) => entry.path === "vectors/conformance-vectors.json"), true, "npm pack dry-run missing conformance vectors");
|
|
107
106
|
assert.strictEqual(dryRun.files.some((entry) => entry.path === "vectors/adversarial-vectors.json"), true, "npm pack dry-run missing adversarial vectors");
|
|
@@ -105,6 +105,22 @@ async function main() {
|
|
|
105
105
|
assert.strictEqual(identityInteropSummaryResponse.json.product, 'xoonya', 'identity interop summary product missing');
|
|
106
106
|
assert.strictEqual(identityInteropSummaryResponse.json.profile_count >= 4, true, 'identity interop summary count missing');
|
|
107
107
|
|
|
108
|
+
const trustPortabilityResponse = await getJson(baseUrl, '/v1/proof-center/trust-portability');
|
|
109
|
+
assert.strictEqual(trustPortabilityResponse.status, 200, 'trust portability route failed');
|
|
110
|
+
assert.strictEqual(trustPortabilityResponse.json.product, 'xoonya', 'trust portability product missing');
|
|
111
|
+
assert.strictEqual(trustPortabilityResponse.json.category, 'xoonya-trust-portability-pack', 'trust portability category missing');
|
|
112
|
+
assert.strictEqual(Array.isArray(trustPortabilityResponse.json.portability_profiles), true, 'trust portability profiles missing');
|
|
113
|
+
assert.strictEqual(trustPortabilityResponse.json.portability_profiles.length >= 4, true, 'trust portability profile count missing');
|
|
114
|
+
|
|
115
|
+
const trustPortabilitySummaryResponse = await getJson(baseUrl, '/v1/proof-center/trust-portability/summary');
|
|
116
|
+
assert.strictEqual(trustPortabilitySummaryResponse.status, 200, 'trust portability summary route failed');
|
|
117
|
+
assert.strictEqual(trustPortabilitySummaryResponse.json.product, 'xoonya', 'trust portability summary product missing');
|
|
118
|
+
assert.strictEqual(trustPortabilitySummaryResponse.json.profile_count >= 4, true, 'trust portability summary profile count missing');
|
|
119
|
+
|
|
120
|
+
const trustPortabilityDetailResponse = await getJson(baseUrl, '/v1/proof-center/trust-portability/agent_identity_portability');
|
|
121
|
+
assert.strictEqual(trustPortabilityDetailResponse.status, 200, 'trust portability detail route failed');
|
|
122
|
+
assert.strictEqual(trustPortabilityDetailResponse.json.profile.profile_id, 'agent_identity_portability', 'trust portability detail profile missing');
|
|
123
|
+
|
|
108
124
|
const providerLaneResponse = await getJson(baseUrl, '/v1/providers');
|
|
109
125
|
assert.strictEqual(providerLaneResponse.status, 200, 'provider lane route failed');
|
|
110
126
|
assert.strictEqual(providerLaneResponse.json.product, 'xoonya', 'provider lane product missing');
|
|
@@ -191,6 +207,16 @@ async function main() {
|
|
|
191
207
|
assert.strictEqual(proofBridgeLaneSummaryResponse.json.product, 'xoonya', 'proof bridge lane summary product missing');
|
|
192
208
|
assert.strictEqual(proofBridgeLaneSummaryResponse.json.first_run_flow_count >= 2, true, 'proof bridge lane summary flow count missing');
|
|
193
209
|
|
|
210
|
+
const verificationServicesResponse = await getJson(baseUrl, '/v1/proof-center/verification-services');
|
|
211
|
+
assert.strictEqual(verificationServicesResponse.status, 200, 'verification services route failed');
|
|
212
|
+
assert.strictEqual(verificationServicesResponse.json.category, 'xoonya-verification-services-pack', 'verification services category missing');
|
|
213
|
+
assert.strictEqual(verificationServicesResponse.json.service_count >= 6, true, 'verification services count missing');
|
|
214
|
+
|
|
215
|
+
const verificationServicesSummaryResponse = await getJson(baseUrl, '/v1/proof-center/verification-services/summary');
|
|
216
|
+
assert.strictEqual(verificationServicesSummaryResponse.status, 200, 'verification services summary route failed');
|
|
217
|
+
assert.strictEqual(verificationServicesSummaryResponse.json.category, 'xoonya-verification-services-summary', 'verification services summary category missing');
|
|
218
|
+
assert.strictEqual(verificationServicesSummaryResponse.json.service_count >= 6, true, 'verification services summary count missing');
|
|
219
|
+
|
|
194
220
|
const externalProofImportResponse = await getJson(baseUrl, '/v1/external-proof-import');
|
|
195
221
|
assert.strictEqual(externalProofImportResponse.status, 200, 'external proof import lane route failed');
|
|
196
222
|
assert.strictEqual(externalProofImportResponse.json.product, 'xoonya', 'external proof import lane product missing');
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const assert = require("assert");
|
|
4
|
+
const { createServer } = require("../server.js");
|
|
5
|
+
|
|
6
|
+
async function getJson(baseUrl, path) {
|
|
7
|
+
const response = await fetch(`${baseUrl}${path}`);
|
|
8
|
+
return {
|
|
9
|
+
status: response.status,
|
|
10
|
+
json: await response.json()
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
async function main() {
|
|
15
|
+
const server = createServer();
|
|
16
|
+
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
|
|
17
|
+
const address = server.address();
|
|
18
|
+
const baseUrl = `http://127.0.0.1:${address.port}`;
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
const pack = await getJson(baseUrl, "/v1/proof-center/trust-portability");
|
|
22
|
+
assert.strictEqual(pack.status, 200, "trust portability route failed");
|
|
23
|
+
assert.strictEqual(pack.json.category, "xoonya-trust-portability-pack", "trust portability category mismatch");
|
|
24
|
+
assert.strictEqual(pack.json.portability_profiles.length >= 4, true, "trust portability profile count mismatch");
|
|
25
|
+
assert.strictEqual(
|
|
26
|
+
pack.json.portability_profiles.some((entry) => entry.profile_id === "agent_identity_portability" && entry.callable_surfaces.includes("/v1/identity-interop")),
|
|
27
|
+
true,
|
|
28
|
+
"agent identity portability profile missing identity-interop surface"
|
|
29
|
+
);
|
|
30
|
+
assert.strictEqual(
|
|
31
|
+
pack.json.portability_profiles.some((entry) => entry.profile_id === "delivery_history_portability" && entry.supporting_surfaces.includes("/v1/result-package-trust/summary")),
|
|
32
|
+
true,
|
|
33
|
+
"delivery history portability profile missing result-package-trust support"
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
const summary = await getJson(baseUrl, "/v1/proof-center/trust-portability/summary");
|
|
37
|
+
assert.strictEqual(summary.status, 200, "trust portability summary route failed");
|
|
38
|
+
assert.strictEqual(summary.json.profile_count >= 4, true, "trust portability summary profile count mismatch");
|
|
39
|
+
assert.strictEqual(summary.json.bounded_live_profile_count >= 4, true, "trust portability bounded-live count mismatch");
|
|
40
|
+
assert.strictEqual(summary.json.callable_profile_count >= 4, true, "trust portability callable profile count mismatch");
|
|
41
|
+
|
|
42
|
+
const detail = await getJson(baseUrl, "/v1/proof-center/trust-portability/agent_identity_portability");
|
|
43
|
+
assert.strictEqual(detail.status, 200, "trust portability detail route failed");
|
|
44
|
+
assert.strictEqual(detail.json.profile.profile_id, "agent_identity_portability", "trust portability detail profile mismatch");
|
|
45
|
+
assert.strictEqual(detail.json.profile.claim_status, "bounded_live", "trust portability detail claim status mismatch");
|
|
46
|
+
} finally {
|
|
47
|
+
await new Promise((resolve) => server.close(resolve));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
console.log("xoonya verify:trust-portability passed");
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
main().catch((error) => {
|
|
54
|
+
console.error(error);
|
|
55
|
+
process.exit(1);
|
|
56
|
+
});
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const assert = require("assert");
|
|
4
|
+
const { createServer } = require("../server.js");
|
|
5
|
+
|
|
6
|
+
async function getJson(baseUrl, path) {
|
|
7
|
+
const response = await fetch(`${baseUrl}${path}`);
|
|
8
|
+
return {
|
|
9
|
+
status: response.status,
|
|
10
|
+
json: await response.json()
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
async function main() {
|
|
15
|
+
const server = createServer();
|
|
16
|
+
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
|
|
17
|
+
const address = server.address();
|
|
18
|
+
const baseUrl = `http://127.0.0.1:${address.port}`;
|
|
19
|
+
|
|
20
|
+
try {
|
|
21
|
+
const pack = await getJson(baseUrl, "/v1/proof-center/verification-services");
|
|
22
|
+
assert.strictEqual(pack.status, 200, "verification services route failed");
|
|
23
|
+
assert.strictEqual(pack.json.category, "xoonya-verification-services-pack", "verification services category mismatch");
|
|
24
|
+
assert.strictEqual(pack.json.service_count >= 6, true, "verification services count mismatch");
|
|
25
|
+
assert.strictEqual(
|
|
26
|
+
pack.json.verification_services.some((entry) => entry.service_id === "bundle_verify" && entry.callable_surfaces.includes("/v1/proof-bundles/verify")),
|
|
27
|
+
true,
|
|
28
|
+
"bundle verify service missing proof-bundles verify surface"
|
|
29
|
+
);
|
|
30
|
+
assert.strictEqual(
|
|
31
|
+
pack.json.verification_services.some((entry) => entry.service_id === "dispute_replay" && entry.callable_surfaces.includes("/v1/proof-center/governance/disputes/case-bundle")),
|
|
32
|
+
true,
|
|
33
|
+
"dispute replay service missing case bundle surface"
|
|
34
|
+
);
|
|
35
|
+
assert.strictEqual(
|
|
36
|
+
pack.json.verification_services.some((entry) => entry.service_id === "identity_link_verify" && entry.supporting_surfaces.includes("/v1/identity-interop/summary")),
|
|
37
|
+
true,
|
|
38
|
+
"identity-link verification service missing identity interop support"
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
const summary = await getJson(baseUrl, "/v1/proof-center/verification-services/summary");
|
|
42
|
+
assert.strictEqual(summary.status, 200, "verification services summary route failed");
|
|
43
|
+
assert.strictEqual(summary.json.service_count >= 6, true, "verification services summary count mismatch");
|
|
44
|
+
assert.strictEqual(summary.json.live_service_count >= 1, true, "verification services summary live count missing");
|
|
45
|
+
assert.strictEqual(summary.json.bounded_live_service_count >= 5, true, "verification services summary bounded-live count missing");
|
|
46
|
+
} finally {
|
|
47
|
+
await new Promise((resolve) => server.close(resolve));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
console.log("xoonya verify:verification-services passed");
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
main().catch((error) => {
|
|
54
|
+
console.error(error);
|
|
55
|
+
process.exit(1);
|
|
56
|
+
});
|
package/server.js
CHANGED
|
@@ -76,6 +76,15 @@ const {
|
|
|
76
76
|
buildBridgeIntelligencePack,
|
|
77
77
|
summarizeBridgeIntelligencePack
|
|
78
78
|
} = require('./lib/bridge_intelligence');
|
|
79
|
+
const {
|
|
80
|
+
buildVerificationServicesPack,
|
|
81
|
+
summarizeVerificationServicesPack
|
|
82
|
+
} = require('./lib/verification_service_pack');
|
|
83
|
+
const {
|
|
84
|
+
buildTrustPortabilityPack,
|
|
85
|
+
getTrustPortabilityProfile,
|
|
86
|
+
summarizeTrustPortabilityPack
|
|
87
|
+
} = require('./lib/trust_portability_pack');
|
|
79
88
|
const {
|
|
80
89
|
buildOpenApiDocument,
|
|
81
90
|
summarizeOpenApiDocument,
|
|
@@ -761,6 +770,32 @@ async function routeRequest(req, res) {
|
|
|
761
770
|
return;
|
|
762
771
|
}
|
|
763
772
|
|
|
773
|
+
if (req.method === 'GET' && url.pathname === '/v1/proof-center/trust-portability') {
|
|
774
|
+
sendJson(res, 200, buildTrustPortabilityPack());
|
|
775
|
+
return;
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
if (req.method === 'GET' && url.pathname === '/v1/proof-center/trust-portability/summary') {
|
|
779
|
+
sendJson(res, 200, summarizeTrustPortabilityPack());
|
|
780
|
+
return;
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
if (req.method === 'GET' && url.pathname.startsWith('/v1/proof-center/trust-portability/')) {
|
|
784
|
+
const profileId = url.pathname.slice('/v1/proof-center/trust-portability/'.length);
|
|
785
|
+
const profile = getTrustPortabilityProfile(profileId);
|
|
786
|
+
if (!profile) {
|
|
787
|
+
sendJson(res, 404, { ok: false, error: 'trust_portability_profile_not_found' });
|
|
788
|
+
return;
|
|
789
|
+
}
|
|
790
|
+
sendJson(res, 200, {
|
|
791
|
+
ok: true,
|
|
792
|
+
product: 'xoonya',
|
|
793
|
+
category: 'xoonya-trust-portability-detail',
|
|
794
|
+
profile
|
|
795
|
+
});
|
|
796
|
+
return;
|
|
797
|
+
}
|
|
798
|
+
|
|
764
799
|
if (req.method === 'GET' && url.pathname === '/v1/providers') {
|
|
765
800
|
sendJson(res, 200, buildProviderLanePack());
|
|
766
801
|
return;
|
|
@@ -2526,6 +2561,16 @@ async function routeRequest(req, res) {
|
|
|
2526
2561
|
return;
|
|
2527
2562
|
}
|
|
2528
2563
|
|
|
2564
|
+
if (req.method === 'GET' && url.pathname === '/v1/proof-center/verification-services') {
|
|
2565
|
+
sendJson(res, 200, buildVerificationServicesPack());
|
|
2566
|
+
return;
|
|
2567
|
+
}
|
|
2568
|
+
|
|
2569
|
+
if (req.method === 'GET' && url.pathname === '/v1/proof-center/verification-services/summary') {
|
|
2570
|
+
sendJson(res, 200, summarizeVerificationServicesPack());
|
|
2571
|
+
return;
|
|
2572
|
+
}
|
|
2573
|
+
|
|
2529
2574
|
if (req.method === 'GET' && url.pathname === '/v1/proof-center/bridge/profile-support') {
|
|
2530
2575
|
sendJson(res, 200, proofSdk.buildBridgeProfileSupport());
|
|
2531
2576
|
return;
|