Skip to content

SWAO_APM framework reference ​

SWAO_APM (SWAO Application Portfolio Management, version 2026.10, status approved) is the community framework behind Service Portfolio Assessment. It scores every application across eleven domains, combines the domain scores into a risk score, and derives a TIME recommendation. It is a SWAO synthesis of the Gartner TIME model, ISO/IEC 25010:2023, TOGAF 10, ENISA good practice, and EU sovereign cloud criteria; no third-party control text is reproduced. The general framework page is SWAO_APM.

The eleven domains and their weights ​

DomainNameDefault weightWhat it asks
APM-TCHTechnical health20Is the platform in support, patched, free of critical and known-exploited vulnerabilities?
APM-SECSecurity posture18Weak cryptography, cleartext endpoints, hard-coded secrets, expired signing certificates, national advisories, malware verdicts
APM-VNDVendor health12Is the vendor known, supporting the product, under contract, reachable?
APM-DATData governance10Are classification, residency, sub-processors, and sensitive data declared?
APM-REGCompliance obligations8Regulatory load, GDPR Art. 9, MDR classification, audit recency
APM-SOVSovereignty readiness8Sovereign rating, sovereign alternative available, data stored in the EU
APM-MIGMigration readiness6Migration candidate, portable operating system, cloud-ready delivery model
APM-INTIntegration complexity6How many integrations, and are they documented?
APM-HWHardware and cost4Is the hardware profile known, right-sized, and costed?
APM-BIZBusiness criticality4Criticality, user base, operational status, owning department
APM-STRStrategic fit4Analyst disposition and declared migration intent

The weights sum to 100. They keep the ordering of Design 103 guardrail G-07 (technical health, security, vendor, data, regulatory first).

How scores are calculated ​

  1. Control score (0 to 100, health scale). 47 of the 72 controls are bound to a scoring rule through evidence_basis: [{ apm_export: <rule> }]. A rule reads evidence the service flow already produced and returns 100 (healthy) to 0 (high concern). Example: os_eol_horizon returns 0 when end of life has passed, 20 under 12 months, 40 under 18, 70 under 36, otherwise 100.
  2. Unknown is not failure. When the evidence is missing (for example no research yet), the rule returns no value. The control is reported as unknown and left out of its domain score; it is never counted as pass or fail. Two rules are deliberately strict: bsi_advisories scores only a completed BSI CERT-Bund feed match (an advisory count), and integration_count reads an empty integration list as "no integrations" only when the intake had an integration column (listed in intake.fields of the app); otherwise both controls stay unknown.
  3. Domain score. The weighted mean of the domain's known control scores (control weight from an optional apm-weight.N tag, default 1). A domain with no known control has no score.
  4. Health score. The weighted mean of the available domain scores, using domain_weights.
  5. Risk score. 100 - health score, so 100 is the highest risk. The portfolio risk score is the mean over all apps that have a score and whose TIME label rests on sufficient evidence (see Evidence behind the TIME label).

The remaining 25 controls describe evidence an analyst provides (for example certifications, penetration tests, data processing agreements). They are part of the framework for completeness and appear in compliance results, but do not affect the automated score.

Where the evidence comes from (signal sources) ​

DomainEvidence used by the rules
APM-TCHPass 24 RESEARCH: endoflife.date, NVD CVE counts and patch status, CISA KEV; intake OS; Pass 25 BINARY runtime age
APM-SECPass 08 CRYPTO findings on binaries and configuration (weak algorithms, cleartext endpoints, hard-coded secrets, expired certificates); BSI CERT-Bund advisories and VirusTotal from Pass 24
APM-VNDIntake vendor fields: name, version, support status, contract expiry, support contact presence flag
APM-DATIntake data fields; Pass 03 DATA run in service mode
APM-SOVINFRA-CAT classification (sovereign rating and alternatives); data residency
APM-BIZIntake business fields and operational status
APM-HWIntake hardware; cloud cost estimate
APM-INTIntake integrations and integration notes
APM-MIGIntake disposition; OS portability; delivery model (vendor_type)
APM-REGIntake regulatory obligations, GDPR Art. 9, MDR class, last audit date
APM-STRIntake analyst TIME and migration candidate flag

TIME classification ​

The TIME recommendation is derived in two layers. The first rule that applies wins.

  1. Overrides
    • Operational status decommissioned, unused, or inactive: Eliminate. (restricted, keep but do not start, is deliberately excluded.)
    • CISA KEV match: Migrate-Critical.
    • At least one critical CVE and end of life within 12 months: Migrate-Critical.
    • End of life passed without extended support: Migrate-Critical.
  2. Thresholds
    • End of life within 0 to 36 months: Migrate. End of life passed but extended support available: Migrate.
    • Vendor health or technical health below 40 and migration readiness above 60: Migrate.
    • Strategic fit, technical health, and vendor health all above 70: Invest.
    • Strategic fit below 30 and business criticality below 30: Eliminate.
    • Otherwise: Tolerate (in support, no overriding risk).

Every app receives a reason in plain language (for example "CISA KEV known-exploited vulnerability match"). The analyst's own TIME judgement from the intake (disposition.gartner_time) is kept alongside and never overwritten, so differences are visible.

Evidence behind the TIME label ​

A TIME label rests on evidence when SWAO knows the end-of-life status or the CVE status of the app. The end-of-life status is known when Pass 24 RESEARCH found the end-of-life state or horizon (is_eol or months_until_eol in eol-status.md). The CVE status is known when the NVD query answered (no error, skip reason, or note in the cve block of cve-summary.md), which needs a vendor name. When neither is known and the operational status does not decide the label (decommissioned, unused, inactive), SWAO still shows the derived quadrant, but:

  • the reason starts with insufficient evidence (end of life and cve status unknown);, followed by the reason of the rule that applied;
  • the app is left out of the portfolio risk score;
  • the engagement hub card shows the badge Evidence: insufficient.

wsp/portfolio-summary.json records per app:

KeyMeaning
assessedtrue when the app has a service assessment run (apps/<id>/wsp/latest-service.txt); otherwise the hub card shows Not assessed
evidencesufficient or insufficient
evidence_missingWhich of end_of_life and cve are unknown

At summary level, assessed_count counts the apps with a service run and insufficient_evidence_count the apps whose label rests on insufficient evidence.

Application apps in the combined view ​

In a workspace that holds application and service apps, wsp/portfolio-summary.json also lists the application apps (assessment_type: application, see Portfolio Operations). The service rules above are not applied to them, because they read intake fields and research stubs an application app does not have. Instead, six rules read the latest usable application run (apps/<id>/wsp/latest-application.txt), each returning unknown when its evidence is absent:

ControlDomainRuleEvidence
APP-TCH-01APM-TCHRuntime end of life: active LTS 100, maintenance LTS 70, past end of life 0Pass 01 / 05 node_eol_status
APP-TCH-02APM-TCHDependency CVEs: 0 vulnerable packages 100, 1 package 40, more 10Pass 05 critical_cves_found (packages with high or critical CVEs; only when the lookup completed)
APP-SEC-01APM-SECFindings: any negative critical 10; no negative high 100; 1 to 2 high 60; more 30Negative signals of all pass files
APP-REG-01APM-REGCompliance: mean of PASS 100, PARTIAL 50, GAP 0wsp-plan.yaml compliance regimes
APP-MIG-01APM-MIGPortability: portability_score x 100wsp.yaml overall
APP-MIG-02APM-MIGLanding zone fit: READY 100, READY_WITH_CHANGES 70, NEEDS_VERIFICATION 50, BLOCKED 0wsp/latest-lz-primary.yaml

Domain scores, health and risk are aggregated with the same domain weights as service apps. The TIME quadrant follows the 7R verdict:

7R verdictTIME
RetireEliminate
RetainTolerate
Rehost, Relocate, Replatform, RepurchaseMigrate
Refactor (Re-architect, Rebuild)Invest

Overrides, applied first: operational status decommissioned, unused or inactive in the app .swao.yml gives Eliminate; a runtime past end of life together with packages with high or critical CVEs gives Migrate-Critical (unless the verdict is Retire). The evidence label is not_assessed without a usable application run, insufficient when the 7R verdict is missing or neither the runtime end of life nor the dependency CVE status is known, and sufficient otherwise. No apm-score.json is written into application runs.

Customising weights and rules ​

Copy the whole bundled framework folder (framework-meta.yaml and controls.yaml) into the workspace and edit the copy. SWAO prefers the workspace copy and reads both files from it. Copy the source from GitHub at community-frameworks/swao-apm. Place the copy at:

text
wsp/inputs/catalogs/community/swao-apm/framework-meta.yaml
wsp/inputs/catalogs/community/swao-apm/controls.yaml

Excerpt of an edited framework-meta.yaml (keep all other keys as they are):

yaml
framework:
  domain_weights:
    APM-TCH: 25
    APM-SEC: 20
    APM-VND: 10
    APM-DAT: 10
    APM-REG: 10
    APM-SOV: 8
    APM-MIG: 5
    APM-INT: 4
    APM-HW: 3
    APM-BIZ: 3
    APM-STR: 2
  time_rules:
    migrate:
      eol_months_min: 0
      eol_months_max: 24     # tighter Migrate window for this engagement

swao health-check validates the copy:

  • Probe 18 (SWAO_APM weights): all eleven domains present and the integers sum to exactly 100. A wrong sum is an error; a missing domain_weights key is a warning (equal weights are then assumed).
  • Probe 25 (SWAO_APM controls): all eleven domains have controls, at least 4 per domain, every control has an ID, a title, and an evidence basis, and IDs are unique.

Controls by domain ​

APM-STR: Strategic fit ​

ControlTitleScored by rule
APM-STR-01Analyst portfolio disposition recordedanalyst_time_signal
APM-STR-02Migration intent declaredmigration_intent
APM-STR-03Business capability alignmentanalyst evidence (not automated)
APM-STR-04Cloud-native successor availableanalyst evidence (not automated)
APM-STR-05Vendor roadmap commitmentanalyst evidence (not automated)
APM-STR-06Functional redundancy assessedanalyst evidence (not automated)

APM-VND: Vendor health ​

ControlTitleScored by rule
APM-VND-01Vendor identifiedvendor_identified
APM-VND-02Vendor support activevendor_support_active
APM-VND-03Support contact availablesupport_contact_available
APM-VND-04Support contract currentcontract_currency
APM-VND-05Product version recordedproduct_version_known
APM-VND-06Vendor financial stabilityanalyst evidence (not automated)
APM-VND-07Service level agreement definedanalyst evidence (not automated)
APM-VND-08Vendor security advisory practiceanalyst evidence (not automated)

APM-TCH: Technical health ​

ControlTitleScored by rule
APM-TCH-01Operating system in supportos_eol_status
APM-TCH-02Operating system end-of-life horizonos_eol_horizon
APM-TCH-03No open critical CVEscve_critical_open
APM-TCH-04Limited high-severity CVEscve_high_open
APM-TCH-05No known exploited vulnerabilitieskev_match
APM-TCH-06Patches available for severe CVEspatch_availability
APM-TCH-07Supported operating system familyos_family_supported
APM-TCH-08Update cadenceanalyst evidence (not automated)
APM-TCH-09Runtime and dependency freshnessbinary_runtime_current

APM-SEC: Security posture ​

ControlTitleScored by rule
APM-SEC-01No weak cryptographic algorithmsweak_crypto
APM-SEC-02Encrypted network endpointscleartext_endpoints
APM-SEC-03No hard-coded credentialshardcoded_credentials
APM-SEC-04Valid code-signing certificatesexpired_certificates
APM-SEC-05No severe national advisoriesbsi_advisories
APM-SEC-06Installer not flagged as maliciousvt_detection
APM-SEC-07Strong authenticationanalyst evidence (not automated)
APM-SEC-08Security certificationsanalyst evidence (not automated)
APM-SEC-09Recent penetration testanalyst evidence (not automated)
APM-SEC-10Security incident historyanalyst evidence (not automated)

APM-DAT: Data governance ​

ControlTitleScored by rule
APM-DAT-01Data classification declareddata_classification_declared
APM-DAT-02Health data sensitivityhealth_data_sensitivity
APM-DAT-03Personal data sensitivitypersonal_data_sensitivity
APM-DAT-04Data flows documenteddata_flow_documented
APM-DAT-05Data residency declareddata_residency_declared
APM-DAT-06Sub-processors declaredsubprocessors_declared
APM-DAT-07Data processing agreementanalyst evidence (not automated)
APM-DAT-08Retention and deletionanalyst evidence (not automated)

APM-SOV: Sovereignty readiness ​

ControlTitleScored by rule
APM-SOV-01Sovereign technology ratingsovereign_rating
APM-SOV-02Sovereign alternative existssovereign_alternative_available
APM-SOV-03Data stored in the EUdata_residency_eu
APM-SOV-04Third-country transfer riskanalyst evidence (not automated)
APM-SOV-05EU vendor entityanalyst evidence (not automated)
APM-SOV-06EUCS readinessanalyst evidence (not automated)

APM-BIZ: Business criticality ​

ControlTitleScored by rule
APM-BIZ-01Business criticality recordedbusiness_criticality
APM-BIZ-02User baseuser_base
APM-BIZ-03Operationally activeoperational_status_active
APM-BIZ-04Owning department recordeddepartment_assigned
APM-BIZ-05Outage impact assessedanalyst evidence (not automated)
APM-BIZ-06Process coverageanalyst evidence (not automated)

APM-HW: Hardware and cost ​

ControlTitleScored by rule
APM-HW-01Hardware profile recordedhardware_profile_known
APM-HW-02Right-sized memorymemory_utilisation
APM-HW-03Cloud cost estimatedcloud_cost_estimate
APM-HW-04Total cost of ownership comparedanalyst evidence (not automated)

APM-INT: Integration complexity ​

ControlTitleScored by rule
APM-INT-01Integration countintegration_count
APM-INT-02Integrations documentedintegration_documented
APM-INT-03Modern integration protocolsanalyst evidence (not automated)
APM-INT-04API availabilityanalyst evidence (not automated)
APM-INT-05Replacement couplinganalyst evidence (not automated)

APM-MIG: Migration readiness ​

ControlTitleScored by rule
APM-MIG-01Marked as migration candidatemigration_candidate_flag
APM-MIG-02Portable operating systemos_portability
APM-MIG-03Cloud delivery modelvendor_type_cloud_ready
APM-MIG-04Sovereign cloud programmesovereign_cloud_programme
APM-MIG-05Data export capabilityanalyst evidence (not automated)

APM-REG: Compliance obligations ​

ControlTitleScored by rule
APM-REG-01Regulatory loadregulatory_load
APM-REG-02GDPR Art. 9 scopegdpr_art9_scope
APM-REG-03MDR classification knownmdr_classification_known
APM-REG-04Recent security auditaudit_recency
APM-REG-05Certification status currentanalyst evidence (not automated)