<?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%2Fverify_lr7_hunks.py</id>
	<title>The Principia Machina/TPC-PY/verify lr7 hunks.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%2Fverify_lr7_hunks.py"/>
	<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/verify_lr7_hunks.py&amp;action=history"/>
	<updated>2026-10-21T13:01:20Z</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/verify_lr7_hunks.py&amp;diff=4307&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/verify_lr7_hunks.py&amp;diff=4307&amp;oldid=prev"/>
		<updated>2026-09-28T04:53:38Z</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:53, 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/verify_lr7_hunks.py&amp;diff=4306&amp;oldid=prev</id>
		<title>BFP Rauch: TPC-PY source verify_lr7_hunks.py (0.1.0), SHA-256 0f7d967a2cbd113c; 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/verify_lr7_hunks.py&amp;diff=4306&amp;oldid=prev"/>
		<updated>2026-09-27T15:43:18Z</updated>

		<summary type="html">&lt;p&gt;TPC-PY source verify_lr7_hunks.py (0.1.0), SHA-256 0f7d967a2cbd113c; 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;verify_lr7_hunks 0.1.0: replays landing round 7&amp;#039;s hunk sets with&lt;br /&gt;
hunk_apply in both residences (MEASURED). For each hunks_&amp;lt;target&amp;gt;.json in&lt;br /&gt;
SRC: the delivered target is reverse-applied (new -&amp;gt; old) to rebuild the&lt;br /&gt;
baseline, whose SHA-256 must equal the recorded baseline_sha256; the&lt;br /&gt;
forward application (old -&amp;gt; new) of the rebuilt baseline must give the&lt;br /&gt;
delivered target byte for byte; the PHP residence must give the same&lt;br /&gt;
SHA-256 for both directions. A set whose reverse application is refused&lt;br /&gt;
is reported as such (the PMP-TPM set: four hunks&amp;#039; new texts were amended&lt;br /&gt;
after the hunks by the verification fixes of LR7 9.3, so they no longer&lt;br /&gt;
occur in 0.12.0). Usage: python3 verify_lr7_hunks.py [SRC]. SRC defaults&lt;br /&gt;
to hunk_inputs/lr7_request beside this file, which holds the request set&lt;br /&gt;
only (GEN-PATHS, 2026-09-27); the PHP stub and its input are written to a&lt;br /&gt;
temporary folder outside the tree and removed; tpc_hunk.php is read from&lt;br /&gt;
../tpc_php (the layout since increment 9).&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
import hashlib, json, os, shutil, subprocess, sys, tempfile&lt;br /&gt;
here = os.path.dirname(os.path.abspath(__file__))&lt;br /&gt;
sys.path.insert(0, here)&lt;br /&gt;
from tpc_hunk import hunk_apply&lt;br /&gt;
SRC = sys.argv[1] if len(sys.argv) &amp;gt; 1 else os.path.join(here, &amp;quot;hunk_inputs&amp;quot;, &amp;quot;lr7_request&amp;quot;)&lt;br /&gt;
SETS = [(&amp;quot;hunks_record.json&amp;quot;, None), (&amp;quot;hunks_pmp.json&amp;quot;, None),&lt;br /&gt;
        (&amp;quot;hunks_request.json&amp;quot;, None), (&amp;quot;hunks_readme.json&amp;quot;, &amp;quot;README_current_versions.txt&amp;quot;)]&lt;br /&gt;
PHP = r&amp;#039;&amp;#039;&amp;#039;&amp;lt;?php&lt;br /&gt;
declare(strict_types=1);&lt;br /&gt;
require $argv[1];&lt;br /&gt;
$in = json_decode(file_get_contents($argv[2]), false, 512, JSON_THROW_ON_ERROR);&lt;br /&gt;
$r = tpc_hunk_apply($in-&amp;gt;base, $in-&amp;gt;hunks);&lt;br /&gt;
echo json_encode($r[&amp;#039;status&amp;#039;] === &amp;#039;OK&amp;#039; ? [&amp;#039;status&amp;#039; =&amp;gt; &amp;#039;OK&amp;#039;, &amp;#039;sha256&amp;#039; =&amp;gt; $r[&amp;#039;sha256&amp;#039;]] : $r);&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
TMP = tempfile.mkdtemp(prefix=&amp;quot;tpc_verify_lr7_&amp;quot;)&lt;br /&gt;
php_path = os.path.join(TMP, &amp;quot;_verify_lr7.php&amp;quot;)&lt;br /&gt;
open(php_path, &amp;quot;w&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;).write(PHP)&lt;br /&gt;
def php_apply(base, hunks):&lt;br /&gt;
    inp = os.path.join(TMP, &amp;quot;_verify_lr7_in.json&amp;quot;)&lt;br /&gt;
    json.dump({&amp;quot;base&amp;quot;: base, &amp;quot;hunks&amp;quot;: hunks}, open(inp, &amp;quot;w&amp;quot;, encoding=&amp;quot;utf-8&amp;quot;), ensure_ascii=False)&lt;br /&gt;
    out = subprocess.run([&amp;quot;php&amp;quot;, php_path, os.path.join(here, &amp;quot;..&amp;quot;, &amp;quot;tpc_php&amp;quot;, &amp;quot;tpc_hunk.php&amp;quot;), inp], capture_output=True, text=True, check=True).stdout&lt;br /&gt;
    return json.loads(out)&lt;br /&gt;
for name, target_name in SETS:&lt;br /&gt;
    path = os.path.join(SRC, name)&lt;br /&gt;
    if not os.path.exists(path):&lt;br /&gt;
        print(name, &amp;quot;NOT FOUND&amp;quot;); continue&lt;br /&gt;
    d = json.load(open(path, encoding=&amp;quot;utf-8&amp;quot;))&lt;br /&gt;
    tname = target_name or d[&amp;quot;target&amp;quot;]&lt;br /&gt;
    target = open(os.path.join(SRC, tname), encoding=&amp;quot;utf-8&amp;quot;, newline=&amp;quot;&amp;quot;).read()&lt;br /&gt;
    hs = d[&amp;quot;hunks&amp;quot;]&lt;br /&gt;
    rev = hunk_apply(target, [{&amp;quot;old&amp;quot;: h[&amp;quot;new&amp;quot;], &amp;quot;new&amp;quot;: h[&amp;quot;old&amp;quot;]} for h in hs])&lt;br /&gt;
    if rev[&amp;quot;status&amp;quot;] != &amp;quot;OK&amp;quot;:&lt;br /&gt;
        print(&amp;quot;%s: %d hunks; reverse application REFUSED %s at hunk %d (n=%s, anchor=%s)&amp;quot; % (&lt;br /&gt;
            name, len(hs), rev[&amp;quot;reason&amp;quot;], rev[&amp;quot;hunk&amp;quot;], hs[rev[&amp;quot;hunk&amp;quot;] - 1][&amp;quot;n&amp;quot;], hs[rev[&amp;quot;hunk&amp;quot;] - 1][&amp;quot;anchor&amp;quot;]))&lt;br /&gt;
        continue&lt;br /&gt;
    base = rev[&amp;quot;text&amp;quot;]&lt;br /&gt;
    bsha = hashlib.sha256(base.encode(&amp;quot;utf-8&amp;quot;)).hexdigest()&lt;br /&gt;
    fwd = hunk_apply(base, [{&amp;quot;old&amp;quot;: h[&amp;quot;old&amp;quot;], &amp;quot;new&amp;quot;: h[&amp;quot;new&amp;quot;]} for h in hs])&lt;br /&gt;
    php_rev = php_apply(target, [{&amp;quot;old&amp;quot;: h[&amp;quot;new&amp;quot;], &amp;quot;new&amp;quot;: h[&amp;quot;old&amp;quot;]} for h in hs])&lt;br /&gt;
    php_fwd = php_apply(base, [{&amp;quot;old&amp;quot;: h[&amp;quot;old&amp;quot;], &amp;quot;new&amp;quot;: h[&amp;quot;new&amp;quot;]} for h in hs])&lt;br /&gt;
    tsha = hashlib.sha256(target.encode(&amp;quot;utf-8&amp;quot;)).hexdigest()&lt;br /&gt;
    print(&amp;quot;%s: %d hunks; baseline sha256 %s recorded %s %s; forward %s target %s %s; php reverse %s forward %s&amp;quot; % (&lt;br /&gt;
        name, len(hs), bsha[:16], d[&amp;quot;baseline_sha256&amp;quot;][:16], &amp;quot;MATCH&amp;quot; if bsha == d[&amp;quot;baseline_sha256&amp;quot;] else &amp;quot;MISMATCH&amp;quot;,&lt;br /&gt;
        fwd[&amp;quot;sha256&amp;quot;][:16], tsha[:16], &amp;quot;BYTE-IDENTICAL&amp;quot; if fwd[&amp;quot;status&amp;quot;] == &amp;quot;OK&amp;quot; and fwd[&amp;quot;text&amp;quot;] == target else &amp;quot;DIFFERENT&amp;quot;,&lt;br /&gt;
        &amp;quot;MATCH&amp;quot; if php_rev.get(&amp;quot;sha256&amp;quot;) == bsha else &amp;quot;MISMATCH&amp;quot;, &amp;quot;MATCH&amp;quot; if php_fwd.get(&amp;quot;sha256&amp;quot;) == tsha else &amp;quot;MISMATCH&amp;quot;))&lt;br /&gt;
shutil.rmtree(TMP)&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>BFP Rauch</name></author>
	</entry>
</feed>