<?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_sr9.py</id>
	<title>The Principia Machina/TPC-PY/tpc sr9.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_sr9.py"/>
	<link rel="alternate" type="text/html" href="https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/tpc_sr9.py&amp;action=history"/>
	<updated>2026-10-21T20:18:25Z</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_sr9.py&amp;diff=4887&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_sr9.py&amp;diff=4887&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;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:11, 30 September 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;4&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;!-- diff cache key pma_cutover_20261020t051351z-soft_:diff:1.41:old-4886:rev-4887 --&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_sr9.py&amp;diff=4886&amp;oldid=prev</id>
		<title>BFP Rauch: TPC-PY source tpc_sr9.py (0.1.1), SHA-256 8856950baf55a6ea; 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_sr9.py&amp;diff=4886&amp;oldid=prev"/>
		<updated>2026-09-30T02:10:58Z</updated>

		<summary type="html">&lt;p&gt;TPC-PY source tpc_sr9.py (0.1.1), SHA-256 8856950baf55a6ea; 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-l45&quot;&gt;Line 45:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 45:&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 tpc_strike as S&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 tpc_strike as S&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;TPC_SR9_VERSION = &quot;0.1.0&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;TPC_SR9_VERSION = &quot;0.1.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;1&quot;     # proposed PATCH with TPC-PY &lt;/ins&gt;0&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;.2.0 (C-MS-5: TPC-PHP copies before it adds the fresh assumption)&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;_FRESH = &amp;quot;~FRESH~&amp;quot;   # prefix for the assumption added by the C2 transform&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;_FRESH = &amp;quot;~FRESH~&amp;quot;   # prefix for the assumption added by the C2 transform&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;/table&gt;</summary>
		<author><name>BFP Rauch</name></author>
	</entry>
	<entry>
		<id>https://invarians.org/index.php?title=The_Principia_Machina/TPC-PY/tpc_sr9.py&amp;diff=4233&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_sr9.py&amp;diff=4233&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_sr9.py&amp;diff=4232&amp;oldid=prev</id>
		<title>BFP Rauch: TPC-PY source tpc_sr9.py (0.1.0), SHA-256 5a3f02bd8e536455; 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_sr9.py&amp;diff=4232&amp;oldid=prev"/>
		<updated>2026-09-27T15:43:18Z</updated>

		<summary type="html">&lt;p&gt;TPC-PY source tpc_sr9.py (0.1.0), SHA-256 5a3f02bd8e536455; 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;# -*- coding: utf-8 -*-&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
TPC-PY --- SR9 C-test harness (TPC step 2, increment 3)&lt;br /&gt;
=======================================================&lt;br /&gt;
Discharges the SR9 part of TPS 4.5.3 OWED C-08: &amp;quot;the mechanical&lt;br /&gt;
implementation of ... SR9; the synthetic record suite for C1, C2, C4&amp;quot;.&lt;br /&gt;
(SR3, SR4, SR8 were increment 1, tpc_strike.py.) Standard library only;&lt;br /&gt;
Python 3.7+; Windows/Linux.&lt;br /&gt;
&lt;br /&gt;
WHAT IS CHECKED (TPS 4.5.2; check-class matrix row 17, MECHANICAL when&lt;br /&gt;
the entry is executable; on failure CAC refuses certification):&lt;br /&gt;
  C1  the entry never ranks a record failing SR1 above one passing it;&lt;br /&gt;
  C2  within a regime, adding an ASSUMPTION never improves rank, except&lt;br /&gt;
      in a declared limiting case naming its DOMAIN, applied only there;&lt;br /&gt;
  C4  the entry does not let an M contradiction strike an L derivation.&lt;br /&gt;
  Plus the TPS 4.5.3 gate: the TMS declares k, STEP CONVENTION and N_x.&lt;br /&gt;
  C3 and C5 are INSPECTION (row 18) and are not here.&lt;br /&gt;
&lt;br /&gt;
EXECUTABLE ENTRY INTERFACE (what the harness runs):&lt;br /&gt;
  key(rid, records, tfk)            -&amp;gt; tuple; lexicographic; lower = closer&lt;br /&gt;
  resolve(id1, id2, records, tfk)   -&amp;gt; &amp;quot;STRIKE:&amp;lt;id&amp;gt;&amp;quot; | &amp;quot;AUDIT&amp;quot; |&lt;br /&gt;
                                       &amp;quot;GAP:&amp;lt;id&amp;gt;&amp;quot; | &amp;quot;DOMAIN:&amp;lt;id&amp;gt;&amp;quot;&lt;br /&gt;
  limiting                          -&amp;gt; list of DOMAIN strings where a C2&lt;br /&gt;
                                       exemption is declared&lt;br /&gt;
  A UWC declares an executable local yardstick in the closed grammar of&lt;br /&gt;
  the TMS zone schema (D100.1); tpc_yardstick compiles it into this&lt;br /&gt;
  interface, and every check below accepts that entry tuple in place of a&lt;br /&gt;
  fixture name.&lt;br /&gt;
&lt;br /&gt;
FIXTURES. ENTRIES holds one compliant entry (the strike skeleton itself)&lt;br /&gt;
and deliberately broken entries, each violating exactly one check, so the&lt;br /&gt;
corpus proves the harness catches what it must (a check that accepts what&lt;br /&gt;
it should reject is a soundness defect).&lt;br /&gt;
&lt;br /&gt;
LIMIT. A pass on a finite synthetic suite is evidence, not proof: an entry&lt;br /&gt;
can still violate C1/C2/C4 on records the suite lacks. This is the design&lt;br /&gt;
TPS 4.5.2 specifies (MECHANICAL on a synthetic record suite); C3/C5 stay&lt;br /&gt;
INSPECTION.&lt;br /&gt;
&lt;br /&gt;
SYNTHETIC RECORD FIELDS: regime (&amp;quot;L&amp;quot;|&amp;quot;M&amp;quot;), assumptions [ids], cites [ids],&lt;br /&gt;
steps (int), domain (str), sr1_fail (bool; given, since SR1 detection&lt;br /&gt;
needs a derivation oracle and is not a TPC function).&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
import tpc_strike as S&lt;br /&gt;
&lt;br /&gt;
TPC_SR9_VERSION = &amp;quot;0.1.0&amp;quot;&lt;br /&gt;
_FRESH = &amp;quot;~FRESH~&amp;quot;   # prefix for the assumption added by the C2 transform&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _a(rid, records, tfk):&lt;br /&gt;
    return S.a_of_r(rid, records, tfk)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _sr1(r):&lt;br /&gt;
    return 1 if r[&amp;quot;sr1_fail&amp;quot;] else 0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ---- key builders (total functions of record fields) ---------------------&lt;br /&gt;
def _key_skeleton(rid, records, tfk):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Skeleton (i)+(iii): SR1-failing records sort after all passing ones&lt;br /&gt;
    (struck without ranking); then d(r) = (a(r), s(r)).&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    r = records[rid]&lt;br /&gt;
    return (_sr1(r), _a(rid, records, tfk), int(r[&amp;quot;steps&amp;quot;]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _key_naive(rid, records, tfk):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Broken for C1: plain d(r), ignoring SR1 status.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    r = records[rid]&lt;br /&gt;
    return (_a(rid, records, tfk), int(r[&amp;quot;steps&amp;quot;]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _key_more_is_better(rid, records, tfk):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Broken for C2: more assumptions rank closer.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    r = records[rid]&lt;br /&gt;
    return (_sr1(r), -_a(rid, records, tfk), int(r[&amp;quot;steps&amp;quot;]))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _key_invert_in(domain):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Inverts the assumption count inside one DOMAIN only (a limiting case).&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    def key(rid, records, tfk):&lt;br /&gt;
        r = records[rid]&lt;br /&gt;
        a = _a(rid, records, tfk)&lt;br /&gt;
        return (_sr1(r), -a if r[&amp;quot;domain&amp;quot;] == domain else a, int(r[&amp;quot;steps&amp;quot;]))&lt;br /&gt;
    return key&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ---- resolvers -----------------------------------------------------------&lt;br /&gt;
def _sr5(key, id1, id2, records, tfk):&lt;br /&gt;
    k1, k2 = key(id1, records, tfk), key(id2, records, tfk)&lt;br /&gt;
    if k1 &amp;lt; k2:&lt;br /&gt;
        return &amp;quot;STRIKE:&amp;quot; + id2&lt;br /&gt;
    if k2 &amp;lt; k1:&lt;br /&gt;
        return &amp;quot;STRIKE:&amp;quot; + id1&lt;br /&gt;
    return &amp;quot;AUDIT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _resolve_regime_aware(key):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;SR7 for an L-M pair (never strike the L derivation: named GAP when&lt;br /&gt;
    a(L) &amp;gt; 0, DOMAIN finding when a(L) = 0); SR5 on the key otherwise.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    def resolve(id1, id2, records, tfk):&lt;br /&gt;
        r1, r2 = records[id1], records[id2]&lt;br /&gt;
        if r1[&amp;quot;regime&amp;quot;] != r2[&amp;quot;regime&amp;quot;]:&lt;br /&gt;
            lid = id1 if r1[&amp;quot;regime&amp;quot;] == &amp;quot;L&amp;quot; else id2&lt;br /&gt;
            return (&amp;quot;GAP:&amp;quot; if _a(lid, records, tfk) &amp;gt; 0 else &amp;quot;DOMAIN:&amp;quot;) + lid&lt;br /&gt;
        return _sr5(key, id1, id2, records, tfk)&lt;br /&gt;
    return resolve&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _resolve_ignores_regime(key):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Broken for C4: SR5 on the key for every pair, L-M included.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    def resolve(id1, id2, records, tfk):&lt;br /&gt;
        return _sr5(key, id1, id2, records, tfk)&lt;br /&gt;
    return resolve&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
_K_LIM = _key_invert_in(&amp;quot;LIM&amp;quot;)&lt;br /&gt;
_K_OTHER = _key_invert_in(&amp;quot;OTHER&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
ENTRIES = {&lt;br /&gt;
    # name: (key, resolve, declared limiting-case DOMAINs)&lt;br /&gt;
    &amp;quot;skeleton&amp;quot;:            (_key_skeleton, _resolve_regime_aware(_key_skeleton), []),&lt;br /&gt;
    &amp;quot;naive_d&amp;quot;:             (_key_naive, _resolve_regime_aware(_key_naive), []),&lt;br /&gt;
    &amp;quot;more_is_better&amp;quot;:      (_key_more_is_better, _resolve_regime_aware(_key_more_is_better), []),&lt;br /&gt;
    &amp;quot;ignores_regime&amp;quot;:      (_key_skeleton, _resolve_ignores_regime(_key_skeleton), []),&lt;br /&gt;
    &amp;quot;limiting_declared&amp;quot;:   (_K_LIM, _resolve_regime_aware(_K_LIM), [&amp;quot;LIM&amp;quot;]),&lt;br /&gt;
    &amp;quot;limiting_undeclared&amp;quot;: (_K_LIM, _resolve_regime_aware(_K_LIM), []),&lt;br /&gt;
    &amp;quot;limiting_leak&amp;quot;:       (_K_OTHER, _resolve_regime_aware(_K_OTHER), [&amp;quot;LIM&amp;quot;]),&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _entry(entry):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;A fixture by name, or an entry tuple (key, resolve, limiting) built&lt;br /&gt;
    elsewhere, such as a declared TMS yardstick (tpc_yardstick).&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if isinstance(entry, tuple):&lt;br /&gt;
        return entry&lt;br /&gt;
    if entry not in ENTRIES:&lt;br /&gt;
        raise KeyError(&amp;quot;sr9: unknown entry %r&amp;quot; % entry)&lt;br /&gt;
    return ENTRIES[entry]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def _suite(suite):&lt;br /&gt;
    return suite[&amp;quot;records&amp;quot;], list(suite.get(&amp;quot;tfk_assumptions&amp;quot;, []))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ---- the checks ----------------------------------------------------------&lt;br /&gt;
def sr9_c1(entry, suite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;C1. Witnesses &amp;quot;F&amp;gt;P&amp;quot;: SR1-failing F ranked strictly above passing P.&lt;br /&gt;
    Returns [pass, sorted witnesses].&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    key, _, _ = _entry(entry)&lt;br /&gt;
    recs, tfk = _suite(suite)&lt;br /&gt;
    fails = sorted(i for i, r in recs.items() if r[&amp;quot;sr1_fail&amp;quot;])&lt;br /&gt;
    passes = sorted(i for i, r in recs.items() if not r[&amp;quot;sr1_fail&amp;quot;])&lt;br /&gt;
    w = []&lt;br /&gt;
    for f in fails:&lt;br /&gt;
        kf = key(f, recs, tfk)&lt;br /&gt;
        for p in passes:&lt;br /&gt;
            if kf &amp;lt; key(p, recs, tfk):&lt;br /&gt;
                w.append(f + &amp;quot;&amp;gt;&amp;quot; + p)&lt;br /&gt;
    w.sort()&lt;br /&gt;
    return [not w, w]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sr9_c2(entry, suite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;C2. For each record r, r+ = r with one fresh assumption (same regime).&lt;br /&gt;
    A violation is key(r+) &amp;lt; key(r) outside a declared limiting DOMAIN; the&lt;br /&gt;
    same inside one is recorded as exempt. Returns [pass, violations, exempt].&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    key, _, limiting = _entry(entry)&lt;br /&gt;
    recs, tfk = _suite(suite)&lt;br /&gt;
    viol, exempt = [], []&lt;br /&gt;
    for rid in sorted(recs):&lt;br /&gt;
        plus = dict(recs[rid])&lt;br /&gt;
        plus[&amp;quot;assumptions&amp;quot;] = list(plus.get(&amp;quot;assumptions&amp;quot;, [])) + [_FRESH + rid]&lt;br /&gt;
        recs2 = dict(recs)&lt;br /&gt;
        recs2[rid + &amp;quot;+&amp;quot;] = plus&lt;br /&gt;
        if key(rid + &amp;quot;+&amp;quot;, recs2, tfk) &amp;lt; key(rid, recs2, tfk):&lt;br /&gt;
            (exempt if recs[rid][&amp;quot;domain&amp;quot;] in limiting else viol).append(rid)&lt;br /&gt;
    viol.sort()&lt;br /&gt;
    exempt.sort()&lt;br /&gt;
    return [not viol, viol, exempt]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sr9_c4(entry, suite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;C4. For each listed L-M contradiction, resolve in both orders; a&lt;br /&gt;
    violation is any outcome striking the L record. Returns&lt;br /&gt;
    [pass, sorted &amp;quot;L|M&amp;quot; witnesses].&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    _, resolve, _ = _entry(entry)&lt;br /&gt;
    recs, tfk = _suite(suite)&lt;br /&gt;
    viol = []&lt;br /&gt;
    for a, b in suite.get(&amp;quot;contradictions&amp;quot;, []):&lt;br /&gt;
        if recs[a][&amp;quot;regime&amp;quot;] == recs[b][&amp;quot;regime&amp;quot;]:&lt;br /&gt;
            continue                                  # C4 concerns M-vs-L only&lt;br /&gt;
        lid, mid = (a, b) if recs[a][&amp;quot;regime&amp;quot;] == &amp;quot;L&amp;quot; else (b, a)&lt;br /&gt;
        outcomes = {resolve(lid, mid, recs, tfk), resolve(mid, lid, recs, tfk)}&lt;br /&gt;
        if (&amp;quot;STRIKE:&amp;quot; + lid) in outcomes:&lt;br /&gt;
            viol.append(lid + &amp;quot;|&amp;quot; + mid)&lt;br /&gt;
    viol.sort()&lt;br /&gt;
    return [not viol, viol]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def sr9_harness(entry, suite):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Summary for the CAC gate: [C1 pass, C2 pass, C4 pass, total violations].&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    c1, c2, c4 = sr9_c1(entry, suite), sr9_c2(entry, suite), sr9_c4(entry, suite)&lt;br /&gt;
    return [c1[0], c2[0], c4[0], len(c1[1]) + len(c2[1]) + len(c4[1])]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def tms_params_ok(params):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;TPS 4.5.3: CAC refuses a TMS that does not declare k (SR3), STEP&lt;br /&gt;
    CONVENTION (SR4) or N_x (SR6). k &amp;gt; 0; STEP CONVENTION a non-empty&lt;br /&gt;
    string; N_x an integer &amp;gt;= 2. Returns [pass, missing-or-invalid names].&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    missing = []&lt;br /&gt;
    k = params.get(&amp;quot;k&amp;quot;)&lt;br /&gt;
    if isinstance(k, bool) or not isinstance(k, (int, float)) or not k &amp;gt; 0:&lt;br /&gt;
        missing.append(&amp;quot;k&amp;quot;)&lt;br /&gt;
    sc = params.get(&amp;quot;step_convention&amp;quot;)&lt;br /&gt;
    if not isinstance(sc, str) or not sc.strip():&lt;br /&gt;
        missing.append(&amp;quot;step_convention&amp;quot;)&lt;br /&gt;
    nx = params.get(&amp;quot;n_x&amp;quot;)&lt;br /&gt;
    if isinstance(nx, bool) or not isinstance(nx, int) or nx &amp;lt; 2:&lt;br /&gt;
        missing.append(&amp;quot;n_x&amp;quot;)&lt;br /&gt;
    return [not missing, missing]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>BFP Rauch</name></author>
	</entry>
</feed>