From cfb3ac5c477294c5aa66eb634453fd9c73ca97c2 Mon Sep 17 00:00:00 2001 From: Travis Gerke Date: Sat, 18 Jul 2026 10:07:28 -0700 Subject: [PATCH 1/6] Model and validate collection exceptions on groups and code list options ItemGroupRef gains the standard ODM CollectionExceptionConditionOID; CodeListItem gains the edc:CollectionExceptionConditionOID vendor extension (option excluded when the condition is true, matching ODM's excluded-when-true polarity). Both round-trip through XML/JSON and the 1.3 upconvert. Validation now resolves the new refs, warns when a referenced condition or method lacks an evaluable jsonata expression (CDISC example files with XPath expressions must still import), errors on circular derivation chains, warns on mandatory derived items, and extends the blinded-reference warnings to derivations and collection exceptions. --- packages/odm/src/dynamic-fields.test.ts | 309 ++++++++++++++++++++++++ packages/odm/src/model.ts | 9 + packages/odm/src/odm13.ts | 2 + packages/odm/src/validate.ts | 179 ++++++++++++-- packages/odm/src/xml.ts | 25 +- 5 files changed, 496 insertions(+), 28 deletions(-) create mode 100644 packages/odm/src/dynamic-fields.test.ts diff --git a/packages/odm/src/dynamic-fields.test.ts b/packages/odm/src/dynamic-fields.test.ts new file mode 100644 index 0000000..9c8e35c --- /dev/null +++ b/packages/odm/src/dynamic-fields.test.ts @@ -0,0 +1,309 @@ +import { describe, expect, it } from "vitest"; +import { parseOdm, serializeOdm, upconvertOdm13Xml } from "./index.js"; +import type { MetaDataVersion } from "./model.js"; +import { validateMetaDataVersion } from "./validate.js"; + +const XML = ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Male + Female + + + + + + + + + + + + \`IT.SEX\` = "M" + + + \`IT.SEX\` = "F" + + + \`IT.SMOKER\` != "Y" + + + \`IT.WT\` != null and \`IT.HT\` > 0 ? \`IT.WT\` / (\`IT.HT\` * \`IT.HT\`) : null + + + +`; + +function fixtureMdv(): MetaDataVersion { + const mdv = parseOdm(XML).study?.metaDataVersions[0]; + if (!mdv) throw new Error("fixture has no metadata version"); + return structuredClone(mdv); +} + +describe("collection exceptions and derivations in the typed model", () => { + const file = parseOdm(XML); + const mdv = file.study?.metaDataVersions[0]; + if (!mdv) throw new Error("fixture has no metadata version"); + + it("parses CollectionExceptionConditionOID on ItemGroupRef", () => { + const form = mdv.itemGroupDefs.find((g) => g.oid === "FO.DF"); + const pregRef = form?.itemGroupRefs.find((r) => r.itemGroupOid === "IG.PREG"); + expect(pregRef?.collectionExceptionConditionOid).toBe("CD.MALE"); + const mainRef = form?.itemGroupRefs.find((r) => r.itemGroupOid === "IG.MAIN"); + expect(mainRef?.collectionExceptionConditionOid).toBeUndefined(); + }); + + it("parses edc:CollectionExceptionConditionOID on CodeListItem", () => { + const list = mdv.codeLists.find((cl) => cl.oid === "CL.PREG"); + expect(list?.items.find((i) => i.codedValue === "NA")?.collectionExceptionConditionOid).toBe( + "CD.FEMALE", + ); + expect( + list?.items.find((i) => i.codedValue === "NEG")?.collectionExceptionConditionOid, + ).toBeUndefined(); + }); + + it("round-trips through XML with both attributes", () => { + const xml = serializeOdm(file, "xml"); + expect(xml).toContain('CollectionExceptionConditionOID="CD.MALE"'); + expect(xml).toContain('edc:CollectionExceptionConditionOID="CD.FEMALE"'); + expect(parseOdm(xml)).toEqual(file); + }); + + it("round-trips through JSON", () => { + expect(parseOdm(serializeOdm(file, "json"))).toEqual(file); + }); + + it("validates cleanly", () => { + expect(validateMetaDataVersion(mdv).filter((i) => i.severity === "error")).toEqual([]); + }); +}); + +describe("ODM 1.3 upconvert", () => { + it("carries CollectionExceptionConditionOID on ItemGroupRef through", () => { + const xml13 = ` + + Legacy + + + + + + + + + + + + + \`IT.A\` = "X" + + + + `; + const { file } = upconvertOdm13Xml(xml13); + const form = file.study?.metaDataVersions[0]?.itemGroupDefs.find((g) => g.oid === "FO.A"); + expect(form?.itemGroupRefs[0]?.collectionExceptionConditionOid).toBe("CD.SKIP"); + }); +}); + +describe("validation of dynamic-field constructs", () => { + const errorsOf = (mdv: MetaDataVersion) => + validateMetaDataVersion(mdv).filter((i) => i.severity === "error"); + const warningsOf = (mdv: MetaDataVersion) => + validateMetaDataVersion(mdv).filter((i) => i.severity === "warning"); + + it("errors when an ItemGroupRef collection exception does not resolve", () => { + const mdv = fixtureMdv(); + const form = mdv.itemGroupDefs.find((g) => g.oid === "FO.DF"); + const ref = form?.itemGroupRefs.find((r) => r.itemGroupOid === "IG.PREG"); + if (!ref) throw new Error("fixture ref missing"); + ref.collectionExceptionConditionOid = "CD.MISSING"; + expect(errorsOf(mdv)).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + path: "ItemGroupDef[FO.DF]", + message: expect.stringContaining("CD.MISSING"), + }), + ]), + ); + }); + + it("errors when a CodeListItem collection exception does not resolve", () => { + const mdv = fixtureMdv(); + const item = mdv.codeLists + .find((cl) => cl.oid === "CL.PREG") + ?.items.find((i) => i.codedValue === "NA"); + if (!item) throw new Error("fixture code list item missing"); + item.collectionExceptionConditionOid = "CD.MISSING"; + expect(errorsOf(mdv)).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + path: "CodeList[CL.PREG]", + message: expect.stringContaining("CD.MISSING"), + }), + ]), + ); + }); + + it("warns when a referenced collection exception has no jsonata expression", () => { + const mdv = fixtureMdv(); + const condition = mdv.conditionDefs.find((c) => c.oid === "CD.NONSMOKER"); + if (!condition) throw new Error("fixture condition missing"); + condition.formalExpressions = [{ context: "xpath", code: "IT.SMOKER != 'Y'" }]; + expect(warningsOf(mdv)).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + path: "ConditionDef[CD.NONSMOKER]", + message: expect.stringContaining("will not be enforced"), + }), + ]), + ); + }); + + it("warns when a referenced method has no jsonata expression", () => { + const mdv = fixtureMdv(); + const method = mdv.methodDefs.find((m) => m.oid === "MET.BMI"); + if (!method) throw new Error("fixture method missing"); + method.formalExpressions = []; + expect(warningsOf(mdv)).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + path: "MethodDef[MET.BMI]", + message: expect.stringContaining("will never compute"), + }), + ]), + ); + }); + + it("does not warn about unreferenced conditions (plain edit checks are vetted elsewhere)", () => { + const mdv = fixtureMdv(); + mdv.conditionDefs.push({ + oid: "CHK.LOOSE", + name: "Unreferenced", + formalExpressions: [], + }); + expect(validateMetaDataVersion(mdv).filter((i) => i.path.includes("CHK.LOOSE"))).toEqual([]); + }); + + it("errors on a circular derivation chain", () => { + const mdv = fixtureMdv(); + const main = mdv.itemGroupDefs.find((g) => g.oid === "IG.MAIN"); + if (!main) throw new Error("fixture group missing"); + mdv.itemDefs.push({ oid: "IT.LOOP", name: "Loop", dataType: "float" }); + main.itemRefs.push({ itemOid: "IT.LOOP", methodOid: "MET.LOOP" }); + mdv.methodDefs.push({ + oid: "MET.LOOP", + name: "Depends on BMI", + type: "Computation", + formalExpressions: [{ context: "jsonata", code: "`IT.BMI` * 2" }], + }); + const bmiMethod = mdv.methodDefs.find((m) => m.oid === "MET.BMI"); + if (!bmiMethod) throw new Error("fixture method missing"); + bmiMethod.formalExpressions = [{ context: "jsonata", code: "`IT.LOOP` / 2" }]; + expect(errorsOf(mdv)).toEqual( + expect.arrayContaining([ + expect.objectContaining({ message: expect.stringContaining("circular derivation chain") }), + ]), + ); + }); + + it("allows acyclic derivation chains", () => { + const mdv = fixtureMdv(); + const main = mdv.itemGroupDefs.find((g) => g.oid === "IG.MAIN"); + if (!main) throw new Error("fixture group missing"); + mdv.itemDefs.push({ oid: "IT.BMICAT", name: "BMI category", dataType: "text" }); + main.itemRefs.push({ itemOid: "IT.BMICAT", methodOid: "MET.BMICAT" }); + mdv.methodDefs.push({ + oid: "MET.BMICAT", + name: "Category from BMI", + type: "Computation", + formalExpressions: [{ context: "jsonata", code: '`IT.BMI` >= 30 ? "obese" : "other"' }], + }); + expect(errorsOf(mdv)).toEqual([]); + }); + + it("warns when a derived item is marked mandatory", () => { + const mdv = fixtureMdv(); + const main = mdv.itemGroupDefs.find((g) => g.oid === "IG.MAIN"); + const ref = main?.itemRefs.find((r) => r.itemOid === "IT.BMI"); + if (!ref) throw new Error("fixture ref missing"); + ref.mandatory = "Yes"; + expect(warningsOf(mdv)).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + path: "ItemGroupDef[IG.MAIN]", + message: expect.stringContaining("IT.BMI"), + }), + ]), + ); + }); + + it("warns when a derivation reads a blinded item", () => { + const mdv = fixtureMdv(); + const wt = mdv.itemDefs.find((i) => i.oid === "IT.WT"); + if (!wt) throw new Error("fixture item missing"); + wt.blinded = true; + expect(warningsOf(mdv)).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + path: "MethodDef[MET.BMI]", + message: expect.stringContaining("blind the derived item"), + }), + ]), + ); + }); + + it("warns when a collection exception reads a blinded item", () => { + const mdv = fixtureMdv(); + const sex = mdv.itemDefs.find((i) => i.oid === "IT.SEX"); + if (!sex) throw new Error("fixture item missing"); + sex.blinded = true; + const warnings = warningsOf(mdv); + expect(warnings).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + path: "ConditionDef[CD.MALE]", + message: expect.stringContaining("visibility changes can reveal blinded values"), + }), + ]), + ); + }); +}); diff --git a/packages/odm/src/model.ts b/packages/odm/src/model.ts index 20c7cd5..a5e5b90 100644 --- a/packages/odm/src/model.ts +++ b/packages/odm/src/model.ts @@ -26,6 +26,9 @@ export const itemGroupRefSchema = z.object({ itemGroupOid: z.string().min(1), mandatory: z.string().optional(), orderNumber: z.number().int().optional(), + // Skip logic: the group (and all its descendants) is not collected when + // the referenced ConditionDef evaluates true. + collectionExceptionConditionOid: z.string().optional(), extra, }); export type ItemGroupRef = z.infer; @@ -94,6 +97,12 @@ export type ItemDef = z.infer; export const codeListItemSchema = z.object({ codedValue: z.string(), decode: z.array(translatedTextSchema).optional(), + // Vendor extension (edc:CollectionExceptionConditionOID in XML): the option + // is excluded from the rendered choice list when the referenced ConditionDef + // evaluates true — same excluded-when-true polarity as ODM's + // CollectionExceptionCondition on ItemRef. Plain-ODM consumers ignore the + // attribute and see the full option list. + collectionExceptionConditionOid: z.string().optional(), extra, }); export type CodeListItem = z.infer; diff --git a/packages/odm/src/odm13.ts b/packages/odm/src/odm13.ts index 0b574ee..1f731b0 100644 --- a/packages/odm/src/odm13.ts +++ b/packages/odm/src/odm13.ts @@ -70,10 +70,12 @@ function convertItemGroupRefs(node: XNode): ItemGroupRef[] { const n = asNode(raw); const mandatory = attr(n, "Mandatory"); const orderNumber = intAttr(n, "OrderNumber"); + const cec = attr(n, "CollectionExceptionConditionOID"); return { itemGroupOid: requireAttr(n, "ItemGroupOID", "ItemGroupRef"), ...(mandatory !== undefined ? { mandatory } : {}), ...(orderNumber !== undefined ? { orderNumber } : {}), + ...(cec !== undefined ? { collectionExceptionConditionOid: cec } : {}), }; }); } diff --git a/packages/odm/src/validate.ts b/packages/odm/src/validate.ts index 96c7e71..2de3491 100644 --- a/packages/odm/src/validate.ts +++ b/packages/odm/src/validate.ts @@ -54,9 +54,14 @@ export function validateMetaDataVersion(mdv: MetaDataVersion): ValidationIssue[] const referencedItemGroups = new Set(); const referencedItems = new Set(); + // ConditionDefs referenced as collection exceptions (item, group, or code + // list option level) and MethodDefs referenced by ItemRefs: these must be + // evaluable at runtime, so they get stricter checks below. + const cecReferencedOids = new Set(); + const methodReferencedOids = new Set(); const checkItemGroupRefs = ( - refs: { itemGroupOid: string; collectionExceptionConditionOid?: string }[], + refs: { itemGroupOid: string; collectionExceptionConditionOid?: string | undefined }[], from: string, ) => { for (const ref of refs) { @@ -68,6 +73,16 @@ export function validateMetaDataVersion(mdv: MetaDataVersion): ValidationIssue[] message: `ItemGroupRef → "${ref.itemGroupOid}" does not resolve to an ItemGroupDef`, }); } + if (ref.collectionExceptionConditionOid) { + cecReferencedOids.add(ref.collectionExceptionConditionOid); + if (!conditionOids.has(ref.collectionExceptionConditionOid)) { + issues.push({ + severity: "error", + path: from, + message: `CollectionExceptionConditionOID → "${ref.collectionExceptionConditionOid}" does not resolve to a ConditionDef`, + }); + } + } } }; @@ -86,22 +101,32 @@ export function validateMetaDataVersion(mdv: MetaDataVersion): ValidationIssue[] message: `ItemRef → "${ref.itemOid}" does not resolve to an ItemDef`, }); } - if ( - ref.collectionExceptionConditionOid && - !conditionOids.has(ref.collectionExceptionConditionOid) - ) { - issues.push({ - severity: "error", - path: `ItemGroupDef[${ig.oid}]`, - message: `CollectionExceptionConditionOID → "${ref.collectionExceptionConditionOid}" does not resolve to a ConditionDef`, - }); + if (ref.collectionExceptionConditionOid) { + cecReferencedOids.add(ref.collectionExceptionConditionOid); + if (!conditionOids.has(ref.collectionExceptionConditionOid)) { + issues.push({ + severity: "error", + path: `ItemGroupDef[${ig.oid}]`, + message: `CollectionExceptionConditionOID → "${ref.collectionExceptionConditionOid}" does not resolve to a ConditionDef`, + }); + } } - if (ref.methodOid && !methodOids.has(ref.methodOid)) { - issues.push({ - severity: "error", - path: `ItemGroupDef[${ig.oid}]`, - message: `MethodOID → "${ref.methodOid}" does not resolve to a MethodDef`, - }); + if (ref.methodOid) { + methodReferencedOids.add(ref.methodOid); + if (!methodOids.has(ref.methodOid)) { + issues.push({ + severity: "error", + path: `ItemGroupDef[${ig.oid}]`, + message: `MethodOID → "${ref.methodOid}" does not resolve to a MethodDef`, + }); + } + if (ref.mandatory === "Yes") { + issues.push({ + severity: "warning", + path: `ItemGroupDef[${ig.oid}]`, + message: `ItemRef → "${ref.itemOid}" is derived (MethodOID) but Mandatory="Yes": derived items are system-written and cannot be entered`, + }); + } } } } @@ -116,6 +141,93 @@ export function validateMetaDataVersion(mdv: MetaDataVersion): ValidationIssue[] } } + for (const cl of mdv.codeLists) { + for (const clItem of cl.items) { + if (!clItem.collectionExceptionConditionOid) continue; + cecReferencedOids.add(clItem.collectionExceptionConditionOid); + if (!conditionOids.has(clItem.collectionExceptionConditionOid)) { + issues.push({ + severity: "error", + path: `CodeList[${cl.oid}]`, + message: `CodeListItem[${clItem.codedValue}] CollectionExceptionConditionOID → "${clItem.collectionExceptionConditionOid}" does not resolve to a ConditionDef`, + }); + } + } + } + + // Collection exceptions and derivations only execute when they carry a + // jsonata expression. Files authored elsewhere (e.g. CDISC examples with + // XPath expressions) must still import, so an unevaluable construct is a + // warning: the field is simply always collected / never computed. + const jsonataExpression = (def: { + formalExpressions: { context?: string | undefined; code: string }[]; + }) => def.formalExpressions.find((e) => e.context === "jsonata")?.code; + for (const condition of mdv.conditionDefs) { + if (cecReferencedOids.has(condition.oid) && jsonataExpression(condition) === undefined) { + issues.push({ + severity: "warning", + path: `ConditionDef[${condition.oid}]`, + message: + "is referenced as a collection exception but has no jsonata FormalExpression: the exception will not be enforced at runtime", + }); + } + } + for (const method of mdv.methodDefs) { + if (methodReferencedOids.has(method.oid) && jsonataExpression(method) === undefined) { + issues.push({ + severity: "warning", + path: `MethodDef[${method.oid}]`, + message: + "is referenced by an ItemRef but has no jsonata FormalExpression: the derived value will never compute", + }); + } + } + + // A derivation chain that feeds itself can never settle; the runtime drops + // cyclic derivations defensively, so surface the cycle at publish time. + // Dependencies are found by scanning expressions for backtick-quoted OIDs + // of other derived items (the ADR-0007 referencing convention). + const methodsByOid = new Map(mdv.methodDefs.map((m) => [m.oid, m])); + const derivedExpressions = new Map(); + for (const ig of mdv.itemGroupDefs) { + for (const ref of ig.itemRefs) { + if (!ref.methodOid) continue; + const method = methodsByOid.get(ref.methodOid); + const code = method ? jsonataExpression(method) : undefined; + if (code === undefined) continue; + derivedExpressions.set(ref.itemOid, [...(derivedExpressions.get(ref.itemOid) ?? []), code]); + } + } + const derivedDeps = new Map(); + for (const [itemOid, codes] of derivedExpressions) { + derivedDeps.set( + itemOid, + [...derivedExpressions.keys()].filter( + (oid) => oid !== itemOid && codes.some((code) => code.includes(oid)), + ), + ); + } + { + const visiting = new Set(); + const done = new Set(); + const visitDerived = (oid: string, trail: string[]): void => { + if (visiting.has(oid)) { + issues.push({ + severity: "error", + path: `ItemDef[${oid}]`, + message: `circular derivation chain: ${[...trail, oid].join(" → ")}`, + }); + return; + } + if (done.has(oid)) return; + visiting.add(oid); + for (const dep of derivedDeps.get(oid) ?? []) visitDerived(dep, [...trail, oid]); + visiting.delete(oid); + done.add(oid); + }; + for (const oid of derivedDeps.keys()) visitDerived(oid, []); + } + // Cycles in nested item groups would make form rendering diverge. const visiting = new Set(); const visited = new Set(); @@ -164,17 +276,32 @@ export function validateMetaDataVersion(mdv: MetaDataVersion): ValidationIssue[] // items derived from blinded ones leak by construction. const blindedOids = new Set(mdv.itemDefs.filter((i) => i.blinded).map((i) => i.oid)); if (blindedOids.size > 0) { + const blindedIn = (def: { formalExpressions: { code: string }[] }) => + [...blindedOids].filter((oid) => def.formalExpressions.some((e) => e.code.includes(oid))); for (const condition of mdv.conditionDefs) { - const referenced = [...blindedOids].filter((oid) => - condition.formalExpressions.some((e) => e.code.includes(oid)), - ); - if (referenced.length > 0) { - issues.push({ - severity: "warning", - path: `ConditionDef[${condition.oid}]`, - message: `references blinded item${referenced.length === 1 ? "" : "s"} ${referenced.join(", ")}: ensure the check message does not reveal blinded values`, - }); - } + const referenced = blindedIn(condition); + if (referenced.length === 0) continue; + const plural = referenced.length === 1 ? "" : "s"; + // Collection exceptions leak differently from edit checks: toggling a + // field's visibility on a blinded value reveals that value to anyone + // watching the form, regardless of message wording. + issues.push({ + severity: "warning", + path: `ConditionDef[${condition.oid}]`, + message: cecReferencedOids.has(condition.oid) + ? `collection exception references blinded item${plural} ${referenced.join(", ")}: visibility changes can reveal blinded values to blinded roles` + : `references blinded item${plural} ${referenced.join(", ")}: ensure the check message does not reveal blinded values`, + }); + } + for (const method of mdv.methodDefs) { + if (!methodReferencedOids.has(method.oid)) continue; + const referenced = blindedIn(method); + if (referenced.length === 0) continue; + issues.push({ + severity: "warning", + path: `MethodDef[${method.oid}]`, + message: `derives from blinded item${referenced.length === 1 ? "" : "s"} ${referenced.join(", ")}: a non-blinded derived item leaks blinded data — blind the derived item too`, + }); } } diff --git a/packages/odm/src/xml.ts b/packages/odm/src/xml.ts index 53ef052..65300b1 100644 --- a/packages/odm/src/xml.ts +++ b/packages/odm/src/xml.ts @@ -122,11 +122,17 @@ function parseItemGroupRefs(node: XNode): ItemGroupRef[] { const n = asNode(raw); const mandatory = attr(n, "Mandatory"); const orderNumber = intAttr(n, "OrderNumber"); - const extra = collectExtra(n, ["ItemGroupOID", "Mandatory", "OrderNumber"], []); + const cec = attr(n, "CollectionExceptionConditionOID"); + const extra = collectExtra( + n, + ["ItemGroupOID", "Mandatory", "OrderNumber", "CollectionExceptionConditionOID"], + [], + ); return { itemGroupOid: requireAttr(n, "ItemGroupOID", "ItemGroupRef"), ...(mandatory !== undefined ? { mandatory } : {}), ...(orderNumber !== undefined ? { orderNumber } : {}), + ...(cec !== undefined ? { collectionExceptionConditionOid: cec } : {}), ...(extra ? { extra } : {}), }; }); @@ -257,10 +263,16 @@ function parseCodeList(raw: unknown): CodeList { const items = ((n.CodeListItem as unknown[]) ?? []).map((rawItem): CodeListItem => { const item = asNode(rawItem); const decode = parseTranslatedTexts(item.Decode); - const extra = collectExtra(item, ["CodedValue"], ["Decode"]); + const cec = attr(item, "edc:CollectionExceptionConditionOID"); + const extra = collectExtra( + item, + ["CodedValue", "edc:CollectionExceptionConditionOID"], + ["Decode"], + ); return { codedValue: requireAttr(item, "CodedValue", "CodeListItem"), ...(decode ? { decode } : {}), + ...(cec !== undefined ? { collectionExceptionConditionOid: cec } : {}), ...(extra ? { extra } : {}), }; }); @@ -432,6 +444,9 @@ function buildItemGroupRefs(refs: ItemGroupRef[]) { "@_ItemGroupOID": ref.itemGroupOid, ...(ref.mandatory !== undefined ? { "@_Mandatory": ref.mandatory } : {}), ...(ref.orderNumber !== undefined ? { "@_OrderNumber": String(ref.orderNumber) } : {}), + ...(ref.collectionExceptionConditionOid !== undefined + ? { "@_CollectionExceptionConditionOID": ref.collectionExceptionConditionOid } + : {}), }, ref.extra, ), @@ -575,6 +590,12 @@ export function serializeOdmXml(file: OdmFile): string { withExtra( { "@_CodedValue": item.codedValue, + ...(item.collectionExceptionConditionOid !== undefined + ? { + "@_edc:CollectionExceptionConditionOID": + item.collectionExceptionConditionOid, + } + : {}), ...(item.decode ? { Decode: buildTranslatedTexts(item.decode) } : {}), From 50662b9c5bd4c679cb87223990c9a66cfc88aab8 Mon Sep 17 00:00:00 2001 From: Travis Gerke Date: Sat, 18 Jul 2026 10:13:21 -0700 Subject: [PATCH 2/6] Evaluate derivations, skip logic, and dependent options in packages/rules MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit evaluateFormState() runs the full dynamic pipeline over a form's rows, occurrence-aware like runChecksOverRows (which now shares its row bucketing): derivations in dependency order, then collection exceptions (item- and group-level, group skips cascading to descendants), then skipped values nulled in the evaluation context only, then option exclusions, then edit checks. Derivations see raw values; skip conditions see derived values — the one-way order rules out skip/derive circularity. Stored values persisting in skipped fields surface as residual findings under synthetic SKIP.. check OIDs; skipped derived fields converge to null through the derivation write path instead. Cyclic derivations are dropped defensively (publish-time validation already errors on them). compileEditChecks now also excludes ConditionDefs referenced as group-level or option-level collection exceptions — previously a group-level skip condition would wrongly fire as an edit check. --- packages/rules/src/dynamic.test.ts | 348 +++++++++++++++++++ packages/rules/src/index.ts | 532 ++++++++++++++++++++++++++++- 2 files changed, 868 insertions(+), 12 deletions(-) create mode 100644 packages/rules/src/dynamic.test.ts diff --git a/packages/rules/src/dynamic.test.ts b/packages/rules/src/dynamic.test.ts new file mode 100644 index 0000000..ab7bf31 --- /dev/null +++ b/packages/rules/src/dynamic.test.ts @@ -0,0 +1,348 @@ +import type { MetaDataVersion } from "@edc-core/odm"; +import { describe, expect, it } from "vitest"; +import { + compileDerivations, + compileEditChecks, + evaluateFormState, + fieldKey, + type ItemValueRow, + skipCheckOid, +} from "./index.js"; + +const mdv: MetaDataVersion = { + oid: "MDV.1", + studyEventDefs: [], + itemGroupDefs: [ + { + oid: "IG.DM", + name: "Demographics", + itemRefs: [ + { itemOid: "IT.SEX" }, + { itemOid: "IT.SMOKER" }, + { itemOid: "IT.CIGS", collectionExceptionConditionOid: "CD.NONSMOKER" }, + { itemOid: "IT.WT" }, + { itemOid: "IT.HT" }, + { itemOid: "IT.BMI", methodOid: "MET.BMI" }, + { itemOid: "IT.INT" }, + ], + itemGroupRefs: [{ itemGroupOid: "IG.PREG", collectionExceptionConditionOid: "CD.MALE" }], + }, + { + oid: "IG.PREG", + name: "Pregnancy", + itemRefs: [{ itemOid: "IT.PREG" }], + itemGroupRefs: [{ itemGroupOid: "IG.PREGDET" }], + }, + { + oid: "IG.PREGDET", + name: "Pregnancy detail", + itemRefs: [{ itemOid: "IT.PREGDT" }], + itemGroupRefs: [], + }, + { + oid: "IG.VS", + name: "Vitals", + repeating: "Simple", + itemRefs: [ + { itemOid: "IT.HRMEAS" }, + { itemOid: "IT.HR", collectionExceptionConditionOid: "CD.HRND" }, + { itemOid: "IT.HRUNIT" }, + ], + itemGroupRefs: [], + }, + ], + itemDefs: [ + { oid: "IT.SEX", name: "Sex", dataType: "text" }, + { oid: "IT.SMOKER", name: "Smoker", dataType: "text" }, + { oid: "IT.CIGS", name: "Cigarettes per day", dataType: "integer" }, + { oid: "IT.WT", name: "Weight (kg)", dataType: "float" }, + { oid: "IT.HT", name: "Height (m)", dataType: "float" }, + { oid: "IT.BMI", name: "BMI", dataType: "float" }, + { + oid: "IT.INT", + name: "Exercise intensity", + dataType: "text", + codeListRef: { codeListOid: "CL.INT" }, + }, + { oid: "IT.PREG", name: "Pregnancy test", dataType: "text" }, + { oid: "IT.PREGDT", name: "Pregnancy test date", dataType: "text" }, + { oid: "IT.HRMEAS", name: "HR measured", dataType: "boolean" }, + { oid: "IT.HR", name: "Heart rate", dataType: "integer" }, + { + oid: "IT.HRUNIT", + name: "HR unit", + dataType: "text", + codeListRef: { codeListOid: "CL.HRUNIT" }, + }, + ], + codeLists: [ + { + oid: "CL.INT", + name: "Intensity", + dataType: "text", + items: [ + { codedValue: "MILD" }, + { codedValue: "VIGOROUS", collectionExceptionConditionOid: "CD.OBESE" }, + ], + }, + { + oid: "CL.HRUNIT", + name: "HR unit", + dataType: "text", + items: [ + { codedValue: "BPM" }, + { codedValue: "OTHER", collectionExceptionConditionOid: "CD.TACHY" }, + ], + }, + ], + conditionDefs: [ + { + oid: "CD.NONSMOKER", + name: "Not a smoker", + formalExpressions: [{ context: "jsonata", code: '`IT.SMOKER` != "Y"' }], + }, + { + oid: "CD.MALE", + name: "Subject is male", + formalExpressions: [{ context: "jsonata", code: '`IT.SEX` = "M"' }], + }, + { + oid: "CD.HRND", + name: "HR not measured", + formalExpressions: [{ context: "jsonata", code: "`IT.HRMEAS` = false" }], + }, + { + oid: "CD.OBESE", + name: "BMI is 30 or above", + formalExpressions: [{ context: "jsonata", code: "`IT.BMI` != null and `IT.BMI` >= 30" }], + }, + { + oid: "CD.TACHY", + name: "HR above 100", + formalExpressions: [{ context: "jsonata", code: "`IT.HR` != null and `IT.HR` > 100" }], + }, + { + oid: "CHECK.CIGS", + name: "Implausible cigarette count", + description: [{ lang: "en", text: "Cigarettes per day above 40" }], + formalExpressions: [{ context: "jsonata", code: "`IT.CIGS` != null and `IT.CIGS` > 40" }], + }, + { + oid: "CHECK.BMI", + name: "Implausible BMI", + description: [{ lang: "en", text: "BMI above 60" }], + formalExpressions: [{ context: "jsonata", code: "`IT.BMI` != null and `IT.BMI` > 60" }], + }, + ], + methodDefs: [ + { + oid: "MET.BMI", + name: "BMI from weight and height", + type: "Computation", + formalExpressions: [ + { + context: "jsonata", + code: "`IT.WT` != null and `IT.HT` != null and `IT.HT` > 0 ? `IT.WT` / (`IT.HT` * `IT.HT`) : null", + }, + ], + }, + ], +}; + +const row = ( + itemGroupOid: string, + itemGroupRepeatKey: number, + itemOid: string, + value: string | null, +): ItemValueRow => ({ itemGroupOid, itemGroupRepeatKey, itemOid, value }); + +describe("compileEditChecks with dynamic constructs", () => { + it("excludes group-level and option-level collection exceptions from checks", () => { + expect(compileEditChecks(mdv).map((c) => c.oid)).toEqual(["CHECK.CIGS", "CHECK.BMI"]); + }); +}); + +describe("evaluateFormState: derivations", () => { + it("computes derived values and exposes them to checks", async () => { + const state = await evaluateFormState(mdv, [ + row("IG.DM", 1, "IT.SEX", "M"), + row("IG.DM", 1, "IT.WT", "200"), + row("IG.DM", 1, "IT.HT", "1.5"), + ]); + const bmi = state.derived.find((d) => d.itemOid === "IT.BMI"); + expect(bmi?.value).toBe(String(200 / (1.5 * 1.5))); + // BMI ≈ 88.9 — the edit check on the derived value fires. + expect(state.findings.map((f) => f.checkOid)).toContain("CHECK.BMI"); + }); + + it("yields null when inputs are missing or the expression fails", async () => { + const state = await evaluateFormState(mdv, [row("IG.DM", 1, "IT.WT", "80")]); + expect(state.derived.find((d) => d.itemOid === "IT.BMI")?.value).toBeNull(); + + const broken: MetaDataVersion = structuredClone(mdv); + const method = broken.methodDefs.find((m) => m.oid === "MET.BMI"); + if (!method?.formalExpressions[0]) throw new Error("fixture"); + method.formalExpressions[0].code = "$noSuchFunction(1)"; + const brokenState = await evaluateFormState(broken, [ + row("IG.DM", 1, "IT.WT", "80"), + row("IG.DM", 1, "IT.HT", "1.8"), + ]); + expect(brokenState.derived.find((d) => d.itemOid === "IT.BMI")?.value).toBeNull(); + }); + + it("orders chained derivations and drops cycles defensively", () => { + const chained: MetaDataVersion = structuredClone(mdv); + const dm = chained.itemGroupDefs.find((g) => g.oid === "IG.DM"); + if (!dm) throw new Error("fixture"); + chained.itemDefs.push({ oid: "IT.BMICAT", name: "BMI category", dataType: "text" }); + // Declared before IT.BMI's ref order in methods list; topo order must win. + dm.itemRefs.unshift({ itemOid: "IT.BMICAT", methodOid: "MET.BMICAT" }); + chained.methodDefs.push({ + oid: "MET.BMICAT", + name: "Category", + type: "Computation", + formalExpressions: [ + { context: "jsonata", code: '`IT.BMI` = null ? null : `IT.BMI` >= 30 ? "obese" : "other"' }, + ], + }); + expect(compileDerivations(chained).map((d) => d.itemOid)).toEqual(["IT.BMI", "IT.BMICAT"]); + + const cyclic = structuredClone(chained); + const bmiMethod = cyclic.methodDefs.find((m) => m.oid === "MET.BMI"); + if (!bmiMethod?.formalExpressions[0]) throw new Error("fixture"); + bmiMethod.formalExpressions[0].code = "`IT.BMICAT` != null ? 1 : 0"; + expect(compileDerivations(cyclic)).toEqual([]); + }); + + it("computes chained derivations through the pipeline", async () => { + const chained: MetaDataVersion = structuredClone(mdv); + const dm = chained.itemGroupDefs.find((g) => g.oid === "IG.DM"); + if (!dm) throw new Error("fixture"); + chained.itemDefs.push({ oid: "IT.BMICAT", name: "BMI category", dataType: "text" }); + dm.itemRefs.unshift({ itemOid: "IT.BMICAT", methodOid: "MET.BMICAT" }); + chained.methodDefs.push({ + oid: "MET.BMICAT", + name: "Category", + type: "Computation", + formalExpressions: [ + { context: "jsonata", code: '`IT.BMI` = null ? null : `IT.BMI` >= 30 ? "obese" : "other"' }, + ], + }); + const state = await evaluateFormState(chained, [ + row("IG.DM", 1, "IT.WT", "100"), + row("IG.DM", 1, "IT.HT", "1.6"), + ]); + expect(state.derived.find((d) => d.itemOid === "IT.BMICAT")?.value).toBe("obese"); + }); +}); + +describe("evaluateFormState: skip logic", () => { + it("skips an item when its collection exception is true and nulls it for checks", async () => { + const state = await evaluateFormState(mdv, [ + row("IG.DM", 1, "IT.SMOKER", "N"), + row("IG.DM", 1, "IT.CIGS", "60"), + ]); + expect(state.skippedFields.has(fieldKey("IG.DM", 1, "IT.CIGS"))).toBe(true); + // The stored 60 would fire CHECK.CIGS, but skipped values are nulled first. + expect(state.findings).toEqual([]); + // The stored value is flagged as a residual instead. + expect(state.residuals).toEqual([ + expect.objectContaining({ + checkOid: skipCheckOid("CD.NONSMOKER", "IT.CIGS"), + itemGroupOid: "IG.DM", + itemOid: "IT.CIGS", + repeatKey: null, + }), + ]); + }); + + it("collects the item and fires checks when the exception is false", async () => { + const state = await evaluateFormState(mdv, [ + row("IG.DM", 1, "IT.SMOKER", "Y"), + row("IG.DM", 1, "IT.CIGS", "60"), + ]); + expect(state.skippedFields.has(fieldKey("IG.DM", 1, "IT.CIGS"))).toBe(false); + expect(state.findings.map((f) => f.checkOid)).toEqual(["CHECK.CIGS"]); + expect(state.residuals).toEqual([]); + }); + + it("cascades a group-level skip to nested groups", async () => { + const state = await evaluateFormState(mdv, [ + row("IG.DM", 1, "IT.SEX", "M"), + row("IG.PREG", 1, "IT.PREG", "NEG"), + ]); + expect(state.skippedFields.has(fieldKey("IG.PREG", 1, "IT.PREG"))).toBe(true); + expect(state.skippedFields.has(fieldKey("IG.PREGDET", 1, "IT.PREGDT"))).toBe(true); + expect(state.residuals.map((r) => r.itemOid)).toEqual(["IT.PREG"]); + }); + + it("does not skip the group when the exception is false", async () => { + const state = await evaluateFormState(mdv, [row("IG.DM", 1, "IT.SEX", "F")]); + expect([...state.skippedFields].filter((k) => k.startsWith("IG.PREG"))).toEqual([]); + }); + + it("evaluates item-level skips per occurrence in repeating groups", async () => { + const state = await evaluateFormState(mdv, [ + row("IG.VS", 1, "IT.HRMEAS", "true"), + row("IG.VS", 1, "IT.HR", "72"), + row("IG.VS", 2, "IT.HRMEAS", "false"), + row("IG.VS", 2, "IT.HR", "88"), + ]); + expect(state.skippedFields.has(fieldKey("IG.VS", 1, "IT.HR"))).toBe(false); + expect(state.skippedFields.has(fieldKey("IG.VS", 2, "IT.HR"))).toBe(true); + expect(state.residuals).toEqual([expect.objectContaining({ itemOid: "IT.HR", repeatKey: 2 })]); + }); + + it("nulls a skipped derived field instead of flagging a residual", async () => { + const withSkippedBmi: MetaDataVersion = structuredClone(mdv); + const ref = withSkippedBmi.itemGroupDefs + .find((g) => g.oid === "IG.DM") + ?.itemRefs.find((r) => r.itemOid === "IT.BMI"); + if (!ref) throw new Error("fixture"); + ref.collectionExceptionConditionOid = "CD.MALE"; + const state = await evaluateFormState(withSkippedBmi, [ + row("IG.DM", 1, "IT.SEX", "M"), + row("IG.DM", 1, "IT.WT", "200"), + row("IG.DM", 1, "IT.HT", "1.5"), + row("IG.DM", 1, "IT.BMI", "88.9"), + ]); + expect(state.derived.find((d) => d.itemOid === "IT.BMI")?.value).toBeNull(); + expect(state.residuals).toEqual([]); + // Nulled before checks: CHECK.BMI must not fire. + expect(state.findings).toEqual([]); + }); +}); + +describe("evaluateFormState: dependent options", () => { + it("excludes options based on another field, including derived values", async () => { + const state = await evaluateFormState(mdv, [ + row("IG.DM", 1, "IT.WT", "100"), + row("IG.DM", 1, "IT.HT", "1.6"), + ]); + // BMI ≈ 39.1 → VIGOROUS excluded for the intensity field. + expect(state.excludedOptions.get(fieldKey("IG.DM", 1, "IT.INT"))).toEqual( + new Set(["VIGOROUS"]), + ); + }); + + it("keeps all options when the condition is false", async () => { + const state = await evaluateFormState(mdv, [ + row("IG.DM", 1, "IT.WT", "60"), + row("IG.DM", 1, "IT.HT", "1.8"), + ]); + expect(state.excludedOptions.get(fieldKey("IG.DM", 1, "IT.INT"))).toBeUndefined(); + }); + + it("evaluates option exclusions per occurrence", async () => { + const state = await evaluateFormState(mdv, [ + row("IG.VS", 1, "IT.HRMEAS", "true"), + row("IG.VS", 1, "IT.HR", "80"), + row("IG.VS", 2, "IT.HRMEAS", "true"), + row("IG.VS", 2, "IT.HR", "120"), + ]); + expect(state.excludedOptions.get(fieldKey("IG.VS", 1, "IT.HRUNIT"))).toBeUndefined(); + expect(state.excludedOptions.get(fieldKey("IG.VS", 2, "IT.HRUNIT"))).toEqual( + new Set(["OTHER"]), + ); + }); +}); diff --git a/packages/rules/src/index.ts b/packages/rules/src/index.ts index c913d2c..4a8ae26 100644 --- a/packages/rules/src/index.ts +++ b/packages/rules/src/index.ts @@ -69,14 +69,24 @@ export function compileCheck(input: { }; } -/** Extract the edit checks defined in a study build. */ -export function compileEditChecks(mdv: MetaDataVersion): CompiledCheck[] { - const collectionExceptionOids = new Set( - mdv.itemGroupDefs - .flatMap((group) => group.itemRefs) +/** ConditionDefs referenced as collection logic at any level (item, group, or + * code list option): never edit checks. */ +function collectionExceptionConditionOids(mdv: MetaDataVersion): Set { + return new Set( + [ + ...mdv.itemGroupDefs.flatMap((group) => group.itemRefs), + ...mdv.itemGroupDefs.flatMap((group) => group.itemGroupRefs), + ...mdv.studyEventDefs.flatMap((se) => se.itemGroupRefs), + ...mdv.codeLists.flatMap((cl) => cl.items), + ] .map((ref) => ref.collectionExceptionConditionOid) .filter((oid): oid is string => oid !== undefined), ); +} + +/** Extract the edit checks defined in a study build. */ +export function compileEditChecks(mdv: MetaDataVersion): CompiledCheck[] { + const collectionExceptionOids = collectionExceptionConditionOids(mdv); const checks: CompiledCheck[] = []; for (const condition of mdv.conditionDefs) { @@ -168,16 +178,20 @@ export function repeatingGroupOids(mdv: MetaDataVersion): Set { * of a repeating group is then evaluated as base + that occurrence's values; * checks that fire there but not at form level are per-occurrence findings. */ -export async function runChecksOverRows( - checks: CompiledCheck[], - mdv: MetaDataVersion, - rows: ItemValueRow[], -): Promise { - if (checks.length === 0) return []; - const repeating = repeatingGroupOids(mdv); +interface RowBuckets { + /** Values from non-repeating groups, shared by every context. */ + base: Record; + /** Values per repeating-group occurrence, keyed by repeat key. */ + byOccurrence: Map>; + /** Repeat keys present per repeating group. */ + occurrencesByGroup: Map>; +} +function bucketRows(mdv: MetaDataVersion, rows: ItemValueRow[]): RowBuckets { + const repeating = repeatingGroupOids(mdv); const base: Record = {}; const byOccurrence = new Map>(); + const occurrencesByGroup = new Map>(); for (const row of rows) { if (repeating.has(row.itemGroupOid)) { let occurrence = byOccurrence.get(row.itemGroupRepeatKey); @@ -186,11 +200,35 @@ export async function runChecksOverRows( byOccurrence.set(row.itemGroupRepeatKey, occurrence); } occurrence[row.itemOid] = row.value; + let keys = occurrencesByGroup.get(row.itemGroupOid); + if (!keys) { + keys = new Set(); + occurrencesByGroup.set(row.itemGroupOid, keys); + } + keys.add(row.itemGroupRepeatKey); } else { base[row.itemOid] = row.value; } } + return { base, byOccurrence, occurrencesByGroup }; +} +export async function runChecksOverRows( + checks: CompiledCheck[], + mdv: MetaDataVersion, + rows: ItemValueRow[], +): Promise { + if (checks.length === 0) return []; + const { base, byOccurrence } = bucketRows(mdv, rows); + return checksOverBuckets(checks, mdv, base, byOccurrence); +} + +async function checksOverBuckets( + checks: CompiledCheck[], + mdv: MetaDataVersion, + base: Record, + byOccurrence: Map>, +): Promise { const findings: OccurrenceFinding[] = []; const baseResults = await runChecks(checks, buildRuleContext(mdv, base)); const firedAtFormLevel = new Set(); @@ -212,3 +250,473 @@ export async function runChecksOverRows( } return findings; } + +// --------------------------------------------------------------------------- +// Dynamic form state (ADR-0014): derivations (MethodDef), collection +// exceptions (skip logic), dependent options, and skip-aware edit checks. +// Evaluation order: derive → skip → null skipped values (context only) → +// option exclusions → edit checks. Derivations see raw (pre-skip) values; +// skip conditions see derived values — one-way ordering, no circularity. +// --------------------------------------------------------------------------- + +/** Address of one field occurrence: `${groupOid}:${repeatKey}:${itemOid}`. + * Non-repeating groups use repeat key 1. */ +export function fieldKey(groupOid: string, repeatKey: number, itemOid: string): string { + return `${groupOid}:${repeatKey}:${itemOid}`; +} + +/** Synthetic checkOid namespace for skip-residual queries; cannot collide + * with ConditionDef OIDs used as edit checks (those are excluded from the + * namespace by convention: SKIP..). */ +export const SKIP_CHECK_PREFIX = "SKIP."; + +export function skipCheckOid(conditionOid: string, itemOid: string): string { + return `${SKIP_CHECK_PREFIX}${conditionOid}.${itemOid}`; +} + +/** A stored value persisting in a field not collected under current + * responses: the site must clear it (audited) or change the controlling + * answer. Raised as a system query, never auto-deleted. */ +export interface SkipResidualFinding { + checkOid: string; + conditionOid: string; + itemGroupOid: string; + itemOid: string; + /** null = non-repeating group; a number = that occurrence. */ + repeatKey: number | null; + message: string; +} + +export interface FormStateResult { + /** Edit-check findings, evaluated with skipped fields nulled out. */ + findings: OccurrenceFinding[]; + /** Computed value for every derived field occurrence (null when its + * inputs are missing, the expression fails, or the field is skipped). */ + derived: ItemValueRow[]; + /** Field occurrences not collected under current responses (fieldKey). */ + skippedFields: Set; + /** Excluded code list options per field occurrence (fieldKey → values). */ + excludedOptions: Map>; + /** Stored values persisting in skipped fields. */ + residuals: SkipResidualFinding[]; +} + +interface CompiledExpression { + evaluate(context: RuleContext): Promise; +} + +/** Compile once, evaluate defensively: any failure yields undefined. */ +function compileExpression(code: string): CompiledExpression { + let compiled: ReturnType | null = null; + try { + compiled = jsonata(code); + } catch { + compiled = null; + } + return { + async evaluate(context) { + if (!compiled) return undefined; + try { + return await compiled.evaluate(context); + } catch { + return undefined; + } + }, + }; +} + +/** Item OIDs an expression reads, by substring scan — the ADR-0007 + * backtick-quoted-OID convention, same approach as the blinded-reference + * validator warning. */ +export function extractItemDependencies(code: string, itemOids: Iterable): string[] { + return [...itemOids].filter((oid) => code.includes(oid)); +} + +function jsonataCode(def: { + formalExpressions: { context?: string | undefined; code: string }[]; +}): string | undefined { + return def.formalExpressions.find((e) => e.context === JSONATA_CONTEXT)?.code; +} + +export interface CompiledDerivation { + itemGroupOid: string; + itemOid: string; + methodOid: string; + expression: string; + /** Computed value as stored (string), or null when incomputable. */ + evaluate(context: RuleContext): Promise; +} + +/** Values are stored as strings; buildRuleContext re-coerces on read. */ +function stringifyDerived(value: unknown): string | null { + if (value === null || value === undefined) return null; + switch (typeof value) { + case "number": + return Number.isFinite(value) ? String(value) : null; + case "boolean": + return value ? "true" : "false"; + case "string": + return value; + default: + return null; + } +} + +/** + * Derivations in evaluation order: an item derived from another derived + * item computes after it. Members of a dependency cycle are dropped + * defensively (publish-time validation reports the cycle as an error). + */ +export function compileDerivations(mdv: MetaDataVersion): CompiledDerivation[] { + const methods = new Map(mdv.methodDefs.map((m) => [m.oid, m])); + const entries: Omit[] = []; + for (const group of mdv.itemGroupDefs) { + for (const ref of group.itemRefs) { + if (!ref.methodOid) continue; + const method = methods.get(ref.methodOid); + const expression = method ? jsonataCode(method) : undefined; + if (expression === undefined) continue; + entries.push({ + itemGroupOid: group.oid, + itemOid: ref.itemOid, + methodOid: ref.methodOid, + expression, + }); + } + } + + const derivedOids = new Set(entries.map((e) => e.itemOid)); + const deps = new Map>(); + for (const e of entries) { + let set = deps.get(e.itemOid); + if (!set) { + set = new Set(); + deps.set(e.itemOid, set); + } + for (const oid of extractItemDependencies(e.expression, derivedOids)) { + if (oid !== e.itemOid) set.add(oid); + } + } + + const rank = new Map(); + const remaining = new Map(deps); + while (remaining.size > 0) { + const ready = [...remaining.keys()].filter( + (oid) => ![...(remaining.get(oid) ?? [])].some((dep) => remaining.has(dep)), + ); + if (ready.length === 0) break; // remainder is cyclic: drop it + for (const oid of ready) { + rank.set(oid, rank.size); + remaining.delete(oid); + } + } + + return entries + .filter((e) => rank.has(e.itemOid)) + .sort((a, b) => (rank.get(a.itemOid) ?? 0) - (rank.get(b.itemOid) ?? 0)) + .map((e) => { + const compiled = compileExpression(e.expression); + return { + ...e, + async evaluate(context: RuleContext) { + return stringifyDerived(await compiled.evaluate(context)); + }, + }; + }); +} + +export interface CompiledCondition { + conditionOid: string; + /** True = the exception applies (not collected / option excluded). */ + evaluate(context: RuleContext): Promise; +} + +export interface CollectionExceptions { + /** groupOid → itemOid → condition (ItemRef-level skip). */ + itemLevel: Map>; + /** target groupOid → conditions from referencing ItemGroupRefs (any true + * skips the group and its descendants). StudyEventDef-level refs are + * scheduling, not form state, and are not honored here. */ + groupLevel: Map; + /** codeListOid → codedValue → condition (option excluded when true). */ + optionLevel: Map>; +} + +export function collectionExceptions(mdv: MetaDataVersion): CollectionExceptions { + const conditions = new Map(mdv.conditionDefs.map((c) => [c.oid, c])); + const compiledByOid = new Map(); + const compile = (conditionOid: string): CompiledCondition | undefined => { + const cached = compiledByOid.get(conditionOid); + if (cached) return cached; + const def = conditions.get(conditionOid); + const code = def ? jsonataCode(def) : undefined; + if (code === undefined) return undefined; + const expression = compileExpression(code); + const compiled: CompiledCondition = { + conditionOid, + async evaluate(context) { + return (await expression.evaluate(context)) === true; + }, + }; + compiledByOid.set(conditionOid, compiled); + return compiled; + }; + + const itemLevel = new Map>(); + const groupLevel = new Map(); + for (const group of mdv.itemGroupDefs) { + for (const ref of group.itemRefs) { + if (!ref.collectionExceptionConditionOid) continue; + const condition = compile(ref.collectionExceptionConditionOid); + if (!condition) continue; + let perItem = itemLevel.get(group.oid); + if (!perItem) { + perItem = new Map(); + itemLevel.set(group.oid, perItem); + } + perItem.set(ref.itemOid, condition); + } + for (const ref of group.itemGroupRefs) { + if (!ref.collectionExceptionConditionOid) continue; + const condition = compile(ref.collectionExceptionConditionOid); + if (!condition) continue; + groupLevel.set(ref.itemGroupOid, [...(groupLevel.get(ref.itemGroupOid) ?? []), condition]); + } + } + + const optionLevel = new Map>(); + for (const codeList of mdv.codeLists) { + for (const item of codeList.items) { + if (!item.collectionExceptionConditionOid) continue; + const condition = compile(item.collectionExceptionConditionOid); + if (!condition) continue; + let perValue = optionLevel.get(codeList.oid); + if (!perValue) { + perValue = new Map(); + optionLevel.set(codeList.oid, perValue); + } + perValue.set(item.codedValue, condition); + } + } + + return { itemLevel, groupLevel, optionLevel }; +} + +/** Groups reachable from `oid` through ItemGroupRef edges (excluding `oid`). */ +function descendantGroups(mdv: MetaDataVersion, oid: string): Set { + const byOid = new Map(mdv.itemGroupDefs.map((g) => [g.oid, g])); + const found = new Set(); + const queue = [oid]; + while (queue.length > 0) { + const current = queue.pop(); + if (current === undefined) break; + for (const ref of byOid.get(current)?.itemGroupRefs ?? []) { + if (found.has(ref.itemGroupOid) || ref.itemGroupOid === oid) continue; + found.add(ref.itemGroupOid); + queue.push(ref.itemGroupOid); + } + } + return found; +} + +/** + * Full dynamic state of a form's data, byte-identical in the browser and on + * the server (the ADR-0007 dual-evaluation pattern). Occurrence handling + * matches runChecksOverRows: non-repeating groups form the base context; + * each repeating occurrence evaluates as base + that occurrence's values. + * + * All skip conditions are evaluated against the post-derivation contexts in + * a single pass — a skip condition reading another skipped field sees its + * value, not null (no cascading re-evaluation). + */ +export async function evaluateFormState( + mdv: MetaDataVersion, + rows: ItemValueRow[], +): Promise { + const repeating = repeatingGroupOids(mdv); + const { base, byOccurrence, occurrencesByGroup } = bucketRows(mdv, rows); + const occurrenceKeys = (groupOid: string): number[] => + [...(occurrencesByGroup.get(groupOid) ?? [])].sort((a, b) => a - b); + const baseContext = () => buildRuleContext(mdv, base); + const occurrenceContext = (key: number) => + buildRuleContext(mdv, { ...base, ...byOccurrence.get(key) }); + + // 1. Derivations, in dependency order, over raw values; each computed + // value is visible to later derivations, conditions, and checks. + const derived: ItemValueRow[] = []; + for (const derivation of compileDerivations(mdv)) { + if (repeating.has(derivation.itemGroupOid)) { + for (const key of occurrenceKeys(derivation.itemGroupOid)) { + const value = await derivation.evaluate(occurrenceContext(key)); + const occurrence = byOccurrence.get(key); + if (occurrence) occurrence[derivation.itemOid] = value; + derived.push({ + itemGroupOid: derivation.itemGroupOid, + itemGroupRepeatKey: key, + itemOid: derivation.itemOid, + value, + }); + } + } else { + const value = await derivation.evaluate(baseContext()); + base[derivation.itemOid] = value; + derived.push({ + itemGroupOid: derivation.itemGroupOid, + itemGroupRepeatKey: 1, + itemOid: derivation.itemOid, + value, + }); + } + } + + // 2. Collection exceptions. Group-level skips propagate to descendant + // groups; an occurrence-scoped skip of a repeating group propagates + // only to repeating descendants at the same occurrence (a non-repeating + // descendant under an occurrence skip stays collected — when in doubt, + // collect). + const exceptions = collectionExceptions(mdv); + const skippedFields = new Set(); + const skipCause = new Map(); + const groupsByOid = new Map(mdv.itemGroupDefs.map((g) => [g.oid, g])); + + const markField = (groupOid: string, repeatKey: number, itemOid: string, causeOid: string) => { + const key = fieldKey(groupOid, repeatKey, itemOid); + skippedFields.add(key); + if (!skipCause.has(key)) skipCause.set(key, causeOid); + }; + const markGroup = (groupOid: string, repeatKey: number | null, causeOid: string) => { + const group = groupsByOid.get(groupOid); + if (!group) return; + const keys = + repeatKey !== null ? [repeatKey] : repeating.has(groupOid) ? occurrenceKeys(groupOid) : [1]; + for (const key of keys) { + for (const ref of group.itemRefs) markField(groupOid, key, ref.itemOid, causeOid); + } + for (const descendant of descendantGroups(mdv, groupOid)) { + if (repeatKey !== null && !repeating.has(descendant)) continue; + const descendantKeys = + repeatKey !== null + ? [repeatKey] + : repeating.has(descendant) + ? occurrenceKeys(descendant) + : [1]; + for (const key of descendantKeys) { + for (const ref of groupsByOid.get(descendant)?.itemRefs ?? []) { + markField(descendant, key, ref.itemOid, causeOid); + } + } + } + }; + + for (const [groupOid, conditions] of exceptions.groupLevel) { + if (repeating.has(groupOid)) { + for (const key of occurrenceKeys(groupOid)) { + for (const condition of conditions) { + if (await condition.evaluate(occurrenceContext(key))) { + markGroup(groupOid, key, condition.conditionOid); + } + } + } + } else { + for (const condition of conditions) { + if (await condition.evaluate(baseContext())) { + markGroup(groupOid, null, condition.conditionOid); + } + } + } + } + + for (const [groupOid, perItem] of exceptions.itemLevel) { + if (repeating.has(groupOid)) { + for (const key of occurrenceKeys(groupOid)) { + const context = occurrenceContext(key); + for (const [itemOid, condition] of perItem) { + if (await condition.evaluate(context)) + markField(groupOid, key, itemOid, condition.conditionOid); + } + } + } else { + const context = baseContext(); + for (const [itemOid, condition] of perItem) { + if (await condition.evaluate(context)) + markField(groupOid, 1, itemOid, condition.conditionOid); + } + } + } + + // 3. Null skipped values in the evaluation contexts only — stored data is + // never touched (retain-and-flag). Residuals report stored values that + // persist in skipped fields; skipped derived fields converge to null + // through the derivation write path instead, so they are not residuals. + const storedByFieldKey = new Map(); + for (const row of rows) { + const key = repeating.has(row.itemGroupOid) ? row.itemGroupRepeatKey : 1; + storedByFieldKey.set(fieldKey(row.itemGroupOid, key, row.itemOid), row.value); + } + const derivedFieldKeys = new Set( + derived.map((d) => fieldKey(d.itemGroupOid, d.itemGroupRepeatKey, d.itemOid)), + ); + const itemNames = new Map(mdv.itemDefs.map((i) => [i.oid, i.name])); + const residuals: SkipResidualFinding[] = []; + for (const key of skippedFields) { + const [groupOid = "", repeatText = "1", itemOid = ""] = key.split(":"); + const repeatKey = Number(repeatText); + if (repeating.has(groupOid)) { + const occurrence = byOccurrence.get(repeatKey); + if (occurrence && itemOid in occurrence) occurrence[itemOid] = null; + } else if (itemOid in base) { + base[itemOid] = null; + } + if (derivedFieldKeys.has(key)) { + const entry = derived.find( + (d) => fieldKey(d.itemGroupOid, d.itemGroupRepeatKey, d.itemOid) === key, + ); + if (entry) entry.value = null; + continue; + } + const stored = storedByFieldKey.get(key); + if (stored === undefined || stored === null || stored === "") continue; + const conditionOid = skipCause.get(key) ?? ""; + residuals.push({ + checkOid: skipCheckOid(conditionOid, itemOid), + conditionOid, + itemGroupOid: groupOid, + itemOid, + repeatKey: repeating.has(groupOid) ? repeatKey : null, + message: `"${itemNames.get(itemOid) ?? itemOid}" has a value but is not collected under the current responses: clear it or revisit the controlling answer`, + }); + } + + // 4. Option exclusions, against the final (derived + skip-nulled) contexts. + const excludedOptions = new Map>(); + const itemsByOid = new Map(mdv.itemDefs.map((i) => [i.oid, i])); + for (const group of mdv.itemGroupDefs) { + for (const ref of group.itemRefs) { + const item = itemsByOid.get(ref.itemOid); + const perValue = item?.codeListRef + ? exceptions.optionLevel.get(item.codeListRef.codeListOid) + : undefined; + if (!perValue || perValue.size === 0) continue; + const contexts: [number, RuleContext][] = repeating.has(group.oid) + ? occurrenceKeys(group.oid).map((key) => [key, occurrenceContext(key)]) + : [[1, baseContext()]]; + for (const [key, context] of contexts) { + for (const [codedValue, condition] of perValue) { + if (!(await condition.evaluate(context))) continue; + const target = fieldKey(group.oid, key, ref.itemOid); + let set = excludedOptions.get(target); + if (!set) { + set = new Set(); + excludedOptions.set(target, set); + } + set.add(codedValue); + } + } + } + } + + // 5. Edit checks over the final contexts: skipped fields cannot fire them. + const findings = await checksOverBuckets(compileEditChecks(mdv), mdv, base, byOccurrence); + + return { findings, derived, skippedFields, excludedOptions, residuals }; +} From ddca4f1c8f54b1aa76826639b883f7348fbec909 Mon Sep 17 00:00:00 2001 From: Travis Gerke Date: Sat, 18 Jul 2026 10:19:37 -0700 Subject: [PATCH 3/6] Enforce dynamic fields on every server write path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New services/form-state.ts is the single gate for all intake: writes to derived items, to fields skipped under current responses (clearing to null stays allowed — that is how a site resolves a residual), and to currently excluded code list options are rejected as invalid. The route write, RTSM intake, and lab import all consult it; lab imports report rejections per row under a new skipped_not_collected outcome. After every accepted write, runPostWritePipeline recomputes derivations from stored values — appended via the audit path with the new "derivation" origin and an item_value.derived action so system-computed values stay permanently distinguishable — and then reconciles queries. evaluateFormChecks is now skip-aware: checks run with not-collected fields nulled, and a stored value persisting in a skipped field raises its own system query (SKIP..), auto-closed when the value is cleared or the controlling answer changes. Amendment migration runs the same pipeline so build changes recompute derivations. --- apps/api/src/db/audit.ts | 26 +- apps/api/src/routes/capture.ts | 15 +- apps/api/src/routes/dynamic-fields.test.ts | 285 +++++++++++++++++++++ apps/api/src/scripts/seed-demo.ts | 4 +- apps/api/src/services/amendments.ts | 9 +- apps/api/src/services/checks.ts | 20 +- apps/api/src/services/form-state.ts | 151 +++++++++++ apps/api/src/services/lab-imports.ts | 34 ++- apps/api/src/services/rtsm.ts | 24 +- 9 files changed, 541 insertions(+), 27 deletions(-) create mode 100644 apps/api/src/routes/dynamic-fields.test.ts create mode 100644 apps/api/src/services/form-state.ts diff --git a/apps/api/src/db/audit.ts b/apps/api/src/db/audit.ts index e8f9c94..a861d1f 100644 --- a/apps/api/src/db/audit.ts +++ b/apps/api/src/db/audit.ts @@ -13,9 +13,10 @@ export interface ItemValueWrite { /** Required when changing an existing value (clinical correction convention). */ reasonForChange?: string; /** Set by machine write paths: the audit trail records the value as - * item_value.imported (lab import) or item_value.integrated (RTSM intake) - * so data origin is permanently distinguishable. */ - origin?: "import" | "integration"; + * item_value.imported (lab import), item_value.integrated (RTSM intake), + * or item_value.derived (MethodDef computation) so data origin is + * permanently distinguishable. */ + origin?: "import" | "integration" | "derivation"; } /** @@ -69,13 +70,18 @@ export async function appendItemValue(db: Db, write: ItemValueWrite) { await tx.insert(auditEvents).values({ actorId: write.actorId, studyId: write.studyId, - action: latest - ? "item_value.changed" - : write.origin === "import" - ? "item_value.imported" - : write.origin === "integration" - ? "item_value.integrated" - : "item_value.entered", + // Derivations stay item_value.derived even on change: the audit trail + // must always show the value as system-computed, never user-corrected. + action: + write.origin === "derivation" + ? "item_value.derived" + : latest + ? "item_value.changed" + : write.origin === "import" + ? "item_value.imported" + : write.origin === "integration" + ? "item_value.integrated" + : "item_value.entered", entityType: "item_value", entityId: inserted.id, oldValue: latest ? { value: latest.value } : null, diff --git a/apps/api/src/routes/capture.ts b/apps/api/src/routes/capture.ts index f8c153a..528f642 100644 --- a/apps/api/src/routes/capture.ts +++ b/apps/api/src/routes/capture.ts @@ -38,8 +38,8 @@ import { writeItemValue, } from "../services/capture.js"; import { generateSubjectCasebook } from "../services/casebook.js"; -import { evaluateFormChecks } from "../services/checks.js"; import { ExportError } from "../services/exports.js"; +import { assertWriteAllowed, loadFormState, runPostWritePipeline } from "../services/form-state.js"; import { listFormSignatures, SignatureError, signForm } from "../services/signatures.js"; import type { StudyBuildDefinition } from "../services/study-builds.js"; @@ -549,6 +549,17 @@ export const captureRoutes: FastifyPluginAsync = async (app) => { } try { + // Dynamic-field gate (ADR-0014): no writes to derived items, skipped + // fields (except clearing), or currently excluded code list options. + const formState = await loadFormState(app.db, context); + if (formState) { + assertWriteAllowed(formState, { + itemGroupOid: parsed.data.itemGroupOid, + itemGroupRepeatKey: parsed.data.itemGroupRepeatKey, + itemOid: parsed.data.itemOid, + value: parsed.data.value, + }); + } const version = await writeItemValue(app.db, context, { itemGroupOid: parsed.data.itemGroupOid, itemOid: parsed.data.itemOid, @@ -559,7 +570,7 @@ export const captureRoutes: FastifyPluginAsync = async (app) => { : {}), ...(parsed.data.reasonForChange ? { reasonForChange: parsed.data.reasonForChange } : {}), }); - const findings = await evaluateFormChecks(app.db, context, user.id); + const findings = await runPostWritePipeline(app.db, context, user.id); return reply.code(201).send({ ...version, findings }); } catch (err) { if (err instanceof Error && /reasonForChange is required/.test(err.message)) { diff --git a/apps/api/src/routes/dynamic-fields.test.ts b/apps/api/src/routes/dynamic-fields.test.ts new file mode 100644 index 0000000..873d188 --- /dev/null +++ b/apps/api/src/routes/dynamic-fields.test.ts @@ -0,0 +1,285 @@ +import { randomUUID } from "node:crypto"; +import { and, eq, sql } from "drizzle-orm"; +import type { FastifyInstance } from "fastify"; +import { afterAll, beforeAll, describe, expect, it } from "vitest"; +import { hashPassword } from "../auth/password.js"; +import { grantRole } from "../auth/rbac.js"; +import { createDb, databaseUrl } from "../db/client.js"; +import { runMigrations } from "../db/migrate.js"; +import { auditEvents, queries, roles, sites, studies, users } from "../db/schema/index.js"; +import { buildServer } from "../server.js"; +import { importStudyBuild } from "../services/study-builds.js"; + +const { db, client } = createDb(); +let dbAvailable = false; +try { + await client`SELECT 1`; + dbAvailable = true; +} catch { + if (process.env.CI) throw new Error(`CI requires a reachable database at ${databaseUrl()}`); + console.warn(`⚠ Skipping dynamic-fields integration tests: no database at ${databaseUrl()}.`); +} + +const DYNAMIC_ODM = ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \`IT.SEX\` = "M" + + + \`IT.SEX\` = "F" + + + \`IT.SMOKER\` != "Y" + + + \`IT.HRMEAS\` = false + + + \`IT.WT\` != null and \`IT.HT\` != null and \`IT.HT\` > 0 ? \`IT.WT\` / (\`IT.HT\` * \`IT.HT\`) : null + + + +`; + +const PASSWORD = "correct-Horse-battery-7"; + +describe.skipIf(!dbAvailable)("dynamic fields: derivations, skip logic, options", () => { + let server: FastifyInstance; + const suffix = randomUUID().slice(0, 8); + const fx = { studyId: "", formId: "", token: "" }; + + beforeAll(async () => { + await runMigrations(); + server = await buildServer({ db }); + await server.ready(); + + const [user] = await db + .insert(users) + .values({ + username: `dyn-${suffix}`, + email: `dyn-${suffix}@example.com`, + fullName: "Dynamo", + passwordHash: await hashPassword(PASSWORD), + }) + .returning(); + const [study] = await db + .insert(studies) + .values({ oid: `ST.DYN.${suffix}`, name: "Dynamic Study" }) + .returning(); + if (!user || !study) throw new Error("fixture failed"); + fx.studyId = study.id; + const [site] = await db + .insert(sites) + .values({ studyId: study.id, oid: "SITE.1", name: "Site" }) + .returning(); + const [investigator] = await db.select().from(roles).where(eq(roles.name, "investigator")); + if (!site || !investigator) throw new Error("fixture failed"); + await grantRole(db, { + userId: user.id, + studyId: study.id, + roleId: investigator.id, + grantedBy: user.id, + }); + + const imported = await importStudyBuild(db, { + studyId: study.id, + content: DYNAMIC_ODM, + actorId: user.id, + }); + if (!imported.ok) throw new Error(`import failed: ${JSON.stringify(imported.issues)}`); + + fx.token = ( + await server.inject({ + method: "POST", + url: "/auth/login", + payload: { username: `dyn-${suffix}`, password: PASSWORD }, + }) + ).json().token; + + const subject = ( + await server.inject({ + method: "POST", + url: `/studies/${study.id}/subjects`, + payload: { siteId: site.id, subjectKey: "D-001" }, + headers: { authorization: `Bearer ${fx.token}` }, + }) + ).json(); + fx.formId = ( + await server.inject({ + method: "POST", + url: `/subjects/${subject.id}/forms`, + payload: { eventOid: "SE.V1", formOid: "FO.DF" }, + headers: { authorization: `Bearer ${fx.token}` }, + }) + ).json().id; + }); + + afterAll(async () => { + await server.close(); + await client.end(); + }); + + function write( + itemGroupOid: string, + itemOid: string, + value: string | null, + options: { reasonForChange?: string; repeatKey?: number } = {}, + ) { + return server.inject({ + method: "PUT", + url: `/forms/${fx.formId}/items`, + payload: { + itemGroupOid, + itemOid, + value, + ...(options.repeatKey ? { itemGroupRepeatKey: options.repeatKey } : {}), + ...(options.reasonForChange ? { reasonForChange: options.reasonForChange } : {}), + }, + headers: { authorization: `Bearer ${fx.token}` }, + }); + } + + async function currentValue(itemOid: string, repeatKey = 1) { + const rows = await db.execute<{ value: string | null }>(sql` + SELECT value FROM item_values_current + WHERE form_instance_id = ${fx.formId} AND item_oid = ${itemOid} + AND item_group_repeat_key = ${repeatKey} + `); + return rows[0]?.value; + } + + async function openQueries() { + return db + .select() + .from(queries) + .where(and(eq(queries.formInstanceId, fx.formId), eq(queries.status, "open"))); + } + + it("computes and stores a derived value with the derived audit action", async () => { + expect((await write("IG.MAIN", "IT.SEX", "F")).statusCode).toBe(201); + expect((await write("IG.MAIN", "IT.WT", "81")).statusCode).toBe(201); + expect((await write("IG.MAIN", "IT.HT", "1.8")).statusCode).toBe(201); + + expect(await currentValue("IT.BMI")).toBe("25"); + const trail = await db + .select() + .from(auditEvents) + .where( + and(eq(auditEvents.studyId, fx.studyId), eq(auditEvents.action, "item_value.derived")), + ); + expect(trail.length).toBeGreaterThanOrEqual(1); + }); + + it("recomputes the derived value when a source changes", async () => { + expect( + (await write("IG.MAIN", "IT.WT", "97.2", { reasonForChange: "re-weighed" })).statusCode, + ).toBe(201); + expect(await currentValue("IT.BMI")).toBe("30"); + }); + + it("rejects direct writes to a derived item", async () => { + const res = await write("IG.MAIN", "IT.BMI", "22", { reasonForChange: "manual" }); + expect(res.statusCode).toBe(400); + expect(res.json().error).toMatch(/derived item/); + }); + + it("rejects writes to a field skipped by an item-level exception", async () => { + expect((await write("IG.MAIN", "IT.SMOKER", "N")).statusCode).toBe(201); + const res = await write("IG.MAIN", "IT.CIGS", "10"); + expect(res.statusCode).toBe(400); + expect(res.json().error).toMatch(/not collected/); + + expect( + (await write("IG.MAIN", "IT.SMOKER", "Y", { reasonForChange: "mis-keyed" })).statusCode, + ).toBe(201); + expect((await write("IG.MAIN", "IT.CIGS", "10")).statusCode).toBe(201); + }); + + it("raises a residual query when a valued field becomes skipped, and closes it on clear", async () => { + expect( + (await write("IG.MAIN", "IT.SMOKER", "N", { reasonForChange: "corrected" })).statusCode, + ).toBe(201); + const open = await openQueries(); + const residual = open.find((q) => q.checkOid === "SKIP.CD.NONSMOKER.IT.CIGS"); + expect(residual).toBeTruthy(); + + // Clearing the skipped value stays allowed and resolves the query. + expect( + (await write("IG.MAIN", "IT.CIGS", null, { reasonForChange: "not collected" })).statusCode, + ).toBe(201); + const openAfter = await openQueries(); + expect(openAfter.find((q) => q.checkOid === "SKIP.CD.NONSMOKER.IT.CIGS")).toBeUndefined(); + }); + + it("rejects writes into a group skipped at group level", async () => { + expect( + (await write("IG.MAIN", "IT.SEX", "M", { reasonForChange: "corrected" })).statusCode, + ).toBe(201); + const res = await write("IG.PREG", "IT.PREG", "NEG"); + expect(res.statusCode).toBe(400); + expect(res.json().error).toMatch(/not collected/); + expect( + (await write("IG.MAIN", "IT.SEX", "F", { reasonForChange: "corrected" })).statusCode, + ).toBe(201); + }); + + it("rejects a code list value excluded for the current responses", async () => { + // Subject is female: the NA option is excluded. + const res = await write("IG.PREG", "IT.PREG", "NA"); + expect(res.statusCode).toBe(400); + expect(res.json().error).toMatch(/not available/); + expect((await write("IG.PREG", "IT.PREG", "NEG")).statusCode).toBe(201); + }); + + it("applies item-level skips per repeating-group occurrence", async () => { + expect((await write("IG.VS", "IT.HRMEAS", "true", { repeatKey: 1 })).statusCode).toBe(201); + expect((await write("IG.VS", "IT.HR", "72", { repeatKey: 1 })).statusCode).toBe(201); + expect((await write("IG.VS", "IT.HRMEAS", "false", { repeatKey: 2 })).statusCode).toBe(201); + const res = await write("IG.VS", "IT.HR", "88", { repeatKey: 2 }); + expect(res.statusCode).toBe(400); + expect(res.json().error).toMatch(/not collected/); + }); +}); diff --git a/apps/api/src/scripts/seed-demo.ts b/apps/api/src/scripts/seed-demo.ts index df7b3ad..113ed10 100644 --- a/apps/api/src/scripts/seed-demo.ts +++ b/apps/api/src/scripts/seed-demo.ts @@ -20,9 +20,9 @@ import { transitionForm, writeItemValue, } from "../services/capture.js"; -import { evaluateFormChecks } from "../services/checks.js"; import { setDictionaryBinding } from "../services/coding.js"; import { type DictionaryType, loadDictionary } from "../services/dictionaries.js"; +import { runPostWritePipeline } from "../services/form-state.js"; import { importStudyBuild } from "../services/study-builds.js"; const STUDY_OID = "ST.CDASH.DEMO"; @@ -136,7 +136,7 @@ try { value, actorId: coordinator, }); - await evaluateFormChecks(db, context, coordinator); + await runPostWritePipeline(db, context, coordinator); } }; await enter(form1.id, { diff --git a/apps/api/src/services/amendments.ts b/apps/api/src/services/amendments.ts index 05db303..d19837a 100644 --- a/apps/api/src/services/amendments.ts +++ b/apps/api/src/services/amendments.ts @@ -10,7 +10,7 @@ import { subjects, } from "../db/schema/index.js"; import { CaptureError, type FormStatus, resolveFormContext } from "./capture.js"; -import { evaluateFormChecks } from "./checks.js"; +import { runPostWritePipeline } from "./form-state.js"; import type { StudyBuildDefinition } from "./study-builds.js"; /** @@ -358,9 +358,10 @@ export async function runMigrationDriver(db: Db, runId: string): Promise { oldValue: { metadataVersionId: context.metadataVersionId }, newValue: { metadataVersionId: targetId, migrationRunId: runId }, }); - // Reconcile system queries against the new build: newly firing - // checks open queries; checks that vanished auto-close (audited). - await evaluateFormChecks( + // Reconcile against the new build: changed method expressions + // recompute derivations, then newly firing checks open queries + // and checks that vanished auto-close (audited). + await runPostWritePipeline( txDb, { ...context, metadataVersionId: targetId }, run.startedBy, diff --git a/apps/api/src/services/checks.ts b/apps/api/src/services/checks.ts index a31110d..b60580a 100644 --- a/apps/api/src/services/checks.ts +++ b/apps/api/src/services/checks.ts @@ -1,4 +1,4 @@ -import { compileEditChecks, type ItemValueRow, runChecksOverRows } from "@edc-core/rules"; +import { evaluateFormState, type ItemValueRow } from "@edc-core/rules"; import { and, eq, inArray, isNotNull, sql } from "drizzle-orm"; import type { Db } from "../db/client.js"; import { auditEvents, queries, studyMetadataVersions } from "../db/schema/index.js"; @@ -17,6 +17,11 @@ export interface CheckFinding { * system queries: one open query per firing check, auto-closed when the data * problem is resolved. Runs after every accepted item write (E6-08 groundwork; * the manual query lifecycle lands in Phase 4). + * + * Skip-aware (ADR-0014): checks run with not-collected fields nulled out, + * and a stored value persisting in a skipped field raises its own system + * query under a synthetic SKIP.. check OID, auto-closed + * when the site clears the value or the controlling answer changes back. */ export async function evaluateFormChecks( db: Db, @@ -31,9 +36,6 @@ export async function evaluateFormChecks( if (!mdvRow) return []; const mdv = (mdvRow.definition as unknown as StudyBuildDefinition).metaDataVersion; - const checks = compileEditChecks(mdv); - if (checks.length === 0) return []; - // Latest value per (item, occurrence); the rules engine attributes each // finding either to the form or to a repeating-group occurrence. const valueRows = await db.execute<{ @@ -53,7 +55,15 @@ export async function evaluateFormChecks( value: row.value, })); - const occurrenceFindings = await runChecksOverRows(checks, mdv, rows); + const state = await evaluateFormState(mdv, rows); + const occurrenceFindings = [ + ...state.findings, + ...state.residuals.map((residual) => ({ + checkOid: residual.checkOid, + message: residual.message, + repeatKey: residual.repeatKey, + })), + ]; // "Active" includes answered: a site's answer must not let a still-failing // check open a duplicate query for the same problem. One query per diff --git a/apps/api/src/services/form-state.ts b/apps/api/src/services/form-state.ts new file mode 100644 index 0000000..54535e9 --- /dev/null +++ b/apps/api/src/services/form-state.ts @@ -0,0 +1,151 @@ +import type { MetaDataVersion } from "@edc-core/odm"; +import { + compileDerivations, + evaluateFormState, + type FormStateResult, + fieldKey, + type ItemValueRow, +} from "@edc-core/rules"; +import { eq, sql } from "drizzle-orm"; +import { appendItemValue } from "../db/audit.js"; +import type { Db } from "../db/client.js"; +import { studyMetadataVersions } from "../db/schema/index.js"; +import { CaptureError, type FormContext } from "./capture.js"; +import { type CheckFinding, evaluateFormChecks } from "./checks.js"; +import type { StudyBuildDefinition } from "./study-builds.js"; + +/** Reason recorded on automatic derivation rewrites (audit requires one). */ +const DERIVATION_REASON = "derived: source data changed"; + +export interface FormState { + mdv: MetaDataVersion; + rows: ItemValueRow[]; + state: FormStateResult; +} + +/** + * The form's dynamic state as the server sees it: pinned build + current + * stored values, run through the shared rules pipeline (ADR-0014). The same + * evaluation runs client-side for instant feedback; this copy is the truth. + */ +export async function loadFormState(db: Db, context: FormContext): Promise { + const [mdvRow] = await db + .select({ definition: studyMetadataVersions.definition }) + .from(studyMetadataVersions) + .where(eq(studyMetadataVersions.id, context.metadataVersionId)) + .limit(1); + if (!mdvRow) return null; + const mdv = (mdvRow.definition as unknown as StudyBuildDefinition).metaDataVersion; + + const valueRows = await db.execute<{ + item_group_oid: string; + item_group_repeat_key: number; + item_oid: string; + value: string | null; + }>( + sql`SELECT item_group_oid, item_group_repeat_key, item_oid, value + FROM item_values_current + WHERE form_instance_id = ${context.formInstanceId}`, + ); + const rows: ItemValueRow[] = valueRows.map((row) => ({ + itemGroupOid: row.item_group_oid, + itemGroupRepeatKey: row.item_group_repeat_key, + itemOid: row.item_oid, + value: row.value, + })); + + return { mdv, rows, state: await evaluateFormState(mdv, rows) }; +} + +/** + * Gate for every intake path (route write, RTSM, lab import): rejects writes + * to derived items (system-written only), writes into fields not collected + * under the current responses (clearing to null stays allowed — that is how + * a site resolves a skip-residual query), and code list values currently + * excluded for the field. + */ +export function assertWriteAllowed( + formState: FormState, + write: { + itemGroupOid: string; + itemGroupRepeatKey?: number | undefined; + itemOid: string; + value: string | null; + }, +): void { + const { mdv, state } = formState; + const derivedTargets = new Set( + compileDerivations(mdv).map((d) => `${d.itemGroupOid}:${d.itemOid}`), + ); + if (derivedTargets.has(`${write.itemGroupOid}:${write.itemOid}`)) { + throw new CaptureError( + "invalid", + `"${write.itemOid}" is a derived item: its value is computed, not entered`, + ); + } + const key = fieldKey(write.itemGroupOid, write.itemGroupRepeatKey ?? 1, write.itemOid); + if (write.value !== null && state.skippedFields.has(key)) { + throw new CaptureError( + "invalid", + `"${write.itemOid}" is not collected under the current responses; clear the value or revisit the controlling answer`, + ); + } + if (write.value !== null && state.excludedOptions.get(key)?.has(write.value)) { + throw new CaptureError( + "invalid", + `option "${write.value}" is not available for "${write.itemOid}" under the current responses`, + ); + } +} + +/** + * Recomputes every derivation from stored values and appends the changes as + * system writes (origin "derivation", action item_value.derived). A derived + * value that was never stored and computes to null is not written — nothing + * to record. Attribution follows the lab-import pattern: the actor is + * whoever's write triggered recomputation. + */ +export async function applyDerivations( + db: Db, + context: FormContext, + actorId: string, +): Promise { + const loaded = await loadFormState(db, context); + if (!loaded) return; + const stored = new Map( + loaded.rows.map((row) => [ + fieldKey(row.itemGroupOid, row.itemGroupRepeatKey, row.itemOid), + row.value, + ]), + ); + for (const entry of loaded.state.derived) { + const key = fieldKey(entry.itemGroupOid, entry.itemGroupRepeatKey, entry.itemOid); + const existing = stored.get(key); + if (existing === undefined && entry.value === null) continue; + if (existing === entry.value) continue; + await appendItemValue(db, { + formInstanceId: context.formInstanceId, + studyId: context.studyId, + itemGroupOid: entry.itemGroupOid, + itemGroupRepeatKey: entry.itemGroupRepeatKey, + itemOid: entry.itemOid, + value: entry.value, + actorId, + origin: "derivation", + ...(existing !== undefined ? { reasonForChange: DERIVATION_REASON } : {}), + }); + } +} + +/** + * The post-write sequence for every accepted data change: derivations first + * (their results feed the checks), then check/residual query reconciliation. + */ +export async function runPostWritePipeline( + db: Db, + context: FormContext, + actorId: string, +): Promise { + await applyDerivations(db, context, actorId); + return evaluateFormChecks(db, context, actorId); +} diff --git a/apps/api/src/services/lab-imports.ts b/apps/api/src/services/lab-imports.ts index b887f44..8cf8153 100644 --- a/apps/api/src/services/lab-imports.ts +++ b/apps/api/src/services/lab-imports.ts @@ -23,7 +23,7 @@ import { type SubjectStatus, writeItemValue, } from "./capture.js"; -import { evaluateFormChecks } from "./checks.js"; +import { assertWriteAllowed, loadFormState, runPostWritePipeline } from "./form-state.js"; import type { StudyBuildDefinition } from "./study-builds.js"; /** @@ -167,6 +167,7 @@ export const ROW_OUTCOMES = [ "error_unknown_test", "error_bad_value", "skipped_pinned_build", + "skipped_not_collected", "error_write_failed", ] as const; export type RowOutcome = (typeof ROW_OUTCOMES)[number]; @@ -850,6 +851,11 @@ export async function runLabImportDriver( current.set(`${row.item_group_oid}:${row.item_oid}`, row.value); } + // Dynamic-field gate, evaluated once per form from pre-import + // values: an import must not fill derived or not-collected + // fields (ADR-0014). + const formState = await loadFormState(txDb, context); + let wrote = false; for (const row of group.rows) { const { outcome, message, writes } = classifyRow( @@ -857,6 +863,30 @@ export async function runLabImportDriver( (t) => current.get(`${t.itemGroupOid}:${t.itemOid}`) ?? undefined, () => {}, ); + if (formState && writes.length > 0) { + let blockedMessage: string | null = null; + for (const target of writes) { + try { + assertWriteAllowed(formState, { + itemGroupOid: target.itemGroupOid, + itemOid: target.itemOid, + value: target.value, + }); + } catch (err) { + blockedMessage = err instanceof Error ? err.message : String(err); + break; + } + } + if (blockedMessage !== null) { + collector.add("skipped_not_collected", { + line: row.line, + subjectKey: row.subjectKey, + testCode: row.testCode, + message: blockedMessage, + }); + continue; + } + } for (const target of writes) { await writeItemValue(txDb, context, { itemGroupOid: target.itemGroupOid, @@ -882,7 +912,7 @@ export async function runLabImportDriver( }); } - if (wrote) await evaluateFormChecks(txDb, context, run.startedBy); + if (wrote) await runPostWritePipeline(txDb, context, run.startedBy); }); } catch (err) { for (const row of group.rows) { diff --git a/apps/api/src/services/rtsm.ts b/apps/api/src/services/rtsm.ts index 9073299..a009e3f 100644 --- a/apps/api/src/services/rtsm.ts +++ b/apps/api/src/services/rtsm.ts @@ -15,7 +15,7 @@ import { type SubjectStatus, writeItemValue, } from "./capture.js"; -import { evaluateFormChecks } from "./checks.js"; +import { assertWriteAllowed, loadFormState, runPostWritePipeline } from "./form-state.js"; import type { StudyBuildDefinition } from "./study-builds.js"; /** @@ -340,6 +340,26 @@ export async function applyAssignment( ); } + // Unattended intake must not write into a derived or not-collected + // target; reject visibly instead of leaving a silent bad value. + const formState = await loadFormState(txDb, context); + if (formState) { + try { + assertWriteAllowed(formState, { + itemGroupOid: config.itemGroupOid, + itemOid: config.itemOid, + value: assignment.arm, + }); + } catch (err) { + return record( + "rejected", + err instanceof Error ? err.message : String(err), + { subjectId: subject.id }, + txDb, + ); + } + } + const written = await writeItemValue(txDb, context, { itemGroupOid: config.itemGroupOid, itemOid: config.itemOid, @@ -347,7 +367,7 @@ export async function applyAssignment( actorId: input.serviceUserId, origin: "integration", }); - await evaluateFormChecks(txDb, { ...context, status: "in_progress" }, input.serviceUserId); + await runPostWritePipeline(txDb, { ...context, status: "in_progress" }, input.serviceUserId); return record( "applied", null, From f9cb4b8502f8b7ea7c0ff27e558121152fc5872a Mon Sep 17 00:00:00 2001 From: Travis Gerke Date: Sat, 18 Jul 2026 10:26:11 -0700 Subject: [PATCH 4/6] Render dynamic fields in form entry and preview MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit FormEntryPage now runs evaluateFormState client-side on every edit — the same pipeline the server enforces — and renders from its result: skipped fields disappear (or, when they hold a saved value, render read-only with a not-collected badge and an explicit audited Clear), derived fields render read-only with a computed badge and a live local preview that the server's authoritative recompute reconciles on refetch, and excluded code list options drop out of selects (a saved but now-excluded value stays visible and flagged). Sections whose every field is skipped and empty hide entirely. Unsaved edits in a field that becomes skipped are dropped; saved values are never touched. Open SKIP.* queries render readable text via skipResidualMessages, a new rules export enumerating every residual check OID a build can produce. resolveGroup and resolveVariantForm now carry methodOid and collectionExceptionConditionOid on resolved refs (variants inherit them from the canonical build ItemRef), and FormPreview shows static computed/conditional badges from them. --- apps/web/src/components/FormPreview.tsx | 20 ++- apps/web/src/pages/FormEntryPage.tsx | 171 +++++++++++++++++++++--- packages/odm/src/resolve.ts | 21 ++- packages/odm/src/variants.ts | 18 ++- packages/rules/src/index.ts | 36 ++++- 5 files changed, 242 insertions(+), 24 deletions(-) diff --git a/apps/web/src/components/FormPreview.tsx b/apps/web/src/components/FormPreview.tsx index 95097bb..903ff68 100644 --- a/apps/web/src/components/FormPreview.tsx +++ b/apps/web/src/components/FormPreview.tsx @@ -25,17 +25,30 @@ function FieldControl({ def, codeList }: { def: ItemDef; codeList?: CodeList | u {displayText(item.decode) ?? item.codedValue} + {item.collectionExceptionConditionOid ? ( + + cond + + ) : null} ))} ); } + const conditional = codeList.items.filter((i) => i.collectionExceptionConditionOid).length; return ( ); } @@ -77,6 +90,8 @@ function ItemRow({ item }: { item: ResolvedItem }) {
{label} {item.ref.mandatory === "Yes" ? * : null} + {item.ref.methodOid ? computed : null} + {item.ref.collectionExceptionConditionOid ? conditional : null} {item.def.oid}
@@ -92,6 +107,9 @@ function GroupSection({ group, depth }: { group: ResolvedGroup; depth: number })

{group.def.name}

{isRepeating ? repeating : null} + {group.ref.collectionExceptionConditionOid ? ( + conditional + ) : null} {group.def.oid}
) : null} diff --git a/apps/web/src/pages/FormEntryPage.tsx b/apps/web/src/pages/FormEntryPage.tsx index 5438836..320970b 100644 --- a/apps/web/src/pages/FormEntryPage.tsx +++ b/apps/web/src/pages/FormEntryPage.tsx @@ -8,7 +8,13 @@ import { resolveVariantForm, siteFormVariantDefinitionSchema, } from "@edc-core/odm"; -import { compileEditChecks, type ItemValueRow, runChecksOverRows } from "@edc-core/rules"; +import { + compileDerivations, + compileEditChecks, + evaluateFormState, + type ItemValueRow, + skipResidualMessages, +} from "@edc-core/rules"; import { Link, useParams } from "@tanstack/react-router"; import { useEffect, useMemo, useRef, useState } from "react"; import { @@ -91,18 +97,26 @@ function EntryControl({ codeList, value, disabled, + excludedValues, onChange, }: { def: ItemDef; codeList?: CodeList | undefined; value: string; disabled: boolean; + excludedValues?: Set | undefined; onChange: (value: string) => void; }) { const base = "w-full max-w-sm rounded-lg border border-zinc-200 bg-white px-3 py-2 text-sm text-zinc-900 focus:border-zinc-400 focus:outline-none focus:ring-2 focus:ring-zinc-200 disabled:bg-zinc-50 disabled:text-zinc-500"; if (codeList) { + // Excluded options disappear from the choice list — except a saved value + // that has since become excluded, which stays visible and flagged rather + // than leaving the select silently blank. + const items = codeList.items.filter( + (item) => !excludedValues?.has(item.codedValue) || item.codedValue === value, + ); return ( @@ -157,14 +172,48 @@ function EntryControl({ ); } +/** Client-side dynamic form state (ADR-0014), recomputed on every edit. */ +interface DynamicState { + /** Field occurrences not collected under the current responses. */ + skipped: Set; + /** Excluded code list options per field occurrence. */ + excluded: Map>; + /** `${groupOid}:${itemOid}` pairs whose value is computed, never entered. */ + derivedItems: Set; + /** Locally computed derived values (preview; the server recomputes). */ + derivedValues: Record; +} + +/** A section with nothing to show (every field skipped and empty) is hidden + * entirely rather than rendered as an empty shell. */ +function groupHasVisibleContent( + group: ResolvedGroup, + repeatKey: number, + dynamic: DynamicState, + serverValues: Record, +): boolean { + return group.children.some((child) => { + if (child.kind === "item") { + const key = fieldKey(child.canonicalGroupOid ?? group.def.oid, repeatKey, child.def.oid); + return !dynamic.skipped.has(key) || (serverValues[key] ?? "") !== ""; + } + // Repeating subgroups keep their own occurrence controls visible. + if (child.def.repeating && child.def.repeating !== "No") return true; + // Non-repeating subgroups always render at repeat key 1. + return groupHasVisibleContent(child, 1, dynamic, serverValues); + }); +} + function EntryGroup({ group, depth, repeatKey = 1, values, + serverValues, editable, blinded, added, + dynamic, onChange, onAddOccurrence, }: { @@ -172,9 +221,11 @@ function EntryGroup({ depth: number; repeatKey?: number; values: Record; + serverValues: Record; editable: boolean; blinded: Set; added: Record; + dynamic: DynamicState; onChange: (key: string, value: string) => void; onAddOccurrence: (groupOid: string) => void; }) { @@ -192,12 +243,14 @@ function EntryGroup({ if (child.kind === "item") { // Variant layouts are presentation-only: writes key on the item's // canonical build group so the data shape stays identical. - const key = fieldKey( - child.canonicalGroupOid ?? group.def.oid, - repeatKey, - child.def.oid, - ); + const canonicalGroupOid = child.canonicalGroupOid ?? group.def.oid; + const key = fieldKey(canonicalGroupOid, repeatKey, child.def.oid); const isBlinded = blinded.has(child.def.oid); + const isDerived = dynamic.derivedItems.has(`${canonicalGroupOid}:${child.def.oid}`); + const isSkipped = dynamic.skipped.has(key); + const savedValue = serverValues[key] ?? ""; + // A skipped field with nothing saved simply is not collected. + if (isSkipped && savedValue === "") return null; const label = displayText(child.def.question) ?? displayText(child.def.description) ?? @@ -210,6 +263,8 @@ function EntryGroup({ {child.ref.mandatory === "Yes" ? * : null} {isBlinded ? blinded : null} + {isDerived ? computed : null} + {isSkipped ? not collected : null} {child.def.oid} @@ -221,12 +276,34 @@ function EntryGroup({ value="Blinded for your role" disabled /> + ) : isSkipped ? ( + // Retained value in a not-collected field: read-only, with + // an explicit audited clear (prompts reason-for-change). +
+ + {editable && (values[key] ?? savedValue) !== "" ? ( + + ) : null} +
+ ) : isDerived ? ( + ) : ( onChange(key, value)} /> )} @@ -237,15 +314,18 @@ function EntryGroup({ const childRepeats = child.def.repeating && child.def.repeating !== "No"; if (!childRepeats) { + if (!groupHasVisibleContent(child, 1, dynamic, serverValues)) return null; return (
0 ? "pt-3" : ""}> @@ -263,9 +343,11 @@ function EntryGroup({ depth={depth + 1} repeatKey={occurrence} values={values} + serverValues={serverValues} editable={editable} blinded={blinded} added={added} + dynamic={dynamic} onChange={onChange} onAddOccurrence={onAddOccurrence} /> @@ -296,7 +378,20 @@ function EntryForm({ const transition = useTransitionForm(data.context.formInstanceId); const permissions = usePermissions(data.context.studyId, data.context.siteId); const checks = useMemo(() => compileEditChecks(mdv), [mdv]); - const checkMessages = useMemo(() => new Map(checks.map((c) => [c.oid, c.message])), [checks]); + // Skip-residual queries carry synthetic SKIP.* check OIDs; merge their + // display text so open queries never render as raw OIDs. + const checkMessages = useMemo( + () => + new Map([ + ...checks.map((c): [string, string] => [c.oid, c.message]), + ...skipResidualMessages(mdv), + ]), + [checks, mdv], + ); + const derivedItems = useMemo( + () => new Set(compileDerivations(mdv).map((d) => `${d.itemGroupOid}:${d.itemOid}`)), + [mdv], + ); const itemOptions = useMemo(() => collectItemOptions(form), [form]); const serverValues = useMemo(() => { @@ -340,13 +435,19 @@ function EntryForm({ }); }, [serverValues]); - // Instant client-side evaluation of the same checks the server enforces, - // occurrence-aware for repeating item groups. + // Instant client-side evaluation of the same pipeline the server enforces + // (derivations → skip logic → option exclusions → checks), occurrence-aware + // for repeating item groups. The server recomputes authoritatively on write. const [findings, setFindings] = useState< { oid: string; message: string; repeatKey: number | null }[] >([]); + const [dynamic, setDynamic] = useState({ + skipped: new Set(), + excluded: new Map(), + derivedItems, + derivedValues: {}, + }); useEffect(() => { - if (checks.length === 0) return; let cancelled = false; const rows: ItemValueRow[] = Object.entries(values).map(([key, value]) => { const parsed = parseFieldKey(key); @@ -357,21 +458,53 @@ function EntryForm({ value: value === "" ? null : (value ?? null), }; }); - void runChecksOverRows(checks, mdv, rows).then((results) => { + void evaluateFormState(mdv, rows).then((state) => { if (cancelled) return; setFindings( - results.map((f) => ({ oid: f.checkOid, message: f.message, repeatKey: f.repeatKey })), + state.findings.map((f) => ({ + oid: f.checkOid, + message: f.message, + repeatKey: f.repeatKey, + })), ); + const derivedValues: Record = {}; + for (const entry of state.derived) { + derivedValues[fieldKey(entry.itemGroupOid, entry.itemGroupRepeatKey, entry.itemOid)] = + entry.value ?? ""; + } + setDynamic({ + skipped: state.skippedFields, + excluded: state.excludedOptions, + derivedItems, + derivedValues, + }); + // Unsaved local edits in fields that just became skipped are dropped: + // nothing is persisted, and a hidden field must not hold a pending + // write. Saved values stay put (retain-and-flag, cleared explicitly). + setValues((current) => { + let changed = false; + const next = { ...current }; + for (const key of state.skippedFields) { + if ((next[key] ?? "") !== "" && (prevServerRef.current[key] ?? "") === "") { + delete next[key]; + changed = true; + } + } + return changed ? next : current; + }); }); return () => { cancelled = true; }; - }, [values, checks, mdv]); + }, [values, mdv, derivedItems]); const editable = WRITABLE.has(data.context.status); - const dirtyKeys = Object.keys(values).filter( - (key) => (values[key] ?? "") !== (serverValues[key] ?? ""), - ); + const dirtyKeys = Object.keys(values).filter((key) => { + if ((values[key] ?? "") === (serverValues[key] ?? "")) return false; + // Derived values are server-written; the client preview never saves them. + const parsed = parseFieldKey(key); + return !derivedItems.has(`${parsed.groupOid}:${parsed.itemOid}`); + }); const needsReason = dirtyKeys.some((key) => key in serverValues); async function save() { @@ -593,7 +726,7 @@ function EntryForm({ {data.openQueries.map((query) => (
  • {query.checkOid - ? (checks.find((c) => c.oid === query.checkOid)?.message ?? query.checkOid) + ? (checkMessages.get(query.checkOid) ?? query.checkOid) : "Manual query"} {query.itemGroupRepeatKey != null ? ` (occurrence ${query.itemGroupRepeatKey})` @@ -622,9 +755,11 @@ function EntryForm({ group={form} depth={0} values={values} + serverValues={serverValues} editable={editable} blinded={new Set(data.blindedItems ?? [])} added={added} + dynamic={dynamic} onChange={(key, value) => { setSaved(false); setValues((prev) => ({ ...prev, [key]: value })); diff --git a/packages/odm/src/resolve.ts b/packages/odm/src/resolve.ts index 5836cb8..c0a2b6b 100644 --- a/packages/odm/src/resolve.ts +++ b/packages/odm/src/resolve.ts @@ -7,7 +7,13 @@ import type { CodeList, ItemDef, ItemGroupDef, MetaDataVersion } from "./model.j export interface ResolvedItem { kind: "item"; - ref: { mandatory?: string; repeat?: string; other?: string }; + ref: { + mandatory?: string; + repeat?: string; + other?: string; + methodOid?: string; + collectionExceptionConditionOid?: string; + }; def: ItemDef; codeList?: CodeList; /** @@ -19,7 +25,7 @@ export interface ResolvedItem { export interface ResolvedGroup { kind: "group"; - ref: { mandatory?: string }; + ref: { mandatory?: string; collectionExceptionConditionOid?: string }; def: ItemGroupDef; children: (ResolvedItem | ResolvedGroup)[]; } @@ -66,6 +72,10 @@ export function resolveGroup(mdv: MetaDataVersion, groupOid: string): ResolvedGr ...(ref.mandatory !== undefined ? { mandatory: ref.mandatory } : {}), ...(ref.repeat !== undefined ? { repeat: ref.repeat } : {}), ...(ref.other !== undefined ? { other: ref.other } : {}), + ...(ref.methodOid !== undefined ? { methodOid: ref.methodOid } : {}), + ...(ref.collectionExceptionConditionOid !== undefined + ? { collectionExceptionConditionOid: ref.collectionExceptionConditionOid } + : {}), }, def: itemDef, ...(codeList ? { codeList } : {}), @@ -76,7 +86,12 @@ export function resolveGroup(mdv: MetaDataVersion, groupOid: string): ResolvedGr if (child) { children.push({ ...child, - ref: { ...(ref.mandatory !== undefined ? { mandatory: ref.mandatory } : {}) }, + ref: { + ...(ref.mandatory !== undefined ? { mandatory: ref.mandatory } : {}), + ...(ref.collectionExceptionConditionOid !== undefined + ? { collectionExceptionConditionOid: ref.collectionExceptionConditionOid } + : {}), + }, }); } } diff --git a/packages/odm/src/variants.ts b/packages/odm/src/variants.ts index e7d2b0e..965c148 100644 --- a/packages/odm/src/variants.ts +++ b/packages/odm/src/variants.ts @@ -281,10 +281,26 @@ export function resolveVariantForm( ? codeListsByOid.get(def.codeListRef.codeListOid) : undefined; const canonicalGroupOid = governedByOid.get(ref.itemOid)?.canonicalGroupOid; + // Skip logic and derivations are protocol semantics, not layout: + // the canonical build ItemRef's method/exception follow the item + // into every variant. + const canonicalRef = mdv.itemGroupDefs + .find((g) => g.oid === canonicalGroupOid) + ?.itemRefs.find((r) => r.itemOid === ref.itemOid); return [ { kind: "item" as const, - ref: { mandatory: ref.mandatory ? "Yes" : "No" }, + ref: { + mandatory: ref.mandatory ? "Yes" : "No", + ...(canonicalRef?.methodOid !== undefined + ? { methodOid: canonicalRef.methodOid } + : {}), + ...(canonicalRef?.collectionExceptionConditionOid !== undefined + ? { + collectionExceptionConditionOid: canonicalRef.collectionExceptionConditionOid, + } + : {}), + }, def: displayDef, ...(codeList ? { codeList } : {}), ...(canonicalGroupOid !== undefined ? { canonicalGroupOid } : {}), diff --git a/packages/rules/src/index.ts b/packages/rules/src/index.ts index 4a8ae26..8cfe83d 100644 --- a/packages/rules/src/index.ts +++ b/packages/rules/src/index.ts @@ -519,6 +519,40 @@ function descendantGroups(mdv: MetaDataVersion, oid: string): Set { return found; } +function residualMessage(itemName: string): string { + return `"${itemName}" has a value but is not collected under the current responses: clear it or revisit the controlling answer`; +} + +/** + * Every skip-residual check OID a build can produce, with its display + * message — lets a client render readable text for open SKIP.* queries + * without re-deriving the addressing scheme. + */ +export function skipResidualMessages(mdv: MetaDataVersion): Map { + const itemNames = new Map(mdv.itemDefs.map((i) => [i.oid, i.name])); + const groupsByOid = new Map(mdv.itemGroupDefs.map((g) => [g.oid, g])); + const message = (itemOid: string) => residualMessage(itemNames.get(itemOid) ?? itemOid); + const map = new Map(); + for (const group of mdv.itemGroupDefs) { + for (const ref of group.itemRefs) { + if (!ref.collectionExceptionConditionOid) continue; + map.set(skipCheckOid(ref.collectionExceptionConditionOid, ref.itemOid), message(ref.itemOid)); + } + for (const ref of group.itemGroupRefs) { + if (!ref.collectionExceptionConditionOid) continue; + for (const groupOid of [ref.itemGroupOid, ...descendantGroups(mdv, ref.itemGroupOid)]) { + for (const itemRef of groupsByOid.get(groupOid)?.itemRefs ?? []) { + map.set( + skipCheckOid(ref.collectionExceptionConditionOid, itemRef.itemOid), + message(itemRef.itemOid), + ); + } + } + } + } + return map; +} + /** * Full dynamic state of a form's data, byte-identical in the browser and on * the server (the ADR-0007 dual-evaluation pattern). Occurrence handling @@ -683,7 +717,7 @@ export async function evaluateFormState( itemGroupOid: groupOid, itemOid, repeatKey: repeating.has(groupOid) ? repeatKey : null, - message: `"${itemNames.get(itemOid) ?? itemOid}" has a value but is not collected under the current responses: clear it or revisit the controlling answer`, + message: residualMessage(itemNames.get(itemOid) ?? itemOid), }); } From b24474a285487358728cba9a6c6493e4e626fc6d Mon Sep 17 00:00:00 2001 From: Travis Gerke Date: Sat, 18 Jul 2026 10:29:23 -0700 Subject: [PATCH 5/6] Document dynamic fields: ADR-0014, demo study coverage, changelog ADR-0014 records the design: the shared evaluateFormState pipeline and its fixed evaluation order, ODM CollectionExceptionCondition honored at item and group level, the edc:CollectionExceptionConditionOID CodeListItem extension for dependent options, retain-and-flag semantics for values in skipped fields, server-written derivations, backtick-scan dependency extraction with publish-time cycle errors, and the blinding warnings. The demo study now exercises all three constructs: a pregnancy-test item skipped for male subjects, a conditional "Not performed" option, and a BMI item derived from height and weight. --- CHANGELOG.md | 22 ++++++ ...nditional-collection-and-derived-values.md | 77 +++++++++++++++++++ examples/demo-study.xml | 41 +++++++++- 3 files changed, 139 insertions(+), 1 deletion(-) create mode 100644 docs/adr/0014-conditional-collection-and-derived-values.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 3653253..dd112e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,27 @@ # Changelog +## Unreleased + +### Dynamic and linked fields (ADR-0014) +- Skip logic: `CollectionExceptionConditionOID` on ItemRef and ItemGroupRef + is now enforced at runtime — skipped fields hide in capture, writes to + them are rejected on every intake path (UI, RTSM, lab import), and a + value already saved in a field that becomes skipped raises a system + query until the site clears it or the controlling answer changes back +- Dependent option lists: a new `edc:CollectionExceptionConditionOID` + vendor extension on CodeListItem withdraws an option when its condition + is true; plain-ODM consumers see the full list +- Derived values: `MethodDef` jsonata expressions now compute item values + server-side after every accepted write (audited as `item_value.derived`), + with a live read-only preview in form entry; direct writes to derived + items are rejected, and derivation cycles fail build validation +- Edit checks are skip-aware (not-collected fields cannot fire them), and + the client and server evaluate one shared pipeline, extending the + ADR-0007 dual-evaluation pattern +- The demo study now exercises all three: a pregnancy-test item skipped + for male subjects, a conditional "Not performed" option, and a BMI item + derived from height and weight + ## v0.5.0 — Protocol-first builds and site form layouts (2026-07) Two halves of one idea (BYOFW: the sponsor governs the data, sites adapt diff --git a/docs/adr/0014-conditional-collection-and-derived-values.md b/docs/adr/0014-conditional-collection-and-derived-values.md new file mode 100644 index 0000000..465c0f5 --- /dev/null +++ b/docs/adr/0014-conditional-collection-and-derived-values.md @@ -0,0 +1,77 @@ +# ADR-0014: Conditional collection and derived values + +**Status:** accepted · 2026-07-18 + +## Context + +The build model has carried ODM's hooks for dynamic forms since ADR-0003: +`CollectionExceptionConditionOID` on ItemRef and `MethodOID` for computed +items both parse, validate, and round-trip. The runtime ignored them. Every +field rendered unconditionally, and the only cross-field behavior was edit +checks (ADR-0007), which raise queries without gating anything. Real +protocols need fields collected only when another answer calls for them +(a pregnancy test when the subject is female), choice lists that narrow, +and values computed from other fields (BMI) rather than typed in. + +## Decision + +- One pure function, `evaluateFormState` in `@edc-core/rules`, computes the + full dynamic state of a form from the pinned build and its value rows, + reusing the ADR-0007 JSONata machinery and its dual-evaluation pattern: + the browser runs it on every edit for instant feedback, the server runs + the same code as the authority. Evaluation order is fixed: derivations in + dependency order, then collection exceptions, then skipped values nulled + in the evaluation context only, then option exclusions, then edit checks. + Derivations read raw values; skip conditions read derived values. The + one-way order makes skip/derive circularity impossible by construction. +- Skip logic honors ODM's `CollectionExceptionConditionOID` on ItemRef and + ItemGroupRef, excluded-when-true. A skipped group skips its descendant + groups. Conditions evaluate per occurrence inside repeating groups. + StudyEventDef-level refs are visit scheduling, not form state, and are + not honored here. +- Dependent options are a vendor extension: `edc:CollectionExceptionConditionOID` + on CodeListItem, with the same excluded-when-true polarity so builders + learn one mental model. Plain-ODM consumers ignore the attribute and see + the full option list, so exports degrade cleanly. +- Retain and flag, never silently mutate. When a valued field becomes + skipped, the stored value stays (the audit trail is append-only anyway); + new writes to the field are rejected while clearing to null stays + allowed; and a system query opens under a synthetic check OID + (`SKIP..`), auto-closed when the site clears the value + or the controlling answer changes back. Edit checks evaluate with + skipped values nulled, so not-collected data cannot fire them. +- Derived values are server-written. After every accepted write, the + server recomputes from stored values and appends changes with origin + `derivation` and audit action `item_value.derived`, so system-computed + values stay permanently distinguishable from entered ones. Clients show + a local read-only preview and never submit it. Direct writes to derived + items are rejected on every intake path: the capture route, RTSM, and + lab import all consult one gate (`assertWriteAllowed`). A skipped + derived field converges to null through this same audited path rather + than raising a residual query. +- Derivation inputs are found by scanning expressions for item OIDs, the + ADR-0007 backtick convention. A dependency cycle is a publish-time + validation error; the runtime drops cyclic derivations defensively. +- Blinding interplay is a validator warning: a collection exception that + reads a blinded item can reveal it through visibility changes, and a + non-blinded item derived from blinded inputs leaks by construction. + +## Consequences + +- Skip conditions and derivations travel in standard ODM (the option-level + extension rides the existing `edc:` namespace), and amendment migrations + recompute derivations because a new build may change method expressions. +- A referenced condition or method without a jsonata expression imports + with a warning and stays inert: the field is always collected, or the + derived value never computes. CDISC example files with XPath expressions + still import unchanged. +- All skip conditions are evaluated in a single pass against the + post-derivation context: a skip condition that reads another skipped + field sees its value, not null. Cascading re-evaluation was rejected as + unpredictable for site users. +- An occurrence-scoped skip of a repeating group propagates only to + repeating descendants at the same occurrence. When propagation is + ambiguous, the field stays collected: collecting too much is recoverable, + hiding a field a site needed is not. +- Authoring UI for ConditionDefs and MethodDefs is a follow-up; today the + constructs arrive through ODM import. diff --git a/examples/demo-study.xml b/examples/demo-study.xml index f46babb..d024b23 100644 --- a/examples/demo-study.xml +++ b/examples/demo-study.xml @@ -2,7 +2,10 @@ + + @@ -54,6 +59,8 @@ + + @@ -94,6 +101,10 @@ What is the race of the subject? + + What was the result of the pregnancy test? + + What was the date of the measurements? @@ -116,6 +127,9 @@ What was the weight? + + Body mass index (computed from height and weight) + What is the adverse event term? @@ -169,6 +183,14 @@ Moderate Severe + + Negative + Positive + + Not performed + Not Related Possibly Related @@ -189,6 +211,23 @@ The adverse event end date is before its start date. `IT.AE.AESTDTC` != null and `IT.AE.AEENDTC` != null and `IT.AE.AEENDTC` < `IT.AE.AESTDTC` + + + + `IT.DM.SEX` = 1 + + + `IT.DM.SEX` = 2 + + + + + Weight (kg) divided by height (m) squared, from the same visit's measurements. + `IT.VS.WEIGHT` != null and `IT.VS.HEIGHT` > 0 ? $round(`IT.VS.WEIGHT` / ((`IT.VS.HEIGHT` / 100) * (`IT.VS.HEIGHT` / 100)), 1) : null + From 0543178765af3ddb84cc237943233d23685ef2bd Mon Sep 17 00:00:00 2001 From: Travis Gerke Date: Sat, 18 Jul 2026 10:57:46 -0700 Subject: [PATCH 6/6] Bring user-facing docs current with dynamic fields The guide now covers ADR-0014 end to end: study-builds.qmd documents the three build constructs (skip logic, dependent options via the edc: CodeListItem extension, derived values) and how they differ from edit checks; data-capture.qmd documents the entry-side behavior (fields hiding, retained values with not-collected badges and residual queries, narrowed option lists, read-only computed fields) with a new dynamic-fields.png screenshot; the tour points at the demo study's pregnancy-skip and computed BMI; site-forms.qmd notes that skip logic and derivations follow items into variants. scripts/screenshots.mjs gains the dynamic-fields shot (staged on DEMO-002 demographics, idempotent) so the scripted refresh reproduces it instead of the hand-captured interim image going silently stale. README's capture bullet and the E6-08 traceability row (evidence: dynamic-fields.test.ts) are extended to match. --- README.md | 9 ++++---- docs/regulatory-traceability.md | 2 +- scripts/screenshots.mjs | 37 ++++++++++++++++++++++++++++++++ site/guide/data-capture.qmd | 28 ++++++++++++++++++++++++ site/guide/site-forms.qmd | 3 +++ site/guide/study-builds.qmd | 34 +++++++++++++++++++++++++++++ site/images/dynamic-fields.png | Bin 0 -> 264316 bytes site/tour.qmd | 9 ++++++++ 8 files changed, 117 insertions(+), 5 deletions(-) create mode 100644 site/images/dynamic-fields.png diff --git a/README.md b/README.md index 863f9cb..7bb722c 100644 --- a/README.md +++ b/README.md @@ -105,10 +105,11 @@ on one host (shared Keycloak SSO, one Postgres, one Caddy), start from - Study builds from CDISC ODM v2.0 (file, API, or visual builder), versioned and immutable, with mid-study amendment migration (build diff, impact analysis, batch re-pointing of unsigned forms) -- Metadata-driven data capture with JSONata edit checks, repeating item - groups, a server-enforced entry workflow (in progress → complete → verified - → signed → locked), and an audited subject lifecycle (screening → enrolled → - completed / withdrawn, with reinstate) +- Metadata-driven data capture with JSONata edit checks, dynamic fields + (skip logic, dependent code lists, server-computed derived values — + ADR-0014), repeating item groups, a server-enforced entry workflow (in + progress → complete → verified → signed → locked), and an audited subject + lifecycle (screening → enrolled → completed / withdrawn, with reinstate) - Append-only audit trail (database-enforced), threaded query management, Part 11 e-signatures, audit review UI - Access control: unique accounts with per-study/per-site role scoping, admin diff --git a/docs/regulatory-traceability.md b/docs/regulatory-traceability.md index 59dc453..c085e3a 100644 --- a/docs/regulatory-traceability.md +++ b/docs/regulatory-traceability.md @@ -40,7 +40,7 @@ Status legend: 🟢 implemented · 🟡 in progress · ⚪ planned | E6-05 | Access management: unique credentials, role-appropriate access, timely revocation | RBAC with per-study/per-site scoping; grants/revocations audited and managed in the per-study Team UI; deactivation revokes live sessions immediately (not at next timeout) | 🟢 `auth.test.ts`, `admin-users.test.ts`, `team.test.ts` | | E6-06 | Security incident detection and response (§4.3.3(b) "system monitoring", §3.16.1(w) incident reporting) | Periodic anomaly sweep over the access log and audit trail: failed-login bursts per source address, lockouts, session-binding violations; findings notify system administrators and are reviewed at `/admin/security-anomalies`, where acknowledgement (the recorded response) is written to the audit trail | 🟢 `security-anomalies.test.ts`, `access-log.test.ts` | | E6-07 | Reproducible point-in-time datasets (interim analysis, DB lock) | Per-study DuckLake snapshots (ADR-0008): publishes pin an immutable lake version; all reads/exports/workbench runs use `AT (VERSION => n)` | 🟢 `snapshots.test.ts` | -| E6-08 | Query management supporting data review | Threaded query lifecycle (open → answered → closed, monitor reopen), manual + system-raised, fully audited; study-wide query dashboard | 🟢 `queries.test.ts`, `checks.test.ts` | +| E6-08 | Query management supporting data review | Threaded query lifecycle (open → answered → closed, monitor reopen), manual + system-raised, fully audited; study-wide query dashboard; system queries also flag values retained in fields no longer collected under skip logic (ADR-0014), auto-closing when the site clears the value or the controlling answer changes | 🟢 `queries.test.ts`, `checks.test.ts`, `dynamic-fields.test.ts` | | E6-09 | Investigator control over their data and signatures | Site-scoped roles; investigator signature workflow; signature invalidation on change | 🟢 `signatures.test.ts`, `capture.test.ts` | | E6-10 | Retention and retrievability of essential records | Standards-based study archive zip (open formats only) | 🟢 `snapshots.test.ts` | | E6-11 | Data transfer, exchange and migration: integrity, documented traceability, reconciliation to avoid loss and unintended modification (§4.2.5) | External data (lab CSV, RTSM assignments) lands through the standard audited write path with origin-tagged audit actions (`item_value.imported` / `item_value.integrated`); transfers never overwrite (identical replays idempotent, differing values reported as conflicts, nothing written); append-only `rtsm_events` records every RTSM POST including rejects as the reconciliation basis | 🟢 `lab-imports.test.ts`, `rtsm-intake.test.ts` | diff --git a/scripts/screenshots.mjs b/scripts/screenshots.mjs index 84cfa3f..e8fadc4 100644 --- a/scripts/screenshots.mjs +++ b/scripts/screenshots.mjs @@ -250,6 +250,34 @@ async function ensureRptStudy(admin, coord) { return form.id; } +// Demographics for dynamic-fields.png (ADR-0014): record a pregnancy test +// while the subject is female, then correct sex to male — leaving the +// retained value in its "not collected" state with the residual system +// query open. Idempotent: a stored IT.DM.PREG value means a prior run +// already staged the state. +async function ensureDynamicFieldsForm(coord, studyId) { + const subjects = await coord.get(`/studies/${studyId}/subjects`); + const subject = subjects.find((s) => s.subjectKey === "DEMO-002"); + if (!subject) throw new Error("seeded subject DEMO-002 not found"); + const form = await coord.post(`/subjects/${subject.id}/forms`, { + eventOid: "SE.SCREENING", + formOid: "FO.DM", + }); + const { values } = await coord.get(`/forms/${form.id}`); + if (!values.some((v) => v.item_oid === "IT.DM.PREG" && v.value !== null)) { + log("staging DEMO-002 demographics (retained pregnancy value → not collected)"); + const writes = [ + { itemOid: "IT.DM.SEX", value: "2" }, + { itemOid: "IT.DM.PREG", value: "1" }, + { itemOid: "IT.DM.SEX", value: "1", reasonForChange: "transcription error" }, + ]; + for (const write of writes) { + await coord.put(`/forms/${form.id}/items`, { itemGroupOid: "IG.DM", ...write }); + } + } + return form.id; +} + async function ensureSnapshot(dm, demoStudyId) { const { snapshots } = await dm.get(`/studies/${demoStudyId}/snapshots`); const published = snapshots.filter((s) => s.status === "published"); @@ -425,6 +453,7 @@ async function main() { const site1 = sites.find((s) => s.oid === "SITE.001"); await ensureDemoSubject(coord, demoStudy.id, site1.id); + const dynFormId = await ensureDynamicFieldsForm(coord, demoStudy.id); const rptFormId = await ensureRptStudy(admin, coord); // Coding before the snapshot so the snapshot's codings table has rows. await ensureCodingRun(dm, demoStudy.id); @@ -502,6 +531,14 @@ async function main() { await page.getByText("open query").first().waitFor(); }, }, + { + name: "dynamic-fields", + context: coordCtx, + async run(page) { + await page.goto(`/forms/${dynFormId}`); + await page.getByText("not collected").first().waitFor(); + }, + }, { name: "repeating-entry", context: coordCtx, diff --git a/site/guide/data-capture.qmd b/site/guide/data-capture.qmd index 327a7a9..c91cc9c 100644 --- a/site/guide/data-capture.qmd +++ b/site/guide/data-capture.qmd @@ -58,6 +58,34 @@ same audited write path; see [Lab data import](lab-import.qmd). Verbatim AE and medication terms entered here are standardized later by data management; see [Medical coding](medical-coding.qmd). +## Conditional and computed fields + +Builds that use [dynamic fields](study-builds.qmd#dynamic-fields) change the +form as answers land, evaluated instantly in the browser and re-checked by the +server on every write: + +- **Skipped fields disappear.** A field whose collection exception is true is + simply not shown; a section whose every field is skipped hides entirely. + Change the controlling answer back and the field returns. +- **Values already saved are never silently deleted.** If a saved value's + field becomes skipped (say, sex is corrected after a pregnancy test was + recorded), the value stays visible read-only with a **not collected** badge + and a **Clear** button, and a system query stays open until the site either + clears the value (a normal audited correction, reason required) or changes + the controlling answer back. The server rejects any other write into a + skipped field. +- **Dependent options narrow.** Options excluded under the current responses + drop out of the choice list. A saved value whose option was later excluded + stays visible, marked "no longer available", rather than leaving the field + blank. +- **Computed fields are read-only.** Derived items show a live preview with a + **computed** badge as you type their inputs; the stored value is always the + server's own calculation, written through the audit trail as + `item_value.derived`. Entering into a computed field is rejected — on every + path, including lab import and RTSM intake. + +![](../images/dynamic-fields.png){.screenshot fig-alt="Demographics form where selecting Male hides the pregnancy-test field, and a retained value shows a not-collected badge with a Clear button"} + ## Repeating item groups Item groups marked `Repeating` in the study build (e.g. multiple blood-pressure diff --git a/site/guide/site-forms.qmd b/site/guide/site-forms.qmd index bbe836c..0da8809 100644 --- a/site/guide/site-forms.qmd +++ b/site/guide/site-forms.qmd @@ -32,6 +32,9 @@ Open **site forms** from the study page (you need the site-scoped 4. **Capture through it.** Once approved, the capture launcher on the same page opens your layout's forms for your site's subjects. Data entry, queries, signatures, and edit checks behave exactly as on standard forms. + So do [dynamic fields](data-capture.qmd#conditional-and-computed-fields): + skip logic and computed values are protocol semantics, not layout, and + follow each item into every variant. Some events may refuse layouts entirely: the sponsor can lock the layout of sensitive events (consent, endpoint assessments). diff --git a/site/guide/study-builds.qmd b/site/guide/study-builds.qmd index b06454d..907a308 100644 --- a/site/guide/study-builds.qmd +++ b/site/guide/study-builds.qmd @@ -97,3 +97,37 @@ includes three: A failing check warns instantly during entry and, on save, raises a **system query** attached to the item. When the data is corrected, the query closes automatically. See [Data capture](data-capture.qmd). + +## Dynamic fields + +Beyond checks that flag data, a build can make the form itself respond to the +data ([ADR-0014](https://github.com/tgerke/edc-core/blob/main/docs/adr/0014-conditional-collection-and-derived-values.md)). +All three constructs reuse the same JSONata `ConditionDef`/`MethodDef` +machinery as edit checks, so they travel inside the ODM build like everything +else. + +**Skip logic.** A `CollectionExceptionConditionOID` on an `ItemRef` or +`ItemGroupRef` marks the field (or the whole section, including nested +sections) as *not collected* while the referenced condition is true. This is +standard ODM. The demo study skips its pregnancy-test item while the subject's +sex is recorded male. + +**Dependent options.** The same attribute on a `CodeListItem` (as the +`edc:CollectionExceptionConditionOID` vendor extension) withdraws one option +from the choice list while its condition is true. The demo study withdraws +"Not performed" from the pregnancy-test result once the subject is recorded +female. Consumers that only speak plain ODM ignore the attribute and see the +full option list, so exports stay portable. + +**Derived values.** An `ItemRef` with a `MethodOID` is computed, not entered: +the server evaluates the method's JSONata expression after every accepted +write and stores the result through the normal audited path (as +`item_value.derived`, permanently distinguishable from entered data). The +demo study computes BMI from height and weight. A derivation may read other +derived items; circular chains are rejected at validation time. + +Conditions and methods referenced this way are collection logic, never edit +checks: they gate what is collected instead of raising queries. What happens +at the point of entry — fields appearing and disappearing, retained values +that need clearing, read-only computed fields — is covered in +[Data capture](data-capture.qmd). diff --git a/site/images/dynamic-fields.png b/site/images/dynamic-fields.png new file mode 100644 index 0000000000000000000000000000000000000000..1ddd4f47a8ff30cb1d25fde16ba6fd7214979f01 GIT binary patch literal 264316 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%0A%E(UAsVoFL#EEG{D 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 z zPN9&A?~fb&<}`%2@{J zADUC(R6AU1o($ItCj4sUDA{VsP|YeQalOFt^rarzrulI-NFQ`Ox;A2Hx*kqV-KdC$ zEF?$NG6VJsC7Doe8{nI#)xIDmFf*I6pe)EWzSg@(XGhQxbbqzTu#=UAr6;#(bkuG1 zODDLu=0-ZhQ9e2O9CHH~8_nv0!7tXy;AiT-(JmD% z43B;9+X-?r>LSIx2<1kGw{_-BE1JQjA&~Ex%tl1%_J{JqFE7K)Lc7N1+l! z5NTUaK}W2PejryTQFaL728x!nXaR>Dx90dyZy%laRjW{+DwQay&MEBa_52& z9f&%SW(q@gzfEeXFARl98Y1qAfBt)oyO0_NuC?rv_3;0aj1&?%q-IUv@Z zeb88!8Ps@tSGt`7*mrGDj_pTWPjZPhCYP5}%(`PSb>WU6e_@tOv@ov-�>6-O8H+ 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

    vT1$jekGP`AT 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⁣~`- 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