Open Questions¶
The unresolved tradeoffs across the framework. Each will be settled during the v0.5 → v1 cycle.
Resolved decisions worth recording¶
These were considered “open” early in design and have since been resolved. Recorded here so reviewers see the deliberation.
Cloud portability. Resolved: the framework’s core has no cloud dependencies. All cloud-specific code lives behind ABCs (BaseDistributedExecutor, BaseBatchAnnotationOrchestrator, BaseCredentialsProvider, BaseLogSink) with concrete subclasses in optional extras (
rfgen[gcp],rfgen[aws],rfgen[azure],rfgen[databricks], etc.). Adding a new cloud is strictly additive: a new package or module that subclasses the relevant base. See Reference / Cloud Backends.Plugin discovery and future hub. Resolved: plugins ship a standardized PluginMetadata declaration (Reference / Plugin Metadata). Discovery uses a BaseRegistry abstraction; the default reads Python entry points, and a future hub-style remote registry is a JsonManifestRegistry subclass added later without core changes.
Cross-cutting¶
Real captures in the loop or pure sim? Default is “sim with HIL validation,” but specific high-value classes (drone OcuSync, real WiSig devices) may need capture-augmented templates.
Spectrogram-domain output? Some downstream models consume spectrograms directly. Generate IQ canonically and emit spectrograms on-demand, or store both?
Public dataset release tiers. Source dataset licenses constrain what derivatives we can ship publicly. Likely two tiers: internal full dataset + public CLIP-for-RF benchmark on permissively-licensed sources.
LLM choice for bulk annotation. Gemini Flash, GPT-4o-mini, Claude Haiku: pick one for cost / quality / latency. Verifier model separate.
TorchSig version pinning. v2.1.x is current; v2.x to v3 will likely break. Pin and lock.
Layout (see Reference / Project Layout)¶
validation/insiderfgenvs. sibling packagerfgen-validate?presets/as YAML files inside the package vs. shipped underconfigs/presets/?emitters/cellular/vs.emitters/lte/+emitters/nr/?Where do hardware-fingerprint parameters live: per-emitter or in
channels/?
Plugin interfaces (see Reference / Plugin Interfaces)¶
Should BaseEmitter.generate return Spectrogram too?
BaseChannel.apply shape contract: explicit tail length via meta, or always pad?
BaseAnnotator granularity, one annotator per type or one per suite?
Multi-RX Record
.iqshape:(num_rx, 2, N)vs.(2, num_rx, N)vs. complex(num_rx, N).
Config schema (see Reference / Config Schema)¶
If a shared SNR-range knob returns, should it live on ChannelConfig or SceneConfig? (The shipped
ChannelConfig.snr_db_rangefield is a legacy compatibility placeholder and is not consumed at runtime.)Per-emitter SNR override. Add EmitterFamilyConfig
.snr_db_range_override?Hydra structured configs (Pydantic-as-source-of-truth) vs. dict-based.
Label schema (see Reference / Label Schema)¶
Multi-label segmentation as default? Lean: keep single-label default; per-dataset config knob.
Spectrogram precomputed or on-the-fly? Lean: on-the-fly; opt-in flag.
Per-bin SNR map? Lean: per-emitter scalar for v1.
Confidence-tagged unknown nodes for HIL captures? Lean: introduce in v1.1.
Storage (see Reference / Storage Layout)¶
_shards/shard_index.parquetrequired or optional?WebDataset compression: per-record gzip or per-tar zstd?
HDF5 SWMR mode for ongoing writes?
Cloud backends (see Reference / Cloud Backends)¶
Should the framework ship a
rfgen[cloud-agnostic]meta-extra that bundles Databricks, Anthropic Batch, OpenAI Batch, and Ray? Lean: yes, but not before v1.Should the project host an official remote plugin index (analog to PyPI’s index for
rfgen-*packages) or rely on PyPI keyword search? Lean: rely on PyPI initially; build a hub if the community grows past about 30 plugins.