pub struct AlsoEffect {
pub krate: &'static [&'static str],
pub on: AlsoOn,
pub effects: &'static [&'static str],
pub fs_kind: &'static [&'static str],
pub row: &'static str,
pub evidence: &'static str,
}Expand description
SOUNDNESS R1612 — THE EFFECTS A CALL PERFORMS BESIDE THE ONE classify RETURNS.
classify answers ONE effect per path, and that one is the call’s PRIMARY: the effect whose locator (path, host,
program, SQL) is the call’s own argument or receiver, which is why every surface rule (str_arg capture, the masking
guard, fs_kind) is keyed on it. Some library entry points do a second thing whose locator the caller never sees —
next_backoff draws entropy AND reads the clock, try_associate reads PATH AND stats the directories on it. Those
are declared HERE, one row per rule, and charged beside the primary by also_effects, never instead of it.
Why a table and not a set-valued classify. The set is not uniform: the primary carries the call’s locator and the
rest do not. A flat set would invite a charging site to publish the call’s literal as the locator of every effect in it
(a fabricated surface), and the one thing every site must do for a secondary is the OPPOSITE — a secondary Fs/Net/
Exec/Db has a locator nobody can see, so it is marked incomplete (also_hides_locator) and a benign sibling
literal cannot certify it. And the second-effect hook this replaces (reads_trust_store, R338) was asked by ONE of the
four sites that charge a classify answer: candor-scan’s main path. The use-alias arm, the R1607 trait-dispatch
arm and the deep engine (src/lib.rs) never asked it, so the trust-store Fs was charged or silent by spelling and by
engine. One table, one function, every site — the shape masks_locator already has for the same reason (R806/R808).
The bar for a row is the family’s for any charge: an EXECUTED observation of the second effect inside the call, a
pure neighbour of the same type that is not charged, and deny <E2> flipping 0→1 on a consumer. A row whose second
effect is platform- or configuration-conditional says so in evidence; it is charged on the configuration where it was
observed (the R338 trade: the default build on the platform the crate’s users run), and the condition is the row’s
stated over-charge. Do NOT seed this table from covered.tsv’s self_scan_effects: that oracle’s extra effects are a
union over every branch (1,306 of 2,020 covered rows carry one, 792 of them Clock and 468 Log, mostly timeouts and
debug events inside a request), and adopting them is a priced decision, not a transcription (R1613).
Fields§
§krate: &'static [&'static str]Crate names (post -→_) this row applies to.
on: AlsoOnWhich paths in those crates.
effects: &'static [&'static str]The effects charged beside the primary. An entry equal to the primary is dropped by also_effects.
fs_kind: &'static [&'static str]The §2 fs direction of an Fs in effects — &["read"] only where the executed window showed no write
(no O_WRONLY/O_RDWR/O_CREAT, only stat/access/read-only opens). Empty means the direction is unknown and
the charging site records the poison marker, never a guess.
row: &'static strThe SOUNDNESS row that carries the evidence.
evidence: &'static strWhat was executed, where, and under which condition.