diff --git a/core/dr-catalog/src/faces.rs b/core/dr-catalog/src/faces.rs index 909f8cd..5578bbd 100644 --- a/core/dr-catalog/src/faces.rs +++ b/core/dr-catalog/src/faces.rs @@ -121,7 +121,7 @@ pub struct DetectedFace { /// no length left to read, so the only way to measure one is to embed it /// again (schema V14). pub quality: Option, - /// TRACES: FR-CULL-13 + /// TRACES: FR-CULL-8a /// What the eyes are doing — P(open) per eye and P(sunglasses), read by /// `dr_face::classify` from the same aligned crop. `None` where the eye /// models were not present at indexing, or the face came from a peer diff --git a/core/dr-catalog/src/schema.rs b/core/dr-catalog/src/schema.rs index 2b98ec8..50364ce 100644 --- a/core/dr-catalog/src/schema.rs +++ b/core/dr-catalog/src/schema.rs @@ -752,7 +752,7 @@ CREATE TABLE IF NOT EXISTS xmp_conflicts ( "#; const V17: &str = r#" --- TRACES: FR-CULL-13 | NFR-P9 +-- TRACES: FR-CULL-8a | FR-CULL-13 | NFR-P9 -- The eyes-open filter's index, and a lesson about where a column lands. -- -- The people filter is a correlated EXISTS over `faces` per image, and it @@ -774,7 +774,7 @@ CREATE INDEX IF NOT EXISTS faces_eyes ON faces( ); "#; -// V16 -- TRACES: FR-CULL-13 +// V16 -- TRACES: FR-CULL-8a // // What each face's eyes are doing: for each eye P(open), the source pixels // across its box and the sharpness of the patch the classifier saw; and diff --git a/core/dr-face/src/classify.rs b/core/dr-face/src/classify.rs index e3483fa..83db72f 100644 --- a/core/dr-face/src/classify.rs +++ b/core/dr-face/src/classify.rs @@ -1,4 +1,4 @@ -//! TRACES: FR-CULL-13 +//! TRACES: FR-CULL-8a //! The two small classifiers behind a face's eye state (docs/faces.md §17). //! //! **OCEC** — *open closed eyes classification*, Hyodo 2025 — reads one diff --git a/core/dr-face/src/eyes.rs b/core/dr-face/src/eyes.rs index 9c33c95..603b20c 100644 --- a/core/dr-face/src/eyes.rs +++ b/core/dr-face/src/eyes.rs @@ -1,4 +1,4 @@ -//! TRACES: FR-CULL-13 +//! TRACES: FR-CULL-8a //! What a face's eyes are doing, and how the numbers behind it are read. //! //! Model-free: the models in [`crate::classify`] produce the numbers, and diff --git a/core/dr-face/src/landmarks.rs b/core/dr-face/src/landmarks.rs index 228f260..625f69a 100644 --- a/core/dr-face/src/landmarks.rs +++ b/core/dr-face/src/landmarks.rs @@ -1,4 +1,4 @@ -//! TRACES: FR-CULL-13 +//! TRACES: FR-CULL-8a //! Dense facial landmarks — InsightFace's `2d106det` (docs/faces.md §17.2). //! //! SCRFD's five points place a face; they do not place an eye. Its eye diff --git a/core/dr-face/src/lib.rs b/core/dr-face/src/lib.rs index 52fea2b..89633e8 100644 --- a/core/dr-face/src/lib.rs +++ b/core/dr-face/src/lib.rs @@ -4,7 +4,7 @@ //! landmarks, a confidence and a 512-d embedding (FR-CULL-8) — and then the //! arithmetic that turns embeddings into people (FR-CULL-9, FR-CULL-10). Two //! more, optional, read each face's eyes and whether sunglasses hide them -//! (FR-CULL-13, [`classify`] and [`eyes`]). +//! (FR-CULL-8a, [`classify`] and [`eyes`]). //! //! Like `dr-segment`, this crate is **device-free**: no GPU adapter, no //! Slint, nothing that needs a display. Unlike `dr-segment`, it carries **no diff --git a/core/dr-types/src/place.rs b/core/dr-types/src/place.rs index b7be304..5e2894c 100644 --- a/core/dr-types/src/place.rs +++ b/core/dr-types/src/place.rs @@ -126,7 +126,7 @@ pub struct StoredFilter { /// does not derive serde — and "all of them" is the only thing the second /// variant means. pub people_all: bool, - /// TRACES: FR-CULL-13 + /// TRACES: FR-CULL-8a | FR-CULL-13 /// Whether the grid was narrowed to photographs with nobody blinking. /// Travels: it is a narrowing like `local_only`, and a record without it /// — from a build before it existed — reads as off. diff --git a/docs/catalog.md b/docs/catalog.md index 8117fcf..caad40c 100644 --- a/docs/catalog.md +++ b/docs/catalog.md @@ -748,7 +748,7 @@ CREATE TABLE faces ( -- (faces.md §6, §9). NULL for a face stored as a unit vector before it -- was kept. quality REAL, - -- What the eyes are doing (FR-CULL-13, faces.md §17): per eye P(open), + -- What the eyes are doing (FR-CULL-8a, faces.md §17): per eye P(open), -- the source pixels across its box and the sharpness of the patch the -- classifier saw; and P(sunglasses). All seven or none; NULL is "never -- read", which every filter treats as unknown rather than as closed. @@ -913,5 +913,5 @@ and is not answered here. | FR-CULL-10 | §10.1 `people` and `face_person`, merge-by-redirect, §10.2 clustering as a library pass | | FR-CULL-11 | §5 `Selector::Person`, confirmed-only by default | | FR-CULL-12 | §10.1 derived data in the catalog; names to the sidecar, UUID as merge identity | -| FR-CULL-13 | §10.1 the seven eye columns, derived like the embedding; the filter term is `RatingFilter::eyes_open` | +| FR-CULL-8a | §10.1 the seven eye columns, derived like the embedding; the filter term is `RatingFilter::eyes_open` | | NFR-SEC-5 | §10.4 sync left undecided and off; nothing in §10 emits an embedding | diff --git a/docs/faces.md b/docs/faces.md index dea6977..a88e758 100644 --- a/docs/faces.md +++ b/docs/faces.md @@ -1266,17 +1266,20 @@ frames to family snapshots as the real unknowns. | NFR-COMPAT-2 | §2 — why the obvious weights cannot ship, and what does instead | | NFR-RES-2 | §1 the cheap model pair, §12 M2/M3/M10 on a phone | | NFR-ARCH-2 | §10 background priority, preempted by visible work | -| FR-CULL-13 | §17 — eye state and sunglasses, the crops, the measurements, and the filter | +| FR-CULL-8a | §17 — eye state and sunglasses: the models, the crops, the readability rule, the measurements | +| FR-CULL-13 | §17.3 — the reading is evidence: a chip that narrows and a badge that explains, and nothing that writes a judgement | --- ## 17. Eyes and sunglasses · 2026-09-19 -FR-CULL-13. Three more models run over every face the pipeline already aligns, and what they -produce is a **filter term** — "eyes open", beside a person or alone — and a badge on the People -screen. Nothing acts on it. §3.9.1's exclusion of blink *detection* was an exclusion of blink -*selection*, and the requirement is written to hold that line: the chip narrows the grid the way a -star count does, and rates nothing. +FR-CULL-8a's eye state, under FR-CULL-13's rule. Three more models run over every face the +pipeline already aligns, and what they produce is a **filter term** — "eyes open", on the people +filter — and a badge on the People screen. Nothing acts on it: FR-CULL-13 says the signal is +evidence, shown and filterable, and never holds the pen, and §3.9.1's exclusion of blink +*detection* was re-read the same day as the exclusion of blink *selection* it always was. The chip +narrows the grid the way a star count does, and rates nothing. Head pose, the other half of +FR-CULL-8a, is not built; §17.3 says what stands in for it. ### 17.1 The models, and why these diff --git a/docs/traceability.md b/docs/traceability.md index 443f67b..38e8d6b 100644 --- a/docs/traceability.md +++ b/docs/traceability.md @@ -13,14 +13,14 @@ Denominators are parsed from [`requirements.md`](requirements.md) at run time, n | TRACES tags found | 1519 | | Requirements defined | 171 | | Requirements deferred (post-v1) | 24 | -| Requirements covered | 143 | -| **Coverage** | **83.6%** (143/171) | +| Requirements covered | 144 | +| **Coverage** | **84.2%** (144/171) | ### By type | Type | Covered | Defined | |---|---|---| -| FR | 105 | 116 | +| FR | 106 | 116 | | NFR | 34 | 48 | | R | 4 | 7 | @@ -53,12 +53,13 @@ _None._ | FR-CULL-10 | [`core/dr-catalog/src/faces.rs:1`](../core/dr-catalog/src/faces.rs#L1), [`core/dr-catalog/src/schema.rs:492`](../core/dr-catalog/src/schema.rs#L492), [`core/dr-catalog/src/schema.rs:670`](../core/dr-catalog/src/schema.rs#L670), [`core/dr-catalog/src/schema.rs:849`](../core/dr-catalog/src/schema.rs#L849), [`core/dr-face/src/assign.rs:1`](../core/dr-face/src/assign.rs#L1), [`core/dr-face/src/neighbours.rs:1`](../core/dr-face/src/neighbours.rs#L1), [`core/dr-types/src/settings.rs:129`](../core/dr-types/src/settings.rs#L129), [`ui/dr-ui/src/develop.rs:121`](../ui/dr-ui/src/develop.rs#L121), [`ui/dr-ui/src/develop.rs:130`](../ui/dr-ui/src/develop.rs#L130), [`ui/dr-ui/src/develop.rs:196`](../ui/dr-ui/src/develop.rs#L196), [`ui/dr-ui/src/develop.rs:2416`](../ui/dr-ui/src/develop.rs#L2416), [`ui/dr-ui/src/develop.rs:715`](../ui/dr-ui/src/develop.rs#L715), [`ui/dr-ui/src/faces.rs:1`](../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/identity.rs:1`](../ui/dr-ui/src/identity.rs#L1), [`ui/dr-ui/src/identity_ui.rs:1`](../ui/dr-ui/src/identity_ui.rs#L1), [`ui/dr-ui/src/lib.rs:2516`](../ui/dr-ui/src/lib.rs#L2516), [`ui/dr-ui/ui/identity.slint:1`](../ui/dr-ui/ui/identity.slint#L1) | | FR-CULL-11 | [`core/dr-catalog/src/faces.rs:1`](../core/dr-catalog/src/faces.rs#L1), [`core/dr-catalog/src/schema.rs:849`](../core/dr-catalog/src/schema.rs#L849), [`ui/dr-ui/src/identity.rs:1`](../ui/dr-ui/src/identity.rs#L1), [`ui/dr-ui/src/identity_ui.rs:1`](../ui/dr-ui/src/identity_ui.rs#L1), [`ui/dr-ui/src/library.rs:295`](../ui/dr-ui/src/library.rs#L295), [`ui/dr-ui/src/library.rs:345`](../ui/dr-ui/src/library.rs#L345), [`ui/dr-ui/ui/identity.slint:1`](../ui/dr-ui/ui/identity.slint#L1) | | FR-CULL-12 | [`core/dr-catalog/src/faces.rs:1`](../core/dr-catalog/src/faces.rs#L1), [`core/dr-catalog/src/schema.rs:492`](../core/dr-catalog/src/schema.rs#L492), [`core/dr-catalog/src/schema.rs:849`](../core/dr-catalog/src/schema.rs#L849), [`ui/dr-ui/src/identity.rs:1`](../ui/dr-ui/src/identity.rs#L1), [`ui/dr-ui/ui/identity.slint:1`](../ui/dr-ui/ui/identity.slint#L1) | -| FR-CULL-13 | [`core/dr-catalog/src/faces.rs:124`](../core/dr-catalog/src/faces.rs#L124), [`core/dr-catalog/src/schema.rs:755`](../core/dr-catalog/src/schema.rs#L755), [`core/dr-face/src/classify.rs:1`](../core/dr-face/src/classify.rs#L1), [`core/dr-face/src/eyes.rs:1`](../core/dr-face/src/eyes.rs#L1), [`core/dr-face/src/landmarks.rs:1`](../core/dr-face/src/landmarks.rs#L1), [`core/dr-types/src/place.rs:129`](../core/dr-types/src/place.rs#L129), [`ui/dr-ui/src/faces.rs:160`](../ui/dr-ui/src/faces.rs#L160), [`ui/dr-ui/src/faces.rs:1702`](../ui/dr-ui/src/faces.rs#L1702), [`ui/dr-ui/src/faces.rs:275`](../ui/dr-ui/src/faces.rs#L275), [`ui/dr-ui/src/identity.rs:104`](../ui/dr-ui/src/identity.rs#L104), [`ui/dr-ui/src/library.rs:321`](../ui/dr-ui/src/library.rs#L321), [`ui/dr-ui/src/library.rs:8313`](../ui/dr-ui/src/library.rs#L8313), [`ui/dr-ui/src/library.rs:8356`](../ui/dr-ui/src/library.rs#L8356), [`ui/dr-ui/src/library.rs:8394`](../ui/dr-ui/src/library.rs#L8394), [`ui/dr-ui/ui/app.slint:701`](../ui/dr-ui/ui/app.slint#L701), [`ui/dr-ui/ui/identity.slint:63`](../ui/dr-ui/ui/identity.slint#L63), [`ui/dr-ui/ui/library.slint:1512`](../ui/dr-ui/ui/library.slint#L1512) | +| FR-CULL-13 | [`core/dr-catalog/src/schema.rs:755`](../core/dr-catalog/src/schema.rs#L755), [`core/dr-types/src/place.rs:129`](../core/dr-types/src/place.rs#L129), [`ui/dr-ui/src/identity.rs:104`](../ui/dr-ui/src/identity.rs#L104), [`ui/dr-ui/src/library.rs:321`](../ui/dr-ui/src/library.rs#L321), [`ui/dr-ui/src/library.rs:8313`](../ui/dr-ui/src/library.rs#L8313), [`ui/dr-ui/src/library.rs:8356`](../ui/dr-ui/src/library.rs#L8356), [`ui/dr-ui/src/library.rs:8394`](../ui/dr-ui/src/library.rs#L8394), [`ui/dr-ui/ui/app.slint:701`](../ui/dr-ui/ui/app.slint#L701), [`ui/dr-ui/ui/identity.slint:63`](../ui/dr-ui/ui/identity.slint#L63), [`ui/dr-ui/ui/library.slint:1512`](../ui/dr-ui/ui/library.slint#L1512) | | FR-CULL-2 | [`core/dr-decode/src/locate.rs:1`](../core/dr-decode/src/locate.rs#L1), [`core/dr-decode/src/preview.rs:148`](../core/dr-decode/src/preview.rs#L148), [`ui/dr-ui/src/import.rs:463`](../ui/dr-ui/src/import.rs#L463) | | FR-CULL-3 | [`core/dr-gpu/src/focus.rs:154`](../core/dr-gpu/src/focus.rs#L154), [`core/dr-gpu/src/focus.rs:186`](../core/dr-gpu/src/focus.rs#L186), [`core/dr-gpu/src/focus.rs:1`](../core/dr-gpu/src/focus.rs#L1), [`core/dr-gpu/src/focus.rs:317`](../core/dr-gpu/src/focus.rs#L317), [`core/dr-gpu/src/raw_histogram.rs:129`](../core/dr-gpu/src/raw_histogram.rs#L129), [`core/dr-gpu/src/raw_histogram.rs:1`](../core/dr-gpu/src/raw_histogram.rs#L1), [`core/dr-gpu/src/raw_histogram.rs:272`](../core/dr-gpu/src/raw_histogram.rs#L272), [`core/dr-gpu/src/raw_histogram.rs:407`](../core/dr-gpu/src/raw_histogram.rs#L407), [`core/dr-gpu/src/shaders/focus_peak.wgsl:1`](../core/dr-gpu/src/shaders/focus_peak.wgsl#L1), [`core/dr-gpu/src/shaders/raw_histogram.wgsl:1`](../core/dr-gpu/src/shaders/raw_histogram.wgsl#L1), [`ui/dr-ui/src/develop.rs:4137`](../ui/dr-ui/src/develop.rs#L4137), [`ui/dr-ui/src/develop.rs:4150`](../ui/dr-ui/src/develop.rs#L4150), [`ui/dr-ui/src/develop.rs:4195`](../ui/dr-ui/src/develop.rs#L4195), [`ui/dr-ui/src/develop.rs:4206`](../ui/dr-ui/src/develop.rs#L4206), [`ui/dr-ui/src/develop.rs:4212`](../ui/dr-ui/src/develop.rs#L4212), [`ui/dr-ui/src/develop.rs:4229`](../ui/dr-ui/src/develop.rs#L4229), [`ui/dr-ui/src/develop.rs:810`](../ui/dr-ui/src/develop.rs#L810), [`ui/dr-ui/src/develop.rs:830`](../ui/dr-ui/src/develop.rs#L830), [`ui/dr-ui/src/develop.rs:836`](../ui/dr-ui/src/develop.rs#L836), [`ui/dr-ui/src/develop.rs:8734`](../ui/dr-ui/src/develop.rs#L8734), [`ui/dr-ui/src/develop.rs:8798`](../ui/dr-ui/src/develop.rs#L8798), [`ui/dr-ui/src/develop.rs:8821`](../ui/dr-ui/src/develop.rs#L8821), [`ui/dr-ui/src/histogram.rs:1`](../ui/dr-ui/src/histogram.rs#L1), [`ui/dr-ui/src/histogram.rs:208`](../ui/dr-ui/src/histogram.rs#L208), [`ui/dr-ui/src/histogram.rs:228`](../ui/dr-ui/src/histogram.rs#L228), [`ui/dr-ui/src/histogram.rs:272`](../ui/dr-ui/src/histogram.rs#L272), [`ui/dr-ui/src/histogram.rs:544`](../ui/dr-ui/src/histogram.rs#L544), [`ui/dr-ui/src/histogram.rs:565`](../ui/dr-ui/src/histogram.rs#L565), [`ui/dr-ui/src/histogram.rs:593`](../ui/dr-ui/src/histogram.rs#L593), [`ui/dr-ui/src/histogram.rs:621`](../ui/dr-ui/src/histogram.rs#L621), [`ui/dr-ui/src/histogram.rs:658`](../ui/dr-ui/src/histogram.rs#L658), [`ui/dr-ui/src/lib.rs:1872`](../ui/dr-ui/src/lib.rs#L1872), [`ui/dr-ui/src/lib.rs:1980`](../ui/dr-ui/src/lib.rs#L1980), [`ui/dr-ui/src/lib.rs:2093`](../ui/dr-ui/src/lib.rs#L2093), [`ui/dr-ui/src/lib.rs:2134`](../ui/dr-ui/src/lib.rs#L2134), [`ui/dr-ui/src/lib.rs:3627`](../ui/dr-ui/src/lib.rs#L3627), [`ui/dr-ui/src/lib.rs:437`](../ui/dr-ui/src/lib.rs#L437), [`ui/dr-ui/src/peaking.rs:1`](../ui/dr-ui/src/peaking.rs#L1), [`ui/dr-ui/ui/app.slint:1944`](../ui/dr-ui/ui/app.slint#L1944), [`ui/dr-ui/ui/app.slint:2951`](../ui/dr-ui/ui/app.slint#L2951), [`ui/dr-ui/ui/app.slint:87`](../ui/dr-ui/ui/app.slint#L87), [`ui/dr-ui/ui/peaking.slint:1`](../ui/dr-ui/ui/peaking.slint#L1), [`ui/dr-ui/ui/peaking.slint:25`](../ui/dr-ui/ui/peaking.slint#L25), [`ui/dr-ui/ui/peaking.slint:56`](../ui/dr-ui/ui/peaking.slint#L56), [`ui/dr-ui/ui/peaking.slint:91`](../ui/dr-ui/ui/peaking.slint#L91) | | FR-CULL-4 | [`core/dr-catalog/src/rating.rs:1`](../core/dr-catalog/src/rating.rs#L1), [`core/dr-pipeline/src/sidecar.rs:156`](../core/dr-pipeline/src/sidecar.rs#L156), [`core/dr-xmp/src/lib.rs:442`](../core/dr-xmp/src/lib.rs#L442), [`ui/dr-ui/src/library.rs:254`](../ui/dr-ui/src/library.rs#L254), [`ui/dr-ui/src/library.rs:564`](../ui/dr-ui/src/library.rs#L564) | | FR-CULL-5 | [`core/dr-catalog/src/bursts.rs:1`](../core/dr-catalog/src/bursts.rs#L1), [`core/dr-catalog/src/schema.rs:535`](../core/dr-catalog/src/schema.rs#L535), [`ui/dr-ui/src/bursts.rs:1`](../ui/dr-ui/src/bursts.rs#L1), [`ui/dr-ui/src/library.rs:210`](../ui/dr-ui/src/library.rs#L210), [`ui/dr-ui/src/library.rs:6840`](../ui/dr-ui/src/library.rs#L6840) | | FR-CULL-8 | [`core/dr-catalog/src/face_shard.rs:1`](../core/dr-catalog/src/face_shard.rs#L1), [`core/dr-catalog/src/faces.rs:1`](../core/dr-catalog/src/faces.rs#L1), [`core/dr-catalog/src/schema.rs:603`](../core/dr-catalog/src/schema.rs#L603), [`core/dr-catalog/src/schema.rs:808`](../core/dr-catalog/src/schema.rs#L808), [`core/dr-catalog/src/schema.rs:849`](../core/dr-catalog/src/schema.rs#L849), [`core/dr-face/src/align.rs:296`](../core/dr-face/src/align.rs#L296), [`core/dr-types/src/settings.rs:176`](../core/dr-types/src/settings.rs#L176), [`ui/dr-ui/examples/face_detectors.rs:1`](../ui/dr-ui/examples/face_detectors.rs#L1), [`ui/dr-ui/examples/face_native.rs:1`](../ui/dr-ui/examples/face_native.rs#L1), [`ui/dr-ui/src/derived_sync.rs:124`](../ui/dr-ui/src/derived_sync.rs#L124), [`ui/dr-ui/src/faces.rs:1`](../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/faces.rs:403`](../ui/dr-ui/src/faces.rs#L403), [`ui/dr-ui/src/faces.rs:419`](../ui/dr-ui/src/faces.rs#L419), [`ui/dr-ui/src/faces.rs:539`](../ui/dr-ui/src/faces.rs#L539), [`ui/dr-ui/src/identity_ui.rs:555`](../ui/dr-ui/src/identity_ui.rs#L555), [`ui/dr-ui/src/lib.rs:1480`](../ui/dr-ui/src/lib.rs#L1480), [`ui/dr-ui/src/lib.rs:3882`](../ui/dr-ui/src/lib.rs#L3882), [`ui/dr-ui/src/library.rs:3595`](../ui/dr-ui/src/library.rs#L3595), [`ui/dr-ui/src/library.rs:3861`](../ui/dr-ui/src/library.rs#L3861), [`ui/dr-ui/src/library.rs:4123`](../ui/dr-ui/src/library.rs#L4123), [`ui/dr-ui/src/library.rs:4406`](../ui/dr-ui/src/library.rs#L4406), [`ui/dr-ui/src/library.rs:4603`](../ui/dr-ui/src/library.rs#L4603), [`ui/dr-ui/src/library.rs:4639`](../ui/dr-ui/src/library.rs#L4639), [`ui/dr-ui/src/library.rs:4721`](../ui/dr-ui/src/library.rs#L4721), [`ui/dr-ui/src/library.rs:7009`](../ui/dr-ui/src/library.rs#L7009), [`ui/dr-ui/src/library_ui.rs:406`](../ui/dr-ui/src/library_ui.rs#L406), [`ui/dr-ui/src/library_ui.rs:491`](../ui/dr-ui/src/library_ui.rs#L491), [`ui/dr-ui/src/settings_ui.rs:210`](../ui/dr-ui/src/settings_ui.rs#L210), [`ui/dr-ui/src/settings_ui.rs:552`](../ui/dr-ui/src/settings_ui.rs#L552), [`ui/dr-ui/ui/app.slint:902`](../ui/dr-ui/ui/app.slint#L902), [`ui/dr-ui/ui/settings.slint:457`](../ui/dr-ui/ui/settings.slint#L457), [`ui/dr-ui/ui/settings.slint:82`](../ui/dr-ui/ui/settings.slint#L82), [`ui/dr-ui/ui/settings.slint:94`](../ui/dr-ui/ui/settings.slint#L94) | +| FR-CULL-8a | [`core/dr-catalog/src/faces.rs:124`](../core/dr-catalog/src/faces.rs#L124), [`core/dr-catalog/src/schema.rs:755`](../core/dr-catalog/src/schema.rs#L755), [`core/dr-face/src/classify.rs:1`](../core/dr-face/src/classify.rs#L1), [`core/dr-face/src/eyes.rs:1`](../core/dr-face/src/eyes.rs#L1), [`core/dr-face/src/landmarks.rs:1`](../core/dr-face/src/landmarks.rs#L1), [`core/dr-types/src/place.rs:129`](../core/dr-types/src/place.rs#L129), [`ui/dr-ui/src/faces.rs:160`](../ui/dr-ui/src/faces.rs#L160), [`ui/dr-ui/src/faces.rs:1702`](../ui/dr-ui/src/faces.rs#L1702), [`ui/dr-ui/src/faces.rs:275`](../ui/dr-ui/src/faces.rs#L275), [`ui/dr-ui/src/identity.rs:104`](../ui/dr-ui/src/identity.rs#L104), [`ui/dr-ui/src/library.rs:321`](../ui/dr-ui/src/library.rs#L321), [`ui/dr-ui/src/library.rs:8313`](../ui/dr-ui/src/library.rs#L8313), [`ui/dr-ui/src/library.rs:8356`](../ui/dr-ui/src/library.rs#L8356), [`ui/dr-ui/src/library.rs:8394`](../ui/dr-ui/src/library.rs#L8394), [`ui/dr-ui/ui/app.slint:701`](../ui/dr-ui/ui/app.slint#L701), [`ui/dr-ui/ui/identity.slint:63`](../ui/dr-ui/ui/identity.slint#L63), [`ui/dr-ui/ui/library.slint:1512`](../ui/dr-ui/ui/library.slint#L1512) | | FR-CULL-9 | [`core/dr-catalog/src/faces.rs:1`](../core/dr-catalog/src/faces.rs#L1), [`core/dr-catalog/src/schema.rs:670`](../core/dr-catalog/src/schema.rs#L670), [`core/dr-catalog/src/schema.rs:849`](../core/dr-catalog/src/schema.rs#L849), [`core/dr-face/src/assign.rs:1`](../core/dr-face/src/assign.rs#L1), [`core/dr-face/src/neighbours.rs:1`](../core/dr-face/src/neighbours.rs#L1), [`core/dr-types/src/settings.rs:129`](../core/dr-types/src/settings.rs#L129), [`ui/dr-ui/src/faces.rs:1`](../ui/dr-ui/src/faces.rs#L1), [`ui/dr-ui/src/faces.rs:539`](../ui/dr-ui/src/faces.rs#L539), [`ui/dr-ui/src/identity_ui.rs:1`](../ui/dr-ui/src/identity_ui.rs#L1), [`ui/dr-ui/src/library.rs:3968`](../ui/dr-ui/src/library.rs#L3968), [`ui/dr-ui/src/library.rs:4721`](../ui/dr-ui/src/library.rs#L4721), [`ui/dr-ui/ui/identity.slint:341`](../ui/dr-ui/ui/identity.slint#L341) | | FR-DEV-1 | [`core/dr-pipeline/src/graph.rs:1`](../core/dr-pipeline/src/graph.rs#L1), [`core/dr-pipeline/src/sidecar.rs:1`](../core/dr-pipeline/src/sidecar.rs#L1) | | FR-DEV-10 | [`core/dr-gpu/src/mask.rs:1027`](../core/dr-gpu/src/mask.rs#L1027), [`core/dr-gpu/src/mask.rs:1251`](../core/dr-gpu/src/mask.rs#L1251), [`core/dr-gpu/src/mask.rs:1509`](../core/dr-gpu/src/mask.rs#L1509), [`core/dr-gpu/src/mask.rs:421`](../core/dr-gpu/src/mask.rs#L421), [`core/dr-gpu/src/mask.rs:463`](../core/dr-gpu/src/mask.rs#L463), [`core/dr-gpu/src/mask.rs:58`](../core/dr-gpu/src/mask.rs#L58), [`core/dr-gpu/src/mask.rs:60`](../core/dr-gpu/src/mask.rs#L60), [`core/dr-gpu/src/mask.rs:834`](../core/dr-gpu/src/mask.rs#L834), [`core/dr-gpu/src/mask.rs:85`](../core/dr-gpu/src/mask.rs#L85), [`core/dr-gpu/src/mask.rs:913`](../core/dr-gpu/src/mask.rs#L913), [`core/dr-gpu/src/shaders/mask.wgsl:117`](../core/dr-gpu/src/shaders/mask.wgsl#L117), [`core/dr-gpu/src/shaders/mask.wgsl:59`](../core/dr-gpu/src/shaders/mask.wgsl#L59), [`core/dr-gpu/tests/range_masks.rs:119`](../core/dr-gpu/tests/range_masks.rs#L119), [`core/dr-gpu/tests/range_masks.rs:147`](../core/dr-gpu/tests/range_masks.rs#L147), [`core/dr-gpu/tests/range_masks.rs:175`](../core/dr-gpu/tests/range_masks.rs#L175), [`core/dr-gpu/tests/range_masks.rs:1`](../core/dr-gpu/tests/range_masks.rs#L1), [`core/dr-gpu/tests/range_masks.rs:94`](../core/dr-gpu/tests/range_masks.rs#L94), [`core/dr-pipeline/src/mask.rs:125`](../core/dr-pipeline/src/mask.rs#L125), [`core/dr-pipeline/src/mask.rs:2845`](../core/dr-pipeline/src/mask.rs#L2845), [`core/dr-pipeline/src/mask.rs:2858`](../core/dr-pipeline/src/mask.rs#L2858), [`core/dr-pipeline/src/mask.rs:2877`](../core/dr-pipeline/src/mask.rs#L2877), [`core/dr-pipeline/src/mask.rs:2891`](../core/dr-pipeline/src/mask.rs#L2891), [`core/dr-pipeline/src/mask.rs:2901`](../core/dr-pipeline/src/mask.rs#L2901), [`core/dr-pipeline/src/mask.rs:710`](../core/dr-pipeline/src/mask.rs#L710), [`core/dr-pipeline/src/mask.rs:749`](../core/dr-pipeline/src/mask.rs#L749), [`core/dr-pipeline/src/mask.rs:809`](../core/dr-pipeline/src/mask.rs#L809), [`core/dr-pipeline/src/mask.rs:828`](../core/dr-pipeline/src/mask.rs#L828), [`core/dr-pipeline/src/mask.rs:852`](../core/dr-pipeline/src/mask.rs#L852), [`core/dr-pipeline/src/mask.rs:864`](../core/dr-pipeline/src/mask.rs#L864), [`core/dr-pipeline/src/mask.rs:876`](../core/dr-pipeline/src/mask.rs#L876), [`core/dr-pipeline/src/sidecar.rs:1309`](../core/dr-pipeline/src/sidecar.rs#L1309), [`core/dr-pipeline/src/sidecar.rs:1488`](../core/dr-pipeline/src/sidecar.rs#L1488), [`core/dr-pipeline/src/sidecar.rs:1577`](../core/dr-pipeline/src/sidecar.rs#L1577), [`core/dr-pipeline/src/sidecar.rs:1681`](../core/dr-pipeline/src/sidecar.rs#L1681), [`core/dr-pipeline/src/sidecar.rs:1889`](../core/dr-pipeline/src/sidecar.rs#L1889), [`core/dr-pipeline/tests/mask_sidecar.rs:1157`](../core/dr-pipeline/tests/mask_sidecar.rs#L1157), [`core/dr-pipeline/tests/mask_sidecar.rs:1186`](../core/dr-pipeline/tests/mask_sidecar.rs#L1186), [`core/dr-pipeline/tests/mask_sidecar.rs:1204`](../core/dr-pipeline/tests/mask_sidecar.rs#L1204), [`core/dr-pipeline/tests/mask_sidecar.rs:1234`](../core/dr-pipeline/tests/mask_sidecar.rs#L1234), [`ui/dr-ui/src/develop.rs:2318`](../ui/dr-ui/src/develop.rs#L2318), [`ui/dr-ui/src/develop.rs:3657`](../ui/dr-ui/src/develop.rs#L3657), [`ui/dr-ui/src/develop.rs:3684`](../ui/dr-ui/src/develop.rs#L3684), [`ui/dr-ui/src/develop.rs:3716`](../ui/dr-ui/src/develop.rs#L3716), [`ui/dr-ui/src/develop.rs:3740`](../ui/dr-ui/src/develop.rs#L3740), [`ui/dr-ui/src/develop.rs:3746`](../ui/dr-ui/src/develop.rs#L3746), [`ui/dr-ui/src/develop.rs:3753`](../ui/dr-ui/src/develop.rs#L3753), [`ui/dr-ui/src/develop.rs:3773`](../ui/dr-ui/src/develop.rs#L3773), [`ui/dr-ui/src/labels.rs:63`](../ui/dr-ui/src/labels.rs#L63), [`ui/dr-ui/src/masks_ui.rs:1150`](../ui/dr-ui/src/masks_ui.rs#L1150), [`ui/dr-ui/src/masks_ui.rs:748`](../ui/dr-ui/src/masks_ui.rs#L748) | @@ -209,14 +210,13 @@ Defined in `requirements.md` and marked `(post-v1)` on the defining line. Not in ## Not yet tagged -28 of 171 requirements have no implementation tag. Expected while the codebase is young; each should gain one as it is built. +27 of 171 requirements have no implementation tag. Expected while the codebase is young; each should gain one as it is built.
Show untagged requirements - FR-CAT-14 - FR-CULL-6 - FR-CULL-7 -- FR-CULL-8a - FR-DEV-3g - FR-DSP-2 - FR-DSP-4 diff --git a/ui/dr-ui/src/faces.rs b/ui/dr-ui/src/faces.rs index 59c6902..606ce36 100644 --- a/ui/dr-ui/src/faces.rs +++ b/ui/dr-ui/src/faces.rs @@ -157,7 +157,7 @@ pub struct IndexAudit { /// Outstanding with no proxy on disk. Costs a range request, same as the /// ones above now do. pub awaiting_proxy: u64, - /// TRACES: FR-CULL-13 + /// TRACES: FR-CULL-8a /// Faces this model found that the measuring pass still has to read: /// stored without their quality, or — on a device with the eye models — /// without an eye reading. Work that is not visible in the coverage @@ -272,7 +272,7 @@ pub fn audit( }) } -/// TRACES: FR-CULL-13 +/// TRACES: FR-CULL-8a /// Read one face's eyes from the buffer its crop came from, if this device /// can. /// @@ -1699,7 +1699,7 @@ mod tests { assert!(a.is_complete()); } - /// TRACES: FR-CULL-13 + /// TRACES: FR-CULL-8a /// A fully indexed library whose faces have not been read is not /// finished: the screen hides the button on `is_complete`, and this is /// the only way the readings of an old library ever get filled in. diff --git a/ui/dr-ui/src/identity.rs b/ui/dr-ui/src/identity.rs index edf30ce..08abf3a 100644 --- a/ui/dr-ui/src/identity.rs +++ b/ui/dr-ui/src/identity.rs @@ -101,7 +101,7 @@ pub struct FaceCell { /// of its raw embedding (`dr_face::MIN_GALLERY_QUALITY`). `None` for a /// face indexed before it was kept. pub quality: Option, - /// TRACES: FR-CULL-13 + /// TRACES: FR-CULL-8a | FR-CULL-13 /// What the eyes are doing, where they were read. pub eyes: Option, } diff --git a/ui/dr-ui/src/library.rs b/ui/dr-ui/src/library.rs index 092d35e..1e5450a 100644 --- a/ui/dr-ui/src/library.rs +++ b/ui/dr-ui/src/library.rs @@ -318,7 +318,7 @@ pub struct RatingFilter { pub people: Vec, /// Whether [`RatingFilter::people`] is a union or an intersection. pub people_mode: PeopleMode, - /// TRACES: FR-CULL-13 + /// TRACES: FR-CULL-8a | FR-CULL-13 /// Only photographs in which the chosen people are not caught blinking. /// /// A term *on* [`RatingFilter::people`]: Anna with her eyes open, whoever @@ -8310,7 +8310,7 @@ mod tests { .unwrap(); } - /// TRACES: FR-CULL-13 + /// TRACES: FR-CULL-8a | FR-CULL-13 /// With a person chosen, the chip asks about *that* person's eyes: Anna /// blinking hides the frame, and Bob blinking beside her does not. #[test] @@ -8353,7 +8353,7 @@ mod tests { assert_eq!(count(vec![anna.0, bob.0], PeopleMode::Any, true), 4); } - /// TRACES: FR-CULL-13 + /// TRACES: FR-CULL-8a | FR-CULL-13 /// With nobody chosen the chip asks about every face, and a face behind /// sunglasses is not a blink. #[test] @@ -8391,7 +8391,7 @@ mod tests { ); } - /// TRACES: FR-CULL-13 + /// TRACES: FR-CULL-8a | FR-CULL-13 /// An eye that cannot be read is not a blink, in SQL as in /// `dr_face::EyeReading::state` — the two must agree, or the badge on /// the People screen would say one thing and the grid another. diff --git a/ui/dr-ui/ui/app.slint b/ui/dr-ui/ui/app.slint index 3fe231c..88d993e 100644 --- a/ui/dr-ui/ui/app.slint +++ b/ui/dr-ui/ui/app.slint @@ -698,7 +698,7 @@ export component AppWindow inherits Window { in property library-filter-people-all: false; callback library-filter-person-cleared(int); callback library-filter-people-mode-toggled(); - /// TRACES: FR-CULL-13 + /// TRACES: FR-CULL-8a | FR-CULL-13 /// Whether the grid is narrowed to photographs with nobody blinking. in property library-filter-eyes-open: false; callback library-filter-eyes-open-toggled(); diff --git a/ui/dr-ui/ui/identity.slint b/ui/dr-ui/ui/identity.slint index 7fa536c..afc51eb 100644 --- a/ui/dr-ui/ui/identity.slint +++ b/ui/dr-ui/ui/identity.slint @@ -60,7 +60,7 @@ export struct IdentityFace { // group that has gathered none of a person's other photographs has an // explanation the user can only see if every member's label says it. in-gallery: bool, - // TRACES: FR-CULL-13 + // TRACES: FR-CULL-8a | FR-CULL-13 // "Eyes closed", "Sunglasses" or "Eyes unclear", or empty — composed in // Rust like the two above. Empty for open eyes and for a face never // read, so the mark is only ever the reason a frame is or is not under diff --git a/ui/dr-ui/ui/library.slint b/ui/dr-ui/ui/library.slint index e39d863..287569a 100644 --- a/ui/dr-ui/ui/library.slint +++ b/ui/dr-ui/ui/library.slint @@ -1509,7 +1509,7 @@ export component LibraryGrid inherits Rectangle { in property filter-people-all: false; callback filter-person-cleared(int); callback filter-people-mode-toggled(); - /// TRACES: FR-CULL-13 + /// TRACES: FR-CULL-8a | FR-CULL-13 /// Only photographs in which the chosen people are not blinking. Shown /// and meaningful only while `filter-people` holds someone. in property filter-eyes-open: false;