"Conformant" is used loosely in aviation software: a system that exports a file resembling the published example, or a demo screen with a green tick, gets called conformant. Neither is a conformance claim in an auditor's sense. A conformance claim is a statement that a named implementation, at a named version, satisfies a named set of requirements from a named version of a specification, backed by evidence that a third party can check without taking the vendor's word for it. Everything in this chapter is about making each of those four names precise.
WIA-SPACE-016 follows the common IETF convention in which requirement keywords such as MUST, MUST NOT, SHOULD and MAY carry defined meanings (BCP 14, that is RFC 2119 as clarified by RFC 8174). Only such sentences in normative sections create obligations. Each PHASE document opens with a short normative introduction that states its purpose, and ends with a group of annexes (E to I) that are explicitly labelled non-normative: they describe implementation experience, the adoption roadmap, how evidence is shaped, the versioning policy and interoperability profiles.
A careful reader will notice a tension. Annex G is declared non-normative, yet it says that implementations claiming conformance MUST run all test vectors in CI and that vendors MUST report negative results. The sensible reading is that the annex adds no technical requirements to the data format or the API but defines the rules of evidence for anyone who makes a claim. This book treats it that way and lists the wording as an open editorial issue in §8.7.
Annex F sorts the content of each PHASE into three tiers so that early implementers know how much weight each part can bear.
| Tier | What belongs to it | How it changes | Practical consequence |
|---|---|---|---|
| Stable | Normative sections written with MUST / MUST NOT | Semantic versioning; breaking changes only in a new major version with a parallel-support window (see §8.5) | Safe to encode in schemas, database constraints and contracts with customers |
| Provisional | Annex material and items still under discussion | May be promoted to normative status without a major version bump if feedback supports it | Implement behind a feature flag or adapter; expect wording to tighten |
| Reference | Test vectors, simulator behaviour, the reference TypeScript SDK | Versioned independently of the PHASE documents so mistakes can be corrected without amending the specification | Useful for learning and for smoke tests; never the authority when it disagrees with normative text |
The third row matters most for readers of this book. Earlier chapters pointed out a fatigue-life helper that returns physically impossible values, an SDK whose request function returns mock data and a CLI that always reports success. Because the reference layer is explicitly not normative and is versioned on its own, it can be fixed without any change to what a conformant record or API must look like.
The word "certification" appears in two unrelated senses in this domain, and mixing them up is a real risk. In the airworthiness sense, only a competent authority such as the FAA, EASA or, in Korea, the Ministry of Land, Infrastructure and Transport (MOLIT) can approve a design, a production organisation or a maintenance release, and those approvals are recorded on documents such as a type certificate, an FAA Form 8130-3 or an EASA Form 1. In the standards sense, an implementation can be shown to conform to WIA-SPACE-016, possibly with the help of a certification body operating under ISO/IEC 17065 (the international standard for bodies that certify products, processes and services, which Annex E cites in connection with audit retention).
The two never substitute for each other: a conformant records system can faithfully store a record of an unairworthy part, and a WIA conformance statement cannot make any part airworthy. Two details in the reference material blur this line and should be read with care. The comment on Certification.standard in the SDK types gives "WIA-SPACE-016" as an example value, which is fine for recording a conformance statement but must never be used where an airworthiness basis such as CS-25 or a TSO is meant. And the simulator's test tab displays a "Certificate ID" after pressing a button; that identifier is decorative text in a teaching tool, not a certificate of anything.
At version 1.0 the published material has three gaps that limit any claim. The normative sections do not yet assign stable identifiers to individual requirements, so there is nothing for a profile manifest or a test matrix to point to except section numbers. PHASE 2 refers to a machine-readable api/openapi.yaml that is not present in the published repository. And the test-vector directories that Annex G describes are not yet published either. An implementer can still assign its own requirement identifiers, keyed to section numbers and sentence text, and publish them with its evidence. But for now a claim should read like "conforms to the normative requirements of PHASE 1 v1.0 as enumerated in the attached requirement list", not simply "WIA-SPACE-016 certified".
A test vector is a small, self-contained input together with the verdict a correct implementation must reach on it. Vectors are the most portable form of conformance evidence because they depend on no particular language, database or deployment. Two implementations that disagree on one vector have found a concrete interoperability defect that can be discussed without opinions.
Annex G fixes the directory layout: every PHASE has its own folder under tests/phase-vectors/, and every normative requirement in that PHASE must have at least one positive vector (an input that must be accepted) and at least one negative vector (an input that must be rejected).
| Directory | PHASE | Typical vector content |
|---|---|---|
tests/phase-vectors/phase-1-data-format/ | 1 — Data format | Single JSON documents (AircraftComponent, Inspection, Certification) with an expected valid/invalid verdict |
tests/phase-vectors/phase-2-api-interface/ | 2 — API interface | Recorded HTTP request/response pairs: status code, headers, problem-details body, discovery document |
tests/phase-vectors/phase-3-protocol/ | 3 — Protocol | Ordered message sequences between actors, including duplicates and out-of-order delivery, with the expected final state |
tests/phase-vectors/phase-4-integration/ | 4 — Integration | Evidence bundles (SBOMs, attestations) that must verify, and tampered copies that must not |
The specification does not define the file format of a vector. Until it does, a format that states its own expectation is the easiest to audit. The example below is a proposal used throughout this chapter, not text from the standard; the requirement identifier is likewise invented, for the reason given in §8.1.
{
"vector": "p1-neg-inspection-conditional-without-next-date",
"requirement": "P1-INSP-004",
"target": "Inspection",
"expect": "invalid",
"why": "A conditional result must say when the item is looked at again",
"instance": {
"id": "insp-000912",
"inspectionDate": "2026-03-18",
"inspector": "Licensed engineer, stamp 4471",
"method": "eddy-current",
"result": "conditional",
"findings": "Linear indication 1.2 mm at fastener hole 14, within repair manual limits"
}
}
Note that the rule this vector tests, that a conditional result requires a nextInspectionDate, is not in the reference types, where the field is simply optional. It is the kind of requirement an implementer would reasonably add and should then declare.
Positive vectors are easy to write; negative vectors take more thought, and they are where aviation data systems actually fail. A good negative vector encodes a mistake someone could plausibly make in a hangar or a data migration.
| Mistake encoded in the vector | Why it happens | Caught by |
|---|---|---|
serialNumber missing or empty | Batch-controlled parts exported through a serialised-parts interface | Schema (required, minLength) |
method: "penetrant" | Penetrant testing is a common NDI method but is not in the version 1.0 enum (see Chapter 7) | Schema (enum) — and a candidate for an additive change |
density: 2.78 for an aluminium alloy | Datasheet value in g/cm³ copied into a field defined in kg/m³ | Schema, if a plausibility minimum is set (for example 500) |
manufacturingDate: "18/03/2026" | Locale-formatted date from a spreadsheet | Schema (format: date, asserted) |
expiryDate earlier than issueDate | Fields swapped during import | Code (cross-field rule) |
An inspection dated after the part's status became retired | Retired part's serial number reused on a replacement | Code (history rule) |
Two components with the same partNumber and serialNumber but different manufacturer | Merging records from two MRO systems | Code (collection rule); needs a PHASE 3 vector, not a single document |
The last three rows show why a schema alone is never a test suite: rules that compare fields, look at history or compare records need code, and their vectors must carry more than one document.
Annex G requires that implementations claiming conformance run every vector in continuous integration and publish the resulting pass/fail matrix. Two further rules give that matrix its value. First, negative results must be reported with the same fidelity as positive ones: a vendor may not publish only the rows that passed. Second, a vector skipped without a recorded justification counts as a failure. Together these close the most common loophole in self-assessment: quietly no longer running inconvenient tests.
| Requirement | Vector | Expected | Observed | Verdict |
|---|---|---|---|---|
| P1-ID-001 | p1-pos-minimal-component | valid | valid | pass |
| P1-ID-001 | p1-neg-missing-serial | invalid | invalid | pass |
| P1-MAT-003 | p1-neg-density-gcm3 | invalid | valid | fail |
| P1-INSP-004 | p1-neg-inspection-conditional-without-next-date | invalid | — | skipped, justified: "rule declared partial in profile manifest" |
| P2-ERR-002 | p2-neg-429-without-retry-after | invalid | — | fail (skipped without justification) |
A failing row matched by a partial or excluded entry in the profile manifest (§8.4) is still an honest statement. What auditors cannot accept is a matrix and a manifest that disagree.
Publishing evidence is what turns test results into a claim. Annex G defines the compliance package as a signed tarball with fixed contents. Chapter 7 used CycloneDX and in-toto to describe a physical component and its manufacturing evidence. The package in this section is different: it describes the software implementation that stores and exchanges such records.
| Item | Format | Source in the standard | What a reviewer uses it for |
|---|---|---|---|
| Software bill of materials | CycloneDX 1.5 or SPDX 2.3 | Annex G | Which libraries, including validators and cryptographic code, produced the results |
| API description | OpenAPI document (3.1 per the PHASE 1 references) | Annex G; Annex E asks that operational scope be declared in it | Comparing the declared interface with the PHASE 2 operation groups |
| Test-vector matrix | Machine-readable table, one row per vector | Annex G | Checking coverage, failures and justified skips |
| Profile manifest | JSON, signed with the same key as the SBOM | Annex I | Knowing which requirements the implementation claims at all |
| Version changelog mapping | Table from PHASE version to build, container digest or SDK version | Annex H (SHOULD) | Tying a claim to a binary that can be deployed and re-tested |
| Signed manifest | List of every file with its digest, signed with Sigstore (DSSE envelope, Rekor entry) | Annex G | Proving nothing in the tarball has been altered or substituted |
Annex G chooses Sigstore so that consumers can verify provenance "without trusting a private CA". In practice this means three pieces working together. The signature is wrapped in a DSSE (Dead Simple Signing Envelope), which binds the signed bytes to a declared payload type so that a signature over one kind of document cannot be replayed as a signature over another. The signing certificate is short-lived and tied to an identity, typically the CI workload of the vendor's repository. And the signing event is written to Rekor, a public append-only transparency log, so a signature cannot be produced secretly. Verification needs only the package and the expected signer identity; no vendor-run key server has to be trusted or kept alive for decades.
The following pipeline shows the whole path from vectors to a signed package. It is written as a plain shell script so it can be dropped into any CI system. The tool invocations are real (CycloneDX's npm generator, the Sigstore cosign CLI), but file names, the requirement list and the version numbers are examples.
#!/usr/bin/env bash
set -euo pipefail
VERSION="3.4.1" # implementation version (example)
OUT="evidence-${VERSION}"
mkdir -p "$OUT"
# 1. Run every vector; the runner writes a matrix and exits non-zero on any
# failure or unjustified skip (see the runner in section 8.6).
# A failing matrix is still packaged: negative results are published, not hidden.
VEC_STATUS=0
node tools/run-vectors.cjs tests/phase-vectors > "$OUT/vector-matrix.json" || VEC_STATUS=$?
# 2. Software bill of materials in CycloneDX 1.5
npx @cyclonedx/cyclonedx-npm --spec-version 1.5 \
--output-file "$OUT/sbom.cdx.json"
# 3. Interface description, profile manifest, changelog mapping
cp api/openapi.yaml "$OUT/"
cp conformance/profile.json "$OUT/"
cp conformance/version-map.json "$OUT/"
# 4. Manifest of digests, then a keyless Sigstore signature logged in Rekor
( cd "$OUT" && sha256sum -- * > MANIFEST.sha256 )
cosign sign-blob --yes --bundle "$OUT/MANIFEST.sigstore.json" \
"$OUT/MANIFEST.sha256"
tar -czf "${OUT}.tar.gz" "$OUT"
exit "$VEC_STATUS" # the CI job still reports the failure
Verification on the consumer side reverses the process: unpack, run cosign verify-blob against the bundle while pinning the expected certificate identity and OIDC issuer, then recompute every digest in MANIFEST.sha256. Pinning the identity is not optional. A valid signature from an unexpected identity proves only that someone signed something.
Annex G asks implementations to re-publish the evidence package every quarter even when their own source code has not changed. The reason is environmental drift. A new compiler, validator library or base image can change behaviour without any vendor code changing; JSON Schema libraries, for example, differ in whether format keywords are asserted, and an upgrade can flip that. Diffing two quarterly packages shows precisely what moved.
Annex E suggests that a 7-year retention window satisfies ISO/IEC 17065 audit expectations in most jurisdictions, and immediately adds that where a regulator requires longer retention the deployment policy must extend the window. In aviation that exception is the normal case for the records themselves. Operating rules in both the United States and Europe require certain records, such as the current status of life-limited parts and of airworthiness directive compliance, to be kept for as long as the aircraft or part remains in service and to travel with it when it changes hands. Treat seven years as the floor for conformance evidence, and keep component records, with the evidence of how they were validated, for the life of the part.
| # | Check | Evidence |
|---|---|---|
| 1 | Each claimed requirement has an identifier and a citation to the PHASE section and version | Requirement list in the package |
| 2 | Every requirement has at least one positive and one negative vector | Vector matrix, coverage column |
| 3 | Every vector ran in CI on the build being claimed; skips carry written justification | Vector matrix, CI run reference |
| 4 | Failures and partial support are declared, not omitted | Profile manifest entries match matrix rows |
| 5 | The SBOM describes the exact build that produced the matrix | SBOM plus version changelog mapping |
| 6 | Supported PHASE 2 operation groups are declared | Profile manifest and OpenAPI document agree |
| 7 | The package is signed and logged; the signer identity is published | Sigstore bundle, Rekor entry |
| 8 | The next quarterly recheck is scheduled and retention policy is stated | Deployment policy document |
| 9 | No wording implies airworthiness approval | Review of public claim text |
Deployments differ in scope: a repair station may only record inspections, while an operator needs full traceability history. Annex I's interoperability profile lets each be honest about its scope without pretending to full conformance.
Every implementation publishes a JSON profile manifest that lists requirement identifiers from the PHASE with one of three statuses: supported, partial with a reason, or excluded with a justification. The manifest is signed with the same Sigstore identity as the SBOM, so a consumer can be sure the scope statement and the evidence came from the same place. PHASE 2 adds that implementations declare in their profile which of the five operation groups they support. The example below combines both.
{
"profiles": [
"WIA-P1-DATA-FORMAT-Edge-only/2",
"WIA-P2-API-INTERFACE-Edge-only/1"
],
"implementation": {
"name": "example-repair-station-records",
"version": "3.4.1",
"containerDigest": "sha256:0f4c…(truncated)"
},
"phaseVersions": {
"phase-1-data-format": "1.0.0",
"phase-2-api-interface": "1.0.0"
},
"operationGroups": {
"componentCatalog": "supported",
"maintenanceEvent": "supported",
"traceability": "partial",
"certificationPackage": "excluded",
"serviceBulletin": "supported"
},
"requirements": [
{ "id": "P1-ID-001", "status": "supported" },
{ "id": "P1-MAT-003", "status": "partial",
"reason": "Density accepted in kg/m3 only; legacy g/cm3 values are rejected, not converted" },
{ "id": "P2-CERT-001", "status": "excluded",
"justification": "Repair station does not submit certification packages to an authority" }
],
"operationGroupNotes": {
"traceability": "History available from 2019 onward; earlier records held on paper"
}
}
The partial traceability entry is exactly what an operator needs to know before relying on a system for back-to-birth history. The exclusion of certificationPackage is not a weakness: a repair station does not submit type-certification evidence.
When several implementations cooperate, for example an operator and three contracted MROs exchanging maintenance events, Annex I asks the federation to publish an aggregated manifest that summarises both the union and the intersection of the members' profiles. The intersection tells a directory service what every member can do, so a request that must succeed anywhere, such as a traceability query for a part that may have visited any shop, is routed on the least common denominator. If one member only partially supports traceability, this becomes visible before a query silently returns an incomplete history.
Common deployment shapes are given names in a public registry kept by the WIA working group; Annex I mentions "Edge-only" and "Federated-with-replay" as examples. Registry entries are immutable. If the community wants a different shape, it is added under a new name rather than by editing the old entry, so that a manifest signed years ago still means what it meant. Profile names carry a major version in the same SemVer sense as the PHASE documents: WIA-P1-DATA-FORMAT-Edge-only/2 asserts conformance to the second major version of that named profile, not the second deployment of an unversioned one.
When a deployment widens its scope, the earlier manifest remains valid and signed for the deprecation window of §8.5, so auditors can later reconstruct what a system claimed on the day it accepted a record.
Component records outlive software: a landing-gear strut may stay in service, through overhauls, longer than most records systems stay in production. The versioning policy must therefore serve both implementers and records owners.
Annex H adopts Semantic Versioning 2.0.0. A major version indicates a backwards-incompatible change to a normative requirement, a minor version adds normative requirements without breaking existing implementations, and a patch version is editorial only. The table applies those rules to changes that WIA-SPACE-016 is likely to see.
| Change | Bump | Reasoning |
|---|---|---|
| Fix a typo or clarify wording without changing behaviour | Patch | Editorial; issued as signed errata without a deprecation window |
Add an optional field, for example softwarePartNumber or a cycles counter | Minor | Additive; Annex E states new optional fields are non-breaking |
Add penetrant to Inspection.method | Minor, if consumers tolerate unknown values | New producers emit a value old validators reject; see the discussion below |
Make nextInspectionDate required when result is conditional | Major | Existing valid records become invalid |
Change the unit of density from kg/m³ to g/cm³ | Major | Same field, different meaning: the most dangerous kind of change |
| Rename or remove a field, including in error payloads | Major (see note) | Backwards-incompatible for any consumer that reads it |
The last row hides a discrepancy in the annexes. Annex E says that renaming or removing fields "even in error payloads, MUST trigger a minor version bump", while Annex H defines backwards-incompatible changes as major. Under SemVer a rename is incompatible, so this book follows Annex H. The practical rule for implementers is simpler still: never rename in place; add the new field, deprecate the old one, and remove it only at a major version.
Whether adding an enum value is compatible depends on consumers, not the schema alone: if they reject unknown values, a new value breaks them; if they must preserve and flag it, it does not. A future rule such as "unknown enumeration values MUST be preserved and MUST NOT cause the whole record to be rejected" would let the NDI-method and material enums grow through minor releases.
When a new major version is published, Annex H requires the previous major version to be maintained in parallel for at least 180 days, during which both are marked Stable in the WIA registry and either may be cited as WIA-conformant. The old version then enters a 12-month sunset window during which the registry marks it Deprecated, with a migration note that points to the replacement requirements and explains why the change was made. Because a version cannot be Stable and Deprecated at once, the two windows must run one after the other, although the annex does not say so in so many words.
v2.0.0 published
|
v1.x Stable | Stable (parallel window, at least 180 days) | Deprecated (sunset, 12 months) | retired
v2.x | Stable --------------------------------------------------------------------------->
|
day 0 day 180+ day 180+ + 12 months
Annex F, in the same documents, speaks of "at minimum 90 days of overlap with the prior major version on all WIA-published reference implementations". The two figures may have been meant for different things, the specification in Annex H and the reference implementations in Annex F, but as written they conflict. This book treats Annex H's 180 days as governing, since it is the annex dedicated to versioning, and recommends that implementers plan for the longer figure in both cases.
Patch-level errata need no deprecation window; they are kept in a public register, each entry signed by the working-group chair. Annex H also recommends that implementations publish a mapping from each PHASE version they support to the specific build, container digest or SDK version that satisfies it. With the quarterly package, it lets an auditor say, for any date, which code accepted records under which version of the rules.
For the records themselves, store the schema version with every record, for example as a $schema URI or metadata.wiaSchemaVersion, so that nobody reading it twenty years later has to guess which rules applied.
The standard ships two hands-on tools, the shell script cli/aircraft-component.sh and the browser simulator at wiastandards.com. Both help with orientation; neither is a conformance tool in its current form.
| Command | What the help text promises | What the script does |
|---|---|---|
validate <file> | Validate data against the standard | Checks only that the file exists, then prints "Validation passed"; the contents are never read |
generate <type> | Generate a sample implementation | Prints the name of a JSON file it would write; no file is created |
check | Check system compliance | Prints "System check passed" unconditionally |
info | Show standard information | Prints the name and version string |
As a skeleton that reserves a command-line shape, this is harmless. In a CI pipeline it would be harmful: an empty file would "pass".
| Tab | What it does | Caveat | Use it for |
|---|---|---|---|
| Data Format | Builds a JSON object from an ID, a type and a status | Output does not match AircraftComponent: weights and dimensions are strings with units; certification fields differ from the types | Exercise: convert it into a record that passes the schema |
| Algorithms | Computes σ = F/A, the ratio of strength to stress, and a "fatigue life" | Uses the same fatigue formula as estimateFatigueLife, which predicts 108 cycles when stress equals strength | Stress arithmetic and units; never life estimates |
| Protocol | Prints a log of four API calls with success codes | Fixed text; no request is sent, and paths differ from the SDK's | The intended shape of a request sequence |
| Integration | Prints connection results for MES, QMS, ERP and a certification database | Fixed text; nothing is connected | A checklist of systems that Chapter 7 discusses |
| Test | Shows "All Tests Passed" and a pattern resembling a 2D code | No test runs; the pattern is random squares, the certificate ID static text | What a conformance result should never look like |
A result screen with no inputs, matrix, version or signature is the opposite of Annex G evidence, which makes it a good teaching prop: ask students what would have to appear on it before an auditor could rely on it. Their list will closely match Table 8-5.
A real validator has two layers. The first is a JSON Schema 2020-12 document for each object, of the kind developed in Chapter 4, executed by a validator that asserts format keywords. The second is a small set of coded rules for everything a schema cannot express. The package manifest of the reference SDK already lists zod as a dependency, although the current source never imports it; either route works, but JSON Schema is the one the standard names, and it is language-neutral, which matters for vectors that must run in many implementations.
The runner below loads schemas, runs every vector file, applies cross-field rules and writes the matrix that §8.3 signs. It uses Ajv's 2020-12 build and the ajv-formats plug-in so that format: date is actually checked. The rule functions are examples of the kind discussed in Table 8-3.
const fs = require("fs");
const path = require("path");
const Ajv2020 = require("ajv/dist/2020");
const addFormats = require("ajv-formats");
const ajv = new Ajv2020({ allErrors: true, strict: true });
addFormats(ajv); // assert format: date
const schemas = {
AircraftComponent: ajv.compile(require("../schemas/aircraft-component.json")),
Inspection: ajv.compile(require("../schemas/inspection.json")),
Certification: ajv.compile(require("../schemas/certification.json"))
};
// Rules a schema cannot express (cross-field and history rules)
const rules = {
Certification: (c) =>
c.expiryDate && c.expiryDate < c.issueDate ? ["expiryDate before issueDate"] : [],
Inspection: (i) => {
const errs = [];
if (i.result === "conditional" && !i.nextInspectionDate)
errs.push("conditional result without nextInspectionDate");
if (i.nextInspectionDate && i.nextInspectionDate <= i.inspectionDate)
errs.push("nextInspectionDate not after inspectionDate");
return errs;
}
};
function walk(dir) {
return fs.readdirSync(dir, { withFileTypes: true }).flatMap((e) =>
e.isDirectory() ? walk(path.join(dir, e.name))
: e.name.endsWith(".json") ? [path.join(dir, e.name)] : []);
}
const rows = [];
for (const file of walk(process.argv[2])) {
const v = JSON.parse(fs.readFileSync(file, "utf8"));
if (v.skip) {
rows.push({ vector: v.vector, requirement: v.requirement, expect: v.expect,
verdict: v.skip.reason ? "skipped-justified" : "fail" });
continue;
}
const validate = schemas[v.target];
const schemaOk = validate(v.instance);
const ruleErrs = schemaOk && rules[v.target] ? rules[v.target](v.instance) : [];
const observed = schemaOk && ruleErrs.length === 0 ? "valid" : "invalid";
rows.push({ vector: v.vector, requirement: v.requirement, expect: v.expect, observed,
verdict: observed === v.expect ? "pass" : "fail",
detail: schemaOk ? ruleErrs : validate.errors });
}
process.stdout.write(JSON.stringify(rows, null, 2) + "\n");
process.exit(rows.some((r) => r.verdict === "fail") ? 1 : 0);
Comparing dates as strings works here only because ISO 8601 calendar dates in the form YYYY-MM-DD sort lexically in time order and the schema has already rejected anything else. That dependency on the schema layer running first is intentional and is why the runner applies rules only to documents that passed it.
The CLI's validate command can then become an honest wrapper: wrap a single file as a positive vector, run it and return the runner's exit code.
Version 1.0 models a component as a mostly static record. Several developments push towards records that are richer, more often updated and more tightly bound to evidence; none requires abandoning the model, but each shows where it must grow.
Structural health monitoring places sensors, such as strain gauges, acoustic-emission sensors, ultrasonic guided-wave transducers or crack-detection sensors, permanently on a structure so that its condition can be assessed without disassembly. Where regulators accept it, monitoring can supplement or replace a scheduled inspection. For a records standard this raises two questions. First, an Inspection today has an inspector and a method from a five-value list; a monitored check has a sensor system, a software version and an algorithm, which need their own traceable identity. Second, sensor data is continuous and voluminous, and it should not be stored inside the component record. The likely pattern is a reference from the record to an external data set, with a digest so the record still proves what data it relied on.
A digital twin, a model of one serial-numbered part tracking its actual loading and damage, is the natural consumer of such data. The WIA record would be its identity and approval backbone: the twin computes, the record says which part and which approved data the computation belongs to.
For additively manufactured parts, properties depend heavily on the process: feedstock lot, machine, build layout, parameters, heat treatment and post-processing. FAA and EASA have both published guidance and research on qualifying such parts. For records, "material" becomes inseparable from "process": a future version will likely need a build identifier and a link to the build record alongside MaterialSpecification.
Two material families already in service are poorly represented by the version 1.0 enumeration. Aluminium-lithium alloys, such as 2050 and 2198, offer lower density and better stiffness than classic 2xxx and 7xxx alloys and are used in fuselage and wing structure. Thermoplastic composites, unlike the thermoset systems discussed in Chapter 2, can be re-melted and welded by induction, resistance or ultrasonic methods, which introduces new special processes, new inspection needs for weld lines, and new process records. Today an Al-Li part can only be recorded under an existing aluminium value with the real alloy in grade, which misstates its family, and a thermoplastic part only under the generic composite; precise enum values, added under §8.5, would make fleet-wide queries reliable.
Proposals to put parts provenance "on a blockchain" appear regularly. Signatures in a public transparency log, which the standard already uses, deliver the property that matters, that nobody can quietly rewrite history, without a token, a consensus network or shared custody of data; only signatures and digests are public. Extending this from software evidence to release documents and maintenance events would make a suspected unapproved part much harder to disguise.
The problems identified in this book form a concrete agenda. Items marked "editorial" can be fixed as errata; the others need releases under §8.5.
| Issue | Where | Suggested direction |
|---|---|---|
| No stable identifiers for individual normative requirements | PHASE 1–4 | Assign IDs so that vectors, matrices and profile manifests can reference them |
| Referenced OpenAPI document and test-vector directories not published | PHASE 2; Annex G | Publish them as Reference-tier material |
| 90-day versus 180-day overlap | Annex F versus Annex H | Align on one figure and state what it applies to |
| Renames classified as minor | Annex E versus Annex H | Classify as major, consistent with SemVer |
| Annex G wording uses MUST inside a non-normative annex | Annex G | State that the annex governs conformance claims (editorial) |
| References to non-existent Annexes A and D; "OAuth 2.1 (RFC 9700)"; "KCAA" | Annexes E, F; PHASE 2 | Editorial: RFC 9700 is the OAuth 2.0 Security Best Current Practice; the Korean authority is the Ministry of Land, Infrastructure and Transport |
| No penetrant method; no software part number, hours or cycles fields | Reference types | Add optional fields and enum values (minor), with the unknown-value rule |
density defined in kg/m³ while spec tables use g/cm³ | Types versus PHASE 1 tables | Keep kg/m³, state the unit in the schema, add a plausibility bound |
Certification.expiryDate is required although release certificates and type certificates do not expire | Reference types | Add a separate optional field for non-expiring approvals (Chapter 4), or distinguish certificate kinds; making it optional would break consumers |
estimateFatigueLife gives physically impossible results | SDK; simulator | Remove, or replace with an explicitly labelled teaching model |
SDK makeRequest returns mock data; CLI always passes | SDK; CLI | Implement, or label as stubs in the tools' own output |
None of these undermines the idea behind the standard. The mechanisms of this chapter, test vectors, honest profiles, signed evidence and disciplined versioning, are exactly the tools for fixing them in public.