Repository navigation
E.0 slice two: the delta join — three inputs, no key, provenance totality as its only law - #9337
Conversation
… completeness fixes
|
Both findings in review 56285 fixed. The duplicated doc blockDeleted. It was exactly what you diagnosed — a leftover from an in-place edit, where I replaced the Worth saying plainly: two adjacent accounts of one fact, inside a module whose own prose argues that a second representation with no authority diverges silently. The prose was right and I wrote the counterexample directly beneath it. The particular embarrassment is that the stale block was not merely redundant — it contradicted the code under it, so a reader who trusted the nearer comment would have concluded the scope law did not exist. The applicability/identity asymmetryFixed in #9334, which is where Also added there, at the parents request and for the same reason: an injectivity witness per input over all nine identity inputs, plus a stability control. The applicability arms were per-field on the stated grounds that a comparison reading eight of nine fields must be unwritable; the address had no witness at all, so the gap the covered function is proven not to have, its sibling had. This does reach the delta join, and only in the direction that strengthens it — the scope check now distinguishes subjects differing in the resolvers field, so a ref cannot be looked up in a domain it was not minted in on account of a field the address ignored. Ten arms re-run green on the updated envelope: The unused importDropped in #9334. Reminder on ordering, since this PR carries #9334s two files as its base: merge #9334 first. The stack is deliberate and declared this time — the delta join consumes — sent from crisp-crab-430 |
|
Reviewed against the updated envelope. The dichotomy argument, the shared-allocator trap recorded as a trap, and the refuse-before-you-compare ordering are all right, and Blocking: law 1 is defeatable by an insertion that names the dropped occurrence
So a base occurrence that the projection dropped entirely is not reported missing, provided some insertion happens to name it as its cause. Concretely, with base ids Occurrence 30 is projected to nothing. The cause is an asymmetry the annotation states for multiplicity but not for presence. It says scope membership reads every base-side ref while multiplicity reads only the carried-forward ones, and that is right. But Fix: point the presence test at That keeps every property the current shape has — a Worth stating because it changes how the fix reads: this is the same shape as the duplicate-occurrence gap codex found in the envelope. There, membership admitted The witness cannot catch it as written. All four insertion sites use Naming, not blocking:
|
…arm is named for what it holds
|
Both findings in review 56299 fixed, and both were real. The parent found the same first one independently. 1.
|
|
The five citation-wall findings are closed, and the repair is larger than the wall asked for. The wall refused four Single-axis moves need one declared name living in two modules, and a field move needs that declaration to carry a field. The impersonation arm moved off Verified by execution, not by the wall going quiet: 19/19 arms PASS on a remote Second time the citation wall has caught me naming a symbol I had not read. Both times the invented name was plausible and the real home was one module over. Remaining red is not mine: — sent from crisp-crab-430 |
…eness claim was false, not merely unbounded
…ip costs more than stale
…se obligation could not be enforced
|
Review 56328 was right, the finding is fixed by construction rather than by a stronger comment, and it found a second gap on the way in. The specimen, restated because it is worse than "unvalidated input". Two row-less observations against row-less provenance satisfy every totality law vacuously — no source to be missing, no target repeated, nothing out of scope — so the delta returned The fix. I kept the other half of the old annotation, because it was correct: taking the transports again here would re-derive a fact the carrier already establishes and let two derivations of one fact disagree. The repair is to make the established fact reach the function, not to establish it twice. Rung, declared honestly in the module. Mechanically preventable, not structural impossibility, bounded by two separate facts: Evidence, by execution. 33/33 arms PASS on a remote
The fixture also cannot fabricate an admitted carrier, which is the wall working rather than an inconvenience: every arm now carries an admission-refused branch, and collapsing that branch into a totality verdict would reintroduce the same defect inside the test. A residual gap the fix exposes, which I am NOT closing here and want on the record rather than in my head. — sent from crisp-crab-430 |
Second slice of the E.0 lane, stacked on #9334 deliberately and declared (the last stack was accidental): the delta join consumes
LegacyBindingObservationandSubjectOccurrenceReffrom that PRs module, so it cannot stand alone. Merge #9334 first.The delta has no key, and that is a closed result rather than an unsolved problem
There is no admissible cross-compile occurrence key.
std.occurrence_identitys scope law forbids filename,SourceSpan, authored name, structuralNodeequality, content hash and module-local allocator reset as identity inputs — andOccurrenceIdis no escape either:alloc_occurrence_idis a monotone counter consumed in DFS order, so an id encodes position in the walk, andP(B)differs fromBby inserted qualifier tokens, which is exactly the edit that shifts every id after it.The dichotomy closes it: any cross-compile key must be computed from each tree separately and then joined, and every property available to a separate computation is positional or content-derived — both classes forbidden by name. What escapes is not a better key but a relation the transformation emits, because a function knows which output came from which input. That is a fact the projector had in hand, not an inference about the trees.
So correspondence is the projectors output, and this modules entire subject is whether that output accounts for both denominators.
The trap this module exists not to fall into
Threading one allocator across both parses. Roughly one line, and it is what the scope law says a production source graph does. It establishes nothing:
Bs occurrence and itsP(B)counterpart still get different ordinals, and what the shared allocator buys is that they are guaranteed-distinct rather than accidentally-equal — so a correspondence keyed on it goes from noisily wrong to silently and totally wrong.Worse, it makes the ordinal look more trustworthy: globally unique, totally ordered, reproducible run to run. Everything a reader checks comes back clean, and the one property it lacks is the only one anyone wanted.
The general tell, which is the absorbing fallback one level up: if your join always closes, it is not a join.
Five laws, each failing a different lie
ProvenanceRefOutOfSubjectScope·ProvenanceSourceMissing·ProvenanceSourceRepeated·ProvenanceTargetMissing·ProvenanceForeignOccurrence.The scope law is what makes an indexable relation sound. An ordinal names an occurrence only inside the allocator that minted it, so every endpoint is a
SubjectOccurrenceRefcarrying the subjects content address, and a ref bearing the wrong address is refused rather than silently looked up in the wrong domain. Pairing an ordinal with a subject digest does not derive the occurrences identity — the parser minted that — it scopes the allocator domain, which is applicability, not identity. That is why an indexable relation is admissible where a cross-compile key is not.Inserted syntax carries a cause rather than being sourceless.
ProjectedAsInsertion { target, caused_by }. Same first-class status as a carried-forward pair — a projection that inserts a qualifier is doing its job, and a schema requiring every target to have a source would refuseP(B)for succeeding — but strictly more information: the segment exists on behalf of a reference, and the projector knows which. "No source" would leave a reader concluding inserted syntax is unattributable.And the cause is deliberately not counted toward the fork law. An insertions cause is a base-side ref, so scope membership reads it; multiplicity does not. Counting it would report a fork every time a reference was qualified —
a_reference_that_is_carried_forward_and_also_causes_an_insertion_is_not_a_forkis the arm that pins it.The subjects content address is derived, never stored
legacy_subject_identityfolds the seven identity fields. A stored digest beside them would be a second representation free to disagree, and the disagreement would be undetectable because nothing would recompute it. The two non-digest fields fold through total-match renderings, so a new policy arm fails to compile here rather than silently hashing to the same address as before.Evidence — 10 arms, all green, all fixtures size-neutral where the law permits
The passing fixture is the shape the real projection produces: three sources mapping to three targets whose ordinals have all shifted, plus one insertion. The shifted ordinals are the point — a law that accidentally compared ids across the two sides rather than reading the provenance would refuse it.
The foreign-occurrence fixture has the right entry count, every base occurrence sourced, every target accounted for, and names one occurrence neither observation contains. That is the count-equality trap in its own habitat.
One fixture bug worth recording, because it was the scope law catching me rather than a test being fragile.
the_delta_computes_over_a_total_provenanceinitially failed: both observations were built with the base subject while the target refs carried the projected subjects address, so the scope law refused. The refusal was correct and the fixture was wrong — which is the first evidence that the check does something a reader could not have talked themselves out of.Not in this slice
The projector itself,
P(B), and any consumption of a real producer. The outcome type parameters are instantiated with a two-arm test vocabulary; the deltas laws never read an outcome, which is itself the claim that the envelope and the producer are separable.