* 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 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:
- The Google TimesFM repository identifies its source code as Apache-2.0.
- 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:
- Disable web retrieval and repository indexing outside the approved local tree where the tool supports it.
- 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.
- Do not attach Google code, checkpoint metadata, outputs, screenshots, or detailed third-party implementation summaries.
- State the independent specification and prohibited-source boundary in the session instructions.
- Retain a bounded prompt and tool-source manifest digest without committing raw private transcripts.
- Record the model/tool version and whether retrieval was enabled.
- 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:
- Stop affected implementation, training, evaluation feedback, and release.
- Preserve hashes, timestamps, actors, locations, access records, and affected lineage. Do not erase the audit trail.
- Quarantine the material and revoke it from build, data, model, cache, and retrieval paths.
- Identify every affected commit, specification revision, dataset transform, RuVector index, checkpoint, benchmark, and descendant artifact.
- Rotate credentials if a provider, cache, or secret may be exposed.
- 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.
- 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.