xytara 2.0.0 → 2.2.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/.env.example +6 -0
- package/ADAPTER_START_HERE.md +56 -0
- package/BSV_TERANODE_SETUP.md +30 -1
- package/CARRIED_HANDOFF_DEMO.md +60 -0
- package/EXAMPLE_PATHS.md +53 -0
- package/FINAL_CONTRACT.md +6 -6
- package/OPERATIONS_RUNBOOK.md +65 -0
- package/OPERATOR_START_HERE.md +63 -0
- package/PARTNER_READY_PATH.md +71 -0
- package/PROGRAM_COMPLETE_RELEASE.md +63 -0
- package/PROGRAM_STATUS.md +57 -0
- package/PUBLIC_DEMO_SCRIPT.md +78 -0
- package/PUBLISH_PLAN.md +14 -0
- package/README.md +142 -6
- package/RELEASE_CHECKLIST.md +16 -0
- package/RELEASE_NOTES.md +28 -0
- package/SERVICE_CONTRACT.md +4 -4
- package/START_HERE.md +32 -0
- package/SUPABASE_RUNTIME_STATE_SETUP.md +61 -0
- package/WHY_XYTARA_XOONYA.md +63 -0
- package/adapters/examples/minimal-third-party-execution-adapter.js +61 -0
- package/adapters/examples/minimal-third-party-execution-adapter.manifest.json +79 -0
- package/adapters/examples/minimal-third-party-execution-registration.record.json +26 -0
- package/adapters/examples/minimal-third-party-execution.certification-pack.json +22 -0
- package/adapters/examples/minimal-third-party-execution.submission-bundle.json +126 -0
- package/bin/xytara-release.js +1419 -0
- package/bin/xytara-run.js +186 -0
- package/examples/adapter_review_walkthrough.js +53 -0
- package/examples/export_carried_handoff.js +80 -0
- package/examples/funded_runtime_walkthrough.js +70 -0
- package/examples/partner_launch_walkthrough.js +43 -0
- package/examples/quickstart.js +3255 -0
- package/index.js +87 -1
- package/lib/adapter_pack.js +118 -0
- package/lib/adapter_partner_pack.js +89 -0
- package/lib/adapter_promotion_pack.js +89 -0
- package/lib/announcement_pack.js +61 -0
- package/lib/commerce_artifacts.js +3 -0
- package/lib/commerce_economics.js +14 -0
- package/lib/commerce_reports.js +26 -1
- package/lib/commerce_shell.js +18 -2
- package/lib/ecosystem_entry.js +64 -0
- package/lib/launch_narrative.js +53 -0
- package/lib/outreach_copy_pack.js +51 -0
- package/lib/outreach_message_pack.js +71 -0
- package/lib/outreach_proof.js +71 -0
- package/lib/outreach_target_pack.js +60 -0
- package/lib/phase_10_closeout_pack.js +45 -0
- package/lib/phase_10_completion_pack.js +76 -0
- package/lib/phase_10_decision_record_pack.js +54 -0
- package/lib/phase_10_decision_resolution_pack.js +53 -0
- package/lib/phase_10_demand_signal_adapters_runtime_pack.js +74 -0
- package/lib/phase_10_ecosystem_backlog_triage_runtime_pack.js +74 -0
- package/lib/phase_10_freeze_baseline_pack.js +67 -0
- package/lib/phase_10_freeze_review_pack.js +64 -0
- package/lib/phase_10_gate_pack.js +57 -0
- package/lib/phase_10_long_tail_continuity_pack.js +80 -0
- package/lib/phase_10_long_tail_ecosystem_pack.js +66 -0
- package/lib/phase_10_niche_extension_registry_runtime_pack.js +74 -0
- package/lib/phase_1_claude_mcp_pack.js +60 -0
- package/lib/phase_1_claude_mcp_runtime_pack.js +52 -0
- package/lib/phase_1_ecosystem_pack.js +67 -0
- package/lib/phase_1_openai_codex_pack.js +60 -0
- package/lib/phase_1_openai_codex_runtime_pack.js +52 -0
- package/lib/phase_2_base_runtime_pack.js +71 -0
- package/lib/phase_2_base_usdc_runtime_pack.js +72 -0
- package/lib/phase_2_closeout_pack.js +65 -0
- package/lib/phase_2_completion_pack.js +113 -0
- package/lib/phase_2_decision_record_pack.js +66 -0
- package/lib/phase_2_decision_resolution_pack.js +69 -0
- package/lib/phase_2_eth_runtime_pack.js +70 -0
- package/lib/phase_2_evm_base_runtime_pack.js +73 -0
- package/lib/phase_2_evm_runtime_pack.js +71 -0
- package/lib/phase_2_flip_preview_pack.js +60 -0
- package/lib/phase_2_freeze_review_pack.js +99 -0
- package/lib/phase_2_gate_pack.js +77 -0
- package/lib/phase_2_payment_rails_pack.js +71 -0
- package/lib/phase_2_usdc_runtime_pack.js +71 -0
- package/lib/phase_3_brc_runtime_pack.js +81 -0
- package/lib/phase_3_bsv_teranode_runtime_pack.js +83 -0
- package/lib/phase_3_closeout_pack.js +62 -0
- package/lib/phase_3_completion_pack.js +94 -0
- package/lib/phase_3_decision_record_pack.js +64 -0
- package/lib/phase_3_decision_resolution_pack.js +69 -0
- package/lib/phase_3_freeze_baseline_pack.js +67 -0
- package/lib/phase_3_freeze_review_pack.js +80 -0
- package/lib/phase_3_gate_pack.js +76 -0
- package/lib/phase_3_metanet_runtime_pack.js +81 -0
- package/lib/phase_3_native_bsv_pack.js +91 -0
- package/lib/phase_3_native_continuity_pack.js +82 -0
- package/lib/phase_4_attestation_runtime_pack.js +75 -0
- package/lib/phase_4_closeout_pack.js +45 -0
- package/lib/phase_4_completion_pack.js +94 -0
- package/lib/phase_4_decision_record_pack.js +54 -0
- package/lib/phase_4_decision_resolution_pack.js +45 -0
- package/lib/phase_4_erc8004_runtime_pack.js +76 -0
- package/lib/phase_4_freeze_baseline_pack.js +67 -0
- package/lib/phase_4_freeze_review_pack.js +68 -0
- package/lib/phase_4_gate_pack.js +58 -0
- package/lib/phase_4_identity_registry_runtime_pack.js +75 -0
- package/lib/phase_4_identity_trust_pack.js +73 -0
- package/lib/phase_4_trust_continuity_pack.js +86 -0
- package/lib/phase_5_antelope_runtime_pack.js +76 -0
- package/lib/phase_5_closeout_pack.js +44 -0
- package/lib/phase_5_completion_pack.js +82 -0
- package/lib/phase_5_decision_record_pack.js +54 -0
- package/lib/phase_5_decision_resolution_pack.js +45 -0
- package/lib/phase_5_freeze_baseline_pack.js +67 -0
- package/lib/phase_5_freeze_review_pack.js +68 -0
- package/lib/phase_5_gate_pack.js +58 -0
- package/lib/phase_5_major_rails_continuity_pack.js +86 -0
- package/lib/phase_5_major_rails_pack.js +74 -0
- package/lib/phase_5_proton_xpr_runtime_pack.js +76 -0
- package/lib/phase_5_solana_runtime_pack.js +76 -0
- package/lib/phase_6_autogen_runtime_pack.js +72 -0
- package/lib/phase_6_closeout_pack.js +46 -0
- package/lib/phase_6_completion_pack.js +77 -0
- package/lib/phase_6_decision_record_pack.js +54 -0
- package/lib/phase_6_decision_resolution_pack.js +53 -0
- package/lib/phase_6_framework_continuity_pack.js +81 -0
- package/lib/phase_6_framework_runtime_pack.js +68 -0
- package/lib/phase_6_freeze_baseline_pack.js +68 -0
- package/lib/phase_6_freeze_review_pack.js +65 -0
- package/lib/phase_6_gate_pack.js +59 -0
- package/lib/phase_6_langchain_runtime_pack.js +72 -0
- package/lib/phase_6_langgraph_runtime_pack.js +72 -0
- package/lib/phase_6_semantic_kernel_runtime_pack.js +72 -0
- package/lib/phase_7_closeout_pack.js +45 -0
- package/lib/phase_7_completion_pack.js +85 -0
- package/lib/phase_7_decision_record_pack.js +53 -0
- package/lib/phase_7_decision_resolution_pack.js +53 -0
- package/lib/phase_7_event_system_continuity_pack.js +89 -0
- package/lib/phase_7_event_system_pack.js +76 -0
- package/lib/phase_7_freeze_baseline_pack.js +74 -0
- package/lib/phase_7_freeze_review_pack.js +65 -0
- package/lib/phase_7_gate_pack.js +58 -0
- package/lib/phase_7_kafka_runtime_pack.js +74 -0
- package/lib/phase_7_mqtt_runtime_pack.js +74 -0
- package/lib/phase_7_nats_runtime_pack.js +74 -0
- package/lib/phase_7_webhook_event_bus_runtime_pack.js +74 -0
- package/lib/phase_8_closeout_pack.js +46 -0
- package/lib/phase_8_completion_pack.js +82 -0
- package/lib/phase_8_decision_record_pack.js +54 -0
- package/lib/phase_8_decision_resolution_pack.js +53 -0
- package/lib/phase_8_external_receipt_import_runtime_pack.js +74 -0
- package/lib/phase_8_external_result_import_runtime_pack.js +74 -0
- package/lib/phase_8_freeze_baseline_pack.js +71 -0
- package/lib/phase_8_freeze_review_pack.js +64 -0
- package/lib/phase_8_gate_pack.js +58 -0
- package/lib/phase_8_proof_bridge_continuity_pack.js +86 -0
- package/lib/phase_8_proof_bridges_pack.js +72 -0
- package/lib/phase_8_proof_bundle_normalization_runtime_pack.js +74 -0
- package/lib/phase_9_closeout_pack.js +46 -0
- package/lib/phase_9_completion_pack.js +82 -0
- package/lib/phase_9_custody_refs_runtime_pack.js +74 -0
- package/lib/phase_9_decision_record_pack.js +54 -0
- package/lib/phase_9_decision_resolution_pack.js +53 -0
- package/lib/phase_9_freeze_baseline_pack.js +71 -0
- package/lib/phase_9_freeze_review_pack.js +64 -0
- package/lib/phase_9_gate_pack.js +58 -0
- package/lib/phase_9_operator_accounting_bridges_runtime_pack.js +74 -0
- package/lib/phase_9_treasury_connectivity_pack.js +72 -0
- package/lib/phase_9_treasury_continuity_pack.js +86 -0
- package/lib/phase_9_treasury_destinations_runtime_pack.js +74 -0
- package/lib/phase_program_pack.js +120 -0
- package/lib/publish_plan.js +51 -0
- package/lib/release_candidate.js +50 -0
- package/lib/release_center.js +1085 -0
- package/lib/release_history.js +72 -0
- package/lib/release_manifest.js +114 -0
- package/lib/release_pack.js +454 -0
- package/lib/runtime_state_store.js +354 -0
- package/lib/settlement_bsv_live.js +262 -13
- package/lib/soft_launch_pack.js +78 -0
- package/package.json +24 -2
- package/server.js +2562 -220
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const packageJson = require("../package.json");
|
|
4
|
+
|
|
5
|
+
function buildPhase10EcosystemBacklogTriageRuntimePack() {
|
|
6
|
+
return {
|
|
7
|
+
ok: true,
|
|
8
|
+
product: packageJson.name,
|
|
9
|
+
category: "machine-commerce-phase-10-ecosystem-backlog-triage-runtime-pack",
|
|
10
|
+
phase_ref: "phase_10",
|
|
11
|
+
posture: "runtime_path",
|
|
12
|
+
ecosystems: ["ecosystem_backlog_triage"],
|
|
13
|
+
runtime_shape: {
|
|
14
|
+
extension_modes: ["demand_signal_capture", "extension_registry_mapping", "backlog_triage"],
|
|
15
|
+
demand_modes: ["partner_signal_flow", "extension_fit_flow", "queue_handoff_flow"],
|
|
16
|
+
extension_artifacts: ["signal_ref", "registry_ref", "queue_ref"],
|
|
17
|
+
operator_surfaces: [
|
|
18
|
+
"/v1/release-center/summary",
|
|
19
|
+
"/v1/publish-plan/summary",
|
|
20
|
+
"/v1/phases/phase-10/summary"
|
|
21
|
+
]
|
|
22
|
+
},
|
|
23
|
+
first_path: {
|
|
24
|
+
purpose: "show the Phase 10 triage path that turns long-tail demand into explicit backlog handling and queue discipline",
|
|
25
|
+
first_http_sequence: [
|
|
26
|
+
"/v1/phases/phase-10/summary",
|
|
27
|
+
"/v1/phases/phase-10/ecosystem-backlog-triage/summary",
|
|
28
|
+
"/v1/release-center/summary"
|
|
29
|
+
],
|
|
30
|
+
first_cli_sequence: [
|
|
31
|
+
"xytara-release --phase-10-ecosystem-backlog-triage-runtime --summary",
|
|
32
|
+
"xytara-release --phase-10 --summary"
|
|
33
|
+
],
|
|
34
|
+
expected_signals: [
|
|
35
|
+
"ecosystem backlog triage is a public Phase 10 lane",
|
|
36
|
+
"queue artifacts are explicit at the lane level",
|
|
37
|
+
"triage posture is visible before Phase 10 closure discipline"
|
|
38
|
+
]
|
|
39
|
+
},
|
|
40
|
+
completion: {
|
|
41
|
+
completion_checks: [
|
|
42
|
+
"ecosystem backlog triage lane is public and inspectable",
|
|
43
|
+
"triage artifacts are visible at lane level",
|
|
44
|
+
"operator surfaces remain attached to the triage lane",
|
|
45
|
+
"the lane is ready to support broader long-tail ecosystem breadth"
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function summarizePhase10EcosystemBacklogTriageRuntimePack() {
|
|
52
|
+
const pack = buildPhase10EcosystemBacklogTriageRuntimePack();
|
|
53
|
+
return {
|
|
54
|
+
ok: true,
|
|
55
|
+
product: pack.product,
|
|
56
|
+
category: pack.category,
|
|
57
|
+
phase_ref: pack.phase_ref,
|
|
58
|
+
ecosystem_count: pack.ecosystems.length,
|
|
59
|
+
extension_mode_count: pack.runtime_shape.extension_modes.length,
|
|
60
|
+
demand_mode_count: pack.runtime_shape.demand_modes.length,
|
|
61
|
+
extension_artifact_count: pack.runtime_shape.extension_artifacts.length,
|
|
62
|
+
completion_check_count: pack.completion.completion_checks.length,
|
|
63
|
+
http_step_count: pack.first_path.first_http_sequence.length,
|
|
64
|
+
cli_step_count: pack.first_path.first_cli_sequence.length,
|
|
65
|
+
signal_count: pack.first_path.expected_signals.length,
|
|
66
|
+
operator_surface_count: pack.runtime_shape.operator_surfaces.length,
|
|
67
|
+
first_http_step: pack.first_path.first_http_sequence[0] || null
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
module.exports = {
|
|
72
|
+
buildPhase10EcosystemBacklogTriageRuntimePack,
|
|
73
|
+
summarizePhase10EcosystemBacklogTriageRuntimePack
|
|
74
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const packageJson = require("../package.json");
|
|
4
|
+
|
|
5
|
+
function buildPhase10FreezeBaselinePack() {
|
|
6
|
+
return {
|
|
7
|
+
ok: true,
|
|
8
|
+
product: packageJson.name,
|
|
9
|
+
category: "machine-commerce-phase-10-freeze-baseline-pack",
|
|
10
|
+
phase_ref: "phase_10",
|
|
11
|
+
posture: "frozen_baseline",
|
|
12
|
+
baseline: {
|
|
13
|
+
lane_refs: [
|
|
14
|
+
"/v1/phases/phase-10/demand-signal-adapters/summary",
|
|
15
|
+
"/v1/phases/phase-10/niche-extension-registry/summary",
|
|
16
|
+
"/v1/phases/phase-10/ecosystem-backlog-triage/summary"
|
|
17
|
+
],
|
|
18
|
+
extension_modes: ["demand_signal_capture", "extension_registry_mapping", "backlog_triage"],
|
|
19
|
+
demand_modes: ["partner_signal_flow", "extension_fit_flow", "queue_handoff_flow"],
|
|
20
|
+
baseline_status: "recorded",
|
|
21
|
+
frozen_outputs: [
|
|
22
|
+
"current long-tail lane family is the recorded Phase 10 baseline",
|
|
23
|
+
"Phase 10 can now be judged against a stable final shape rather than an open expansion set",
|
|
24
|
+
"only the final program closeout review remains before terminal closeout"
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
first_path: {
|
|
28
|
+
purpose: "show that the Phase 10 long-tail family is now treated as a frozen terminal baseline",
|
|
29
|
+
first_http_sequence: [
|
|
30
|
+
"/v1/phases/phase-10/summary",
|
|
31
|
+
"/v1/phases/phase-10/freeze-baseline/summary",
|
|
32
|
+
"/v1/phases/phase-10/gate/summary"
|
|
33
|
+
],
|
|
34
|
+
first_cli_sequence: [
|
|
35
|
+
"xytara-release --phase-10-freeze-baseline --summary",
|
|
36
|
+
"xytara-release --phase-10 --summary"
|
|
37
|
+
],
|
|
38
|
+
expected_signals: [
|
|
39
|
+
"the Phase 10 long-tail family is explicitly frozen",
|
|
40
|
+
"shape freeze is no longer part of the remaining Phase 10 uncertainty",
|
|
41
|
+
"the only remaining terminal work is the final program closeout review"
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function summarizePhase10FreezeBaselinePack() {
|
|
48
|
+
const pack = buildPhase10FreezeBaselinePack();
|
|
49
|
+
return {
|
|
50
|
+
ok: true,
|
|
51
|
+
product: pack.product,
|
|
52
|
+
category: pack.category,
|
|
53
|
+
phase_ref: pack.phase_ref,
|
|
54
|
+
lane_count: pack.baseline.lane_refs.length,
|
|
55
|
+
extension_mode_count: pack.baseline.extension_modes.length,
|
|
56
|
+
demand_mode_count: pack.baseline.demand_modes.length,
|
|
57
|
+
baseline_status: pack.baseline.baseline_status,
|
|
58
|
+
frozen_output_count: pack.baseline.frozen_outputs.length,
|
|
59
|
+
signal_count: pack.first_path.expected_signals.length,
|
|
60
|
+
first_http_step: pack.first_path.first_http_sequence[0] || null
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
module.exports = {
|
|
65
|
+
buildPhase10FreezeBaselinePack,
|
|
66
|
+
summarizePhase10FreezeBaselinePack
|
|
67
|
+
};
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const packageJson = require("../package.json");
|
|
4
|
+
|
|
5
|
+
function buildPhase10FreezeReviewPack() {
|
|
6
|
+
return {
|
|
7
|
+
ok: true,
|
|
8
|
+
product: packageJson.name,
|
|
9
|
+
category: "machine-commerce-phase-10-freeze-review-pack",
|
|
10
|
+
phase_ref: "phase_10",
|
|
11
|
+
posture: "freeze_review",
|
|
12
|
+
freeze_review: {
|
|
13
|
+
lane_refs: [
|
|
14
|
+
"/v1/phases/phase-10/demand-signal-adapters/summary",
|
|
15
|
+
"/v1/phases/phase-10/niche-extension-registry/summary",
|
|
16
|
+
"/v1/phases/phase-10/ecosystem-backlog-triage/summary"
|
|
17
|
+
],
|
|
18
|
+
extension_modes: ["demand_signal_capture", "extension_registry_mapping", "backlog_triage"],
|
|
19
|
+
review_questions: [
|
|
20
|
+
"Is the current long-tail lane family the intended final Phase 10 breadth?",
|
|
21
|
+
"Are demand capture, extension registry, and backlog triage coherent across the family?",
|
|
22
|
+
"Do operator surfaces expose enough review posture for the long-tail family?",
|
|
23
|
+
"Is the final program slice ready to freeze before program closeout?"
|
|
24
|
+
],
|
|
25
|
+
resolution_criteria: [
|
|
26
|
+
{ ref: "criterion.long_tail_breadth_confirmed", label: "The final long-tail lane breadth is confirmed", satisfied: true },
|
|
27
|
+
{ ref: "criterion.long_tail_roles_confirmed", label: "Demand, registry, and backlog roles are coherent across the family", satisfied: true },
|
|
28
|
+
{ ref: "criterion.freeze_decision_recorded", label: "The freeze decision is explicitly recorded", satisfied: true },
|
|
29
|
+
{ ref: "criterion.program_closeout_review_recorded", label: "The program closeout review is explicitly recorded", satisfied: true }
|
|
30
|
+
],
|
|
31
|
+
blockers: [],
|
|
32
|
+
outputs: [
|
|
33
|
+
"the final Phase 10 long-tail lane shape is frozen",
|
|
34
|
+
"the remaining terminal gate blockers are explicit and inspectable",
|
|
35
|
+
"Phase 10 can be closed deliberately rather than implicitly"
|
|
36
|
+
],
|
|
37
|
+
decision_posture: "terminal_closeout_recorded"
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function summarizePhase10FreezeReviewPack() {
|
|
43
|
+
const pack = buildPhase10FreezeReviewPack();
|
|
44
|
+
return {
|
|
45
|
+
ok: true,
|
|
46
|
+
product: pack.product,
|
|
47
|
+
category: pack.category,
|
|
48
|
+
phase_ref: pack.phase_ref,
|
|
49
|
+
lane_count: pack.freeze_review.lane_refs.length,
|
|
50
|
+
extension_mode_count: pack.freeze_review.extension_modes.length,
|
|
51
|
+
review_question_count: pack.freeze_review.review_questions.length,
|
|
52
|
+
resolution_criteria_count: pack.freeze_review.resolution_criteria.length,
|
|
53
|
+
satisfied_resolution_count: pack.freeze_review.resolution_criteria.filter((criterion) => criterion.satisfied === true).length,
|
|
54
|
+
unsatisfied_resolution_count: pack.freeze_review.resolution_criteria.filter((criterion) => criterion.satisfied !== true).length,
|
|
55
|
+
blocker_count: pack.freeze_review.blockers.length,
|
|
56
|
+
freeze_output_count: pack.freeze_review.outputs.length,
|
|
57
|
+
decision_posture: pack.freeze_review.decision_posture
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
module.exports = {
|
|
62
|
+
buildPhase10FreezeReviewPack,
|
|
63
|
+
summarizePhase10FreezeReviewPack
|
|
64
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const packageJson = require("../package.json");
|
|
4
|
+
const { summarizePhase10CompletionPack } = require("./phase_10_completion_pack");
|
|
5
|
+
const { summarizePhase10FreezeReviewPack } = require("./phase_10_freeze_review_pack");
|
|
6
|
+
|
|
7
|
+
function buildPhase10GatePack() {
|
|
8
|
+
const completion = summarizePhase10CompletionPack();
|
|
9
|
+
const freezeReview = summarizePhase10FreezeReviewPack();
|
|
10
|
+
const unsatisfiedGateCount =
|
|
11
|
+
completion.unsatisfied_criteria_count +
|
|
12
|
+
freezeReview.unsatisfied_resolution_count;
|
|
13
|
+
|
|
14
|
+
return {
|
|
15
|
+
ok: true,
|
|
16
|
+
product: packageJson.name,
|
|
17
|
+
category: "machine-commerce-phase-10-gate-pack",
|
|
18
|
+
phase_ref: "phase_10",
|
|
19
|
+
posture: "phase_gate",
|
|
20
|
+
gate: {
|
|
21
|
+
decision: unsatisfiedGateCount === 0 ? "ready_for_program_closeout" : "hold_phase_10",
|
|
22
|
+
ready_for_next_phase: false,
|
|
23
|
+
satisfied_gate_count:
|
|
24
|
+
completion.satisfied_criteria_count +
|
|
25
|
+
freezeReview.satisfied_resolution_count,
|
|
26
|
+
unsatisfied_gate_count: unsatisfiedGateCount,
|
|
27
|
+
blockers: unsatisfiedGateCount === 0 ? [] : [
|
|
28
|
+
"program closeout review has not been explicitly recorded"
|
|
29
|
+
],
|
|
30
|
+
advance_when: [
|
|
31
|
+
"program closeout review is explicitly recorded",
|
|
32
|
+
"completion and freeze-review surfaces both show no unsatisfied terminal gate criteria"
|
|
33
|
+
]
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function summarizePhase10GatePack() {
|
|
39
|
+
const pack = buildPhase10GatePack();
|
|
40
|
+
return {
|
|
41
|
+
ok: true,
|
|
42
|
+
product: pack.product,
|
|
43
|
+
category: pack.category,
|
|
44
|
+
phase_ref: pack.phase_ref,
|
|
45
|
+
satisfied_gate_count: pack.gate.satisfied_gate_count,
|
|
46
|
+
unsatisfied_gate_count: pack.gate.unsatisfied_gate_count,
|
|
47
|
+
blocker_count: pack.gate.blockers.length,
|
|
48
|
+
advance_when_count: pack.gate.advance_when.length,
|
|
49
|
+
decision: pack.gate.decision,
|
|
50
|
+
ready_for_next_phase: pack.gate.ready_for_next_phase
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
module.exports = {
|
|
55
|
+
buildPhase10GatePack,
|
|
56
|
+
summarizePhase10GatePack
|
|
57
|
+
};
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const packageJson = require("../package.json");
|
|
4
|
+
|
|
5
|
+
function buildPhase10LongTailContinuityPack() {
|
|
6
|
+
return {
|
|
7
|
+
ok: true,
|
|
8
|
+
product: packageJson.name,
|
|
9
|
+
category: "machine-commerce-phase-10-long-tail-continuity-pack",
|
|
10
|
+
phase_ref: "phase_10",
|
|
11
|
+
posture: "continuity_review",
|
|
12
|
+
continuity: {
|
|
13
|
+
lane_refs: [
|
|
14
|
+
"/v1/phases/phase-10/demand-signal-adapters/summary",
|
|
15
|
+
"/v1/phases/phase-10/niche-extension-registry/summary",
|
|
16
|
+
"/v1/phases/phase-10/ecosystem-backlog-triage/summary"
|
|
17
|
+
],
|
|
18
|
+
continuity_refs: ["/v1/phases/phase-10/summary"],
|
|
19
|
+
extension_modes: ["demand_signal_capture", "extension_registry_mapping", "backlog_triage"],
|
|
20
|
+
demand_modes: ["partner_signal_flow", "extension_fit_flow", "queue_handoff_flow"],
|
|
21
|
+
continuity_surfaces: [
|
|
22
|
+
"/v1/release-center/summary",
|
|
23
|
+
"/v1/publish-plan/summary",
|
|
24
|
+
"/v1/phases/phase-10/summary"
|
|
25
|
+
]
|
|
26
|
+
},
|
|
27
|
+
completion_shape: {
|
|
28
|
+
completion_checks: [
|
|
29
|
+
"all current long-tail lanes are public and inspectable",
|
|
30
|
+
"extension backlog posture is visible at phase level",
|
|
31
|
+
"cross-lane continuity is explicit across demand capture, registry mapping, and backlog triage",
|
|
32
|
+
"release-center summary reflects the long-tail family as one coherent final-program slice"
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
first_path: {
|
|
36
|
+
purpose: "show that the final-phase long-tail family reads as one coherent extension program rather than isolated lane summaries",
|
|
37
|
+
first_http_sequence: [
|
|
38
|
+
"/v1/phases/phase-10/summary",
|
|
39
|
+
"/v1/phases/phase-10/long-tail-continuity/summary",
|
|
40
|
+
"/v1/release-center/summary",
|
|
41
|
+
"/v1/publish-plan/summary"
|
|
42
|
+
],
|
|
43
|
+
first_cli_sequence: [
|
|
44
|
+
"xytara-release --phase-10-long-tail-continuity --summary",
|
|
45
|
+
"xytara-release --phase-10 --summary"
|
|
46
|
+
],
|
|
47
|
+
expected_signals: [
|
|
48
|
+
"demand signal adapters, niche extension registry, and ecosystem backlog triage are linked as one long-tail family",
|
|
49
|
+
"demand capture and backlog handling stay legible without collapsing into one lane",
|
|
50
|
+
"operator surfaces remain attached to the Phase 10 family",
|
|
51
|
+
"Phase 10 reads as one coherent terminal-program slice"
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function summarizePhase10LongTailContinuityPack() {
|
|
58
|
+
const pack = buildPhase10LongTailContinuityPack();
|
|
59
|
+
return {
|
|
60
|
+
ok: true,
|
|
61
|
+
product: pack.product,
|
|
62
|
+
category: pack.category,
|
|
63
|
+
phase_ref: pack.phase_ref,
|
|
64
|
+
lane_count: pack.continuity.lane_refs.length,
|
|
65
|
+
continuity_ref_count: pack.continuity.continuity_refs.length,
|
|
66
|
+
extension_mode_count: pack.continuity.extension_modes.length,
|
|
67
|
+
demand_mode_count: pack.continuity.demand_modes.length,
|
|
68
|
+
continuity_surface_count: pack.continuity.continuity_surfaces.length,
|
|
69
|
+
completion_check_count: pack.completion_shape.completion_checks.length,
|
|
70
|
+
http_step_count: pack.first_path.first_http_sequence.length,
|
|
71
|
+
cli_step_count: pack.first_path.first_cli_sequence.length,
|
|
72
|
+
signal_count: pack.first_path.expected_signals.length,
|
|
73
|
+
first_http_step: pack.first_path.first_http_sequence[0] || null
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
module.exports = {
|
|
78
|
+
buildPhase10LongTailContinuityPack,
|
|
79
|
+
summarizePhase10LongTailContinuityPack
|
|
80
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const packageJson = require("../package.json");
|
|
4
|
+
|
|
5
|
+
function buildPhase10LongTailEcosystemPack() {
|
|
6
|
+
return {
|
|
7
|
+
ok: true,
|
|
8
|
+
product: packageJson.name,
|
|
9
|
+
category: "machine-commerce-phase-10-long-tail-ecosystem-pack",
|
|
10
|
+
phase_ref: "phase_10",
|
|
11
|
+
status: "active",
|
|
12
|
+
ecosystems: ["demand_signal_adapters", "niche_extension_registry", "ecosystem_backlog_triage"],
|
|
13
|
+
lane_refs: [
|
|
14
|
+
"/v1/phases/phase-10/demand-signal-adapters/summary",
|
|
15
|
+
"/v1/phases/phase-10/niche-extension-registry/summary",
|
|
16
|
+
"/v1/phases/phase-10/ecosystem-backlog-triage/summary"
|
|
17
|
+
],
|
|
18
|
+
extension_shape: {
|
|
19
|
+
extension_modes: ["demand_signal_capture", "extension_registry_mapping", "backlog_triage"],
|
|
20
|
+
operator_surfaces: [
|
|
21
|
+
"/v1/release-center/summary",
|
|
22
|
+
"/v1/publish-plan/summary",
|
|
23
|
+
"/v1/phases/phase-10/demand-signal-adapters/summary",
|
|
24
|
+
"/v1/phases/phase-10/niche-extension-registry/summary",
|
|
25
|
+
"/v1/phases/phase-10/ecosystem-backlog-triage/summary"
|
|
26
|
+
]
|
|
27
|
+
},
|
|
28
|
+
completion_shape: {
|
|
29
|
+
completion_checks: [
|
|
30
|
+
"broad Phase 10 long-tail ecosystem pack is public and inspectable",
|
|
31
|
+
"all current Phase 10 long-tail lanes are public and inspectable",
|
|
32
|
+
"extension posture is visible at phase level",
|
|
33
|
+
"operator surfaces stay attached to the current Phase 10 family",
|
|
34
|
+
"release-center summary reflects Phase 10 activation and first-lane breadth"
|
|
35
|
+
]
|
|
36
|
+
},
|
|
37
|
+
done_means: [
|
|
38
|
+
"Phase 9 is no longer the active program slice",
|
|
39
|
+
"Phase 10 has a public demand-driven extension entry path",
|
|
40
|
+
"multiple long-tail entry lanes are visible as explicit operational lanes",
|
|
41
|
+
"the long-tail family feels governed rather than open-ended"
|
|
42
|
+
]
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function summarizePhase10LongTailEcosystemPack() {
|
|
47
|
+
const pack = buildPhase10LongTailEcosystemPack();
|
|
48
|
+
return {
|
|
49
|
+
ok: true,
|
|
50
|
+
product: pack.product,
|
|
51
|
+
category: pack.category,
|
|
52
|
+
phase_ref: pack.phase_ref,
|
|
53
|
+
ecosystem_count: pack.ecosystems.length,
|
|
54
|
+
lane_count: pack.lane_refs.length,
|
|
55
|
+
extension_mode_count: pack.extension_shape.extension_modes.length,
|
|
56
|
+
operator_surface_count: pack.extension_shape.operator_surfaces.length,
|
|
57
|
+
completion_check_count: pack.completion_shape.completion_checks.length,
|
|
58
|
+
done_mean_count: pack.done_means.length,
|
|
59
|
+
first_ecosystem: pack.ecosystems[0] || null
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
module.exports = {
|
|
64
|
+
buildPhase10LongTailEcosystemPack,
|
|
65
|
+
summarizePhase10LongTailEcosystemPack
|
|
66
|
+
};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const packageJson = require("../package.json");
|
|
4
|
+
|
|
5
|
+
function buildPhase10NicheExtensionRegistryRuntimePack() {
|
|
6
|
+
return {
|
|
7
|
+
ok: true,
|
|
8
|
+
product: packageJson.name,
|
|
9
|
+
category: "machine-commerce-phase-10-niche-extension-registry-runtime-pack",
|
|
10
|
+
phase_ref: "phase_10",
|
|
11
|
+
posture: "runtime_path",
|
|
12
|
+
ecosystems: ["niche_extension_registry"],
|
|
13
|
+
runtime_shape: {
|
|
14
|
+
extension_modes: ["demand_signal_capture", "extension_registry_mapping", "backlog_triage"],
|
|
15
|
+
demand_modes: ["partner_signal_flow", "extension_fit_flow", "queue_handoff_flow"],
|
|
16
|
+
extension_artifacts: ["registry_ref", "fit_ref", "triage_ref"],
|
|
17
|
+
operator_surfaces: [
|
|
18
|
+
"/v1/release-center/summary",
|
|
19
|
+
"/v1/publish-plan/summary",
|
|
20
|
+
"/v1/phases/phase-10/summary"
|
|
21
|
+
]
|
|
22
|
+
},
|
|
23
|
+
first_path: {
|
|
24
|
+
purpose: "show the Phase 10 registry path that turns candidate long-tail demand into governed extension registration",
|
|
25
|
+
first_http_sequence: [
|
|
26
|
+
"/v1/phases/phase-10/summary",
|
|
27
|
+
"/v1/phases/phase-10/niche-extension-registry/summary",
|
|
28
|
+
"/v1/release-center/summary"
|
|
29
|
+
],
|
|
30
|
+
first_cli_sequence: [
|
|
31
|
+
"xytara-release --phase-10-niche-extension-registry-runtime --summary",
|
|
32
|
+
"xytara-release --phase-10 --summary"
|
|
33
|
+
],
|
|
34
|
+
expected_signals: [
|
|
35
|
+
"niche extension registry is a public Phase 10 lane",
|
|
36
|
+
"registry artifacts are explicit at the lane level",
|
|
37
|
+
"registry posture is visible before Phase 10 closure discipline"
|
|
38
|
+
]
|
|
39
|
+
},
|
|
40
|
+
completion: {
|
|
41
|
+
completion_checks: [
|
|
42
|
+
"niche extension registry lane is public and inspectable",
|
|
43
|
+
"registry artifacts are visible at lane level",
|
|
44
|
+
"operator surfaces remain attached to the registry lane",
|
|
45
|
+
"the lane is ready to support broader long-tail ecosystem breadth"
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function summarizePhase10NicheExtensionRegistryRuntimePack() {
|
|
52
|
+
const pack = buildPhase10NicheExtensionRegistryRuntimePack();
|
|
53
|
+
return {
|
|
54
|
+
ok: true,
|
|
55
|
+
product: pack.product,
|
|
56
|
+
category: pack.category,
|
|
57
|
+
phase_ref: pack.phase_ref,
|
|
58
|
+
ecosystem_count: pack.ecosystems.length,
|
|
59
|
+
extension_mode_count: pack.runtime_shape.extension_modes.length,
|
|
60
|
+
demand_mode_count: pack.runtime_shape.demand_modes.length,
|
|
61
|
+
extension_artifact_count: pack.runtime_shape.extension_artifacts.length,
|
|
62
|
+
completion_check_count: pack.completion.completion_checks.length,
|
|
63
|
+
http_step_count: pack.first_path.first_http_sequence.length,
|
|
64
|
+
cli_step_count: pack.first_path.first_cli_sequence.length,
|
|
65
|
+
signal_count: pack.first_path.expected_signals.length,
|
|
66
|
+
operator_surface_count: pack.runtime_shape.operator_surfaces.length,
|
|
67
|
+
first_http_step: pack.first_path.first_http_sequence[0] || null
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
module.exports = {
|
|
72
|
+
buildPhase10NicheExtensionRegistryRuntimePack,
|
|
73
|
+
summarizePhase10NicheExtensionRegistryRuntimePack
|
|
74
|
+
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const packageJson = require("../package.json");
|
|
4
|
+
|
|
5
|
+
function buildPhase1ClaudeMcpPack() {
|
|
6
|
+
return {
|
|
7
|
+
ok: true,
|
|
8
|
+
product: packageJson.name,
|
|
9
|
+
category: "machine-commerce-phase-1-claude-mcp-pack",
|
|
10
|
+
phase_ref: "phase_1",
|
|
11
|
+
ecosystem_ref: "claude_anthropic_mcp",
|
|
12
|
+
status: "active",
|
|
13
|
+
adoption_wedge: "adapter-first paid tool execution for MCP-style capability providers",
|
|
14
|
+
main_repo_weight: "xytara_heavy",
|
|
15
|
+
scope: {
|
|
16
|
+
adapter_posture: [
|
|
17
|
+
"MCP-friendly capability exposure",
|
|
18
|
+
"third-party adapter onboarding",
|
|
19
|
+
"promotion and trust progression",
|
|
20
|
+
"partner-facing integration path"
|
|
21
|
+
],
|
|
22
|
+
first_surfaces: [
|
|
23
|
+
"/v1/adapter-pack/summary",
|
|
24
|
+
"/v1/adapter-promotion/summary",
|
|
25
|
+
"/v1/adapter-partners/summary",
|
|
26
|
+
"/v1/release-center/summary"
|
|
27
|
+
],
|
|
28
|
+
first_commands: [
|
|
29
|
+
"xytara-release --adapter-partners --summary",
|
|
30
|
+
"xytara-release --adapter-promotion --summary",
|
|
31
|
+
"xytara-release --phase-1-claude-mcp --summary"
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
done_means: [
|
|
35
|
+
"outside adapter authors can see how to enter xytara without reading scattered internal docs",
|
|
36
|
+
"the MCP-facing trust path is visible from starter to promotion and partner posture",
|
|
37
|
+
"Phase 1 adapter posture is explicit in public product surfaces"
|
|
38
|
+
]
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function summarizePhase1ClaudeMcpPack() {
|
|
43
|
+
const pack = buildPhase1ClaudeMcpPack();
|
|
44
|
+
return {
|
|
45
|
+
ok: true,
|
|
46
|
+
product: pack.product,
|
|
47
|
+
category: pack.category,
|
|
48
|
+
phase_ref: pack.phase_ref,
|
|
49
|
+
ecosystem_ref: pack.ecosystem_ref,
|
|
50
|
+
surface_count: pack.scope.first_surfaces.length,
|
|
51
|
+
command_count: pack.scope.first_commands.length,
|
|
52
|
+
done_mean_count: pack.done_means.length,
|
|
53
|
+
first_surface: pack.scope.first_surfaces[0] || null
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
module.exports = {
|
|
58
|
+
buildPhase1ClaudeMcpPack,
|
|
59
|
+
summarizePhase1ClaudeMcpPack
|
|
60
|
+
};
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const packageJson = require("../package.json");
|
|
4
|
+
|
|
5
|
+
function buildPhase1ClaudeMcpRuntimePack() {
|
|
6
|
+
return {
|
|
7
|
+
ok: true,
|
|
8
|
+
product: packageJson.name,
|
|
9
|
+
category: "machine-commerce-phase-1-claude-mcp-runtime-pack",
|
|
10
|
+
phase_ref: "phase_1",
|
|
11
|
+
ecosystem_ref: "claude_anthropic_mcp",
|
|
12
|
+
posture: "runtime_path",
|
|
13
|
+
first_path: {
|
|
14
|
+
purpose: "run an MCP-style paid tool invocation through xytara with adapter and promotion-aware posture",
|
|
15
|
+
first_http_sequence: [
|
|
16
|
+
"/v1/adapter-pack/summary",
|
|
17
|
+
"/v1/adapter-promotion/summary",
|
|
18
|
+
"/v1/mcp/tools/invoke"
|
|
19
|
+
],
|
|
20
|
+
first_cli_sequence: [
|
|
21
|
+
"xytara-release --phase-1-claude-mcp-runtime --summary",
|
|
22
|
+
"xytara-release --adapter-partners --summary"
|
|
23
|
+
],
|
|
24
|
+
expected_signals: [
|
|
25
|
+
"MCP-oriented invocation path is visible from adapter surfaces into runtime execution",
|
|
26
|
+
"promotion and partner posture are linked to the runtime lane instead of sitting beside it",
|
|
27
|
+
"paid tool execution can be framed as an adapter-ready machine-commerce path"
|
|
28
|
+
],
|
|
29
|
+
followthrough_ref: "https://xoonya.onrender.com/v1/phases/phase-1/claude-mcp/proof/summary"
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
function summarizePhase1ClaudeMcpRuntimePack() {
|
|
35
|
+
const pack = buildPhase1ClaudeMcpRuntimePack();
|
|
36
|
+
return {
|
|
37
|
+
ok: true,
|
|
38
|
+
product: pack.product,
|
|
39
|
+
category: pack.category,
|
|
40
|
+
phase_ref: pack.phase_ref,
|
|
41
|
+
ecosystem_ref: pack.ecosystem_ref,
|
|
42
|
+
http_step_count: pack.first_path.first_http_sequence.length,
|
|
43
|
+
cli_step_count: pack.first_path.first_cli_sequence.length,
|
|
44
|
+
signal_count: pack.first_path.expected_signals.length,
|
|
45
|
+
first_http_step: pack.first_path.first_http_sequence[0] || null
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
module.exports = {
|
|
50
|
+
buildPhase1ClaudeMcpRuntimePack,
|
|
51
|
+
summarizePhase1ClaudeMcpRuntimePack
|
|
52
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const packageJson = require("../package.json");
|
|
4
|
+
|
|
5
|
+
function buildPhase1EcosystemPack() {
|
|
6
|
+
return {
|
|
7
|
+
ok: true,
|
|
8
|
+
product: packageJson.name,
|
|
9
|
+
category: "machine-commerce-phase-1-ecosystem-pack",
|
|
10
|
+
phase_ref: "phase_1",
|
|
11
|
+
ecosystems: [
|
|
12
|
+
{
|
|
13
|
+
ecosystem_ref: "openai_codex",
|
|
14
|
+
status: "active",
|
|
15
|
+
main_repo_weight: "xytara_heavy",
|
|
16
|
+
goal: "direct agent and tool invocation posture for paid capability execution and reusable credits",
|
|
17
|
+
first_artifacts: [
|
|
18
|
+
"/v1/release-center/summary",
|
|
19
|
+
"/v1/release-pack/scenarios/summary"
|
|
20
|
+
],
|
|
21
|
+
first_cli: [
|
|
22
|
+
"xytara-release --center --summary",
|
|
23
|
+
"xytara-run --url https://xytara.onrender.com --account acct_demo --command \"cli-run\" --task trust.verify --body-json '{\"subject_id\":\"subject-1\"}' --wallet-id merchant_wallet_main --wallet-secret YOUR_LOCAL_SIGNED_SECRET --txid YOUR_BSV_TXID"
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
ecosystem_ref: "claude_anthropic_mcp",
|
|
28
|
+
status: "active",
|
|
29
|
+
main_repo_weight: "xytara_heavy",
|
|
30
|
+
goal: "tool and adapter posture for MCP-style capability providers with explicit promotion and review",
|
|
31
|
+
first_artifacts: [
|
|
32
|
+
"/v1/adapter-pack/summary",
|
|
33
|
+
"/v1/adapter-promotion/summary",
|
|
34
|
+
"/v1/adapter-partners/summary"
|
|
35
|
+
],
|
|
36
|
+
first_cli: [
|
|
37
|
+
"xytara-release --adapter-partners --summary",
|
|
38
|
+
"xytara-release --adapter-promotion --summary"
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
done_means: [
|
|
43
|
+
"outside builders can see a direct first path for OpenAI/Codex-style runtime use",
|
|
44
|
+
"outside builders can see a direct first path for Claude/MCP-style adapter use",
|
|
45
|
+
"the phase is encoded into release-facing surfaces instead of living only in planning notes"
|
|
46
|
+
]
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function summarizePhase1EcosystemPack() {
|
|
51
|
+
const pack = buildPhase1EcosystemPack();
|
|
52
|
+
return {
|
|
53
|
+
ok: true,
|
|
54
|
+
product: pack.product,
|
|
55
|
+
category: pack.category,
|
|
56
|
+
phase_ref: pack.phase_ref,
|
|
57
|
+
ecosystem_count: pack.ecosystems.length,
|
|
58
|
+
active_count: pack.ecosystems.filter((entry) => entry.status === "active").length,
|
|
59
|
+
done_mean_count: pack.done_means.length,
|
|
60
|
+
first_ecosystem: pack.ecosystems[0] ? pack.ecosystems[0].ecosystem_ref : null
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
module.exports = {
|
|
65
|
+
buildPhase1EcosystemPack,
|
|
66
|
+
summarizePhase1EcosystemPack
|
|
67
|
+
};
|