{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://kn-wallpaperglue.com/data/cms/textile-cms-viscosity-comparison-schema.json",
  "x-schemaVersion": "1.1.0",
  "title": "Textile CMS viscosity comparison record",
  "description": "A method-aware record for comparing carboxymethyl starch samples used in textile printing, sizing, or another declared process. A viscosity value is comparable only when the preparation and measurement conditions are also recorded.",
  "type": "object",
  "additionalProperties": false,
  "properties": {
    "recordId": { "type": "string", "minLength": 1, "description": "Buyer-controlled unique record identifier." },
    "materialName": { "type": "string", "minLength": 1, "description": "Material name as supplied; do not infer a grade or composition." },
    "manufacturer": { "type": "string", "description": "Declared manufacturer name." },
    "gradeReference": { "type": "string", "description": "Exact supplier grade or internal reference, when available." },
    "sampleReference": { "type": "string", "minLength": 1, "description": "Identifier printed on or assigned to the received sample." },
    "batchLotReference": { "type": "string", "description": "Batch or lot identifier, when supplied." },
    "physicalForm": { "type": "string", "description": "Observed or documented material form, such as powder or flake." },
    "intendedProcess": { "type": "string", "minLength": 1, "description": "Declared trial process, such as textile printing or sizing." },
    "comparisonGroupId": { "type": "string", "description": "Buyer-controlled group identifier used only for records intended to share the same declared preparation and measurement protocol." },
    "solutionConcentrationPercentWW": { "type": "number", "minimum": 0, "maximum": 100, "description": "Prepared-solution concentration in percent by mass." },
    "waterSource": { "type": "string", "description": "Water source or controlled-water reference." },
    "waterPH": { "type": "number", "minimum": 0, "maximum": 14, "description": "Measured or controlled water pH, when available." },
    "waterHardnessMgLAsCaCO3": { "type": "number", "minimum": 0, "description": "Measured or controlled water hardness in milligrams per litre as calcium carbonate, when available." },
    "waterTemperatureC": { "type": "number", "description": "Water temperature before addition, in degrees Celsius." },
    "additionOrder": { "type": "string", "description": "Order in which water, CMS, and any declared components were added." },
    "mixingMethod": { "type": "string", "description": "Mixer, stirring method, and other preparation details." },
    "mixingDurationMin": { "type": "number", "minimum": 0, "description": "Active mixing duration in minutes." },
    "hydrationRestDurationMin": { "type": "number", "minimum": 0, "description": "Hydration or rest duration before measurement, in minutes." },
    "methodReference": { "type": "string", "description": "Controlled SOP, buyer method, or published method reference used for the preparation and measurement." },
    "measurementTemperatureC": { "type": "number", "description": "Prepared-solution temperature at measurement, in degrees Celsius." },
    "instrumentModel": { "type": "string", "minLength": 1, "description": "Viscometer type and model." },
    "instrumentCalibrationReference": { "type": "string", "description": "Calibration, verification, or instrument-control reference, when available." },
    "spindle": { "type": "string", "minLength": 1, "description": "Spindle or rotor designation." },
    "rotationalSpeedRpm": { "type": "number", "exclusiveMinimum": 0, "description": "Measurement speed in revolutions per minute." },
    "instrumentTorquePercent": { "type": "number", "minimum": 0, "maximum": 100, "description": "Instrument torque percentage, when the selected viscometer reports it." },
    "measurementReplicateNumber": { "type": "integer", "minimum": 1, "description": "Replicate or repeated-reading number within the declared method." },
    "viscosityValue": { "type": "number", "minimum": 0, "description": "Recorded viscosity reading; interpret only with the declared method." },
    "viscosityUnit": { "type": "string", "minLength": 1, "description": "Unit reported by the instrument or method, for example mPa·s or cP." },
    "measurementTimestamp": { "type": "string", "format": "date-time", "description": "Timestamp of the viscosity measurement." },
    "measurementOperator": { "type": "string", "description": "Person or team that performed the measurement." },
    "sourceDataReference": { "type": "string", "description": "Controlled worksheet, instrument export, laboratory notebook, or other source-data reference." },
    "methodDeviation": { "type": "string", "description": "Any departure from the declared preparation or measurement method." },
    "formulationReference": { "type": "string", "description": "Buyer-controlled print-paste, sizing, or application formulation reference; do not disclose confidential formulas." },
    "applicationObservation": { "type": "string", "description": "Process observation kept separate from the solution viscosity reading." },
    "finishedFabricObservation": { "type": "string", "description": "Finished-fabric observation kept separate from the solution viscosity reading." },
    "tdsReference": { "type": "string", "description": "TDS filename, revision, or controlled-document reference." },
    "sdsMsdsReference": { "type": "string", "description": "SDS/MSDS filename, revision, or controlled-document reference." },
    "coaReference": { "type": "string", "description": "COA filename, batch reference, or controlled-document reference." },
    "retainedSampleLocation": { "type": "string", "description": "Buyer-controlled retained-sample location or custody reference." },
    "reviewer": { "type": "string", "description": "Person or team that reviewed the record." },
    "reviewDate": { "type": "string", "format": "date", "description": "Date the record was reviewed." },
    "status": { "type": "string", "enum": ["draft", "method_incomplete", "ready_for_comparison", "reviewed", "rejected"], "description": "Record status; it is not a product-certification state." },
    "notes": { "type": "string", "description": "Controlled notes, deviations, and unresolved questions." }
  },
  "required": [
    "recordId",
    "materialName",
    "sampleReference",
    "intendedProcess",
    "solutionConcentrationPercentWW",
    "waterTemperatureC",
    "measurementTemperatureC",
    "instrumentModel",
    "spindle",
    "rotationalSpeedRpm",
    "viscosityValue",
    "viscosityUnit",
    "measurementTimestamp",
    "status"
  ]
}
