Files
RuView/docs/security/ruview-forecast-clean-room.md
rUv e5bf0d4892 feat(forecast): add independent Rust multivariate training stack (#1766)
* 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>
2026-09-01 23:35:42 -04:00

26 KiB

RuView Forecast clean-room, data, and release protocol

Status: Proposed and mandatory for any artifact claiming independent development under ADR-348.

Evidence status: This document defines controls. It does not assert that the controls have passed, that a trained model exists, or that any forecasting capability is measured. Every ADR-348 gate remains OPEN / UNMEASURED until a signed evidence bundle proves otherwise.

1. Purpose and authority

This protocol governs the specification, implementation, training, evaluation, hosting, and release of the independent Rust multivariate forecaster defined by ADR-348. It applies to source, issue and review text, prompts, dependencies, datasets, intermediate tensors, checkpoints, containers, CI caches, RuVector indexes, fal.ai jobs, benchmark results, model cards, and published artifacts.

The protocol is intentionally stricter than the minimum conditions for using Apache-licensed source. Its purpose is to preserve evidence that the RuView implementation and weights were independently created. It is not a legal opinion. The legal release owner must approve the current licenses, contributor exposure record, patent review, trademark review, datasets, and intended launch jurisdictions before production.

2. License boundary as of 2026-09-01

The authoritative public materials state two different license surfaces:

  1. The Google TimesFM repository identifies its source code as Apache-2.0.
  2. The TimesFM 3 checkpoint license permits non-commercial, non-production use and restricts commercial use, distribution, and use to train, fine-tune, or distill another commercial model.

The checkpoint license defines a derivative broadly enough that relying on its logic, parameters, or model-generated material creates avoidable contractual risk. No contributor may accept gated model terms on behalf of the project or its owner without written authorization.

The Apache License 2.0 permits source reproduction and derivative works subject to its conditions, including license delivery, change notices, retention of applicable notices, and NOTICE handling. Apache also provides a limited contributor patent grant and no general trademark grant. If maintainers ever choose an Apache-derived port, it must use a separate branch, attribution path, artifact name, and superseding ADR. It must not be described as the clean-room implementation.

Publicly described ideas, procedures, processes, systems, and methods are not the same as copied expression. United States copyright law states the idea-expression boundary in 17 U.S.C. section 102(b). That does not settle contract, patent, trademark, database-right, trade-secret, or non-U.S. law questions.

3. Non-mixing rule

Only one of these paths may govern a source tree:

Path Source basis Required representation
Independent implementation Approved abstract specification, public papers/articles, general literature, RuView requirements, approved data "Independently developed and independently trained" after all gates pass
Apache-derived port Apache-licensed Google source with full license and notice compliance "Apache-derived Rust port" with attribution

There is no hybrid path. A permissive source license makes porting possible; it does not make a port independent. If exposure cannot be bounded, maintainers must either quarantine and rewrite the affected component or reclassify the whole affected component under the Apache-derived path.

4. Roles and separation

Role May access Must not access or do
Clean-room custodian Exposure records, allowlist, scan reports, quarantined evidence Contribute core model implementation after reviewing prohibited source fragments
Specification reviewer Frozen public-paper/article allowlist, RuView requirements, generic literature Google TimesFM implementation, tests, configs, checkpoint files, model outputs; contribute implementation
Rust implementer Approved independent specification, RuView schemas, approved generic dependencies TimesFM source, tests, configs, weights, outputs, line-by-line/API translation, reference differential testing
Data steward Dataset source, contracts, consent, privacy and transformation records Approve unknown or incompatible rights; infer that a software license covers data
Training operator Signed code/container/config and approved dataset manifests Change code/data/config outside a new receipt; add an unapproved parent checkpoint
Independent evaluator Frozen candidate, frozen evaluation manifests, approved baselines Return reference predictions or implementation hints to developers; tune against the test set
Legal release owner Complete evidence bundle and private legal analysis Treat clean-room checks as patent clearance or dataset approval by implication

One person may hold multiple roles only where the forbidden-access rules remain true. The strongest separation uses different people for public specification and implementation. A specification reviewer who has inspected prohibited source cannot become a core implementer for the independent path.

5. Source classification

5.1 Allowed

  • The public TimesFM research articles and peer-reviewed papers, frozen by URL, retrieval date, and SHA-256 digest.
  • General time-series, transformer, probabilistic forecasting, normalization, missing-data, and calibration literature.
  • RuView requirements, independently written feature schemas, and existing RuView contracts whose provenance already satisfies repository policy.
  • Generic Rust dependencies whose license, source, and purpose are recorded and approved.
  • Public benchmark specifications and datasets after the dataset gate passes.
  • Published aggregate competitor results used only as contextual background.

5.2 Conditional

  • Code implementing generic algorithms may be used only after license review and must be declared as a dependency or attributed source. It cannot be used to claim that every line was independently authored.
  • TimesFM versions up to 2.5 may have permissively licensed code or weights, but they remain outside the independent implementation and training path. An evaluator may use an approved permissive baseline only after the candidate is frozen, and its output cannot become training data or implementation feedback.
  • A contributor with prior exposure to TimesFM code must disclose the exact material and date. The custodian and legal owner decide whether the person is limited to non-implementation work or the affected component must be reclassified.
  • Synthetic data is allowed only when source data, generator code/model, provider terms, output rights, and intended commercial use all pass review.

5.3 Prohibited

  • TimesFM 3 weights, parameters, checkpoints, tensor dumps, checkpoint configuration, hidden activations, embeddings, gradients, or derived fingerprints.
  • TimesFM 3 forecasts, quantiles, scores, probabilities, recommendations, or synthetic labels in development, training, tuning, or release evidence.
  • Fine-tuning, distillation, imitation, teacher-student learning, differential testing, behavioural cloning, or hyperparameter search against TimesFM 3.
  • Manual, mechanical, or AI-assisted translation of Google source, tests, comments, constants, APIs, file layout, or diagrams.
  • Third-party code, datasets, or checkpoints whose origin may contain copied or distilled TimesFM material without documented permission.
  • Model, dataset, or service terms labelled non-commercial, research-only, evaluation-only, no-derivatives, no-ML, no-production, or unknown.
  • Confidential third-party information or material obtained under an agreement that does not authorize this implementation and commercial use.

6. Exposure intake and contributor attestation

Before receiving implementation access, every contributor completes an exposure intake covering:

  • TimesFM repositories, model cards, gated checkpoint files, local caches, notebooks, issues, tutorials, and generated outputs viewed or downloaded;
  • whether gated terms were accepted and for which individual or entity;
  • source or output material placed in an LLM, IDE assistant, retrieval index, prompt, or code-generation session;
  • prior work for Google, a competitor, customer, or other party involving confidential forecasting implementation;
  • datasets, pretrained models, and external code expected in the contribution.

Each pull request also carries a signed attestation:

RuView Forecast clean-room attestation v1

Contributor:
Employer or represented entity:
Role:
Covered commits:
Prior TimesFM exposure: NONE or complete disclosure
Approved sources used:
Datasets introduced:
AI tools used:
Prompt/session manifest digest:

I attest that the covered contribution was created from the approved
specification and listed sources. I did not access, copy, translate, decompile,
query, distill, or use TimesFM 3 implementation material, configuration,
weights, parameters, outputs, or internal representations. I did not place
prohibited material in an AI tool context. I disclosed all contrary facts
above. Every dependency and dataset I introduced has documented rights for its
stated use.

Signature:
Timestamp:

A DCO Signed-off-by line does not replace this attestation. The attestation digest, not private identity material, is referenced from the public release manifest.

7. Specification controls

The custodian freezes an allowlist before implementation begins. Every entry records title, canonical URL or DOI, publication date, retrieval time, content digest, license or access terms, reviewer, and the abstract requirement it supports.

The specification may state mathematical functions, tensor roles, input/output invariants, resource bounds, and RuView-specific requirements. It must not include copied source, comments, tests, distinctive identifiers, constants, checkpoint dimensions extracted from files, API compatibility requirements, or Google diagrams. RuView API names must be derived from the local domain.

Changes to the specification after test evaluation receive a new version and must not encode held-out answers. A material architecture revision consumes a new untouched holdout or remains labelled exploratory.

8. AI coding-tool controls

An AI assistant can unintentionally defeat source separation by retrieving or reproducing reference code. For sessions contributing implementation:

  1. Disable web retrieval and repository indexing outside the approved local tree where the tool supports it.
  2. If a user describes the goal as a port, clone, reproduction, or emulation, stop and restate the task as independently authored RuView functional requirements. Record that wording in the exposure manifest; do not use it as permission to retrieve reference implementation material or pursue behavioral equivalence.
  3. Do not attach Google code, checkpoint metadata, outputs, screenshots, or detailed third-party implementation summaries.
  4. State the independent specification and prohibited-source boundary in the session instructions.
  5. Retain a bounded prompt and tool-source manifest digest without committing raw private transcripts.
  6. Record the model/tool version and whether retrieval was enabled.
  7. Treat unexplained code that resembles a prohibited implementation as an incident, not as a harmless generated suggestion.

AI-generated code receives the same authorship, license, security, and similarity review as human-authored code.

9. Dataset licensing and privacy gate

No dataset enters preprocessing, a RuVector index, training, calibration, or evaluation until a data steward records affirmative answers to every applicable gate:

Gate Required evidence Automatic rejection examples
Origin Named owner/provider, acquisition method, immutable source digest Scrape or file of unknown origin
Training rights Written right to use for ML training and the intended commercial purpose Research-only, NC, no-ML, evaluation-only
Derivatives Right to transform, derive windows/features, and create model artifacts No-derivatives or ambiguous custom terms
Redistribution Whether raw, transformed, manifests, and weights may be redistributed separately Assumption that public access means redistribution
Attribution Exact attribution and notice obligations Missing author/source/version
Database rights Jurisdiction and database-right review where applicable Unreviewed EU database extraction
Consent and contract Collection authority, participant/customer consent, purpose, controller/processor roles Customer telemetry without explicit model-training authority
Sensitive inference Classification of occupancy, routines, location, health-adjacent and biometric implications Unbounded identity or health inference
Minimization Required fields only, pseudonymization, retention and deletion schedule Raw CSI/person identifiers retained without need
Split integrity Site/subject/session/device/time-block lineage and overlap report Contiguous or derived-window leakage across splits
Synthetic lineage Generator, seed data, service terms, output rights, seeds/config digest Restricted teacher or prohibited source data

Typical disposition guidance:

  • Owned data, CC0/public-domain data, and data under an explicit commercial ML contract may pass after privacy and provenance review.
  • CC BY data requires attribution plus database and downstream-weight review.
  • MIT and Apache are software licenses and do not automatically license nearby data.
  • NC, ND, research-only, evaluation-only, no-ML, no-production, and unknown terms fail unless a separate written commercial grant is obtained.

Every transform is content-addressed. Normalizers, feature selectors, calibrators, thresholds, and RuVector indexes fit training data only. Raw sequence overlap and derived-window overlap are both checked. A parent record in one split makes all overlapping descendants ineligible for another split.

10. Hosted training boundary

The Linux machine and fal.ai are execution environments, not sources of authority. A hosted job is accepted only when:

  • the exact source commit, Cargo lockfile, compiler, container digest, data manifests, configuration, seeds, and parent checkpoint digest are signed before upload;
  • provider terms, retention, region, subprocessors, logs, cache deletion, confidentiality, output ownership, and provider-training reuse have been reviewed for the data classification;
  • credentials are short-lived, least-privilege, excluded from images and logs, and rotated after suspected exposure;
  • customer-derived data is not uploaded before controller/processor and transfer requirements pass;
  • emitted checkpoints and logs are hashed immediately and compared with the job receipt;
  • the downloaded artifact is scanned before entering the trusted release boundary;
  • a hosted provider cannot promote, sign, or activate a model.

Hosted and local runs are comparable only when their governed input identities match. Numerical nondeterminism must be documented; it does not permit an unrecorded dependency, data, or configuration change.

11. Provenance manifest

The release bundle contains a machine-readable manifest with at least:

schema_version: <required>
artifact:
  id: <required>
  version: <required>
  git_commit: <sha>
  source_spec_digest: <sha256>
  cargo_lock_digest: <sha256>
  rust_toolchain: <exact>
  target_triple: <exact>
  build_container_digest: <digest>
  sbom_digest: <sha256>

contributors:
  - pseudonymous_id: <stable id>
    role: <role>
    exposure_class: <unexposed|disclosed-reviewed>
    attestation_digest: <sha256>
    signed_at: <rfc3339>

references:
  - title: <title>
    canonical_uri: <url-or-doi>
    publication_date: <date>
    retrieved_at: <rfc3339>
    content_digest: <sha256>
    license_or_terms: <identifier>
    allowed_use: <purpose>
    reviewer: <id>

datasets:
  - dataset_id: <id>
    version: <version>
    owner: <owner>
    origin: <uri-or-contract-id>
    license_or_contract: <identifier>
    commercial_ml_allowed: <true>
    redistribution_allowed: <true|false>
    consent_basis: <identifier>
    privacy_class: <class>
    jurisdictions: [<jurisdiction>]
    retention_policy: <policy-id>
    source_digest: <sha256-or-merkle-root>
    transform_digest: <sha256>
    split_digest: <sha256>
    record_count: <count>

training:
  random_initialization: true
  parent_checkpoint: null
  code_commit: <sha>
  config_digest: <sha256>
  rng_seeds: [<seed>]
  hardware: <inventory>
  provider: <local-linux|approved-provider>
  provider_job_id: <non-secret-id>
  environment_digest: <sha256>
  started_at: <rfc3339>
  ended_at: <rfc3339>
  forbidden_artifact_scan_digest: <sha256>
  leakage_scan_digest: <sha256>

evaluation:
  frozen_manifest_digest: <sha256>
  baseline_artifacts: [<id-and-digest>]
  metric_schema: <version>
  report_digest: <sha256>
  calibration_report_digest: <sha256>
  domain_holdouts: [<site|subject|session|device>]

release:
  weights_digest: <sha256>
  model_card_digest: <sha256>
  clean_room_report_digest: <sha256>
  signature_key_id: <public-key-id>
  rvf_signature: <signature>
  source_license: <spdx-expression>
  weights_license: <exact-identifier>
  data_steward_approval: <signed-receipt>
  security_approval: <signed-receipt>
  legal_approval: <signed-receipt>

Secrets, raw personal identifiers, contract text, raw customer data, and private contributor identities stay outside the public manifest. The manifest references controlled records by digest or approval ID.

12. Source, dependency, and artifact checks

The custodian records tool versions, rules, timestamps, and complete findings. At minimum:

  • search the working tree and Git history for prohibited model IDs, URLs, filenames, license strings, binary signatures, and unexpected large files;
  • scan source similarity against the prohibited implementation in an isolated custodian environment; implementation contributors do not receive reference fragments from the report;
  • manually adjudicate every material similarity match and record independent origin, generic necessity, rewrite, or reclassification;
  • run dependency license, source, duplicate-version, and vulnerability policy checks and generate a CycloneDX or SPDX SBOM;
  • inspect container layers, CI and provider caches, mounted volumes, model/data buckets, notebooks, logs, and local tool indexes for restricted artifacts;
  • verify that every checkpoint parent is an approved RuView artifact or the declared random initialization;
  • verify that model loading performs no network access and accepts no embedded executable operator or arbitrary path;
  • verify that public packages, endpoints, docs, and metadata do not use Google trademarks as a product identity.

Keyword scans are a tripwire, not proof of independence. References in this governance document are expected and must be path allowlisted. The final result depends on provenance, exposure records, review, and the absence of prohibited material in implementation/training paths.

13. Model card and claim gate

Every candidate copies and completes ../huggingface/RUVIEW_FORECAST_MODEL_CARD_TEMPLATE.md. No placeholder, UNMEASURED, unknown license, missing digest, or missing approval may be silently deleted. It must instead be resolved or retained as an explicit release blocker.

All accuracy, latency, memory, power, cost, and generalization values are labelled MEASURED, SYNTHETIC, CLAIMED, or UNMEASURED under repository policy. MEASURED requires a reproducer, immutable inputs, exact artifact, and named hardware/environment. A model-card benchmark does not create authority for a medical, emergency, security, or autonomous-action claim.

14. Naming, trademark, and comparative statements

Approved project identities include RuView Forecast and crate names derived from the RuView domain. Do not use TimesFM, Google, or a confusingly similar mark in crate names, binaries, model slugs, endpoints, logos, icons, or product headlines. Do not copy diagrams or visual branding.

Comparative documentation may accurately identify an external model and its version when necessary, with a statement that RuView Forecast is independently developed and not affiliated with or endorsed by Google. Comparative claims need identical datasets, metric definitions, permitted model use, and evidence labels.

Before public naming or commercial release, complete a professional trademark clearance that includes federal, state, common-law, domain, and relevant international sources. The USPTO clearance guidance is a starting point, not a complete legal opinion.

15. Residual patent and jurisdiction risk

Clean-room evidence does not prevent patent infringement. Before production, patent counsel performs a claim-level freedom-to-operate review covering at least temporal patching, multivariate/variate attention or mixing, masked horizon prediction, known-future covariates, probabilistic heads, normalization, retrieval augmentation, and relevant training procedures. Searches include assignees, inventors, continuations, unpublished timing uncertainty, and launch jurisdictions. The USPTO Patent Public Search supports preliminary searching but is not a freedom-to-operate opinion.

The Apache patent grant applies only within its stated scope. An independent implementation must not assume it inherits that grant. Public papers may be prior art yet still coexist with earlier, pending, territorial, or narrower claims.

16. Contamination incident response

Treat any prohibited source, output, model, data, or unreviewed exposure as a provenance incident:

  1. Stop affected implementation, training, evaluation feedback, and release.
  2. Preserve hashes, timestamps, actors, locations, access records, and affected lineage. Do not erase the audit trail.
  3. Quarantine the material and revoke it from build, data, model, cache, and retrieval paths.
  4. Identify every affected commit, specification revision, dataset transform, RuVector index, checkpoint, benchmark, and descendant artifact.
  5. Rotate credentials if a provider, cache, or secret may be exposed.
  6. Have the custodian and legal owner choose one disposition: proven non-impact, clean rewrite by unexposed contributors, full retraining from the last clean ancestor, or explicit Apache-derived reclassification.
  7. Repeat all affected ADR-348 gates and record the incident and closure receipts.

If prohibited output becomes a label or tuning signal, all descendant weights are affected. Code deletion alone cannot repair model lineage; retraining from an approved clean initialization is required.

17. Requirement-mapped acceptance checklist

Check ADR-348 requirements Gate Acceptance condition
CR-01 source allowlist RF-001, RF-002 G0 100% of specification sources frozen, hashed, licensed/termed, and approved
CR-02 contributor exposure RF-001, RF-002 G0 100% of contributors have current intake and signed attestation; every disclosure has a disposition
CR-03 prohibited-artifact scan RF-001 G0 Zero unresolved prohibited artifacts or outputs across source, history, caches, containers, jobs, data, indexes, and checkpoints
CR-04 similarity review RF-001, RF-002 G0 Every material match adjudicated without exposing implementers to reference fragments
CR-05 dependency/SBOM RF-002, RF-004 G1, G2 Zero unknown or denied dependency licenses; vulnerability policy passes; signed SBOM exists
CR-06 dataset rights RF-003 G1 100% of bytes map to approved manifests; zero NC, ND, research-only, no-ML, no-production, or unknown terms
CR-07 privacy RF-003, RF-009 G1, G5 Consent/contract, minimization, tenant, retention, deletion, transfer, and sensitive-inference review approved
CR-08 checkpoint lineage RF-001, RF-002, RF-010 G1 Every checkpoint reaches approved random initialization with no prohibited parent or label
CR-09 split isolation RF-007, RF-008 G3 Zero raw/derived overlap across frozen site/subject/session/device/time splits; split-scoped RuVector indexes verified
CR-10 hosted parity RF-010 G1, G5 Local/hosted receipts bind identical governed inputs; provider terms and deletion evidence approved
CR-11 model card RF-002, RF-007, RF-011 G3-G5 Template complete; every value evidence-labelled and reproducible; all blockers explicit
CR-12 trademark and patent RF-001, RF-011 G5 Naming clearance and claim-level freedom-to-operate disposition signed for launch jurisdictions
CR-13 rollback RF-012 G5 Contamination and runtime rollback drills preserve observations and evidence while disabling forecast authority
CR-14 bounded forecast contract RF-004, RF-005, RF-006 G2 Property/fuzz/replay evidence proves finite bounded inputs, abstention, offline execution, immutable observation linkage, and derived-only evidence labels
CR-15 downstream authority RF-006, RF-009, RF-012 G4, G5 No sensing-server hook in the initial PR; any later bridge proves forecast/LLM output cannot mutate observations or acquire prohibited action authority
CR-16 claims and rollout RF-011, RF-012 G3-G5 Every claim has an allowed evidence label and reproducer; mode transitions cannot outrun the highest passed gate

Any failed or missing check blocks the mapped gate. A maintainer waiver cannot convert a prohibited license into permission or an unmeasured capability into a measured claim.

18. Release record

The legal, data, security, model, and runtime owners sign the same immutable release digest. Their approval covers the exact source, data, configuration, weights, model card, SBOM, intended use, deployment mode, and jurisdictions. Changing any governed input creates a new candidate and invalidates inherited approval.

The first production review must also answer one explicit question: does the business value of the measured forecast exceed the added privacy, operational, compute, and legal burden compared with deterministic baselines? If not, the correct outcome is to keep forecasting offline.