* feat(forecast): add independent Rust training stack Signed-off-by: Codex <codex@openai.com> * docs(forecast): record informal HPO exploration note (unaccepted) Records an exploratory Darwin Mode numeric-genome hyperparameter search against the tiny_ci synthetic accuracy protocol: WQL improved 0.257 -> 0.161 -> 0.153 over two search rounds, staying ahead of both baselines throughout. Explicitly scoped as informal/exploratory (not a frozen leakage-free report, not eligible for the evidence ledger, not validated for large_linux or any real dataset) per this doc's own evidence-tagging discipline. * feat(forecast-core): add per-horizon weighted quantile loss weighted_quantile_loss collapses the whole horizon into one aggregate number, hiding whether error grows with lead time. Add a sibling function using the identical per-cell pinball formula and domain checks, just reduced per horizon step instead of globally. A unit test reconstructs the aggregate from the per-step numerators/ denominators to prove the two functions agree exactly, not just approximately. * feat(forecast-model): add evaluation-only local activation Adds activate_for_evaluation and build_eval_input, gated behind the cpu feature. activate_for_evaluation self-signs an unsigned candidate with a fixed, publicly-known, non-secret Ed25519 key so a CLI operator can run inference against their own just-trained candidate without a real release signature -- explicitly never a production trust path, documented as such in the module doc comment. The schema-digest check in ArtifactActivationPolicy still applies in full; only signing is relaxed. build_eval_input constructs a single-window ModelInput for CPU inference from raw context-major values/mask arrays, matching the training batch builders exact time-feature/descriptor encoding. Six unit tests cover: malformed-candidate rejection, digest-mismatch rejection (proving the schema check has teeth even on this relaxed path), getting past the policy gate with a matching digest, and eval-input shape validation. * feat(forecast-train): add evaluate and prepare-synthetic-dataset CLI Turns this sessions throwaway HPO scripts into real, tested CLI surfaces, replacing two example binaries that bypassed the CLI/TOML training path entirely. prepare-synthetic-dataset generates a larger, configurable synthetic training shard (default 24 windows) plus a matching train-local.toml with the given OptimizerSpec hyperparameters baked in, and a separate held-out test.jsonl -- the same synthetic-only, local-validation-only posture as prepare-local-example, just bigger and configurable. evaluate scores a trained (unsigned) candidate against held-out windows and the LastValue/SeasonalNaive baselines: overall weighted quantile loss, a per-horizon breakdown, 80% interval coverage, and missingness, for the model and both baselines. Explicitly lists what docs/benchmarks/ruforecast.mds full accuracy protocol additionally asks for that this does not cover (abstention coverage, selective risk, site/device slices, interference regime, RuVector-retrieval ablation) rather than silently omitting them -- each needs infrastructure a single-entity synthetic fixture does not have. Together the three real commands (prepare-synthetic-dataset, train-local, evaluate) reproduce the exact WQL numbers the old library-bypassing example scripts produced for the same hyperparameters, confirmed by re-running the harness/ruview HPO dry-run end to end against the new CLI path. New integration test trains a real candidate via smoke, evaluates it against held-out synthetic windows, and asserts the full report shape and an empty-input rejection. * feat(forecast-train): add prepare-synthetic-dataset --seed + Autogenous bridge --seed (default 0, backward compatible) makes prepare-synthetic-dataset's generator deterministic per offset: same seed -> byte-identical corpus across runs (needed to train two genomes on the SAME corpus for a fair comparison); different seeds -> genuinely independent corpora (needed for honest multi-seed/multi-judge evaluation upstream, both in harness/ruview/flywheel/ruforecast/gate.mjs's fitness function and in the new v2/crates/ruforecast-autogenous-bridge crate added here). ruforecast-autogenous-bridge is a LOCAL-DEV-ONLY (excluded from the v2 workspace, publish = false) bridge from this crate's real evaluate CLI into ruvnet/autogenous's new regression-candidate promotion path (separate, unpushed branch feat/regression-candidate-kind): runs N independent train+evaluate judges on genuinely distinct synthetic corpora, signs receipts, and gets a real cryptographically-verified PROMOTE/REJECT decision -- defense in depth on top of, not a replacement for, Darwin's own promotion gate. Path-depends on a sibling autogenous checkout that does not exist in CI; build/run directly via `cargo build --manifest-path crates/ruforecast-autogenous-bridge/Cargo.toml`. cargo test -p ruview-forecast-train --no-default-features --features cpu,cli: all green (unaffected existing tests + this backward-compatible addition). * docs(forecast): retract round-2 HPO result, record honest multi-seed finding The earlier "Informal HPO exploration note" claimed a real improvement (WQL 0.257 -> 0.153) from a 3-round hyperparameter search. That search evaluated every candidate against one fixed synthetic corpus (seed 0) for every round -- textbook overfitting. Independent verification against two fresh corpora (via the new ruforecast-autogenous-bridge crate) showed the "winner" losing to the baseline on both. Fixed the root cause in harness/ruview/flywheel/ruforecast/gate.mjs: candidates are now scored against three independent corpora, worst-case across them, not one fixed corpus. Re-ran the search under the fix. It found a new winner that genuinely beat baseline on all three of its own search seeds -- and that winner ALSO lost independent verification on fresh seeds. Two independent search rounds, pre- and post-fix, both produced an illusory "winner." The honest reading: at this dataset scale (24 synthetic windows) held-out WQL varies enormously by which corpus is drawn, regardless of hyperparameters -- confirmed directly by the baseline genome's own primary swinging from 0.83 to a full regression across the three fixed search seeds with unchanged hyperparameters. No RuForecast hyperparameter configuration has been shown to reliably beat the trivial baselines out-of-sample at this scale. Also fixes a real design inconsistency surfaced by this exploration: the Autogenous regression-candidate promotion verifier (envelope::regression::verify_regression_promotion, separate unpushed ruvnet/autogenous branch feat/regression-candidate-kind) required all judges to share one corpus_id, which conflicts with this kind's intentional cross-corpus judge design. Corrected there (commit bfa4c48); did not change either REJECT verdict, which were already driven by the real NotBetterThanParent signal on their own. Append-only: the original round-2 row is kept, read together with this new amendment section, per this doc's own evidence-ledger discipline. * refactor(forecast): extract RuForecast to ruvnet/RuForecast submodule Mirrors the v2/crates/worldgraph pattern: RuForecast becomes its own independent public repo/workspace (ruforecast-core/model/train), mounted at v2/crates/ruforecast as a git submodule, with v2/Cargo.toml path-depping into its sub-crates and excluding the submodule from the v2 workspace. Full v2 --workspace check passes; the ruforecast CLI builds and runs correctly from its new location. Real git history for the extracted crates (7 commits) was preserved via git-filter-repo, not squashed. * feat(autogenous-bridge): real-data independent verification tool real_data_verify.rs: signs two real, temporally-independent judge measurements (different train/test split boundaries on the same real household vitals corpus, not synthetic seeds) through the real Autogenous regression-candidate promotion path, and gets a genuine cryptographically-checked PROMOTE/REJECT verdict. Result recorded (see docs/benchmarks/ruforecast.md): REJECT. One judge nominally beat the trivial baseline but by less than the 0.01 non-inferiority margin; the other judge lost outright. Consistent with every synthetic-data search this session -- no configuration has yet been shown to reliably beat trivial baselines out-of-sample, now including a real 6390-sample household corpus. Bumps the ruforecast submodule to pick up the evaluate real-gap fix. * docs(forecast): record real-household-data result (REJECT, signed) 6390 real vital-signs samples, two independent temporal splits, independently verified via the real Autogenous regression-candidate promotion path. Signed verdict: REJECT -- neither split cleared the non-inferiority margin. Same conclusion as every synthetic search this session, now confirmed with real data too: more real data is the credible next lever, not further search on this scale of fixture. * chore(forecast): point ruforecast submodule at published main (post gap-tolerance fix) * ci(forecast): fix ruforecast-ci.yml for the new v2/crates/ruforecast submodule layout The RuForecast crates were extracted into a standalone submodule (v2/crates/ruforecast, mirroring the existing v2/crates/worldgraph pattern) and are no longer members of the v2 workspace. The CI workflow still referenced the old in-tree package names/paths (ruview-forecast-core/model/train under v2/), which broke every forecast job with "cannot specify features for packages outside of workspace". Fixed every job to target the submodule: working-directory -> v2/crates/ruforecast, -p ruview-forecast-* -> -p ruforecast-*, all hardcoded Cargo.toml/source paths in the Python assertion and clean-room-scan blocks, the Swatinem/rust-cache workspaces input, the artifact-tree output paths, and the two levels of relative path (../ -> ../../) in the informational-benchmark steps whose working directory moved one level deeper. Also collapsed the paths: trigger filters internal-crate globs (v2/crates/ruview-forecast-*/**) down to the single v2/crates/ruforecast path, since GitHub Actions path filters only ever see a submodule gitlink change as one entry in the parent tree, never its internal file paths -- the old globs could never have matched anything. Includes a real cargo fmt fix (submodule commit d9902f9) for formatting drift left over from the earlier real-data gap-tolerance fix, which the contract job's fmt --check step would otherwise have failed on. All four forecast CI jobs' real commands verified locally before push: cargo test/check for CPU, CUDA/WGPU compile-check, the contract job's Python assertion block, the hosted-boundaries clean-room scan, and cargo fmt --check. * docs(forecast): record real BIDMC cross-entity holdout result (REJECT) Two independent real-patient partitions (34/16 and 24/26 splits, 53 total ICU patients from PhysioNet BIDMC, Open Data Commons Attribution License v1.0) both show the model losing to trivial baselines by a decisive margin (+69% and +601% worse WQL). First genuine cross-entity real-data test this project has run; same conclusion as every prior synthetic and single-household test. Full Autogenous signed verification was not run for this entry - flagged explicitly in the note. * chore(forecast): point ruforecast submodule at published main (example feature-gate fix) * chore(forecast): point ruforecast submodule at published main (clippy fix) --------- Signed-off-by: Codex <codex@openai.com>
26 KiB
RuView Forecast model card template
Template only. Do not publish or treat this file as a model release. Copy it for one immutable candidate, replace every
<REQUIRED>field, and retain every unresolved item as an explicit blocker. Deleting a placeholder does not satisfy it.
This template implements the model-card requirements in ADR-348 and the RuView Forecast clean-room protocol. It does not imply that source, training, evaluation, clean-room, security, privacy, trademark, patent, or production gates have passed.
Completion rules
- Create one card per exact weight digest. Do not reuse a card across retrains.
- Label every numeric claim
MEASURED,SYNTHETIC,CLAIMED, orUNMEASUREDunder the repository evidence policy. - A
MEASUREDvalue needs an immutable dataset/split, artifact digest, configuration, hardware/environment, metric definition, and reproducer. - Use
UNMEASUREDwhen evidence does not exist. Do not substitute an estimate. - State source-code, weight, dataset, and service terms separately.
- Do not publish raw CSI, customer data, precise room coordinates, identities, secrets, private contracts, or private contributor records in this card.
- A completed card documents evidence; it cannot waive an ADR-348 gate.
Suggested Hugging Face metadata
Copy and complete this front matter in the release card:
---
license: <REQUIRED exact weight-license identifier>
tags:
- time-series-forecasting
- multivariate-forecasting
- wifi-sensing
- rust
- ruvector
- probabilistic-forecasting
- edge-ai
language:
- en
library_name: burn
pipeline_tag: time-series-forecasting
---
license: other is acceptable only when the card links the complete exact
license. Do not infer the weight license from the Rust source license.
Candidate identity
Replace the template title with <REQUIRED model name and version> in the
release copy.
Release decision and evidence status
| Field | Required value |
|---|---|
| Release candidate ID | <REQUIRED> |
| Weight SHA-256 | <REQUIRED> |
| Git commit | <REQUIRED> |
| Model-card SHA-256 | <REQUIRED after finalization> |
| Proposed mode | OFFLINE_EVAL, SHADOW, or ADVISORY; <REQUIRED> |
| ADR-348 highest gate passed | G0 through G5, or NONE; <REQUIRED> |
| Accuracy status | UNMEASURED until a qualifying report exists; <REQUIRED> |
| Calibration status | UNMEASURED until a qualifying report exists; <REQUIRED> |
| CPU latency status | UNMEASURED until a named CPU reproducer exists; <REQUIRED> |
| Memory status | UNMEASURED until a named runtime reproducer exists; <REQUIRED> |
| Cross-site generalization status | UNMEASURED until untouched site holdouts exist; <REQUIRED> |
| Clean-room status | OPEN, PASS, or FAIL; <REQUIRED> |
| Production approval | NOT APPROVED unless all G5 receipts are signed; <REQUIRED> |
Release summary
<REQUIRED: State what this exact artifact does, what evidence exists, which mode is requested, and the most important unresolved limitation in no more than 150 words. Do not copy competitor marketing language.>
Model details
| Field | Value |
|---|---|
| Developer/owner | <REQUIRED> |
| Model family | RuView Forecast |
| Model version | <REQUIRED immutable version> |
| Artifact format | <REQUIRED, including RVF/safetensors/version> |
| Parameter count | <REQUIRED or UNMEASURED> |
| Numeric precision | <REQUIRED> |
| Architecture/config digest | <REQUIRED> |
| Input schema version | <REQUIRED> |
| Output schema version | <REQUIRED> |
| Maximum context | <REQUIRED with cadence and units> |
| Supported horizons | <REQUIRED with cadence and units> |
| Declared quantiles | <REQUIRED> |
| Training framework | <REQUIRED exact Rust crate/features/version> |
| Inference runtime | <REQUIRED exact Rust crate/features/version> |
| Source license | <REQUIRED SPDX expression> |
| Weight license | <REQUIRED exact license and URL> |
Rust implementation boundary
Describe the exact code surfaces used by this candidate:
| Crate or binary | Version/digest | Responsibility | Enabled features |
|---|---|---|---|
ruview-forecast-core |
<REQUIRED> |
Backend-neutral schemas, invariants, metrics, receipts, and Forecaster trait |
<REQUIRED; expected default only> |
ruview-forecast-model |
<REQUIRED> |
Independent Burn 0.21 patch mixer and artifact execution | <REQUIRED; CPU/CUDA/WGPU are opt-in and default off> |
ruview-forecast-train / ruforecast |
<REQUIRED> |
Dataset splits, trainer, evaluator, training receipt, and Linux/fal.ai assets | <REQUIRED> |
<optional service/runtime> |
<REQUIRED or NONE> |
<REQUIRED> |
<REQUIRED> |
State whether inference is offline and whether any runtime network capability exists. The expected production answer is no runtime model download and no network requirement:
<REQUIRED>
State whether a sensing-server bridge exists. For the initial ADR-348 PR the
required answer is NO: contracts/training only; a separately reviewed shadow bridge is deferred:
<REQUIRED>
Intended use
Approved candidate use
<REQUIRED: identify the exact RuView feature streams, deployment class, forecast horizons, mode, users, and decision support purpose.>
Out-of-scope and prohibited use
This artifact must not be used unless a later approved card explicitly changes the boundary:
- as a sensor observation or ground-truth label;
- as the sole source for medical, emergency, fall-response, industrial-safety, access-control, policing, insurance, employment, or autonomous-actuation decisions;
- to infer identity or protected characteristics;
- outside the feature schema, cadence, hardware, site, population, and horizon validated by this card;
- after calibration, feature schema, source provenance, or OOD checks fail;
- to train another model unless the weight, dataset, and output licenses and a new provenance review explicitly permit it;
- to claim TimesFM compatibility, affiliation, endorsement, or equivalence.
Add candidate-specific exclusions:
<REQUIRED>
Functional architecture
Describe independently implemented components without reproducing external source expression, diagrams, identifiers, or constants:
<REQUIRED: compact original diagram of feature windows, optional split-safe
retrieval, normalization, temporal/cross-stream model, quantile heads,
abstention, receipt, and policy boundary>
| Component | Candidate implementation | Security/resource bound |
|---|---|---|
| Feature validation | <REQUIRED> |
<REQUIRED> |
| Normalization | <REQUIRED> |
<REQUIRED> |
| Temporal encoding/mixing | <REQUIRED> |
<REQUIRED> |
| Cross-stream fusion | <REQUIRED> |
<REQUIRED> |
| Missing-data handling | <REQUIRED> |
<REQUIRED> |
| Point/quantile head | <REQUIRED> |
<REQUIRED> |
| Quantile crossing policy | <REQUIRED> |
<REQUIRED> |
| OOD/abstention | <REQUIRED> |
<REQUIRED> |
| RuVector retrieval | <REQUIRED or NONE> |
<REQUIRED> |
| Artifact verification | <REQUIRED> |
<REQUIRED> |
Input contract
Feature schema
| Field | Unit | Cadence/aggregation | Range | Missing/invalid semantics | Source provenance |
|---|---|---|---|---|---|
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
State:
- minimum and maximum context length;
- maximum targets, covariates, horizon, and batch;
- timestamp monotonicity and duplicate policy;
- whether any future-known covariate is permitted and how its authority is verified;
- finite/range checks and allocation limits;
- minimum validity coverage before abstention;
- treatment of cadence gaps, resets, device changes, and calibration changes;
- OOD input behaviour.
<REQUIRED>
Data not accepted
<REQUIRED: include raw/unbounded payloads, unknown schema, non-finite values, untrusted future covariates, stale data, unsupported cadence, and candidate specific exclusions.>
Output contract
| Output | Shape/unit | Meaning | Evidence class |
|---|---|---|---|
| Point forecast | <REQUIRED> |
<REQUIRED> |
DERIVED_FORECAST |
| Quantile forecast | <REQUIRED> |
<REQUIRED> |
DERIVED_FORECAST |
| Validity mask | <REQUIRED> |
<REQUIRED> |
DERIVED_METADATA |
| Abstention/disposition | <REQUIRED> |
<REQUIRED> |
DERIVED_METADATA |
| OOD score/state | <REQUIRED> |
<REQUIRED> |
DERIVED_METADATA |
| Receipt/provenance | <REQUIRED> |
<REQUIRED> |
SIGNED_METADATA if signed |
The output must bind model, configuration, input schema, calibration, source time range, optional retrieval index, and content hashes. Explain whether and how quantile crossing is corrected:
<REQUIRED>
RuVector retrieval
| Field | Value |
|---|---|
| Enabled | <REQUIRED true/false> |
| Index artifact/version/digest | <REQUIRED or NONE> |
| Allowed retrieval corpus | <REQUIRED> |
| Split-isolation receipt | <REQUIRED> |
| Neighbour exclusion rules | <REQUIRED> |
| Maximum neighbours/search budget | <REQUIRED> |
| Behaviour when index is absent/stale | <REQUIRED> |
Report identical-dataset ablations for no retrieval and retrieval. If these do
not exist, state UNMEASURED.
RuVLLM integration
State whether RuVLLM consumes this artifact's signed forecast records. It may explain results but must not rewrite point/quantile values or acquire action authority from prose.
| Control | Evidence |
|---|---|
| Numeric outputs originate only from signed forecast record | <REQUIRED or NOT INTEGRATED> |
| Explanation cites artifact and forecast receipt | <REQUIRED or NOT INTEGRATED> |
| No model promotion, spending, actuation, or safety-critical authority | <REQUIRED or NOT INTEGRATED> |
| Prompt/data retention and tenant policy | <REQUIRED or NOT INTEGRATED> |
Independent-development record
| Record | Digest/approval |
|---|---|
| Approved source allowlist | <REQUIRED> |
| Specification digest | <REQUIRED> |
| Contributor exposure manifest | <REQUIRED> |
| Contributor attestation bundle | <REQUIRED> |
| AI-tool prompt/session manifest | <REQUIRED> |
| Prohibited-artifact scan | <REQUIRED> |
| Source-similarity review | <REQUIRED> |
| Clean-room custodian approval | <REQUIRED> |
| Legal release approval | <REQUIRED for production> |
Declaration:
<REQUIRED: State exactly what was independently authored and trained. Do not state that clean room eliminates patent, trademark, dataset, privacy, or jurisdiction risk.>
Prior exposure disclosures and dispositions, without private details:
<REQUIRED or NONE>
Training data
Do not list a dataset until its licensing/privacy gate passes.
| Dataset ID/version | Role | Origin/owner | License or contract ID | Commercial ML | Privacy class | Records/windows | Source/transform/split digests |
|---|---|---|---|---|---|---|---|
<REQUIRED> |
train/validation/calibration | <REQUIRED> |
<REQUIRED> |
YES required |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
Excluded data
Explicitly state that TimesFM 3 weights, outputs, activations, generated labels, and derivatives were excluded, then list all other exclusions:
<REQUIRED>
Collection, consent, minimization, and retention
<REQUIRED: collection authority, purpose, consent/contract, controller and processor, sensitive inferences, pseudonymization, fields removed, geographic scope, retention, deletion, access, and incident contact.>
Synthetic data
| Generator/version | Seed-data rights | Provider/output terms | Seeds/config digest | Proportion | Use |
|---|---|---|---|---|---|
<REQUIRED or NONE> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
Split and leakage protocol
| Split | Sites | Subjects | Sessions | Devices | Time blocks | Windows | Manifest digest |
|---|---|---|---|---|---|---|---|
| Train | <REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Validation | <REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Calibration | <REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Test | <REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
Required leakage checks:
- parent raw record and derived-window overlap;
- contiguous sequence/session overlap;
- subject/site/device/calibration leakage;
- target-horizon overlap;
- fitted preprocessing or threshold leakage;
- RuVector neighbour/index leakage;
- duplicate and near-duplicate leakage;
- test-informed architecture or hyperparameter changes.
Report and digest:
<REQUIRED>
Training procedure
| Field | Value |
|---|---|
| Random initialization | true required for this model family |
| Parent checkpoint | NONE or approved RuView artifact and digest |
| Source commit | <REQUIRED> |
| Cargo.lock digest | <REQUIRED> |
| Rust toolchain | <REQUIRED exact> |
| Build/training container | <REQUIRED digest> |
| Training config digest | <REQUIRED> |
| Seeds | <REQUIRED> |
| Optimizer/schedule/loss | <REQUIRED> |
| Batch/epochs/stopping | <REQUIRED> |
| Hardware | <REQUIRED exact CPU/GPU/RAM> |
| Provider | <REQUIRED local Linux or approved provider> |
| Provider job ID | <REQUIRED non-secret identifier> |
| Wall time | <REQUIRED and evidence label> |
| Peak host/GPU memory | <REQUIRED and evidence label> |
| Estimated/actual cost | <REQUIRED and evidence label> |
| Emitted checkpoint digests | <REQUIRED> |
| Training receipt digest | <REQUIRED> |
If local and hosted runs are compared, list numerical-determinism differences and prove that governed code, data, config, and parent identities match:
<REQUIRED or NOT APPLICABLE>
Evaluation
Baselines and ablations
Every row uses the same frozen examples and metric implementation.
| Model | Artifact/version | Retrieval | Parameters | Evidence label | Notes |
|---|---|---|---|---|---|
| Last value | <REQUIRED> |
no | n/a | <REQUIRED> |
deterministic baseline |
| Seasonal naive | <REQUIRED> |
no | n/a | <REQUIRED> |
<REQUIRED period> |
| Small classical/recurrent baseline | <REQUIRED> |
no | <REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| RuView Forecast | <REQUIRED> |
no | <REQUIRED> |
<REQUIRED> |
required ablation |
| RuView Forecast | <REQUIRED> |
yes | <REQUIRED> |
<REQUIRED> |
required if retrieval is enabled |
Do not use TimesFM 3 as an implementation oracle, label source, tuning signal, or required acceptance baseline.
Forecast metrics
Report per horizon and per site/device/interference regime, plus pooled values.
| Metric/domain/horizon | Result | 95% interval | Evidence label | Reproducer |
|---|---|---|---|---|
| Weighted quantile loss | <REQUIRED or UNMEASURED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| MAE or scaled error | <REQUIRED or UNMEASURED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Nominal 80% interval coverage | <REQUIRED or UNMEASURED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Interval width | <REQUIRED or UNMEASURED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Quantile crossing before/after policy | <REQUIRED or UNMEASURED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Abstention coverage/selective risk | <REQUIRED or UNMEASURED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
ADR-348 G3 targets are at least 10% weighted-quantile-loss improvement over
seasonal naive and 75%-85% measured coverage for a nominal 80% interval. These
remain UNMEASURED targets until populated by qualifying evidence.
RuView shadow outcomes
| Metric | Baseline | Candidate | Delta/CI | Evidence label | Reproducer |
|---|---|---|---|---|---|
| Empty-room false alerts | <REQUIRED or UNMEASURED> |
<REQUIRED or UNMEASURED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Occupied-room recall | <REQUIRED or UNMEASURED> |
<REQUIRED or UNMEASURED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Abstention by deployment | <REQUIRED or UNMEASURED> |
<REQUIRED or UNMEASURED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Drift/OOD rate | <REQUIRED or UNMEASURED> |
<REQUIRED or UNMEASURED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
ADR-348 G4 targets at least 50% relative empty-room false-alert reduction with
no more than 2 percentage points occupied-room recall loss over at least 14
shadow days. These are UNMEASURED targets, not current capabilities.
Runtime measurements
| Platform | Build/features | Batch/streams | Context/horizon | p50/p95/p99 | Peak RSS | Evidence label | Reproducer |
|---|---|---|---|---|---|---|---|
<REQUIRED named CPU> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED or UNMEASURED> |
<REQUIRED or UNMEASURED> |
<REQUIRED> |
<REQUIRED> |
<optional GPU> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED or UNMEASURED> |
<REQUIRED or UNMEASURED> |
<REQUIRED> |
<REQUIRED> |
ADR-348 G5 CPU targets are at most 1 second p95 for 32 declared streams and at
most 4 GiB peak process memory. They are UNMEASURED targets until this table
contains a qualifying named-platform reproducer.
Calibration, OOD, and abstention
| Control | Fit data | Frozen parameters/digest | Test result | Evidence label |
|---|---|---|---|---|
| Input normalization | <REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Quantile calibration | <REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| OOD threshold | <REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Minimum validity/context | <REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Drift threshold | <REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
List all typed abstention reasons and demonstrate that unknown schema, missing calibration, stale data, insufficient history, invalid masks, non-finite input, OOD state, and artifact failure do not produce an authoritative forecast:
<REQUIRED>
Robustness and failure analysis
Report at minimum:
- unseen site and unseen device;
- empty room and low-motion occupancy;
- burst loss, cadence change, clock reset, and sensor restart;
- interference, channel change, and calibration drift;
- long missing runs and adversarial non-finite/range inputs;
- corrupted/truncated/oversized model and input artifacts;
- absent or stale RuVector index;
- concurrent-load resource caps and timeout;
- false confidence from narrow intervals during distribution shift.
| Scenario | Expected safe behaviour | Observed result | Evidence label | Open risk/owner |
|---|---|---|---|---|
<REQUIRED> |
<REQUIRED> |
<REQUIRED or UNMEASURED> |
<REQUIRED> |
<REQUIRED> |
Security and privacy
Threat model summary
| Threat | Control | Evidence | Residual risk/owner |
|---|---|---|---|
| Malicious/corrupt model artifact | Signature, digest, schema and size verification; no embedded code | <REQUIRED> |
<REQUIRED> |
| Oversized/malformed request | Dimension, allocation, horizon, context, batch and deadline caps | <REQUIRED> |
<REQUIRED> |
| Poisoned data or split leakage | Approved manifests, immutable transforms, lineage and overlap checks | <REQUIRED> |
<REQUIRED> |
| Cross-tenant analogue retrieval | Tenant and split-scoped RuVector indexes | <REQUIRED> |
<REQUIRED> |
| Routine/location inference | Minimization, purpose, retention, deletion, access and audit | <REQUIRED> |
<REQUIRED> |
| Model extraction/membership inference | Rate/access control and privacy evaluation | <REQUIRED> |
<REQUIRED> |
| Hosted-worker data retention | Approved provider terms, least data, deletion receipt | <REQUIRED> |
<REQUIRED> |
| LLM numeric mutation or overclaim | Signed numeric record and capability policy | <REQUIRED or NOT INTEGRATED> |
<REQUIRED> |
Data handling
<REQUIRED: tenant isolation, encryption, keys, access roles, logs, metrics allowlist, retention, deletion, export, incident handling, and whether feature or forecast persistence is enabled.>
Deployment
| Field | Value |
|---|---|
| Supported mode | <REQUIRED> |
| Supported platform/CPU/GPU | <REQUIRED> |
| Minimum RAM/storage | <REQUIRED and evidence-labelled> |
| Offline artifact source | <REQUIRED> |
| Signature/trust root | <REQUIRED public key ID> |
| Configuration/calibration artifact | <REQUIRED digest> |
| RuVector index requirement | <REQUIRED> |
| Startup self-test | <REQUIRED> |
| Health/drift metrics | <REQUIRED allowlisted fields> |
| Timeout/backpressure policy | <REQUIRED> |
| Rollback artifact/mode | <REQUIRED> |
No deployment may fetch an unpinned model at runtime. Describe exact startup failure and fail-closed behaviour:
<REQUIRED>
Monitoring, rollback, and retirement
| Signal | Threshold | Window | Response | Owner |
|---|---|---|---|---|
| Calibration/coverage drift | <REQUIRED> |
<REQUIRED> |
shadow/off | <REQUIRED> |
| OOD/abstention rate | <REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Latency/resource regression | <REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Empty/occupied outcome regression | <REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Provenance/signature failure | any | immediate | disable artifact | <REQUIRED> |
| Security/privacy incident | any material incident | immediate | isolate, preserve evidence, disable | <REQUIRED> |
Rollback drill receipt and result:
<REQUIRED>
Retirement and data/index/checkpoint deletion policy:
<REQUIRED>
Limitations and largest uncertainty
<REQUIRED: List observed and unmeasured limitations. The default largest uncertainty is whether training diversity supports unseen-room and unseen-device generalization without suppressing legitimate occupied states. State the specific data/evaluation fix path.>
Cost, energy, and operational burden
| Item | Value | Evidence label | Method |
|---|---|---|---|
| Training accelerator hours | <REQUIRED or UNMEASURED> |
<REQUIRED> |
<REQUIRED> |
| Training cost | <REQUIRED or UNMEASURED> |
<REQUIRED> |
<REQUIRED> |
| Training energy/emissions | <REQUIRED or UNMEASURED> |
<REQUIRED> |
<REQUIRED> |
| CPU inference cost/energy | <REQUIRED or UNMEASURED> |
<REQUIRED> |
<REQUIRED> |
| Storage/index overhead | <REQUIRED or UNMEASURED> |
<REQUIRED> |
<REQUIRED> |
| Operator/calibration burden | <REQUIRED or UNMEASURED> |
<REQUIRED> |
<REQUIRED> |
Licenses and notices
| Surface | Exact license/terms | URL/file | Obligations | Approval |
|---|---|---|---|---|
| Rust source | <REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Weights | <REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Each dataset | <REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Dependencies/SBOM | <REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Training provider | <REQUIRED> |
<REQUIRED> |
<REQUIRED> |
<REQUIRED> |
Trademark clearance ID and scope:
<REQUIRED for public production release>
Patent freedom-to-operate disposition and launch jurisdictions:
<REQUIRED for production; keep privileged analysis outside this public card>
Provenance and reproducibility
| Artifact | Digest/signature/location |
|---|---|
| Source allowlist | <REQUIRED> |
| Specification | <REQUIRED> |
| Source commit | <REQUIRED> |
| Cargo.lock | <REQUIRED> |
| SBOM | <REQUIRED> |
| Dataset manifest | <REQUIRED> |
| Split/leakage report | <REQUIRED> |
| Training config | <REQUIRED> |
| Training receipt | <REQUIRED> |
| Evaluation report | <REQUIRED> |
| Clean-room report | <REQUIRED> |
| Model weights | <REQUIRED> |
| RVF signature | <REQUIRED or NONE with blocker> |
| Reproducer | <REQUIRED> |
Reproduction commands must use pinned artifacts and must not contain secrets or download restricted material:
<REQUIRED safe, exact commands>
ADR-348 gate traceability
| Gate | Requirements | Evidence in this card/bundle | Result |
|---|---|---|---|
| G0 independent-authoring boundary | RF-001, RF-002 | allowlist, exposure, attestation, scans, similarity review | <OPEN, PASS, or FAIL> |
| G1 data and lineage | RF-002, RF-003, RF-010 | dataset approvals, lineage, local/hosted receipts | <OPEN, PASS, or FAIL> |
| G2 bounded Rust contract | RF-004, RF-005, RF-006 | contract/fuzz/replay/resource/dependency reports | <OPEN, PASS, or FAIL> |
| G3 leakage-free model evidence | RF-007, RF-008, RF-011 | frozen split, baselines, ablations, calibration, reproducers | <OPEN, PASS, or FAIL> |
| G4 RuView shadow value | RF-006, RF-007, RF-008, RF-009 | 14-day outcomes, drift, abstention, no action authority | <OPEN, PASS, or FAIL> |
| G5 deployment fitness | RF-004, RF-009, RF-010, RF-011, RF-012 | runtime, approvals, signed bundle, rollback | <OPEN, PASS, or FAIL> |
Highest permitted deployment mode from these results:
<REQUIRED>
Approvals
Signatures cover this exact model-card digest and weight digest.
| Role | Approver/receipt | Decision | Timestamp |
|---|---|---|---|
| Model owner | <REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Clean-room custodian | <REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Data steward/privacy | <REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Security owner | <REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Runtime owner | <REQUIRED> |
<REQUIRED> |
<REQUIRED> |
| Legal release owner | <REQUIRED for production> |
<REQUIRED> |
<REQUIRED> |
Citation
Use the final public model name, exact version, weight digest, repository commit, and model-card URL:
@software{<REQUIRED citation key>,
title = {<REQUIRED>},
author = {<REQUIRED>},
year = {<REQUIRED>},
version = {<REQUIRED>},
url = {<REQUIRED>},
note = {Weights SHA-256: <REQUIRED>; source commit: <REQUIRED>}
}
Change history
| Card version | Weight digest | Change | Gate impact | Date |
|---|---|---|---|---|
<REQUIRED> |
<REQUIRED> |
Initial candidate | All gates evaluated independently | <REQUIRED> |