Profiles and reporting contract¶
Report schema is 1.0; eoap-package is revision 1.3 and other profiles
remain at 1.0. Validator version is 0.4.0. Reports include the installed cwltool, cwl-loader and API versions.
Profile changes that alter acceptance behavior require a profile revision.
CWL foundation¶
Original YAML is retained for conservative source locations. Duplicate YAML keys are rejected by ruamel.yaml. The shared loader resolves processes and cwltool validates the selected original URI, preserving relative-reference semantics. If the loader fails, cwltool is also consulted: a document accepted by cwltool but unsupported by the loader is an incomplete assessment, not invalid CWL.
Unknown mandatory CWL requirements remain invalid by default. The CLI option
--enable-dask-gateway explicitly registers the bundled Calrissian
DaskGatewayRequirement schema with cwltool for validation. The shared loader
preserves the namespaced requirement payload opaquely during normalization; it
does not perform extension-specific validation. Enabling the schema validates
the static document only and does not imply runtime or execution support.
Entrypoint selection is mandatory when multiple root-document Workflows exist. Rules evaluate reachable processes, preserving invocation-specific inherited requirements and hints. Parser and loader limitations may block inspection.
eoap-package¶
The profile derives from app-package-validation requirements 7–14 and
OGC Best Practice 20-089r1.
It is a declared static assessment, not certification of all conformance classes.
| Rule family | Meaning |
|---|---|
EOAP.REQ7.STRUCTURE |
Selected Workflow reaches at least one CommandLineTool. |
EOAP.REQ8.* |
Tool ID, baseCommand, declared inputs and requirements, and effective DockerRequirement.dockerPull. Empty input/requirement collections are permitted. |
EOAP.REQ9.* |
Workflow ID, label and doc are nonempty. |
EOAP.REQ10.* |
Workflow input IDs, labels and docs are nonempty. |
EOAP.REQ11.VERSION |
Nonempty application softwareVersion or legacy version metadata. |
EOAP.SOURCE.ID |
An explicit process ID is present in the source, rather than only a parser-generated ID. |
EOAP.SOURCE.DECLARATIONS |
Declaration checks blocked where a trustworthy source mapping is unavailable. |
SCHEDULING.RESOURCE.* |
Explicit CPU and RAM minima and maxima for every reachable tool invocation. |
SERVICE.PROCESS.ID |
All resolved Workflow and CommandLineTool IDs must differ from main. |
EOAP.CONTAINER.HINT |
Advisory warning: the declared container is a hint rather than a mandatory requirement. |
Mandatory container requirements inherit through workflow and step invocation contexts. Hints are tracked separately, with mandatory requirements taking precedence. The profile checks the literal tool requirements declaration separately from effective container configuration. The report makes this stricter packaging requirement visible even where a runner could inherit all requirements.
The legacy dockerOutputDirectory prohibition is intentionally not carried over:
it had no OGC requirement reference and belongs in a named platform profile.
Absence of optional legacy metadata is not an error. Resource expression evaluation, fan-out
recommendations and other platform compatibility checks are not implemented here.
The package profile also defines the following documentation rules. These are profile-specific additions, not newly numbered OGC requirements:
| Rule family | Scope | Missing or blank value |
|---|---|---|
EOAP.WORKFLOW.OUTPUT.LABEL / .DOC |
Every output of the selected entry Workflow only | Failed, error |
EOAP.WORKFLOW.STEP.LABEL / .DOC |
Every step of all reachable Workflows, including subworkflows | Needs review, warning |
EOAP.CLT.INPUT.LABEL / .DOC |
Every input of reachable CommandLineTools | Needs review, warning |
EOAP.CLT.OUTPUT.LABEL / .DOC |
Every output of reachable CommandLineTools | Needs review, warning |
Nonempty fields pass with informational severity. Whitespace-only values are
considered missing. These rules do not require an otherwise empty collection to
contain parameters or steps. Advisory findings fail CI only with --fail-on warning.
Nested workflow outputs are not subject to the mandatory entry-output rule unless
that workflow is selected as the entrypoint.
eoap-staging¶
Use explicit --staging JSON applicability. Directory, arrays of Directory and
optional Directory types are recognized structurally. A union allowing unrelated
types is rejected for a declared staged parameter. Unknown targets fail.
EOAP.REQ12.INPUT and EOAP.REQ13.INPUT check declared tool/workflow stage-in
parameters. EOAP.REQ14.OUTPUT checks the declared Directory-based output
convention inherited from the legacy validator; it is not proof of Requirement
14's complete collection obligation. EOAP.REQ14.COVERAGE always requests review
for declared staged outputs. Neither STAC contents nor actual output files are
inspected. Unspecified applicability requires review rather than a heuristic pass.
metadata¶
Metadata is read at application-document scope, normalized with PyLD using
$namespaces, and validated by transpiler_mate.api.SoftwareApplication.
It is not substituted with workflow label/doc or fabricated default authors.
Required fields are name, description, dateCreated, license, softwareVersion,
softwareHelp, publisher and author, including their nested model requirements.
TM.METADATA.MODEL: exact Pydantic model validation errors.TM.VERSION.MIGRATION: legacy version does not replace softwareVersion.TM.VERSION.CONSISTENCY: both properties must agree if both are present.TM.METADATA.QUALITY: advisory empty values/collections or help entries lacking URLs.METADATA.JSONLD: metadata expansion failure.
The model allows additional fields. This profile does not impose SemVer, require ORCID, verify URLs over the network, or certify license compatibility. Quality checks run after successful model validation.
Reports¶
The authoritative output schema is report.yaml,
JSON Schema Draft 2020-12 encoded as YAML. It covers all assessment fields,
findings, source locations, counts, exit code and the fail_on threshold.
Both CLI and library serialization pass through the generated models.Report.
Library reports now include fail_on explicitly, defaulting to error.
The task generates models from the schema, including enums and the aliased
needs-review / not-applicable count fields. report.py adds executable
policy on top of generated models without duplicating their field definitions.
Input-only staging configuration remains in report.py and is not part of the
output schema. The shared generator enables extra fields on generated classes;
the checked-in JSON Schema remains the strict wire-format contract.
Every finding has rule ID, profile, status, severity, message, source location, optional correction and optional requirement reference. Locations use one-based lines and Unicode code-point columns; they are not VS Code UTF-16 ranges. Unknown locations remain null. Parameter findings currently point to the parameter declaration, not necessarily the exact missing field.
Statuses: passed, failed, needs-review, not-applicable, blocked.
Severity describes the reported outcome: passed and not-applicable checks
use info and have no corrective suggestion. Passed messages confirm what was
found. Failed checks retain their rule's failure severity; review findings retain
warning. Blocked checks retain the severity of the blocking condition.
Display filtering never changes assessment results.
| Exit code | Meaning |
|---|---|
| 0 | Assessment completed without findings above the selected threshold; review findings may remain. |
| 1 | Validation failed the error/warning threshold. |
| 2 | Source/operational failure prevented assessment, or report output failed. |
Reports include root and resolved process-source URIs and directly detected
missing dependency URIs. This is explicitly not a complete $import/$include
manifest. An unavailable source range does not by itself fail an otherwise
completed semantic assessment.
Mandatory scheduling and process identifier policy¶
The eoap-package profile requires explicit coresMin, coresMax, ramMin,
and ramMax in an effective ResourceRequirement under requirements for
every reachable CommandLineTool invocation. Workflow and step requirements
inherit; a more local ResourceRequirement replaces the inherited one as a whole.
Hints do not satisfy this policy. Missing fields produce
SCHEDULING.RESOURCE.<field> errors. CWL expressions are accepted as declarations;
the validator does not evaluate their runtime values.
All resolved Workflows and CommandLineTools, including internal and unreachable
processes, must use an ID other than main. Violations produce
SERVICE.PROCESS.ID errors. Both policies are mandatory profile additions for
processing-service registration and Calrissian scheduling on Kubernetes, beyond
strict OGC 20-089r1 conformance. These checks do not run in metadata-only or
staging-only assessments.
Standalone CWL document policy¶
The eoap-package profile requires schema and process definitions to reside in
the application CWL document. Absolute HTTP(S) schema imports are an exception.
Local $import entries in SchemaDefRequirement produce
EOAP.SCHEMA.LOCAL_IMPORT errors: replace them with inline type definitions.
Relative references remain prohibited even when a remote $base resolves them.
Workflow step run references to external CommandLineTool or Workflow files
produce EOAP.PROCESS.EXTERNAL_REFERENCE errors. HTTP(S) process references,
$import wrappers, imported $graph entries and root process imports are also
rejected. Embed the process inline or in $graph and use #id.
These checks cover every declaration in the original document, including
unreachable processes, requirements, hints and embedded workflows. They run
before dependency resolution, so unavailable files cannot hide policy failures.
Other $include declarations and runtime file inputs are outside these checks.
Missing dependencies still produce operational failures (exit code 2), alongside
the actionable single-file policy errors. Existing external files produce
validation failures (exit code 1) when assessment otherwise completes.