Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
4354293
Genericity is declared, not inferred from a failed lookup
Sep 7, 2026
f5a1e53
Attach the roster annotation at module-item grain
Sep 7, 2026
8e3835f
Narrow the change to the roster: declared_type stays authored
Sep 7, 2026
8da9b48
Land the regenerated stage0 mirrors and the failure-mode row with the…
Sep 7, 2026
ec6783f
Refinement inhabitance: widening admits, introduction declines, from …
Sep 7, 2026
97cdc10
Correct the refinement-decline premise: an explicit cast IS visible a…
Sep 7, 2026
2bc8190
Record why the sibling arm declines: the brand wall already exists
Sep 7, 2026
b4a12f8
Merge remote-tracking branch 'origin/main' into session/smart-ant-528
Sep 7, 2026
e2674df
chore: regenerate drifted generated artifacts (ci auto-heal)
Sep 7, 2026
9e6479a
Enrol six controls; correct two claims measurement refuted
Sep 7, 2026
77c4647
Merge remote-tracking branch 'origin/session/smart-ant-528' into sess…
Sep 7, 2026
4722b03
chore: regenerate drifted generated artifacts (ci auto-heal)
Sep 7, 2026
dd87b10
Keep tp_names in the roster; re-author the controls as fixture pairs
Sep 7, 2026
9ae9fcf
Merge remote-tracking branch 'origin/session/smart-ant-528' into sess…
Sep 7, 2026
ded6f36
The relation stops collapsing distinctions the rest of the file keeps
Sep 7, 2026
ec8a7bb
Merge remote-tracking branch 'origin/main' into session/smart-ant-528
Sep 7, 2026
64b2f73
Re-project the failure-mode row after the merge, and check by content
Sep 7, 2026
d9fa295
chore: regenerate drifted generated artifacts (ci auto-heal)
Sep 7, 2026
150c78c
No arm compares a closure population to a literal; no chain is compacted
Sep 7, 2026
9d6fe2f
Merge remote-tracking branch 'origin/session/smart-ant-528' into sess…
Sep 7, 2026
774a048
One principle, stated once: absence of identity is not repairable by …
Sep 7, 2026
3b563e7
Resolve chain identity through lookup_type_for; unavailable on any miss
Sep 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
module gunbc.recurring_failure_mode.lookup_miss_read_as_positive_classification

import std.types { NonEmptyStr }
import gunbc.recurring_failure_mode { RecurringFailureMode }

data lookup_miss_read_as_positive_classification: RecurringFailureMode = RecurringFailureMode {
identity: "lookup_miss_read_as_positive_classification" as NonEmptyStr,

receipts: [
"**a lookup miss is read as POSITIVE evidence of a property, against an environment that could not have answered** (a classifier decides `this thing IS an X` from the fact that a lookup for it returned nothing. The miss is evidence of nothing at all when the consulted authority does not carry the population the question ranges over -- and when it carries none of it, the classifier is not a heuristic that occasionally misfires, it is TOTAL: every subject reaching it is classified X, always, and the predicate's other disjuncts never run. ",

"WHY THIS IS ITS OWN CLASS. `absence_classifier_default_bucket` and `absent_reads_identically_to_never_looked` both concern absence read as a NEGATIVE -- an accepted bucket, a zero finding. This is the converse and it is worse: absence MINTS A POSITIVE TYPED CLAIM that then travels as a fact, so downstream consumers are not merely uninformed, they are misinformed with something that looks derived. It is also distinct from `absorbing_fallback`, whose arm widens the ANSWER to a superset while still answering the right question; here the question itself is answered backwards from a miss. ",

"SPECIMEN, gunbc 595870431b, at the DESIGN 4b floor (`values inhabit declared types`). `v1.compiler.env census_declaration_type_env` builds a declaration environment with `bindings`, `str_bindings`, `ancestry_str_bindings` and `intern_table` ALL EMPTY, seeded only with the declaration's type-parameter bindings, so `lookup_binding_by_name_local` in that environment can only ever find a type parameter. ",

"Two sites read a miss there as generic ownership: `v1.compiler.lookup declaration_unbound_leaf_names`, whose collected names were concatenated into the generic-name roster, and `v1.compiler.env declaration_substitution_basis`, whose second disjunct repeated the same test. So for EVERY census-borrowed declaration, EVERY unqualified non-kernel concrete type name in EVERY parameter was enrolled as one of that declaration's generic parameters and stamped `TypeVariable \{ id: <its own name> \}`. Unconditional on that route, not sporadic. ",

"THE HARM, and it is a floor hole rather than a lost refinement. `v1.compiler.infer direct_call_argument_inhabitance_diags` selects the substitution basis as the DECLARED side whenever it carries an unbound type variable, and `declared_type_inhabitance` reads that stamp as a generic formal and declines `InhabitanceUndecidable \{ UndecidableGenericFormal \}`. A value of any constructor reaching a `NonEmptyStr` or a `HostIdentity` position was therefore admitted in silence -- not because the pair was undecidable, but because the declared side's identity had been overwritten before the judgment ran. The neighbouring mismatch arms are gated on the same stamp and were suppressed with it. ",

"THE TELL THAT MAKES IT RECOGNISABLE ELSEWHERE, and the reason it survived review: the authority the guess was approximating was ALREADY CONSULTED ONE FIELD OVER. `borrowed_census_callable_candidate` computes `borrowed_generic_param_names` on its first line and classifies the RETURN type of the same declaration positively with it; the PARAMETER types, in the next field of the same record literal, went through the miss. One question with two answers inside a single record literal is a DESIGN section 3 fork, and the half that reads a miss is always the wrong half. ",

"RUNG FOUND AT: below the ladder -- silent wrongness, since an unrelated constructor was ACCEPTED at a declared position with no diagnostic in either direction. CEILING: 3 (structurally guaranteed) FOR THE CLAUSE-DERIVED POPULATION, AND MECHANICALLY PREVENTABLE (2) FOR AUTHORED PARAMETERS -- the two are stated separately because a bare ceiling 3 would send a reader past the exception. Generic ownership IS a declared fact: `parse_optional_type_params` mints one parameter per name in the angle-bracket clause whose name and type-expression name are both that name, and that encoding is the only carrier the CLAUSE has. But the classification is decided by a PREDICATE over that shape, not by the clause, and an authored shape can satisfy it: the `make_param_node` producer census found EIGHT structural producers that cannot mint `pname == type-expr name`, and FOUR authored-dependent sites that can -- an author writing `fn f(Vendor: Vendor)` produces a parameter the roster predicate cannot distinguish from a generic clause. The subject of this row is the CLASSIFICATION, not the clause, so the reported rung is the minimum across both populations. WHAT STANDS BETWEEN THIS AND 3 OUTRIGHT: the authored `pname == type-expr name` shape, which no clause-side encoding can exclude. ",

"REPAIR: consult the roster and delete the miss from both sites together, since they were one classification authority written twice. THE ROSTER PASSED IS A UNION AND THAT HALF IS NOT OPTIONAL: the declared `<T>` clause and the borrowed-parameter roster are two facts and neither subsumes the other -- the borrowed predicate is narrower on two axes, so passing it ALONE would reclassify a declared type param whose type expression is not a childless leaf as a concrete unresolved name, reintroducing the same misclassification through the opposite door. Deleting the absence disjunct is the repair; replacing the declared-clause predicate beside it was a second change and is not part of it. ",

"THE RESIDUE'S DISPOSITION IS AN UNEXERCISED BOUNDARY AND IS RECORDED AS ONE. The repair's author predicted that a leaf which is neither on the roster nor resolvable would be reported `UndecidableFormalUnresolved`, a different fact from genericity. THE CORPUS DID NOT DEMONSTRATE IT: measured across the repair, that population moved by ZERO -- 6 sites before, 6 after, not one of them new. So the boundary is stated here as ASSERTED AND UNEXERCISED rather than as behaviour, because a row is the durable artifact and a disposition nothing executed is exactly the specification-without-execution DESIGN section 5 names. It becomes a fact when a specimen lands on it, not before. ",

"NEXT-RUNG TRIGGER for that residue: an owner-generic carrier on a synthesized or member declaration that borrows an enclosing owner's generic without restating it, which its own roster cannot name.)",
],

evidence: [],
}
2 changes: 2 additions & 0 deletions dag/gunbc/recurring_failure_mode/roster.dag
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ import gunbc.recurring_failure_mode.permissiveness_promoted_into_a_higher_safety
import gunbc.recurring_failure_mode.evaluation_model_cleanup_undeclared { evaluation_model_cleanup_undeclared }
import gunbc.recurring_failure_mode.docs_markdown_projections_have_no_completing_actuator { docs_markdown_projections_have_no_completing_actuator }
import gunbc.recurring_failure_mode.type_name_field_carries_rendered_value { type_name_field_carries_rendered_value }
import gunbc.recurring_failure_mode.lookup_miss_read_as_positive_classification { lookup_miss_read_as_positive_classification }
import gunbc.recurring_failure_mode.capability_arrives_outside_the_converged_path { capability_arrives_outside_the_converged_path }

data recurring_failure_mode_roster: List<RecurringFailureMode> = [
Expand Down Expand Up @@ -349,5 +350,6 @@ data recurring_failure_mode_roster: List<RecurringFailureMode> = [
evaluation_model_cleanup_undeclared,
docs_markdown_projections_have_no_completing_actuator,
type_name_field_carries_rendered_value,
lookup_miss_read_as_positive_classification,
capability_arrives_outside_the_converged_path,
]
Loading
Loading