/** * What a weak signal is measured *from*. The dual of `ProofSource` in * `constraints.ts`, and the reason this catalogue is bounded too: a signal SG * cannot observe is not a signal it can carry. * * - `timing`, when things happened, and the shape of the gaps * - `repetition`: how similar this interaction is to previous ones * - `interaction`, the presence and texture of human input * - `sequence`, the path taken, where no invariant forbids it * - `target`, what is being asked for, and how broadly * - `environment`, coarse client-side facts, never fingerprints */ export declare const SIGNAL_SOURCES: readonly ["timing", "repetition", "interaction", "sequence", "target", "environment"]; export type SignalSource = (typeof SIGNAL_SOURCES)[number]; /** * How much observing a signal is worth, in evidence mass. * * Deliberately three coarse levels rather than a per-signal number. A continuous * weight would imply calibration nobody has done (D36), and the ordering is the * only part that survives contact with real traffic anyway. */ export declare const SIGNAL_WEIGHTS: { /** Common in legitimate traffic too. Barely moves anything alone. */ readonly faint: number; /** Unusual enough to be worth mass, inconclusive enough to need company. */ readonly notable: number; /** Rarely innocent, but still measured rather than proven. */ readonly pronounced: 0.5; }; /** * The most mass all the weak signals of a single interaction may contribute. * * One weak observation, the least the trust model recognises. This is what * "never a standalone trigger" means numerically, and it is a stronger guarantee * than the wording alone: with the prior at `n = 2` and `developingAt` at `3`, an * interaction that trips *every* signal in the catalogue still leaves the entity * in the `unknown` stage, where the trust dimension asks for nothing (D40). * * So measurement cannot manufacture a treatment on its own. It takes repeated * interactions to accumulate past the stage boundary: which is exactly the * "meaningful in combination" the design notes ask for, combination over time * rather than a single well-instrumented request. */ export declare const SIGNAL_MASS_CAP: 0.5; export type SignalWeight = keyof typeof SIGNAL_WEIGHTS; export type WeakSignal = { readonly id: string; readonly source: SignalSource; readonly weight: SignalWeight; /** What is measured. Never a threshold, see the header. */ readonly measures: string; /** Why a legitimate user might trigger it. The honest false-positive path. */ readonly innocentCause: string; /** * Whether `behaviorFeatures` (D36) derives this server-side. * * `false` does not mean uncollectable: D51 added a collector for every entry in * this catalogue. It means the observation arrives from `./collect` or from the * host rather than being derived from the retained window. */ readonly computed: boolean; }; /** * The catalogue. * * The first four entries are drawn from the design notes ยง6B, which came from the * author's own scraping experience; the rest close the enumeration over * `SIGNAL_SOURCES`. `computed: true` marks the ones the anomaly feature space * (D36) derives from the retained window; the rest arrive from `./collect`, which * has a collector for each of them since D51. */ export declare const WEAK_SIGNALS: readonly WeakSignal[]; export declare function isWeakSignal(value: unknown): value is WeakSignal['id']; /** * Negative evidence mass owed by a set of observed signals. * * Summed, not averaged: the notes are explicit that weak signals matter *in * combination*, and an average would make a second signal weaken the first. * * Capped at `SIGNAL_MASS_CAP`. A weak signal is measurement, and no pile of * measurements should outweigh what a host declared: nor should a catalogue that * grows over time quietly become more punitive per interaction than it was when * these thresholds were reasoned about. */ export declare function signalMass(observed: readonly string[], catalogue?: readonly WeakSignal[]): number; /** The catalogue grouped by what it is measured from. For docs and coverage checks. */ export declare function signalsBySource(catalogue?: readonly WeakSignal[]): Record; //# sourceMappingURL=signals.d.ts.map