<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://invarians.org/index.php?action=history&amp;feed=atom&amp;title=The_Principia_Machina%2FTPC-PY%2Ftpc_identity.py</id>
	<title>The Principia Machina/TPC-PY/tpc identity.py - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://invarians.org/index.php?action=history&amp;feed=atom&amp;title=The_Principia_Machina%2FTPC-PY%2Ftpc_identity.py"/>
	<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/tpc_identity.py&amp;action=history"/>
	<updated>2026-10-21T16:01:54Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.2</generator>
	<entry>
		<id>https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/tpc_identity.py&amp;diff=4879&amp;oldid=prev</id>
		<title>BFP Rauch: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/tpc_identity.py&amp;diff=4879&amp;oldid=prev"/>
		<updated>2026-09-30T02:11:04Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 02:11, 30 September 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>BFP Rauch</name></author>
	</entry>
	<entry>
		<id>https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/tpc_identity.py&amp;diff=4878&amp;oldid=prev</id>
		<title>BFP Rauch: TPC-PY source tpc_identity.py (0.1.1), SHA-256 da18ad78715326a1; conformed TPS 0.4.0; PROPOSED, not declared (TPC-PY 0.2.0)</title>
		<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/tpc_identity.py&amp;diff=4878&amp;oldid=prev"/>
		<updated>2026-09-30T02:10:58Z</updated>

		<summary type="html">&lt;p&gt;TPC-PY source tpc_identity.py (0.1.1), SHA-256 da18ad78715326a1; conformed TPS 0.4.0; PROPOSED, not declared (TPC-PY 0.2.0)&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 02:10, 30 September 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&quot;&quot;&quot;tpc_identity 0.1.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;0 &lt;/del&gt;(&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;DRAFT, pending &lt;/del&gt;D146, D156, D157, D158): the unit of&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&quot;&quot;&quot;tpc_identity 0.1.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;1 &lt;/ins&gt;(D146&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;.1&lt;/ins&gt;, D156&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;.1&lt;/ins&gt;, D157&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;.1 as D182.1 amends it&lt;/ins&gt;, D158&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;.1;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;released at 0.1.0 with TPC-PY 0.1.0, 2026-09-28; 0.1.1, a PATCH of this&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;docstring only, proposed with TPC-PY 0.2.0: K-RESIDUALS PD3&lt;/ins&gt;): the unit of&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;identity&amp;#039;s pure functions: the PROMPT digest and TPM&amp;#039;s canonical JSON,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;identity&amp;#039;s pure functions: the PROMPT digest and TPM&amp;#039;s canonical JSON,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;the MODEL MAP lookup, the change class of a reported model, and the&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;the MODEL MAP lookup, the change class of a reported model, and the&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;IDENTITY RECORD&amp;#039;s comparison.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;IDENTITY RECORD&amp;#039;s comparison.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Reference implementation, Python standard library only&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;. DATA for landing&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Reference implementation, Python standard library only (the identity&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;round 8 of branch tpm_project_closeout &lt;/del&gt;(the identity speculation 0.1.0&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;speculation 0.1.0 sections 5 and 8; PMP-TPM 0.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;14&lt;/ins&gt;.0 IDENTITY, PROMPT AND&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;sections 5 and 8; PMP-TPM 0.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;12&lt;/del&gt;.0 IDENTITY, PROMPT AND VENDOR FAMILY;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;VENDOR FAMILY; record D146.1 (a2), (c), D156.1, D157.1, D158&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;.1, D182&lt;/ins&gt;.1);&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;record D146.1 (a2), (c), D156.1, D157.1, D158.1); &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;not a declared TPC-PY&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;not TPX code&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;. The code and the vectors are those of 0.1.0&lt;/ins&gt;. Every&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;version and &lt;/del&gt;not TPX code. Every function is a pure function of its&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;function is a pure function of its arguments. Every refused argument&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;arguments. Every refused argument raises ValueError with a short fixed&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;raises ValueError with a short fixed message; a refused salt is never&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;message; a refused salt is never echoed. render_*() give the canonical&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;echoed. render_*() give the canonical&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;text the PHP residence (tpc_identity.php) reproduces byte for byte.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;text the PHP residence (tpc_identity.php) reproduces byte for byte.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Objects are JSON objects (dict), lists are JSON arrays (list); ints are&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Objects are JSON objects (dict), lists are JSON arrays (list); ints are&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l46&quot;&gt;Line 46:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 48:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &amp;quot;SHA-256 under D97 over [&amp;quot;TPM-PROMPT&amp;quot;, &amp;quot;1&amp;quot;, VENDOR FAMILY, salt,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &amp;quot;SHA-256 under D97 over [&amp;quot;TPM-PROMPT&amp;quot;, &amp;quot;1&amp;quot;, VENDOR FAMILY, salt,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   template, tools]: the salt 32 lowercase hexadecimal characters drawn&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   template, tools]: the salt 32 lowercase hexadecimal characters drawn&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   once per PROMPT; the template the &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;sponsor&#039;s static instruction layer &lt;/del&gt;in&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   once per PROMPT; the template the &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;SPONSOR ZONE &lt;/ins&gt;in &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;NFC, whole, no inner&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;NFC&lt;/del&gt;, &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;up to a boundary the sponsor declares&lt;/del&gt;; the tools the &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;tool&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;boundary&lt;/ins&gt;, &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;at most SPONSOR ZONE CAP&lt;/ins&gt;; the tools the &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;live list of every&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;definitions &lt;/del&gt;in TPM&#039;s canonical JSON; the rendered PROMPT never hashed.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&quot;&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;tool the model is offered, harness built-ins included, &lt;/ins&gt;in TPM&#039;s&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  &lt;/ins&gt;canonical JSON; the rendered PROMPT never hashed&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&quot; (D157.1 (a) as D182.1&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  amends it: the boundary is no longer the sponsor&#039;s; the SPONSOR ZONE is&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  everything PRB places on the INSTRUCTION CHANNEL besides the GTP BUNDLE,&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  an implementation&#039;s text included; a built-in PRB cannot read is bound&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  by its harness, version and tool name; a change of a bound tool&#039;s text&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;  is a PROMPT change)&lt;/ins&gt;.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   PD1 family: a non-empty string, the VENDOR FAMILY key family_of gives&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   PD1 family: a non-empty string, the VENDOR FAMILY key family_of gives&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;       (PD-OC-5), taken in NFC. PD2 salt: exactly 32 characters of 0-9a-f,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;       (PD-OC-5), taken in NFC. PD2 salt: exactly 32 characters of 0-9a-f,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;       else ValueError(&amp;quot;salt&amp;quot;) without echo. PD3 template: a string, put&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;       else ValueError(&amp;quot;salt&amp;quot;) without echo. PD3 template: a string, put&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;       in NFC; the &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;boundary is &lt;/del&gt;the &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;sponsor&lt;/del&gt;&#039;s, outside this function. PD4&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;       in NFC&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;: the SPONSOR ZONE whole (D182.1)&lt;/ins&gt;; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;its cap, SPONSOR ZONE&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;      &lt;/del&gt;tools: the JSON text, canonical_tools applied; a refusal is&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;      CAP, and &lt;/ins&gt;the &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;reading of &lt;/ins&gt;the &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;live tool list are PRB&lt;/ins&gt;&#039;s, outside this&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;      &lt;/del&gt;ValueError(&quot;tools&quot;). PD5 the digest: SHA-256 over the D97 netstring&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;      &lt;/ins&gt;function. PD4 tools: the JSON text, canonical_tools applied; a&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;      &lt;/ins&gt;refusal is ValueError(&quot;tools&quot;). PD5 the digest: SHA-256 over the D97 netstring&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;       of the six fields, 64 lowercase hex.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;       of the six fields, 64 lowercase hex.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l116&quot;&gt;Line 116:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 125:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;import unicodedata&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;import unicodedata&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;VERSION = &quot;0.1.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;0&lt;/del&gt;&quot;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;VERSION = &quot;0.1.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;1&lt;/ins&gt;&quot;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;PAIRS = ((&amp;quot;declared&amp;quot;, &amp;quot;stated&amp;quot;), (&amp;quot;declared&amp;quot;, &amp;quot;relayed&amp;quot;),&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;PAIRS = ((&amp;quot;declared&amp;quot;, &amp;quot;stated&amp;quot;), (&amp;quot;declared&amp;quot;, &amp;quot;relayed&amp;quot;),&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;          (&amp;quot;declared&amp;quot;, &amp;quot;inferred&amp;quot;), (&amp;quot;stated&amp;quot;, &amp;quot;relayed&amp;quot;),&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;          (&amp;quot;declared&amp;quot;, &amp;quot;inferred&amp;quot;), (&amp;quot;stated&amp;quot;, &amp;quot;relayed&amp;quot;),&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>BFP Rauch</name></author>
	</entry>
	<entry>
		<id>https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/tpc_identity.py&amp;diff=4221&amp;oldid=prev</id>
		<title>BFP Rauch: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/tpc_identity.py&amp;diff=4221&amp;oldid=prev"/>
		<updated>2026-09-28T04:37:36Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw-interface=&quot;&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 04:37, 28 September 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>BFP Rauch</name></author>
	</entry>
	<entry>
		<id>https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/tpc_identity.py&amp;diff=4220&amp;oldid=prev</id>
		<title>BFP Rauch: TPC-PY source tpc_identity.py (0.1.0), SHA-256 154948be9dc7be4f; conformed TPS 0.3.0; PROPOSED, not declared (CO-8)</title>
		<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/tpc_identity.py&amp;diff=4220&amp;oldid=prev"/>
		<updated>2026-09-27T15:43:18Z</updated>

		<summary type="html">&lt;p&gt;TPC-PY source tpc_identity.py (0.1.0), SHA-256 154948be9dc7be4f; conformed TPS 0.3.0; PROPOSED, not declared (CO-8)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;quot;&amp;quot;&amp;quot;tpc_identity 0.1.0 (DRAFT, pending D146, D156, D157, D158): the unit of&lt;br /&gt;
identity&amp;#039;s pure functions: the PROMPT digest and TPM&amp;#039;s canonical JSON,&lt;br /&gt;
the MODEL MAP lookup, the change class of a reported model, and the&lt;br /&gt;
IDENTITY RECORD&amp;#039;s comparison.&lt;br /&gt;
&lt;br /&gt;
Reference implementation, Python standard library only. DATA for landing&lt;br /&gt;
round 8 of branch tpm_project_closeout (the identity speculation 0.1.0&lt;br /&gt;
sections 5 and 8; PMP-TPM 0.12.0 IDENTITY, PROMPT AND VENDOR FAMILY;&lt;br /&gt;
record D146.1 (a2), (c), D156.1, D157.1, D158.1); not a declared TPC-PY&lt;br /&gt;
version and not TPX code. Every function is a pure function of its&lt;br /&gt;
arguments. Every refused argument raises ValueError with a short fixed&lt;br /&gt;
message; a refused salt is never echoed. render_*() give the canonical&lt;br /&gt;
text the PHP residence (tpc_identity.php) reproduces byte for byte.&lt;br /&gt;
Objects are JSON objects (dict), lists are JSON arrays (list); ints are&lt;br /&gt;
never bools. Text enters in NFC (D99&amp;#039;s convention for every text a digest&lt;br /&gt;
covers); a string carrying a surrogate code point is refused.&lt;br /&gt;
&lt;br /&gt;
canonical_tools(json_text) -&amp;gt; str                        (D157.1 (a))&lt;br /&gt;
  &amp;quot;the tool definitions in TPM&amp;#039;s canonical JSON&amp;quot; (the identity&lt;br /&gt;
  speculation IM-4: &amp;quot;keys sorted, strings NFC, decimals canonical&amp;quot;).&lt;br /&gt;
  CJ1 PARSE. json_text is one RFC 8259 JSON text: one value (object,&lt;br /&gt;
      array, string, number, true, false or null) with the six ASCII&lt;br /&gt;
      whitespace characters SPACE, TAB, LF and CR around tokens and&lt;br /&gt;
      nothing after it. Both residences carry their own parser so that no&lt;br /&gt;
      library&amp;#039;s leniency (NaN, Infinity, big numbers, lone surrogates,&lt;br /&gt;
      trailing commas, comments) enters. Refused: ValueError(&amp;quot;tools&amp;quot;).&lt;br /&gt;
  CJ2 STRINGS. Escapes \\&amp;quot; \\\\ \\/ \\b \\f \\n \\r \\t and \\uXXXX, a&lt;br /&gt;
      high surrogate joined with its following low surrogate; a lone&lt;br /&gt;
      surrogate, a raw control character below U+0020 or invalid UTF-8&lt;br /&gt;
      is refused. Each string, a key included, is put in NFC.&lt;br /&gt;
  CJ3 NUMBERS. The JSON number grammar; the canonical form is the zone&lt;br /&gt;
      serialization&amp;#039;s DECIMAL (zone schemas 5.6; tpc_falcon canon_&lt;br /&gt;
      decimal): &amp;quot;0&amp;quot; for zero, else [-]M with &amp;quot;e&amp;quot;E when E is not 0, M an&lt;br /&gt;
      integer without leading or trailing zeros; string arithmetic only,&lt;br /&gt;
      so no residence rounds. An exponent of more than four digits is&lt;br /&gt;
      refused (the DECIMAL grammar&amp;#039;s bound; spec note PD-OC-6).&lt;br /&gt;
  CJ4 OBJECTS. Members sorted by the code points of their NFC keys; two&lt;br /&gt;
      members with one NFC key are refused (duplicate). Nesting deeper&lt;br /&gt;
      than 64 levels is refused (PD-OC-6).&lt;br /&gt;
  CJ5 OUTPUT. No whitespace; &amp;quot;,&amp;quot; and &amp;quot;:&amp;quot; separators; strings quoted with&lt;br /&gt;
      only \\&amp;quot; \\\\ and the controls escaped (\\b \\f \\n \\r \\t, else&lt;br /&gt;
      \\u00XX lowercase); every other character raw UTF-8; true, false&lt;br /&gt;
      and null as themselves.&lt;br /&gt;
&lt;br /&gt;
prompt_digest(family, salt, template, tools) -&amp;gt; 64 hex  (D157.1 (a), (f))&lt;br /&gt;
  &amp;quot;SHA-256 under D97 over [&amp;quot;TPM-PROMPT&amp;quot;, &amp;quot;1&amp;quot;, VENDOR FAMILY, salt,&lt;br /&gt;
  template, tools]: the salt 32 lowercase hexadecimal characters drawn&lt;br /&gt;
  once per PROMPT; the template the sponsor&amp;#039;s static instruction layer in&lt;br /&gt;
  NFC, up to a boundary the sponsor declares; the tools the tool&lt;br /&gt;
  definitions in TPM&amp;#039;s canonical JSON; the rendered PROMPT never hashed.&amp;quot;&lt;br /&gt;
  PD1 family: a non-empty string, the VENDOR FAMILY key family_of gives&lt;br /&gt;
      (PD-OC-5), taken in NFC. PD2 salt: exactly 32 characters of 0-9a-f,&lt;br /&gt;
      else ValueError(&amp;quot;salt&amp;quot;) without echo. PD3 template: a string, put&lt;br /&gt;
      in NFC; the boundary is the sponsor&amp;#039;s, outside this function. PD4&lt;br /&gt;
      tools: the JSON text, canonical_tools applied; a refusal is&lt;br /&gt;
      ValueError(&amp;quot;tools&amp;quot;). PD5 the digest: SHA-256 over the D97 netstring&lt;br /&gt;
      of the six fields, 64 lowercase hex.&lt;br /&gt;
&lt;br /&gt;
family_of(model_string, model_map) -&amp;gt; dict              (D156.1 (a)-(e))&lt;br /&gt;
  model_map: the MODEL MAP&amp;#039;s rows, a list of objects {name, family, open,&lt;br /&gt;
    server, quantization}: name the model string as PRB relays it (one&lt;br /&gt;
    row per spelling: a dated snapshot, a dateless alias, a server-&lt;br /&gt;
    prefixed spelling; names unique after NFC); family the maker&amp;#039;s family&lt;br /&gt;
    (closed) or the maker lineage (open weights); open a boolean; server&lt;br /&gt;
    and quantization the pinned serving provider and quantization of open&lt;br /&gt;
    weights, both non-empty strings when open is true and both null when&lt;br /&gt;
    it is false (D156.1 (b): the triple is pinned; (d): an unpinned&lt;br /&gt;
    row cannot be approved). Anything else raises ValueError(&amp;quot;model_map&amp;quot;).&lt;br /&gt;
  FO1 The row whose name equals model_string, both in NFC, exactly and&lt;br /&gt;
      case-sensitively (PD-OC-7); none: status UNMAPPED (D147: a row the&lt;br /&gt;
      MODEL MAP does not cover is UNMAPPED).&lt;br /&gt;
  FO2 MAPPED carries family, open, server, quantization and the VENDOR&lt;br /&gt;
      FAMILY KEY: the D97 netstring of [&amp;quot;CLOSED&amp;quot;, family] or of [&amp;quot;OPEN&amp;quot;,&lt;br /&gt;
      family, server, quantization] (PD-OC-5), so that a change of server&lt;br /&gt;
      or quantization of open weights is a change of family (D156.1 (b))&lt;br /&gt;
      and the same closed model through another server is not (c).&lt;br /&gt;
&lt;br /&gt;
change_class(certified_family, last_model, reported_model, lookup) -&amp;gt; dict&lt;br /&gt;
                                                        (D146.1 (a2))&lt;br /&gt;
  certified_family: the certificate&amp;#039;s VENDOR FAMILY KEY. last_model: the&lt;br /&gt;
    model last recorded for the account (the DECLARED MODEL at admission,&lt;br /&gt;
    then each RECORDED CHANGE). reported_model: the RELAYED MODEL of this&lt;br /&gt;
    petition or push. lookup: {family: the VENDOR FAMILY KEY family_of&lt;br /&gt;
    gives for reported_model, or &amp;quot;UNMAPPED&amp;quot;; cluster: the CLUSTER LOOKUP&amp;#039;s&lt;br /&gt;
    answer for it after substitution and succession, IN, CUSP, OUT,&lt;br /&gt;
    FADING, UNLISTED or EXCLUDED, or null when TPX did not run it}.&lt;br /&gt;
  CC1 lookup.family UNMAPPED: class REFUSED MODEL, detail UNMAPPED (the&lt;br /&gt;
      row is held out of every class, D147; nothing lands).&lt;br /&gt;
  CC2 lookup.family not the certified key: REFUSED FAMILY, whatever the&lt;br /&gt;
      cluster says (&amp;quot;A change of family is never a MODEL CHANGE&amp;quot;; the&lt;br /&gt;
      sponsor&amp;#039;s path is a new agent).&lt;br /&gt;
  CC3 reported_model equal to last_model (NFC, exact): SAME; the cluster&lt;br /&gt;
      is not read.&lt;br /&gt;
  CC4 Otherwise a MODEL CHANGE, read from lookup.cluster: IN, RECORDED&lt;br /&gt;
      CHANGE; CUSP, CUSP PATH (the gate&amp;#039;s cusp path, D146.1 (b)); OUT,&lt;br /&gt;
      FADING, UNLISTED or EXCLUDED, REFUSED MODEL with that detail; null,&lt;br /&gt;
      ValueError(&amp;quot;lookup&amp;quot;).&lt;br /&gt;
  The tenure restart, the PROMPT EPOCH and the sponsor&amp;#039;s notice are TPX&amp;#039;s&lt;br /&gt;
  acts on RECORDED CHANGE, outside this function.&lt;br /&gt;
&lt;br /&gt;
identity_compare(declared, stated, relayed, inferred) -&amp;gt; dict   (D158.1)&lt;br /&gt;
  Four vendor-level values, each a string or null (ABSENT): the vendor of&lt;br /&gt;
  the DECLARED MODEL, of the STATED MODEL, of the RELAYED MODEL and the&lt;br /&gt;
  INFERRED VENDOR. &amp;quot;Compared at the vendor level only; within a family&lt;br /&gt;
  nothing is compared&amp;quot;: the reduction of each value to its vendor is the&lt;br /&gt;
  caller&amp;#039;s (spec note, UNCOMPUTED). IC1 The six pairs in the fixed order&lt;br /&gt;
  declared-stated, declared-relayed, declared-inferred, stated-relayed,&lt;br /&gt;
  stated-inferred, relayed-inferred are each AGREE (equal in NFC, exact,&lt;br /&gt;
  PD-OC-7), DIFFER or ABSENT (a value missing). IC2 overall: DIFFER when&lt;br /&gt;
  any pair differs; AGREE when none differs and at least one pair was&lt;br /&gt;
  compared; ABSENT otherwise. The result is advisory: it feeds the&lt;br /&gt;
  sponsor&amp;#039;s notice and the counts, and no gate or adverse act reads it.&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import hashlib&lt;br /&gt;
import unicodedata&lt;br /&gt;
&lt;br /&gt;
VERSION = &amp;quot;0.1.0&amp;quot;&lt;br /&gt;
PAIRS = ((&amp;quot;declared&amp;quot;, &amp;quot;stated&amp;quot;), (&amp;quot;declared&amp;quot;, &amp;quot;relayed&amp;quot;),&lt;br /&gt;
         (&amp;quot;declared&amp;quot;, &amp;quot;inferred&amp;quot;), (&amp;quot;stated&amp;quot;, &amp;quot;relayed&amp;quot;),&lt;br /&gt;
         (&amp;quot;stated&amp;quot;, &amp;quot;inferred&amp;quot;), (&amp;quot;relayed&amp;quot;, &amp;quot;inferred&amp;quot;))&lt;br /&gt;
CLUSTER_CLASSES = (&amp;quot;IN&amp;quot;, &amp;quot;CUSP&amp;quot;, &amp;quot;OUT&amp;quot;, &amp;quot;FADING&amp;quot;, &amp;quot;UNLISTED&amp;quot;, &amp;quot;EXCLUDED&amp;quot;)&lt;br /&gt;
MAX_DEPTH = 64&lt;br /&gt;
MAX_EXP_DIGITS = 4&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ---------------------------------------------------------------- common&lt;br /&gt;
&lt;br /&gt;
def _esc(s):&lt;br /&gt;
    out = []&lt;br /&gt;
    for ch in s:&lt;br /&gt;
        o = ord(ch)&lt;br /&gt;
        if ch == &amp;quot;|&amp;quot; or ch == &amp;quot;\\&amp;quot;:&lt;br /&gt;
            out.append(&amp;quot;\\&amp;quot; + ch)&lt;br /&gt;
        elif o &amp;lt; 0x20 or o == 0x7F:&lt;br /&gt;
            out.append(&amp;quot;\\x%02x&amp;quot; % o)&lt;br /&gt;
        else:&lt;br /&gt;
            out.append(ch)&lt;br /&gt;
    return &amp;quot;&amp;quot;.join(out)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _netstring(fields):&lt;br /&gt;
    return b&amp;quot;&amp;quot;.join(b&amp;quot;%d:%s&amp;quot; % (len(b), b)&lt;br /&gt;
                    for b in (f.encode(&amp;quot;utf-8&amp;quot;) for f in fields))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _digest_fields(fields):&lt;br /&gt;
    return hashlib.sha256(_netstring(fields)).hexdigest()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _is_text(s):&lt;br /&gt;
    if type(s) is not str:&lt;br /&gt;
        return False&lt;br /&gt;
    for ch in s:&lt;br /&gt;
        if 0xD800 &amp;lt;= ord(ch) &amp;lt;= 0xDFFF:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _nfc(s, name):&lt;br /&gt;
    if not _is_text(s):&lt;br /&gt;
        raise ValueError(name)&lt;br /&gt;
    return unicodedata.normalize(&amp;quot;NFC&amp;quot;, s)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _keys_are(o, required, optional=()):&lt;br /&gt;
    if type(o) is not dict:&lt;br /&gt;
        return False&lt;br /&gt;
    for k in required:&lt;br /&gt;
        if k not in o:&lt;br /&gt;
            return False&lt;br /&gt;
    for k in o:&lt;br /&gt;
        if k not in required and k not in optional:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# -------------------------------------------------------- canonical JSON&lt;br /&gt;
&lt;br /&gt;
_WS = &amp;quot; \t\n\r&amp;quot;&lt;br /&gt;
_HEX = &amp;quot;0123456789abcdefABCDEF&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class _Parser(object):&lt;br /&gt;
    def __init__(self, text):&lt;br /&gt;
        self.t = text&lt;br /&gt;
        self.i = 0&lt;br /&gt;
        self.n = len(text)&lt;br /&gt;
&lt;br /&gt;
    def fail(self):&lt;br /&gt;
        raise ValueError(&amp;quot;tools&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    def ws(self):&lt;br /&gt;
        while self.i &amp;lt; self.n and self.t[self.i] in _WS:&lt;br /&gt;
            self.i += 1&lt;br /&gt;
&lt;br /&gt;
    def value(self, depth):&lt;br /&gt;
        if depth &amp;gt; MAX_DEPTH:&lt;br /&gt;
            self.fail()&lt;br /&gt;
        self.ws()&lt;br /&gt;
        if self.i &amp;gt;= self.n:&lt;br /&gt;
            self.fail()&lt;br /&gt;
        c = self.t[self.i]&lt;br /&gt;
        if c == &amp;quot;{&amp;quot;:&lt;br /&gt;
            return self.obj(depth)&lt;br /&gt;
        if c == &amp;quot;[&amp;quot;:&lt;br /&gt;
            return self.arr(depth)&lt;br /&gt;
        if c == &amp;#039;&amp;quot;&amp;#039;:&lt;br /&gt;
            return _quote(self.string())&lt;br /&gt;
        if c == &amp;quot;-&amp;quot; or &amp;quot;0&amp;quot; &amp;lt;= c &amp;lt;= &amp;quot;9&amp;quot;:&lt;br /&gt;
            return self.number()&lt;br /&gt;
        for lit in (&amp;quot;true&amp;quot;, &amp;quot;false&amp;quot;, &amp;quot;null&amp;quot;):&lt;br /&gt;
            if self.t.startswith(lit, self.i):&lt;br /&gt;
                self.i += len(lit)&lt;br /&gt;
                return lit&lt;br /&gt;
        self.fail()&lt;br /&gt;
&lt;br /&gt;
    def obj(self, depth):&lt;br /&gt;
        self.i += 1&lt;br /&gt;
        members = {}&lt;br /&gt;
        self.ws()&lt;br /&gt;
        if self.i &amp;lt; self.n and self.t[self.i] == &amp;quot;}&amp;quot;:&lt;br /&gt;
            self.i += 1&lt;br /&gt;
            return &amp;quot;{}&amp;quot;&lt;br /&gt;
        while True:&lt;br /&gt;
            self.ws()&lt;br /&gt;
            if self.i &amp;gt;= self.n or self.t[self.i] != &amp;#039;&amp;quot;&amp;#039;:&lt;br /&gt;
                self.fail()&lt;br /&gt;
            k = self.string()&lt;br /&gt;
            self.ws()&lt;br /&gt;
            if self.i &amp;gt;= self.n or self.t[self.i] != &amp;quot;:&amp;quot;:&lt;br /&gt;
                self.fail()&lt;br /&gt;
            self.i += 1&lt;br /&gt;
            v = self.value(depth + 1)&lt;br /&gt;
            if k in members:&lt;br /&gt;
                self.fail()&lt;br /&gt;
            members[k] = v&lt;br /&gt;
            self.ws()&lt;br /&gt;
            if self.i &amp;gt;= self.n:&lt;br /&gt;
                self.fail()&lt;br /&gt;
            if self.t[self.i] == &amp;quot;,&amp;quot;:&lt;br /&gt;
                self.i += 1&lt;br /&gt;
                continue&lt;br /&gt;
            if self.t[self.i] == &amp;quot;}&amp;quot;:&lt;br /&gt;
                self.i += 1&lt;br /&gt;
                break&lt;br /&gt;
            self.fail()&lt;br /&gt;
        keys = sorted(members.keys())&lt;br /&gt;
        return &amp;quot;{&amp;quot; + &amp;quot;,&amp;quot;.join(_quote(k) + &amp;quot;:&amp;quot; + members[k]&lt;br /&gt;
                              for k in keys) + &amp;quot;}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def arr(self, depth):&lt;br /&gt;
        self.i += 1&lt;br /&gt;
        items = []&lt;br /&gt;
        self.ws()&lt;br /&gt;
        if self.i &amp;lt; self.n and self.t[self.i] == &amp;quot;]&amp;quot;:&lt;br /&gt;
            self.i += 1&lt;br /&gt;
            return &amp;quot;[]&amp;quot;&lt;br /&gt;
        while True:&lt;br /&gt;
            items.append(self.value(depth + 1))&lt;br /&gt;
            self.ws()&lt;br /&gt;
            if self.i &amp;gt;= self.n:&lt;br /&gt;
                self.fail()&lt;br /&gt;
            if self.t[self.i] == &amp;quot;,&amp;quot;:&lt;br /&gt;
                self.i += 1&lt;br /&gt;
                continue&lt;br /&gt;
            if self.t[self.i] == &amp;quot;]&amp;quot;:&lt;br /&gt;
                self.i += 1&lt;br /&gt;
                break&lt;br /&gt;
            self.fail()&lt;br /&gt;
        return &amp;quot;[&amp;quot; + &amp;quot;,&amp;quot;.join(items) + &amp;quot;]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def hex4(self):&lt;br /&gt;
        if self.i + 4 &amp;gt; self.n:&lt;br /&gt;
            self.fail()&lt;br /&gt;
        h = self.t[self.i:self.i + 4]&lt;br /&gt;
        for ch in h:&lt;br /&gt;
            if ch not in _HEX:&lt;br /&gt;
                self.fail()&lt;br /&gt;
        self.i += 4&lt;br /&gt;
        return int(h, 16)&lt;br /&gt;
&lt;br /&gt;
    def string(self):&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;The string at a &amp;#039;&amp;quot;&amp;#039;, decoded and put in NFC (unquoted).&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        self.i += 1&lt;br /&gt;
        out = []&lt;br /&gt;
        while True:&lt;br /&gt;
            if self.i &amp;gt;= self.n:&lt;br /&gt;
                self.fail()&lt;br /&gt;
            c = self.t[self.i]&lt;br /&gt;
            if c == &amp;#039;&amp;quot;&amp;#039;:&lt;br /&gt;
                self.i += 1&lt;br /&gt;
                break&lt;br /&gt;
            if c == &amp;quot;\\&amp;quot;:&lt;br /&gt;
                self.i += 1&lt;br /&gt;
                if self.i &amp;gt;= self.n:&lt;br /&gt;
                    self.fail()&lt;br /&gt;
                e = self.t[self.i]&lt;br /&gt;
                self.i += 1&lt;br /&gt;
                if e == &amp;#039;&amp;quot;&amp;#039; or e == &amp;quot;\\&amp;quot; or e == &amp;quot;/&amp;quot;:&lt;br /&gt;
                    out.append(e)&lt;br /&gt;
                elif e == &amp;quot;b&amp;quot;:&lt;br /&gt;
                    out.append(&amp;quot;\b&amp;quot;)&lt;br /&gt;
                elif e == &amp;quot;f&amp;quot;:&lt;br /&gt;
                    out.append(&amp;quot;\f&amp;quot;)&lt;br /&gt;
                elif e == &amp;quot;n&amp;quot;:&lt;br /&gt;
                    out.append(&amp;quot;\n&amp;quot;)&lt;br /&gt;
                elif e == &amp;quot;r&amp;quot;:&lt;br /&gt;
                    out.append(&amp;quot;\r&amp;quot;)&lt;br /&gt;
                elif e == &amp;quot;t&amp;quot;:&lt;br /&gt;
                    out.append(&amp;quot;\t&amp;quot;)&lt;br /&gt;
                elif e == &amp;quot;u&amp;quot;:&lt;br /&gt;
                    cp = self.hex4()&lt;br /&gt;
                    if 0xD800 &amp;lt;= cp &amp;lt;= 0xDBFF:&lt;br /&gt;
                        if not self.t.startswith(&amp;quot;\\u&amp;quot;, self.i):&lt;br /&gt;
                            self.fail()&lt;br /&gt;
                        self.i += 2&lt;br /&gt;
                        lo = self.hex4()&lt;br /&gt;
                        if not (0xDC00 &amp;lt;= lo &amp;lt;= 0xDFFF):&lt;br /&gt;
                            self.fail()&lt;br /&gt;
                        cp = 0x10000 + ((cp - 0xD800) &amp;lt;&amp;lt; 10) + (lo - 0xDC00)&lt;br /&gt;
                    elif 0xDC00 &amp;lt;= cp &amp;lt;= 0xDFFF:&lt;br /&gt;
                        self.fail()&lt;br /&gt;
                    out.append(chr(cp))&lt;br /&gt;
                else:&lt;br /&gt;
                    self.fail()&lt;br /&gt;
            elif ord(c) &amp;lt; 0x20:&lt;br /&gt;
                self.fail()&lt;br /&gt;
            elif 0xD800 &amp;lt;= ord(c) &amp;lt;= 0xDFFF:&lt;br /&gt;
                self.fail()&lt;br /&gt;
            else:&lt;br /&gt;
                out.append(c)&lt;br /&gt;
                self.i += 1&lt;br /&gt;
        return unicodedata.normalize(&amp;quot;NFC&amp;quot;, &amp;quot;&amp;quot;.join(out))&lt;br /&gt;
&lt;br /&gt;
    def number(self):&lt;br /&gt;
        start = self.i&lt;br /&gt;
        if self.t[self.i] == &amp;quot;-&amp;quot;:&lt;br /&gt;
            self.i += 1&lt;br /&gt;
        if self.i &amp;gt;= self.n:&lt;br /&gt;
            self.fail()&lt;br /&gt;
        if self.t[self.i] == &amp;quot;0&amp;quot;:&lt;br /&gt;
            self.i += 1&lt;br /&gt;
        elif &amp;quot;1&amp;quot; &amp;lt;= self.t[self.i] &amp;lt;= &amp;quot;9&amp;quot;:&lt;br /&gt;
            while self.i &amp;lt; self.n and &amp;quot;0&amp;quot; &amp;lt;= self.t[self.i] &amp;lt;= &amp;quot;9&amp;quot;:&lt;br /&gt;
                self.i += 1&lt;br /&gt;
        else:&lt;br /&gt;
            self.fail()&lt;br /&gt;
        intpart = self.t[start:self.i].lstrip(&amp;quot;-&amp;quot;)&lt;br /&gt;
        sign = &amp;quot;-&amp;quot; if self.t[start] == &amp;quot;-&amp;quot; else &amp;quot;&amp;quot;&lt;br /&gt;
        frac = &amp;quot;&amp;quot;&lt;br /&gt;
        if self.i &amp;lt; self.n and self.t[self.i] == &amp;quot;.&amp;quot;:&lt;br /&gt;
            self.i += 1&lt;br /&gt;
            j = self.i&lt;br /&gt;
            while self.i &amp;lt; self.n and &amp;quot;0&amp;quot; &amp;lt;= self.t[self.i] &amp;lt;= &amp;quot;9&amp;quot;:&lt;br /&gt;
                self.i += 1&lt;br /&gt;
            if self.i == j:&lt;br /&gt;
                self.fail()&lt;br /&gt;
            frac = self.t[j:self.i]&lt;br /&gt;
        e = 0&lt;br /&gt;
        if self.i &amp;lt; self.n and self.t[self.i] in &amp;quot;eE&amp;quot;:&lt;br /&gt;
            self.i += 1&lt;br /&gt;
            esign = 1&lt;br /&gt;
            if self.i &amp;lt; self.n and self.t[self.i] in &amp;quot;+-&amp;quot;:&lt;br /&gt;
                if self.t[self.i] == &amp;quot;-&amp;quot;:&lt;br /&gt;
                    esign = -1&lt;br /&gt;
                self.i += 1&lt;br /&gt;
            j = self.i&lt;br /&gt;
            while self.i &amp;lt; self.n and &amp;quot;0&amp;quot; &amp;lt;= self.t[self.i] &amp;lt;= &amp;quot;9&amp;quot;:&lt;br /&gt;
                self.i += 1&lt;br /&gt;
            if self.i == j or self.i - j &amp;gt; MAX_EXP_DIGITS:&lt;br /&gt;
                self.fail()&lt;br /&gt;
            e = esign * int(self.t[j:self.i])&lt;br /&gt;
        e -= len(frac)&lt;br /&gt;
        digits = (intpart + frac).lstrip(&amp;quot;0&amp;quot;)&lt;br /&gt;
        if digits == &amp;quot;&amp;quot;:&lt;br /&gt;
            return &amp;quot;0&amp;quot;&lt;br /&gt;
        trimmed = digits.rstrip(&amp;quot;0&amp;quot;)&lt;br /&gt;
        e += len(digits) - len(trimmed)&lt;br /&gt;
        return sign + trimmed + (&amp;quot;e%d&amp;quot; % e if e != 0 else &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _quote(s):&lt;br /&gt;
    out = [&amp;#039;&amp;quot;&amp;#039;]&lt;br /&gt;
    for ch in s:&lt;br /&gt;
        o = ord(ch)&lt;br /&gt;
        if ch == &amp;#039;&amp;quot;&amp;#039;:&lt;br /&gt;
            out.append(&amp;#039;\\&amp;quot;&amp;#039;)&lt;br /&gt;
        elif ch == &amp;quot;\\&amp;quot;:&lt;br /&gt;
            out.append(&amp;quot;\\\\&amp;quot;)&lt;br /&gt;
        elif ch == &amp;quot;\b&amp;quot;:&lt;br /&gt;
            out.append(&amp;quot;\\b&amp;quot;)&lt;br /&gt;
        elif ch == &amp;quot;\f&amp;quot;:&lt;br /&gt;
            out.append(&amp;quot;\\f&amp;quot;)&lt;br /&gt;
        elif ch == &amp;quot;\n&amp;quot;:&lt;br /&gt;
            out.append(&amp;quot;\\n&amp;quot;)&lt;br /&gt;
        elif ch == &amp;quot;\r&amp;quot;:&lt;br /&gt;
            out.append(&amp;quot;\\r&amp;quot;)&lt;br /&gt;
        elif ch == &amp;quot;\t&amp;quot;:&lt;br /&gt;
            out.append(&amp;quot;\\t&amp;quot;)&lt;br /&gt;
        elif o &amp;lt; 0x20:&lt;br /&gt;
            out.append(&amp;quot;\\u%04x&amp;quot; % o)&lt;br /&gt;
        else:&lt;br /&gt;
            out.append(ch)&lt;br /&gt;
    out.append(&amp;#039;&amp;quot;&amp;#039;)&lt;br /&gt;
    return &amp;quot;&amp;quot;.join(out)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def canonical_tools(json_text):&lt;br /&gt;
    if not _is_text(json_text):&lt;br /&gt;
        raise ValueError(&amp;quot;tools&amp;quot;)&lt;br /&gt;
    p = _Parser(json_text)&lt;br /&gt;
    v = p.value(0)&lt;br /&gt;
    p.ws()&lt;br /&gt;
    if p.i != p.n:&lt;br /&gt;
        raise ValueError(&amp;quot;tools&amp;quot;)&lt;br /&gt;
    return v&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# --------------------------------------------------------- prompt digest&lt;br /&gt;
&lt;br /&gt;
def _is_salt(s):&lt;br /&gt;
    if type(s) is not str or len(s) != 32:&lt;br /&gt;
        return False&lt;br /&gt;
    for ch in s:&lt;br /&gt;
        if ch not in &amp;quot;0123456789abcdef&amp;quot;:&lt;br /&gt;
            return False&lt;br /&gt;
    return True&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def prompt_digest(family, salt, template, tools):&lt;br /&gt;
    fam = _nfc(family, &amp;quot;family&amp;quot;)&lt;br /&gt;
    if fam == &amp;quot;&amp;quot;:&lt;br /&gt;
        raise ValueError(&amp;quot;family&amp;quot;)&lt;br /&gt;
    if not _is_salt(salt):&lt;br /&gt;
        raise ValueError(&amp;quot;salt&amp;quot;)&lt;br /&gt;
    tmpl = _nfc(template, &amp;quot;template&amp;quot;)&lt;br /&gt;
    canon = canonical_tools(tools)&lt;br /&gt;
    return _digest_fields([&amp;quot;TPM-PROMPT&amp;quot;, &amp;quot;1&amp;quot;, fam, salt, tmpl, canon])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ------------------------------------------------------------- family_of&lt;br /&gt;
&lt;br /&gt;
def _check_map(model_map):&lt;br /&gt;
    if type(model_map) is not list:&lt;br /&gt;
        raise ValueError(&amp;quot;model_map&amp;quot;)&lt;br /&gt;
    names = set()&lt;br /&gt;
    rows = []&lt;br /&gt;
    for r in model_map:&lt;br /&gt;
        if not _keys_are(r, (&amp;quot;name&amp;quot;, &amp;quot;family&amp;quot;, &amp;quot;open&amp;quot;, &amp;quot;server&amp;quot;,&lt;br /&gt;
                             &amp;quot;quantization&amp;quot;)):&lt;br /&gt;
            raise ValueError(&amp;quot;model_map&amp;quot;)&lt;br /&gt;
        if not _is_text(r[&amp;quot;name&amp;quot;]) or r[&amp;quot;name&amp;quot;] == &amp;quot;&amp;quot;:&lt;br /&gt;
            raise ValueError(&amp;quot;model_map&amp;quot;)&lt;br /&gt;
        if not _is_text(r[&amp;quot;family&amp;quot;]) or r[&amp;quot;family&amp;quot;] == &amp;quot;&amp;quot;:&lt;br /&gt;
            raise ValueError(&amp;quot;model_map&amp;quot;)&lt;br /&gt;
        if type(r[&amp;quot;open&amp;quot;]) is not bool:&lt;br /&gt;
            raise ValueError(&amp;quot;model_map&amp;quot;)&lt;br /&gt;
        if r[&amp;quot;open&amp;quot;]:&lt;br /&gt;
            for k in (&amp;quot;server&amp;quot;, &amp;quot;quantization&amp;quot;):&lt;br /&gt;
                if not _is_text(r[k]) or r[k] == &amp;quot;&amp;quot;:&lt;br /&gt;
                    raise ValueError(&amp;quot;model_map&amp;quot;)&lt;br /&gt;
        else:&lt;br /&gt;
            if r[&amp;quot;server&amp;quot;] is not None or r[&amp;quot;quantization&amp;quot;] is not None:&lt;br /&gt;
                raise ValueError(&amp;quot;model_map&amp;quot;)&lt;br /&gt;
        name = unicodedata.normalize(&amp;quot;NFC&amp;quot;, r[&amp;quot;name&amp;quot;])&lt;br /&gt;
        if name in names:&lt;br /&gt;
            raise ValueError(&amp;quot;model_map&amp;quot;)&lt;br /&gt;
        names.add(name)&lt;br /&gt;
        rows.append((name, r))&lt;br /&gt;
    return rows&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def family_key(family, open_weights, server, quantization):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;The VENDOR FAMILY KEY (FO2).&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if open_weights:&lt;br /&gt;
        return _netstring([&amp;quot;OPEN&amp;quot;, family, server, quantization]).decode(&lt;br /&gt;
            &amp;quot;utf-8&amp;quot;)&lt;br /&gt;
    return _netstring([&amp;quot;CLOSED&amp;quot;, family]).decode(&amp;quot;utf-8&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def family_of(model_string, model_map):&lt;br /&gt;
    ms = _nfc(model_string, &amp;quot;model&amp;quot;)&lt;br /&gt;
    if ms == &amp;quot;&amp;quot;:&lt;br /&gt;
        raise ValueError(&amp;quot;model&amp;quot;)&lt;br /&gt;
    rows = _check_map(model_map)&lt;br /&gt;
    for name, r in rows:&lt;br /&gt;
        if name == ms:&lt;br /&gt;
            fam = unicodedata.normalize(&amp;quot;NFC&amp;quot;, r[&amp;quot;family&amp;quot;])&lt;br /&gt;
            if r[&amp;quot;open&amp;quot;]:&lt;br /&gt;
                server = unicodedata.normalize(&amp;quot;NFC&amp;quot;, r[&amp;quot;server&amp;quot;])&lt;br /&gt;
                quant = unicodedata.normalize(&amp;quot;NFC&amp;quot;, r[&amp;quot;quantization&amp;quot;])&lt;br /&gt;
            else:&lt;br /&gt;
                server = None&lt;br /&gt;
                quant = None&lt;br /&gt;
            return {&amp;quot;status&amp;quot;: &amp;quot;MAPPED&amp;quot;, &amp;quot;family&amp;quot;: fam, &amp;quot;open&amp;quot;: r[&amp;quot;open&amp;quot;],&lt;br /&gt;
                    &amp;quot;server&amp;quot;: server, &amp;quot;quantization&amp;quot;: quant,&lt;br /&gt;
                    &amp;quot;key&amp;quot;: family_key(fam, r[&amp;quot;open&amp;quot;], server, quant)}&lt;br /&gt;
    return {&amp;quot;status&amp;quot;: &amp;quot;UNMAPPED&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def render_family(d):&lt;br /&gt;
    if d[&amp;quot;status&amp;quot;] == &amp;quot;UNMAPPED&amp;quot;:&lt;br /&gt;
        return &amp;quot;UNMAPPED&amp;quot;&lt;br /&gt;
    return &amp;quot;MAPPED|%s|%s|%s|%s|%s&amp;quot; % (&lt;br /&gt;
        _esc(d[&amp;quot;family&amp;quot;]), &amp;quot;true&amp;quot; if d[&amp;quot;open&amp;quot;] else &amp;quot;false&amp;quot;,&lt;br /&gt;
        &amp;quot;-&amp;quot; if d[&amp;quot;server&amp;quot;] is None else _esc(d[&amp;quot;server&amp;quot;]),&lt;br /&gt;
        &amp;quot;-&amp;quot; if d[&amp;quot;quantization&amp;quot;] is None else _esc(d[&amp;quot;quantization&amp;quot;]),&lt;br /&gt;
        _esc(d[&amp;quot;key&amp;quot;]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ---------------------------------------------------------- change_class&lt;br /&gt;
&lt;br /&gt;
def change_class(certified_family, last_model, reported_model, lookup):&lt;br /&gt;
    cert = _nfc(certified_family, &amp;quot;certified_family&amp;quot;)&lt;br /&gt;
    if cert == &amp;quot;&amp;quot;:&lt;br /&gt;
        raise ValueError(&amp;quot;certified_family&amp;quot;)&lt;br /&gt;
    last = _nfc(last_model, &amp;quot;last_model&amp;quot;)&lt;br /&gt;
    if last == &amp;quot;&amp;quot;:&lt;br /&gt;
        raise ValueError(&amp;quot;last_model&amp;quot;)&lt;br /&gt;
    rep = _nfc(reported_model, &amp;quot;reported_model&amp;quot;)&lt;br /&gt;
    if rep == &amp;quot;&amp;quot;:&lt;br /&gt;
        raise ValueError(&amp;quot;reported_model&amp;quot;)&lt;br /&gt;
    if not _keys_are(lookup, (&amp;quot;family&amp;quot;, &amp;quot;cluster&amp;quot;)):&lt;br /&gt;
        raise ValueError(&amp;quot;lookup&amp;quot;)&lt;br /&gt;
    fam = lookup[&amp;quot;family&amp;quot;]&lt;br /&gt;
    if not _is_text(fam) or fam == &amp;quot;&amp;quot;:&lt;br /&gt;
        raise ValueError(&amp;quot;lookup&amp;quot;)&lt;br /&gt;
    fam = unicodedata.normalize(&amp;quot;NFC&amp;quot;, fam)&lt;br /&gt;
    cl = lookup[&amp;quot;cluster&amp;quot;]&lt;br /&gt;
    if cl is not None and cl not in CLUSTER_CLASSES:&lt;br /&gt;
        raise ValueError(&amp;quot;lookup&amp;quot;)&lt;br /&gt;
    if fam == &amp;quot;UNMAPPED&amp;quot;:&lt;br /&gt;
        return {&amp;quot;class&amp;quot;: &amp;quot;REFUSED MODEL&amp;quot;, &amp;quot;detail&amp;quot;: &amp;quot;UNMAPPED&amp;quot;}&lt;br /&gt;
    if fam != cert:&lt;br /&gt;
        return {&amp;quot;class&amp;quot;: &amp;quot;REFUSED FAMILY&amp;quot;, &amp;quot;detail&amp;quot;: &amp;quot;FAMILY&amp;quot;}&lt;br /&gt;
    if rep == last:&lt;br /&gt;
        return {&amp;quot;class&amp;quot;: &amp;quot;SAME&amp;quot;, &amp;quot;detail&amp;quot;: &amp;quot;-&amp;quot;}&lt;br /&gt;
    if cl is None:&lt;br /&gt;
        raise ValueError(&amp;quot;lookup&amp;quot;)&lt;br /&gt;
    if cl == &amp;quot;IN&amp;quot;:&lt;br /&gt;
        return {&amp;quot;class&amp;quot;: &amp;quot;RECORDED CHANGE&amp;quot;, &amp;quot;detail&amp;quot;: &amp;quot;IN&amp;quot;}&lt;br /&gt;
    if cl == &amp;quot;CUSP&amp;quot;:&lt;br /&gt;
        return {&amp;quot;class&amp;quot;: &amp;quot;CUSP PATH&amp;quot;, &amp;quot;detail&amp;quot;: &amp;quot;CUSP&amp;quot;}&lt;br /&gt;
    return {&amp;quot;class&amp;quot;: &amp;quot;REFUSED MODEL&amp;quot;, &amp;quot;detail&amp;quot;: cl}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def render_class(d):&lt;br /&gt;
    return d[&amp;quot;class&amp;quot;] + &amp;quot;|&amp;quot; + d[&amp;quot;detail&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ------------------------------------------------------ identity_compare&lt;br /&gt;
&lt;br /&gt;
def identity_compare(declared, stated, relayed, inferred):&lt;br /&gt;
    vals = {}&lt;br /&gt;
    for name, v in ((&amp;quot;declared&amp;quot;, declared), (&amp;quot;stated&amp;quot;, stated),&lt;br /&gt;
                    (&amp;quot;relayed&amp;quot;, relayed), (&amp;quot;inferred&amp;quot;, inferred)):&lt;br /&gt;
        if v is None:&lt;br /&gt;
            vals[name] = None&lt;br /&gt;
        else:&lt;br /&gt;
            s = _nfc(v, name)&lt;br /&gt;
            if s == &amp;quot;&amp;quot;:&lt;br /&gt;
                raise ValueError(name)&lt;br /&gt;
            vals[name] = s&lt;br /&gt;
    pairs = []&lt;br /&gt;
    differ = 0&lt;br /&gt;
    compared = 0&lt;br /&gt;
    for a, b in PAIRS:&lt;br /&gt;
        if vals[a] is None or vals[b] is None:&lt;br /&gt;
            pairs.append((a, b, &amp;quot;ABSENT&amp;quot;))&lt;br /&gt;
        elif vals[a] == vals[b]:&lt;br /&gt;
            pairs.append((a, b, &amp;quot;AGREE&amp;quot;))&lt;br /&gt;
            compared += 1&lt;br /&gt;
        else:&lt;br /&gt;
            pairs.append((a, b, &amp;quot;DIFFER&amp;quot;))&lt;br /&gt;
            compared += 1&lt;br /&gt;
            differ += 1&lt;br /&gt;
    if differ &amp;gt; 0:&lt;br /&gt;
        overall = &amp;quot;DIFFER&amp;quot;&lt;br /&gt;
    elif compared &amp;gt; 0:&lt;br /&gt;
        overall = &amp;quot;AGREE&amp;quot;&lt;br /&gt;
    else:&lt;br /&gt;
        overall = &amp;quot;ABSENT&amp;quot;&lt;br /&gt;
    return {&amp;quot;overall&amp;quot;: overall, &amp;quot;pairs&amp;quot;: pairs, &amp;quot;differ&amp;quot;: differ}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def render_compare(d):&lt;br /&gt;
    lines = [&amp;quot;overall|%s|%d&amp;quot; % (d[&amp;quot;overall&amp;quot;], d[&amp;quot;differ&amp;quot;])]&lt;br /&gt;
    for a, b, r in d[&amp;quot;pairs&amp;quot;]:&lt;br /&gt;
        lines.append(&amp;quot;%s|%s|%s&amp;quot; % (a, b, r))&lt;br /&gt;
    return &amp;quot;\n&amp;quot;.join(lines)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ---------------------------------------------------------------- corpus&lt;br /&gt;
&lt;br /&gt;
FNS = (&amp;quot;tools&amp;quot;, &amp;quot;digest&amp;quot;, &amp;quot;family&amp;quot;, &amp;quot;class&amp;quot;, &amp;quot;compare&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def run_case(fn, args):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;One corpus case: the render, or &amp;quot;ERROR:&amp;quot; and the message.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if fn not in FNS:&lt;br /&gt;
        raise ValueError(&amp;quot;fn&amp;quot;)&lt;br /&gt;
    try:&lt;br /&gt;
        if fn == &amp;quot;tools&amp;quot;:&lt;br /&gt;
            return canonical_tools(args[&amp;quot;json&amp;quot;])&lt;br /&gt;
        if fn == &amp;quot;digest&amp;quot;:&lt;br /&gt;
            return prompt_digest(args[&amp;quot;family&amp;quot;], args[&amp;quot;salt&amp;quot;],&lt;br /&gt;
                                 args[&amp;quot;template&amp;quot;], args[&amp;quot;tools&amp;quot;])&lt;br /&gt;
        if fn == &amp;quot;family&amp;quot;:&lt;br /&gt;
            return render_family(family_of(args[&amp;quot;model&amp;quot;], args[&amp;quot;map&amp;quot;]))&lt;br /&gt;
        if fn == &amp;quot;class&amp;quot;:&lt;br /&gt;
            return render_class(change_class(&lt;br /&gt;
                args[&amp;quot;certified&amp;quot;], args[&amp;quot;last&amp;quot;], args[&amp;quot;reported&amp;quot;],&lt;br /&gt;
                args[&amp;quot;lookup&amp;quot;]))&lt;br /&gt;
        return render_compare(identity_compare(&lt;br /&gt;
            args[&amp;quot;declared&amp;quot;], args[&amp;quot;stated&amp;quot;], args[&amp;quot;relayed&amp;quot;],&lt;br /&gt;
            args[&amp;quot;inferred&amp;quot;]))&lt;br /&gt;
    except ValueError as ex:&lt;br /&gt;
        return &amp;quot;ERROR:&amp;quot; + str(ex)&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>BFP Rauch</name></author>
	</entry>
</feed>