FAILURE MAP
← Case archive

FA-91436 / Digital signal filters / Open access

CIC combs ignore the differential delay · case 01

With M = 2 the comb subtracts the previous low-rate sample instead of the one two samples back.

Verified by executionVariant 1 · 7 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

Each comb delay line is allocated with one slot regardless of M.

VERIFIED REPAIR

Allocate M slots per comb so it subtracts v[k-M].

Unsuccessful approach: The attempted repair allocates M - 1 slots, which is off by one for every M.

Case contract

Input [N, R, M, samples]: N integrator stages at the input rate, keep the integrator output at indices R-1, 2R-1, ... (whole blocks only), then N comb stages y = v - v[k-M] at the low rate with zero initial state; divide by the gain (R M)^N and return exact fraction strings.

Why this case matters

CIC decimators front most digital down-converters; decimation phase, delay or gain slips distort the passband level.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
N = 1
observations = []
def solve(x):
    N, R, M, xs = x
    ints = [0] * N
    dec = []
    for i, v in enumerate(xs):
        acc = v
        for k in range(N):
            ints[k] += acc
            acc = ints[k]
        if i % R == R - 1:
            dec.append(acc)
    combs = [[0] for _ in range(N)]
    out = []
    for v in dec:
        for k in range(N):
            d = combs[k]
            prev = d.pop(0)
            d.append(v)
            v = v - prev
        out.append(str(Fraction(v, (R * M) ** N)))
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: two stages R=3 M=2', [2, 3, 2, [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], ['1/12', '1/6', '1/12', '0']], ['regression: random cic 0', [1, 3, 2, [4, 1, 1, 5, -2, 4, -1, 4, 5]], ['1', '13/6', '5/2']], ['regression: random cic 3', [3, 2, 2, [3, -3, 3, 5, -2, 3, 2, 4, 2, 2, 0]], ['3/32', '13/32', '57/64', '23/16', '63/32']], ['control: one stage R=2 M=1', [1, 2, 1, [1, 2, 3, 4, 5, 6]], ['3/2', '7/2', '11/2']], ['control: partial final block', [1, 3, 1, [3, 3, 3, 3, 3]], ['3']], ['control: step three stages', [3, 2, 1, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]], ['1/2', '1', '1', '1', '1']], ['control: random cic 1', [1, 4, 1, [2, -1, 3, 4, 5, -3, 5, -2, 3, -1, 2, -3, -3, 0, 4, 0, 2, 4, 1]], ['2', '5/4', '1/4', '1/4']]], [['regression: random cic 4', [1, 2, 2, [-3, 1, 4, 2, 4, 2, -3, 5]], ['-1/2', '1', '3', '2']], ['regression: random cic 5', [3, 2, 2, [-2, 2, -3, 2, -2, -3, 3, -3, -1]], ['-1/16', '-15/64', '-27/64', '-9/16']], ['regression: random cic 3', [3, 2, 2, [3, -3, 3, 5, -2, 3, 2, 4, 2, 2, 0]], ['3/32', '13/32', '57/64', '23/16', '63/32']], ['control: random cic 2', [1, 3, 1, [2, 2, 3, -2, 1, -2, 3, 1, -3]], ['7/3', '-1', '1/3']], ['control: random cic 6', [1, 4, 1, [-2, 5, 3, -2, 5, -2, 1, 3, 0, -2, -3, 4, -2, -1, 5, 4, 2, 0, -2, 1]], ['1', '7/4', '-1/4', '3/2', '1/4']], ['control: random cic 7', [2, 4, 1, [3, -2, 2, -1, 3, -1, 0, -1, 0, -2, -3, -2]], ['9/16', '7/16', '-9/8']], ['control: random cic 8', [3, 3, 1, [-1, 1, 5, 5, 3, 3, 0, -2, 2, 2, 1, 1, 1, -3]], ['2/27', '80/27', '55/27', '7/9']]], [['regression: random cic 10', [3, 2, 2, [-2, 3, -2, 1, 1, 0, 0]], ['-3/64', '-7/64', '1/64']], ['regression: random cic 11', [3, 2, 2, [1, -1, 2, 1, -2, 3]], ['1/32', '11/64', '23/64']], ['regression: random cic 5', [3, 2, 2, [-2, 2, -3, 2, -2, -3, 3, -3, -1]], ['-1/16', '-15/64', '-27/64', '-9/16']], ['control: random cic 14', [1, 2, 1, [2, 4, 5, 0]], ['3', '5/2']], ['control: random cic 17', [3, 4, 1, [2, 0, 0, -1, -3, 1, 2, 0]], ['19/64', '-9/32']], ['control: random cic 19', [2, 4, 1, [4, 4, 2, 0, -3, 0, -1, 5, 0, 3, -1, 1]], ['2', '-1/16', '21/16']], ['control: random cic 20', [3, 3, 1, [4, -1, -3, -3, 2, 4, -3]], ['2/3', '-23/27']]], [['regression: random cic 13', [2, 3, 2, [0, 3, 3, -2, 4, -2, 2, 4, 1, 1]], ['1/4', '3/4', '7/6']], ['regression: random cic 15', [3, 2, 2, [5, 5, 2, 1]], ['5/16', '87/64']], ['regression: random cic 10', [3, 2, 2, [-2, 3, -2, 1, 1, 0, 0]], ['-3/64', '-7/64', '1/64']], ['control: random cic 25', [2, 2, 2, [-1, 2, 5, -2, -1]], ['0', '5/8']], ['control: random cic 26', [2, 2, 1, [1, 5, -3, 3, -2, 1, -1, 4, 1, 2]], ['7/4', '1/2', '0', '3/4', '2']], ['control: random cic 27', [2, 4, 1, [-1, 3, 5, 4, -3, 3, 3, 2, 2]], ['19/16', '15/8']], ['control: random cic 28', [1, 3, 1, [-3, -2, 1, 3, 3, 3, 0, 3, 5, 3, 5, 0, -2, -2, 5]], ['-4/3', '3', '8/3', '8/3', '1/3']]], [['regression: random cic 18', [1, 3, 2, [5, 2, -1, -2, 3, -2]], ['1', '5/6']], ['regression: random cic 21', [1, 4, 2, [3, -2, 2, -3, 5, 1, -2, -1, -3, -1, 3, 1, -3, 1, 1, -2, -1, 4, -2, 4, 4]], ['0', '3/8', '3/8', '-3/8', '1/4']], ['regression: random cic 12', [3, 3, 2, [3, 5, 4, 3, -2, 5, -3, 0, 5, 5, 4, -3, -1, -1]], ['37/216', '65/72', '193/108', '107/54']], ['control: random cic 29', [1, 3, 1, [0, 1, -3, 3, 5, 1, 0, 1, 1, 0, 0, -1, 4, 2, 5, 3]], ['-2/3', '3', '2/3', '-1/3', '11/3']], ['control: random cic 33', [2, 3, 1, [2, 2, 3, -1, 1, -1, -3, 2, -2, -1, 2, 4, 1, 4, 2, 1]], ['13/9', '2/3', '-8/9', '1/3', '23/9']], ['control: random cic 34', [2, 4, 1, [2, 5, 2, -1, -3, -2, 1, 5, 3, -2, 5, -1]], ['13/8', '-5/16', '15/8']], ['control: random cic 36', [2, 4, 1, [-2, -3, 1, -2, 0, 5, 4, 0]], ['-17/16', '1']]]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression: two stages R=3 M=2['1/12', '0', '0', '0']['1/12', '1/6', '1/12', '0']Failed
regression: random cic 0['1', '7/6', '4/3']['1', '13/6', '5/2']Failed
regression: random cic 3['3/32', '1/8', '15/64', '17/64', '11/32']['3/32', '13/32', '57/64', '23/16', '63/32']Failed
control: one stage R=2 M=1['3/2', '7/2', '11/2']['3/2', '7/2', '11/2']Passed
control: partial final block['3']['3']Passed
control: step three stages['1/2', '1', '1', '1', '1']['1/2', '1', '1', '1', '1']Passed
control: random cic 1['2', '5/4', '1/4', '1/4']['2', '5/4', '1/4', '1/4']Passed

SHA-256 / 73305634220ffa338f1e022e25806e6c4eef9e71bd18ce2d10890a61bf63ffc1

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
N = 1
observations = []
def solve(x):
    N, R, M, xs = x
    ints = [0] * N
    dec = []
    for i, v in enumerate(xs):
        acc = v
        for k in range(N):
            ints[k] += acc
            acc = ints[k]
        if i % R == R - 1:
            dec.append(acc)
    combs = [[0] * max(M - 1, 1) for _ in range(N)]
    out = []
    for v in dec:
        for k in range(N):
            d = combs[k]
            prev = d.pop(0)
            d.append(v)
            v = v - prev
        out.append(str(Fraction(v, (R * M) ** N)))
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: two stages R=3 M=2', [2, 3, 2, [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], ['1/12', '1/6', '1/12', '0']], ['regression: random cic 0', [1, 3, 2, [4, 1, 1, 5, -2, 4, -1, 4, 5]], ['1', '13/6', '5/2']], ['regression: random cic 3', [3, 2, 2, [3, -3, 3, 5, -2, 3, 2, 4, 2, 2, 0]], ['3/32', '13/32', '57/64', '23/16', '63/32']], ['control: one stage R=2 M=1', [1, 2, 1, [1, 2, 3, 4, 5, 6]], ['3/2', '7/2', '11/2']], ['control: partial final block', [1, 3, 1, [3, 3, 3, 3, 3]], ['3']], ['control: step three stages', [3, 2, 1, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]], ['1/2', '1', '1', '1', '1']], ['control: random cic 1', [1, 4, 1, [2, -1, 3, 4, 5, -3, 5, -2, 3, -1, 2, -3, -3, 0, 4, 0, 2, 4, 1]], ['2', '5/4', '1/4', '1/4']]], [['regression: random cic 4', [1, 2, 2, [-3, 1, 4, 2, 4, 2, -3, 5]], ['-1/2', '1', '3', '2']], ['regression: random cic 5', [3, 2, 2, [-2, 2, -3, 2, -2, -3, 3, -3, -1]], ['-1/16', '-15/64', '-27/64', '-9/16']], ['regression: random cic 3', [3, 2, 2, [3, -3, 3, 5, -2, 3, 2, 4, 2, 2, 0]], ['3/32', '13/32', '57/64', '23/16', '63/32']], ['control: random cic 2', [1, 3, 1, [2, 2, 3, -2, 1, -2, 3, 1, -3]], ['7/3', '-1', '1/3']], ['control: random cic 6', [1, 4, 1, [-2, 5, 3, -2, 5, -2, 1, 3, 0, -2, -3, 4, -2, -1, 5, 4, 2, 0, -2, 1]], ['1', '7/4', '-1/4', '3/2', '1/4']], ['control: random cic 7', [2, 4, 1, [3, -2, 2, -1, 3, -1, 0, -1, 0, -2, -3, -2]], ['9/16', '7/16', '-9/8']], ['control: random cic 8', [3, 3, 1, [-1, 1, 5, 5, 3, 3, 0, -2, 2, 2, 1, 1, 1, -3]], ['2/27', '80/27', '55/27', '7/9']]], [['regression: random cic 10', [3, 2, 2, [-2, 3, -2, 1, 1, 0, 0]], ['-3/64', '-7/64', '1/64']], ['regression: random cic 11', [3, 2, 2, [1, -1, 2, 1, -2, 3]], ['1/32', '11/64', '23/64']], ['regression: random cic 5', [3, 2, 2, [-2, 2, -3, 2, -2, -3, 3, -3, -1]], ['-1/16', '-15/64', '-27/64', '-9/16']], ['control: random cic 14', [1, 2, 1, [2, 4, 5, 0]], ['3', '5/2']], ['control: random cic 17', [3, 4, 1, [2, 0, 0, -1, -3, 1, 2, 0]], ['19/64', '-9/32']], ['control: random cic 19', [2, 4, 1, [4, 4, 2, 0, -3, 0, -1, 5, 0, 3, -1, 1]], ['2', '-1/16', '21/16']], ['control: random cic 20', [3, 3, 1, [4, -1, -3, -3, 2, 4, -3]], ['2/3', '-23/27']]], [['regression: random cic 13', [2, 3, 2, [0, 3, 3, -2, 4, -2, 2, 4, 1, 1]], ['1/4', '3/4', '7/6']], ['regression: random cic 15', [3, 2, 2, [5, 5, 2, 1]], ['5/16', '87/64']], ['regression: random cic 10', [3, 2, 2, [-2, 3, -2, 1, 1, 0, 0]], ['-3/64', '-7/64', '1/64']], ['control: random cic 25', [2, 2, 2, [-1, 2, 5, -2, -1]], ['0', '5/8']], ['control: random cic 26', [2, 2, 1, [1, 5, -3, 3, -2, 1, -1, 4, 1, 2]], ['7/4', '1/2', '0', '3/4', '2']], ['control: random cic 27', [2, 4, 1, [-1, 3, 5, 4, -3, 3, 3, 2, 2]], ['19/16', '15/8']], ['control: random cic 28', [1, 3, 1, [-3, -2, 1, 3, 3, 3, 0, 3, 5, 3, 5, 0, -2, -2, 5]], ['-4/3', '3', '8/3', '8/3', '1/3']]], [['regression: random cic 18', [1, 3, 2, [5, 2, -1, -2, 3, -2]], ['1', '5/6']], ['regression: random cic 21', [1, 4, 2, [3, -2, 2, -3, 5, 1, -2, -1, -3, -1, 3, 1, -3, 1, 1, -2, -1, 4, -2, 4, 4]], ['0', '3/8', '3/8', '-3/8', '1/4']], ['regression: random cic 12', [3, 3, 2, [3, 5, 4, 3, -2, 5, -3, 0, 5, 5, 4, -3, -1, -1]], ['37/216', '65/72', '193/108', '107/54']], ['control: random cic 29', [1, 3, 1, [0, 1, -3, 3, 5, 1, 0, 1, 1, 0, 0, -1, 4, 2, 5, 3]], ['-2/3', '3', '2/3', '-1/3', '11/3']], ['control: random cic 33', [2, 3, 1, [2, 2, 3, -1, 1, -1, -3, 2, -2, -1, 2, 4, 1, 4, 2, 1]], ['13/9', '2/3', '-8/9', '1/3', '23/9']], ['control: random cic 34', [2, 4, 1, [2, 5, 2, -1, -3, -2, 1, 5, 3, -2, 5, -1]], ['13/8', '-5/16', '15/8']], ['control: random cic 36', [2, 4, 1, [-2, -3, 1, -2, 0, 5, 4, 0]], ['-17/16', '1']]]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression: two stages R=3 M=2['1/12', '0', '0', '0']['1/12', '1/6', '1/12', '0']Failed
regression: random cic 0['1', '7/6', '4/3']['1', '13/6', '5/2']Failed
regression: random cic 3['3/32', '1/8', '15/64', '17/64', '11/32']['3/32', '13/32', '57/64', '23/16', '63/32']Failed
control: one stage R=2 M=1['3/2', '7/2', '11/2']['3/2', '7/2', '11/2']Passed
control: partial final block['3']['3']Passed
control: step three stages['1/2', '1', '1', '1', '1']['1/2', '1', '1', '1', '1']Passed
control: random cic 1['2', '5/4', '1/4', '1/4']['2', '5/4', '1/4', '1/4']Passed

SHA-256 / 1bdf3397f3cbd1b476c5889372f3bc6bb2d5575c213cf40836de40836cda28d3

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json
from fractions import Fraction
N = 1
observations = []
def solve(x):
    N, R, M, xs = x
    ints = [0] * N
    dec = []
    for i, v in enumerate(xs):
        acc = v
        for k in range(N):
            ints[k] += acc
            acc = ints[k]
        if i % R == R - 1:
            dec.append(acc)
    combs = [[0] * M for _ in range(N)]
    out = []
    for v in dec:
        for k in range(N):
            d = combs[k]
            prev = d.pop(0)
            d.append(v)
            v = v - prev
        out.append(str(Fraction(v, (R * M) ** N)))
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['regression: two stages R=3 M=2', [2, 3, 2, [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], ['1/12', '1/6', '1/12', '0']], ['regression: random cic 0', [1, 3, 2, [4, 1, 1, 5, -2, 4, -1, 4, 5]], ['1', '13/6', '5/2']], ['regression: random cic 3', [3, 2, 2, [3, -3, 3, 5, -2, 3, 2, 4, 2, 2, 0]], ['3/32', '13/32', '57/64', '23/16', '63/32']], ['control: one stage R=2 M=1', [1, 2, 1, [1, 2, 3, 4, 5, 6]], ['3/2', '7/2', '11/2']], ['control: partial final block', [1, 3, 1, [3, 3, 3, 3, 3]], ['3']], ['control: step three stages', [3, 2, 1, [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]], ['1/2', '1', '1', '1', '1']], ['control: random cic 1', [1, 4, 1, [2, -1, 3, 4, 5, -3, 5, -2, 3, -1, 2, -3, -3, 0, 4, 0, 2, 4, 1]], ['2', '5/4', '1/4', '1/4']]], [['regression: random cic 4', [1, 2, 2, [-3, 1, 4, 2, 4, 2, -3, 5]], ['-1/2', '1', '3', '2']], ['regression: random cic 5', [3, 2, 2, [-2, 2, -3, 2, -2, -3, 3, -3, -1]], ['-1/16', '-15/64', '-27/64', '-9/16']], ['regression: random cic 3', [3, 2, 2, [3, -3, 3, 5, -2, 3, 2, 4, 2, 2, 0]], ['3/32', '13/32', '57/64', '23/16', '63/32']], ['control: random cic 2', [1, 3, 1, [2, 2, 3, -2, 1, -2, 3, 1, -3]], ['7/3', '-1', '1/3']], ['control: random cic 6', [1, 4, 1, [-2, 5, 3, -2, 5, -2, 1, 3, 0, -2, -3, 4, -2, -1, 5, 4, 2, 0, -2, 1]], ['1', '7/4', '-1/4', '3/2', '1/4']], ['control: random cic 7', [2, 4, 1, [3, -2, 2, -1, 3, -1, 0, -1, 0, -2, -3, -2]], ['9/16', '7/16', '-9/8']], ['control: random cic 8', [3, 3, 1, [-1, 1, 5, 5, 3, 3, 0, -2, 2, 2, 1, 1, 1, -3]], ['2/27', '80/27', '55/27', '7/9']]], [['regression: random cic 10', [3, 2, 2, [-2, 3, -2, 1, 1, 0, 0]], ['-3/64', '-7/64', '1/64']], ['regression: random cic 11', [3, 2, 2, [1, -1, 2, 1, -2, 3]], ['1/32', '11/64', '23/64']], ['regression: random cic 5', [3, 2, 2, [-2, 2, -3, 2, -2, -3, 3, -3, -1]], ['-1/16', '-15/64', '-27/64', '-9/16']], ['control: random cic 14', [1, 2, 1, [2, 4, 5, 0]], ['3', '5/2']], ['control: random cic 17', [3, 4, 1, [2, 0, 0, -1, -3, 1, 2, 0]], ['19/64', '-9/32']], ['control: random cic 19', [2, 4, 1, [4, 4, 2, 0, -3, 0, -1, 5, 0, 3, -1, 1]], ['2', '-1/16', '21/16']], ['control: random cic 20', [3, 3, 1, [4, -1, -3, -3, 2, 4, -3]], ['2/3', '-23/27']]], [['regression: random cic 13', [2, 3, 2, [0, 3, 3, -2, 4, -2, 2, 4, 1, 1]], ['1/4', '3/4', '7/6']], ['regression: random cic 15', [3, 2, 2, [5, 5, 2, 1]], ['5/16', '87/64']], ['regression: random cic 10', [3, 2, 2, [-2, 3, -2, 1, 1, 0, 0]], ['-3/64', '-7/64', '1/64']], ['control: random cic 25', [2, 2, 2, [-1, 2, 5, -2, -1]], ['0', '5/8']], ['control: random cic 26', [2, 2, 1, [1, 5, -3, 3, -2, 1, -1, 4, 1, 2]], ['7/4', '1/2', '0', '3/4', '2']], ['control: random cic 27', [2, 4, 1, [-1, 3, 5, 4, -3, 3, 3, 2, 2]], ['19/16', '15/8']], ['control: random cic 28', [1, 3, 1, [-3, -2, 1, 3, 3, 3, 0, 3, 5, 3, 5, 0, -2, -2, 5]], ['-4/3', '3', '8/3', '8/3', '1/3']]], [['regression: random cic 18', [1, 3, 2, [5, 2, -1, -2, 3, -2]], ['1', '5/6']], ['regression: random cic 21', [1, 4, 2, [3, -2, 2, -3, 5, 1, -2, -1, -3, -1, 3, 1, -3, 1, 1, -2, -1, 4, -2, 4, 4]], ['0', '3/8', '3/8', '-3/8', '1/4']], ['regression: random cic 12', [3, 3, 2, [3, 5, 4, 3, -2, 5, -3, 0, 5, 5, 4, -3, -1, -1]], ['37/216', '65/72', '193/108', '107/54']], ['control: random cic 29', [1, 3, 1, [0, 1, -3, 3, 5, 1, 0, 1, 1, 0, 0, -1, 4, 2, 5, 3]], ['-2/3', '3', '2/3', '-1/3', '11/3']], ['control: random cic 33', [2, 3, 1, [2, 2, 3, -1, 1, -1, -3, 2, -2, -1, 2, 4, 1, 4, 2, 1]], ['13/9', '2/3', '-8/9', '1/3', '23/9']], ['control: random cic 34', [2, 4, 1, [2, 5, 2, -1, -3, -2, 1, 5, 3, -2, 5, -1]], ['13/8', '-5/16', '15/8']], ['control: random cic 36', [2, 4, 1, [-2, -3, 1, -2, 0, 5, 4, 0]], ['-17/16', '1']]]]
for label, args, expected in fixtures[N-1]:
    check(label, solve(args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
regression: two stages R=3 M=2['1/12', '1/6', '1/12', '0']['1/12', '1/6', '1/12', '0']Passed
regression: random cic 0['1', '13/6', '5/2']['1', '13/6', '5/2']Passed
regression: random cic 3['3/32', '13/32', '57/64', '23/16', '63/32']['3/32', '13/32', '57/64', '23/16', '63/32']Passed
control: one stage R=2 M=1['3/2', '7/2', '11/2']['3/2', '7/2', '11/2']Passed
control: partial final block['3']['3']Passed
control: step three stages['1/2', '1', '1', '1', '1']['1/2', '1', '1', '1', '1']Passed
control: random cic 1['2', '5/4', '1/4', '1/4']['2', '5/4', '1/4', '1/4']Passed

SHA-256 / d9c3a40ebfcb71be96fa037f1ac456e5ea09f2be8a0c5251f4fbb07097e9fd2d

Verification & scope

A deterministic bounded teaching model with a stipulated toy contract; exact rational arithmetic or fixed-decimal rounding keeps outputs strict JSON. It is not a production DSP library and claims no standards conformance. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.

Observations recorded using Python 3.12.14 at 2026-09-29T14:51:36.096797+00:00.

Case digest / 8fccf74b1da6c8f1077d045c8e893bc7e83eb7aeca4864a65ed1e3252e601fd3