Packet-processing flows

Enterprise Single-tenant

This guide covers how to manually build packet-processing flows when your automation project defines cross-class fields — that is, packet-level fields consolidated across document classes.

To run the flow and inspect cross-class field output end to end, publish your flow as an advanced app.

For schema and validation concepts in the app editor view, see Extracting data from packets and Validating packets.

Step order

A typical packet-processing pipeline runs in the following step order:

  1. Process files — OCR and digitization.

  2. Unified extractor — Structured extraction across the packet using your configured schema.

  3. Apply checkpoint — Class-level validations (when your project defines them).

  4. Combine — Merges all file records into one stream before packet-level refinement. See Combine classes.

  5. Process case — Runs the packet refiner program (case.ibrefiner) that materializes cross-class fields into the IB stream. See Process case.

  6. Apply checkpoint (optional) — Cross-class validations, only when the published project defines rules on cross-class fields. See Cross-class checkpoint.

  7. Combine — Final merge when you need all classes and cross-class output in one stream. See Combine all.

1

Combine classes

Use the Combine step to present one combined stream to the Process case step.

SettingValue
combine_same_file_recordsno
combine_all_file_recordsyes
2

Process case

The Process case step loads a packet refiner program from the flow bundle and writes output that includes materialized cross-class fields.

For UI field descriptions, folder keys, kwargs, and the full reference for authoring case.ibrefiner, see Process case.

KwargPurpose
input_folderCombined packet IB input after class-level extraction — typically the output of the preceding Combine step.
output_folderOutput of the packet step, where cross-class fields are merged in.
case_program_pathPath to the packet refiner program in the flow bundle; typically modules/case.refiner/prog/case.ibrefiner. When creating the module manually through the flow interface, you must create the prog folder yourself and move your .ibrefiner file into it.
settingsOptional; often {}.
1{
2 "kwargs": {
3 "input_folder": "s4_combine",
4 "output_folder": "s5_case",
5 "case_program_path": "modules/case.refiner/prog/case.ibrefiner",
6 "settings": {}
7 },
8 "option": { "internalName": "process_case", "name": "Process Case" }
9}

Module layout

The packet refiner program lives in the flow bundle at:

modules/case.refiner/
modules/case.refiner/prog/case.ibrefiner

Process case resolves case_program_path to that JSON program. The file does not have to be named case.ibrefiner — the name is determined by the path you set in case_program_path. Per-class refiner modules and .ibvalidations files for class-level checkpoints live in separate module folders.

When you create a refiner module through the flow interface, the default file path is modules/<STEP-NAME>.refiner/<NAME>.ibrefiner. To match the expected path, use the file explorer to create a prog folder inside the .refiner folder, then move your .ibrefiner file into it. If you create your schema in a project, then export the project to the flow editor, the prog folder is created for you.

Authoring packet refiner programs

The fixed prefix builds the inputs for packet-level logic: a class-field manifest and one bridge column per referenced (class name, field name) pair. Bridge labels (typically __ClassName_FieldName_<uuid>) are what downstream cross-class formulas reference.

The cross-class field columns follow the bridges, one object per cross-class field in project order. Each uses a choice_type: DERIVED, AGGREGATED, or UDF. For schema details and native function descriptions, see Process case.

The JSON examples below are drawn from a loan application project with four document classes: Bank_Statement, Loan_Application, Pay_Stub, and W2. Substitute your real class and field names when authoring your program.

Two patterns exist for the fixed prefix, depending on how your program was generated.

Pattern A: get_intra_class_field per bridge (common)

Each bridge column calls get_intra_class_field directly and includes its own field_selection_strategy. There is no separate shared aggregation column. This is the pattern generated when starting from an automation project.

1{
2 "dev_input": {},
3 "options": {
4 "provenance_tracking": true,
5 "auto_provenance": false
6 },
7 "fields": [
8 {
9 "label": "__class_field_inputs",
10 "lines": [
11 {
12 "function_id": {
13 "name": "get_input_fields_per_class_field",
14 "source": "NATIVE"
15 },
16 "inputs": [
17 {
18 "arg_name": "class_fields",
19 "arg_type": "POSITIONAL_OR_KEYWORD",
20 "data_type": "ANY",
21 "data_type_options": ["TEXT"],
22 "value": "{}"
23 }
24 ]
25 }
26 ]
27 },
28 {
29 "label": "__Loan__Application_Loan__Amount_<uuid>",
30 "lines": [
31 {
32 "function_id": {
33 "name": "get_intra_class_field",
34 "source": "NATIVE"
35 },
36 "inputs": [
37 {
38 "arg_name": "class_field_inputs",
39 "arg_type": "POSITIONAL_OR_KEYWORD",
40 "data_type": "FIELD",
41 "data_type_options": ["TEXT"],
42 "value": "__class_field_inputs"
43 },
44 {
45 "arg_name": "class_name",
46 "arg_type": "POSITIONAL_OR_KEYWORD",
47 "data_type": "ANY",
48 "data_type_options": ["TEXT"],
49 "value": "\"Loan_Application\""
50 },
51 {
52 "arg_name": "field_name",
53 "arg_type": "POSITIONAL_OR_KEYWORD",
54 "data_type": "ANY",
55 "data_type_options": ["TEXT"],
56 "value": "\"Loan__Amount\""
57 },
58 {
59 "arg_name": "field_selection_strategy",
60 "arg_type": "POSITIONAL_OR_KEYWORD",
61 "data_type": "ANY",
62 "data_type_options": ["TEXT"],
63 "value": "\"best_field_value\""
64 },
65 {
66 "arg_name": "kwargs",
67 "arg_type": "VAR_KEYWORD",
68 "data_type": "DICT",
69 "data_type_options": ["DICT"],
70 "value": "{}"
71 }
72 ],
73 "output_type": "TEXT"
74 }
75 ]
76 },
77 {
78 "label": "__W2_Wages__Tips_<uuid>",
79 "lines": [
80 {
81 "function_id": {
82 "name": "get_intra_class_field",
83 "source": "NATIVE"
84 },
85 "inputs": [
86 {
87 "arg_name": "class_field_inputs",
88 "arg_type": "POSITIONAL_OR_KEYWORD",
89 "data_type": "FIELD",
90 "data_type_options": ["TEXT"],
91 "value": "__class_field_inputs"
92 },
93 {
94 "arg_name": "class_name",
95 "arg_type": "POSITIONAL_OR_KEYWORD",
96 "data_type": "ANY",
97 "data_type_options": ["TEXT"],
98 "value": "\"W2\""
99 },
100 {
101 "arg_name": "field_name",
102 "arg_type": "POSITIONAL_OR_KEYWORD",
103 "data_type": "ANY",
104 "data_type_options": ["TEXT"],
105 "value": "\"Wages__Tips\""
106 },
107 {
108 "arg_name": "field_selection_strategy",
109 "arg_type": "POSITIONAL_OR_KEYWORD",
110 "data_type": "ANY",
111 "data_type_options": ["TEXT"],
112 "value": "\"best_field_value\""
113 },
114 {
115 "arg_name": "kwargs",
116 "arg_type": "VAR_KEYWORD",
117 "data_type": "DICT",
118 "data_type_options": ["DICT"],
119 "value": "{}"
120 }
121 ],
122 "output_type": "TEXT"
123 }
124 ]
125 }
126 ]
127}

Each bridge block represents one input class field. In this example, the first bridge exposes Loan_Amount from Loan_Application and the second exposes Wages_Tips from W2. For each bridge, three values are project-specific and must be updated together: label (the stable identifier downstream formulas reference), class_name, and field_name.

Add one bridge block for each (class, field) pair your cross-class fields depend on. Append cross-class field columns after all the bridges.

The class_fields value on get_input_fields_per_class_field is project-specific — replace {} with your own class-to-field mapping (such as {"Loan_Application": ["Loan__Amount"], "W2": ["Wages__Tips"]}).

The kwargs input on each bridge line is required by the refiner schema but ignored at runtime; keep "value": "{}".


Pattern B: get_all_intra_class_fields + get_intra_class_field_from_calculated (two-step)

An alternative pattern uses a single shared aggregation column (get_all_intra_class_fields) followed by individual bridge columns that each call get_intra_class_field_from_calculated to extract one (class, field) pair from it. The field_selection_strategy is set one time on the aggregation column rather than per bridge.

1{
2 "dev_input": {},
3 "options": {
4 "provenance_tracking": true,
5 "auto_provenance": false
6 },
7 "fields": [
8 {
9 "label": "__class_field_inputs",
10 "lines": [
11 {
12 "function_id": {
13 "name": "get_input_fields_per_class_field",
14 "source": "NATIVE"
15 },
16 "inputs": [
17 {
18 "arg_name": "class_fields",
19 "arg_type": "POSITIONAL_OR_KEYWORD",
20 "data_type": "ANY",
21 "data_type_options": ["TEXT"],
22 "value": "{}"
23 }
24 ]
25 }
26 ]
27 },
28 {
29 "label": "__all_intra_class_fields",
30 "lines": [
31 {
32 "function_id": {
33 "name": "get_all_intra_class_fields",
34 "source": "NATIVE"
35 },
36 "inputs": [
37 {
38 "arg_name": "class_field_inputs",
39 "arg_type": "POSITIONAL_OR_KEYWORD",
40 "data_type": "FIELD",
41 "data_type_options": ["TEXT"],
42 "value": "__class_field_inputs"
43 },
44 {
45 "arg_name": "field_selection_strategy",
46 "arg_type": "POSITIONAL_OR_KEYWORD",
47 "data_type": "ANY",
48 "data_type_options": ["TEXT"],
49 "value": "\"best_field_value\""
50 },
51 {
52 "arg_name": "kwargs",
53 "arg_type": "VAR_KEYWORD",
54 "data_type": "DICT",
55 "data_type_options": ["DICT"],
56 "value": "{}"
57 }
58 ],
59 "output_type": "TEXT"
60 }
61 ]
62 },
63 {
64 "label": "__Loan__Application_Loan__Amount_<uuid>",
65 "lines": [
66 {
67 "function_id": {
68 "name": "get_intra_class_field_from_calculated",
69 "source": "NATIVE"
70 },
71 "inputs": [
72 {
73 "arg_name": "all_intra_class_fields",
74 "arg_type": "POSITIONAL_OR_KEYWORD",
75 "data_type": "FIELD",
76 "data_type_options": ["TEXT"],
77 "value": "__all_intra_class_fields"
78 },
79 {
80 "arg_name": "class_name",
81 "arg_type": "POSITIONAL_OR_KEYWORD",
82 "data_type": "ANY",
83 "data_type_options": ["TEXT"],
84 "value": "\"Loan_Application\""
85 },
86 {
87 "arg_name": "field_name",
88 "arg_type": "POSITIONAL_OR_KEYWORD",
89 "data_type": "ANY",
90 "data_type_options": ["TEXT"],
91 "value": "\"Loan__Amount\""
92 },
93 {
94 "arg_name": "kwargs",
95 "arg_type": "VAR_KEYWORD",
96 "data_type": "DICT",
97 "data_type_options": ["DICT"],
98 "value": "{}"
99 }
100 ],
101 "output_type": "TEXT"
102 }
103 ]
104 },
105 {
106 "label": "__W2_Wages__Tips_<uuid>",
107 "lines": [
108 {
109 "function_id": {
110 "name": "get_intra_class_field_from_calculated",
111 "source": "NATIVE"
112 },
113 "inputs": [
114 {
115 "arg_name": "all_intra_class_fields",
116 "arg_type": "POSITIONAL_OR_KEYWORD",
117 "data_type": "FIELD",
118 "data_type_options": ["TEXT"],
119 "value": "__all_intra_class_fields"
120 },
121 {
122 "arg_name": "class_name",
123 "arg_type": "POSITIONAL_OR_KEYWORD",
124 "data_type": "ANY",
125 "data_type_options": ["TEXT"],
126 "value": "\"W2\""
127 },
128 {
129 "arg_name": "field_name",
130 "arg_type": "POSITIONAL_OR_KEYWORD",
131 "data_type": "ANY",
132 "data_type_options": ["TEXT"],
133 "value": "\"Wages__Tips\""
134 },
135 {
136 "arg_name": "kwargs",
137 "arg_type": "VAR_KEYWORD",
138 "data_type": "DICT",
139 "data_type_options": ["DICT"],
140 "value": "{}"
141 }
142 ],
143 "output_type": "TEXT"
144 }
145 ]
146 }
147 ]
148}

In this pattern, kwargs on get_all_intra_class_fields and each get_intra_class_field_from_calculated line is required by the refiner schema but ignored at runtime; keep "value": "{}". For custom_udf strategies, pass an extra udf_json argument on get_all_intra_class_fields.

Derived cross-class fields (choice_type: DERIVED)

Prompt-based columns use refine_field_v2. The first prompt line sets previous_line to null; later lines chain previous_line to the prior line identifier (such as Is_Reasonable_Loan@0). prompt_arg_vals reference bridge label strings.

Three inputs use project-specific values that must be updated together: the prompt string in prompt (which embeds human-readable class field labels), prompt_arg_names (which lists those same human-readable labels), and prompt_arg_vals (which references the corresponding bridge labels from the fixed prefix). In this example, the field asks whether a loan amount from Loan_Application is reasonable given the wages from W2.

1{
2 "label": "Is_Reasonable_Loan",
3 "lines": [
4 {
5 "function_id": { "name": "refine_field_v2", "source": "NATIVE" },
6 "inputs": [
7 {
8 "arg_name": "prompt",
9 "arg_type": "POSITIONAL_OR_KEYWORD",
10 "data_type": "TEXT",
11 "data_type_options": ["TEXT"],
12 "value": "\"Is giving a loan of \\\\ Loan_Application.Loan_Amount \\\\ reasonable to someone making \\\\ W2.Wages_Tips \\\\ before taxes per year? Return in 1 word, Yes or No\""
13 },
14 {
15 "arg_name": "metrics_params",
16 "arg_type": "POSITIONAL_OR_KEYWORD",
17 "data_type": "ANY",
18 "data_type_options": ["TEXT"],
19 "value": "{\"source_id\": \"\", \"source_type\": \"\", \"user_agent\": \"\"}"
20 },
21 {
22 "arg_name": "proj_uuid",
23 "arg_type": "POSITIONAL_OR_KEYWORD",
24 "data_type": "TEXT",
25 "data_type_options": ["TEXT"],
26 "value": "\"<project_uuid>\""
27 },
28 {
29 "arg_name": "cached_index",
30 "arg_type": "POSITIONAL_OR_KEYWORD",
31 "data_type": "TEXT",
32 "data_type_options": ["TEXT"],
33 "value": "null",
34 "default": "null"
35 },
36 {
37 "arg_name": "custom_request",
38 "arg_type": "POSITIONAL_OR_KEYWORD",
39 "data_type": "ANY",
40 "data_type_options": ["TEXT"],
41 "value": "{}"
42 },
43 {
44 "arg_name": "doc_id",
45 "arg_type": "POSITIONAL_OR_KEYWORD",
46 "data_type": "TEXT",
47 "data_type_options": ["TEXT"],
48 "value": "null",
49 "default": "null"
50 },
51 {
52 "arg_name": "data_type",
53 "arg_type": "POSITIONAL_OR_KEYWORD",
54 "data_type": "TEXT",
55 "data_type_options": ["TEXT"],
56 "value": "\"TEXT\""
57 },
58 {
59 "arg_name": "previous_line",
60 "arg_type": "POSITIONAL_OR_KEYWORD",
61 "data_type": "TEXT",
62 "data_type_options": ["TEXT"],
63 "value": "null",
64 "default": "null"
65 },
66 {
67 "arg_name": "prompt_arg_names",
68 "arg_type": "POSITIONAL_OR_KEYWORD",
69 "data_type": "LIST",
70 "data_type_options": ["TEXT"],
71 "value": "[{\"data_type\": \"ANY\", \"value\": \"\\\"Loan_Application.Loan_Amount\\\"\"}, {\"data_type\": \"ANY\", \"value\": \"\\\"W2.Wages_Tips\\\"\"}]"
72 },
73 {
74 "arg_name": "prompt_arg_vals",
75 "arg_type": "POSITIONAL_OR_KEYWORD",
76 "data_type": "LIST",
77 "data_type_options": ["TEXT"],
78 "value": "[{\"data_type\": \"FIELD\", \"value\": \"__Loan__Application_Loan__Amount_<uuid>\"}, {\"data_type\": \"FIELD\", \"value\": \"__W2_Wages__Tips_<uuid>\"}]"
79 },
80 {
81 "arg_name": "prompt_arg_data_types",
82 "arg_type": "POSITIONAL_OR_KEYWORD",
83 "data_type": "LIST",
84 "data_type_options": ["TEXT"],
85 "value": "[{\"data_type\": \"ANY\", \"value\": \"\\\"TEXT\\\"\"}, {\"data_type\": \"ANY\", \"value\": \"\\\"TEXT\\\"\"}]"
86 },
87 {
88 "arg_name": "kwargs",
89 "arg_type": "VAR_KEYWORD",
90 "data_type": "DICT",
91 "data_type_options": ["DICT"],
92 "value": "{}"
93 }
94 ],
95 "output_type": "TEXT"
96 }
97 ]
98}

Ranked/aggregated cross-class fields (choice_type: AGGREGATED)

selection_logic (such as FIRST_VALID) maps to the first line’s native function name in lowercase (first_valid). input_fields order drives input_field_names and input_field_vals. The second line is always ranked_value_unwrap, referencing the first line by label and index (such as Applicant_Name@0).

Other ranking natives follow the same two-line pattern with a different function_id.name: ocr_confidence, field_confidence, first_ranked.

This example picks the applicant name by trying each class in priority order — Loan_Application, then Pay_Stub, then Bank_Statement, then W2 — and returning the first valid value. input_field_names and input_field_vals must be listed in the same order and reference bridge labels from the fixed prefix.

1{
2 "label": "Applicant_Name",
3 "lines": [
4 {
5 "function_id": { "name": "first_valid", "source": "NATIVE" },
6 "inputs": [
7 {
8 "arg_name": "input_field_names",
9 "arg_type": "POSITIONAL_OR_KEYWORD",
10 "data_type": "LIST",
11 "data_type_options": ["TEXT"],
12 "value": "[{\"data_type\": \"ANY\", \"value\": \"\\\"__Loan__Application_Borrower__Name_<uuid>\\\"\"}, {\"data_type\": \"ANY\", \"value\": \"\\\"__Pay__Stub_Employee_Name_<uuid>\\\"\"}, {\"data_type\": \"ANY\", \"value\": \"\\\"__Bank__Statement_Account__Holder_<uuid>\\\"\"}, {\"data_type\": \"ANY\", \"value\": \"\\\"__W2_Employer__Name_<uuid>\\\"\"}]"
13 },
14 {
15 "arg_name": "input_field_vals",
16 "arg_type": "POSITIONAL_OR_KEYWORD",
17 "data_type": "LIST",
18 "data_type_options": ["TEXT"],
19 "value": "[{\"data_type\": \"FIELD\", \"value\": \"__Loan__Application_Borrower__Name_<uuid>\"}, {\"data_type\": \"FIELD\", \"value\": \"__Pay__Stub_Employee_Name_<uuid>\"}, {\"data_type\": \"FIELD\", \"value\": \"__Bank__Statement_Account__Holder_<uuid>\"}, {\"data_type\": \"FIELD\", \"value\": \"__W2_Employer__Name_<uuid>\"}]"
20 },
21 {
22 "arg_name": "kwargs",
23 "arg_type": "VAR_KEYWORD",
24 "data_type": "DICT",
25 "data_type_options": ["DICT"],
26 "value": "{}"
27 }
28 ],
29 "output_type": "TEXT"
30 },
31 {
32 "function_id": { "name": "ranked_value_unwrap", "source": "NATIVE" },
33 "inputs": [
34 {
35 "arg_name": "ranked_value",
36 "arg_type": "POSITIONAL_OR_KEYWORD",
37 "data_type": "LINE",
38 "data_type_options": ["TEXT"],
39 "value": "Applicant_Name@0"
40 },
41 {
42 "arg_name": "kwargs",
43 "arg_type": "VAR_KEYWORD",
44 "data_type": "DICT",
45 "data_type_options": ["DICT"],
46 "value": "{}"
47 }
48 ]
49 }
50 ]
51}

Custom function cross-class fields (choice_type: UDF)

The primary line calls run_case_udf_in_lambda_v2 with: script path, serialized function_args, udf_id, lambda_udf_id, generated code_arg and fn_name, a class_fields map of human-readable names to bridge labels, udf_imports, and args for the lambda. ENUM fields may add select_options and output_type: "SELECT" on the column object.

This example calls a Python function that checks whether the loan amount is less than ten times the bank account’s ending balance. It takes Is_Reasonable_Loan — a cross-class field computed earlier in the same program — as a positional input via args. class_fields maps human-readable ClassName.FieldName keys to their corresponding bridge labels, making those values available to the function via the class_fields parameter. function_args lists any cross-class fields passed as named inputs.

1{
2 "label": "user__has__enough__money__in__bank",
3 "lines": [
4 {
5 "function_id": { "name": "run_case_udf_in_lambda_v2", "source": "NATIVE" },
6 "inputs": [
7 {
8 "arg_name": "absolute_scripts_path",
9 "arg_type": "POSITIONAL_OR_KEYWORD",
10 "data_type": "TEXT",
11 "data_type_options": ["TEXT"],
12 "value": "\"<path/to/udf_script.json>\""
13 },
14 {
15 "arg_name": "function_args",
16 "arg_type": "POSITIONAL_OR_KEYWORD",
17 "data_type": "TEXT",
18 "data_type_options": ["TEXT"],
19 "value": "[{\"name\": \"Is_Reasonable_Loan\", \"data_type\": \"FIELD\", \"value\": \"Is_Reasonable_Loan\"}]"
20 },
21 {
22 "arg_name": "lambda_udf_id",
23 "arg_type": "POSITIONAL_OR_KEYWORD",
24 "data_type": "TEXT",
25 "data_type_options": ["TEXT"],
26 "value": "\"<lambda_udf_id>\""
27 },
28 {
29 "arg_name": "packet_id",
30 "arg_type": "POSITIONAL_OR_KEYWORD",
31 "data_type": "TEXT",
32 "data_type_options": ["TEXT"],
33 "value": "null",
34 "default": "null"
35 },
36 {
37 "arg_name": "udf_id",
38 "arg_type": "POSITIONAL_OR_KEYWORD",
39 "data_type": "TEXT",
40 "data_type_options": ["TEXT"],
41 "value": "\"<udf_id>\""
42 },
43 {
44 "arg_name": "code_arg",
45 "arg_type": "POSITIONAL_OR_KEYWORD",
46 "data_type": "TEXT",
47 "data_type_options": ["TEXT"],
48 "value": "\"<escaped_python_source>\""
49 },
50 {
51 "arg_name": "fn_name",
52 "arg_type": "POSITIONAL_OR_KEYWORD",
53 "data_type": "TEXT",
54 "data_type_options": ["TEXT"],
55 "value": "\"user_has_enough_money_in_bank\""
56 },
57 {
58 "arg_name": "class_fields",
59 "arg_type": "POSITIONAL_OR_KEYWORD",
60 "data_type": "DICT",
61 "data_type_options": ["TEXT"],
62 "value": "{\"Loan_Application.Loan_Amount\": {\"name\": \"Loan_Application.Loan_Amount\", \"data_type\": \"FIELD\", \"value\": \"__Loan__Application_Loan__Amount_<uuid>\"}, \"Bank_Statement.Ending_Balance\": {\"name\": \"Bank_Statement.Ending_Balance\", \"data_type\": \"FIELD\", \"value\": \"__Bank__Statement_Ending__Balance_<uuid>\"}}"
63 },
64 {
65 "arg_name": "udf_imports",
66 "arg_type": "POSITIONAL_OR_KEYWORD",
67 "data_type": "TEXT",
68 "data_type_options": ["TEXT"],
69 "value": "[]"
70 },
71 {
72 "arg_name": "args",
73 "arg_type": "VAR_POSITIONAL",
74 "data_type": "LIST",
75 "value": "[{\"data_type\": \"FIELD\", \"value\": \"Is_Reasonable_Loan\"}]"
76 },
77 {
78 "arg_name": "kwargs",
79 "arg_type": "VAR_KEYWORD",
80 "data_type": "DICT",
81 "data_type_options": ["DICT"],
82 "value": "{}"
83 }
84 ],
85 "output_type": "TEXT"
86 }
87 ]
88}

Column ordering — Emit fixed-prefix columns first, then cross-class field columns in project order.

3

Cross-class checkpoint

This step is optional and applies only when the published project defines validation rules scoped to cross-class fields (case_field_validation_rules non-empty at publish). It runs after Process case on the case step’s output folder, so rules see both class extraction and materialized cross-class fields.

The checkpoint uses a validations module.

modules/case-field-validations.checkpoint/validations.ibvalidations

This validation file embeds cross-class settings from the project (project.settings.cross_class), so rules behave consistently with the app editor experience. Supported rule types include ALL_INPUTS_VALID, ALL_INPUTS_MATCH, CHOSEN_FIELD_VALID, and UDF.

KwargPurpose
input_folderOutput folder of the Process case step.
output_folderCheckpoint output for downstream steps.
ibvalidations_pathmodules/case-field-validations.checkpoint/validations.ibvalidations
validations_moduleSame path (duplicated for flow UI or executor).
settings.enable_stpTypically "false".
settings.execution_mode"run_validations_only"
1{
2 "kwargs": {
3 "input_folder": "s5_case",
4 "output_folder": "s6_apply_checkpoint",
5 "ibvalidations_path": "modules/case-field-validations.checkpoint/validations.ibvalidations",
6 "validations_module": "modules/case-field-validations.checkpoint/validations.ibvalidations",
7 "settings": {
8 "enable_stp": "false",
9 "execution_mode": "run_validations_only"
10 }
11 },
12 "option": { "internalName": "apply_checkpoint", "name": "Apply Checkpoint" }
13}

Validation file top-level shape:

1{
2 "mode": "case",
3 "metadata": {},
4 "validation_rules": []
5}

This module is distinct from class-level checkpoints such as modules/all-classes.checkpoint/validations.ibvalidations, which run earlier on single-class extraction.

4

Combine all

Use this final Combine step when you need all classes and packet-level fields together in one stream for downstream steps.

SettingValue
combine_same_file_recordsno
combine_all_file_recordsno