Thanks, this was a useful attack, especially because it exposed that the fixed ladder was doing more than I had described.
You are right about what killed M7. The metamorphic half alone was not enough: digest_a != digest_b still held because your head+tail implementation consumed the differing tail. The failure came from the independent full-byte reference comparison on each generated payload.
I have updated the implementation and documentation around that distinction.
I kept V1, V2, and the fixed ladder unchanged:
V1 -literal algorithm/object-format KATV2 -literal representation-fidelity KATfixed ladder -stable bounded conformance/falsification evidence
The ladder is now described more accurately as combining two checks:
- a metamorphic tail-sensitivity relation;
- a full-reference comparison for each generated payload.
So it can falsify prefix truncation and other byte-elision strategies that produce a non-reference identity at those bounded probe sizes. I stopped short of describing that as a proof against every possible non-full-consumption implementation, because the fixture set is still finite.
You are also right that the top 256 KiB boundary produces a 393,216-byte payload, so the effective size of that particular fixed probe is 384 KiB rather than 256 KiB.
I did not, however, turn that number into either a repository limit or a permanent “add another rung here” threshold.
Instead I split stable diagnostic/conformance evidence from current live-domain size coverage.
I added a deterministic dynamic live-domain sentinel. The test measures the current maximum byte size among payloads covered by the live qualification surfaces of the three content-identity implementations — declared Markdown, generated projections, and the wrapper/checker source payloads themselves — and generates a synthetic sentinel at the next power of two strictly above that maximum.
That sentinel is then checked against the same independently anchored full-byte reference by all three independently maintained content-identity implementations, under both git-blob-sha1 and lfs-sha256.
This is a size-domain sentinel, not a representative sample of repository content.
So the structure is now:
unbounded contract
-identity is over the complete, exact raw byte sequence
stable evidence
-V1 / V2 / fixed 1-8-64-256 KiB ladder
current-domain size applicability evidence
-dynamically sized sentinel beyond the current live qualified-payload maximum
This means I did not add:
manifest path <= 393,216as an admissibility rule;- a repository/runtime content-size ceiling;
- a manual rule saying that crossing 384 KiB earns another fixed rung.
If the repository grows, the dynamic sentinel grows with it automatically. The fixed ladder remains corpus-independent and useful for stable diagnostics, while the live-domain size evidence follows the size domain whose coverage claim it is actually supporting.
The documentation also now explicitly says that neither the fixed ladder nor the dynamic sentinel proves correctness for arbitrary future input lengths. The contract is unbounded; the evidence is finite and scoped.
So I ended up taking a third route relative to your final question:
do not constrain the repository to the finite falsifier, and do not rely on remembering to extend the ladder when the corpus grows. Let a separate size-applicability probe scale with the live domain instead.
Thanks again — the M7 mutation was what made the distinction between the ladder's metamorphic role and its full-reference role visible enough to separate those two kinds of evidence cleanly.