Skip to content

Pass 12: Block Assessments (BLOCKS) ​

PropertyValue
Pass number12
Key (--passes)blocks
Signal prefixBLOCKS (declared; the pass emits no signals, see below)
TypeLLM-assisted (falls back to UNKNOWN per block without an LLM)
DefaultOn (part of the default --passes list)
Assessment typesapplication, service (always runs in the service profile)
TierAll tiers (no licence gate)
Sourcepackages/@swao/module-app-assessment/src/passes/pass-12-blocks.ts

What it is for ​

Compliance frameworks (Pass 11) tell you whether controls are met. Pass 12 answers a more operational question: "How mature is this application in the eight areas that usually decide whether a migration goes smoothly?"

It produces a scorecard with one entry per block: an outcome, a score between 0 and 1, a risk status, a short rationale and the signals that support the rating. The eight blocks were previously planned as separate passes numbered 15 to 22; they are now evaluated together in this single pass.

What you need to provide ​

InputWhereNotes
Signals from earlier passesWritten automatically in the same runThe scorecard can only be as good as the evidence
An LLM providerproviders.llm in .swao.yml, --llm or --modelWithout an LLM every block is UNKNOWN

There are no pass-specific configuration keys.

How it works ​

  1. Collect signals. The pass reads every pass file already written in the current run directory (excluding its own 12-* file).
  2. Read the synthesis. Pass 12 runs last in the canonical order, after Pass 09 SYNTH. It reads the 7R recommendation, coverage score and migration rationale from 09-synth.yaml in the same run directory. If that file is missing (for example when synth was not selected), the prompt states that the synthesis output is unavailable.
  3. One LLM call. A single prompt lists the eight block specifications with their thresholds and assessment axes, the outcome rules and a summary of every signal (ID, severity and the first 240 characters of the derivation). The LLM must return JSON only.
  4. Validate. The answer is validated against a strict schema (outcome, rationale, score 0 to 1, status, key signals; a threshold in the answer is optional). Cited signal IDs that do not exist in the run are removed. The stored threshold always comes from SWAO's block specification in the table below; a threshold returned by the LLM is ignored and cannot override it.
  5. Fallback. A block that is missing from the answer, or every block when no LLM is configured or the answer cannot be parsed, is recorded as UNKNOWN with score 0, status medium and assessor: rule_engine.
  6. Summary. The pass sets any_gap_found to true when any block is GAP or PARTIAL.

How it is measured ​

The block scorecard ​

Block (assessment.blocks.<name>)Former pass numberThresholdWhat the evaluator looks at
observability150.7Structured logs, exported metrics, distributed tracing, defined SLOs, alerting rules, on-call runbooks
licence_compliance160.8SBOM completeness, GPL/AGPL exposure, attribution coverage, commercially incompatible dependencies, end-of-life or abandoned packages
testing_maturity170.6Unit, integration and end-to-end tests, CI gating on merge, performance and load tests, mutation testing
architecture_assessment180.65Clear service boundaries, low coupling, acyclic dependencies, simple deployment topology, documented scalability path
database_assessment190.7Versioned schema, replication, verified backups, encryption at rest, retention policy, right-to-erasure support
integration_assessment200.65Retry with backoff, idempotency keys, contract tests, circuit breakers, documented egress allow-list, verified webhook signatures
iam_assessment210.8Strong authentication, MFA for administrators, enforced RBAC, secrets in a KMS or vault, access audit log, session expiry
dr_assessment220.6Defined RTO/RPO, verified backups, multi-zone or multi-region, current DR runbook, DR test within six months, automated failover

Outcome rules given to the evaluator ​

OutcomeRule
SATISFIEDThe block is mature; score at or above the block threshold
PARTIALSome elements present, gaps remain; score from 0.4 up to the threshold
GAPThe block is largely absent; score below 0.4
N_AThe block does not apply to this workload (rare, must be justified)
UNKNOWNNo signal addresses the block; score 0.0

Each block also carries a status of low, medium, high or critical, which is the migration risk from the operator's point of view. The same value is stored as sovereign_migration_risk.

Pass-level fields ​

FieldMeaning
blocks_evaluatedAlways 8
evaluation_modellm or rule_engine (no LLM)
any_gap_foundTrue when any block is GAP or PARTIAL
evaluation_notePlain-language summary of the result
skipped_reasonno_llm_provider when no LLM was configured

Third-party modules, tools and external services ​

NamePurposeLicenceBundled or optionalWhen missing or offline
Configured LLM providerScores the eight blocksDepends on the providerOptional, but needed for meaningful resultsAll blocks UNKNOWN
js-yaml, zodRead pass files and validate the LLM answerMITBundled-

Outputs ​

FileContent
apps/<app>/wsp/runs/<ts>/passes/12-blocks.yamlPass header, empty signal list and assessment.blocks scorecard
apps/<app>/wsp/runs/<ts>/llm-traces/12-blocks-call-1.jsonPrompt (after redaction) and response
wsp-plan.yaml (via plan derivation)The eight blocks surfaced for the report and the BI export

Configuration and limitations ​

SettingEffect
--passes without blocksSkips the pass
--skip-llm (alias --no-llm)Removes ctx, comp and blocks from the run
--llm, --model, --no-cacheSelect the LLM and bypass the response cache

Known limitations:

  • Score and outcome are not cross-checked. The thresholds are fixed by SWAO, but SWAO does not check that the score the LLM returns matches the outcome it chose. Review the scorecard with this in mind.
  • No signals. The pass declares its own prefix BLOCKS but emits no signals; the result lives only in assessment.blocks. Use --fail-on on other passes, not on block outcomes.

See also Pass 11: Compliance evaluation and Generate a report.