The Principia Machina/Tutorial/6 Fix refusals: Difference between revisions
tutorial: 6 Fix refusals |
m 1 revision imported |
||
| (10 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
{{TPM map}} | {{TPM map}} | ||
{{DISPLAYTITLE:Tutorial 6: Fix refusals}} | {{DISPLAYTITLE:Tutorial 6: Fix refusals}} | ||
''Tutorial: create a new UWC. One small example - a mass on a | ''Tutorial: create a new UWC. One small example - a mass on a spring, moving along one line, with nothing else in its world - is taken from a blank file to a declared UWC in eight steps. Each step says what runs today and what is specified but not yet built. It explains; the specification governs. Field-by-field reference: [[The Principia Machina/Inputs|Public Recorder inputs]].'' | ||
== Purpose == | == Purpose == | ||
Practise reading refusals and fixing them, on | Practise reading refusals and fixing them, on files that each contain deliberate mistakes - among them the commonest physics mistake: declaring a force and forgetting what balances it. | ||
''Explains: TPS 0. | ''Explains: TPS 0.3.0 (declared final on 2026-09-28 at revision 6; it follows TPS 0.1.1, declared final on 2026-09-26), whose sections 2.2 to 2.5 carry the zone schemas with the optional declared form, the ROLE field, the D variable and the structure check (records D92.1, D98.1, D99.1, D100.1, D103.1-D105.1, D106.1-D108.1, D132.1, D176.1, D177.1, D179.1 and D186.1); [[The Principia Machina/TPC-PY|TPC-PY 0.1.0]] (declared on 2026-09-28, tree digest a00161c1b321fd66abc591209007d46a7fa6290097835060e50f381426259043, conformed TPS 0.3.0; tpc_zone 0.5.0, tpc_units 0.1.1, tpc_tests 0.2.0, tpc_form 0.2.0, tpc_eom 0.1.0; schema 0.5.0) with check_draft 0.5.0, and [[The Principia Machina/TPC-PY|TPC-PY 0.2.0]] (declared on 2026-09-30; tree digest 2998ac4c24dff83bd047a691081b7d27bb25c9d26512bffe519f5c2b6ba127e2, conformed TPS 0.4.0; tpc_zone 0.5.1, tpc_units 0.1.2, tpc_tests 0.2.1, tpc_form 0.2.1, tpc_eom 0.2.0; schema 0.5.0) with check_draft 0.6.0. Where this page and the specification differ, the specification governs.'' | ||
Every refusal names its component first, so you can find it in your file. All problems in a zone are listed at once, sorted alphabetically. Fix them all, then run the check again. Every message is explained on [[The Principia Machina/Inputs/Refusal messages|Inputs: refusal messages]]. | Every refusal names its component first, so you can find it in your file. All problems in a zone are listed at once, sorted alphabetically. Fix them all, then run the check again. Every message is explained on [[The Principia Machina/Inputs/Refusal messages|Inputs: refusal messages]]. | ||
== Mistakes in the kernel == | == Mistakes in the kernel == | ||
<code>examples/spring_mistakes_tpk.json</code> is the step-2 kernel with | <code>examples/spring_mistakes_tpk.json</code> is the step-2 kernel with six entries changed: | ||
<pre> | <pre> | ||
DOF v: "DIMENSION": "LT-1" | |||
CONSTANT x_max: "NAME": "x max" | |||
LAW EOM_X: "REFS": ["m", "v", "k", "x", "t"] | |||
ASSUMPTION A_kpos gains: "STATE": "PROPOSED" | |||
CONSTRAINT C_NOZ: "UNIT": "s" | |||
BOUNDARY B_small: "REFS": ["x", "x max"] | |||
</pre> | </pre> | ||
The checker says: | The checker says: | ||
<pre> | <pre> | ||
TPK REFUSED, | TPK REFUSED, 9 problems | ||
ASSUMPTION: | ASSUMPTION:A_kpos: mutable field STATE is not permitted in the TFK | ||
BOUNDARY:B_small: CONDITION names x_max, which is not in REFS | |||
BOUNDARY:B_small: REFS x max is not named in CONDITION | |||
CONSTANT:x max: NAME x max is not an identifier | CONSTANT:x max: NAME x max is not an identifier | ||
CONSTRAINT:C_NOZ: UNIT s has dimension T1, not L1 of TARGET z | CONSTRAINT:C_NOZ: UNIT s has dimension T1, not L1 of TARGET z | ||
DOF:v: DIMENSION LT-1 is not a dimension | DOF:v: DIMENSION LT-1 is not a dimension | ||
LAW: | LAW:EOM_X: EQUATION names k_s, which is not in REFS | ||
LAW:EOM_X: REFS k does not resolve | |||
LAW:EOM_X: REFS k is not named in EQUATION | |||
TrM MISSING (not checked) | TrM MISSING (not checked) | ||
TMS MISSING (not checked) | TMS MISSING (not checked) | ||
FINAL not run: a zone is missing | FINAL not run: a zone is missing | ||
Advisory result (TPC-PY: tpc_zone 0. | Advisory result (TPC-PY: tpc_zone 0.5.1, tpc_units 0.1.2, tpc_tests 0.2.1, tpc_form 0.2.1, tpc_eom 0.2.0; schema 0.5.0). TPX decides at the gate. | ||
</pre> | </pre> | ||
| Line 65: | Line 43: | ||
! Message !! What is wrong !! Fix | ! Message !! What is wrong !! Fix | ||
|- | |- | ||
| <code>ASSUMPTION: | | <code>ASSUMPTION:A_kpos: mutable field STATE ...</code> || a status field inside the kernel || delete <code>"STATE": "PROPOSED"</code>; status lives in register records | ||
|- | |||
| <code>BOUNDARY:B_small: CONDITION names x_max, which is not in REFS</code> and <code>REFS x max is not named in CONDITION</code> || the boundary's REFS followed the misspelled constant; its CONDITION did not || fixed by renaming the constant and correcting the REFS, below | |||
|- | |- | ||
| <code>CONSTANT:x max: NAME x max is not an identifier</code> || a space in a name || rename it <code>x_max</code>, and correct the boundary's REFS to match | | <code>CONSTANT:x max: NAME x max is not an identifier</code> || a space in a name || rename it <code>x_max</code>, and correct the boundary's REFS to match | ||
|- | |||
| <code>CONSTRAINT:C_NOZ: UNIT s has dimension T1, ...</code> || z is a length, fixed with a unit of time || write <code>"UNIT": "m"</code> | |||
|- | |- | ||
| <code>DOF:v: DIMENSION LT-1 is not a dimension</code> || the tokens run together || write <code>L1 T-1</code> | | <code>DOF:v: DIMENSION LT-1 is not a dimension</code> || the tokens run together || write <code>L1 T-1</code> | ||
|- | |- | ||
| <code>LAW: | | <code>LAW:EOM_X: REFS k does not resolve</code>, <code>EQUATION names k_s, which is not in REFS</code> and <code>REFS k is not named in EQUATION</code> || REFS names <code>k</code>, but the constant, and the equation, say <code>k_s</code> || correct the REFS entry | ||
|} | |} | ||
Nine lines, six mistakes. The declared forms report two of them more than once: an EQUATION or CONDITION must name exactly its REFS, so a wrong REFS entry shows up against the form as well. Without the forms, the boundary's REFS <code>x max</code> would have matched the misspelled constant and passed unnoticed. When you rename a thing, search the file for every place that cites it. | |||
== Mistakes in the manifold == | == Mistakes in the manifold == | ||
<code>examples/spring_mistakes_trm.json</code> | <code>examples/spring_mistakes_trm.json</code> is the step-3 file with this entry E_v: | ||
<pre> | <pre> | ||
{ | { | ||
| Line 85: | Line 65: | ||
"DOMAIN": "|x| < x_max", | "DOMAIN": "|x| < x_max", | ||
"ENVIRONMENT_QUANTITY": "speed", | "ENVIRONMENT_QUANTITY": "speed", | ||
"IDENTIFICATION": "v is the | "IDENTIFICATION": "v is the rate of change of x with t", | ||
"FALSIFIER": "a measured velocity | "FALSIFIER": "a measured velocity that differs from the rate of change of the measured x beyond uncertainty", | ||
"BEARS": ["KIN"], | "BEARS": ["KIN"], | ||
"DIMENSION": "L1 T-1" | "DIMENSION": "L1 T-1" | ||
| Line 96: | Line 76: | ||
T2 PASS | T2 PASS | ||
T5 PASS | T5 PASS | ||
T4 PASS | |||
T6 PASS | |||
TrM REFUSED, 2 problems | TrM REFUSED, 2 problems | ||
ENTRY:E_v: ENVIRONMENT_QUANTITY speed is not in the ENVIRONMENT INVENTORY | ENTRY:E_v: ENVIRONMENT_QUANTITY speed is not in the ENVIRONMENT INVENTORY | ||
| Line 102: | Line 84: | ||
FINAL not run: a zone is missing | FINAL not run: a zone is missing | ||
Advisory result (TPC-PY: tpc_zone 0. | Advisory result (TPC-PY: tpc_zone 0.5.1, tpc_units 0.1.2, tpc_tests 0.2.1, tpc_form 0.2.1, tpc_eom 0.2.0; schema 0.5.0). TPX decides at the gate. | ||
</pre> | </pre> | ||
| Line 128: | Line 110: | ||
T2 PASS | T2 PASS | ||
T5 PASS | T5 PASS | ||
T4 PASS | |||
T6 PASS | |||
TrM PASS | TrM PASS | ||
IC1-IC4 PASS | IC1-IC4 PASS | ||
| Line 135: | Line 119: | ||
FINAL not run: it runs once every check above passes | FINAL not run: it runs once every check above passes | ||
Advisory result (TPC-PY: tpc_zone 0. | Advisory result (TPC-PY: tpc_zone 0.5.1, tpc_units 0.1.2, tpc_tests 0.2.1, tpc_form 0.2.1, tpc_eom 0.2.0; schema 0.5.0). TPX decides at the gate. | ||
</pre> | </pre> | ||
| Line 146: | Line 130: | ||
"NAME": "KIN", | "NAME": "KIN", | ||
"STATEMENT": "dx/dt = v\u202e", | "STATEMENT": "dx/dt = v\u202e", | ||
"REFS": ["x", "v"] | "REFS": ["x", "v", "t"], | ||
"ROLE": "EOM(x)", | |||
"EQUATION": "D(x, t) = v" | |||
} | } | ||
</pre> | </pre> | ||
| Line 157: | Line 143: | ||
FINAL not run: a zone is missing | FINAL not run: a zone is missing | ||
Advisory result (TPC-PY: tpc_zone 0. | Advisory result (TPC-PY: tpc_zone 0.5.1, tpc_units 0.1.2, tpc_tests 0.2.1, tpc_form 0.2.1, tpc_eom 0.2.0; schema 0.5.0). TPX decides at the gate. | ||
</pre> | </pre> | ||
| Line 163: | Line 149: | ||
== Mistakes the kernel tests and isomorphism checks catch == | == Mistakes the kernel tests and isomorphism checks catch == | ||
<code>examples/spring_mistakes_checks.json</code> is the finished draft with four changes. Each is well-formed on its own, so the | <code>examples/spring_mistakes_checks.json</code> is the finished draft with four changes. Each is well-formed on its own, so the structural checks pass, and the next checks find them: | ||
<pre> | <pre> | ||
ASSUMPTION | ASSUMPTION A_pos (in place of A_kpos and A_mpos): | ||
"PROPOSITION": "k_s is positive and m is positive" | |||
DOF added: {"NAME": "y", "DIMENSION": "L1"} | DOF added: {"NAME": "y", "DIMENSION": "L1"} | ||
inventory added: {"ENVIRONMENT_QUANTITY": "acceleration", "DIMENSION": "L1 T-2"} | inventory added: {"ENVIRONMENT_QUANTITY": "acceleration", "DIMENSION": "L1 T-2"} | ||
| Line 175: | Line 162: | ||
TPK PASS | TPK PASS | ||
T2 REFUSED, 1 problem | T2 REFUSED, 1 problem | ||
ASSUMPTION: | ASSUMPTION:A_pos: PROPOSITION joins claims with "and" (T2) | ||
T5 REFUSED, 1 problem | T5 REFUSED, 1 problem | ||
DOF:y: named by no LAW (T5 c) | DOF:y: named by no LAW (T5 c) | ||
T4 PASS | |||
T6 PASS | |||
TrM PASS | TrM PASS | ||
IC1-IC4 REFUSED, 3 problems | IC1-IC4 REFUSED, 3 problems | ||
| Line 189: | Line 178: | ||
FINAL not run: it runs once every check above passes | FINAL not run: it runs once every check above passes | ||
Advisory result (TPC-PY: tpc_zone 0. | Advisory result (TPC-PY: tpc_zone 0.5.1, tpc_units 0.1.2, tpc_tests 0.2.1, tpc_form 0.2.1, tpc_eom 0.2.0; schema 0.5.0). TPX decides at the gate. | ||
</pre> | </pre> | ||
| Line 195: | Line 184: | ||
! Message !! What is wrong !! Fix | ! Message !! What is wrong !! Fix | ||
|- | |- | ||
| <code>ASSUMPTION: | | <code>ASSUMPTION:A_pos: PROPOSITION joins claims with "and" (T2)</code> || two claims in one assumption || make two assumptions, each with its own REFS: A_kpos for the stiffness, A_mpos for the mass | ||
|- | |- | ||
| <code>DOF:y: named by no LAW (T5 c)</code> || y was added, but no law uses it || add the law that governs y | | <code>DOF:y: named by no LAW (T5 c)</code> || y was added, but no law uses it || add the law that governs y - its equation of motion - or delete y | ||
|- | |- | ||
| <code>IC1: environment quantity acceleration is identified by no entry</code> || the inventory lists a quantity no entry uses || remove it from the inventory; the kernel has no DOF for it | | <code>IC1: environment quantity acceleration is identified by no entry</code> || the inventory lists a quantity no entry uses || remove it from the inventory; the kernel has no degree of freedom (DOF) for it | ||
|- | |- | ||
| <code>IC4(b): ENTRY:E_v: DIMENSION L1 differs ...</code> (two lines) || E_v says a length; v and velocity are L1 T-1 || write <code>"DIMENSION": "L1 T-1"</code> in E_v | | <code>IC4(b): ENTRY:E_v: DIMENSION L1 differs ...</code> (two lines) || E_v says a length; v and velocity are L1 T-1 || write <code>"DIMENSION": "L1 T-1"</code> in E_v | ||
| Line 206: | Line 195: | ||
|} | |} | ||
The last line is not a problem. It is held for the final pass, where the Measure Set's IC2_POLICY would decide it; the final pass did not run, because other checks refused. Note that T2 and T5 did not stop the manifold's checks: those need only a kernel that passes T1, so you see every problem in one run. | The last line is not a problem. It is held for the final pass, where the Measure Set's IC2_POLICY would decide it; the final pass did not run, because other checks refused. Note that T2 and T5 did not stop the manifold's checks: those need only a kernel that passes T1, so you see every problem in one run. | ||
== Two the declared forms catch == | |||
<code>examples/spring_mistakes_form_law.json</code> is the finished draft with a slip in EOM_X's equation: <code>"EQUATION": "m * D(v, t) = -k_s * x * x"</code>. | |||
<pre> | |||
TPK PASS | |||
T2 PASS | |||
T5 PASS | |||
T4 REFUSED, 1 problem | |||
LAW:EOM_X: EQUATION sides have dimensions L1 M1 T-2 and L2 M1 T-2 (T4) | |||
T6 PASS | |||
TrM PASS | |||
IC1-IC4 PASS | |||
TMS PASS | |||
YARDSTICK combined_distance: C1 pass, C2 pass, C4 pass | |||
FINAL not run: it runs once every check above passes | |||
Advisory result (TPC-PY: tpc_zone 0.5.1, tpc_units 0.1.2, tpc_tests 0.2.1, tpc_form 0.2.1, tpc_eom 0.2.0; schema 0.5.0). TPX decides at the gate. | |||
</pre> | |||
The left side is a force, <code>L1 M1 T-2</code>; the right side, with x twice, is <code>L2 M1 T-2</code>. Write <code>-k_s * x</code>. Only the EQUATION is read: the STATEMENT still said <code>-k_s x</code>, and a STATEMENT that disagreed with its EQUATION would pass every mechanical check. That agreement is read by the declaring authority at step 7. | |||
<code>examples/spring_mistakes_form_boundary.json</code> rewrites the boundary's CONDITION as <code>"x / x_max < 1"</code>: | |||
<pre> | |||
TPK PASS | |||
T2 PASS | |||
T5 PASS | |||
T4 PASS | |||
T6 REFUSED, 1 problem | |||
BOUNDARY:B_small: CONDITION uses / on x_max with no guard x_max != 0 (T6) | |||
TrM PASS | |||
IC1-IC4 PASS | |||
TMS PASS | |||
YARDSTICK combined_distance: C1 pass, C2 pass, C4 pass | |||
FINAL not run: it runs once every check above passes | |||
Advisory result (TPC-PY: tpc_zone 0.5.1, tpc_units 0.1.2, tpc_tests 0.2.1, tpc_form 0.2.1, tpc_eom 0.2.0; schema 0.5.0). TPX decides at the gate. | |||
</pre> | |||
Dividing by x_max is undefined where x_max is 0, and a boundary must be decided for every value (T6). Either guard it, <code>x_max != 0 and x / x_max < 1</code>, or, better, write what the PREDICATE says, <code>abs(x) < x_max</code>. The guard would silence T6 but not the second mistake: <code>x / x_max < 1</code> drops the lower half of <code>|x| < x_max</code>. The checker does not compare a CONDITION with its PREDICATE; the declaring authority does. | |||
== One the final pass catches == | == One the final pass catches == | ||
<code>examples/spring_mistakes_final.json</code> is the finished draft with a second constraint on z: | <code>examples/spring_mistakes_final.json</code> is the finished draft with a second constraint on z: | ||
<pre> | <pre> | ||
{ | |||
"NAME": "C_OFF", | |||
"TARGET": "z", | |||
"ACTION": "FIX", | |||
"VALUE": "2", | |||
"UNIT": "cm", | |||
"STATEMENT": "only motion on the line z = 2 cm is described" | |||
} | |||
</pre> | </pre> | ||
| Line 224: | Line 252: | ||
T2 PASS | T2 PASS | ||
T5 PASS | T5 PASS | ||
T4 PASS | |||
T6 PASS | |||
TrM PASS | TrM PASS | ||
IC1-IC4 PASS | IC1-IC4 PASS | ||
TMS PASS | TMS PASS | ||
YARDSTICK combined_distance: C1 pass, C2 pass, C4 pass | YARDSTICK combined_distance: C1 pass, C2 pass, C4 pass | ||
FINAL T3 and IC2 REFUSED, 1 problem | FINAL T3 (constraints and laws) and IC2 REFUSED, 1 problem | ||
CONSTRAINT:C_NOZ and CONSTRAINT: | CONSTRAINT:C_NOZ and CONSTRAINT:C_OFF: z fixed at 0 m and at 2 cm (T3) | ||
Advisory result (TPC-PY: tpc_zone 0. | Advisory result (TPC-PY: tpc_zone 0.5.1, tpc_units 0.1.2, tpc_tests 0.2.1, tpc_form 0.2.1, tpc_eom 0.2.0; schema 0.5.0). TPX decides at the gate. | ||
</pre> | </pre> | ||
Everything before the final pass passes: | Everything before the final pass passes: C_OFF is well-formed, its unit is a length, and a law (EOM_Z) names z. Only with the three zones in hand does T3 compare the two values, in SI: 0 m against 0.02 m. A DOF cannot be fixed at two values; keep one constraint. | ||
== Gravity without the track == | |||
The commonest physics mistake is to declare one force and forget what balances it. <code>examples/spring_mistakes_gravity.json</code> is the finished draft, reread as a glider on a level track with z the height: the manifold's quantity for z is renamed <code>height</code>, and the author adds standard gravity (<code>g_n</code>, 9.80665 m s-2, the conventional value of the 3rd CGPM, 1901) and changes EOM_Z to say that gravity pulls the mass down, but keeps C_NOZ, the track that holds z at 0, and declares no force from the track: | |||
<pre> | |||
"g_n" constant: {"NAME": "g_n", "DIMENSION": "L1 T-2", "VALUE": "9.80665", "UNIT": "m s-2"} | |||
LAW EOM_Z: "EQUATION": "D(z, t, 2) = -g_n" | |||
</pre> | |||
<pre> | |||
TPK PASS | |||
T2 PASS | |||
T5 PASS | |||
T4 PASS | |||
T6 PASS | |||
TrM PASS | |||
IC1-IC4 PASS | |||
TMS PASS | |||
YARDSTICK combined_distance: C1 pass, C2 pass, C4 pass | |||
FINAL T3 (constraints and laws) and IC2 REFUSED, 1 problem | |||
LAW:EOM_Z and CONSTRAINT:C_NOZ: EOM_Z evaluates 0 = -9.80665 under the fixed values (T3) | |||
Advisory result (TPC-PY: tpc_zone 0.5.1, tpc_units 0.1.2, tpc_tests 0.2.1, tpc_form 0.2.1, tpc_eom 0.2.0; schema 0.5.0). TPX decides at the gate. | |||
</pre> | |||
The final pass evaluates EOM_Z, because every name in it now has a value: z is fixed, so its second derivative is 0, and g_n is 9.80665. The law says 0 = -9.80665. The kernel says the mass falls and says it cannot move: it contradicts itself. In the laboratory the track pushes up on the glider; in the kernel nothing does, because nothing is declared. | |||
The fix is to declare the track's push. <code>examples/spring_track_draft.json</code> adds a DOF <code>F_n</code>, the support force, puts it in EOM_Z, and gives it a manifold entry: | |||
<pre> | |||
DOF added: {"NAME": "F_n", "DIMENSION": "M1 L1 T-2"} | |||
LAW EOM_Z: "STATEMENT": "m d2z/dt2 = F_n - m g_n" | |||
"REFS": ["m", "z", "t", "F_n", "g_n"] | |||
"EQUATION": "m * D(z, t, 2) = F_n - m * g_n" | |||
inventory added: {"ENVIRONMENT_QUANTITY": "support_force", "DIMENSION": "M1 L1 T-2"} | |||
ENTRY added: E_Fn, identifying F_n with the upward force the track exerts, bearing EOM_Z | |||
</pre> | |||
<pre> | |||
TPK PASS | |||
T2 PASS | |||
T5 PASS | |||
T4 PASS | |||
T6 PASS | |||
TrM PASS | |||
IC1-IC4 PASS | |||
TMS PASS | |||
YARDSTICK combined_distance: C1 pass, C2 pass, C4 pass | |||
FINAL T3 (constraints and laws) and IC2 PASS | |||
STRUCTURE map (shown whatever STRUCTURE_CHECK says): analysis RUN; D variable t | |||
F_n: DETERMINED (LAW EOM_Z) | |||
t: INDEPENDENT | |||
v: DETERMINED (LAW EOM_X) | |||
x: DETERMINED (LAW KIN) | |||
z: FIXED | |||
index 1, initial values 2 (the determined part; information) | |||
STRUCTURE findings: none | |||
STRUCTURE structurally regular | |||
D(TPK) f01d82e2c6e46eb4b549382f4398570ee8e0a540a7885af18f9042a0326eace5 | |||
D(TrM) 6778314c5a7a282386bf464b8769b13df4defb100b3baa52edecff1976d953c1 | |||
D(TMS) 7a962e2297d6798801fa2593be9cd92995cc3a5f9c817cc8a19335c625784128 | |||
D(TFK) 011f001b46bb88284595b42f00772a8331f0b2a15ed7507974ee78dfd1f060fc | |||
Inspections still owed to the declaring authority before declaring: | |||
- T2 the semantic part: each ASSUMPTION states one claim (guide 3.6) | |||
- T3 over the assumptions, and over the laws beyond the ground fragment at depth 1, to depth S_MAX (guide 3.6) | |||
- T4, T6 and T3 over every law or boundary without a declared form, as listed beside the kernel tests (D108.1) | |||
- IC4 (a) that each SIGNATURE image holds in the environment, beyond the syntactic reading, and each borne law is expressible (guide 4.6) | |||
- IC5 falsifier invariance under the TRANSFORMATIONS (guide 4.6) | |||
- equivalence of environment quantities under the TRANSFORMATIONS (names are taken as written) | |||
- every STATEMENT, PROPOSITION, PREDICATE and IMAGE names only what its REFS or OVER list, and agrees with its declared form where one exists | |||
Advisory result (TPC-PY: tpc_zone 0.5.1, tpc_units 0.1.2, tpc_tests 0.2.1, tpc_form 0.2.1, tpc_eom 0.2.0; schema 0.5.0). TPX decides at the gate. | |||
</pre> | |||
It passes. The support is now in the UWC, and with C_NOZ it has a value a result can derive: F_n = m g_n. Friction and air resistance are still absent, because they are still undeclared; add them the same way if your glider feels them. | |||
Two cautions. First, T3 caught the first version only because every name in EOM_Z had a value. Written as <code>m * D(z, t, 2) = -m * g_n</code> (<code>examples/spring_gravity_unbound.json</code>), the same mistake is refused by no check, because m has no value; the structure check lists it for the declaring authority instead, with a question: | |||
<pre> | |||
STRUCTURE findings: 1 | |||
CLOSED: LAW EOM_Z names no unknown once the fixed DOFs are applied, and depends on m, which the kernel does not bind: does it hold for every value of m, or is a force or an unknown missing? | |||
</pre> | |||
It then waits for the declaring authority at step 7. Second, <code>g_n</code> here is a constant you typed, with a value you chose; it is gravity only because you declared it. | |||
Environment modules are selected (D178.1) and not yet built. Once TPX runs the new-container form, gravity at the standard strength is offered as a module the author chooses; it adds g_n and its term to the equation of motion of the DOF it is bound to, and, where that DOF is fixed, as z is here, the form asks the support-force question instead of leaving the support out. What each module adds is on [[The Principia Machina/Inputs/Environment modules|Inputs: environment modules]]. Until then, g_n and F_n are declared by hand, as above. | |||
== Two more you will meet == | == Two more you will meet == | ||
A missing comma or bracket stops the file from being read at all: | A missing comma or bracket stops the file from being read at all. <code>examples/spring_mistakes_syntax.json</code> lacks the comma after the DOF x: | ||
<pre> | <pre> | ||
DRAFT: cannot be read: Expecting ',' delimiter: line 6 column 7 (char | DRAFT: cannot be read: Expecting ',' delimiter: line 6 column 7 (char 111) | ||
</pre> | </pre> | ||
The message gives the line and column. And a number where a string belongs, or the reverse: | The message gives the line and column where the reader stopped, which is just after the mistake. And a number where a string belongs, or the reverse (<code>examples/spring_mistakes_types.json</code>, with <code>"K": 2</code> and <code>"N_X": "2"</code>): | ||
<pre> | <pre> | ||
TPK PASS | |||
T2 PASS | |||
T5 PASS | |||
T4 PASS | |||
T6 PASS | |||
TrM PASS | |||
IC1-IC4 PASS | |||
TMS REFUSED, 2 problems | TMS REFUSED, 2 problems | ||
PARAMETERS: field K has the wrong type | PARAMETERS: field K has the wrong type | ||
PARAMETERS: field N_X has the wrong type | PARAMETERS: field N_X has the wrong type | ||
FINAL not run: it runs once every check above passes | |||
Advisory result (TPC-PY: tpc_zone 0.5.1, tpc_units 0.1.2, tpc_tests 0.2.1, tpc_form 0.2.1, tpc_eom 0.2.0; schema 0.5.0). TPX decides at the gate. | |||
</pre> | </pre> | ||
| Line 252: | Line 375: | ||
== Non-goals == | == Non-goals == | ||
The checker never repairs a draft. It tells you what to change; you change it. | The checker never repairs a draft. It tells you what to change; you change it. And it never tells you what you forgot to declare. | ||
== Worked example == | == Worked example == | ||
The step is its own example. | The step is its own example. | ||
Governing sections: [[The Principia Machina/TPS/5.5 The new-container flow|TPS 5.5]], [[The Principia Machina/TPS/2.2 The Prime Kernel|2.2]], [[The Principia Machina/TPS/2.3 The Translation Manifold|2.3]] | Governing sections: [[The Principia Machina/TPS/5.5 The new-container flow|TPS 5.5]], [[The Principia Machina/TPS/2.2 The Prime Kernel|2.2]], [[The Principia Machina/TPS/2.3 The Translation Manifold|2.3]], [[The Principia Machina/TPS/2.4 The Measure Set|2.4]] and [[The Principia Machina/TPS/4.4 The strike rule|4.4]]. | ||
---- | ---- | ||
Latest revision as of 13:34, 30 September 2026
| The Principia Machina: map |
|---|
| Reading the diagrams Structure key Process key Definition of terms Roles |
| Reading by audience Start here: the walk through The operator's guide Tutorial: create a UUID Workspace Container (UWC) Public Recorder inputs Sponsors: your first agent |
| The specification Contents: parts, tables, diagrams TPS 0.5.0 (declared 2026-10-03, revision 8; machine-optimized text) Decisions (the foundations record, one line each) |
Tutorial: create a new UWC. One small example - a mass on a spring, moving along one line, with nothing else in its world - is taken from a blank file to a declared UWC in eight steps. Each step says what runs today and what is specified but not yet built. It explains; the specification governs. Field-by-field reference: Public Recorder inputs.
Purpose
Practise reading refusals and fixing them, on files that each contain deliberate mistakes - among them the commonest physics mistake: declaring a force and forgetting what balances it.
Explains: TPS 0.3.0 (declared final on 2026-09-28 at revision 6; it follows TPS 0.1.1, declared final on 2026-09-26), whose sections 2.2 to 2.5 carry the zone schemas with the optional declared form, the ROLE field, the D variable and the structure check (records D92.1, D98.1, D99.1, D100.1, D103.1-D105.1, D106.1-D108.1, D132.1, D176.1, D177.1, D179.1 and D186.1); TPC-PY 0.1.0 (declared on 2026-09-28, tree digest a00161c1b321fd66abc591209007d46a7fa6290097835060e50f381426259043, conformed TPS 0.3.0; tpc_zone 0.5.0, tpc_units 0.1.1, tpc_tests 0.2.0, tpc_form 0.2.0, tpc_eom 0.1.0; schema 0.5.0) with check_draft 0.5.0, and TPC-PY 0.2.0 (declared on 2026-09-30; tree digest 2998ac4c24dff83bd047a691081b7d27bb25c9d26512bffe519f5c2b6ba127e2, conformed TPS 0.4.0; tpc_zone 0.5.1, tpc_units 0.1.2, tpc_tests 0.2.1, tpc_form 0.2.1, tpc_eom 0.2.0; schema 0.5.0) with check_draft 0.6.0. Where this page and the specification differ, the specification governs.
Every refusal names its component first, so you can find it in your file. All problems in a zone are listed at once, sorted alphabetically. Fix them all, then run the check again. Every message is explained on Inputs: refusal messages.
Mistakes in the kernel
examples/spring_mistakes_tpk.json is the step-2 kernel with six entries changed:
DOF v: "DIMENSION": "LT-1" CONSTANT x_max: "NAME": "x max" LAW EOM_X: "REFS": ["m", "v", "k", "x", "t"] ASSUMPTION A_kpos gains: "STATE": "PROPOSED" CONSTRAINT C_NOZ: "UNIT": "s" BOUNDARY B_small: "REFS": ["x", "x max"]
The checker says:
TPK REFUSED, 9 problems
ASSUMPTION:A_kpos: mutable field STATE is not permitted in the TFK
BOUNDARY:B_small: CONDITION names x_max, which is not in REFS
BOUNDARY:B_small: REFS x max is not named in CONDITION
CONSTANT:x max: NAME x max is not an identifier
CONSTRAINT:C_NOZ: UNIT s has dimension T1, not L1 of TARGET z
DOF:v: DIMENSION LT-1 is not a dimension
LAW:EOM_X: EQUATION names k_s, which is not in REFS
LAW:EOM_X: REFS k does not resolve
LAW:EOM_X: REFS k is not named in EQUATION
TrM MISSING (not checked)
TMS MISSING (not checked)
FINAL not run: a zone is missing
Advisory result (TPC-PY: tpc_zone 0.5.1, tpc_units 0.1.2, tpc_tests 0.2.1, tpc_form 0.2.1, tpc_eom 0.2.0; schema 0.5.0). TPX decides at the gate.
| Message | What is wrong | Fix |
|---|---|---|
ASSUMPTION:A_kpos: mutable field STATE ... |
a status field inside the kernel | delete "STATE": "PROPOSED"; status lives in register records
|
BOUNDARY:B_small: CONDITION names x_max, which is not in REFS and REFS x max is not named in CONDITION |
the boundary's REFS followed the misspelled constant; its CONDITION did not | fixed by renaming the constant and correcting the REFS, below |
CONSTANT:x max: NAME x max is not an identifier |
a space in a name | rename it x_max, and correct the boundary's REFS to match
|
CONSTRAINT:C_NOZ: UNIT s has dimension T1, ... |
z is a length, fixed with a unit of time | write "UNIT": "m"
|
DOF:v: DIMENSION LT-1 is not a dimension |
the tokens run together | write L1 T-1
|
LAW:EOM_X: REFS k does not resolve, EQUATION names k_s, which is not in REFS and REFS k is not named in EQUATION |
REFS names k, but the constant, and the equation, say k_s |
correct the REFS entry |
Nine lines, six mistakes. The declared forms report two of them more than once: an EQUATION or CONDITION must name exactly its REFS, so a wrong REFS entry shows up against the form as well. Without the forms, the boundary's REFS x max would have matched the misspelled constant and passed unnoticed. When you rename a thing, search the file for every place that cites it.
Mistakes in the manifold
examples/spring_mistakes_trm.json is the step-3 file with this entry E_v:
{
"NAME": "E_v",
"DOF": "v",
"DOMAIN": "|x| < x_max",
"ENVIRONMENT_QUANTITY": "speed",
"IDENTIFICATION": "v is the rate of change of x with t",
"FALSIFIER": "a measured velocity that differs from the rate of change of the measured x beyond uncertainty",
"BEARS": ["KIN"],
"DIMENSION": "L1 T-1"
}
TPK PASS
T2 PASS
T5 PASS
T4 PASS
T6 PASS
TrM REFUSED, 2 problems
ENTRY:E_v: ENVIRONMENT_QUANTITY speed is not in the ENVIRONMENT INVENTORY
ENTRY:E_v: missing field FALSIFIER_CLASS
TMS MISSING (not checked)
FINAL not run: a zone is missing
Advisory result (TPC-PY: tpc_zone 0.5.1, tpc_units 0.1.2, tpc_tests 0.2.1, tpc_form 0.2.1, tpc_eom 0.2.0; schema 0.5.0). TPX decides at the gate.
E_v names speed, which the inventory does not list (it says velocity), and has no FALSIFIER_CLASS. Use velocity and add "FALSIFIER_CLASS": "F2".
Mistakes in the Measure Set
examples/spring_mistakes_tms.json declares these two yardsticks:
"YARDSTICKS": [
{
"NAME": "combined_distance",
"KEY": ["WSUM:w_a*A;w_s*S", "S"],
"LIMITING": []
},
{
"NAME": "prefers_more",
"KEY": ["SR1", "NEG:A"],
"LIMITING": []
}
]
TPK PASS
T2 PASS
T5 PASS
T4 PASS
T6 PASS
TrM PASS
IC1-IC4 PASS
TMS REFUSED, 2 problems
YARDSTICK:combined_distance: KEY must begin with SR1
YARDSTICK:prefers_more: KEY ranks a record higher when an assumption is added (SR9 C2)
FINAL not run: it runs once every check above passes
Advisory result (TPC-PY: tpc_zone 0.5.1, tpc_units 0.1.2, tpc_tests 0.2.1, tpc_form 0.2.1, tpc_eom 0.2.0; schema 0.5.0). TPX decides at the gate.
The first key begins with the weighted sum instead of SR1; put SR1 first. The second, ["SR1", "NEG:A"], prefers records with more assumptions, which SR9 C2 forbids; delete it, or, if it expresses a real limiting case, move it into a LIMITING entry with the DOMAIN where it applies.
A hidden character
examples/spring_mistakes_text.json has an invisible right-to-left override, U+202E, at the end of a law's statement. On screen the statement looks correct; in the file, where JSON lets it be written as an escape, it is visible:
{
"NAME": "KIN",
"STATEMENT": "dx/dt = v\u202e",
"REFS": ["x", "v", "t"],
"ROLE": "EOM(x)",
"EQUATION": "D(x, t) = v"
}
TPK REFUSED, 1 problem
LAW:KIN: field STATEMENT contains disallowed character U+202E
TrM MISSING (not checked)
TMS MISSING (not checked)
FINAL not run: a zone is missing
Advisory result (TPC-PY: tpc_zone 0.5.1, tpc_units 0.1.2, tpc_tests 0.2.1, tpc_form 0.2.1, tpc_eom 0.2.0; schema 0.5.0). TPX decides at the gate.
Delete the statement and type it again. Text copied from web pages, chat programs and PDF files is where such characters usually come from.
Mistakes the kernel tests and isomorphism checks catch
examples/spring_mistakes_checks.json is the finished draft with four changes. Each is well-formed on its own, so the structural checks pass, and the next checks find them:
ASSUMPTION A_pos (in place of A_kpos and A_mpos):
"PROPOSITION": "k_s is positive and m is positive"
DOF added: {"NAME": "y", "DIMENSION": "L1"}
inventory added: {"ENVIRONMENT_QUANTITY": "acceleration", "DIMENSION": "L1 T-2"}
ENTRY E_v: "DIMENSION": "L1"
The checker says:
TPK PASS
T2 REFUSED, 1 problem
ASSUMPTION:A_pos: PROPOSITION joins claims with "and" (T2)
T5 REFUSED, 1 problem
DOF:y: named by no LAW (T5 c)
T4 PASS
T6 PASS
TrM PASS
IC1-IC4 REFUSED, 3 problems
IC1: environment quantity acceleration is identified by no entry
IC4(b): ENTRY:E_v: DIMENSION L1 differs from DOF v's L1 T-1
IC4(b): ENTRY:E_v: DIMENSION L1 differs from environment quantity velocity's L1 T-1
and 1 untied DOF, held for the final pass
IC2: DOF y is untied
TMS PASS
YARDSTICK combined_distance: C1 pass, C2 pass, C4 pass
FINAL not run: it runs once every check above passes
Advisory result (TPC-PY: tpc_zone 0.5.1, tpc_units 0.1.2, tpc_tests 0.2.1, tpc_form 0.2.1, tpc_eom 0.2.0; schema 0.5.0). TPX decides at the gate.
| Message | What is wrong | Fix |
|---|---|---|
ASSUMPTION:A_pos: PROPOSITION joins claims with "and" (T2) |
two claims in one assumption | make two assumptions, each with its own REFS: A_kpos for the stiffness, A_mpos for the mass |
DOF:y: named by no LAW (T5 c) |
y was added, but no law uses it | add the law that governs y - its equation of motion - or delete y |
IC1: environment quantity acceleration is identified by no entry |
the inventory lists a quantity no entry uses | remove it from the inventory; the kernel has no degree of freedom (DOF) for it |
IC4(b): ENTRY:E_v: DIMENSION L1 differs ... (two lines) |
E_v says a length; v and velocity are L1 T-1 | write "DIMENSION": "L1 T-1" in E_v
|
IC2: DOF y is untied |
y has no manifold entry; held, not refused | goes with y: delete y, or give it a law and an entry |
The last line is not a problem. It is held for the final pass, where the Measure Set's IC2_POLICY would decide it; the final pass did not run, because other checks refused. Note that T2 and T5 did not stop the manifold's checks: those need only a kernel that passes T1, so you see every problem in one run.
Two the declared forms catch
examples/spring_mistakes_form_law.json is the finished draft with a slip in EOM_X's equation: "EQUATION": "m * D(v, t) = -k_s * x * x".
TPK PASS
T2 PASS
T5 PASS
T4 REFUSED, 1 problem
LAW:EOM_X: EQUATION sides have dimensions L1 M1 T-2 and L2 M1 T-2 (T4)
T6 PASS
TrM PASS
IC1-IC4 PASS
TMS PASS
YARDSTICK combined_distance: C1 pass, C2 pass, C4 pass
FINAL not run: it runs once every check above passes
Advisory result (TPC-PY: tpc_zone 0.5.1, tpc_units 0.1.2, tpc_tests 0.2.1, tpc_form 0.2.1, tpc_eom 0.2.0; schema 0.5.0). TPX decides at the gate.
The left side is a force, L1 M1 T-2; the right side, with x twice, is L2 M1 T-2. Write -k_s * x. Only the EQUATION is read: the STATEMENT still said -k_s x, and a STATEMENT that disagreed with its EQUATION would pass every mechanical check. That agreement is read by the declaring authority at step 7.
examples/spring_mistakes_form_boundary.json rewrites the boundary's CONDITION as "x / x_max < 1":
TPK PASS
T2 PASS
T5 PASS
T4 PASS
T6 REFUSED, 1 problem
BOUNDARY:B_small: CONDITION uses / on x_max with no guard x_max != 0 (T6)
TrM PASS
IC1-IC4 PASS
TMS PASS
YARDSTICK combined_distance: C1 pass, C2 pass, C4 pass
FINAL not run: it runs once every check above passes
Advisory result (TPC-PY: tpc_zone 0.5.1, tpc_units 0.1.2, tpc_tests 0.2.1, tpc_form 0.2.1, tpc_eom 0.2.0; schema 0.5.0). TPX decides at the gate.
Dividing by x_max is undefined where x_max is 0, and a boundary must be decided for every value (T6). Either guard it, x_max != 0 and x / x_max < 1, or, better, write what the PREDICATE says, abs(x) < x_max. The guard would silence T6 but not the second mistake: x / x_max < 1 drops the lower half of |x| < x_max. The checker does not compare a CONDITION with its PREDICATE; the declaring authority does.
One the final pass catches
examples/spring_mistakes_final.json is the finished draft with a second constraint on z:
{
"NAME": "C_OFF",
"TARGET": "z",
"ACTION": "FIX",
"VALUE": "2",
"UNIT": "cm",
"STATEMENT": "only motion on the line z = 2 cm is described"
}
TPK PASS
T2 PASS
T5 PASS
T4 PASS
T6 PASS
TrM PASS
IC1-IC4 PASS
TMS PASS
YARDSTICK combined_distance: C1 pass, C2 pass, C4 pass
FINAL T3 (constraints and laws) and IC2 REFUSED, 1 problem
CONSTRAINT:C_NOZ and CONSTRAINT:C_OFF: z fixed at 0 m and at 2 cm (T3)
Advisory result (TPC-PY: tpc_zone 0.5.1, tpc_units 0.1.2, tpc_tests 0.2.1, tpc_form 0.2.1, tpc_eom 0.2.0; schema 0.5.0). TPX decides at the gate.
Everything before the final pass passes: C_OFF is well-formed, its unit is a length, and a law (EOM_Z) names z. Only with the three zones in hand does T3 compare the two values, in SI: 0 m against 0.02 m. A DOF cannot be fixed at two values; keep one constraint.
Gravity without the track
The commonest physics mistake is to declare one force and forget what balances it. examples/spring_mistakes_gravity.json is the finished draft, reread as a glider on a level track with z the height: the manifold's quantity for z is renamed height, and the author adds standard gravity (g_n, 9.80665 m s-2, the conventional value of the 3rd CGPM, 1901) and changes EOM_Z to say that gravity pulls the mass down, but keeps C_NOZ, the track that holds z at 0, and declares no force from the track:
"g_n" constant: {"NAME": "g_n", "DIMENSION": "L1 T-2", "VALUE": "9.80665", "UNIT": "m s-2"}
LAW EOM_Z: "EQUATION": "D(z, t, 2) = -g_n"
TPK PASS
T2 PASS
T5 PASS
T4 PASS
T6 PASS
TrM PASS
IC1-IC4 PASS
TMS PASS
YARDSTICK combined_distance: C1 pass, C2 pass, C4 pass
FINAL T3 (constraints and laws) and IC2 REFUSED, 1 problem
LAW:EOM_Z and CONSTRAINT:C_NOZ: EOM_Z evaluates 0 = -9.80665 under the fixed values (T3)
Advisory result (TPC-PY: tpc_zone 0.5.1, tpc_units 0.1.2, tpc_tests 0.2.1, tpc_form 0.2.1, tpc_eom 0.2.0; schema 0.5.0). TPX decides at the gate.
The final pass evaluates EOM_Z, because every name in it now has a value: z is fixed, so its second derivative is 0, and g_n is 9.80665. The law says 0 = -9.80665. The kernel says the mass falls and says it cannot move: it contradicts itself. In the laboratory the track pushes up on the glider; in the kernel nothing does, because nothing is declared.
The fix is to declare the track's push. examples/spring_track_draft.json adds a DOF F_n, the support force, puts it in EOM_Z, and gives it a manifold entry:
DOF added: {"NAME": "F_n", "DIMENSION": "M1 L1 T-2"}
LAW EOM_Z: "STATEMENT": "m d2z/dt2 = F_n - m g_n"
"REFS": ["m", "z", "t", "F_n", "g_n"]
"EQUATION": "m * D(z, t, 2) = F_n - m * g_n"
inventory added: {"ENVIRONMENT_QUANTITY": "support_force", "DIMENSION": "M1 L1 T-2"}
ENTRY added: E_Fn, identifying F_n with the upward force the track exerts, bearing EOM_Z
TPK PASS
T2 PASS
T5 PASS
T4 PASS
T6 PASS
TrM PASS
IC1-IC4 PASS
TMS PASS
YARDSTICK combined_distance: C1 pass, C2 pass, C4 pass
FINAL T3 (constraints and laws) and IC2 PASS
STRUCTURE map (shown whatever STRUCTURE_CHECK says): analysis RUN; D variable t
F_n: DETERMINED (LAW EOM_Z)
t: INDEPENDENT
v: DETERMINED (LAW EOM_X)
x: DETERMINED (LAW KIN)
z: FIXED
index 1, initial values 2 (the determined part; information)
STRUCTURE findings: none
STRUCTURE structurally regular
D(TPK) f01d82e2c6e46eb4b549382f4398570ee8e0a540a7885af18f9042a0326eace5
D(TrM) 6778314c5a7a282386bf464b8769b13df4defb100b3baa52edecff1976d953c1
D(TMS) 7a962e2297d6798801fa2593be9cd92995cc3a5f9c817cc8a19335c625784128
D(TFK) 011f001b46bb88284595b42f00772a8331f0b2a15ed7507974ee78dfd1f060fc
Inspections still owed to the declaring authority before declaring:
- T2 the semantic part: each ASSUMPTION states one claim (guide 3.6)
- T3 over the assumptions, and over the laws beyond the ground fragment at depth 1, to depth S_MAX (guide 3.6)
- T4, T6 and T3 over every law or boundary without a declared form, as listed beside the kernel tests (D108.1)
- IC4 (a) that each SIGNATURE image holds in the environment, beyond the syntactic reading, and each borne law is expressible (guide 4.6)
- IC5 falsifier invariance under the TRANSFORMATIONS (guide 4.6)
- equivalence of environment quantities under the TRANSFORMATIONS (names are taken as written)
- every STATEMENT, PROPOSITION, PREDICATE and IMAGE names only what its REFS or OVER list, and agrees with its declared form where one exists
Advisory result (TPC-PY: tpc_zone 0.5.1, tpc_units 0.1.2, tpc_tests 0.2.1, tpc_form 0.2.1, tpc_eom 0.2.0; schema 0.5.0). TPX decides at the gate.
It passes. The support is now in the UWC, and with C_NOZ it has a value a result can derive: F_n = m g_n. Friction and air resistance are still absent, because they are still undeclared; add them the same way if your glider feels them.
Two cautions. First, T3 caught the first version only because every name in EOM_Z had a value. Written as m * D(z, t, 2) = -m * g_n (examples/spring_gravity_unbound.json), the same mistake is refused by no check, because m has no value; the structure check lists it for the declaring authority instead, with a question:
STRUCTURE findings: 1
CLOSED: LAW EOM_Z names no unknown once the fixed DOFs are applied, and depends on m, which the kernel does not bind: does it hold for every value of m, or is a force or an unknown missing?
It then waits for the declaring authority at step 7. Second, g_n here is a constant you typed, with a value you chose; it is gravity only because you declared it.
Environment modules are selected (D178.1) and not yet built. Once TPX runs the new-container form, gravity at the standard strength is offered as a module the author chooses; it adds g_n and its term to the equation of motion of the DOF it is bound to, and, where that DOF is fixed, as z is here, the form asks the support-force question instead of leaving the support out. What each module adds is on Inputs: environment modules. Until then, g_n and F_n are declared by hand, as above.
Two more you will meet
A missing comma or bracket stops the file from being read at all. examples/spring_mistakes_syntax.json lacks the comma after the DOF x:
DRAFT: cannot be read: Expecting ',' delimiter: line 6 column 7 (char 111)
The message gives the line and column where the reader stopped, which is just after the mistake. And a number where a string belongs, or the reverse (examples/spring_mistakes_types.json, with "K": 2 and "N_X": "2"):
TPK PASS
T2 PASS
T5 PASS
T4 PASS
T6 PASS
TrM PASS
IC1-IC4 PASS
TMS REFUSED, 2 problems
PARAMETERS: field K has the wrong type
PARAMETERS: field N_X has the wrong type
FINAL not run: it runs once every check above passes
Advisory result (TPC-PY: tpc_zone 0.5.1, tpc_units 0.1.2, tpc_tests 0.2.1, tpc_form 0.2.1, tpc_eom 0.2.0; schema 0.5.0). TPX decides at the gate.
K is a decimal and goes in quotes, "2"; N_X and S_MAX are whole numbers and do not.
Non-goals
The checker never repairs a draft. It tells you what to change; you change it. And it never tells you what you forgot to declare.
Worked example
The step is its own example.
Governing sections: TPS 5.5, 2.2, 2.3, 2.4 and 4.4.
Previous: 5 Check the draft. Next: 7 Inspect, submit and declare.